RTEMS 4.11Annotated Report
Sun Nov 28 17:13:54 2010
0800769c <IMFS_Set_handlers>:
{
IMFS_jnode_t *node = loc->node_access;
IMFS_fs_info_t *fs_info;
fs_info = loc->mt_entry->fs_info;
switch( node->type ) {
800769c: 28 22 00 00 lw r2,(r1+0)
)
{
IMFS_jnode_t *node = loc->node_access;
IMFS_fs_info_t *fs_info;
fs_info = loc->mt_entry->fs_info;
80076a0: 28 23 00 10 lw r3,(r1+16)
switch( node->type ) {
80076a4: 34 04 00 07 mvi r4,7
80076a8: 28 42 00 4c lw r2,(r2+76)
)
{
IMFS_jnode_t *node = loc->node_access;
IMFS_fs_info_t *fs_info;
fs_info = loc->mt_entry->fs_info;
80076ac: 28 63 00 34 lw r3,(r3+52)
switch( node->type ) {
80076b0: 54 44 00 0a bgu r2,r4,80076d8 <IMFS_Set_handlers+0x3c> <== NEVER TAKEN
80076b4: 78 04 08 01 mvhi r4,0x801
80076b8: b4 42 10 00 add r2,r2,r2
80076bc: 38 84 36 98 ori r4,r4,0x3698
80076c0: b4 42 10 00 add r2,r2,r2
80076c4: b4 82 10 00 add r2,r4,r2
80076c8: 28 42 00 00 lw r2,(r2+0)
80076cc: c0 40 00 00 b r2
case IMFS_DIRECTORY:
loc->handlers = fs_info->directory_handlers;
80076d0: 28 62 00 0c lw r2,(r3+12)
80076d4: 58 22 00 08 sw (r1+8),r2
loc->handlers = fs_info->fifo_handlers;
break;
}
return 0;
}
80076d8: 34 01 00 00 mvi r1,0
80076dc: c3 a0 00 00 ret
break;
case IMFS_LINEAR_FILE:
loc->handlers = fs_info->memfile_handlers;
break;
case IMFS_MEMORY_FILE:
loc->handlers = fs_info->memfile_handlers;
80076e0: 28 62 00 08 lw r2,(r3+8)
80076e4: 58 22 00 08 sw (r1+8),r2
loc->handlers = fs_info->fifo_handlers;
break;
}
return 0;
}
80076e8: 34 01 00 00 mvi r1,0
80076ec: c3 a0 00 00 ret
case IMFS_DEVICE:
loc->handlers = &IMFS_device_handlers;
break;
case IMFS_SYM_LINK:
case IMFS_HARD_LINK:
loc->handlers = &IMFS_link_handlers;
80076f0: 78 02 08 01 mvhi r2,0x801
80076f4: 38 42 37 38 ori r2,r2,0x3738
80076f8: 58 22 00 08 sw (r1+8),r2
loc->handlers = fs_info->fifo_handlers;
break;
}
return 0;
}
80076fc: 34 01 00 00 mvi r1,0
8007700: c3 a0 00 00 ret
break;
case IMFS_MEMORY_FILE:
loc->handlers = fs_info->memfile_handlers;
break;
case IMFS_FIFO:
loc->handlers = fs_info->fifo_handlers;
8007704: 28 62 00 10 lw r2,(r3+16)
8007708: 58 22 00 08 sw (r1+8),r2
break;
}
return 0;
}
800770c: 34 01 00 00 mvi r1,0
8007710: c3 a0 00 00 ret
switch( node->type ) {
case IMFS_DIRECTORY:
loc->handlers = fs_info->directory_handlers;
break;
case IMFS_DEVICE:
loc->handlers = &IMFS_device_handlers;
8007714: 78 02 08 01 mvhi r2,0x801
8007718: 38 42 36 c8 ori r2,r2,0x36c8
800771c: 58 22 00 08 sw (r1+8),r2
loc->handlers = fs_info->fifo_handlers;
break;
}
return 0;
}
8007720: 34 01 00 00 mvi r1,0
8007724: c3 a0 00 00 ret
080074fc <IMFS_create_node>:
IMFS_jnode_types_t type,
const char *name,
mode_t mode,
const IMFS_types_union *info
)
{
80074fc: 37 9c ff e8 addi sp,sp,-24
8007500: 5b 8b 00 18 sw (sp+24),r11
8007504: 5b 8c 00 14 sw (sp+20),r12
8007508: 5b 8d 00 10 sw (sp+16),r13
800750c: 5b 8e 00 0c sw (sp+12),r14
8007510: 5b 8f 00 08 sw (sp+8),r15
8007514: 5b 9d 00 04 sw (sp+4),ra
/*
* MUST have a parent node to call this routine.
*/
if ( parent_loc == NULL )
return NULL;
8007518: 34 0b 00 00 mvi r11,0
IMFS_jnode_types_t type,
const char *name,
mode_t mode,
const IMFS_types_union *info
)
{
800751c: b8 40 60 00 mv r12,r2
8007520: b8 a0 70 00 mv r14,r5
IMFS_fs_info_t *fs_info;
/*
* MUST have a parent node to call this routine.
*/
if ( parent_loc == NULL )
8007524: 44 20 00 2e be r1,r0,80075dc <IMFS_create_node+0xe0> <== NEVER TAKEN
return NULL;
parent = parent_loc->node_access;
fs_info = parent_loc->mt_entry->fs_info;
8007528: 28 22 00 10 lw r2,(r1+16)
* MUST have a parent node to call this routine.
*/
if ( parent_loc == NULL )
return NULL;
parent = parent_loc->node_access;
800752c: 28 2f 00 00 lw r15,(r1+0)
fs_info = parent_loc->mt_entry->fs_info;
/*
* Reject creation of FIFOs if support is disabled.
*/
if ( type == IMFS_FIFO &&
8007530: 34 01 00 07 mvi r1,7
*/
if ( parent_loc == NULL )
return NULL;
parent = parent_loc->node_access;
fs_info = parent_loc->mt_entry->fs_info;
8007534: 28 4d 00 34 lw r13,(r2+52)
/*
* Reject creation of FIFOs if support is disabled.
*/
if ( type == IMFS_FIFO &&
8007538: 45 81 00 32 be r12,r1,8007600 <IMFS_create_node+0x104>
return NULL;
/*
* Allocate filesystem node and fill in basic information
*/
node = IMFS_allocate_node( type, name, mode & ~rtems_filesystem_umask );
800753c: 78 06 08 01 mvhi r6,0x801
8007540: 38 c6 41 20 ori r6,r6,0x4120
8007544: 28 c5 00 00 lw r5,(r6+0)
8007548: b8 60 10 00 mv r2,r3
800754c: b9 80 08 00 mv r1,r12
8007550: 28 a3 00 2c lw r3,(r5+44)
8007554: a4 60 18 00 not r3,r3
8007558: a0 83 18 00 and r3,r4,r3
800755c: fb ff ff bf calli 8007458 <IMFS_allocate_node>
8007560: b8 20 58 00 mv r11,r1
if ( !node )
8007564: 44 20 00 1e be r1,r0,80075dc <IMFS_create_node+0xe0>
return NULL;
/*
* Set the type specific information
*/
if ( type == IMFS_DIRECTORY ) {
8007568: 34 01 00 01 mvi r1,1
800756c: 45 81 00 0f be r12,r1,80075a8 <IMFS_create_node+0xac>
rtems_chain_initialize_empty(&node->info.directory.Entries);
} else if ( type == IMFS_HARD_LINK ) {
8007570: 34 01 00 03 mvi r1,3
8007574: 45 81 00 2d be r12,r1,8007628 <IMFS_create_node+0x12c>
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
8007578: 34 01 00 04 mvi r1,4
800757c: 45 81 00 2b be r12,r1,8007628 <IMFS_create_node+0x12c>
node->info.sym_link.name = info->sym_link.name;
} else if ( type == IMFS_DEVICE ) {
8007580: 34 01 00 02 mvi r1,2
8007584: 45 81 00 24 be r12,r1,8007614 <IMFS_create_node+0x118>
node->info.device.major = info->device.major;
node->info.device.minor = info->device.minor;
} else if ( type == IMFS_LINEAR_FILE ) {
8007588: 34 01 00 06 mvi r1,6
800758c: 45 81 00 2a be r12,r1,8007634 <IMFS_create_node+0x138>
node->info.linearfile.size = 0;
node->info.linearfile.direct = 0;
} else if ( type == IMFS_MEMORY_FILE ) {
8007590: 34 01 00 05 mvi r1,5
8007594: 45 81 00 2c be r12,r1,8007644 <IMFS_create_node+0x148>
node->info.file.size = 0;
node->info.file.indirect = 0;
node->info.file.doubly_indirect = 0;
node->info.file.triply_indirect = 0;
} else if ( type == IMFS_FIFO ) {
8007598: 34 01 00 07 mvi r1,7
800759c: 5d 81 00 08 bne r12,r1,80075bc <IMFS_create_node+0xc0> <== NEVER TAKEN
node->info.fifo.pipe = NULL;
80075a0: 59 60 00 50 sw (r11+80),r0
80075a4: e0 00 00 06 bi 80075bc <IMFS_create_node+0xc0>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
80075a8: 35 62 00 54 addi r2,r11,84
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
80075ac: 35 61 00 50 addi r1,r11,80
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80075b0: 59 62 00 50 sw (r11+80),r2
head->previous = NULL;
80075b4: 59 60 00 54 sw (r11+84),r0
tail->previous = head;
80075b8: 59 61 00 58 sw (r11+88),r1
/*
* This node MUST have a parent, so put it in that directory list.
*/
node->Parent = parent;
node->st_ino = ++fs_info->ino_count;
80075bc: 29 a2 00 04 lw r2,(r13+4)
}
/*
* This node MUST have a parent, so put it in that directory list.
*/
node->Parent = parent;
80075c0: 59 6f 00 08 sw (r11+8),r15
80075c4: 35 e1 00 50 addi r1,r15,80
node->st_ino = ++fs_info->ino_count;
80075c8: 34 42 00 01 addi r2,r2,1
80075cc: 59 a2 00 04 sw (r13+4),r2
80075d0: 59 62 00 38 sw (r11+56),r2
80075d4: b9 60 10 00 mv r2,r11
80075d8: fb ff f0 b6 calli 80038b0 <_Chain_Append>
rtems_chain_append( &parent->info.directory.Entries, &node->Node );
return node;
}
80075dc: b9 60 08 00 mv r1,r11
80075e0: 2b 9d 00 04 lw ra,(sp+4)
80075e4: 2b 8b 00 18 lw r11,(sp+24)
80075e8: 2b 8c 00 14 lw r12,(sp+20)
80075ec: 2b 8d 00 10 lw r13,(sp+16)
80075f0: 2b 8e 00 0c lw r14,(sp+12)
80075f4: 2b 8f 00 08 lw r15,(sp+8)
80075f8: 37 9c 00 18 addi sp,sp,24
80075fc: c3 a0 00 00 ret
fs_info = parent_loc->mt_entry->fs_info;
/*
* Reject creation of FIFOs if support is disabled.
*/
if ( type == IMFS_FIFO &&
8007600: 29 a1 00 10 lw r1,(r13+16)
8007604: 78 02 08 01 mvhi r2,0x801
8007608: 38 42 36 30 ori r2,r2,0x3630
800760c: 44 22 ff f4 be r1,r2,80075dc <IMFS_create_node+0xe0>
8007610: e3 ff ff cb bi 800753c <IMFS_create_node+0x40>
} else if ( type == IMFS_HARD_LINK ) {
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
node->info.sym_link.name = info->sym_link.name;
} else if ( type == IMFS_DEVICE ) {
node->info.device.major = info->device.major;
8007614: 29 c2 00 00 lw r2,(r14+0)
node->info.device.minor = info->device.minor;
8007618: 29 c1 00 04 lw r1,(r14+4)
} else if ( type == IMFS_HARD_LINK ) {
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
node->info.sym_link.name = info->sym_link.name;
} else if ( type == IMFS_DEVICE ) {
node->info.device.major = info->device.major;
800761c: 59 62 00 50 sw (r11+80),r2
node->info.device.minor = info->device.minor;
8007620: 59 61 00 54 sw (r11+84),r1
8007624: e3 ff ff e6 bi 80075bc <IMFS_create_node+0xc0>
if ( type == IMFS_DIRECTORY ) {
rtems_chain_initialize_empty(&node->info.directory.Entries);
} else if ( type == IMFS_HARD_LINK ) {
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
node->info.sym_link.name = info->sym_link.name;
8007628: 29 c1 00 00 lw r1,(r14+0)
800762c: 59 61 00 50 sw (r11+80),r1
8007630: e3 ff ff e3 bi 80075bc <IMFS_create_node+0xc0>
} else if ( type == IMFS_DEVICE ) {
node->info.device.major = info->device.major;
node->info.device.minor = info->device.minor;
} else if ( type == IMFS_LINEAR_FILE ) {
node->info.linearfile.size = 0;
8007634: 59 60 00 50 sw (r11+80),r0
8007638: 59 60 00 54 sw (r11+84),r0
node->info.linearfile.direct = 0;
800763c: 59 60 00 58 sw (r11+88),r0
8007640: e3 ff ff df bi 80075bc <IMFS_create_node+0xc0>
} else if ( type == IMFS_MEMORY_FILE ) {
node->info.file.size = 0;
8007644: 59 60 00 50 sw (r11+80),r0
8007648: 59 60 00 54 sw (r11+84),r0
node->info.file.indirect = 0;
800764c: 59 60 00 58 sw (r11+88),r0
node->info.file.doubly_indirect = 0;
8007650: 59 60 00 5c sw (r11+92),r0
node->info.file.triply_indirect = 0;
8007654: 59 60 00 60 sw (r11+96),r0
8007658: e3 ff ff d9 bi 80075bc <IMFS_create_node+0xc0>
08003914 <IMFS_dump_directory>:
*/
void IMFS_dump_directory(
IMFS_jnode_t *the_directory,
int level
)
{
8003914: 37 9c ff e0 addi sp,sp,-32
8003918: 5b 8b 00 20 sw (sp+32),r11
800391c: 5b 8c 00 1c sw (sp+28),r12
8003920: 5b 8d 00 18 sw (sp+24),r13
8003924: 5b 8e 00 14 sw (sp+20),r14
8003928: 5b 8f 00 10 sw (sp+16),r15
800392c: 5b 90 00 0c sw (sp+12),r16
8003930: 5b 91 00 08 sw (sp+8),r17
8003934: 5b 9d 00 04 sw (sp+4),ra
*
*/
int IMFS_memfile_maximum_size( void )
{
return IMFS_MEMFILE_MAXIMUM_SIZE;
}
8003938: 28 2f 00 50 lw r15,(r1+80)
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
800393c: 34 30 00 54 addi r16,r1,84
*/
void IMFS_dump_directory(
IMFS_jnode_t *the_directory,
int level
)
{
8003940: b8 40 68 00 mv r13,r2
IMFS_assert( level >= 0 );
IMFS_assert( the_directory->type == IMFS_DIRECTORY );
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
8003944: 45 f0 00 17 be r15,r16,80039a0 <IMFS_dump_directory+0x8c>
8003948: 78 0e 08 02 mvhi r14,0x802
800394c: 78 0c 08 02 mvhi r12,0x802
8003950: 39 ce 56 f0 ori r14,r14,0x56f0
8003954: 39 8c 81 c0 ori r12,r12,0x81c0
for ( i=0 ; i<=level ; i++ )
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
if ( the_jnode->type == IMFS_DIRECTORY )
IMFS_dump_directory( the_jnode, level + 1 );
8003958: 34 51 00 01 addi r17,r2,1
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
800395c: 48 0d 00 0a bg r0,r13,8003984 <IMFS_dump_directory+0x70> <== NEVER TAKEN
8003960: 34 0b 00 00 mvi r11,0
fprintf(stdout, "...." );
8003964: 29 83 00 00 lw r3,(r12+0)
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
8003968: 35 6b 00 01 addi r11,r11,1
fprintf(stdout, "...." );
800396c: b9 c0 08 00 mv r1,r14
8003970: 28 64 00 08 lw r4,(r3+8)
8003974: 34 02 00 01 mvi r2,1
8003978: 34 03 00 04 mvi r3,4
800397c: f8 00 3d 0f calli 8012db8 <fwrite>
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
8003980: 4d ab ff f9 bge r13,r11,8003964 <IMFS_dump_directory+0x50>
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
8003984: b9 e0 08 00 mv r1,r15
8003988: fb ff ff 89 calli 80037ac <IMFS_print_jnode>
if ( the_jnode->type == IMFS_DIRECTORY )
800398c: 29 e3 00 4c lw r3,(r15+76)
8003990: 34 01 00 01 mvi r1,1
8003994: 44 61 00 0d be r3,r1,80039c8 <IMFS_dump_directory+0xb4>
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
8003998: 29 ef 00 00 lw r15,(r15+0)
IMFS_assert( level >= 0 );
IMFS_assert( the_directory->type == IMFS_DIRECTORY );
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
800399c: 5d f0 ff f0 bne r15,r16,800395c <IMFS_dump_directory+0x48>
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
if ( the_jnode->type == IMFS_DIRECTORY )
IMFS_dump_directory( the_jnode, level + 1 );
}
}
80039a0: 2b 9d 00 04 lw ra,(sp+4)
80039a4: 2b 8b 00 20 lw r11,(sp+32)
80039a8: 2b 8c 00 1c lw r12,(sp+28)
80039ac: 2b 8d 00 18 lw r13,(sp+24)
80039b0: 2b 8e 00 14 lw r14,(sp+20)
80039b4: 2b 8f 00 10 lw r15,(sp+16)
80039b8: 2b 90 00 0c lw r16,(sp+12)
80039bc: 2b 91 00 08 lw r17,(sp+8)
80039c0: 37 9c 00 20 addi sp,sp,32
80039c4: c3 a0 00 00 ret
for ( i=0 ; i<=level ; i++ )
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
if ( the_jnode->type == IMFS_DIRECTORY )
IMFS_dump_directory( the_jnode, level + 1 );
80039c8: b9 e0 08 00 mv r1,r15
80039cc: ba 20 10 00 mv r2,r17
80039d0: fb ff ff d1 calli 8003914 <IMFS_dump_directory>
80039d4: e3 ff ff f1 bi 8003998 <IMFS_dump_directory+0x84>
08007834 <IMFS_eval_path>:
const char *pathname, /* IN */
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
8007834: 37 9c ff 9c addi sp,sp,-100
8007838: 5b 8b 00 3c sw (sp+60),r11
800783c: 5b 8c 00 38 sw (sp+56),r12
8007840: 5b 8d 00 34 sw (sp+52),r13
8007844: 5b 8e 00 30 sw (sp+48),r14
8007848: 5b 8f 00 2c sw (sp+44),r15
800784c: 5b 90 00 28 sw (sp+40),r16
8007850: 5b 91 00 24 sw (sp+36),r17
8007854: 5b 92 00 20 sw (sp+32),r18
8007858: 5b 93 00 1c sw (sp+28),r19
800785c: 5b 94 00 18 sw (sp+24),r20
8007860: 5b 95 00 14 sw (sp+20),r21
8007864: 5b 96 00 10 sw (sp+16),r22
8007868: 5b 97 00 0c sw (sp+12),r23
800786c: 5b 98 00 08 sw (sp+8),r24
8007870: 5b 9d 00 04 sw (sp+4),ra
8007874: b8 60 a8 00 mv r21,r3
char token[ IMFS_NAME_MAX + 1 ];
rtems_filesystem_location_info_t newloc;
IMFS_jnode_t *node;
int result;
if ( !rtems_libio_is_valid_perms( flags ) ) {
8007878: 34 03 ff f8 mvi r3,-8
800787c: a2 a3 18 00 and r3,r21,r3
const char *pathname, /* IN */
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
8007880: b8 20 88 00 mv r17,r1
8007884: b8 40 70 00 mv r14,r2
8007888: b8 80 58 00 mv r11,r4
char token[ IMFS_NAME_MAX + 1 ];
rtems_filesystem_location_info_t newloc;
IMFS_jnode_t *node;
int result;
if ( !rtems_libio_is_valid_perms( flags ) ) {
800788c: 5c 60 00 94 bne r3,r0,8007adc <IMFS_eval_path+0x2a8> <== NEVER TAKEN
/*
* This was filled in by the caller and is valid in the
* mount table.
*/
node = pathloc->node_access;
8007890: 28 8c 00 00 lw r12,(r4+0)
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
8007894: 78 10 08 01 mvhi r16,0x801
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
int i = 0;
8007898: 34 0f 00 00 mvi r15,0
800789c: 37 92 00 40 addi r18,sp,64
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
80078a0: 34 13 00 01 mvi r19,1
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
switch( type ) {
80078a4: 34 14 00 03 mvi r20,3
* It would be a design error if we evaluated the link and
* was broken.
*/
IMFS_assert( node );
} else if ( node->type == IMFS_SYM_LINK ) {
80078a8: 34 16 00 04 mvi r22,4
/*
* In contrast to a hard link, it is possible to have a broken
* symbolic link.
*/
node = pathloc->node_access;
if ( result == -1 )
80078ac: 34 18 ff ff mvi r24,-1
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
switch( type ) {
80078b0: 34 17 00 02 mvi r23,2
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
80078b4: 3a 10 41 20 ori r16,r16,0x4120
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
80078b8: 37 84 00 64 addi r4,sp,100
80078bc: b6 2f 08 00 add r1,r17,r15
80078c0: b9 c0 10 00 mv r2,r14
80078c4: ba 40 18 00 mv r3,r18
80078c8: f8 00 02 1b calli 8008134 <IMFS_get_token>
pathnamelen -= len;
i += len;
if ( !pathloc->node_access )
80078cc: 29 64 00 00 lw r4,(r11+0)
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
80078d0: b8 20 68 00 mv r13,r1
pathnamelen -= len;
80078d4: 2b 85 00 64 lw r5,(sp+100)
i += len;
if ( !pathloc->node_access )
80078d8: 44 80 00 51 be r4,r0,8007a1c <IMFS_eval_path+0x1e8> <== NEVER TAKEN
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
pathnamelen -= len;
80078dc: c9 c5 70 00 sub r14,r14,r5
i += len;
80078e0: b5 e5 78 00 add r15,r15,r5
rtems_set_errno_and_return_minus_one( ENOENT );
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
80078e4: 5c 20 00 10 bne r1,r0,8007924 <IMFS_eval_path+0xf0>
* 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 ) {
80078e8: 28 82 00 4c lw r2,(r4+76)
80078ec: 34 01 00 01 mvi r1,1
80078f0: 44 41 00 6a be r2,r1,8007a98 <IMFS_eval_path+0x264>
flags, pathloc );
} else {
result = IMFS_Set_handlers( pathloc );
}
} else {
result = IMFS_Set_handlers( pathloc );
80078f4: b9 60 08 00 mv r1,r11
80078f8: fb ff ff 69 calli 800769c <IMFS_Set_handlers>
80078fc: b8 20 68 00 mv r13,r1
/*
* Verify we have the correct permissions for this node.
*/
if ( !IMFS_evaluate_permission( pathloc, flags ) )
8007900: ba a0 10 00 mv r2,r21
8007904: b9 60 08 00 mv r1,r11
8007908: fb ff ff 88 calli 8007728 <IMFS_evaluate_permission>
800790c: 5c 20 00 2c bne r1,r0,80079bc <IMFS_eval_path+0x188>
rtems_set_errno_and_return_minus_one( EACCES );
8007910: f8 00 15 2d calli 800cdc4 <__errno>
8007914: 34 02 00 0d mvi r2,13
8007918: 58 22 00 00 sw (r1+0),r2
800791c: 34 0d ff ff mvi r13,-1
8007920: e0 00 00 27 bi 80079bc <IMFS_eval_path+0x188>
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
8007924: 29 81 00 4c lw r1,(r12+76)
8007928: 44 33 00 37 be r1,r19,8007a04 <IMFS_eval_path+0x1d0>
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
800792c: b8 80 60 00 mv r12,r4
switch( type ) {
8007930: 45 b4 00 06 be r13,r20,8007948 <IMFS_eval_path+0x114>
8007934: 45 b6 00 1e be r13,r22,80079ac <IMFS_eval_path+0x178>
8007938: 45 b7 00 11 be r13,r23,800797c <IMFS_eval_path+0x148>
/*
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
800793c: 7d ad 00 04 cmpnei r13,r13,4
8007940: 5d a0 ff de bne r13,r0,80078b8 <IMFS_eval_path+0x84> <== ALWAYS TAKEN
8007944: e3 ff ff e9 bi 80078e8 <IMFS_eval_path+0xb4> <== NOT EXECUTED
case IMFS_NAME:
/*
* If we are at a link follow it.
*/
if ( node->type == IMFS_HARD_LINK ) {
8007948: 28 81 00 4c lw r1,(r4+76)
800794c: 44 34 00 39 be r1,r20,8007a30 <IMFS_eval_path+0x1fc>
* It would be a design error if we evaluated the link and
* was broken.
*/
IMFS_assert( node );
} else if ( node->type == IMFS_SYM_LINK ) {
8007950: 44 36 00 5b be r1,r22,8007abc <IMFS_eval_path+0x288>
}
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
8007954: 5c 33 00 67 bne r1,r19,8007af0 <IMFS_eval_path+0x2bc> <== NEVER TAKEN
/*
* If we are at a node that is a mount point. Set loc to the
* new fs root node and let them finish evaluating the path.
*/
if ( node->info.directory.mt_fs != NULL ) {
8007958: 29 8d 00 5c lw r13,(r12+92)
800795c: 5d a0 00 6a bne r13,r0,8007b04 <IMFS_eval_path+0x2d0>
}
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
8007960: b9 80 08 00 mv r1,r12
8007964: ba 40 10 00 mv r2,r18
8007968: f8 00 01 c9 calli 800808c <IMFS_find_match_in_dir>
800796c: b8 20 60 00 mv r12,r1
if ( !node )
8007970: 44 2d 00 2b be r1,r13,8007a1c <IMFS_eval_path+0x1e8>
/*
* Set the node access to the point we have found.
*/
pathloc->node_access = node;
8007974: 59 6c 00 00 sw (r11+0),r12
8007978: e3 ff ff d0 bi 80078b8 <IMFS_eval_path+0x84>
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
800797c: 2a 01 00 00 lw r1,(r16+0)
8007980: 28 21 00 18 lw r1,(r1+24)
8007984: 44 24 ff cd be r1,r4,80078b8 <IMFS_eval_path+0x84>
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
pathloc->mt_entry->mt_fs_root.node_access) {
8007988: 29 61 00 10 lw r1,(r11+16)
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
800798c: 28 22 00 1c lw r2,(r1+28)
8007990: 44 44 00 2e be r2,r4,8007a48 <IMFS_eval_path+0x214>
pathnamelen+len,
flags,pathloc);
}
} else {
if ( !node->Parent )
8007994: 28 8c 00 08 lw r12,(r4+8)
8007998: 5d 80 ff f7 bne r12,r0,8007974 <IMFS_eval_path+0x140>
rtems_set_errno_and_return_minus_one( ENOENT );
800799c: f8 00 15 0a calli 800cdc4 <__errno>
80079a0: 58 2d 00 00 sw (r1+0),r13
80079a4: 34 0d ff ff mvi r13,-1
80079a8: e0 00 00 05 bi 80079bc <IMFS_eval_path+0x188>
case IMFS_NO_MORE_PATH:
case IMFS_CURRENT_DIR:
break;
case IMFS_INVALID_TOKEN:
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
80079ac: f8 00 15 06 calli 800cdc4 <__errno>
80079b0: 34 02 00 5b mvi r2,91
80079b4: 58 22 00 00 sw (r1+0),r2
80079b8: 34 0d ff ff mvi r13,-1
if ( !IMFS_evaluate_permission( pathloc, flags ) )
rtems_set_errno_and_return_minus_one( EACCES );
return result;
}
80079bc: b9 a0 08 00 mv r1,r13
80079c0: 2b 9d 00 04 lw ra,(sp+4)
80079c4: 2b 8b 00 3c lw r11,(sp+60)
80079c8: 2b 8c 00 38 lw r12,(sp+56)
80079cc: 2b 8d 00 34 lw r13,(sp+52)
80079d0: 2b 8e 00 30 lw r14,(sp+48)
80079d4: 2b 8f 00 2c lw r15,(sp+44)
80079d8: 2b 90 00 28 lw r16,(sp+40)
80079dc: 2b 91 00 24 lw r17,(sp+36)
80079e0: 2b 92 00 20 lw r18,(sp+32)
80079e4: 2b 93 00 1c lw r19,(sp+28)
80079e8: 2b 94 00 18 lw r20,(sp+24)
80079ec: 2b 95 00 14 lw r21,(sp+20)
80079f0: 2b 96 00 10 lw r22,(sp+16)
80079f4: 2b 97 00 0c lw r23,(sp+12)
80079f8: 2b 98 00 08 lw r24,(sp+8)
80079fc: 37 9c 00 64 addi sp,sp,100
8007a00: c3 a0 00 00 ret
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
8007a04: b9 60 08 00 mv r1,r11
8007a08: 34 02 00 01 mvi r2,1
8007a0c: fb ff ff 47 calli 8007728 <IMFS_evaluate_permission>
8007a10: 44 20 ff c0 be r1,r0,8007910 <IMFS_eval_path+0xdc>
8007a14: 29 64 00 00 lw r4,(r11+0)
8007a18: e3 ff ff c5 bi 800792c <IMFS_eval_path+0xf8>
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
if ( !node )
rtems_set_errno_and_return_minus_one( ENOENT );
8007a1c: f8 00 14 ea calli 800cdc4 <__errno>
8007a20: 34 02 00 02 mvi r2,2
8007a24: 58 22 00 00 sw (r1+0),r2
8007a28: 34 0d ff ff mvi r13,-1
8007a2c: e3 ff ff e4 bi 80079bc <IMFS_eval_path+0x188>
case IMFS_NAME:
/*
* If we are at a link follow it.
*/
if ( node->type == IMFS_HARD_LINK ) {
IMFS_evaluate_hard_link( pathloc, 0 );
8007a30: b9 60 08 00 mv r1,r11
8007a34: 34 02 00 00 mvi r2,0
8007a38: fb ff ff 67 calli 80077d4 <IMFS_evaluate_hard_link>
node = pathloc->node_access;
8007a3c: 29 6c 00 00 lw r12,(r11+0)
8007a40: 29 81 00 4c lw r1,(r12+76)
8007a44: e3 ff ff c4 bi 8007954 <IMFS_eval_path+0x120>
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
8007a48: 28 23 00 14 lw r3,(r1+20)
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break; /* Throw out the .. in this case */
} else {
newloc = pathloc->mt_entry->mt_point_node;
*pathloc = newloc;
return (*pathloc->ops->evalpath_h)(&(pathname[i-len]),
8007a4c: 2b 82 00 64 lw r2,(sp+100)
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
8007a50: 28 27 00 0c lw r7,(r1+12)
8007a54: 28 26 00 10 lw r6,(r1+16)
8007a58: 28 24 00 18 lw r4,(r1+24)
8007a5c: 28 28 00 08 lw r8,(r1+8)
if ( node->type == IMFS_DIRECTORY ) {
if ( node->info.directory.mt_fs != NULL ) {
newloc = node->info.directory.mt_fs->mt_fs_root;
*pathloc = newloc;
return (*pathloc->ops->evalpath_h)( &pathname[i-len],
8007a60: 28 65 00 00 lw r5,(r3+0)
8007a64: c9 e2 08 00 sub r1,r15,r2
*
* NOTE: The behavior of stat() on a mount point appears to be questionable.
*/
if ( node->type == IMFS_DIRECTORY ) {
if ( node->info.directory.mt_fs != NULL ) {
8007a68: 59 63 00 0c sw (r11+12),r3
8007a6c: 59 64 00 10 sw (r11+16),r4
8007a70: 59 68 00 00 sw (r11+0),r8
8007a74: 59 67 00 04 sw (r11+4),r7
8007a78: 59 66 00 08 sw (r11+8),r6
newloc = node->info.directory.mt_fs->mt_fs_root;
*pathloc = newloc;
return (*pathloc->ops->evalpath_h)( &pathname[i-len],
8007a7c: b6 21 08 00 add r1,r17,r1
8007a80: b5 c2 10 00 add r2,r14,r2
8007a84: ba a0 18 00 mv r3,r21
8007a88: b9 60 20 00 mv r4,r11
8007a8c: d8 a0 00 00 call r5
8007a90: b8 20 68 00 mv r13,r1
8007a94: e3 ff ff ca bi 80079bc <IMFS_eval_path+0x188>
*
* NOTE: The behavior of stat() on a mount point appears to be questionable.
*/
if ( node->type == IMFS_DIRECTORY ) {
if ( node->info.directory.mt_fs != NULL ) {
8007a98: 28 81 00 5c lw r1,(r4+92)
8007a9c: 44 20 ff 96 be r1,r0,80078f4 <IMFS_eval_path+0xc0>
8007aa0: 28 23 00 28 lw r3,(r1+40)
newloc = node->info.directory.mt_fs->mt_fs_root;
*pathloc = newloc;
return (*pathloc->ops->evalpath_h)( &pathname[i-len],
8007aa4: 2b 82 00 64 lw r2,(sp+100)
*
* NOTE: The behavior of stat() on a mount point appears to be questionable.
*/
if ( node->type == IMFS_DIRECTORY ) {
if ( node->info.directory.mt_fs != NULL ) {
8007aa8: 28 27 00 20 lw r7,(r1+32)
8007aac: 28 26 00 24 lw r6,(r1+36)
8007ab0: 28 24 00 2c lw r4,(r1+44)
8007ab4: 28 28 00 1c lw r8,(r1+28)
8007ab8: e3 ff ff ea bi 8007a60 <IMFS_eval_path+0x22c>
* was broken.
*/
IMFS_assert( node );
} else if ( node->type == IMFS_SYM_LINK ) {
result = IMFS_evaluate_sym_link( pathloc, 0 );
8007abc: b9 60 08 00 mv r1,r11
8007ac0: 34 02 00 00 mvi r2,0
8007ac4: f8 00 00 17 calli 8007b20 <IMFS_evaluate_sym_link>
8007ac8: b8 20 68 00 mv r13,r1
/*
* In contrast to a hard link, it is possible to have a broken
* symbolic link.
*/
node = pathloc->node_access;
8007acc: 29 6c 00 00 lw r12,(r11+0)
if ( result == -1 )
8007ad0: 44 38 ff bb be r1,r24,80079bc <IMFS_eval_path+0x188> <== NEVER TAKEN
/*
* In contrast to a hard link, it is possible to have a broken
* symbolic link.
*/
node = pathloc->node_access;
8007ad4: 29 81 00 4c lw r1,(r12+76)
8007ad8: e3 ff ff 9f bi 8007954 <IMFS_eval_path+0x120>
rtems_filesystem_location_info_t newloc;
IMFS_jnode_t *node;
int result;
if ( !rtems_libio_is_valid_perms( flags ) ) {
rtems_set_errno_and_return_minus_one( EIO );
8007adc: f8 00 14 ba calli 800cdc4 <__errno> <== NOT EXECUTED
8007ae0: 34 02 00 05 mvi r2,5 <== NOT EXECUTED
8007ae4: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8007ae8: 34 0d ff ff mvi r13,-1 <== NOT EXECUTED
8007aec: e3 ff ff b4 bi 80079bc <IMFS_eval_path+0x188> <== NOT EXECUTED
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
8007af0: f8 00 14 b5 calli 800cdc4 <__errno>
8007af4: 34 02 00 14 mvi r2,20
8007af8: 58 22 00 00 sw (r1+0),r2
8007afc: 34 0d ff ff mvi r13,-1
8007b00: e3 ff ff af bi 80079bc <IMFS_eval_path+0x188>
/*
* 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 ) {
8007b04: 29 a3 00 28 lw r3,(r13+40)
newloc = node->info.directory.mt_fs->mt_fs_root;
*pathloc = newloc;
return (*pathloc->ops->evalpath_h)( &pathname[i-len],
8007b08: 2b 82 00 64 lw r2,(sp+100)
/*
* If we are at a node that is a mount point. Set loc to the
* new fs root node and let them finish evaluating the path.
*/
if ( node->info.directory.mt_fs != NULL ) {
8007b0c: 29 a7 00 20 lw r7,(r13+32)
8007b10: 29 a6 00 24 lw r6,(r13+36)
8007b14: 29 a4 00 2c lw r4,(r13+44)
8007b18: 29 a8 00 1c lw r8,(r13+28)
8007b1c: e3 ff ff d1 bi 8007a60 <IMFS_eval_path+0x22c>
08007cc4 <IMFS_evaluate_for_make>:
int IMFS_evaluate_for_make(
const char *path, /* IN */
rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
const char **name /* OUT */
)
{
8007cc4: 37 9c ff 98 addi sp,sp,-104
8007cc8: 5b 8b 00 40 sw (sp+64),r11
8007ccc: 5b 8c 00 3c sw (sp+60),r12
8007cd0: 5b 8d 00 38 sw (sp+56),r13
8007cd4: 5b 8e 00 34 sw (sp+52),r14
8007cd8: 5b 8f 00 30 sw (sp+48),r15
8007cdc: 5b 90 00 2c sw (sp+44),r16
8007ce0: 5b 91 00 28 sw (sp+40),r17
8007ce4: 5b 92 00 24 sw (sp+36),r18
8007ce8: 5b 93 00 20 sw (sp+32),r19
8007cec: 5b 94 00 1c sw (sp+28),r20
8007cf0: 5b 95 00 18 sw (sp+24),r21
8007cf4: 5b 96 00 14 sw (sp+20),r22
8007cf8: 5b 97 00 10 sw (sp+16),r23
8007cfc: 5b 98 00 0c sw (sp+12),r24
8007d00: 5b 99 00 08 sw (sp+8),r25
8007d04: 5b 9d 00 04 sw (sp+4),ra
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
8007d08: 78 10 08 01 mvhi r16,0x801
int IMFS_evaluate_for_make(
const char *path, /* IN */
rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
const char **name /* OUT */
)
{
8007d0c: b8 40 68 00 mv r13,r2
/*
* This was filled in by the caller and is valid in the
* mount table.
*/
node = pathloc->node_access;
8007d10: 28 4b 00 00 lw r11,(r2+0)
int IMFS_evaluate_for_make(
const char *path, /* IN */
rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
const char **name /* OUT */
)
{
8007d14: b8 20 90 00 mv r18,r1
8007d18: b8 60 c0 00 mv r24,r3
node = pathloc->node_access;
/*
* Get the path length.
*/
pathlen = strlen( path );
8007d1c: f8 00 18 cb calli 800e048 <strlen>
const char *path, /* IN */
rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
const char **name /* OUT */
)
{
int i = 0;
8007d20: 34 0f 00 00 mvi r15,0
node = pathloc->node_access;
/*
* Get the path length.
*/
pathlen = strlen( path );
8007d24: b8 20 70 00 mv r14,r1
8007d28: 37 93 00 44 addi r19,sp,68
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
8007d2c: 34 15 00 01 mvi r21,1
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
switch( type ) {
8007d30: 34 14 00 02 mvi r20,2
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
8007d34: 3a 10 41 20 ori r16,r16,0x4120
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
switch( type ) {
8007d38: 34 16 00 03 mvi r22,3
result = IMFS_evaluate_link( pathloc, 0 );
if ( result == -1 )
return -1;
} else if ( node->type == IMFS_SYM_LINK ) {
8007d3c: 34 17 00 04 mvi r23,4
result = IMFS_evaluate_link( pathloc, 0 );
if ( result == -1 )
8007d40: 34 19 ff ff mvi r25,-1
* Evaluate all tokens until we are done or an error occurs.
*/
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
8007d44: b9 c0 10 00 mv r2,r14
8007d48: 37 84 00 68 addi r4,sp,104
8007d4c: b6 4f 08 00 add r1,r18,r15
8007d50: ba 60 18 00 mv r3,r19
8007d54: f8 00 00 f8 calli 8008134 <IMFS_get_token>
pathlen -= len;
i += len;
if ( !pathloc->node_access )
8007d58: 29 a4 00 00 lw r4,(r13+0)
*/
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
pathlen -= len;
8007d5c: 2b 91 00 68 lw r17,(sp+104)
* Evaluate all tokens until we are done or an error occurs.
*/
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
8007d60: b8 20 60 00 mv r12,r1
pathlen -= len;
8007d64: c9 d1 70 00 sub r14,r14,r17
i += len;
if ( !pathloc->node_access )
8007d68: 44 80 00 51 be r4,r0,8007eac <IMFS_evaluate_for_make+0x1e8><== NEVER TAKEN
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
8007d6c: 5c 20 00 18 bne r1,r0,8007dcc <IMFS_evaluate_for_make+0x108>
pathloc->node_access = node;
break;
case IMFS_NO_MORE_PATH:
rtems_set_errno_and_return_minus_one( EEXIST );
8007d70: f8 00 14 15 calli 800cdc4 <__errno>
8007d74: 34 02 00 11 mvi r2,17
8007d78: 58 22 00 00 sw (r1+0),r2
8007d7c: 34 0b ff ff mvi r11,-1
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) )
rtems_set_errno_and_return_minus_one( EACCES );
return result;
}
8007d80: b9 60 08 00 mv r1,r11
8007d84: 2b 9d 00 04 lw ra,(sp+4)
8007d88: 2b 8b 00 40 lw r11,(sp+64)
8007d8c: 2b 8c 00 3c lw r12,(sp+60)
8007d90: 2b 8d 00 38 lw r13,(sp+56)
8007d94: 2b 8e 00 34 lw r14,(sp+52)
8007d98: 2b 8f 00 30 lw r15,(sp+48)
8007d9c: 2b 90 00 2c lw r16,(sp+44)
8007da0: 2b 91 00 28 lw r17,(sp+40)
8007da4: 2b 92 00 24 lw r18,(sp+36)
8007da8: 2b 93 00 20 lw r19,(sp+32)
8007dac: 2b 94 00 1c lw r20,(sp+28)
8007db0: 2b 95 00 18 lw r21,(sp+24)
8007db4: 2b 96 00 14 lw r22,(sp+20)
8007db8: 2b 97 00 10 lw r23,(sp+16)
8007dbc: 2b 98 00 0c lw r24,(sp+12)
8007dc0: 2b 99 00 08 lw r25,(sp+8)
8007dc4: 37 9c 00 68 addi sp,sp,104
8007dc8: c3 a0 00 00 ret
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
8007dcc: 29 61 00 4c lw r1,(r11+76)
8007dd0: 44 35 00 3c be r1,r21,8007ec0 <IMFS_evaluate_for_make+0x1fc>
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
pathlen -= len;
i += len;
8007dd4: b5 f1 78 00 add r15,r15,r17
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
8007dd8: b8 80 58 00 mv r11,r4
switch( type ) {
8007ddc: 45 94 00 1a be r12,r20,8007e44 <IMFS_evaluate_for_make+0x180>
8007de0: 55 94 00 03 bgu r12,r20,8007dec <IMFS_evaluate_for_make+0x128>
8007de4: 5d 80 ff d8 bne r12,r0,8007d44 <IMFS_evaluate_for_make+0x80><== ALWAYS TAKEN
8007de8: e3 ff ff e2 bi 8007d70 <IMFS_evaluate_for_make+0xac> <== NOT EXECUTED
8007dec: 45 96 00 07 be r12,r22,8007e08 <IMFS_evaluate_for_make+0x144>
8007df0: 5d 97 ff d5 bne r12,r23,8007d44 <IMFS_evaluate_for_make+0x80><== NEVER TAKEN
case IMFS_NO_MORE_PATH:
rtems_set_errno_and_return_minus_one( EEXIST );
break;
case IMFS_INVALID_TOKEN:
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
8007df4: f8 00 13 f4 calli 800cdc4 <__errno>
8007df8: 34 02 00 5b mvi r2,91
8007dfc: 58 22 00 00 sw (r1+0),r2
8007e00: 34 0b ff ff mvi r11,-1
8007e04: e3 ff ff df bi 8007d80 <IMFS_evaluate_for_make+0xbc>
pathloc->node_access = node;
break;
case IMFS_NAME:
if ( node->type == IMFS_HARD_LINK ) {
8007e08: 28 81 00 4c lw r1,(r4+76)
8007e0c: 44 36 00 46 be r1,r22,8007f24 <IMFS_evaluate_for_make+0x260>
result = IMFS_evaluate_link( pathloc, 0 );
if ( result == -1 )
return -1;
} else if ( node->type == IMFS_SYM_LINK ) {
8007e10: 44 37 00 45 be r1,r23,8007f24 <IMFS_evaluate_for_make+0x260>
if ( result == -1 )
return -1;
}
node = pathloc->node_access;
if ( !node )
8007e14: 45 60 00 5b be r11,r0,8007f80 <IMFS_evaluate_for_make+0x2bc><== NEVER TAKEN
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
8007e18: 29 61 00 4c lw r1,(r11+76)
8007e1c: 5c 35 00 59 bne r1,r21,8007f80 <IMFS_evaluate_for_make+0x2bc>
/*
* 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 ) {
8007e20: 29 6c 00 5c lw r12,(r11+92)
8007e24: 5d 80 00 5c bne r12,r0,8007f94 <IMFS_evaluate_for_make+0x2d0>
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
8007e28: b9 60 08 00 mv r1,r11
8007e2c: ba 60 10 00 mv r2,r19
8007e30: f8 00 00 97 calli 800808c <IMFS_find_match_in_dir>
8007e34: b8 20 58 00 mv r11,r1
/*
* If there is no node we have found the name of the node we
* wish to create.
*/
if ( ! node )
8007e38: 44 2c 00 0f be r1,r12,8007e74 <IMFS_evaluate_for_make+0x1b0>
done = true;
else
pathloc->node_access = node;
8007e3c: 59 ab 00 00 sw (r13+0),r11
8007e40: e3 ff ff c1 bi 8007d44 <IMFS_evaluate_for_make+0x80>
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
8007e44: 2a 01 00 00 lw r1,(r16+0)
8007e48: 28 21 00 18 lw r1,(r1+24)
8007e4c: 44 81 ff be be r4,r1,8007d44 <IMFS_evaluate_for_make+0x80>
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){
8007e50: 29 a1 00 10 lw r1,(r13+16)
8007e54: 28 22 00 1c lw r2,(r1+28)
8007e58: 44 82 00 20 be r4,r2,8007ed8 <IMFS_evaluate_for_make+0x214>
*pathloc = newloc;
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
}
} else {
if ( !node->Parent )
8007e5c: 28 8b 00 08 lw r11,(r4+8)
8007e60: 5d 60 ff f7 bne r11,r0,8007e3c <IMFS_evaluate_for_make+0x178>
rtems_set_errno_and_return_minus_one( ENOENT );
8007e64: f8 00 13 d8 calli 800cdc4 <__errno>
8007e68: 58 2c 00 00 sw (r1+0),r12
8007e6c: 34 0b ff ff mvi r11,-1
8007e70: e3 ff ff c4 bi 8007d80 <IMFS_evaluate_for_make+0xbc>
case IMFS_CURRENT_DIR:
break;
}
}
*name = &path[ i - len ];
8007e74: 2b 81 00 68 lw r1,(sp+104)
/*
* We have evaluated the path as far as we can.
* Verify there is not any invalid stuff at the end of the name.
*/
for( ; path[i] != '\0'; i++) {
8007e78: b6 4f 10 00 add r2,r18,r15
case IMFS_CURRENT_DIR:
break;
}
}
*name = &path[ i - len ];
8007e7c: c9 e1 78 00 sub r15,r15,r1
8007e80: b6 4f 90 00 add r18,r18,r15
8007e84: 5b 12 00 00 sw (r24+0),r18
/*
* We have evaluated the path as far as we can.
* Verify there is not any invalid stuff at the end of the name.
*/
for( ; path[i] != '\0'; i++) {
8007e88: 40 41 00 00 lbu r1,(r2+0)
8007e8c: 44 2b 00 2d be r1,r11,8007f40 <IMFS_evaluate_for_make+0x27c>
8007e90: b8 40 58 00 mv r11,r2
8007e94: e0 00 00 04 bi 8007ea4 <IMFS_evaluate_for_make+0x1e0>
8007e98: 41 61 00 01 lbu r1,(r11+1)
8007e9c: 35 6b 00 01 addi r11,r11,1
8007ea0: 44 20 00 28 be r1,r0,8007f40 <IMFS_evaluate_for_make+0x27c>
if ( !IMFS_is_separator( path[ i ] ) )
8007ea4: fb ff e9 e8 calli 8002644 <rtems_filesystem_is_separator>
8007ea8: 5c 20 ff fc bne r1,r0,8007e98 <IMFS_evaluate_for_make+0x1d4>
rtems_set_errno_and_return_minus_one( ENOENT );
8007eac: f8 00 13 c6 calli 800cdc4 <__errno>
8007eb0: 34 02 00 02 mvi r2,2
8007eb4: 58 22 00 00 sw (r1+0),r2
8007eb8: 34 0b ff ff mvi r11,-1
8007ebc: e3 ff ff b1 bi 8007d80 <IMFS_evaluate_for_make+0xbc>
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
8007ec0: b9 a0 08 00 mv r1,r13
8007ec4: 34 02 00 01 mvi r2,1
8007ec8: fb ff fe 18 calli 8007728 <IMFS_evaluate_permission>
8007ecc: 44 20 00 28 be r1,r0,8007f6c <IMFS_evaluate_for_make+0x2a8>
8007ed0: 29 a4 00 00 lw r4,(r13+0)
8007ed4: e3 ff ff c0 bi 8007dd4 <IMFS_evaluate_for_make+0x110>
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){
8007ed8: 28 22 00 14 lw r2,(r1+20)
8007edc: 28 26 00 0c lw r6,(r1+12)
8007ee0: 28 25 00 10 lw r5,(r1+16)
8007ee4: 28 23 00 18 lw r3,(r1+24)
8007ee8: 28 27 00 08 lw r7,(r1+8)
*/
if ( node->info.directory.mt_fs != NULL ) {
newloc = node->info.directory.mt_fs->mt_fs_root;
*pathloc = newloc;
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
8007eec: 2b 81 00 68 lw r1,(sp+104)
8007ef0: 28 44 00 04 lw r4,(r2+4)
/*
* If we are at a node that is a mount point. Set loc to the
* new fs root node and let them finish evaluating the path.
*/
if ( node->info.directory.mt_fs != NULL ) {
8007ef4: 59 a2 00 0c sw (r13+12),r2
newloc = node->info.directory.mt_fs->mt_fs_root;
*pathloc = newloc;
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
8007ef8: c9 e1 08 00 sub r1,r15,r1
/*
* If we are at a node that is a mount point. Set loc to the
* new fs root node and let them finish evaluating the path.
*/
if ( node->info.directory.mt_fs != NULL ) {
8007efc: 59 a3 00 10 sw (r13+16),r3
8007f00: 59 a7 00 00 sw (r13+0),r7
8007f04: 59 a6 00 04 sw (r13+4),r6
8007f08: 59 a5 00 08 sw (r13+8),r5
newloc = node->info.directory.mt_fs->mt_fs_root;
*pathloc = newloc;
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
8007f0c: b6 41 08 00 add r1,r18,r1
8007f10: b9 a0 10 00 mv r2,r13
8007f14: bb 00 18 00 mv r3,r24
8007f18: d8 80 00 00 call r4
8007f1c: b8 20 58 00 mv r11,r1
8007f20: e3 ff ff 98 bi 8007d80 <IMFS_evaluate_for_make+0xbc>
if ( result == -1 )
return -1;
} else if ( node->type == IMFS_SYM_LINK ) {
result = IMFS_evaluate_link( pathloc, 0 );
8007f24: b9 a0 08 00 mv r1,r13
8007f28: 34 02 00 00 mvi r2,0
8007f2c: fb ff ff 28 calli 8007bcc <IMFS_evaluate_link>
8007f30: b8 20 58 00 mv r11,r1
if ( result == -1 )
8007f34: 44 39 ff 93 be r1,r25,8007d80 <IMFS_evaluate_for_make+0xbc><== NEVER TAKEN
8007f38: 29 ab 00 00 lw r11,(r13+0)
8007f3c: e3 ff ff b6 bi 8007e14 <IMFS_evaluate_for_make+0x150>
/*
* Verify we can execute and write to this directory.
*/
result = IMFS_Set_handlers( pathloc );
8007f40: b9 a0 08 00 mv r1,r13
8007f44: fb ff fd d6 calli 800769c <IMFS_Set_handlers>
8007f48: b8 20 58 00 mv r11,r1
/*
* The returned node must be a directory
*/
node = pathloc->node_access;
if ( node->type != IMFS_DIRECTORY )
8007f4c: 29 a1 00 00 lw r1,(r13+0)
8007f50: 28 22 00 4c lw r2,(r1+76)
8007f54: 34 01 00 01 mvi r1,1
8007f58: 5c 41 00 0a bne r2,r1,8007f80 <IMFS_evaluate_for_make+0x2bc><== NEVER TAKEN
/*
* We must have Write and execute permission on the returned node.
*/
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) )
8007f5c: b9 a0 08 00 mv r1,r13
8007f60: 34 02 00 03 mvi r2,3
8007f64: fb ff fd f1 calli 8007728 <IMFS_evaluate_permission>
8007f68: 5c 20 ff 86 bne r1,r0,8007d80 <IMFS_evaluate_for_make+0xbc>
rtems_set_errno_and_return_minus_one( EACCES );
8007f6c: f8 00 13 96 calli 800cdc4 <__errno>
8007f70: 34 02 00 0d mvi r2,13
8007f74: 58 22 00 00 sw (r1+0),r2
8007f78: 34 0b ff ff mvi r11,-1
8007f7c: e3 ff ff 81 bi 8007d80 <IMFS_evaluate_for_make+0xbc>
/*
* The returned node must be a directory
*/
node = pathloc->node_access;
if ( node->type != IMFS_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
8007f80: f8 00 13 91 calli 800cdc4 <__errno>
8007f84: 34 02 00 14 mvi r2,20
8007f88: 58 22 00 00 sw (r1+0),r2
8007f8c: 34 0b ff ff mvi r11,-1
8007f90: e3 ff ff 7c bi 8007d80 <IMFS_evaluate_for_make+0xbc>
/*
* 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 ) {
8007f94: 29 82 00 28 lw r2,(r12+40)
8007f98: 29 86 00 20 lw r6,(r12+32)
8007f9c: 29 85 00 24 lw r5,(r12+36)
8007fa0: 29 83 00 2c lw r3,(r12+44)
8007fa4: 29 87 00 1c lw r7,(r12+28)
8007fa8: e3 ff ff d1 bi 8007eec <IMFS_evaluate_for_make+0x228>
08007728 <IMFS_evaluate_permission>:
*/
int IMFS_evaluate_permission(
rtems_filesystem_location_info_t *node,
int flags
)
{
8007728: 37 9c ff f0 addi sp,sp,-16
800772c: 5b 8b 00 10 sw (sp+16),r11
8007730: 5b 8c 00 0c sw (sp+12),r12
8007734: 5b 8d 00 08 sw (sp+8),r13
8007738: 5b 9d 00 04 sw (sp+4),ra
800773c: b8 40 60 00 mv r12,r2
uid_t st_uid;
gid_t st_gid;
IMFS_jnode_t *jnode;
int flags_to_test;
if ( !rtems_libio_is_valid_perms( flags ) )
8007740: 34 02 ff f8 mvi r2,-8
8007744: a1 82 10 00 and r2,r12,r2
8007748: 5c 40 00 1e bne r2,r0,80077c0 <IMFS_evaluate_permission+0x98><== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
jnode = node->node_access;
800774c: 28 2b 00 00 lw r11,(r1+0)
#if defined(RTEMS_POSIX_API)
st_uid = geteuid();
8007750: f8 00 03 be calli 8008648 <geteuid>
8007754: b8 20 68 00 mv r13,r1
st_gid = getegid();
8007758: f8 00 03 b7 calli 8008634 <getegid>
* Check if I am owner or a group member or someone else.
*/
flags_to_test = flags;
if ( st_uid == jnode->st_uid )
800775c: 2d 62 00 3c lhu r2,(r11+60)
8007760: 44 4d 00 0d be r2,r13,8007794 <IMFS_evaluate_permission+0x6c>
flags_to_test <<= 6;
else if ( st_gid == jnode->st_gid )
8007764: 2d 63 00 3e lhu r3,(r11+62)
8007768: b9 80 10 00 mv r2,r12
800776c: 44 61 00 11 be r3,r1,80077b0 <IMFS_evaluate_permission+0x88><== ALWAYS TAKEN
/*
* If all of the flags are set we have permission
* to do this.
*/
if ( ( flags_to_test & jnode->st_mode) == flags_to_test )
8007770: 29 61 00 30 lw r1,(r11+48)
8007774: a0 41 08 00 and r1,r2,r1
gid_t st_gid;
IMFS_jnode_t *jnode;
int flags_to_test;
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
8007778: e4 41 08 00 cmpe r1,r2,r1
*/
if ( ( flags_to_test & jnode->st_mode) == flags_to_test )
return 1;
return 0;
}
800777c: 2b 9d 00 04 lw ra,(sp+4)
8007780: 2b 8b 00 10 lw r11,(sp+16)
8007784: 2b 8c 00 0c lw r12,(sp+12)
8007788: 2b 8d 00 08 lw r13,(sp+8)
800778c: 37 9c 00 10 addi sp,sp,16
8007790: c3 a0 00 00 ret
*/
flags_to_test = flags;
if ( st_uid == jnode->st_uid )
flags_to_test <<= 6;
8007794: b5 8c 10 00 add r2,r12,r12
8007798: b4 42 10 00 add r2,r2,r2
800779c: b4 42 10 00 add r2,r2,r2
80077a0: b4 42 10 00 add r2,r2,r2
80077a4: b4 42 10 00 add r2,r2,r2
80077a8: b4 42 10 00 add r2,r2,r2
80077ac: e3 ff ff f1 bi 8007770 <IMFS_evaluate_permission+0x48>
else if ( st_gid == jnode->st_gid )
flags_to_test <<= 3;
80077b0: b5 8c 10 00 add r2,r12,r12
80077b4: b4 42 10 00 add r2,r2,r2
80077b8: b4 42 10 00 add r2,r2,r2
80077bc: e3 ff ff ed bi 8007770 <IMFS_evaluate_permission+0x48>
gid_t st_gid;
IMFS_jnode_t *jnode;
int flags_to_test;
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
80077c0: f8 00 15 81 calli 800cdc4 <__errno> <== NOT EXECUTED
80077c4: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
80077c8: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
80077cc: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
80077d0: e3 ff ff eb bi 800777c <IMFS_evaluate_permission+0x54> <== NOT EXECUTED
08002058 <IMFS_fifo_lseek>:
rtems_off64_t IMFS_fifo_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
8002058: 37 9c ff f8 addi sp,sp,-8
800205c: 5b 8b 00 08 sw (sp+8),r11
8002060: 5b 9d 00 04 sw (sp+4),ra
8002064: b8 20 28 00 mv r5,r1
off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop);
8002068: 28 21 00 1c lw r1,(r1+28)
800206c: b8 60 10 00 mv r2,r3
8002070: b8 80 18 00 mv r3,r4
8002074: 28 21 00 50 lw r1,(r1+80)
8002078: b8 a0 20 00 mv r4,r5
800207c: f8 00 24 82 calli 800b284 <pipe_lseek>
8002080: b8 20 58 00 mv r11,r1
IMFS_FIFO_RETURN(err);
8002084: 4c 20 00 07 bge r1,r0,80020a0 <IMFS_fifo_lseek+0x48> <== NEVER TAKEN
8002088: f8 00 35 98 calli 800f6e8 <__errno>
800208c: c8 0b 58 00 sub r11,r0,r11
8002090: 58 2b 00 00 sw (r1+0),r11
8002094: 34 02 ff ff mvi r2,-1
8002098: 34 01 ff ff mvi r1,-1
800209c: e0 00 00 04 bi 80020ac <IMFS_fifo_lseek+0x54>
80020a0: 34 02 00 1f mvi r2,31
80020a4: f8 00 78 d8 calli 8020404 <__ashrsi3>
80020a8: b9 60 10 00 mv r2,r11
}
80020ac: 2b 9d 00 04 lw ra,(sp+4)
80020b0: 2b 8b 00 08 lw r11,(sp+8)
80020b4: 37 9c 00 08 addi sp,sp,8
80020b8: c3 a0 00 00 ret
08002158 <IMFS_fifo_write>:
ssize_t IMFS_fifo_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
8002158: 37 9c ff ec addi sp,sp,-20
800215c: 5b 8b 00 0c sw (sp+12),r11
8002160: 5b 8c 00 08 sw (sp+8),r12
8002164: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *jnode = iop->pathinfo.node_access;
8002168: 28 2c 00 1c lw r12,(r1+28)
int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop);
800216c: b8 20 20 00 mv r4,r1
8002170: 29 81 00 50 lw r1,(r12+80)
8002174: f8 00 23 91 calli 800afb8 <pipe_write>
8002178: b8 20 58 00 mv r11,r1
if (err > 0) {
800217c: 4c 01 00 0d bge r0,r1,80021b0 <IMFS_fifo_write+0x58>
IMFS_mtime_ctime_update(jnode);
8002180: 37 81 00 10 addi r1,sp,16
8002184: 34 02 00 00 mvi r2,0
8002188: f8 00 05 2b calli 8003634 <gettimeofday>
800218c: 2b 81 00 10 lw r1,(sp+16)
8002190: 59 81 00 44 sw (r12+68),r1
8002194: 59 81 00 48 sw (r12+72),r1
}
IMFS_FIFO_RETURN(err);
}
8002198: b9 60 08 00 mv r1,r11
800219c: 2b 9d 00 04 lw ra,(sp+4)
80021a0: 2b 8b 00 0c lw r11,(sp+12)
80021a4: 2b 8c 00 08 lw r12,(sp+8)
80021a8: 37 9c 00 14 addi sp,sp,20
80021ac: c3 a0 00 00 ret
int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop);
if (err > 0) {
IMFS_mtime_ctime_update(jnode);
}
IMFS_FIFO_RETURN(err);
80021b0: 44 20 ff fa be r1,r0,8002198 <IMFS_fifo_write+0x40> <== NEVER TAKEN
80021b4: c8 0b 58 00 sub r11,r0,r11
80021b8: f8 00 35 4c calli 800f6e8 <__errno>
80021bc: 58 2b 00 00 sw (r1+0),r11
80021c0: 34 0b ff ff mvi r11,-1
80021c4: e3 ff ff f5 bi 8002198 <IMFS_fifo_write+0x40>
0800808c <IMFS_find_match_in_dir>:
IMFS_jnode_t *IMFS_find_match_in_dir(
IMFS_jnode_t *directory,
char *name
)
{
800808c: 37 9c ff ec addi sp,sp,-20
8008090: 5b 8b 00 14 sw (sp+20),r11
8008094: 5b 8c 00 10 sw (sp+16),r12
8008098: 5b 8d 00 0c sw (sp+12),r13
800809c: 5b 8e 00 08 sw (sp+8),r14
80080a0: 5b 9d 00 04 sw (sp+4),ra
80080a4: b8 40 60 00 mv r12,r2
/*
* Check for "." and ".."
*/
if ( !strcmp( name, dotname ) )
80080a8: 78 02 08 01 mvhi r2,0x801
IMFS_jnode_t *IMFS_find_match_in_dir(
IMFS_jnode_t *directory,
char *name
)
{
80080ac: b8 20 58 00 mv r11,r1
/*
* Check for "." and ".."
*/
if ( !strcmp( name, dotname ) )
80080b0: 38 42 36 b8 ori r2,r2,0x36b8
80080b4: b9 80 08 00 mv r1,r12
80080b8: f8 00 17 6d calli 800de6c <strcmp>
80080bc: 44 20 00 07 be r1,r0,80080d8 <IMFS_find_match_in_dir+0x4c> <== NEVER TAKEN
return directory;
if ( !strcmp( name, dotdotname ) )
80080c0: 78 02 08 01 mvhi r2,0x801
80080c4: b9 80 08 00 mv r1,r12
80080c8: 38 42 36 bc ori r2,r2,0x36bc
80080cc: f8 00 17 68 calli 800de6c <strcmp>
80080d0: 5c 20 00 0a bne r1,r0,80080f8 <IMFS_find_match_in_dir+0x6c><== ALWAYS TAKEN
return directory->Parent;
80080d4: 29 6b 00 08 lw r11,(r11+8) <== NOT EXECUTED
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
}
80080d8: b9 60 08 00 mv r1,r11
80080dc: 2b 9d 00 04 lw ra,(sp+4)
80080e0: 2b 8b 00 14 lw r11,(sp+20)
80080e4: 2b 8c 00 10 lw r12,(sp+16)
80080e8: 2b 8d 00 0c lw r13,(sp+12)
80080ec: 2b 8e 00 08 lw r14,(sp+8)
80080f0: 37 9c 00 14 addi sp,sp,20
80080f4: c3 a0 00 00 ret
80080f8: 29 6d 00 50 lw r13,(r11+80)
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
80080fc: 35 6e 00 54 addi r14,r11,84
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
8008100: 34 0b 00 00 mvi r11,0
if ( !strcmp( name, dotdotname ) )
return directory->Parent;
the_chain = &directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
8008104: 5d ae 00 04 bne r13,r14,8008114 <IMFS_find_match_in_dir+0x88>
8008108: e3 ff ff f4 bi 80080d8 <IMFS_find_match_in_dir+0x4c>
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
800810c: 29 ad 00 00 lw r13,(r13+0)
if ( !strcmp( name, dotdotname ) )
return directory->Parent;
the_chain = &directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
8008110: 45 ae 00 07 be r13,r14,800812c <IMFS_find_match_in_dir+0xa0>
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
if ( !strcmp( name, the_jnode->name ) )
8008114: 35 a2 00 0c addi r2,r13,12
8008118: b9 80 08 00 mv r1,r12
800811c: f8 00 17 54 calli 800de6c <strcmp>
8008120: 5c 20 ff fb bne r1,r0,800810c <IMFS_find_match_in_dir+0x80>
for ( the_node = rtems_chain_first( the_chain );
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
8008124: b9 a0 58 00 mv r11,r13
8008128: e3 ff ff ec bi 80080d8 <IMFS_find_match_in_dir+0x4c>
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
800812c: 34 0b 00 00 mvi r11,0
8008130: e3 ff ff ea bi 80080d8 <IMFS_find_match_in_dir+0x4c>
08007fac <IMFS_fsunmount>:
((IMFS_jnode_t *)( rtems_chain_head( jnode_get_control( jnode ) )->next))
int IMFS_fsunmount(
rtems_filesystem_mount_table_entry_t *temp_mt_entry
)
{
8007fac: 37 9c ff d8 addi sp,sp,-40
8007fb0: 5b 8b 00 14 sw (sp+20),r11
8007fb4: 5b 8c 00 10 sw (sp+16),r12
8007fb8: 5b 8d 00 0c sw (sp+12),r13
8007fbc: 5b 8e 00 08 sw (sp+8),r14
8007fc0: 5b 9d 00 04 sw (sp+4),ra
/*
* Traverse tree that starts at the mt_fs_root and deallocate memory
* associated memory space
*/
jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access;
8007fc4: 28 2b 00 1c lw r11,(r1+28)
loc = temp_mt_entry->mt_fs_root;
8007fc8: 28 25 00 20 lw r5,(r1+32)
8007fcc: 28 24 00 24 lw r4,(r1+36)
8007fd0: 28 23 00 28 lw r3,(r1+40)
8007fd4: 28 22 00 2c lw r2,(r1+44)
8007fd8: 5b 8b 00 18 sw (sp+24),r11
8007fdc: 5b 85 00 1c sw (sp+28),r5
8007fe0: 5b 84 00 20 sw (sp+32),r4
8007fe4: 5b 83 00 24 sw (sp+36),r3
8007fe8: 5b 82 00 28 sw (sp+40),r2
/*
* Set this to null to indicate that it is being unmounted.
*/
temp_mt_entry->mt_fs_root.node_access = NULL;
8007fec: 58 20 00 1c sw (r1+28),r0
8007ff0: 37 8d 00 18 addi r13,sp,24
do {
next = jnode->Parent;
loc.node_access = (void *)jnode;
IMFS_Set_handlers( &loc );
if ( jnode->type != IMFS_DIRECTORY ) {
8007ff4: 34 0c 00 01 mvi r12,1
temp_mt_entry->mt_fs_root.node_access = NULL;
do {
next = jnode->Parent;
loc.node_access = (void *)jnode;
IMFS_Set_handlers( &loc );
8007ff8: b9 a0 08 00 mv r1,r13
*/
temp_mt_entry->mt_fs_root.node_access = NULL;
do {
next = jnode->Parent;
8007ffc: 29 6e 00 08 lw r14,(r11+8)
loc.node_access = (void *)jnode;
8008000: 5b 8b 00 18 sw (sp+24),r11
IMFS_Set_handlers( &loc );
8008004: fb ff fd a6 calli 800769c <IMFS_Set_handlers>
if ( jnode->type != IMFS_DIRECTORY ) {
8008008: 29 61 00 4c lw r1,(r11+76)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800800c: 35 63 00 54 addi r3,r11,84
8008010: 5c 2c 00 13 bne r1,r12,800805c <IMFS_fsunmount+0xb0>
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
8008014: 29 61 00 50 lw r1,(r11+80)
8008018: 44 23 00 17 be r1,r3,8008074 <IMFS_fsunmount+0xc8>
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
jnode = next;
}
if ( jnode != NULL ) {
800801c: 45 60 00 08 be r11,r0,800803c <IMFS_fsunmount+0x90>
if ( jnode->type == IMFS_DIRECTORY ) {
8008020: 29 61 00 4c lw r1,(r11+76)
8008024: 5c 2c ff f5 bne r1,r12,8007ff8 <IMFS_fsunmount+0x4c> <== NEVER TAKEN
}
}
} while (jnode != NULL);
return 0;
}
8008028: 29 61 00 50 lw r1,(r11+80)
800802c: 35 62 00 54 addi r2,r11,84
return -1;
jnode = next;
}
if ( jnode != NULL ) {
if ( jnode->type == IMFS_DIRECTORY ) {
if ( jnode_has_children( jnode ) )
8008030: 44 22 ff f2 be r1,r2,8007ff8 <IMFS_fsunmount+0x4c>
jnode = jnode_get_first_child( jnode );
8008034: b8 20 58 00 mv r11,r1
}
}
} while (jnode != NULL);
8008038: 5c 20 ff f0 bne r1,r0,8007ff8 <IMFS_fsunmount+0x4c> <== ALWAYS TAKEN
return 0;
800803c: 34 01 00 00 mvi r1,0
}
8008040: 2b 9d 00 04 lw ra,(sp+4)
8008044: 2b 8b 00 14 lw r11,(sp+20)
8008048: 2b 8c 00 10 lw r12,(sp+16)
800804c: 2b 8d 00 0c lw r13,(sp+12)
8008050: 2b 8e 00 08 lw r14,(sp+8)
8008054: 37 9c 00 28 addi sp,sp,40
8008058: c3 a0 00 00 ret
next = jnode->Parent;
loc.node_access = (void *)jnode;
IMFS_Set_handlers( &loc );
if ( jnode->type != IMFS_DIRECTORY ) {
result = IMFS_unlink( NULL, &loc );
800805c: b9 a0 10 00 mv r2,r13
8008060: 34 01 00 00 mvi r1,0
8008064: fb ff e3 75 calli 8000e38 <IMFS_unlink>
if (result != 0)
8008068: 5c 20 00 07 bne r1,r0,8008084 <IMFS_fsunmount+0xd8> <== NEVER TAKEN
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
jnode = next;
800806c: b9 c0 58 00 mv r11,r14
8008070: e3 ff ff eb bi 800801c <IMFS_fsunmount+0x70>
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
result = IMFS_unlink( NULL, &loc );
8008074: 34 01 00 00 mvi r1,0
8008078: b9 a0 10 00 mv r2,r13
800807c: fb ff e3 6f calli 8000e38 <IMFS_unlink>
if (result != 0)
8008080: 44 20 ff fb be r1,r0,800806c <IMFS_fsunmount+0xc0> <== ALWAYS TAKEN
return -1;
8008084: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8008088: e3 ff ff ee bi 8008040 <IMFS_fsunmount+0x94> <== NOT EXECUTED
08008134 <IMFS_get_token>:
const char *path,
int pathlen,
char *token,
int *token_len
)
{
8008134: 37 9c ff e0 addi sp,sp,-32
8008138: 5b 8b 00 20 sw (sp+32),r11
800813c: 5b 8c 00 1c sw (sp+28),r12
8008140: 5b 8d 00 18 sw (sp+24),r13
8008144: 5b 8e 00 14 sw (sp+20),r14
8008148: 5b 8f 00 10 sw (sp+16),r15
800814c: 5b 90 00 0c sw (sp+12),r16
8008150: 5b 91 00 08 sw (sp+8),r17
8008154: 5b 9d 00 04 sw (sp+4),ra
register int i = 0;
8008158: 34 0b 00 00 mvi r11,0
const char *path,
int pathlen,
char *token,
int *token_len
)
{
800815c: b8 20 78 00 mv r15,r1
8008160: b8 40 70 00 mv r14,r2
8008164: b8 60 68 00 mv r13,r3
8008168: b8 80 88 00 mv r17,r4
register char c;
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
800816c: 40 2c 00 00 lbu r12,(r1+0)
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
token[i] = c;
if ( i == IMFS_NAME_MAX )
8008170: 34 10 00 20 mvi r16,32
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
8008174: e0 00 00 07 bi 8008190 <IMFS_get_token+0x5c>
8008178: 44 a1 00 0b be r5,r1,80081a4 <IMFS_get_token+0x70> <== NEVER TAKEN
token[i] = c;
800817c: 30 cc 00 00 sb (r6+0),r12
if ( i == IMFS_NAME_MAX )
8008180: 45 70 00 32 be r11,r16,8008248 <IMFS_get_token+0x114>
return IMFS_INVALID_TOKEN;
if ( !IMFS_is_valid_name_char(c) )
type = IMFS_INVALID_TOKEN;
c = path [++i];
8008184: 35 6b 00 01 addi r11,r11,1
#include <string.h>
#include "imfs.h"
#include <rtems/libio_.h>
IMFS_token_types IMFS_get_token(
8008188: b5 eb 28 00 add r5,r15,r11
return IMFS_INVALID_TOKEN;
if ( !IMFS_is_valid_name_char(c) )
type = IMFS_INVALID_TOKEN;
c = path [++i];
800818c: 40 ac 00 00 lbu r12,(r5+0)
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
8008190: b9 80 08 00 mv r1,r12
8008194: fb ff e9 2c calli 8002644 <rtems_filesystem_is_separator>
8008198: e9 cb 28 00 cmpg r5,r14,r11
#include <string.h>
#include "imfs.h"
#include <rtems/libio_.h>
IMFS_token_types IMFS_get_token(
800819c: b5 ab 30 00 add r6,r13,r11
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
80081a0: 44 20 ff f6 be r1,r0,8008178 <IMFS_get_token+0x44>
/*
* Copy a seperator into token.
*/
if ( i == 0 ) {
80081a4: 5d 60 00 14 bne r11,r0,80081f4 <IMFS_get_token+0xc0>
token[i] = c;
if ( (token[i] != '\0') && pathlen ) {
80081a8: 7d 81 00 00 cmpnei r1,r12,0
80081ac: 7d ce 00 00 cmpnei r14,r14,0
/*
* Copy a seperator into token.
*/
if ( i == 0 ) {
token[i] = c;
80081b0: 31 ac 00 00 sb (r13+0),r12
if ( (token[i] != '\0') && pathlen ) {
80081b4: a0 2e 70 00 and r14,r1,r14
80081b8: 45 cb 00 26 be r14,r11,8008250 <IMFS_get_token+0x11c>
i++;
80081bc: 34 0b 00 01 mvi r11,1
type = IMFS_CURRENT_DIR;
80081c0: 34 02 00 01 mvi r2,1
/*
* Set token_len to the number of characters copied.
*/
*token_len = i;
80081c4: 5a 2b 00 00 sw (r17+0),r11
else if ( strcmp( token, "." ) == 0 )
type = IMFS_CURRENT_DIR;
}
return type;
}
80081c8: b8 40 08 00 mv r1,r2
80081cc: 2b 9d 00 04 lw ra,(sp+4)
80081d0: 2b 8b 00 20 lw r11,(sp+32)
80081d4: 2b 8c 00 1c lw r12,(sp+28)
80081d8: 2b 8d 00 18 lw r13,(sp+24)
80081dc: 2b 8e 00 14 lw r14,(sp+20)
80081e0: 2b 8f 00 10 lw r15,(sp+16)
80081e4: 2b 90 00 0c lw r16,(sp+12)
80081e8: 2b 91 00 08 lw r17,(sp+8)
80081ec: 37 9c 00 20 addi sp,sp,32
80081f0: c3 a0 00 00 ret
i++;
type = IMFS_CURRENT_DIR;
} else {
type = IMFS_NO_MORE_PATH;
}
} else if (token[ i-1 ] != '\0') {
80081f4: b5 ab 08 00 add r1,r13,r11
80081f8: 40 22 ff ff lbu r2,(r1+-1)
80081fc: 44 40 00 02 be r2,r0,8008204 <IMFS_get_token+0xd0> <== NEVER TAKEN
token[i] = '\0';
8008200: 30 20 00 00 sb (r1+0),r0
* If we copied something that was not a seperator see if
* it was a special name.
*/
if ( type == IMFS_NAME ) {
if ( strcmp( token, "..") == 0 )
8008204: 78 02 08 01 mvhi r2,0x801
8008208: 38 42 36 c4 ori r2,r2,0x36c4
/*
* Set token_len to the number of characters copied.
*/
*token_len = i;
800820c: 5a 2b 00 00 sw (r17+0),r11
* If we copied something that was not a seperator see if
* it was a special name.
*/
if ( type == IMFS_NAME ) {
if ( strcmp( token, "..") == 0 )
8008210: b9 a0 08 00 mv r1,r13
8008214: f8 00 17 16 calli 800de6c <strcmp>
type = IMFS_UP_DIR;
8008218: 34 02 00 02 mvi r2,2
* If we copied something that was not a seperator see if
* it was a special name.
*/
if ( type == IMFS_NAME ) {
if ( strcmp( token, "..") == 0 )
800821c: 44 20 ff eb be r1,r0,80081c8 <IMFS_get_token+0x94>
type = IMFS_UP_DIR;
else if ( strcmp( token, "." ) == 0 )
8008220: 78 02 08 01 mvhi r2,0x801
8008224: 38 42 36 c0 ori r2,r2,0x36c0
8008228: b9 a0 08 00 mv r1,r13
800822c: f8 00 17 10 calli 800de6c <strcmp>
8008230: 64 21 00 00 cmpei r1,r1,0
8008234: 34 02 ff fe mvi r2,-2
8008238: c8 01 08 00 sub r1,r0,r1
800823c: a0 22 10 00 and r2,r1,r2
8008240: 34 42 00 03 addi r2,r2,3
8008244: e3 ff ff e1 bi 80081c8 <IMFS_get_token+0x94>
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
token[i] = c;
if ( i == IMFS_NAME_MAX )
return IMFS_INVALID_TOKEN;
8008248: 34 02 00 04 mvi r2,4
800824c: e3 ff ff df bi 80081c8 <IMFS_get_token+0x94>
if ( (token[i] != '\0') && pathlen ) {
i++;
type = IMFS_CURRENT_DIR;
} else {
type = IMFS_NO_MORE_PATH;
8008250: 34 02 00 00 mvi r2,0
/*
* Set token_len to the number of characters copied.
*/
*token_len = i;
8008254: 5a 2b 00 00 sw (r17+0),r11
8008258: e3 ff ff dc bi 80081c8 <IMFS_get_token+0x94>
0800091c <IMFS_initialize_support>:
const rtems_filesystem_operations_table *op_table,
const rtems_filesystem_file_handlers_r *memfile_handlers,
const rtems_filesystem_file_handlers_r *directory_handlers,
const rtems_filesystem_file_handlers_r *fifo_handlers
)
{
800091c: 37 9c ff d8 addi sp,sp,-40
8000920: 5b 8b 00 28 sw (sp+40),r11
8000924: 5b 8c 00 24 sw (sp+36),r12
8000928: 5b 8d 00 20 sw (sp+32),r13
800092c: 5b 8e 00 1c sw (sp+28),r14
8000930: 5b 8f 00 18 sw (sp+24),r15
8000934: 5b 90 00 14 sw (sp+20),r16
8000938: 5b 91 00 10 sw (sp+16),r17
800093c: 5b 92 00 0c sw (sp+12),r18
8000940: 5b 93 00 08 sw (sp+8),r19
8000944: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *jnode;
/*
* determine/check value for imfs_memfile_bytes_per_block
*/
IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block,
8000948: 78 06 08 01 mvhi r6,0x801
800094c: 38 c6 40 14 ori r6,r6,0x4014
8000950: 28 c6 00 00 lw r6,(r6+0)
const rtems_filesystem_operations_table *op_table,
const rtems_filesystem_file_handlers_r *memfile_handlers,
const rtems_filesystem_file_handlers_r *directory_handlers,
const rtems_filesystem_file_handlers_r *fifo_handlers
)
{
8000954: b8 20 58 00 mv r11,r1
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
if (bit_mask == requested_bytes_per_block) {
8000958: 34 01 00 10 mvi r1,16
const rtems_filesystem_operations_table *op_table,
const rtems_filesystem_file_handlers_r *memfile_handlers,
const rtems_filesystem_file_handlers_r *directory_handlers,
const rtems_filesystem_file_handlers_r *fifo_handlers
)
{
800095c: b8 40 80 00 mv r16,r2
8000960: b8 60 78 00 mv r15,r3
8000964: b8 80 68 00 mv r13,r4
8000968: b8 a0 70 00 mv r14,r5
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
if (bit_mask == requested_bytes_per_block) {
800096c: 44 c1 00 0b be r6,r1,8000998 <IMFS_initialize_support+0x7c>
is_valid = true;
break;
}
if(bit_mask > requested_bytes_per_block)
8000970: 34 01 00 0f mvi r1,15
8000974: 4c 26 00 08 bge r1,r6,8000994 <IMFS_initialize_support+0x78>
8000978: 34 07 00 05 mvi r7,5
800097c: 34 01 00 20 mvi r1,32
int bit_mask;
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
8000980: 34 e7 ff ff addi r7,r7,-1
if (bit_mask == requested_bytes_per_block) {
8000984: 44 c1 00 05 be r6,r1,8000998 <IMFS_initialize_support+0x7c>
is_valid = true;
break;
}
if(bit_mask > requested_bytes_per_block)
8000988: 48 26 00 03 bg r1,r6,8000994 <IMFS_initialize_support+0x78><== NEVER TAKEN
int bit_mask;
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
800098c: b4 21 08 00 add r1,r1,r1
8000990: 5c e0 ff fc bne r7,r0,8000980 <IMFS_initialize_support+0x64><== ALWAYS TAKEN
if(bit_mask > requested_bytes_per_block)
break;
}
*dest_bytes_per_block = ((is_valid)
? requested_bytes_per_block
: default_bytes_per_block);
8000994: 34 06 00 80 mvi r6,128
break;
}
if(bit_mask > requested_bytes_per_block)
break;
}
*dest_bytes_per_block = ((is_valid)
8000998: 78 01 08 01 mvhi r1,0x801
800099c: 38 21 46 a8 ori r1,r1,0x46a8
80009a0: 58 26 00 00 sw (r1+0),r6
/*
* Create the root node
*
* NOTE: UNIX root is 755 and owned by root/root (0/0).
*/
temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node();
80009a4: f8 00 1b 2e calli 800765c <IMFS_create_root_node>
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
temp_mt_entry->mt_fs_root.ops = op_table;
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
80009a8: 78 06 08 01 mvhi r6,0x801
80009ac: 38 c6 36 68 ori r6,r6,0x3668
80009b0: 28 c2 00 28 lw r2,(r6+40)
/*
* Create the root node
*
* NOTE: UNIX root is 755 and owned by root/root (0/0).
*/
temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node();
80009b4: b8 20 60 00 mv r12,r1
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
temp_mt_entry->mt_fs_root.ops = op_table;
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
80009b8: 28 d3 00 00 lw r19,(r6+0)
80009bc: 28 c1 00 2c lw r1,(r6+44)
80009c0: 28 d2 00 04 lw r18,(r6+4)
80009c4: 28 d1 00 08 lw r17,(r6+8)
80009c8: 28 ca 00 0c lw r10,(r6+12)
80009cc: 28 c9 00 10 lw r9,(r6+16)
80009d0: 28 c8 00 14 lw r8,(r6+20)
80009d4: 28 c7 00 18 lw r7,(r6+24)
80009d8: 28 c5 00 1c lw r5,(r6+28)
80009dc: 28 c4 00 20 lw r4,(r6+32)
80009e0: 28 c3 00 24 lw r3,(r6+36)
80009e4: 59 62 00 60 sw (r11+96),r2
80009e8: 59 61 00 64 sw (r11+100),r1
/*
* Create custom file system data.
*/
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
80009ec: 34 02 00 14 mvi r2,20
/*
* Create the root node
*
* NOTE: UNIX root is 755 and owned by root/root (0/0).
*/
temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node();
80009f0: 59 6c 00 1c sw (r11+28),r12
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
80009f4: 59 6d 00 24 sw (r11+36),r13
temp_mt_entry->mt_fs_root.ops = op_table;
80009f8: 59 70 00 28 sw (r11+40),r16
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
80009fc: 59 73 00 38 sw (r11+56),r19
8000a00: 59 72 00 3c sw (r11+60),r18
8000a04: 59 71 00 40 sw (r11+64),r17
8000a08: 59 6a 00 44 sw (r11+68),r10
8000a0c: 59 69 00 48 sw (r11+72),r9
8000a10: 59 68 00 4c sw (r11+76),r8
8000a14: 59 67 00 50 sw (r11+80),r7
8000a18: 59 65 00 54 sw (r11+84),r5
8000a1c: 59 64 00 58 sw (r11+88),r4
8000a20: 59 63 00 5c sw (r11+92),r3
/*
* Create custom file system data.
*/
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
8000a24: 34 01 00 01 mvi r1,1
8000a28: f8 00 02 08 calli 8001248 <calloc>
8000a2c: b8 20 10 00 mv r2,r1
if ( !fs_info ) {
8000a30: 44 20 00 1b be r1,r0,8000a9c <IMFS_initialize_support+0x180>
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
8000a34: 78 06 08 01 mvhi r6,0x801
8000a38: 38 c6 46 ac ori r6,r6,0x46ac
8000a3c: 28 c4 00 00 lw r4,(r6+0)
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
if ( !fs_info ) {
free(temp_mt_entry->mt_fs_root.node_access);
rtems_set_errno_and_return_minus_one(ENOMEM);
}
temp_mt_entry->fs_info = fs_info;
8000a40: 59 62 00 34 sw (r11+52),r2
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
fs_info->ino_count = 1;
8000a44: 34 01 00 01 mvi r1,1
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
8000a48: 58 44 00 00 sw (r2+0),r4
fs_info->ino_count = 1;
8000a4c: 58 41 00 04 sw (r2+4),r1
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
8000a50: 34 84 00 01 addi r4,r4,1
fs_info->ino_count = 1;
fs_info->memfile_handlers = memfile_handlers;
8000a54: 58 4f 00 08 sw (r2+8),r15
fs_info->directory_handlers = directory_handlers;
8000a58: 58 4d 00 0c sw (r2+12),r13
fs_info->fifo_handlers = fifo_handlers;
8000a5c: 58 4e 00 10 sw (r2+16),r14
jnode = temp_mt_entry->mt_fs_root.node_access;
jnode->st_ino = fs_info->ino_count;
8000a60: 59 81 00 38 sw (r12+56),r1
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
8000a64: 58 c4 00 00 sw (r6+0),r4
fs_info->fifo_handlers = fifo_handlers;
jnode = temp_mt_entry->mt_fs_root.node_access;
jnode->st_ino = fs_info->ino_count;
return 0;
8000a68: 34 01 00 00 mvi r1,0
}
8000a6c: 2b 9d 00 04 lw ra,(sp+4)
8000a70: 2b 8b 00 28 lw r11,(sp+40)
8000a74: 2b 8c 00 24 lw r12,(sp+36)
8000a78: 2b 8d 00 20 lw r13,(sp+32)
8000a7c: 2b 8e 00 1c lw r14,(sp+28)
8000a80: 2b 8f 00 18 lw r15,(sp+24)
8000a84: 2b 90 00 14 lw r16,(sp+20)
8000a88: 2b 91 00 10 lw r17,(sp+16)
8000a8c: 2b 92 00 0c lw r18,(sp+12)
8000a90: 2b 93 00 08 lw r19,(sp+8)
8000a94: 37 9c 00 28 addi sp,sp,40
8000a98: c3 a0 00 00 ret
/*
* Create custom file system data.
*/
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
if ( !fs_info ) {
free(temp_mt_entry->mt_fs_root.node_access);
8000a9c: b9 80 08 00 mv r1,r12
8000aa0: f8 00 02 82 calli 80014a8 <free>
rtems_set_errno_and_return_minus_one(ENOMEM);
8000aa4: f8 00 30 c8 calli 800cdc4 <__errno>
8000aa8: 34 02 00 0c mvi r2,12
8000aac: 58 22 00 00 sw (r1+0),r2
8000ab0: 34 01 ff ff mvi r1,-1
8000ab4: e3 ff ff ee bi 8000a6c <IMFS_initialize_support+0x150>
0800b444 <IMFS_memfile_extend>:
*/
MEMFILE_STATIC int IMFS_memfile_extend(
IMFS_jnode_t *the_jnode,
off_t new_length
)
{
800b444: 37 9c ff e0 addi sp,sp,-32
800b448: 5b 8b 00 20 sw (sp+32),r11
800b44c: 5b 8c 00 1c sw (sp+28),r12
800b450: 5b 8d 00 18 sw (sp+24),r13
800b454: 5b 8e 00 14 sw (sp+20),r14
800b458: 5b 8f 00 10 sw (sp+16),r15
800b45c: 5b 90 00 0c sw (sp+12),r16
800b460: 5b 91 00 08 sw (sp+8),r17
800b464: 5b 9d 00 04 sw (sp+4),ra
IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE );
/*
* Verify new file size is supported
*/
if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE )
800b468: 78 03 08 01 mvhi r3,0x801
800b46c: 38 63 46 a8 ori r3,r3,0x46a8
800b470: 28 6d 00 00 lw r13,(r3+0)
*/
MEMFILE_STATIC int IMFS_memfile_extend(
IMFS_jnode_t *the_jnode,
off_t new_length
)
{
800b474: b8 40 78 00 mv r15,r2
800b478: b8 20 60 00 mv r12,r1
IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE );
/*
* Verify new file size is supported
*/
if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE )
800b47c: 01 ab 00 01 srui r11,r13,1
800b480: 01 6b 00 01 srui r11,r11,1
800b484: b9 60 10 00 mv r2,r11
800b488: 35 61 00 01 addi r1,r11,1
800b48c: f8 00 1b 76 calli 8012264 <__mulsi3>
800b490: b9 60 10 00 mv r2,r11
800b494: 34 21 00 01 addi r1,r1,1
800b498: f8 00 1b 73 calli 8012264 <__mulsi3>
800b49c: 34 21 ff ff addi r1,r1,-1
800b4a0: b9 a0 10 00 mv r2,r13
800b4a4: f8 00 1b 70 calli 8012264 <__mulsi3>
800b4a8: 54 2f 00 06 bgu r1,r15,800b4c0 <IMFS_memfile_extend+0x7c>
rtems_set_errno_and_return_minus_one( EINVAL );
800b4ac: f8 00 06 46 calli 800cdc4 <__errno>
800b4b0: 34 02 00 16 mvi r2,22
800b4b4: 58 22 00 00 sw (r1+0),r2
800b4b8: 34 01 ff ff mvi r1,-1
800b4bc: e0 00 00 2e bi 800b574 <IMFS_memfile_extend+0x130>
/*
* Verify new file size is actually larger than current size
*/
if ( new_length <= the_jnode->info.file.size )
800b4c0: b9 e0 08 00 mv r1,r15
800b4c4: 34 02 00 1f mvi r2,31
800b4c8: f8 00 1b 19 calli 801212c <__ashrsi3>
800b4cc: 29 8b 00 50 lw r11,(r12+80)
800b4d0: b8 20 80 00 mv r16,r1
800b4d4: 29 91 00 54 lw r17,(r12+84)
800b4d8: 48 2b 00 05 bg r1,r11,800b4ec <IMFS_memfile_extend+0xa8> <== NEVER TAKEN
800b4dc: 5c 2b 00 02 bne r1,r11,800b4e4 <IMFS_memfile_extend+0xa0> <== NEVER TAKEN
800b4e0: 55 f1 00 03 bgu r15,r17,800b4ec <IMFS_memfile_extend+0xa8>
return 0;
800b4e4: 34 01 00 00 mvi r1,0
800b4e8: e0 00 00 23 bi 800b574 <IMFS_memfile_extend+0x130>
/*
* Calculate the number of range of blocks to allocate
*/
new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK;
800b4ec: b9 a0 10 00 mv r2,r13
800b4f0: b9 e0 08 00 mv r1,r15
800b4f4: f8 00 1b 68 calli 8012294 <__divsi3>
old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK;
800b4f8: 34 02 00 1f mvi r2,31
return 0;
/*
* Calculate the number of range of blocks to allocate
*/
new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK;
800b4fc: b8 20 70 00 mv r14,r1
old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK;
800b500: b9 a0 08 00 mv r1,r13
800b504: f8 00 1b 0a calli 801212c <__ashrsi3>
800b508: b8 20 18 00 mv r3,r1
800b50c: b9 a0 20 00 mv r4,r13
800b510: b9 60 08 00 mv r1,r11
800b514: ba 20 10 00 mv r2,r17
800b518: f8 00 15 13 calli 8010964 <__divdi3>
800b51c: b8 40 68 00 mv r13,r2
/*
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
800b520: 54 4e 00 08 bgu r2,r14,800b540 <IMFS_memfile_extend+0xfc> <== NEVER TAKEN
800b524: b8 40 58 00 mv r11,r2
if ( IMFS_memfile_addblock( the_jnode, block ) ) {
800b528: b9 60 10 00 mv r2,r11
800b52c: b9 80 08 00 mv r1,r12
800b530: fb ff ff 0f calli 800b16c <IMFS_memfile_addblock>
800b534: 5c 20 00 0b bne r1,r0,800b560 <IMFS_memfile_extend+0x11c>
old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK;
/*
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
800b538: 35 6b 00 01 addi r11,r11,1
800b53c: 51 cb ff fb bgeu r14,r11,800b528 <IMFS_memfile_extend+0xe4>
}
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
800b540: 59 90 00 50 sw (r12+80),r16
800b544: 59 8f 00 54 sw (r12+84),r15
return 0;
800b548: 34 01 00 00 mvi r1,0
800b54c: e0 00 00 0a bi 800b574 <IMFS_memfile_extend+0x130>
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
if ( IMFS_memfile_addblock( the_jnode, block ) ) {
for ( ; block>=old_blocks ; block-- ) {
IMFS_memfile_remove_block( the_jnode, block );
800b550: b9 60 10 00 mv r2,r11
800b554: b9 80 08 00 mv r1,r12
/*
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
if ( IMFS_memfile_addblock( the_jnode, block ) ) {
for ( ; block>=old_blocks ; block-- ) {
800b558: 35 6b ff ff addi r11,r11,-1
IMFS_memfile_remove_block( the_jnode, block );
800b55c: fb ff ff ae calli 800b414 <IMFS_memfile_remove_block>
/*
* 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-- ) {
800b560: 51 6d ff fc bgeu r11,r13,800b550 <IMFS_memfile_extend+0x10c>
IMFS_memfile_remove_block( the_jnode, block );
}
rtems_set_errno_and_return_minus_one( ENOSPC );
800b564: f8 00 06 18 calli 800cdc4 <__errno>
800b568: 34 02 00 1c mvi r2,28
800b56c: 58 22 00 00 sw (r1+0),r2
800b570: 34 01 ff ff mvi r1,-1
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
return 0;
}
800b574: 2b 9d 00 04 lw ra,(sp+4)
800b578: 2b 8b 00 20 lw r11,(sp+32)
800b57c: 2b 8c 00 1c lw r12,(sp+28)
800b580: 2b 8d 00 18 lw r13,(sp+24)
800b584: 2b 8e 00 14 lw r14,(sp+20)
800b588: 2b 8f 00 10 lw r15,(sp+16)
800b58c: 2b 90 00 0c lw r16,(sp+12)
800b590: 2b 91 00 08 lw r17,(sp+8)
800b594: 37 9c 00 20 addi sp,sp,32
800b598: c3 a0 00 00 ret
0800aca4 <IMFS_memfile_get_block_pointer>:
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
800aca4: 37 9c ff dc addi sp,sp,-36
800aca8: 5b 8b 00 20 sw (sp+32),r11
800acac: 5b 8c 00 1c sw (sp+28),r12
800acb0: 5b 8d 00 18 sw (sp+24),r13
800acb4: 5b 8e 00 14 sw (sp+20),r14
800acb8: 5b 8f 00 10 sw (sp+16),r15
800acbc: 5b 90 00 0c sw (sp+12),r16
800acc0: 5b 91 00 08 sw (sp+8),r17
800acc4: 5b 9d 00 04 sw (sp+4),ra
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
800acc8: 78 04 08 01 mvhi r4,0x801
800accc: 38 84 46 a8 ori r4,r4,0x46a8
800acd0: 28 8b 00 00 lw r11,(r4+0)
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
800acd4: b8 20 70 00 mv r14,r1
800acd8: b8 40 60 00 mv r12,r2
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
800acdc: 01 6b 00 01 srui r11,r11,1
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
800ace0: b8 60 78 00 mv r15,r3
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
800ace4: 01 6b 00 01 srui r11,r11,1
800ace8: 35 61 ff ff addi r1,r11,-1
800acec: 54 41 00 08 bgu r2,r1,800ad0c <IMFS_memfile_get_block_pointer+0x68>
p = info->indirect;
800acf0: 29 c2 00 58 lw r2,(r14+88)
if ( malloc_it ) {
800acf4: 44 60 00 2b be r3,r0,800ada0 <IMFS_memfile_get_block_pointer+0xfc>
if ( !p ) {
800acf8: 44 40 00 5f be r2,r0,800ae74 <IMFS_memfile_get_block_pointer+0x1d0>
}
if ( !p )
return 0;
return &info->indirect[ my_block ];
800acfc: b5 8c 60 00 add r12,r12,r12
800ad00: b5 8c 60 00 add r12,r12,r12
800ad04: b4 4c 68 00 add r13,r2,r12
800ad08: e0 00 00 1b bi 800ad74 <IMFS_memfile_get_block_pointer+0xd0>
/*
* Is the block number in the doubly indirect portion?
*/
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
800ad0c: 35 61 00 01 addi r1,r11,1
800ad10: b9 60 10 00 mv r2,r11
800ad14: f8 00 1d 54 calli 8012264 <__mulsi3>
800ad18: b8 20 80 00 mv r16,r1
800ad1c: 34 21 ff ff addi r1,r1,-1
800ad20: 55 81 00 23 bgu r12,r1,800adac <IMFS_memfile_get_block_pointer+0x108>
my_block -= FIRST_DOUBLY_INDIRECT;
800ad24: c9 8b 60 00 sub r12,r12,r11
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
800ad28: b9 60 10 00 mv r2,r11
800ad2c: b9 80 08 00 mv r1,r12
800ad30: f8 00 1d c2 calli 8012438 <__umodsi3>
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800ad34: b9 60 10 00 mv r2,r11
*/
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
my_block -= FIRST_DOUBLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
800ad38: b8 20 80 00 mv r16,r1
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800ad3c: b9 80 08 00 mv r1,r12
800ad40: f8 00 1d ae calli 80123f8 <__udivsi3>
800ad44: b8 20 10 00 mv r2,r1
p = info->doubly_indirect;
800ad48: 29 c3 00 5c lw r3,(r14+92)
if ( malloc_it ) {
800ad4c: 45 e0 00 3f be r15,r0,800ae48 <IMFS_memfile_get_block_pointer+0x1a4>
if ( !p ) {
800ad50: 44 60 00 4f be r3,r0,800ae8c <IMFS_memfile_get_block_pointer+0x1e8>
if ( !p )
return 0;
info->doubly_indirect = p;
}
p1 = (block_p *)p[ doubly ];
800ad54: b4 42 10 00 add r2,r2,r2
800ad58: b4 42 10 00 add r2,r2,r2
800ad5c: b4 62 10 00 add r2,r3,r2
800ad60: 28 41 00 00 lw r1,(r2+0)
if ( !p1 ) {
800ad64: 44 20 00 52 be r1,r0,800aeac <IMFS_memfile_get_block_pointer+0x208>
if ( !p1 )
return 0;
p[ doubly ] = (block_p) p1;
}
return (block_p *)&p1[ singly ];
800ad68: b6 10 68 00 add r13,r16,r16
800ad6c: b5 ad 68 00 add r13,r13,r13
800ad70: b4 2d 68 00 add r13,r1,r13
/*
* This means the requested block number is out of range.
*/
return 0;
}
800ad74: b9 a0 08 00 mv r1,r13
800ad78: 2b 9d 00 04 lw ra,(sp+4)
800ad7c: 2b 8b 00 20 lw r11,(sp+32)
800ad80: 2b 8c 00 1c lw r12,(sp+28)
800ad84: 2b 8d 00 18 lw r13,(sp+24)
800ad88: 2b 8e 00 14 lw r14,(sp+20)
800ad8c: 2b 8f 00 10 lw r15,(sp+16)
800ad90: 2b 90 00 0c lw r16,(sp+12)
800ad94: 2b 91 00 08 lw r17,(sp+8)
800ad98: 37 9c 00 24 addi sp,sp,36
800ad9c: c3 a0 00 00 ret
}
return &info->indirect[ my_block ];
}
if ( !p )
return 0;
800ada0: 34 0d 00 00 mvi r13,0
info->indirect = p;
}
return &info->indirect[ my_block ];
}
if ( !p )
800ada4: 5c 4d ff d6 bne r2,r13,800acfc <IMFS_memfile_get_block_pointer+0x58><== ALWAYS TAKEN
800ada8: e3 ff ff f3 bi 800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NOT EXECUTED
}
/*
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
800adac: 36 01 00 01 addi r1,r16,1
800adb0: b9 60 10 00 mv r2,r11
800adb4: f8 00 1d 2c calli 8012264 <__mulsi3>
800adb8: 34 21 ff ff addi r1,r1,-1
}
/*
* This means the requested block number is out of range.
*/
return 0;
800adbc: 34 0d 00 00 mvi r13,0
}
/*
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
800adc0: 55 81 ff ed bgu r12,r1,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
my_block -= FIRST_TRIPLY_INDIRECT;
800adc4: c9 90 80 00 sub r16,r12,r16
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
800adc8: b9 60 10 00 mv r2,r11
800adcc: ba 00 08 00 mv r1,r16
800add0: f8 00 1d 9a calli 8012438 <__umodsi3>
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800add4: b9 60 10 00 mv r2,r11
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
my_block -= FIRST_TRIPLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
800add8: b8 20 60 00 mv r12,r1
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800addc: ba 00 08 00 mv r1,r16
800ade0: f8 00 1d 86 calli 80123f8 <__udivsi3>
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
800ade4: b9 60 10 00 mv r2,r11
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
my_block -= FIRST_TRIPLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800ade8: b8 20 88 00 mv r17,r1
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
800adec: f8 00 1d 83 calli 80123f8 <__udivsi3>
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
800adf0: b9 60 10 00 mv r2,r11
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
my_block -= FIRST_TRIPLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
800adf4: b8 20 80 00 mv r16,r1
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
800adf8: ba 20 08 00 mv r1,r17
800adfc: f8 00 1d 8f calli 8012438 <__umodsi3>
800ae00: b8 20 58 00 mv r11,r1
p = info->triply_indirect;
800ae04: 29 c4 00 60 lw r4,(r14+96)
if ( malloc_it ) {
800ae08: 45 e0 00 30 be r15,r0,800aec8 <IMFS_memfile_get_block_pointer+0x224>
if ( !p ) {
800ae0c: 44 80 00 3e be r4,r0,800af04 <IMFS_memfile_get_block_pointer+0x260>
if ( !p )
return 0;
info->triply_indirect = p;
}
p1 = (block_p *) p[ triply ];
800ae10: b6 10 18 00 add r3,r16,r16
800ae14: b4 63 18 00 add r3,r3,r3
800ae18: b4 83 70 00 add r14,r4,r3
800ae1c: 29 c1 00 00 lw r1,(r14+0)
if ( !p1 ) {
800ae20: 44 20 00 43 be r1,r0,800af2c <IMFS_memfile_get_block_pointer+0x288>
if ( !p1 )
return 0;
p[ triply ] = (block_p) p1;
}
p2 = (block_p *)p1[ doubly ];
800ae24: b5 6b 10 00 add r2,r11,r11
800ae28: b4 42 10 00 add r2,r2,r2
800ae2c: b4 22 58 00 add r11,r1,r2
800ae30: 29 61 00 00 lw r1,(r11+0)
if ( !p2 ) {
800ae34: 44 20 00 39 be r1,r0,800af18 <IMFS_memfile_get_block_pointer+0x274>
p2 = memfile_alloc_block();
if ( !p2 )
return 0;
p1[ doubly ] = (block_p) p2;
}
return (block_p *)&p2[ singly ];
800ae38: b5 8c 68 00 add r13,r12,r12
800ae3c: b5 ad 68 00 add r13,r13,r13
800ae40: b4 2d 68 00 add r13,r1,r13
800ae44: e3 ff ff cc bi 800ad74 <IMFS_memfile_get_block_pointer+0xd0>
return (block_p *)&p1[ singly ];
}
if ( !p )
return 0;
800ae48: 34 0d 00 00 mvi r13,0
}
return (block_p *)&p1[ singly ];
}
if ( !p )
800ae4c: 44 6d ff ca be r3,r13,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
p = (block_p *)p[ doubly ];
800ae50: b4 21 10 00 add r2,r1,r1
800ae54: b4 42 10 00 add r2,r2,r2
800ae58: b4 62 10 00 add r2,r3,r2
800ae5c: 28 41 00 00 lw r1,(r2+0)
if ( !p )
800ae60: 44 20 ff c5 be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
return (block_p *)&p[ singly ];
800ae64: b6 10 80 00 add r16,r16,r16
800ae68: b6 10 80 00 add r16,r16,r16
800ae6c: b4 30 68 00 add r13,r1,r16
800ae70: e3 ff ff c1 bi 800ad74 <IMFS_memfile_get_block_pointer+0xd0>
p = info->indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
800ae74: fb ff ff 7c calli 800ac64 <memfile_alloc_block>
800ae78: b8 20 10 00 mv r2,r1
if ( !p )
return 0;
800ae7c: 34 0d 00 00 mvi r13,0
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
if ( !p )
800ae80: 44 20 ff bd be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
info->indirect = p;
800ae84: 59 c1 00 58 sw (r14+88),r1
800ae88: e3 ff ff 9d bi 800acfc <IMFS_memfile_get_block_pointer+0x58>
p = info->doubly_indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
800ae8c: 5b 81 00 24 sw (sp+36),r1
800ae90: fb ff ff 75 calli 800ac64 <memfile_alloc_block>
800ae94: b8 20 18 00 mv r3,r1
if ( !p )
return 0;
800ae98: 34 0d 00 00 mvi r13,0
p = info->doubly_indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
if ( !p )
800ae9c: 2b 82 00 24 lw r2,(sp+36)
800aea0: 44 20 ff b5 be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
info->doubly_indirect = p;
800aea4: 59 c1 00 5c sw (r14+92),r1
800aea8: e3 ff ff ab bi 800ad54 <IMFS_memfile_get_block_pointer+0xb0>
}
p1 = (block_p *)p[ doubly ];
if ( !p1 ) {
p1 = memfile_alloc_block();
800aeac: 5b 82 00 24 sw (sp+36),r2
800aeb0: fb ff ff 6d calli 800ac64 <memfile_alloc_block>
if ( !p1 )
return 0;
800aeb4: 34 0d 00 00 mvi r13,0
}
p1 = (block_p *)p[ doubly ];
if ( !p1 ) {
p1 = memfile_alloc_block();
if ( !p1 )
800aeb8: 2b 82 00 24 lw r2,(sp+36)
800aebc: 44 20 ff ae be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
p[ doubly ] = (block_p) p1;
800aec0: 58 41 00 00 sw (r2+0),r1
800aec4: e3 ff ff a9 bi 800ad68 <IMFS_memfile_get_block_pointer+0xc4>
p1[ doubly ] = (block_p) p2;
}
return (block_p *)&p2[ singly ];
}
if ( !p )
800aec8: 44 8d ff ab be r4,r13,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
p1 = (block_p *) p[ triply ];
800aecc: b6 10 80 00 add r16,r16,r16
800aed0: b6 10 80 00 add r16,r16,r16
800aed4: b4 90 20 00 add r4,r4,r16
800aed8: 28 81 00 00 lw r1,(r4+0)
if ( !p1 )
800aedc: 44 20 ff a6 be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
p2 = (block_p *)p1[ doubly ];
800aee0: b5 6b 58 00 add r11,r11,r11
800aee4: b5 6b 58 00 add r11,r11,r11
800aee8: b4 2b 08 00 add r1,r1,r11
800aeec: 28 21 00 00 lw r1,(r1+0)
if ( !p2 )
800aef0: 44 20 ff a1 be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
return (block_p *)&p2[ singly ];
800aef4: b5 8c 60 00 add r12,r12,r12
800aef8: b5 8c 60 00 add r12,r12,r12
800aefc: b4 2c 68 00 add r13,r1,r12
800af00: e3 ff ff 9d bi 800ad74 <IMFS_memfile_get_block_pointer+0xd0>
p = info->triply_indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
800af04: fb ff ff 58 calli 800ac64 <memfile_alloc_block>
800af08: b8 20 20 00 mv r4,r1
if ( !p )
800af0c: 44 20 ff 9a be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
info->triply_indirect = p;
800af10: 59 c1 00 60 sw (r14+96),r1
800af14: e3 ff ff bf bi 800ae10 <IMFS_memfile_get_block_pointer+0x16c>
p[ triply ] = (block_p) p1;
}
p2 = (block_p *)p1[ doubly ];
if ( !p2 ) {
p2 = memfile_alloc_block();
800af18: fb ff ff 53 calli 800ac64 <memfile_alloc_block>
if ( !p2 )
return 0;
800af1c: 34 0d 00 00 mvi r13,0
}
p2 = (block_p *)p1[ doubly ];
if ( !p2 ) {
p2 = memfile_alloc_block();
if ( !p2 )
800af20: 44 20 ff 95 be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
p1[ doubly ] = (block_p) p2;
800af24: 59 61 00 00 sw (r11+0),r1
800af28: e3 ff ff c4 bi 800ae38 <IMFS_memfile_get_block_pointer+0x194>
info->triply_indirect = p;
}
p1 = (block_p *) p[ triply ];
if ( !p1 ) {
p1 = memfile_alloc_block();
800af2c: fb ff ff 4e calli 800ac64 <memfile_alloc_block>
if ( !p1 )
return 0;
800af30: 34 0d 00 00 mvi r13,0
}
p1 = (block_p *) p[ triply ];
if ( !p1 ) {
p1 = memfile_alloc_block();
if ( !p1 )
800af34: 44 20 ff 90 be r1,r0,800ad74 <IMFS_memfile_get_block_pointer+0xd0><== NEVER TAKEN
return 0;
p[ triply ] = (block_p) p1;
800af38: 59 c1 00 00 sw (r14+0),r1
800af3c: e3 ff ff ba bi 800ae24 <IMFS_memfile_get_block_pointer+0x180>
0800af40 <IMFS_memfile_read>:
IMFS_jnode_t *the_jnode,
off_t start,
unsigned char *destination,
unsigned int length
)
{
800af40: 37 9c ff cc addi sp,sp,-52
800af44: 5b 8b 00 28 sw (sp+40),r11
800af48: 5b 8c 00 24 sw (sp+36),r12
800af4c: 5b 8d 00 20 sw (sp+32),r13
800af50: 5b 8e 00 1c sw (sp+28),r14
800af54: 5b 8f 00 18 sw (sp+24),r15
800af58: 5b 90 00 14 sw (sp+20),r16
800af5c: 5b 91 00 10 sw (sp+16),r17
800af60: 5b 92 00 0c sw (sp+12),r18
800af64: 5b 93 00 08 sw (sp+8),r19
800af68: 5b 9d 00 04 sw (sp+4),ra
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
800af6c: 28 25 00 4c lw r5,(r1+76)
IMFS_jnode_t *the_jnode,
off_t start,
unsigned char *destination,
unsigned int length
)
{
800af70: b8 20 80 00 mv r16,r1
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
800af74: 34 01 00 06 mvi r1,6
IMFS_jnode_t *the_jnode,
off_t start,
unsigned char *destination,
unsigned int length
)
{
800af78: b8 40 68 00 mv r13,r2
800af7c: b8 60 90 00 mv r18,r3
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
800af80: 44 a1 00 57 be r5,r1,800b0dc <IMFS_memfile_read+0x19c>
/*
* 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 )
800af84: 2a 01 00 50 lw r1,(r16+80)
800af88: 2a 0c 00 54 lw r12,(r16+84)
/*
* If the last byte we are supposed to read is past the end of this
* in memory file, then shorten the length to read.
*/
last_byte = start + length;
800af8c: b4 82 10 00 add r2,r4,r2
if ( last_byte > the_jnode->info.file.size )
800af90: 48 01 00 04 bg r0,r1,800afa0 <IMFS_memfile_read+0x60> <== NEVER TAKEN
800af94: 44 01 00 67 be r0,r1,800b130 <IMFS_memfile_read+0x1f0> <== ALWAYS TAKEN
/*
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
800af98: b8 80 60 00 mv r12,r4 <== NOT EXECUTED
800af9c: e0 00 00 02 bi 800afa4 <IMFS_memfile_read+0x64> <== NOT EXECUTED
* If the last byte we are supposed to read is past the end of this
* in memory file, then shorten the length to read.
*/
last_byte = start + length;
if ( last_byte > the_jnode->info.file.size )
my_length = the_jnode->info.file.size - start;
800afa0: c9 8d 60 00 sub r12,r12,r13
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
800afa4: 78 11 08 01 mvhi r17,0x801
800afa8: 3a 31 46 a8 ori r17,r17,0x46a8
800afac: 2a 2b 00 00 lw r11,(r17+0)
800afb0: b9 a0 08 00 mv r1,r13
unsigned int last_byte;
unsigned int copied;
unsigned int start_offset;
unsigned char *dest;
dest = destination;
800afb4: ba 40 70 00 mv r14,r18
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
800afb8: b9 60 10 00 mv r2,r11
800afbc: f8 00 1c e6 calli 8012354 <__modsi3>
800afc0: b8 20 98 00 mv r19,r1
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
800afc4: b9 60 10 00 mv r2,r11
800afc8: b9 a0 08 00 mv r1,r13
800afcc: f8 00 1c b2 calli 8012294 <__divsi3>
800afd0: b8 20 68 00 mv r13,r1
*/
last_byte = start + length;
if ( last_byte > the_jnode->info.file.size )
my_length = the_jnode->info.file.size - start;
copied = 0;
800afd4: 34 0f 00 00 mvi r15,0
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
800afd8: 46 60 00 13 be r19,r0,800b024 <IMFS_memfile_read+0xe4>
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 );
800afdc: ba 00 08 00 mv r1,r16
800afe0: b9 a0 10 00 mv r2,r13
800afe4: 34 03 00 00 mvi r3,0
800afe8: fb ff ff 2f calli 800aca4 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
800afec: 44 20 00 2f be r1,r0,800b0a8 <IMFS_memfile_read+0x168> <== NEVER TAKEN
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
800aff0: c9 73 58 00 sub r11,r11,r19
800aff4: b9 80 78 00 mv r15,r12
800aff8: 51 6c 00 02 bgeu r11,r12,800b000 <IMFS_memfile_read+0xc0>
800affc: b9 60 78 00 mv r15,r11
if ( to_copy > my_length )
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
memcpy( dest, &(*block_ptr)[ start_offset ], to_copy );
800b000: 28 22 00 00 lw r2,(r1+0)
800b004: b9 e0 18 00 mv r3,r15
800b008: ba 40 08 00 mv r1,r18
800b00c: b4 53 10 00 add r2,r2,r19
800b010: f8 00 0a 23 calli 800d89c <memcpy>
dest += to_copy;
block++;
my_length -= to_copy;
800b014: 2a 2b 00 00 lw r11,(r17+0)
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
memcpy( dest, &(*block_ptr)[ start_offset ], to_copy );
dest += to_copy;
800b018: b6 4f 70 00 add r14,r18,r15
block++;
800b01c: 35 ad 00 01 addi r13,r13,1
my_length -= to_copy;
800b020: c9 8f 60 00 sub r12,r12,r15
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800b024: 55 6c 00 11 bgu r11,r12,800b068 <IMFS_memfile_read+0x128>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
800b028: b9 a0 10 00 mv r2,r13
800b02c: 34 03 00 00 mvi r3,0
800b030: ba 00 08 00 mv r1,r16
800b034: fb ff ff 1c calli 800aca4 <IMFS_memfile_get_block_pointer>
800b038: b8 20 10 00 mv r2,r1
if ( !block_ptr )
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], to_copy );
800b03c: b9 60 18 00 mv r3,r11
800b040: b9 c0 08 00 mv r1,r14
dest += to_copy;
block++;
my_length -= to_copy;
800b044: c9 8b 60 00 sub r12,r12,r11
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
800b048: 44 40 00 18 be r2,r0,800b0a8 <IMFS_memfile_read+0x168> <== NEVER TAKEN
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], to_copy );
800b04c: 28 42 00 00 lw r2,(r2+0)
dest += to_copy;
800b050: b5 cb 70 00 add r14,r14,r11
block++;
800b054: 35 ad 00 01 addi r13,r13,1
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], to_copy );
800b058: f8 00 0a 11 calli 800d89c <memcpy>
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800b05c: 2a 21 00 00 lw r1,(r17+0)
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], to_copy );
dest += to_copy;
block++;
my_length -= to_copy;
copied += to_copy;
800b060: b5 eb 78 00 add r15,r15,r11
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800b064: 51 81 ff f1 bgeu r12,r1,800b028 <IMFS_memfile_read+0xe8>
/*
* Phase 3: possibly the first part of one block
*/
IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK );
if ( my_length ) {
800b068: 45 80 00 0b be r12,r0,800b094 <IMFS_memfile_read+0x154>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
800b06c: ba 00 08 00 mv r1,r16
800b070: b9 a0 10 00 mv r2,r13
800b074: 34 03 00 00 mvi r3,0
800b078: fb ff ff 0b calli 800aca4 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
800b07c: 44 20 00 0b be r1,r0,800b0a8 <IMFS_memfile_read+0x168> <== NEVER TAKEN
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], my_length );
800b080: 28 22 00 00 lw r2,(r1+0)
800b084: b9 80 18 00 mv r3,r12
800b088: b9 c0 08 00 mv r1,r14
800b08c: f8 00 0a 04 calli 800d89c <memcpy>
copied += my_length;
800b090: b5 ec 78 00 add r15,r15,r12
}
IMFS_update_atime( the_jnode );
800b094: 37 81 00 30 addi r1,sp,48
800b098: 34 02 00 00 mvi r2,0
800b09c: fb ff d9 31 calli 8001560 <gettimeofday>
800b0a0: 2b 81 00 30 lw r1,(sp+48)
800b0a4: 5a 01 00 40 sw (r16+64),r1
return copied;
}
800b0a8: b9 e0 08 00 mv r1,r15
800b0ac: 2b 9d 00 04 lw ra,(sp+4)
800b0b0: 2b 8b 00 28 lw r11,(sp+40)
800b0b4: 2b 8c 00 24 lw r12,(sp+36)
800b0b8: 2b 8d 00 20 lw r13,(sp+32)
800b0bc: 2b 8e 00 1c lw r14,(sp+28)
800b0c0: 2b 8f 00 18 lw r15,(sp+24)
800b0c4: 2b 90 00 14 lw r16,(sp+20)
800b0c8: 2b 91 00 10 lw r17,(sp+16)
800b0cc: 2b 92 00 0c lw r18,(sp+12)
800b0d0: 2b 93 00 08 lw r19,(sp+8)
800b0d4: 37 9c 00 34 addi sp,sp,52
800b0d8: c3 a0 00 00 ret
if (the_jnode->type == IMFS_LINEAR_FILE) {
unsigned char *file_ptr;
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
if (my_length > (the_jnode->info.linearfile.size - start))
800b0dc: 2a 0b 00 54 lw r11,(r16+84)
800b0e0: 2a 0c 00 50 lw r12,(r16+80)
800b0e4: b8 40 08 00 mv r1,r2
800b0e8: 34 02 00 1f mvi r2,31
800b0ec: 5b 84 00 2c sw (sp+44),r4
800b0f0: c9 6d 78 00 sub r15,r11,r13
800b0f4: f8 00 1c 0e calli 801212c <__ashrsi3>
800b0f8: f5 eb 10 00 cmpgu r2,r15,r11
800b0fc: c9 81 08 00 sub r1,r12,r1
800b100: c8 22 08 00 sub r1,r1,r2
800b104: 2b 84 00 2c lw r4,(sp+44)
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
unsigned char *file_ptr;
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
800b108: 2a 02 00 58 lw r2,(r16+88)
if (my_length > (the_jnode->info.linearfile.size - start))
800b10c: 48 01 00 04 bg r0,r1,800b11c <IMFS_memfile_read+0x1dc> <== NEVER TAKEN
800b110: 5c 01 00 02 bne r0,r1,800b118 <IMFS_memfile_read+0x1d8> <== NEVER TAKEN
800b114: 54 8f 00 02 bgu r4,r15,800b11c <IMFS_memfile_read+0x1dc> <== ALWAYS TAKEN
/*
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
800b118: b8 80 78 00 mv r15,r4 <== NOT EXECUTED
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
if (my_length > (the_jnode->info.linearfile.size - start))
my_length = the_jnode->info.linearfile.size - start;
memcpy(dest, &file_ptr[start], my_length);
800b11c: b4 4d 10 00 add r2,r2,r13
800b120: b9 e0 18 00 mv r3,r15
800b124: ba 40 08 00 mv r1,r18
800b128: f8 00 09 dd calli 800d89c <memcpy>
800b12c: e3 ff ff da bi 800b094 <IMFS_memfile_read+0x154>
/*
* 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 )
800b130: 54 4c ff 9c bgu r2,r12,800afa0 <IMFS_memfile_read+0x60>
/*
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
800b134: b8 80 60 00 mv r12,r4
800b138: e3 ff ff 9b bi 800afa4 <IMFS_memfile_read+0x64>
0800b268 <IMFS_memfile_remove>:
* is better to stick to simple, easy to understand algorithms.
*/
int IMFS_memfile_remove(
IMFS_jnode_t *the_jnode
)
{
800b268: 37 9c ff dc addi sp,sp,-36
800b26c: 5b 8b 00 24 sw (sp+36),r11
800b270: 5b 8c 00 20 sw (sp+32),r12
800b274: 5b 8d 00 1c sw (sp+28),r13
800b278: 5b 8e 00 18 sw (sp+24),r14
800b27c: 5b 8f 00 14 sw (sp+20),r15
800b280: 5b 90 00 10 sw (sp+16),r16
800b284: 5b 91 00 0c sw (sp+12),r17
800b288: 5b 92 00 08 sw (sp+8),r18
800b28c: 5b 9d 00 04 sw (sp+4),ra
/*
* Eventually this could be set smarter at each call to
* memfile_free_blocks_in_table to greatly speed this up.
*/
to_free = IMFS_MEMFILE_BLOCK_SLOTS;
800b290: 78 0c 08 01 mvhi r12,0x801
800b294: 39 8c 46 a8 ori r12,r12,0x46a8
800b298: 29 8d 00 00 lw r13,(r12+0)
* is better to stick to simple, easy to understand algorithms.
*/
int IMFS_memfile_remove(
IMFS_jnode_t *the_jnode
)
{
800b29c: b8 20 78 00 mv r15,r1
* + doubly indirect
* + triply indirect
*/
info = &the_jnode->info.file;
if ( info->indirect ) {
800b2a0: 28 21 00 58 lw r1,(r1+88)
/*
* Eventually this could be set smarter at each call to
* memfile_free_blocks_in_table to greatly speed this up.
*/
to_free = IMFS_MEMFILE_BLOCK_SLOTS;
800b2a4: 01 ad 00 01 srui r13,r13,1
800b2a8: 01 ad 00 01 srui r13,r13,1
* + doubly indirect
* + triply indirect
*/
info = &the_jnode->info.file;
if ( info->indirect ) {
800b2ac: 44 20 00 04 be r1,r0,800b2bc <IMFS_memfile_remove+0x54>
memfile_free_blocks_in_table( &info->indirect, to_free );
800b2b0: 35 e1 00 58 addi r1,r15,88
800b2b4: b9 a0 10 00 mv r2,r13
800b2b8: fb ff ff ce calli 800b1f0 <memfile_free_blocks_in_table>
}
if ( info->doubly_indirect ) {
800b2bc: 29 e1 00 5c lw r1,(r15+92)
800b2c0: 44 20 00 19 be r1,r0,800b324 <IMFS_memfile_remove+0xbc>
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800b2c4: 29 83 00 00 lw r3,(r12+0)
800b2c8: 34 02 00 00 mvi r2,0
800b2cc: 34 0b 00 00 mvi r11,0
800b2d0: 00 63 00 01 srui r3,r3,1
800b2d4: 00 63 00 01 srui r3,r3,1
800b2d8: 44 60 00 10 be r3,r0,800b318 <IMFS_memfile_remove+0xb0> <== NEVER TAKEN
if ( info->doubly_indirect[i] ) {
800b2dc: b4 42 10 00 add r2,r2,r2
800b2e0: b4 42 10 00 add r2,r2,r2
800b2e4: b4 22 08 00 add r1,r1,r2
800b2e8: 28 23 00 00 lw r3,(r1+0)
if ( info->indirect ) {
memfile_free_blocks_in_table( &info->indirect, to_free );
}
if ( info->doubly_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800b2ec: 35 6b 00 01 addi r11,r11,1
if ( info->doubly_indirect[i] ) {
memfile_free_blocks_in_table(
800b2f0: b9 a0 10 00 mv r2,r13
memfile_free_blocks_in_table( &info->indirect, to_free );
}
if ( info->doubly_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
if ( info->doubly_indirect[i] ) {
800b2f4: 44 60 00 02 be r3,r0,800b2fc <IMFS_memfile_remove+0x94> <== NEVER TAKEN
memfile_free_blocks_in_table(
800b2f8: fb ff ff be calli 800b1f0 <memfile_free_blocks_in_table>
if ( info->indirect ) {
memfile_free_blocks_in_table( &info->indirect, to_free );
}
if ( info->doubly_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800b2fc: 29 81 00 00 lw r1,(r12+0)
800b300: b9 60 10 00 mv r2,r11
800b304: 00 21 00 01 srui r1,r1,1
800b308: 00 21 00 01 srui r1,r1,1
800b30c: 51 61 00 03 bgeu r11,r1,800b318 <IMFS_memfile_remove+0xb0>
800b310: 29 e1 00 5c lw r1,(r15+92)
800b314: e3 ff ff f2 bi 800b2dc <IMFS_memfile_remove+0x74>
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 );
800b318: 35 e1 00 5c addi r1,r15,92
800b31c: b9 a0 10 00 mv r2,r13
800b320: fb ff ff b4 calli 800b1f0 <memfile_free_blocks_in_table>
}
if ( info->triply_indirect ) {
800b324: 29 e1 00 60 lw r1,(r15+96)
800b328: 44 20 00 27 be r1,r0,800b3c4 <IMFS_memfile_remove+0x15c>
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800b32c: 29 82 00 00 lw r2,(r12+0)
800b330: 00 42 00 01 srui r2,r2,1
800b334: 00 43 00 01 srui r3,r2,1
800b338: 44 60 00 20 be r3,r0,800b3b8 <IMFS_memfile_remove+0x150> <== NEVER TAKEN
p = (block_p *) info->triply_indirect[i];
800b33c: 28 2e 00 00 lw r14,(r1+0)
if ( !p ) /* ensure we have a valid pointer */
800b340: 34 10 00 04 mvi r16,4
}
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
800b344: 34 12 00 00 mvi r18,0
if ( !p ) /* ensure we have a valid pointer */
800b348: 34 11 00 00 mvi r17,0
800b34c: 45 c0 00 1b be r14,r0,800b3b8 <IMFS_memfile_remove+0x150> <== NEVER TAKEN
break;
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
800b350: 00 42 00 01 srui r2,r2,1
800b354: 44 40 00 11 be r2,r0,800b398 <IMFS_memfile_remove+0x130> <== NEVER TAKEN
800b358: 34 03 00 00 mvi r3,0
800b35c: 34 0b 00 00 mvi r11,0
if ( p[j] ) {
800b360: b4 63 18 00 add r3,r3,r3
800b364: b4 63 18 00 add r3,r3,r3
800b368: b5 c3 08 00 add r1,r14,r3
800b36c: 28 23 00 00 lw r3,(r1+0)
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
if ( !p ) /* ensure we have a valid pointer */
break;
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
800b370: 35 6b 00 01 addi r11,r11,1
if ( p[j] ) {
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
800b374: b9 a0 10 00 mv r2,r13
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
if ( !p ) /* ensure we have a valid pointer */
break;
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
if ( p[j] ) {
800b378: 44 60 00 02 be r3,r0,800b380 <IMFS_memfile_remove+0x118> <== NEVER TAKEN
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
800b37c: fb ff ff 9d calli 800b1f0 <memfile_free_blocks_in_table>
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
if ( !p ) /* ensure we have a valid pointer */
break;
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
800b380: 29 84 00 00 lw r4,(r12+0)
800b384: b9 60 18 00 mv r3,r11
800b388: 00 84 00 01 srui r4,r4,1
800b38c: 00 84 00 01 srui r4,r4,1
800b390: 54 8b ff f4 bgu r4,r11,800b360 <IMFS_memfile_remove+0xf8>
800b394: 29 e1 00 60 lw r1,(r15+96)
if ( p[j] ) {
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
}
}
memfile_free_blocks_in_table(
800b398: b4 32 08 00 add r1,r1,r18
800b39c: b9 a0 10 00 mv r2,r13
800b3a0: fb ff ff 94 calli 800b1f0 <memfile_free_blocks_in_table>
memfile_free_blocks_in_table( &info->doubly_indirect, to_free );
}
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800b3a4: 29 82 00 00 lw r2,(r12+0)
800b3a8: 36 31 00 01 addi r17,r17,1
800b3ac: 00 42 00 01 srui r2,r2,1
800b3b0: 00 41 00 01 srui r1,r2,1
800b3b4: 54 31 00 10 bgu r1,r17,800b3f4 <IMFS_memfile_remove+0x18c>
}
}
memfile_free_blocks_in_table(
(block_p **)&info->triply_indirect[i], to_free );
}
memfile_free_blocks_in_table(
800b3b8: 35 e1 00 60 addi r1,r15,96
800b3bc: b9 a0 10 00 mv r2,r13
800b3c0: fb ff ff 8c calli 800b1f0 <memfile_free_blocks_in_table>
(block_p **)&info->triply_indirect, to_free );
}
return 0;
}
800b3c4: 34 01 00 00 mvi r1,0
800b3c8: 2b 9d 00 04 lw ra,(sp+4)
800b3cc: 2b 8b 00 24 lw r11,(sp+36)
800b3d0: 2b 8c 00 20 lw r12,(sp+32)
800b3d4: 2b 8d 00 1c lw r13,(sp+28)
800b3d8: 2b 8e 00 18 lw r14,(sp+24)
800b3dc: 2b 8f 00 14 lw r15,(sp+20)
800b3e0: 2b 90 00 10 lw r16,(sp+16)
800b3e4: 2b 91 00 0c lw r17,(sp+12)
800b3e8: 2b 92 00 08 lw r18,(sp+8)
800b3ec: 37 9c 00 24 addi sp,sp,36
800b3f0: c3 a0 00 00 ret
}
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
800b3f4: 29 e1 00 60 lw r1,(r15+96)
800b3f8: 36 04 00 04 addi r4,r16,4
800b3fc: b4 30 18 00 add r3,r1,r16
800b400: 28 6e 00 00 lw r14,(r3+0)
if ( !p ) /* ensure we have a valid pointer */
800b404: 45 c0 ff ed be r14,r0,800b3b8 <IMFS_memfile_remove+0x150> <== NEVER TAKEN
}
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
p = (block_p *) info->triply_indirect[i];
800b408: ba 00 90 00 mv r18,r16
if ( !p ) /* ensure we have a valid pointer */
800b40c: b8 80 80 00 mv r16,r4
800b410: e3 ff ff d0 bi 800b350 <IMFS_memfile_remove+0xe8>
0800b59c <IMFS_memfile_write>:
IMFS_jnode_t *the_jnode,
off_t start,
const unsigned char *source,
unsigned int length
)
{
800b59c: 37 9c ff cc addi sp,sp,-52
800b5a0: 5b 8b 00 2c sw (sp+44),r11
800b5a4: 5b 8c 00 28 sw (sp+40),r12
800b5a8: 5b 8d 00 24 sw (sp+36),r13
800b5ac: 5b 8e 00 20 sw (sp+32),r14
800b5b0: 5b 8f 00 1c sw (sp+28),r15
800b5b4: 5b 90 00 18 sw (sp+24),r16
800b5b8: 5b 91 00 14 sw (sp+20),r17
800b5bc: 5b 92 00 10 sw (sp+16),r18
800b5c0: 5b 93 00 0c sw (sp+12),r19
800b5c4: 5b 94 00 08 sw (sp+8),r20
800b5c8: 5b 9d 00 04 sw (sp+4),ra
800b5cc: b8 20 88 00 mv r17,r1
* If the last byte we are supposed to write is past the end of this
* in memory file, then extend the length.
*/
last_byte = start + my_length;
if ( last_byte > the_jnode->info.file.size ) {
800b5d0: 28 21 00 50 lw r1,(r1+80)
IMFS_jnode_t *the_jnode,
off_t start,
const unsigned char *source,
unsigned int length
)
{
800b5d4: b8 40 60 00 mv r12,r2
800b5d8: b8 80 90 00 mv r18,r4
800b5dc: b8 60 98 00 mv r19,r3
/*
* If the last byte we are supposed to write is past the end of this
* in memory file, then extend the length.
*/
last_byte = start + my_length;
800b5e0: b4 82 10 00 add r2,r4,r2
if ( last_byte > the_jnode->info.file.size ) {
800b5e4: 48 01 00 52 bg r0,r1,800b72c <IMFS_memfile_write+0x190> <== NEVER TAKEN
800b5e8: 44 20 00 59 be r1,r0,800b74c <IMFS_memfile_write+0x1b0> <== ALWAYS TAKEN
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
800b5ec: 78 10 08 01 mvhi r16,0x801
800b5f0: 3a 10 46 a8 ori r16,r16,0x46a8
800b5f4: 2a 0b 00 00 lw r11,(r16+0)
800b5f8: b9 80 08 00 mv r1,r12
unsigned int last_byte;
unsigned int start_offset;
int copied;
const unsigned char *src;
src = source;
800b5fc: ba 60 70 00 mv r14,r19
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
800b600: b9 60 10 00 mv r2,r11
800b604: f8 00 1b 54 calli 8012354 <__modsi3>
800b608: b8 20 a0 00 mv r20,r1
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
800b60c: b9 60 10 00 mv r2,r11
800b610: b9 80 08 00 mv r1,r12
800b614: f8 00 1b 20 calli 8012294 <__divsi3>
800b618: b8 20 68 00 mv r13,r1
if ( start_offset ) {
800b61c: ba 40 60 00 mv r12,r18
status = IMFS_memfile_extend( the_jnode, last_byte );
if ( status )
rtems_set_errno_and_return_minus_one( ENOSPC );
}
copied = 0;
800b620: 34 0f 00 00 mvi r15,0
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
800b624: 5e 80 00 30 bne r20,r0,800b6e4 <IMFS_memfile_write+0x148>
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800b628: 55 6c 00 10 bgu r11,r12,800b668 <IMFS_memfile_write+0xcc>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
800b62c: b9 a0 10 00 mv r2,r13
800b630: 34 03 00 00 mvi r3,0
800b634: ba 20 08 00 mv r1,r17
800b638: fb ff fd 9b calli 800aca4 <IMFS_memfile_get_block_pointer>
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 );
800b63c: b9 c0 10 00 mv r2,r14
800b640: b9 60 18 00 mv r3,r11
src += to_copy;
block++;
my_length -= to_copy;
800b644: c9 8b 60 00 sub r12,r12,r11
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
800b648: 44 20 00 19 be r1,r0,800b6ac <IMFS_memfile_write+0x110> <== NEVER TAKEN
return copied;
#if 0
fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src );
#endif
memcpy( &(*block_ptr)[ 0 ], src, to_copy );
800b64c: 28 21 00 00 lw r1,(r1+0)
src += to_copy;
800b650: b5 cb 70 00 add r14,r14,r11
block++;
800b654: 35 ad 00 01 addi r13,r13,1
if ( !block_ptr )
return copied;
#if 0
fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src );
#endif
memcpy( &(*block_ptr)[ 0 ], src, to_copy );
800b658: f8 00 08 91 calli 800d89c <memcpy>
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800b65c: 2a 01 00 00 lw r1,(r16+0)
* IMFS_memfile_write
*
* This routine writes the specified data buffer into the in memory
* file pointed to by the_jnode. The file is extended as needed.
*/
MEMFILE_STATIC ssize_t IMFS_memfile_write(
800b660: b5 eb 78 00 add r15,r15,r11
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800b664: 51 81 ff f2 bgeu r12,r1,800b62c <IMFS_memfile_write+0x90>
* Phase 3: possibly the first part of one block
*/
IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK );
to_copy = my_length;
if ( my_length ) {
800b668: 45 80 00 0b be r12,r0,800b694 <IMFS_memfile_write+0xf8>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
800b66c: ba 20 08 00 mv r1,r17
800b670: b9 a0 10 00 mv r2,r13
800b674: 34 03 00 00 mvi r3,0
800b678: fb ff fd 8b calli 800aca4 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
800b67c: 44 20 00 0c be r1,r0,800b6ac <IMFS_memfile_write+0x110> <== NEVER TAKEN
return copied;
#if 0
fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src );
#endif
memcpy( &(*block_ptr)[ 0 ], src, my_length );
800b680: 28 21 00 00 lw r1,(r1+0)
800b684: b9 c0 10 00 mv r2,r14
800b688: b9 80 18 00 mv r3,r12
800b68c: f8 00 08 84 calli 800d89c <memcpy>
my_length = 0;
copied += to_copy;
800b690: b5 ec 78 00 add r15,r15,r12
}
IMFS_mtime_ctime_update( the_jnode );
800b694: 37 81 00 30 addi r1,sp,48
800b698: 34 02 00 00 mvi r2,0
800b69c: fb ff d7 b1 calli 8001560 <gettimeofday>
800b6a0: 2b 81 00 30 lw r1,(sp+48)
800b6a4: 5a 21 00 44 sw (r17+68),r1
800b6a8: 5a 21 00 48 sw (r17+72),r1
return copied;
}
800b6ac: b9 e0 08 00 mv r1,r15
800b6b0: 2b 9d 00 04 lw ra,(sp+4)
800b6b4: 2b 8b 00 2c lw r11,(sp+44)
800b6b8: 2b 8c 00 28 lw r12,(sp+40)
800b6bc: 2b 8d 00 24 lw r13,(sp+36)
800b6c0: 2b 8e 00 20 lw r14,(sp+32)
800b6c4: 2b 8f 00 1c lw r15,(sp+28)
800b6c8: 2b 90 00 18 lw r16,(sp+24)
800b6cc: 2b 91 00 14 lw r17,(sp+20)
800b6d0: 2b 92 00 10 lw r18,(sp+16)
800b6d4: 2b 93 00 0c lw r19,(sp+12)
800b6d8: 2b 94 00 08 lw r20,(sp+8)
800b6dc: 37 9c 00 34 addi sp,sp,52
800b6e0: c3 a0 00 00 ret
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
if ( to_copy > my_length )
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
800b6e4: ba 20 08 00 mv r1,r17
800b6e8: b9 a0 10 00 mv r2,r13
800b6ec: 34 03 00 00 mvi r3,0
800b6f0: fb ff fd 6d calli 800aca4 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
800b6f4: 44 20 ff ee be r1,r0,800b6ac <IMFS_memfile_write+0x110> <== NEVER TAKEN
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset;
800b6f8: c9 74 78 00 sub r15,r11,r20
800b6fc: 52 4f 00 02 bgeu r18,r15,800b704 <IMFS_memfile_write+0x168>
800b700: ba 40 78 00 mv r15,r18
block,
to_copy,
src
);
#endif
memcpy( &(*block_ptr)[ start_offset ], src, to_copy );
800b704: 28 21 00 00 lw r1,(r1+0)
800b708: ba 60 10 00 mv r2,r19
800b70c: b9 e0 18 00 mv r3,r15
800b710: b4 34 08 00 add r1,r1,r20
800b714: f8 00 08 62 calli 800d89c <memcpy>
src += to_copy;
800b718: b6 6f 70 00 add r14,r19,r15
block++;
my_length -= to_copy;
copied += to_copy;
800b71c: 2a 0b 00 00 lw r11,(r16+0)
src
);
#endif
memcpy( &(*block_ptr)[ start_offset ], src, to_copy );
src += to_copy;
block++;
800b720: 35 ad 00 01 addi r13,r13,1
my_length -= to_copy;
800b724: ca 4f 60 00 sub r12,r18,r15
800b728: e3 ff ff c0 bi 800b628 <IMFS_memfile_write+0x8c>
* in memory file, then extend the length.
*/
last_byte = start + my_length;
if ( last_byte > the_jnode->info.file.size ) {
status = IMFS_memfile_extend( the_jnode, last_byte );
800b72c: ba 20 08 00 mv r1,r17
800b730: fb ff ff 45 calli 800b444 <IMFS_memfile_extend>
if ( status )
800b734: 44 20 ff ae be r1,r0,800b5ec <IMFS_memfile_write+0x50>
rtems_set_errno_and_return_minus_one( ENOSPC );
800b738: f8 00 05 a3 calli 800cdc4 <__errno>
800b73c: 34 02 00 1c mvi r2,28
800b740: 58 22 00 00 sw (r1+0),r2
800b744: 34 0f ff ff mvi r15,-1
800b748: e3 ff ff d9 bi 800b6ac <IMFS_memfile_write+0x110>
* If the last byte we are supposed to write is past the end of this
* in memory file, then extend the length.
*/
last_byte = start + my_length;
if ( last_byte > the_jnode->info.file.size ) {
800b74c: 2a 21 00 54 lw r1,(r17+84)
800b750: 54 41 ff f7 bgu r2,r1,800b72c <IMFS_memfile_write+0x190> <== ALWAYS TAKEN
800b754: e3 ff ff a6 bi 800b5ec <IMFS_memfile_write+0x50> <== NOT EXECUTED
08000c80 <IMFS_mount>:
#include <rtems/seterr.h>
int IMFS_mount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
8000c80: 37 9c ff fc addi sp,sp,-4
8000c84: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *node;
node = mt_entry->mt_point_node.node_access;
8000c88: 28 22 00 08 lw r2,(r1+8)
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
8000c8c: 34 03 00 01 mvi r3,1
8000c90: 28 44 00 4c lw r4,(r2+76)
8000c94: 5c 83 00 06 bne r4,r3,8000cac <IMFS_mount+0x2c> <== NEVER TAKEN
/*
* Set mt_fs pointer to point to the mount table entry for
* the mounted file system.
*/
node->info.directory.mt_fs = mt_entry;
8000c98: 58 41 00 5c sw (r2+92),r1
return 0;
8000c9c: 34 01 00 00 mvi r1,0
}
8000ca0: 2b 9d 00 04 lw ra,(sp+4)
8000ca4: 37 9c 00 04 addi sp,sp,4
8000ca8: c3 a0 00 00 ret
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
8000cac: f8 00 30 46 calli 800cdc4 <__errno> <== NOT EXECUTED
8000cb0: 34 02 00 14 mvi r2,20 <== NOT EXECUTED
8000cb4: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8000cb8: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8000cbc: e3 ff ff f9 bi 8000ca0 <IMFS_mount+0x20> <== NOT EXECUTED
080037ac <IMFS_print_jnode>:
* This routine prints the contents of the specified jnode.
*/
void IMFS_print_jnode(
IMFS_jnode_t *the_jnode
)
{
80037ac: 37 9c ff f4 addi sp,sp,-12
80037b0: 5b 8b 00 0c sw (sp+12),r11
80037b4: 5b 8c 00 08 sw (sp+8),r12
80037b8: 5b 9d 00 04 sw (sp+4),ra
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
80037bc: 78 0b 08 02 mvhi r11,0x802
80037c0: 39 6b 81 c0 ori r11,r11,0x81c0
80037c4: 29 62 00 00 lw r2,(r11+0)
* This routine prints the contents of the specified jnode.
*/
void IMFS_print_jnode(
IMFS_jnode_t *the_jnode
)
{
80037c8: b8 20 60 00 mv r12,r1
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
80037cc: 34 21 00 0c addi r1,r1,12
80037d0: 28 42 00 08 lw r2,(r2+8)
80037d4: f8 00 3a 51 calli 8012118 <fputs>
switch( the_jnode->type ) {
80037d8: 29 83 00 4c lw r3,(r12+76)
80037dc: 34 01 00 07 mvi r1,7
80037e0: 54 61 00 36 bgu r3,r1,80038b8 <IMFS_print_jnode+0x10c> <== NEVER TAKEN
80037e4: 78 02 08 02 mvhi r2,0x802
80037e8: b4 63 08 00 add r1,r3,r3
80037ec: 38 42 57 6c ori r2,r2,0x576c
80037f0: b4 21 08 00 add r1,r1,r1
80037f4: b4 41 08 00 add r1,r2,r1
80037f8: 28 21 00 00 lw r1,(r1+0)
80037fc: c0 20 00 00 b r1
case IMFS_HARD_LINK:
fprintf(stdout, " links not printed\n" );
return;
case IMFS_SYM_LINK:
fprintf(stdout, " links not printed\n" );
8003800: 29 62 00 00 lw r2,(r11+0)
8003804: 78 01 08 02 mvhi r1,0x802
8003808: 34 03 00 13 mvi r3,19
800380c: 28 44 00 08 lw r4,(r2+8)
8003810: 38 21 56 b8 ori r1,r1,0x56b8
8003814: 34 02 00 01 mvi r2,1
8003818: f8 00 3d 68 calli 8012db8 <fwrite>
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
}
800381c: 2b 9d 00 04 lw ra,(sp+4)
8003820: 2b 8b 00 0c lw r11,(sp+12)
8003824: 2b 8c 00 08 lw r12,(sp+8)
8003828: 37 9c 00 0c addi sp,sp,12
800382c: c3 a0 00 00 ret
case IMFS_SYM_LINK:
fprintf(stdout, " links not printed\n" );
return;
case IMFS_FIFO:
fprintf(stdout, " FIFO not printed\n" );
8003830: 29 62 00 00 lw r2,(r11+0)
8003834: 78 01 08 02 mvhi r1,0x802
8003838: 34 03 00 12 mvi r3,18
800383c: 28 44 00 08 lw r4,(r2+8)
8003840: 38 21 56 cc ori r1,r1,0x56cc
8003844: 34 02 00 01 mvi r2,1
8003848: f8 00 3d 5c calli 8012db8 <fwrite>
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
}
800384c: 2b 9d 00 04 lw ra,(sp+4)
8003850: 2b 8b 00 0c lw r11,(sp+12)
8003854: 2b 8c 00 08 lw r12,(sp+8)
8003858: 37 9c 00 0c addi sp,sp,12
800385c: c3 a0 00 00 ret
the_jnode->info.file.indirect,
the_jnode->info.file.doubly_indirect,
the_jnode->info.file.triply_indirect
);
#else
fprintf(stdout, " (file %" PRId32 ")",
8003860: 29 61 00 00 lw r1,(r11+0)
8003864: 29 83 00 54 lw r3,(r12+84)
8003868: 78 02 08 02 mvhi r2,0x802
800386c: 28 21 00 08 lw r1,(r1+8)
8003870: 38 42 56 ac ori r2,r2,0x56ac
8003874: f8 00 39 be calli 8011f6c <fprintf>
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
return;
}
puts("");
8003878: 78 01 08 02 mvhi r1,0x802
800387c: 38 21 52 50 ori r1,r1,0x5250
8003880: f8 00 41 e9 calli 8014024 <puts>
}
8003884: 2b 9d 00 04 lw ra,(sp+4)
8003888: 2b 8b 00 0c lw r11,(sp+12)
800388c: 2b 8c 00 08 lw r12,(sp+8)
8003890: 37 9c 00 0c addi sp,sp,12
8003894: c3 a0 00 00 ret
fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")",
the_jnode->info.device.major, the_jnode->info.device.minor );
break;
case IMFS_LINEAR_FILE:
fprintf(stdout, " (file %" PRId32 " %p)",
8003898: 29 61 00 00 lw r1,(r11+0)
800389c: 29 83 00 54 lw r3,(r12+84)
80038a0: 29 84 00 58 lw r4,(r12+88)
80038a4: 28 21 00 08 lw r1,(r1+8)
80038a8: 78 02 08 02 mvhi r2,0x802
80038ac: 38 42 56 9c ori r2,r2,0x569c
80038b0: f8 00 39 af calli 8011f6c <fprintf>
(uint32_t)the_jnode->info.linearfile.size,
the_jnode->info.linearfile.direct
);
break;
80038b4: e3 ff ff f1 bi 8003878 <IMFS_print_jnode+0xcc>
case IMFS_FIFO:
fprintf(stdout, " FIFO not printed\n" );
return;
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
80038b8: 29 61 00 00 lw r1,(r11+0) <== NOT EXECUTED
80038bc: 78 02 08 02 mvhi r2,0x802 <== NOT EXECUTED
80038c0: 38 42 56 e0 ori r2,r2,0x56e0 <== NOT EXECUTED
80038c4: 28 21 00 08 lw r1,(r1+8) <== NOT EXECUTED
80038c8: f8 00 39 a9 calli 8011f6c <fprintf> <== NOT EXECUTED
return;
}
puts("");
}
80038cc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80038d0: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
80038d4: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
80038d8: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
80038dc: c3 a0 00 00 ret <== NOT EXECUTED
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
switch( the_jnode->type ) {
case IMFS_DIRECTORY:
fprintf(stdout, "/" );
80038e0: 29 62 00 00 lw r2,(r11+0)
80038e4: 34 01 00 2f mvi r1,47
80038e8: 28 42 00 08 lw r2,(r2+8)
80038ec: f8 00 39 c7 calli 8012008 <fputc>
break;
80038f0: e3 ff ff e2 bi 8003878 <IMFS_print_jnode+0xcc>
case IMFS_DEVICE:
fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")",
80038f4: 29 61 00 00 lw r1,(r11+0)
80038f8: 29 83 00 50 lw r3,(r12+80)
80038fc: 29 84 00 54 lw r4,(r12+84)
8003900: 28 21 00 08 lw r1,(r1+8)
8003904: 78 02 08 02 mvhi r2,0x802
8003908: 38 42 56 88 ori r2,r2,0x5688
800390c: f8 00 39 98 calli 8011f6c <fprintf>
the_jnode->info.device.major, the_jnode->info.device.minor );
break;
8003910: e3 ff ff da bi 8003878 <IMFS_print_jnode+0xcc>
08000ccc <IMFS_readlink>:
)
{
IMFS_jnode_t *node;
int i;
node = loc->node_access;
8000ccc: 28 25 00 00 lw r5,(r1+0)
IMFS_assert( node->type == IMFS_SYM_LINK );
for( i=0; ((i<bufsize) && (node->info.sym_link.name[i] != '\0')); i++ )
8000cd0: 34 01 00 00 mvi r1,0
8000cd4: 44 60 00 0e be r3,r0,8000d0c <IMFS_readlink+0x40> <== NEVER TAKEN
8000cd8: 28 a4 00 50 lw r4,(r5+80)
8000cdc: 40 84 00 00 lbu r4,(r4+0)
8000ce0: 44 80 00 0b be r4,r0,8000d0c <IMFS_readlink+0x40> <== NEVER TAKEN
8000ce4: 34 06 00 00 mvi r6,0
buf[i] = node->info.sym_link.name[i];
8000ce8: b4 46 30 00 add r6,r2,r6
8000cec: 30 c4 00 00 sb (r6+0),r4
node = loc->node_access;
IMFS_assert( node->type == IMFS_SYM_LINK );
for( i=0; ((i<bufsize) && (node->info.sym_link.name[i] != '\0')); i++ )
8000cf0: 34 21 00 01 addi r1,r1,1
8000cf4: b8 20 30 00 mv r6,r1
8000cf8: 50 23 00 05 bgeu r1,r3,8000d0c <IMFS_readlink+0x40>
8000cfc: 28 a4 00 50 lw r4,(r5+80)
8000d00: b4 81 20 00 add r4,r4,r1
8000d04: 40 84 00 00 lbu r4,(r4+0)
8000d08: 5c 80 ff f8 bne r4,r0,8000ce8 <IMFS_readlink+0x1c>
buf[i] = node->info.sym_link.name[i];
return i;
}
8000d0c: c3 a0 00 00 ret
08000d10 <IMFS_rename>:
rtems_filesystem_location_info_t *old_parent_loc, /* IN */
rtems_filesystem_location_info_t *old_loc, /* IN */
rtems_filesystem_location_info_t *new_parent_loc, /* IN */
const char *new_name /* IN */
)
{
8000d10: 37 9c ff ec addi sp,sp,-20
8000d14: 5b 8b 00 0c sw (sp+12),r11
8000d18: 5b 8c 00 08 sw (sp+8),r12
8000d1c: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *the_jnode;
IMFS_jnode_t *new_parent;
the_jnode = old_loc->node_access;
8000d20: 28 4b 00 00 lw r11,(r2+0)
rtems_filesystem_location_info_t *old_parent_loc, /* IN */
rtems_filesystem_location_info_t *old_loc, /* IN */
rtems_filesystem_location_info_t *new_parent_loc, /* IN */
const char *new_name /* IN */
)
{
8000d24: b8 60 60 00 mv r12,r3
IMFS_jnode_t *the_jnode;
IMFS_jnode_t *new_parent;
the_jnode = old_loc->node_access;
strncpy( the_jnode->name, new_name, IMFS_NAME_MAX );
8000d28: b8 80 10 00 mv r2,r4
8000d2c: 35 61 00 0c addi r1,r11,12
8000d30: 34 03 00 20 mvi r3,32
8000d34: f8 00 34 f4 calli 800e104 <strncpy>
if ( the_jnode->Parent != NULL )
8000d38: 29 61 00 08 lw r1,(r11+8)
8000d3c: 44 20 00 03 be r1,r0,8000d48 <IMFS_rename+0x38> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8000d40: b9 60 08 00 mv r1,r11
8000d44: f8 00 0a e7 calli 80038e0 <_Chain_Extract>
rtems_chain_extract( (rtems_chain_node *) the_jnode );
new_parent = new_parent_loc->node_access;
8000d48: 29 83 00 00 lw r3,(r12+0)
RTEMS_INLINE_ROUTINE void rtems_chain_append(
rtems_chain_control *the_chain,
rtems_chain_node *the_node
)
{
_Chain_Append( the_chain, the_node );
8000d4c: b9 60 10 00 mv r2,r11
8000d50: 34 61 00 50 addi r1,r3,80
the_jnode->Parent = new_parent;
8000d54: 59 63 00 08 sw (r11+8),r3
8000d58: f8 00 0a d6 calli 80038b0 <_Chain_Append>
rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node );
/*
* Update the time.
*/
IMFS_update_ctime( the_jnode );
8000d5c: 37 81 00 10 addi r1,sp,16
8000d60: 34 02 00 00 mvi r2,0
8000d64: f8 00 01 ff calli 8001560 <gettimeofday>
8000d68: 2b 82 00 10 lw r2,(sp+16)
return 0;
}
8000d6c: 34 01 00 00 mvi r1,0
rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node );
/*
* Update the time.
*/
IMFS_update_ctime( the_jnode );
8000d70: 59 62 00 48 sw (r11+72),r2
return 0;
}
8000d74: 2b 9d 00 04 lw ra,(sp+4)
8000d78: 2b 8b 00 0c lw r11,(sp+12)
8000d7c: 2b 8c 00 08 lw r12,(sp+8)
8000d80: 37 9c 00 14 addi sp,sp,20
8000d84: c3 a0 00 00 ret
08008370 <IMFS_stat>:
int IMFS_stat(
rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
8008370: 37 9c ff f8 addi sp,sp,-8
8008374: 5b 8b 00 08 sw (sp+8),r11
8008378: 5b 9d 00 04 sw (sp+4),ra
IMFS_fs_info_t *fs_info;
IMFS_jnode_t *the_jnode;
IMFS_device_t *io;
the_jnode = loc->node_access;
800837c: 28 23 00 00 lw r3,(r1+0)
switch ( the_jnode->type ) {
8008380: 34 05 00 07 mvi r5,7
8008384: 28 64 00 4c lw r4,(r3+76)
8008388: 54 85 00 29 bgu r4,r5,800842c <IMFS_stat+0xbc> <== NEVER TAKEN
800838c: 78 05 08 01 mvhi r5,0x801
8008390: b4 84 20 00 add r4,r4,r4
8008394: 38 a5 37 a8 ori r5,r5,0x37a8
8008398: b4 84 20 00 add r4,r4,r4
800839c: b4 a4 20 00 add r4,r5,r4
80083a0: 28 84 00 00 lw r4,(r4+0)
80083a4: c0 80 00 00 b r4
case IMFS_SYM_LINK:
buf->st_size = 0;
break;
case IMFS_FIFO:
buf->st_size = 0;
80083a8: 58 40 00 20 sw (r2+32),r0
/*
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
80083ac: 28 21 00 10 lw r1,(r1+16)
buf->st_dev =
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
buf->st_mode = the_jnode->st_mode;
80083b0: 28 6a 00 30 lw r10,(r3+48)
buf->st_nlink = the_jnode->st_nlink;
80083b4: 2c 69 00 34 lhu r9,(r3+52)
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
buf->st_dev =
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
80083b8: 28 21 00 34 lw r1,(r1+52)
buf->st_mode = the_jnode->st_mode;
buf->st_nlink = the_jnode->st_nlink;
buf->st_ino = the_jnode->st_ino;
80083bc: 28 68 00 38 lw r8,(r3+56)
buf->st_uid = the_jnode->st_uid;
80083c0: 2c 67 00 3c lhu r7,(r3+60)
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
buf->st_dev =
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
80083c4: 28 2b 00 00 lw r11,(r1+0)
buf->st_mode = the_jnode->st_mode;
buf->st_nlink = the_jnode->st_nlink;
buf->st_ino = the_jnode->st_ino;
buf->st_uid = the_jnode->st_uid;
buf->st_gid = the_jnode->st_gid;
80083c8: 2c 66 00 3e lhu r6,(r3+62)
buf->st_atime = the_jnode->stat_atime;
80083cc: 28 65 00 40 lw r5,(r3+64)
buf->st_mtime = the_jnode->stat_mtime;
80083d0: 28 64 00 44 lw r4,(r3+68)
buf->st_ctime = the_jnode->stat_ctime;
80083d4: 28 63 00 48 lw r3,(r3+72)
rtems_device_minor_number _minor
)
{
union __rtems_dev_t temp;
temp.__overlay.major = _major;
80083d8: 38 01 ff fe mvu r1,0xfffe
/*
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
buf->st_dev =
80083dc: 58 41 00 00 sw (r2+0),r1
buf->st_atime = the_jnode->stat_atime;
buf->st_mtime = the_jnode->stat_mtime;
buf->st_ctime = the_jnode->stat_ctime;
return 0;
80083e0: 34 01 00 00 mvi r1,0
/*
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
buf->st_dev =
80083e4: 58 4b 00 04 sw (r2+4),r11
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
buf->st_mode = the_jnode->st_mode;
80083e8: 58 4a 00 0c sw (r2+12),r10
buf->st_nlink = the_jnode->st_nlink;
80083ec: 0c 49 00 10 sh (r2+16),r9
buf->st_ino = the_jnode->st_ino;
80083f0: 58 48 00 08 sw (r2+8),r8
buf->st_uid = the_jnode->st_uid;
80083f4: 0c 47 00 12 sh (r2+18),r7
buf->st_gid = the_jnode->st_gid;
80083f8: 0c 46 00 14 sh (r2+20),r6
buf->st_atime = the_jnode->stat_atime;
80083fc: 58 45 00 24 sw (r2+36),r5
buf->st_mtime = the_jnode->stat_mtime;
8008400: 58 44 00 2c sw (r2+44),r4
buf->st_ctime = the_jnode->stat_ctime;
8008404: 58 43 00 34 sw (r2+52),r3
return 0;
}
8008408: 2b 9d 00 04 lw ra,(sp+4)
800840c: 2b 8b 00 08 lw r11,(sp+8)
8008410: 37 9c 00 08 addi sp,sp,8
8008414: c3 a0 00 00 ret
switch ( the_jnode->type ) {
case IMFS_DEVICE:
io = &the_jnode->info.device;
buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor );
8008418: 28 65 00 54 lw r5,(r3+84)
800841c: 28 64 00 50 lw r4,(r3+80)
8008420: 58 45 00 1c sw (r2+28),r5
8008424: 58 44 00 18 sw (r2+24),r4
break;
8008428: e3 ff ff e1 bi 80083ac <IMFS_stat+0x3c>
case IMFS_FIFO:
buf->st_size = 0;
break;
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
800842c: f8 00 12 66 calli 800cdc4 <__errno>
8008430: 34 02 00 86 mvi r2,134
8008434: 58 22 00 00 sw (r1+0),r2
8008438: 34 01 ff ff mvi r1,-1
buf->st_atime = the_jnode->stat_atime;
buf->st_mtime = the_jnode->stat_mtime;
buf->st_ctime = the_jnode->stat_ctime;
return 0;
}
800843c: 2b 9d 00 04 lw ra,(sp+4)
8008440: 2b 8b 00 08 lw r11,(sp+8)
8008444: 37 9c 00 08 addi sp,sp,8
8008448: c3 a0 00 00 ret
buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor );
break;
case IMFS_LINEAR_FILE:
case IMFS_MEMORY_FILE:
buf->st_size = the_jnode->info.file.size;
800844c: 28 64 00 54 lw r4,(r3+84)
8008450: 58 44 00 20 sw (r2+32),r4
break;
8008454: e3 ff ff d6 bi 80083ac <IMFS_stat+0x3c>
08000e38 <IMFS_unlink>:
int IMFS_unlink(
rtems_filesystem_location_info_t *parentloc, /* IN */
rtems_filesystem_location_info_t *loc /* IN */
)
{
8000e38: 37 9c ff d0 addi sp,sp,-48
8000e3c: 5b 8b 00 14 sw (sp+20),r11
8000e40: 5b 8c 00 10 sw (sp+16),r12
8000e44: 5b 8d 00 0c sw (sp+12),r13
8000e48: 5b 8e 00 08 sw (sp+8),r14
8000e4c: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *node;
rtems_filesystem_location_info_t the_link;
int result = 0;
node = loc->node_access;
8000e50: 28 4c 00 00 lw r12,(r2+0)
int IMFS_unlink(
rtems_filesystem_location_info_t *parentloc, /* IN */
rtems_filesystem_location_info_t *loc /* IN */
)
{
8000e54: b8 40 58 00 mv r11,r2
8000e58: b8 20 68 00 mv r13,r1
/*
* If this is the last last pointer to the node
* free the node.
*/
if ( node->type == IMFS_HARD_LINK ) {
8000e5c: 29 82 00 4c lw r2,(r12+76)
8000e60: 34 01 00 03 mvi r1,3
8000e64: 44 41 00 0f be r2,r1,8000ea0 <IMFS_unlink+0x68>
/*
* Now actually free the node we were asked to free.
*/
result = (*loc->handlers->rmnod_h)( parentloc, loc );
8000e68: 29 63 00 08 lw r3,(r11+8)
8000e6c: b9 60 10 00 mv r2,r11
8000e70: b9 a0 08 00 mv r1,r13
8000e74: 28 63 00 34 lw r3,(r3+52)
8000e78: d8 60 00 00 call r3
8000e7c: b8 20 10 00 mv r2,r1
return result;
}
8000e80: b8 40 08 00 mv r1,r2
8000e84: 2b 9d 00 04 lw ra,(sp+4)
8000e88: 2b 8b 00 14 lw r11,(sp+20)
8000e8c: 2b 8c 00 10 lw r12,(sp+16)
8000e90: 2b 8d 00 0c lw r13,(sp+12)
8000e94: 2b 8e 00 08 lw r14,(sp+8)
8000e98: 37 9c 00 30 addi sp,sp,48
8000e9c: c3 a0 00 00 ret
* free the node.
*/
if ( node->type == IMFS_HARD_LINK ) {
if ( !node->info.hard_link.link_node )
8000ea0: 29 83 00 50 lw r3,(r12+80)
8000ea4: 44 60 00 22 be r3,r0,8000f2c <IMFS_unlink+0xf4> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
the_link = *loc;
8000ea8: 29 64 00 0c lw r4,(r11+12)
8000eac: 29 66 00 04 lw r6,(r11+4)
8000eb0: 29 65 00 08 lw r5,(r11+8)
8000eb4: 29 62 00 10 lw r2,(r11+16)
the_link.node_access = node->info.hard_link.link_node;
IMFS_Set_handlers( &the_link );
8000eb8: 37 8e 00 18 addi r14,sp,24
8000ebc: b9 c0 08 00 mv r1,r14
if ( node->type == IMFS_HARD_LINK ) {
if ( !node->info.hard_link.link_node )
rtems_set_errno_and_return_minus_one( EINVAL );
the_link = *loc;
8000ec0: 5b 84 00 24 sw (sp+36),r4
the_link.node_access = node->info.hard_link.link_node;
8000ec4: 5b 83 00 18 sw (sp+24),r3
if ( node->type == IMFS_HARD_LINK ) {
if ( !node->info.hard_link.link_node )
rtems_set_errno_and_return_minus_one( EINVAL );
the_link = *loc;
8000ec8: 5b 86 00 1c sw (sp+28),r6
8000ecc: 5b 85 00 20 sw (sp+32),r5
8000ed0: 5b 82 00 28 sw (sp+40),r2
the_link.node_access = node->info.hard_link.link_node;
IMFS_Set_handlers( &the_link );
8000ed4: f8 00 19 f2 calli 800769c <IMFS_Set_handlers>
/*
* If removing the last hard link to a node, then we need
* to remove the node that is a link and the node itself.
*/
if ( node->info.hard_link.link_node->st_nlink == 1)
8000ed8: 29 83 00 50 lw r3,(r12+80)
8000edc: 34 01 00 01 mvi r1,1
8000ee0: 2c 64 00 34 lhu r4,(r3+52)
8000ee4: 44 81 00 0a be r4,r1,8000f0c <IMFS_unlink+0xd4>
if ( result != 0 )
return -1;
}
else
{
node->info.hard_link.link_node->st_nlink --;
8000ee8: 34 84 ff ff addi r4,r4,-1
IMFS_update_ctime( node->info.hard_link.link_node );
8000eec: 34 02 00 00 mvi r2,0
if ( result != 0 )
return -1;
}
else
{
node->info.hard_link.link_node->st_nlink --;
8000ef0: 0c 64 00 34 sh (r3+52),r4
IMFS_update_ctime( node->info.hard_link.link_node );
8000ef4: 37 81 00 2c addi r1,sp,44
8000ef8: f8 00 01 9a calli 8001560 <gettimeofday>
8000efc: 29 81 00 50 lw r1,(r12+80)
8000f00: 2b 82 00 2c lw r2,(sp+44)
8000f04: 58 22 00 48 sw (r1+72),r2
8000f08: e3 ff ff d8 bi 8000e68 <IMFS_unlink+0x30>
* to remove the node that is a link and the node itself.
*/
if ( node->info.hard_link.link_node->st_nlink == 1)
{
result = (*the_link.handlers->rmnod_h)( parentloc, &the_link );
8000f0c: 2b 83 00 20 lw r3,(sp+32)
8000f10: b9 c0 10 00 mv r2,r14
8000f14: b9 a0 08 00 mv r1,r13
8000f18: 28 63 00 34 lw r3,(r3+52)
8000f1c: d8 60 00 00 call r3
if ( result != 0 )
return -1;
8000f20: 34 02 ff ff mvi r2,-1
*/
if ( node->info.hard_link.link_node->st_nlink == 1)
{
result = (*the_link.handlers->rmnod_h)( parentloc, &the_link );
if ( result != 0 )
8000f24: 44 20 ff d1 be r1,r0,8000e68 <IMFS_unlink+0x30>
8000f28: e3 ff ff d6 bi 8000e80 <IMFS_unlink+0x48>
*/
if ( node->type == IMFS_HARD_LINK ) {
if ( !node->info.hard_link.link_node )
rtems_set_errno_and_return_minus_one( EINVAL );
8000f2c: f8 00 2f a6 calli 800cdc4 <__errno> <== NOT EXECUTED
8000f30: 34 02 00 16 mvi r2,22 <== NOT EXECUTED
8000f34: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8000f38: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
8000f3c: e3 ff ff d1 bi 8000e80 <IMFS_unlink+0x48> <== NOT EXECUTED
08000f40 <IMFS_unmount>:
#include <rtems/seterr.h>
int IMFS_unmount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
8000f40: 37 9c ff fc addi sp,sp,-4
8000f44: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *node;
node = mt_entry->mt_point_node.node_access;
8000f48: 28 21 00 08 lw r1,(r1+8)
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
8000f4c: 34 02 00 01 mvi r2,1
8000f50: 28 23 00 4c lw r3,(r1+76)
8000f54: 5c 62 00 08 bne r3,r2,8000f74 <IMFS_unmount+0x34> <== NEVER TAKEN
/*
* Did the node indicate that there was a directory mounted here?
*/
if ( node->info.directory.mt_fs == NULL )
8000f58: 28 22 00 5c lw r2,(r1+92)
8000f5c: 44 40 00 0b be r2,r0,8000f88 <IMFS_unmount+0x48> <== NEVER TAKEN
/*
* Set the mt_fs pointer to indicate that there is no longer
* a file system mounted to this point.
*/
node->info.directory.mt_fs = NULL;
8000f60: 58 20 00 5c sw (r1+92),r0
return 0;
8000f64: 34 01 00 00 mvi r1,0
}
8000f68: 2b 9d 00 04 lw ra,(sp+4)
8000f6c: 37 9c 00 04 addi sp,sp,4
8000f70: c3 a0 00 00 ret
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
8000f74: f8 00 2f 94 calli 800cdc4 <__errno> <== NOT EXECUTED
8000f78: 34 02 00 14 mvi r2,20 <== NOT EXECUTED
8000f7c: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8000f80: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8000f84: e3 ff ff f9 bi 8000f68 <IMFS_unmount+0x28> <== NOT EXECUTED
/*
* Did the node indicate that there was a directory mounted here?
*/
if ( node->info.directory.mt_fs == NULL )
rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */
8000f88: f8 00 2f 8f calli 800cdc4 <__errno> <== NOT EXECUTED
8000f8c: 34 02 00 16 mvi r2,22 <== NOT EXECUTED
8000f90: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8000f94: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8000f98: e3 ff ff f4 bi 8000f68 <IMFS_unmount+0x28> <== NOT EXECUTED
0800179c <RTEMS_Malloc_Initialize>:
void RTEMS_Malloc_Initialize(
void *heap_begin,
uintptr_t heap_size,
size_t sbrk_amount
)
{
800179c: 37 9c ff ec addi sp,sp,-20
80017a0: 5b 8b 00 14 sw (sp+20),r11
80017a4: 5b 8c 00 10 sw (sp+16),r12
80017a8: 5b 8d 00 0c sw (sp+12),r13
80017ac: 5b 8e 00 08 sw (sp+8),r14
80017b0: 5b 9d 00 04 sw (sp+4),ra
/*
* If configured, initialize the statistics support
*/
if ( rtems_malloc_statistics_helpers != NULL ) {
80017b4: 78 04 08 01 mvhi r4,0x801
80017b8: 38 84 46 60 ori r4,r4,0x4660
80017bc: 28 84 00 00 lw r4,(r4+0)
void RTEMS_Malloc_Initialize(
void *heap_begin,
uintptr_t heap_size,
size_t sbrk_amount
)
{
80017c0: b8 20 68 00 mv r13,r1
80017c4: b8 40 70 00 mv r14,r2
80017c8: b8 60 58 00 mv r11,r3
/*
* If configured, initialize the statistics support
*/
if ( rtems_malloc_statistics_helpers != NULL ) {
80017cc: 44 80 00 03 be r4,r0,80017d8 <RTEMS_Malloc_Initialize+0x3c>
(*rtems_malloc_statistics_helpers->initialize)();
80017d0: 28 81 00 00 lw r1,(r4+0)
80017d4: d8 20 00 00 call r1
}
/*
* Initialize the garbage collection list to start with nothing on it.
*/
malloc_deferred_frees_initialize();
80017d8: fb ff ff d2 calli 8001720 <malloc_deferred_frees_initialize>
/*
* Initialize the optional sbrk support for extending the heap
*/
if ( rtems_malloc_sbrk_helpers != NULL ) {
80017dc: 78 04 08 01 mvhi r4,0x801
80017e0: 38 84 46 64 ori r4,r4,0x4664
80017e4: 28 81 00 00 lw r1,(r4+0)
80017e8: 44 20 00 07 be r1,r0,8001804 <RTEMS_Malloc_Initialize+0x68>
heap_begin = (*rtems_malloc_sbrk_helpers->initialize)(
80017ec: 28 23 00 00 lw r3,(r1+0)
80017f0: b9 60 10 00 mv r2,r11
80017f4: b9 a0 08 00 mv r1,r13
80017f8: d8 60 00 00 call r3
80017fc: b8 20 68 00 mv r13,r1
heap_begin,
sbrk_amount
);
heap_size = (uintptr_t) sbrk_amount;
8001800: b9 60 70 00 mv r14,r11
* of the time under UNIX because zero'ing memory when it is first
* given to a process eliminates the chance of a process seeing data
* left over from another process. This would be a security violation.
*/
if (
8001804: 78 0c 08 01 mvhi r12,0x801
8001808: 39 8c 46 5c ori r12,r12,0x465c
800180c: 41 82 00 00 lbu r2,(r12+0)
8001810: 78 0b 08 01 mvhi r11,0x801
8001814: 39 6b 40 1c ori r11,r11,0x401c
8001818: 5c 40 00 0d bne r2,r0,800184c <RTEMS_Malloc_Initialize+0xb0>
!rtems_unified_work_area
&& rtems_configuration_get_do_zero_of_workspace()
800181c: 78 01 08 01 mvhi r1,0x801
8001820: 38 21 40 c4 ori r1,r1,0x40c4
8001824: 40 21 00 2c lbu r1,(r1+44)
8001828: 5c 22 00 17 bne r1,r2,8001884 <RTEMS_Malloc_Initialize+0xe8>
void *area_begin,
uintptr_t area_size,
uintptr_t page_size
)
{
return _Heap_Initialize( heap, area_begin, area_size, page_size );
800182c: 78 0b 08 01 mvhi r11,0x801
8001830: 39 6b 40 1c ori r11,r11,0x401c
8001834: 29 61 00 00 lw r1,(r11+0)
8001838: b9 a0 10 00 mv r2,r13
800183c: b9 c0 18 00 mv r3,r14
8001840: 34 04 00 08 mvi r4,8
8001844: f8 00 0a 3f calli 8004140 <_Heap_Initialize>
RTEMS_Malloc_Heap,
heap_begin,
heap_size,
CPU_HEAP_ALIGNMENT
);
if ( status == 0 ) {
8001848: 44 20 00 17 be r1,r0,80018a4 <RTEMS_Malloc_Initialize+0x108>
rtems_fatal_error_occurred( RTEMS_NO_MEMORY );
}
}
MSBUMP( space_available, _Protected_heap_Get_size(RTEMS_Malloc_Heap) );
800184c: 78 0c 08 01 mvhi r12,0x801
8001850: 39 8c 47 48 ori r12,r12,0x4748
8001854: 29 61 00 00 lw r1,(r11+0)
8001858: 29 8b 00 00 lw r11,(r12+0)
800185c: f8 00 0d aa calli 8004f04 <_Protected_heap_Get_size>
8001860: b4 2b 08 00 add r1,r1,r11
8001864: 59 81 00 00 sw (r12+0),r1
}
8001868: 2b 9d 00 04 lw ra,(sp+4)
800186c: 2b 8b 00 14 lw r11,(sp+20)
8001870: 2b 8c 00 10 lw r12,(sp+16)
8001874: 2b 8d 00 0c lw r13,(sp+12)
8001878: 2b 8e 00 08 lw r14,(sp+8)
800187c: 37 9c 00 14 addi sp,sp,20
8001880: c3 a0 00 00 ret
if (
!rtems_unified_work_area
&& rtems_configuration_get_do_zero_of_workspace()
) {
memset( heap_begin, 0, heap_size );
8001884: b9 a0 08 00 mv r1,r13
8001888: b9 c0 18 00 mv r3,r14
800188c: f8 00 30 45 calli 800d9a0 <memset>
* Unfortunately we cannot use assert if this fails because if this
* has failed we do not have a heap and if we do not have a heap
* STDIO cannot work because there will be no buffers.
*/
if ( !rtems_unified_work_area ) {
8001890: 41 81 00 00 lbu r1,(r12+0)
8001894: 78 0b 08 01 mvhi r11,0x801
8001898: 39 6b 40 1c ori r11,r11,0x401c
800189c: 44 20 ff e4 be r1,r0,800182c <RTEMS_Malloc_Initialize+0x90><== ALWAYS TAKEN
80018a0: e3 ff ff eb bi 800184c <RTEMS_Malloc_Initialize+0xb0> <== NOT EXECUTED
heap_begin,
heap_size,
CPU_HEAP_ALIGNMENT
);
if ( status == 0 ) {
rtems_fatal_error_occurred( RTEMS_NO_MEMORY );
80018a4: 34 01 00 1a mvi r1,26
80018a8: f8 00 06 e9 calli 800344c <rtems_fatal_error_occurred>
0800111c <Stack_check_Dump_threads_usage>:
static rtems_printk_plugin_t print_handler;
void Stack_check_Dump_threads_usage(
Thread_Control *the_thread
)
{
800111c: 37 9c ff d0 addi sp,sp,-48
8001120: 5b 8b 00 28 sw (sp+40),r11
8001124: 5b 8c 00 24 sw (sp+36),r12
8001128: 5b 8d 00 20 sw (sp+32),r13
800112c: 5b 8e 00 1c sw (sp+28),r14
8001130: 5b 8f 00 18 sw (sp+24),r15
8001134: 5b 90 00 14 sw (sp+20),r16
8001138: 5b 91 00 10 sw (sp+16),r17
800113c: 5b 92 00 0c sw (sp+12),r18
8001140: 5b 93 00 08 sw (sp+8),r19
8001144: 5b 9d 00 04 sw (sp+4),ra
/*
* Obtain interrupt stack information
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
8001148: 34 02 ff ff mvi r2,-1
800114c: 44 22 00 62 be r1,r2,80012d4 <Stack_check_Dump_threads_usage+0x1b8>
current = 0;
} else
#endif
{
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
8001150: 28 31 01 08 lw r17,(r1+264)
8001154: 28 27 00 bc lw r7,(r1+188)
the_thread = 0;
current = 0;
} else
#endif
{
stack = &the_thread->Start.Initial_stack;
8001158: 34 2d 00 b8 addi r13,r1,184
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
}
low = Stack_check_usable_stack_start(stack);
size = Stack_check_usable_stack_size(stack);
800115c: 29 ae 00 00 lw r14,(r13+0)
/*
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
8001160: 34 e2 00 20 addi r2,r7,32
{
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
}
low = Stack_check_usable_stack_start(stack);
8001164: 34 e6 00 10 addi r6,r7,16
size = Stack_check_usable_stack_size(stack);
8001168: 35 ce ff f0 addi r14,r14,-16
{
const uint32_t *base, *ebase;
uint32_t length;
base = s;
length = n/4;
800116c: 01 c4 00 01 srui r4,r14,1
high_water_mark = Stack_check_find_high_water_mark(low, size);
if ( high_water_mark )
used = Stack_check_Calculate_used( low, size, high_water_mark );
else
used = 0;
8001170: 34 0f 00 00 mvi r15,0
{
const uint32_t *base, *ebase;
uint32_t length;
base = s;
length = n/4;
8001174: 00 84 00 01 srui r4,r4,1
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
8001178: b4 84 20 00 add r4,r4,r4
800117c: b4 84 20 00 add r4,r4,r4
8001180: b4 44 20 00 add r4,r2,r4
8001184: 50 44 00 09 bgeu r2,r4,80011a8 <Stack_check_Dump_threads_usage+0x8c><== NEVER TAKEN
if (*base != U32_PATTERN)
8001188: 28 e3 00 20 lw r3,(r7+32)
800118c: 78 07 08 01 mvhi r7,0x801
8001190: 38 e7 68 f0 ori r7,r7,0x68f0
8001194: 28 e5 00 00 lw r5,(r7+0)
8001198: 5c 65 00 39 bne r3,r5,800127c <Stack_check_Dump_threads_usage+0x160><== NEVER TAKEN
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
800119c: 34 42 00 04 addi r2,r2,4
80011a0: 54 82 00 35 bgu r4,r2,8001274 <Stack_check_Dump_threads_usage+0x158><== ALWAYS TAKEN
high_water_mark = Stack_check_find_high_water_mark(low, size);
if ( high_water_mark )
used = Stack_check_Calculate_used( low, size, high_water_mark );
else
used = 0;
80011a4: 34 0f 00 00 mvi r15,0 <== NOT EXECUTED
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if ( the_thread )
80011a8: 44 20 00 3a be r1,r0,8001290 <Stack_check_Dump_threads_usage+0x174><== NOT EXECUTED
#endif
{
(*print_handler)(
80011ac: 28 30 00 08 lw r16,(r1+8)
80011b0: 78 0c 08 01 mvhi r12,0x801
80011b4: 39 8c 86 bc ori r12,r12,0x86bc
80011b8: 78 0b 08 01 mvhi r11,0x801
80011bc: 29 93 00 00 lw r19,(r12+0)
80011c0: 37 83 00 2c addi r3,sp,44
80011c4: 34 02 00 05 mvi r2,5
80011c8: 39 6b 86 c0 ori r11,r11,0x86c0
80011cc: ba 00 08 00 mv r1,r16
80011d0: 29 72 00 00 lw r18,(r11+0)
80011d4: f8 00 13 66 calli 8005f6c <rtems_object_get_name>
80011d8: 78 02 08 01 mvhi r2,0x801
80011dc: b8 20 20 00 mv r4,r1
80011e0: 38 42 67 58 ori r2,r2,0x6758
80011e4: ba 60 08 00 mv r1,r19
80011e8: ba 00 18 00 mv r3,r16
80011ec: da 40 00 00 call r18
(*print_handler)(
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
80011f0: 29 a4 00 00 lw r4,(r13+0)
80011f4: 29 a3 00 04 lw r3,(r13+4)
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
80011f8: 29 67 00 00 lw r7,(r11+0)
80011fc: 29 81 00 00 lw r1,(r12+0)
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
8001200: 34 84 ff ff addi r4,r4,-1
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
8001204: 78 02 08 01 mvhi r2,0x801
8001208: 38 42 67 78 ori r2,r2,0x6778
800120c: b4 64 20 00 add r4,r3,r4
8001210: ba 20 28 00 mv r5,r17
8001214: b9 c0 30 00 mv r6,r14
8001218: d8 e0 00 00 call r7
stack->area + stack->size - 1,
current,
size
);
if (Stack_check_Initialized == 0) {
800121c: 78 01 08 01 mvhi r1,0x801
8001220: 38 21 86 c4 ori r1,r1,0x86c4
8001224: 28 21 00 00 lw r1,(r1+0)
8001228: 44 20 00 25 be r1,r0,80012bc <Stack_check_Dump_threads_usage+0x1a0><== NEVER TAKEN
(*print_handler)( print_context, "Unavailable\n" );
} else {
(*print_handler)( print_context, "%8" PRId32 "\n", used );
800122c: 29 64 00 00 lw r4,(r11+0)
8001230: 29 81 00 00 lw r1,(r12+0)
8001234: 78 02 08 01 mvhi r2,0x801
8001238: 38 42 67 a8 ori r2,r2,0x67a8
800123c: b9 e0 18 00 mv r3,r15
8001240: d8 80 00 00 call r4
}
}
8001244: 2b 9d 00 04 lw ra,(sp+4)
8001248: 2b 8b 00 28 lw r11,(sp+40)
800124c: 2b 8c 00 24 lw r12,(sp+36)
8001250: 2b 8d 00 20 lw r13,(sp+32)
8001254: 2b 8e 00 1c lw r14,(sp+28)
8001258: 2b 8f 00 18 lw r15,(sp+24)
800125c: 2b 90 00 14 lw r16,(sp+20)
8001260: 2b 91 00 10 lw r17,(sp+16)
8001264: 2b 92 00 0c lw r18,(sp+12)
8001268: 2b 93 00 08 lw r19,(sp+8)
800126c: 37 9c 00 30 addi sp,sp,48
8001270: c3 a0 00 00 ret
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
if (*base != U32_PATTERN)
8001274: 28 47 00 00 lw r7,(r2+0)
8001278: 44 e3 ff c9 be r7,r3,800119c <Stack_check_Dump_threads_usage+0x80>
high_water_mark = Stack_check_find_high_water_mark(low, size);
if ( high_water_mark )
used = Stack_check_Calculate_used( low, size, high_water_mark );
else
used = 0;
800127c: 34 0f 00 00 mvi r15,0
low = Stack_check_usable_stack_start(stack);
size = Stack_check_usable_stack_size(stack);
high_water_mark = Stack_check_find_high_water_mark(low, size);
if ( high_water_mark )
8001280: 44 40 ff ca be r2,r0,80011a8 <Stack_check_Dump_threads_usage+0x8c><== NEVER TAKEN
used = Stack_check_Calculate_used( low, size, high_water_mark );
8001284: b4 ce 78 00 add r15,r6,r14
8001288: c9 e2 78 00 sub r15,r15,r2
else
used = 0;
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if ( the_thread )
800128c: 5c 20 ff c8 bne r1,r0,80011ac <Stack_check_Dump_threads_usage+0x90>
rtems_object_get_name( the_thread->Object.id, sizeof(name), name )
);
}
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
8001290: 78 0b 08 01 mvhi r11,0x801
8001294: 78 0c 08 01 mvhi r12,0x801
8001298: 39 6b 86 c0 ori r11,r11,0x86c0
800129c: 39 8c 86 bc ori r12,r12,0x86bc
80012a0: 29 64 00 00 lw r4,(r11+0)
80012a4: 29 81 00 00 lw r1,(r12+0)
80012a8: 78 02 08 01 mvhi r2,0x801
80012ac: 38 42 67 68 ori r2,r2,0x6768
80012b0: 34 03 ff ff mvi r3,-1
80012b4: d8 80 00 00 call r4
80012b8: e3 ff ff ce bi 80011f0 <Stack_check_Dump_threads_usage+0xd4>
current,
size
);
if (Stack_check_Initialized == 0) {
(*print_handler)( print_context, "Unavailable\n" );
80012bc: 29 63 00 00 lw r3,(r11+0) <== NOT EXECUTED
80012c0: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED
80012c4: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
80012c8: 38 42 67 98 ori r2,r2,0x6798 <== NOT EXECUTED
80012cc: d8 60 00 00 call r3 <== NOT EXECUTED
80012d0: e3 ff ff dd bi 8001244 <Stack_check_Dump_threads_usage+0x128><== NOT EXECUTED
/*
* Obtain interrupt stack information
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
if (!Stack_check_Interrupt_stack.area)
80012d4: 78 0d 08 01 mvhi r13,0x801
80012d8: 39 ad 87 60 ori r13,r13,0x8760
80012dc: 29 a7 00 04 lw r7,(r13+4)
return;
stack = &Stack_check_Interrupt_stack;
the_thread = 0;
current = 0;
80012e0: 34 11 00 00 mvi r17,0
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
if (!Stack_check_Interrupt_stack.area)
return;
stack = &Stack_check_Interrupt_stack;
the_thread = 0;
80012e4: 34 01 00 00 mvi r1,0
/*
* Obtain interrupt stack information
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
if (!Stack_check_Interrupt_stack.area)
80012e8: 5c e0 ff 9d bne r7,r0,800115c <Stack_check_Dump_threads_usage+0x40><== ALWAYS TAKEN
80012ec: e3 ff ff d6 bi 8001244 <Stack_check_Dump_threads_usage+0x128><== NOT EXECUTED
080012f0 <Stack_check_Initialize>:
/*
* Stack_check_Initialize
*/
void Stack_check_Initialize( void )
{
80012f0: 37 9c ff f8 addi sp,sp,-8
80012f4: 5b 8b 00 08 sw (sp+8),r11
80012f8: 5b 9d 00 04 sw (sp+4),ra
static uint32_t pattern[ 4 ] = {
0xFEEDF00D, 0x0BAD0D06, /* FEED FOOD to BAD DOG */
0xDEADF00D, 0x600D0D06 /* DEAD FOOD but GOOD DOG */
};
if ( Stack_check_Initialized )
80012fc: 78 0b 08 01 mvhi r11,0x801
8001300: 39 6b 86 c4 ori r11,r11,0x86c4
8001304: 29 61 00 00 lw r1,(r11+0)
8001308: 5c 20 00 24 bne r1,r0,8001398 <Stack_check_Initialize+0xa8>
/*
* Dope the pattern and fill areas
*/
p = Stack_check_Pattern.pattern;
for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) {
p[i] = pattern[ i%4 ];
800130c: 78 06 08 01 mvhi r6,0x801
8001310: 38 c6 68 f4 ori r6,r6,0x68f4
8001314: 28 c5 00 00 lw r5,(r6+0)
8001318: 78 02 08 01 mvhi r2,0x801
800131c: 78 06 08 01 mvhi r6,0x801
8001320: 38 42 87 50 ori r2,r2,0x8750
8001324: 38 c6 68 f8 ori r6,r6,0x68f8
8001328: 58 45 00 00 sw (r2+0),r5
800132c: 28 c5 00 00 lw r5,(r6+0)
8001330: 78 06 08 01 mvhi r6,0x801
8001334: 38 c6 68 fc ori r6,r6,0x68fc
8001338: 58 45 00 04 sw (r2+4),r5
800133c: 28 c5 00 00 lw r5,(r6+0)
8001340: 78 06 08 01 mvhi r6,0x801
/*
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
8001344: 78 03 08 01 mvhi r3,0x801
/*
* Dope the pattern and fill areas
*/
p = Stack_check_Pattern.pattern;
for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) {
p[i] = pattern[ i%4 ];
8001348: 38 c6 69 00 ori r6,r6,0x6900
/*
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
800134c: 38 63 8d dc ori r3,r3,0x8ddc
/*
* Dope the pattern and fill areas
*/
p = Stack_check_Pattern.pattern;
for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) {
p[i] = pattern[ i%4 ];
8001350: 58 45 00 08 sw (r2+8),r5
8001354: 28 c5 00 00 lw r5,(r6+0)
/*
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
8001358: 28 64 00 00 lw r4,(r3+0)
/*
* Dope the pattern and fill areas
*/
p = Stack_check_Pattern.pattern;
for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) {
p[i] = pattern[ i%4 ];
800135c: 58 45 00 0c sw (r2+12),r5
/*
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
8001360: 44 81 00 0c be r4,r1,8001390 <Stack_check_Initialize+0xa0> <== NEVER TAKEN
8001364: 28 63 00 04 lw r3,(r3+4)
8001368: 44 60 00 0a be r3,r0,8001390 <Stack_check_Initialize+0xa0> <== NEVER TAKEN
Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low;
800136c: 78 05 08 01 mvhi r5,0x801
Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
8001370: c8 64 30 00 sub r6,r3,r4
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low;
8001374: 38 a5 87 60 ori r5,r5,0x8760
Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
(char *) _CPU_Interrupt_stack_low;
Stack_check_Dope_stack(&Stack_check_Interrupt_stack);
8001378: b8 80 08 00 mv r1,r4
800137c: 34 02 00 a5 mvi r2,165
8001380: b8 c0 18 00 mv r3,r6
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low;
8001384: 58 a4 00 04 sw (r5+4),r4
Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
8001388: 58 a6 00 00 sw (r5+0),r6
(char *) _CPU_Interrupt_stack_low;
Stack_check_Dope_stack(&Stack_check_Interrupt_stack);
800138c: f8 00 3e 04 calli 8010b9c <memset>
}
#endif
Stack_check_Initialized = 1;
8001390: 34 01 00 01 mvi r1,1
8001394: 59 61 00 00 sw (r11+0),r1
}
8001398: 2b 9d 00 04 lw ra,(sp+4)
800139c: 2b 8b 00 08 lw r11,(sp+8)
80013a0: 37 9c 00 08 addi sp,sp,8
80013a4: c3 a0 00 00 ret
080036c4 <_API_extensions_Run_postdriver>:
*
* _API_extensions_Run_postdriver
*/
void _API_extensions_Run_postdriver( void )
{
80036c4: 37 9c ff f4 addi sp,sp,-12
80036c8: 5b 8b 00 0c sw (sp+12),r11
80036cc: 5b 8c 00 08 sw (sp+8),r12
80036d0: 5b 9d 00 04 sw (sp+4),ra
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
80036d4: 78 01 08 01 mvhi r1,0x801
80036d8: 38 21 4a 34 ori r1,r1,0x4a34
80036dc: 28 2b 00 00 lw r11,(r1+0)
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
80036e0: 78 0c 08 01 mvhi r12,0x801
80036e4: 39 8c 4a 38 ori r12,r12,0x4a38
80036e8: 45 6c 00 05 be r11,r12,80036fc <_API_extensions_Run_postdriver+0x38><== NEVER TAKEN
* Currently all APIs configure this hook so it is always non-NULL.
*/
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
80036ec: 29 61 00 08 lw r1,(r11+8)
80036f0: d8 20 00 00 call r1
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
80036f4: 29 6b 00 00 lw r11,(r11+0)
void _API_extensions_Run_postdriver( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
80036f8: 5d 6c ff fd bne r11,r12,80036ec <_API_extensions_Run_postdriver+0x28>
#if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
if ( the_extension->postdriver_hook )
#endif
(*the_extension->postdriver_hook)();
}
}
80036fc: 2b 9d 00 04 lw ra,(sp+4)
8003700: 2b 8b 00 0c lw r11,(sp+12)
8003704: 2b 8c 00 08 lw r12,(sp+8)
8003708: 37 9c 00 0c addi sp,sp,12
800370c: c3 a0 00 00 ret
08003710 <_API_extensions_Run_postswitch>:
*
* _API_extensions_Run_postswitch
*/
void _API_extensions_Run_postswitch( void )
{
8003710: 37 9c ff f0 addi sp,sp,-16
8003714: 5b 8b 00 10 sw (sp+16),r11
8003718: 5b 8c 00 0c sw (sp+12),r12
800371c: 5b 8d 00 08 sw (sp+8),r13
8003720: 5b 9d 00 04 sw (sp+4),ra
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
8003724: 78 01 08 01 mvhi r1,0x801
8003728: 38 21 4a 34 ori r1,r1,0x4a34
800372c: 28 2b 00 00 lw r11,(r1+0)
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
8003730: 78 0c 08 01 mvhi r12,0x801
8003734: 39 8c 4a 38 ori r12,r12,0x4a38
8003738: 45 6c 00 08 be r11,r12,8003758 <_API_extensions_Run_postswitch+0x48><== NEVER TAKEN
800373c: 78 0d 08 01 mvhi r13,0x801
8003740: 39 ad 4d 78 ori r13,r13,0x4d78
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
8003744: 29 62 00 0c lw r2,(r11+12)
8003748: 29 a1 00 0c lw r1,(r13+12)
800374c: d8 40 00 00 call r2
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
!_Chain_Is_tail( &_API_extensions_List, the_node ) ;
the_node = the_node->next ) {
8003750: 29 6b 00 00 lw r11,(r11+0)
void _API_extensions_Run_postswitch( void )
{
Chain_Node *the_node;
API_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_API_extensions_List );
8003754: 5d 6c ff fc bne r11,r12,8003744 <_API_extensions_Run_postswitch+0x34>
the_extension = (API_extensions_Control *) the_node;
(*the_extension->postswitch_hook)( _Thread_Executing );
}
}
8003758: 2b 9d 00 04 lw ra,(sp+4)
800375c: 2b 8b 00 10 lw r11,(sp+16)
8003760: 2b 8c 00 0c lw r12,(sp+12)
8003764: 2b 8d 00 08 lw r13,(sp+8)
8003768: 37 9c 00 10 addi sp,sp,16
800376c: c3 a0 00 00 ret
08006464 <_CORE_RWLock_Release>:
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
8006464: 37 9c ff f4 addi sp,sp,-12
8006468: 5b 8b 00 0c sw (sp+12),r11
800646c: 5b 8c 00 08 sw (sp+8),r12
8006470: 5b 9d 00 04 sw (sp+4),ra
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
8006474: 78 02 08 01 mvhi r2,0x801
8006478: 38 42 9d 38 ori r2,r2,0x9d38
800647c: 28 43 00 0c lw r3,(r2+12)
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
8006480: b8 20 58 00 mv r11,r1
* Otherwise, we have to block.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
8006484: 90 00 08 00 rcsr r1,IE
8006488: 34 02 ff fe mvi r2,-2
800648c: a0 22 10 00 and r2,r1,r2
8006490: d0 02 00 00 wcsr IE,r2
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
8006494: 29 62 00 44 lw r2,(r11+68)
8006498: 44 40 00 2f be r2,r0,8006554 <_CORE_RWLock_Release+0xf0>
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
800649c: 34 04 00 01 mvi r4,1
80064a0: 44 44 00 22 be r2,r4,8006528 <_CORE_RWLock_Release+0xc4>
return CORE_RWLOCK_SUCCESSFUL;
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
80064a4: 58 60 00 34 sw (r3+52),r0
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
80064a8: 59 60 00 44 sw (r11+68),r0
_ISR_Enable( level );
80064ac: d0 01 00 00 wcsr IE,r1
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
80064b0: b9 60 08 00 mv r1,r11
80064b4: f8 00 07 e9 calli 8008458 <_Thread_queue_Dequeue>
if ( next ) {
80064b8: 44 20 00 16 be r1,r0,8006510 <_CORE_RWLock_Release+0xac>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
80064bc: 28 22 00 30 lw r2,(r1+48)
80064c0: 34 01 00 01 mvi r1,1
80064c4: 44 41 00 2d be r2,r1,8006578 <_CORE_RWLock_Release+0x114>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
80064c8: 29 62 00 48 lw r2,(r11+72)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
80064cc: 59 61 00 44 sw (r11+68),r1
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
80064d0: 34 0c 00 01 mvi r12,1
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
80064d4: 34 41 00 01 addi r1,r2,1
80064d8: 59 61 00 48 sw (r11+72),r1
80064dc: e0 00 00 07 bi 80064f8 <_CORE_RWLock_Release+0x94>
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
80064e0: 28 63 00 30 lw r3,(r3+48)
80064e4: 44 6c 00 0b be r3,r12,8006510 <_CORE_RWLock_Release+0xac> <== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
80064e8: 29 63 00 48 lw r3,(r11+72)
80064ec: 34 63 00 01 addi r3,r3,1
80064f0: 59 63 00 48 sw (r11+72),r3
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
80064f4: f8 00 09 01 calli 80088f8 <_Thread_queue_Extract>
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
80064f8: b9 60 08 00 mv r1,r11
80064fc: f8 00 09 52 calli 8008a44 <_Thread_queue_First>
8006500: b8 20 18 00 mv r3,r1
if ( !next ||
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
8006504: b8 20 10 00 mv r2,r1
8006508: b9 60 08 00 mv r1,r11
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
if ( !next ||
800650c: 5c 60 ff f5 bne r3,r0,80064e0 <_CORE_RWLock_Release+0x7c>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
8006510: 34 01 00 00 mvi r1,0
8006514: 2b 9d 00 04 lw ra,(sp+4)
8006518: 2b 8b 00 0c lw r11,(sp+12)
800651c: 2b 8c 00 08 lw r12,(sp+8)
8006520: 37 9c 00 0c addi sp,sp,12
8006524: c3 a0 00 00 ret
_ISR_Enable( level );
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
return CORE_RWLOCK_SUCCESSFUL;
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
the_rwlock->number_of_readers -= 1;
8006528: 29 62 00 48 lw r2,(r11+72)
800652c: 34 42 ff ff addi r2,r2,-1
8006530: 59 62 00 48 sw (r11+72),r2
if ( the_rwlock->number_of_readers != 0 ) {
8006534: 44 40 ff dc be r2,r0,80064a4 <_CORE_RWLock_Release+0x40>
/* must be unlocked again */
_ISR_Enable( level );
8006538: d0 01 00 00 wcsr IE,r1
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
800653c: 34 01 00 00 mvi r1,0
8006540: 2b 9d 00 04 lw ra,(sp+4)
8006544: 2b 8b 00 0c lw r11,(sp+12)
8006548: 2b 8c 00 08 lw r12,(sp+8)
800654c: 37 9c 00 0c addi sp,sp,12
8006550: c3 a0 00 00 ret
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
_ISR_Enable( level );
8006554: d0 01 00 00 wcsr IE,r1
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
8006558: 34 01 00 02 mvi r1,2
800655c: 58 61 00 34 sw (r3+52),r1
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
8006560: 34 01 00 00 mvi r1,0
8006564: 2b 9d 00 04 lw ra,(sp+4)
8006568: 2b 8b 00 0c lw r11,(sp+12)
800656c: 2b 8c 00 08 lw r12,(sp+8)
8006570: 37 9c 00 0c addi sp,sp,12
8006574: c3 a0 00 00 ret
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
if ( next ) {
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
8006578: 34 01 00 02 mvi r1,2
800657c: 59 61 00 44 sw (r11+68),r1
return CORE_RWLOCK_SUCCESSFUL;
8006580: e3 ff ff e4 bi 8006510 <_CORE_RWLock_Release+0xac>
08006584 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
8006584: 37 9c ff f8 addi sp,sp,-8
8006588: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
800658c: 37 82 00 08 addi r2,sp,8
8006590: f8 00 06 b2 calli 8008058 <_Thread_Get>
switch ( location ) {
8006594: 2b 82 00 08 lw r2,(sp+8)
8006598: 5c 40 00 07 bne r2,r0,80065b4 <_CORE_RWLock_Timeout+0x30> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
800659c: f8 00 09 68 calli 8008b3c <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
80065a0: 78 01 08 01 mvhi r1,0x801
80065a4: 38 21 98 68 ori r1,r1,0x9868
80065a8: 28 22 00 00 lw r2,(r1+0)
80065ac: 34 42 ff ff addi r2,r2,-1
80065b0: 58 22 00 00 sw (r1+0),r2
_Thread_Unnest_dispatch();
break;
}
}
80065b4: 2b 9d 00 04 lw ra,(sp+4)
80065b8: 37 9c 00 08 addi sp,sp,8
80065bc: c3 a0 00 00 ret
0801539c <_CORE_message_queue_Broadcast>:
Objects_Id id __attribute__((unused)),
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)),
#endif
uint32_t *count
)
{
801539c: 37 9c ff e4 addi sp,sp,-28
80153a0: 5b 8b 00 1c sw (sp+28),r11
80153a4: 5b 8c 00 18 sw (sp+24),r12
80153a8: 5b 8d 00 14 sw (sp+20),r13
80153ac: 5b 8e 00 10 sw (sp+16),r14
80153b0: 5b 8f 00 0c sw (sp+12),r15
80153b4: 5b 90 00 08 sw (sp+8),r16
80153b8: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
80153bc: 28 24 00 4c lw r4,(r1+76)
Objects_Id id __attribute__((unused)),
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)),
#endif
uint32_t *count
)
{
80153c0: b8 20 68 00 mv r13,r1
80153c4: b8 60 60 00 mv r12,r3
80153c8: b8 40 78 00 mv r15,r2
80153cc: b8 c0 80 00 mv r16,r6
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
80153d0: 34 01 00 01 mvi r1,1
{
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
80153d4: 54 64 00 06 bgu r3,r4,80153ec <_CORE_message_queue_Broadcast+0x50><== NEVER TAKEN
* NOTE: This check is critical because threads can block on
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
80153d8: 29 a1 00 48 lw r1,(r13+72)
80153dc: 34 0e 00 00 mvi r14,0
80153e0: 44 20 00 11 be r1,r0,8015424 <_CORE_message_queue_Broadcast+0x88>
*count = 0;
80153e4: 58 c0 00 00 sw (r6+0),r0
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
80153e8: 34 01 00 00 mvi r1,0
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
80153ec: 2b 9d 00 04 lw ra,(sp+4)
80153f0: 2b 8b 00 1c lw r11,(sp+28)
80153f4: 2b 8c 00 18 lw r12,(sp+24)
80153f8: 2b 8d 00 14 lw r13,(sp+20)
80153fc: 2b 8e 00 10 lw r14,(sp+16)
8015400: 2b 8f 00 0c lw r15,(sp+12)
8015404: 2b 90 00 08 lw r16,(sp+8)
8015408: 37 9c 00 1c addi sp,sp,28
801540c: c3 a0 00 00 ret
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
8015410: 29 61 00 2c lw r1,(r11+44)
*/
number_broadcasted = 0;
while ((the_thread =
_Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
waitp = &the_thread->Wait;
number_broadcasted += 1;
8015414: 35 ce 00 01 addi r14,r14,1
8015418: f8 00 2b b9 calli 80202fc <memcpy>
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
801541c: 29 61 00 28 lw r1,(r11+40)
8015420: 58 2c 00 00 sw (r1+0),r12
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
8015424: b9 a0 08 00 mv r1,r13
8015428: f8 00 0d 80 calli 8018a28 <_Thread_queue_Dequeue>
801542c: b8 20 58 00 mv r11,r1
8015430: b9 e0 10 00 mv r2,r15
8015434: b9 80 18 00 mv r3,r12
8015438: 5c 20 ff f6 bne r1,r0,8015410 <_CORE_message_queue_Broadcast+0x74>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
801543c: 5a 0e 00 00 sw (r16+0),r14
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
8015440: 34 01 00 00 mvi r1,0
8015444: e3 ff ff ea bi 80153ec <_CORE_message_queue_Broadcast+0x50>
0800ed5c <_CORE_message_queue_Initialize>:
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Attributes *the_message_queue_attributes,
uint32_t maximum_pending_messages,
size_t maximum_message_size
)
{
800ed5c: 37 9c ff e4 addi sp,sp,-28
800ed60: 5b 8b 00 1c sw (sp+28),r11
800ed64: 5b 8c 00 18 sw (sp+24),r12
800ed68: 5b 8d 00 14 sw (sp+20),r13
800ed6c: 5b 8e 00 10 sw (sp+16),r14
800ed70: 5b 8f 00 0c sw (sp+12),r15
800ed74: 5b 90 00 08 sw (sp+8),r16
800ed78: 5b 9d 00 04 sw (sp+4),ra
800ed7c: b8 20 58 00 mv r11,r1
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
the_message_queue->number_of_pending_messages = 0;
800ed80: 58 20 00 48 sw (r1+72),r0
the_message_queue->maximum_message_size = maximum_message_size;
800ed84: 58 24 00 4c sw (r1+76),r4
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Notify_Handler the_handler,
void *the_argument
)
{
the_message_queue->notify_handler = the_handler;
800ed88: 58 20 00 60 sw (r1+96),r0
the_message_queue->notify_argument = the_argument;
800ed8c: 58 20 00 64 sw (r1+100),r0
)
{
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
800ed90: 59 63 00 44 sw (r11+68),r3
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
800ed94: 20 81 00 03 andi r1,r4,0x3
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Attributes *the_message_queue_attributes,
uint32_t maximum_pending_messages,
size_t maximum_message_size
)
{
800ed98: b8 60 70 00 mv r14,r3
800ed9c: b8 40 80 00 mv r16,r2
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
800eda0: b8 80 60 00 mv r12,r4
800eda4: 44 20 00 06 be r1,r0,800edbc <_CORE_message_queue_Initialize+0x60>
allocated_message_size += sizeof(uint32_t);
800eda8: 34 8c 00 04 addi r12,r4,4
allocated_message_size &= ~(sizeof(uint32_t) - 1);
800edac: 34 01 ff fc mvi r1,-4
800edb0: a1 81 60 00 and r12,r12,r1
}
if (allocated_message_size < maximum_message_size)
return false;
800edb4: 34 0d 00 00 mvi r13,0
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
allocated_message_size += sizeof(uint32_t);
allocated_message_size &= ~(sizeof(uint32_t) - 1);
}
if (allocated_message_size < maximum_message_size)
800edb8: 54 8c 00 1c bgu r4,r12,800ee28 <_CORE_message_queue_Initialize+0xcc><== NEVER TAKEN
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
800edbc: 35 8f 00 14 addi r15,r12,20
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
800edc0: b9 e0 08 00 mv r1,r15
800edc4: b9 c0 10 00 mv r2,r14
800edc8: f8 00 5e 50 calli 8026708 <__mulsi3>
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
return false;
800edcc: 34 0d 00 00 mvi r13,0
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
800edd0: 55 81 00 16 bgu r12,r1,800ee28 <_CORE_message_queue_Initialize+0xcc><== NEVER TAKEN
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
800edd4: f8 00 0e f7 calli 80129b0 <_Workspace_Allocate>
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
800edd8: 59 61 00 5c sw (r11+92),r1
_Workspace_Allocate( message_buffering_required );
800eddc: b8 20 18 00 mv r3,r1
if (the_message_queue->message_buffers == 0)
800ede0: 44 20 00 12 be r1,r0,800ee28 <_CORE_message_queue_Initialize+0xcc>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
800ede4: b8 60 10 00 mv r2,r3
800ede8: 35 61 00 68 addi r1,r11,104
800edec: b9 c0 18 00 mv r3,r14
800edf0: b9 e0 20 00 mv r4,r15
800edf4: f8 00 1a 6a calli 801579c <_Chain_Initialize>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
800edf8: 35 62 00 54 addi r2,r11,84
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
800edfc: 35 61 00 50 addi r1,r11,80
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
tail->previous = head;
800ee00: 59 61 00 58 sw (r11+88),r1
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
800ee04: 59 62 00 50 sw (r11+80),r2
head->previous = NULL;
800ee08: 59 60 00 54 sw (r11+84),r0
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
_Thread_queue_Initialize(
800ee0c: 2a 02 00 00 lw r2,(r16+0)
800ee10: b9 60 08 00 mv r1,r11
800ee14: 34 03 00 80 mvi r3,128
800ee18: 64 42 00 01 cmpei r2,r2,1
800ee1c: 34 04 00 06 mvi r4,6
800ee20: f8 00 0b 89 calli 8011c44 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
800ee24: 34 0d 00 01 mvi r13,1
}
800ee28: b9 a0 08 00 mv r1,r13
800ee2c: 2b 9d 00 04 lw ra,(sp+4)
800ee30: 2b 8b 00 1c lw r11,(sp+28)
800ee34: 2b 8c 00 18 lw r12,(sp+24)
800ee38: 2b 8d 00 14 lw r13,(sp+20)
800ee3c: 2b 8e 00 10 lw r14,(sp+16)
800ee40: 2b 8f 00 0c lw r15,(sp+12)
800ee44: 2b 90 00 08 lw r16,(sp+8)
800ee48: 37 9c 00 1c addi sp,sp,28
800ee4c: c3 a0 00 00 ret
08003a88 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
8003a88: 37 9c ff e4 addi sp,sp,-28
8003a8c: 5b 8b 00 18 sw (sp+24),r11
8003a90: 5b 8c 00 14 sw (sp+20),r12
8003a94: 5b 8d 00 10 sw (sp+16),r13
8003a98: 5b 8e 00 0c sw (sp+12),r14
8003a9c: 5b 8f 00 08 sw (sp+8),r15
8003aa0: 5b 9d 00 04 sw (sp+4),ra
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
8003aa4: 78 0b 08 01 mvhi r11,0x801
8003aa8: 39 6b 48 a8 ori r11,r11,0x48a8
8003aac: 29 66 00 00 lw r6,(r11+0)
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
8003ab0: 5b 85 00 1c sw (sp+28),r5
8003ab4: b8 20 60 00 mv r12,r1
8003ab8: b8 40 78 00 mv r15,r2
8003abc: b8 80 70 00 mv r14,r4
8003ac0: 20 6d 00 ff andi r13,r3,0xff
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
8003ac4: 44 c0 00 02 be r6,r0,8003acc <_CORE_mutex_Seize+0x44>
8003ac8: 5d a0 00 15 bne r13,r0,8003b1c <_CORE_mutex_Seize+0x94> <== ALWAYS TAKEN
8003acc: b9 80 08 00 mv r1,r12
8003ad0: 37 82 00 1c addi r2,sp,28
8003ad4: f8 00 18 ef calli 8009e90 <_CORE_mutex_Seize_interrupt_trylock>
8003ad8: 44 20 00 09 be r1,r0,8003afc <_CORE_mutex_Seize+0x74>
8003adc: 5d a0 00 19 bne r13,r0,8003b40 <_CORE_mutex_Seize+0xb8>
8003ae0: 2b 81 00 1c lw r1,(sp+28)
8003ae4: d0 01 00 00 wcsr IE,r1
8003ae8: 78 01 08 01 mvhi r1,0x801
8003aec: 38 21 4d 78 ori r1,r1,0x4d78
8003af0: 28 21 00 0c lw r1,(r1+12)
8003af4: 34 02 00 01 mvi r2,1
8003af8: 58 22 00 34 sw (r1+52),r2
}
8003afc: 2b 9d 00 04 lw ra,(sp+4)
8003b00: 2b 8b 00 18 lw r11,(sp+24)
8003b04: 2b 8c 00 14 lw r12,(sp+20)
8003b08: 2b 8d 00 10 lw r13,(sp+16)
8003b0c: 2b 8e 00 0c lw r14,(sp+12)
8003b10: 2b 8f 00 08 lw r15,(sp+8)
8003b14: 37 9c 00 1c addi sp,sp,28
8003b18: c3 a0 00 00 ret
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
8003b1c: 78 01 08 01 mvhi r1,0x801
8003b20: 38 21 4a 20 ori r1,r1,0x4a20
8003b24: 28 21 00 00 lw r1,(r1+0)
8003b28: 34 02 00 01 mvi r2,1
8003b2c: 50 41 ff e8 bgeu r2,r1,8003acc <_CORE_mutex_Seize+0x44>
8003b30: 34 01 00 00 mvi r1,0
8003b34: 34 02 00 00 mvi r2,0
8003b38: 34 03 00 12 mvi r3,18
8003b3c: f8 00 02 32 calli 8004404 <_Internal_error_Occurred>
8003b40: 78 01 08 01 mvhi r1,0x801
8003b44: 29 62 00 00 lw r2,(r11+0)
8003b48: 38 21 4d 78 ori r1,r1,0x4d78
8003b4c: 28 21 00 0c lw r1,(r1+12)
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
8003b50: 34 03 00 01 mvi r3,1
8003b54: 59 83 00 30 sw (r12+48),r3
8003b58: 34 42 00 01 addi r2,r2,1
8003b5c: 58 2c 00 44 sw (r1+68),r12
8003b60: 58 2f 00 20 sw (r1+32),r15
8003b64: 59 62 00 00 sw (r11+0),r2
8003b68: 2b 81 00 1c lw r1,(sp+28)
8003b6c: d0 01 00 00 wcsr IE,r1
8003b70: b9 80 08 00 mv r1,r12
8003b74: b9 c0 10 00 mv r2,r14
8003b78: fb ff ff a3 calli 8003a04 <_CORE_mutex_Seize_interrupt_blocking>
}
8003b7c: 2b 9d 00 04 lw ra,(sp+4)
8003b80: 2b 8b 00 18 lw r11,(sp+24)
8003b84: 2b 8c 00 14 lw r12,(sp+20)
8003b88: 2b 8d 00 10 lw r13,(sp+16)
8003b8c: 2b 8e 00 0c lw r14,(sp+12)
8003b90: 2b 8f 00 08 lw r15,(sp+8)
8003b94: 37 9c 00 1c addi sp,sp,28
8003b98: c3 a0 00 00 ret
08003d08 <_CORE_semaphore_Surrender>:
CORE_semaphore_Status _CORE_semaphore_Surrender(
CORE_semaphore_Control *the_semaphore,
Objects_Id id,
CORE_semaphore_API_mp_support_callout api_semaphore_mp_support
)
{
8003d08: 37 9c ff f8 addi sp,sp,-8
8003d0c: 5b 8b 00 08 sw (sp+8),r11
8003d10: 5b 9d 00 04 sw (sp+4),ra
8003d14: b8 20 58 00 mv r11,r1
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
8003d18: f8 00 07 fa calli 8005d00 <_Thread_queue_Dequeue>
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
8003d1c: 34 02 00 00 mvi r2,0
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
8003d20: 44 20 00 06 be r1,r0,8003d38 <_CORE_semaphore_Surrender+0x30>
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
}
return status;
}
8003d24: b8 40 08 00 mv r1,r2
8003d28: 2b 9d 00 04 lw ra,(sp+4)
8003d2c: 2b 8b 00 08 lw r11,(sp+8)
8003d30: 37 9c 00 08 addi sp,sp,8
8003d34: c3 a0 00 00 ret
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
8003d38: 90 00 08 00 rcsr r1,IE
8003d3c: 34 02 ff fe mvi r2,-2
8003d40: a0 22 10 00 and r2,r1,r2
8003d44: d0 02 00 00 wcsr IE,r2
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
8003d48: 29 63 00 48 lw r3,(r11+72)
8003d4c: 29 64 00 40 lw r4,(r11+64)
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
8003d50: 34 02 00 04 mvi r2,4
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
8003d54: 50 64 00 04 bgeu r3,r4,8003d64 <_CORE_semaphore_Surrender+0x5c><== NEVER TAKEN
the_semaphore->count += 1;
8003d58: 34 63 00 01 addi r3,r3,1
8003d5c: 59 63 00 48 sw (r11+72),r3
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
8003d60: 34 02 00 00 mvi r2,0
_ISR_Disable( level );
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
_ISR_Enable( level );
8003d64: d0 01 00 00 wcsr IE,r1
}
return status;
}
8003d68: b8 40 08 00 mv r1,r2
8003d6c: 2b 9d 00 04 lw ra,(sp+4)
8003d70: 2b 8b 00 08 lw r11,(sp+8)
8003d74: 37 9c 00 08 addi sp,sp,8
8003d78: c3 a0 00 00 ret
08009df4 <_Chain_Initialize>:
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
8009df4: 37 9c ff f0 addi sp,sp,-16
8009df8: 5b 8b 00 10 sw (sp+16),r11
8009dfc: 5b 8c 00 0c sw (sp+12),r12
8009e00: 5b 8d 00 08 sw (sp+8),r13
8009e04: 5b 9d 00 04 sw (sp+4),ra
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
8009e08: 58 20 00 04 sw (r1+4),r0
Chain_Control *the_chain,
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
8009e0c: b8 20 58 00 mv r11,r1
8009e10: b8 40 60 00 mv r12,r2
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
8009e14: 34 2d 00 04 addi r13,r1,4
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
8009e18: 44 60 00 10 be r3,r0,8009e58 <_Chain_Initialize+0x64> <== NEVER TAKEN
8009e1c: 34 63 ff ff addi r3,r3,-1
8009e20: b8 60 10 00 mv r2,r3
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
Chain_Node *next = starting_address;
8009e24: b9 80 28 00 mv r5,r12
)
{
size_t count = number_nodes;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *current = head;
8009e28: b9 60 30 00 mv r6,r11
8009e2c: e0 00 00 04 bi 8009e3c <_Chain_Initialize+0x48>
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
8009e30: b8 a0 30 00 mv r6,r5
8009e34: 34 63 ff ff addi r3,r3,-1
current->next = next;
next->previous = current;
current = next;
next = (Chain_Node *)
8009e38: b8 e0 28 00 mv r5,r7
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
current->next = next;
8009e3c: 58 c5 00 00 sw (r6+0),r5
next->previous = current;
8009e40: 58 a6 00 04 sw (r5+4),r6
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
8009e44: b4 a4 38 00 add r7,r5,r4
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
8009e48: 5c 60 ff fa bne r3,r0,8009e30 <_Chain_Initialize+0x3c>
* node_size - size of node in bytes
*
* Output parameters: NONE
*/
void _Chain_Initialize(
8009e4c: b8 80 08 00 mv r1,r4
8009e50: f8 00 21 05 calli 8012264 <__mulsi3>
Chain_Node *current = head;
Chain_Node *next = starting_address;
head->previous = NULL;
while ( count-- ) {
8009e54: b5 81 08 00 add r1,r12,r1
current = next;
next = (Chain_Node *)
_Addresses_Add_offset( (void *) next, node_size );
}
current->next = tail;
8009e58: 58 2d 00 00 sw (r1+0),r13
tail->previous = current;
8009e5c: 59 61 00 08 sw (r11+8),r1
}
8009e60: 2b 9d 00 04 lw ra,(sp+4)
8009e64: 2b 8b 00 10 lw r11,(sp+16)
8009e68: 2b 8c 00 0c lw r12,(sp+12)
8009e6c: 2b 8d 00 08 lw r13,(sp+8)
8009e70: 37 9c 00 10 addi sp,sp,16
8009e74: c3 a0 00 00 ret
0800df28 <_Event_Seize>:
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
800df28: 37 9c ff f4 addi sp,sp,-12
800df2c: 5b 8b 00 0c sw (sp+12),r11
800df30: 5b 8c 00 08 sw (sp+8),r12
800df34: 5b 9d 00 04 sw (sp+4),ra
rtems_event_set pending_events;
ISR_Level level;
RTEMS_API_Control *api;
Thread_blocking_operation_States sync_state;
executing = _Thread_Executing;
800df38: 78 05 08 01 mvhi r5,0x801
800df3c: 38 a5 ad f0 ori r5,r5,0xadf0
800df40: 28 ab 00 0c lw r11,(r5+12)
executing->Wait.return_code = RTEMS_SUCCESSFUL;
800df44: 59 60 00 34 sw (r11+52),r0
api = executing->API_Extensions[ THREAD_API_RTEMS ];
800df48: 29 67 01 1c lw r7,(r11+284)
_ISR_Disable( level );
800df4c: 90 00 30 00 rcsr r6,IE
800df50: 34 05 ff fe mvi r5,-2
800df54: a0 c5 28 00 and r5,r6,r5
800df58: d0 05 00 00 wcsr IE,r5
pending_events = api->pending_events;
800df5c: 28 e8 00 00 lw r8,(r7+0)
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
rtems_event_set the_event_set,
rtems_event_set the_event_condition
)
{
return ( the_event_set & the_event_condition );
800df60: a0 28 28 00 and r5,r1,r8
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
800df64: 44 a0 00 04 be r5,r0,800df74 <_Event_Seize+0x4c>
800df68: 44 25 00 29 be r1,r5,800e00c <_Event_Seize+0xe4>
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_any (
rtems_option option_set
)
{
return (option_set & RTEMS_EVENT_ANY) ? true : false;
800df6c: 20 49 00 02 andi r9,r2,0x2
(seized_events == event_in || _Options_Is_any( option_set )) ) {
800df70: 5d 20 00 27 bne r9,r0,800e00c <_Event_Seize+0xe4>
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
800df74: 20 47 00 01 andi r7,r2,0x1
_ISR_Enable( level );
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
800df78: 5c e0 00 1c bne r7,r0,800dfe8 <_Event_Seize+0xc0>
*/
executing->Wait.option = (uint32_t) option_set;
executing->Wait.count = (uint32_t) event_in;
executing->Wait.return_argument = event_out;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
800df7c: 78 0c 08 01 mvhi r12,0x801
800df80: 39 8c b2 e8 ori r12,r12,0xb2e8
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
executing->Wait.count = (uint32_t) event_in;
800df84: 59 61 00 24 sw (r11+36),r1
executing->Wait.return_argument = event_out;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
800df88: 34 01 00 01 mvi r1,1
* set properly when we are marked as in the event critical section.
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
800df8c: 59 62 00 30 sw (r11+48),r2
executing->Wait.count = (uint32_t) event_in;
executing->Wait.return_argument = event_out;
800df90: 59 64 00 28 sw (r11+40),r4
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
800df94: 59 81 00 00 sw (r12+0),r1
_ISR_Enable( level );
800df98: d0 06 00 00 wcsr IE,r6
if ( ticks ) {
800df9c: 5c 60 00 2c bne r3,r0,800e04c <_Event_Seize+0x124>
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
}
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
800dfa0: b9 60 08 00 mv r1,r11
800dfa4: 34 02 01 00 mvi r2,256
800dfa8: fb ff e5 d4 calli 80076f8 <_Thread_Set_state>
_ISR_Disable( level );
800dfac: 90 00 18 00 rcsr r3,IE
800dfb0: 34 01 ff fe mvi r1,-2
800dfb4: a0 61 08 00 and r1,r3,r1
800dfb8: d0 01 00 00 wcsr IE,r1
sync_state = _Event_Sync_state;
800dfbc: 29 81 00 00 lw r1,(r12+0)
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
800dfc0: 34 02 00 01 mvi r2,1
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
_ISR_Disable( level );
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
800dfc4: 59 80 00 00 sw (r12+0),r0
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
800dfc8: 44 22 00 1b be r1,r2,800e034 <_Event_Seize+0x10c> <== ALWAYS TAKEN
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
800dfcc: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
800dfd0: f8 00 05 f6 calli 800f7a8 <_Thread_blocking_operation_Cancel><== NOT EXECUTED
}
800dfd4: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800dfd8: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
800dfdc: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
800dfe0: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
800dfe4: c3 a0 00 00 ret <== NOT EXECUTED
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
_ISR_Enable( level );
800dfe8: d0 06 00 00 wcsr IE,r6
executing->Wait.return_code = RTEMS_UNSATISFIED;
800dfec: 34 01 00 0d mvi r1,13
800dff0: 59 61 00 34 sw (r11+52),r1
*event_out = seized_events;
800dff4: 58 85 00 00 sw (r4+0),r5
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
800dff8: 2b 9d 00 04 lw ra,(sp+4)
800dffc: 2b 8b 00 0c lw r11,(sp+12)
800e000: 2b 8c 00 08 lw r12,(sp+8)
800e004: 37 9c 00 0c addi sp,sp,12
800e008: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
800e00c: a4 a0 08 00 not r1,r5
800e010: a0 28 40 00 and r8,r1,r8
pending_events = api->pending_events;
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
(seized_events == event_in || _Options_Is_any( option_set )) ) {
api->pending_events =
800e014: 58 e8 00 00 sw (r7+0),r8
_Event_sets_Clear( pending_events, seized_events );
_ISR_Enable( level );
800e018: d0 06 00 00 wcsr IE,r6
*event_out = seized_events;
800e01c: 58 85 00 00 sw (r4+0),r5
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
800e020: 2b 9d 00 04 lw ra,(sp+4)
800e024: 2b 8b 00 0c lw r11,(sp+12)
800e028: 2b 8c 00 08 lw r12,(sp+8)
800e02c: 37 9c 00 0c addi sp,sp,12
800e030: c3 a0 00 00 ret
_ISR_Disable( level );
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
_ISR_Enable( level );
800e034: d0 03 00 00 wcsr IE,r3
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
}
800e038: 2b 9d 00 04 lw ra,(sp+4)
800e03c: 2b 8b 00 0c lw r11,(sp+12)
800e040: 2b 8c 00 08 lw r12,(sp+8)
800e044: 37 9c 00 0c addi sp,sp,12
800e048: c3 a0 00 00 ret
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
_ISR_Enable( level );
if ( ticks ) {
_Watchdog_Initialize(
800e04c: 29 62 00 08 lw r2,(r11+8)
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
800e050: 78 01 08 00 mvhi r1,0x800
800e054: 38 21 e2 58 ori r1,r1,0xe258
800e058: 59 61 00 64 sw (r11+100),r1
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800e05c: 78 01 08 01 mvhi r1,0x801
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
the_watchdog->id = id;
800e060: 59 62 00 68 sw (r11+104),r2
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
800e064: 59 60 00 50 sw (r11+80),r0
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
800e068: 59 60 00 6c sw (r11+108),r0
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
800e06c: 59 63 00 54 sw (r11+84),r3
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800e070: 38 21 aa 00 ori r1,r1,0xaa00
800e074: 35 62 00 48 addi r2,r11,72
800e078: fb ff e7 5a calli 8007de0 <_Watchdog_Insert>
800e07c: e3 ff ff c9 bi 800dfa0 <_Event_Seize+0x78>
0800e0f4 <_Event_Surrender>:
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
800e0f4: 37 9c ff f8 addi sp,sp,-8
800e0f8: 5b 8b 00 08 sw (sp+8),r11
800e0fc: 5b 9d 00 04 sw (sp+4),ra
rtems_event_set event_condition;
rtems_event_set seized_events;
rtems_option option_set;
RTEMS_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
800e100: 28 25 01 1c lw r5,(r1+284)
option_set = (rtems_option) the_thread->Wait.option;
800e104: 28 28 00 30 lw r8,(r1+48)
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
800e108: b8 20 58 00 mv r11,r1
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
option_set = (rtems_option) the_thread->Wait.option;
_ISR_Disable( level );
800e10c: 90 00 08 00 rcsr r1,IE
800e110: 34 07 ff fe mvi r7,-2
800e114: a0 27 38 00 and r7,r1,r7
800e118: d0 07 00 00 wcsr IE,r7
pending_events = api->pending_events;
800e11c: 28 a6 00 00 lw r6,(r5+0)
event_condition = (rtems_event_set) the_thread->Wait.count;
800e120: 29 64 00 24 lw r4,(r11+36)
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
rtems_event_set the_event_set,
rtems_event_set the_event_condition
)
{
return ( the_event_set & the_event_condition );
800e124: a0 86 10 00 and r2,r4,r6
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
800e128: 44 40 00 27 be r2,r0,800e1c4 <_Event_Surrender+0xd0>
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
800e12c: 78 03 08 01 mvhi r3,0x801
800e130: 38 63 ad f0 ori r3,r3,0xadf0
800e134: 28 69 00 08 lw r9,(r3+8)
800e138: 45 20 00 03 be r9,r0,800e144 <_Event_Surrender+0x50>
800e13c: 28 63 00 0c lw r3,(r3+12)
800e140: 45 63 00 31 be r11,r3,800e204 <_Event_Surrender+0x110> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_EVENT);
800e144: 29 63 00 10 lw r3,(r11+16)
800e148: 20 63 01 00 andi r3,r3,0x100
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
800e14c: 44 60 00 19 be r3,r0,800e1b0 <_Event_Surrender+0xbc>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
800e150: 44 82 00 03 be r4,r2,800e15c <_Event_Surrender+0x68>
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_any (
rtems_option option_set
)
{
return (option_set & RTEMS_EVENT_ANY) ? true : false;
800e154: 21 08 00 02 andi r8,r8,0x2
800e158: 45 00 00 16 be r8,r0,800e1b0 <_Event_Surrender+0xbc> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
800e15c: a4 40 18 00 not r3,r2
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800e160: 29 64 00 28 lw r4,(r11+40)
800e164: a0 66 30 00 and r6,r3,r6
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
800e168: 58 a6 00 00 sw (r5+0),r6
the_thread->Wait.count = 0;
800e16c: 59 60 00 24 sw (r11+36),r0
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800e170: 58 82 00 00 sw (r4+0),r2
_ISR_Flash( level );
800e174: d0 01 00 00 wcsr IE,r1
800e178: d0 07 00 00 wcsr IE,r7
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
800e17c: 29 63 00 50 lw r3,(r11+80)
800e180: 34 02 00 02 mvi r2,2
800e184: 44 62 00 15 be r3,r2,800e1d8 <_Event_Surrender+0xe4>
_ISR_Enable( level );
800e188: d0 01 00 00 wcsr IE,r1
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800e18c: 78 01 08 01 mvhi r1,0x801
800e190: 38 21 8a ac ori r1,r1,0x8aac
800e194: 28 22 00 00 lw r2,(r1+0)
800e198: b9 60 08 00 mv r1,r11
800e19c: f8 00 05 9b calli 800f808 <_Thread_Clear_state>
}
return;
}
}
_ISR_Enable( level );
}
800e1a0: 2b 9d 00 04 lw ra,(sp+4)
800e1a4: 2b 8b 00 08 lw r11,(sp+8)
800e1a8: 37 9c 00 08 addi sp,sp,8
800e1ac: c3 a0 00 00 ret
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
800e1b0: d0 01 00 00 wcsr IE,r1
}
800e1b4: 2b 9d 00 04 lw ra,(sp+4)
800e1b8: 2b 8b 00 08 lw r11,(sp+8)
800e1bc: 37 9c 00 08 addi sp,sp,8
800e1c0: c3 a0 00 00 ret
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
_ISR_Enable( level );
800e1c4: d0 01 00 00 wcsr IE,r1
}
return;
}
}
_ISR_Enable( level );
}
800e1c8: 2b 9d 00 04 lw ra,(sp+4)
800e1cc: 2b 8b 00 08 lw r11,(sp+8)
800e1d0: 37 9c 00 08 addi sp,sp,8
800e1d4: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
800e1d8: 34 02 00 03 mvi r2,3
800e1dc: 59 62 00 50 sw (r11+80),r2
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
800e1e0: d0 01 00 00 wcsr IE,r1
(void) _Watchdog_Remove( &the_thread->Timer );
800e1e4: 35 61 00 48 addi r1,r11,72
800e1e8: fb ff e7 67 calli 8007f84 <_Watchdog_Remove>
800e1ec: 78 03 08 01 mvhi r3,0x801
800e1f0: 38 63 8a ac ori r3,r3,0x8aac
800e1f4: 28 62 00 00 lw r2,(r3+0)
800e1f8: b9 60 08 00 mv r1,r11
800e1fc: f8 00 05 83 calli 800f808 <_Thread_Clear_state>
800e200: e3 ff ff ed bi 800e1b4 <_Event_Surrender+0xc0>
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
800e204: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED
800e208: 38 63 b2 e8 ori r3,r3,0xb2e8 <== NOT EXECUTED
800e20c: 28 6a 00 00 lw r10,(r3+0) <== NOT EXECUTED
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
800e210: 34 09 00 02 mvi r9,2 <== NOT EXECUTED
800e214: 45 49 00 04 be r10,r9,800e224 <_Event_Surrender+0x130> <== NOT EXECUTED
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
800e218: 28 6a 00 00 lw r10,(r3+0) <== NOT EXECUTED
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
800e21c: 34 09 00 01 mvi r9,1 <== NOT EXECUTED
800e220: 5d 49 ff c9 bne r10,r9,800e144 <_Event_Surrender+0x50> <== NOT EXECUTED
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
800e224: 44 82 00 03 be r4,r2,800e230 <_Event_Surrender+0x13c> <== NOT EXECUTED
800e228: 21 08 00 02 andi r8,r8,0x2 <== NOT EXECUTED
800e22c: 45 00 00 09 be r8,r0,800e250 <_Event_Surrender+0x15c> <== NOT EXECUTED
800e230: a4 40 20 00 not r4,r2 <== NOT EXECUTED
800e234: a0 86 30 00 and r6,r4,r6 <== NOT EXECUTED
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800e238: 29 64 00 28 lw r4,(r11+40) <== NOT EXECUTED
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
800e23c: 58 a6 00 00 sw (r5+0),r6 <== NOT EXECUTED
the_thread->Wait.count = 0;
800e240: 59 60 00 24 sw (r11+36),r0 <== NOT EXECUTED
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800e244: 58 82 00 00 sw (r4+0),r2 <== NOT EXECUTED
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
800e248: 34 02 00 03 mvi r2,3 <== NOT EXECUTED
800e24c: 58 62 00 00 sw (r3+0),r2 <== NOT EXECUTED
}
_ISR_Enable( level );
800e250: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
return;
800e254: e3 ff ff d8 bi 800e1b4 <_Event_Surrender+0xc0> <== NOT EXECUTED
0800e258 <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
800e258: 37 9c ff f8 addi sp,sp,-8
800e25c: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
800e260: 37 82 00 08 addi r2,sp,8
800e264: fb ff e2 88 calli 8006c84 <_Thread_Get>
switch ( location ) {
800e268: 2b 82 00 08 lw r2,(sp+8)
800e26c: 44 40 00 04 be r2,r0,800e27c <_Event_Timeout+0x24> <== ALWAYS TAKEN
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
800e270: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800e274: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
800e278: c3 a0 00 00 ret <== NOT EXECUTED
*
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
_ISR_Disable( level );
800e27c: 90 00 18 00 rcsr r3,IE
800e280: 34 02 ff fe mvi r2,-2
800e284: a0 62 10 00 and r2,r3,r2
800e288: d0 02 00 00 wcsr IE,r2
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
800e28c: 78 02 08 01 mvhi r2,0x801
800e290: 38 42 ad f0 ori r2,r2,0xadf0
return;
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
800e294: 28 42 00 0c lw r2,(r2+12)
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
800e298: 58 20 00 24 sw (r1+36),r0
if ( _Thread_Is_executing( the_thread ) ) {
800e29c: 44 22 00 10 be r1,r2,800e2dc <_Event_Timeout+0x84> <== NEVER TAKEN
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
800e2a0: 34 02 00 06 mvi r2,6
800e2a4: 58 22 00 34 sw (r1+52),r2
_ISR_Enable( level );
800e2a8: d0 03 00 00 wcsr IE,r3
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800e2ac: 78 03 08 01 mvhi r3,0x801
800e2b0: 38 63 8a ac ori r3,r3,0x8aac
800e2b4: 28 62 00 00 lw r2,(r3+0)
800e2b8: f8 00 05 54 calli 800f808 <_Thread_Clear_state>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
800e2bc: 78 01 08 01 mvhi r1,0x801
800e2c0: 38 21 a9 20 ori r1,r1,0xa920
800e2c4: 28 22 00 00 lw r2,(r1+0)
800e2c8: 34 42 ff ff addi r2,r2,-1
800e2cc: 58 22 00 00 sw (r1+0),r2
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
800e2d0: 2b 9d 00 04 lw ra,(sp+4)
800e2d4: 37 9c 00 08 addi sp,sp,8
800e2d8: c3 a0 00 00 ret
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
800e2dc: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
800e2e0: 38 42 b2 e8 ori r2,r2,0xb2e8 <== NOT EXECUTED
800e2e4: 28 45 00 00 lw r5,(r2+0) <== NOT EXECUTED
800e2e8: 34 04 00 01 mvi r4,1 <== NOT EXECUTED
800e2ec: 5c a4 ff ed bne r5,r4,800e2a0 <_Event_Timeout+0x48> <== NOT EXECUTED
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
800e2f0: 34 04 00 02 mvi r4,2 <== NOT EXECUTED
800e2f4: 58 44 00 00 sw (r2+0),r4 <== NOT EXECUTED
800e2f8: e3 ff ff ea bi 800e2a0 <_Event_Timeout+0x48> <== NOT EXECUTED
0800a090 <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
800a090: 37 9c ff bc addi sp,sp,-68
800a094: 5b 8b 00 44 sw (sp+68),r11
800a098: 5b 8c 00 40 sw (sp+64),r12
800a09c: 5b 8d 00 3c sw (sp+60),r13
800a0a0: 5b 8e 00 38 sw (sp+56),r14
800a0a4: 5b 8f 00 34 sw (sp+52),r15
800a0a8: 5b 90 00 30 sw (sp+48),r16
800a0ac: 5b 91 00 2c sw (sp+44),r17
800a0b0: 5b 92 00 28 sw (sp+40),r18
800a0b4: 5b 93 00 24 sw (sp+36),r19
800a0b8: 5b 94 00 20 sw (sp+32),r20
800a0bc: 5b 95 00 1c sw (sp+28),r21
800a0c0: 5b 96 00 18 sw (sp+24),r22
800a0c4: 5b 97 00 14 sw (sp+20),r23
800a0c8: 5b 98 00 10 sw (sp+16),r24
800a0cc: 5b 99 00 0c sw (sp+12),r25
800a0d0: 5b 9b 00 08 sw (sp+8),fp
800a0d4: 5b 9d 00 04 sw (sp+4),ra
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
800a0d8: 34 54 00 04 addi r20,r2,4
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
800a0dc: b8 20 78 00 mv r15,r1
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
800a0e0: 28 37 00 10 lw r23,(r1+16)
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
800a0e4: b8 40 70 00 mv r14,r2
800a0e8: b8 60 80 00 mv r16,r3
800a0ec: b8 80 90 00 mv r18,r4
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
/* Integer overflow occured */
return NULL;
800a0f0: 34 01 00 00 mvi r1,0
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
800a0f4: 54 54 00 5b bgu r2,r20,800a260 <_Heap_Allocate_aligned_with_boundary+0x1d0>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
800a0f8: 5c 80 00 6f bne r4,r0,800a2b4 <_Heap_Allocate_aligned_with_boundary+0x224>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
800a0fc: 29 ec 00 08 lw r12,(r15+8)
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
800a100: 34 01 00 00 mvi r1,0
800a104: 45 ec 00 57 be r15,r12,800a260 <_Heap_Allocate_aligned_with_boundary+0x1d0>
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
800a108: 34 18 00 04 mvi r24,4
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
800a10c: 34 11 00 01 mvi r17,1
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a110: 34 1b ff fe mvi fp,-2
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
800a114: 36 f9 00 07 addi r25,r23,7
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
800a118: cb 0e c0 00 sub r24,r24,r14
/*
* The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag
* field. Thus the value is about one unit larger than the real block
* size. The greater than operator takes this into account.
*/
if ( block->size_and_flag > block_size_floor ) {
800a11c: 29 81 00 04 lw r1,(r12+4)
800a120: 52 81 00 3b bgeu r20,r1,800a20c <_Heap_Allocate_aligned_with_boundary+0x17c>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
800a124: 35 8b 00 08 addi r11,r12,8
if ( alignment == 0 ) {
800a128: 46 00 00 3e be r16,r0,800a220 <_Heap_Allocate_aligned_with_boundary+0x190>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a12c: a0 3b 68 00 and r13,r1,fp
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
800a130: 29 f5 00 14 lw r21,(r15+20)
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
800a134: b5 8d 68 00 add r13,r12,r13
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
uintptr_t alloc_begin = alloc_end - alloc_size;
800a138: b7 0d 58 00 add r11,r24,r13
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
800a13c: cb 35 18 00 sub r3,r25,r21
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a140: b9 60 08 00 mv r1,r11
800a144: ba 00 10 00 mv r2,r16
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
800a148: b4 6d 68 00 add r13,r3,r13
800a14c: f8 00 20 bb calli 8012438 <__umodsi3>
800a150: c9 61 58 00 sub r11,r11,r1
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
800a154: 35 96 00 08 addi r22,r12,8
uintptr_t alloc_begin = alloc_end - alloc_size;
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
800a158: 51 ab 00 05 bgeu r13,r11,800a16c <_Heap_Allocate_aligned_with_boundary+0xdc>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a15c: b9 a0 08 00 mv r1,r13
800a160: ba 00 10 00 mv r2,r16
800a164: f8 00 20 b5 calli 8012438 <__umodsi3>
800a168: c9 a1 58 00 sub r11,r13,r1
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
800a16c: 46 40 00 1c be r18,r0,800a1dc <_Heap_Allocate_aligned_with_boundary+0x14c>
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
alloc_begin = _Heap_Align_down( alloc_begin_ceiling, alignment );
}
alloc_end = alloc_begin + alloc_size;
800a170: b5 6e 68 00 add r13,r11,r14
800a174: b9 a0 08 00 mv r1,r13
800a178: ba 40 10 00 mv r2,r18
800a17c: f8 00 20 af calli 8012438 <__umodsi3>
800a180: c9 a1 28 00 sub r5,r13,r1
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
800a184: f5 a5 68 00 cmpgu r13,r13,r5
800a188: f4 ab 08 00 cmpgu r1,r5,r11
800a18c: a1 a1 68 00 and r13,r13,r1
800a190: 45 a0 00 13 be r13,r0,800a1dc <_Heap_Allocate_aligned_with_boundary+0x14c>
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
800a194: b6 ce 98 00 add r19,r22,r14
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
if ( boundary_line < boundary_floor ) {
800a198: 56 65 00 1d bgu r19,r5,800a20c <_Heap_Allocate_aligned_with_boundary+0x17c>
800a19c: e0 00 00 02 bi 800a1a4 <_Heap_Allocate_aligned_with_boundary+0x114>
800a1a0: 56 65 00 1b bgu r19,r5,800a20c <_Heap_Allocate_aligned_with_boundary+0x17c><== NEVER TAKEN
return 0;
}
alloc_begin = boundary_line - alloc_size;
800a1a4: c8 ae 58 00 sub r11,r5,r14
800a1a8: ba 00 10 00 mv r2,r16
800a1ac: b9 60 08 00 mv r1,r11
800a1b0: f8 00 20 a2 calli 8012438 <__umodsi3>
800a1b4: c9 61 58 00 sub r11,r11,r1
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
800a1b8: b5 6e 68 00 add r13,r11,r14
800a1bc: b9 a0 08 00 mv r1,r13
800a1c0: ba 40 10 00 mv r2,r18
800a1c4: f8 00 20 9d calli 8012438 <__umodsi3>
800a1c8: c9 a1 28 00 sub r5,r13,r1
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
800a1cc: f5 a5 68 00 cmpgu r13,r13,r5
800a1d0: f4 ab 08 00 cmpgu r1,r5,r11
800a1d4: a1 a1 68 00 and r13,r13,r1
800a1d8: 5d a0 ff f2 bne r13,r0,800a1a0 <_Heap_Allocate_aligned_with_boundary+0x110>
boundary_line = _Heap_Align_down( alloc_end, boundary );
}
}
/* Ensure that the we have a valid new block at the beginning */
if ( alloc_begin >= alloc_begin_floor ) {
800a1dc: 56 cb 00 0c bgu r22,r11,800a20c <_Heap_Allocate_aligned_with_boundary+0x17c>
800a1e0: 34 01 ff f8 mvi r1,-8
800a1e4: c8 2c 68 00 sub r13,r1,r12
800a1e8: ba e0 10 00 mv r2,r23
800a1ec: b9 60 08 00 mv r1,r11
800a1f0: f8 00 20 92 calli 8012438 <__umodsi3>
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800a1f4: b5 ab 68 00 add r13,r13,r11
uintptr_t const alloc_block_begin =
(uintptr_t) _Heap_Block_of_alloc_area( alloc_begin, page_size );
uintptr_t const free_size = alloc_block_begin - block_begin;
800a1f8: c9 a1 08 00 sub r1,r13,r1
if ( free_size >= min_block_size || free_size == 0 ) {
800a1fc: 64 22 00 00 cmpei r2,r1,0
800a200: f0 35 a8 00 cmpgeu r21,r1,r21
800a204: b8 55 08 00 or r1,r2,r21
800a208: 5c 20 00 06 bne r1,r0,800a220 <_Heap_Allocate_aligned_with_boundary+0x190>
if ( alloc_begin != 0 ) {
break;
}
block = block->next;
800a20c: 29 8c 00 08 lw r12,(r12+8)
800a210: 36 21 00 01 addi r1,r17,1
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
800a214: 45 ec 00 26 be r15,r12,800a2ac <_Heap_Allocate_aligned_with_boundary+0x21c>
800a218: b8 20 88 00 mv r17,r1
800a21c: e3 ff ff c0 bi 800a11c <_Heap_Allocate_aligned_with_boundary+0x8c>
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
800a220: 45 60 ff fb be r11,r0,800a20c <_Heap_Allocate_aligned_with_boundary+0x17c><== NEVER TAKEN
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
800a224: 29 e3 00 48 lw r3,(r15+72)
stats->searches += search_count;
800a228: 29 e2 00 4c lw r2,(r15+76)
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
800a22c: b9 e0 08 00 mv r1,r15
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
800a230: 34 63 00 01 addi r3,r3,1
stats->searches += search_count;
800a234: b4 51 10 00 add r2,r2,r17
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
800a238: 59 e3 00 48 sw (r15+72),r3
stats->searches += search_count;
800a23c: 59 e2 00 4c sw (r15+76),r2
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
800a240: b9 60 18 00 mv r3,r11
800a244: b9 80 10 00 mv r2,r12
800a248: b9 c0 20 00 mv r4,r14
800a24c: fb ff e8 12 calli 8004294 <_Heap_Block_allocate>
800a250: b9 60 08 00 mv r1,r11
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
800a254: 29 e2 00 44 lw r2,(r15+68)
800a258: 50 51 00 02 bgeu r2,r17,800a260 <_Heap_Allocate_aligned_with_boundary+0x1d0>
stats->max_search = search_count;
800a25c: 59 f1 00 44 sw (r15+68),r17
}
return (void *) alloc_begin;
}
800a260: 2b 9d 00 04 lw ra,(sp+4)
800a264: 2b 8b 00 44 lw r11,(sp+68)
800a268: 2b 8c 00 40 lw r12,(sp+64)
800a26c: 2b 8d 00 3c lw r13,(sp+60)
800a270: 2b 8e 00 38 lw r14,(sp+56)
800a274: 2b 8f 00 34 lw r15,(sp+52)
800a278: 2b 90 00 30 lw r16,(sp+48)
800a27c: 2b 91 00 2c lw r17,(sp+44)
800a280: 2b 92 00 28 lw r18,(sp+40)
800a284: 2b 93 00 24 lw r19,(sp+36)
800a288: 2b 94 00 20 lw r20,(sp+32)
800a28c: 2b 95 00 1c lw r21,(sp+28)
800a290: 2b 96 00 18 lw r22,(sp+24)
800a294: 2b 97 00 14 lw r23,(sp+20)
800a298: 2b 98 00 10 lw r24,(sp+16)
800a29c: 2b 99 00 0c lw r25,(sp+12)
800a2a0: 2b 9b 00 08 lw fp,(sp+8)
800a2a4: 37 9c 00 44 addi sp,sp,68
800a2a8: c3 a0 00 00 ret
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
800a2ac: 34 01 00 00 mvi r1,0
800a2b0: e3 ff ff e9 bi 800a254 <_Heap_Allocate_aligned_with_boundary+0x1c4>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
800a2b4: 54 44 ff eb bgu r2,r4,800a260 <_Heap_Allocate_aligned_with_boundary+0x1d0>
return NULL;
}
if ( alignment == 0 ) {
800a2b8: 5c 60 ff 91 bne r3,r0,800a0fc <_Heap_Allocate_aligned_with_boundary+0x6c>
alignment = page_size;
800a2bc: ba e0 80 00 mv r16,r23
800a2c0: e3 ff ff 8f bi 800a0fc <_Heap_Allocate_aligned_with_boundary+0x6c>
0800a520 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
800a520: 37 9c ff b8 addi sp,sp,-72
800a524: 5b 8b 00 40 sw (sp+64),r11
800a528: 5b 8c 00 3c sw (sp+60),r12
800a52c: 5b 8d 00 38 sw (sp+56),r13
800a530: 5b 8e 00 34 sw (sp+52),r14
800a534: 5b 8f 00 30 sw (sp+48),r15
800a538: 5b 90 00 2c sw (sp+44),r16
800a53c: 5b 91 00 28 sw (sp+40),r17
800a540: 5b 92 00 24 sw (sp+36),r18
800a544: 5b 93 00 20 sw (sp+32),r19
800a548: 5b 94 00 1c sw (sp+28),r20
800a54c: 5b 95 00 18 sw (sp+24),r21
800a550: 5b 96 00 14 sw (sp+20),r22
800a554: 5b 97 00 10 sw (sp+16),r23
800a558: 5b 98 00 0c sw (sp+12),r24
800a55c: 5b 99 00 08 sw (sp+8),r25
800a560: 5b 9d 00 04 sw (sp+4),ra
Heap_Block *start_block = first_block;
Heap_Block *merge_below_block = NULL;
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
800a564: 5b 80 00 48 sw (sp+72),r0
Heap_Block *extend_last_block = NULL;
800a568: 5b 80 00 44 sw (sp+68),r0
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
800a56c: b4 43 70 00 add r14,r2,r3
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
800a570: b8 40 68 00 mv r13,r2
800a574: b8 20 58 00 mv r11,r1
800a578: b8 80 b8 00 mv r23,r4
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
800a57c: 28 30 00 20 lw r16,(r1+32)
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
Heap_Block *extend_last_block = NULL;
uintptr_t const page_size = heap->page_size;
800a580: 28 32 00 10 lw r18,(r1+16)
uintptr_t const min_block_size = heap->min_block_size;
800a584: 28 25 00 14 lw r5,(r1+20)
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
uintptr_t const free_size = stats->free_size;
800a588: 28 38 00 30 lw r24,(r1+48)
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
return false;
800a58c: 34 0c 00 00 mvi r12,0
uintptr_t const free_size = stats->free_size;
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
800a590: 54 4e 00 76 bgu r2,r14,800a768 <_Heap_Extend+0x248>
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
800a594: b8 40 08 00 mv r1,r2
800a598: b8 a0 20 00 mv r4,r5
800a59c: b8 60 10 00 mv r2,r3
800a5a0: 37 85 00 48 addi r5,sp,72
800a5a4: ba 40 18 00 mv r3,r18
800a5a8: 37 86 00 44 addi r6,sp,68
800a5ac: fb ff e7 a3 calli 8004438 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
800a5b0: 44 20 00 6e be r1,r0,800a768 <_Heap_Extend+0x248>
800a5b4: ba 00 60 00 mv r12,r16
800a5b8: 34 16 00 00 mvi r22,0
800a5bc: 34 19 00 00 mvi r25,0
800a5c0: 34 11 00 00 mvi r17,0
800a5c4: 34 14 00 00 mvi r20,0
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a5c8: 34 15 ff fe mvi r21,-2
800a5cc: e0 00 00 0d bi 800a600 <_Heap_Extend+0xe0>
return false;
}
if ( extend_area_end == sub_area_begin ) {
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
800a5d0: 55 ee 00 7b bgu r15,r14,800a7bc <_Heap_Extend+0x29c>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a5d4: b9 e0 08 00 mv r1,r15
800a5d8: ba 40 10 00 mv r2,r18
800a5dc: 35 f3 ff f8 addi r19,r15,-8
800a5e0: f8 00 21 1a calli 8012a48 <__umodsi3>
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800a5e4: ca 61 08 00 sub r1,r19,r1
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
800a5e8: 45 af 00 15 be r13,r15,800a63c <_Heap_Extend+0x11c>
start_block->prev_size = extend_area_end;
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
800a5ec: 55 af 00 72 bgu r13,r15,800a7b4 <_Heap_Extend+0x294>
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a5f0: 28 2c 00 04 lw r12,(r1+4)
800a5f4: a2 ac 60 00 and r12,r21,r12
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800a5f8: b4 2c 60 00 add r12,r1,r12
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
800a5fc: 46 0c 00 16 be r16,r12,800a654 <_Heap_Extend+0x134>
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
800a600: b9 80 08 00 mv r1,r12
800a604: 45 90 00 70 be r12,r16,800a7c4 <_Heap_Extend+0x2a4>
uintptr_t const sub_area_end = start_block->prev_size;
800a608: 29 8f 00 00 lw r15,(r12+0)
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
800a60c: f5 c1 30 00 cmpgu r6,r14,r1
800a610: f5 ed 28 00 cmpgu r5,r15,r13
(uintptr_t) start_block : heap->area_begin;
uintptr_t const sub_area_end = start_block->prev_size;
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
800a614: a0 c5 28 00 and r5,r6,r5
800a618: 5c a0 00 75 bne r5,r0,800a7ec <_Heap_Extend+0x2cc>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
800a61c: 5c 2e ff ed bne r1,r14,800a5d0 <_Heap_Extend+0xb0>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a620: b9 e0 08 00 mv r1,r15
800a624: ba 40 10 00 mv r2,r18
800a628: 35 f3 ff f8 addi r19,r15,-8
800a62c: f8 00 21 07 calli 8012a48 <__umodsi3>
800a630: b9 80 a0 00 mv r20,r12
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800a634: ca 61 08 00 sub r1,r19,r1
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
800a638: 5d af ff ed bne r13,r15,800a5ec <_Heap_Extend+0xcc> <== ALWAYS TAKEN
start_block->prev_size = extend_area_end;
800a63c: 59 8e 00 00 sw (r12+0),r14
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a640: 28 2c 00 04 lw r12,(r1+4)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
800a644: b8 20 88 00 mv r17,r1
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a648: a2 ac 60 00 and r12,r21,r12
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800a64c: b4 2c 60 00 add r12,r1,r12
} else if ( sub_area_end < extend_area_begin ) {
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
800a650: 5e 0c ff ec bne r16,r12,800a600 <_Heap_Extend+0xe0> <== NEVER TAKEN
if ( extend_area_begin < heap->area_begin ) {
800a654: 29 61 00 18 lw r1,(r11+24)
800a658: 51 a1 00 61 bgeu r13,r1,800a7dc <_Heap_Extend+0x2bc>
heap->area_begin = extend_area_begin;
800a65c: 59 6d 00 18 sw (r11+24),r13
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
800a660: 2b 81 00 44 lw r1,(sp+68)
800a664: 2b 82 00 48 lw r2,(sp+72)
extend_last_block->prev_size = extend_first_block_size;
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
800a668: 29 65 00 20 lw r5,(r11+32)
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
800a66c: c8 22 18 00 sub r3,r1,r2
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
800a670: 38 64 00 01 ori r4,r3,0x1
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
800a674: 58 4e 00 00 sw (r2+0),r14
extend_first_block->size_and_flag =
800a678: 58 44 00 04 sw (r2+4),r4
extend_first_block_size | HEAP_PREV_BLOCK_USED;
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
800a67c: 58 23 00 00 sw (r1+0),r3
extend_last_block->size_and_flag = 0;
800a680: 58 20 00 04 sw (r1+4),r0
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
800a684: 50 45 00 52 bgeu r2,r5,800a7cc <_Heap_Extend+0x2ac>
heap->first_block = extend_first_block;
800a688: 59 62 00 20 sw (r11+32),r2
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
800a68c: 46 80 00 6a be r20,r0,800a834 <_Heap_Extend+0x314>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
800a690: 29 6c 00 10 lw r12,(r11+16)
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
800a694: 35 ad 00 08 addi r13,r13,8
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
800a698: b9 a0 08 00 mv r1,r13
800a69c: b9 80 10 00 mv r2,r12
800a6a0: f8 00 20 ea calli 8012a48 <__umodsi3>
if ( remainder != 0 ) {
800a6a4: 44 20 00 03 be r1,r0,800a6b0 <_Heap_Extend+0x190> <== ALWAYS TAKEN
return value - remainder + alignment;
800a6a8: b5 ac 68 00 add r13,r13,r12 <== NOT EXECUTED
800a6ac: c9 a1 68 00 sub r13,r13,r1 <== NOT EXECUTED
uintptr_t const new_first_block_begin =
800a6b0: 35 a2 ff f8 addi r2,r13,-8
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
800a6b4: 2a 83 00 00 lw r3,(r20+0)
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const new_first_block_begin =
new_first_block_alloc_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
800a6b8: ca 82 08 00 sub r1,r20,r2
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
800a6bc: 38 21 00 01 ori r1,r1,0x1
800a6c0: 58 41 00 04 sw (r2+4),r1
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
800a6c4: 59 a3 ff f8 sw (r13+-8),r3
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
_Heap_Free_block( heap, new_first_block );
800a6c8: b9 60 08 00 mv r1,r11
800a6cc: fb ff ff 88 calli 800a4ec <_Heap_Free_block>
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
800a6d0: 46 20 00 49 be r17,r0,800a7f4 <_Heap_Extend+0x2d4>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a6d4: 29 62 00 10 lw r2,(r11+16)
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
extend_area_end - last_block_begin - HEAP_BLOCK_HEADER_SIZE,
800a6d8: 35 ce ff f8 addi r14,r14,-8
uintptr_t extend_area_end
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
800a6dc: c9 d1 70 00 sub r14,r14,r17
800a6e0: b9 c0 08 00 mv r1,r14
800a6e4: f8 00 20 d9 calli 8012a48 <__umodsi3>
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
(last_block->size_and_flag - last_block_new_size)
800a6e8: 2a 22 00 04 lw r2,(r17+4)
800a6ec: c9 c1 70 00 sub r14,r14,r1
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
800a6f0: b5 d1 08 00 add r1,r14,r17
(last_block->size_and_flag - last_block_new_size)
800a6f4: c8 4e 10 00 sub r2,r2,r14
| HEAP_PREV_BLOCK_USED;
800a6f8: 38 42 00 01 ori r2,r2,0x1
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
800a6fc: 58 22 00 04 sw (r1+4),r2
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a700: 2a 23 00 04 lw r3,(r17+4)
(last_block->size_and_flag - last_block_new_size)
| HEAP_PREV_BLOCK_USED;
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
800a704: b9 60 08 00 mv r1,r11
800a708: ba 20 10 00 mv r2,r17
800a70c: 20 63 00 01 andi r3,r3,0x1
block->size_and_flag = size | flag;
800a710: b9 c3 70 00 or r14,r14,r3
800a714: 5a 2e 00 04 sw (r17+4),r14
800a718: fb ff ff 75 calli 800a4ec <_Heap_Free_block>
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
800a71c: 66 31 00 00 cmpei r17,r17,0
800a720: 66 94 00 00 cmpei r20,r20,0
800a724: a2 34 88 00 and r17,r17,r20
800a728: 5e 20 00 3f bne r17,r0,800a824 <_Heap_Extend+0x304>
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
800a72c: 29 61 00 24 lw r1,(r11+36)
* This feature will be used to terminate the scattered heap area list. See
* also _Heap_Extend().
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
800a730: 29 63 00 20 lw r3,(r11+32)
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
800a734: 29 65 00 30 lw r5,(r11+48)
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a738: 28 22 00 04 lw r2,(r1+4)
/* Statistics */
stats->size += extended_size;
800a73c: 29 64 00 2c lw r4,(r11+44)
* This feature will be used to terminate the scattered heap area list. See
* also _Heap_Extend().
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
800a740: c8 61 18 00 sub r3,r3,r1
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a744: 20 42 00 01 andi r2,r2,0x1
block->size_and_flag = size | flag;
800a748: b8 62 10 00 or r2,r3,r2
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
800a74c: c8 b8 c0 00 sub r24,r5,r24
800a750: 58 22 00 04 sw (r1+4),r2
/* Statistics */
stats->size += extended_size;
800a754: b4 98 08 00 add r1,r4,r24
800a758: 59 61 00 2c sw (r11+44),r1
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
800a75c: 34 0c 00 01 mvi r12,1
extended_size = stats->free_size - free_size;
/* Statistics */
stats->size += extended_size;
if ( extended_size_ptr != NULL )
800a760: 46 e0 00 02 be r23,r0,800a768 <_Heap_Extend+0x248> <== NEVER TAKEN
*extended_size_ptr = extended_size;
800a764: 5a f8 00 00 sw (r23+0),r24
return true;
}
800a768: b9 80 08 00 mv r1,r12
800a76c: 2b 9d 00 04 lw ra,(sp+4)
800a770: 2b 8b 00 40 lw r11,(sp+64)
800a774: 2b 8c 00 3c lw r12,(sp+60)
800a778: 2b 8d 00 38 lw r13,(sp+56)
800a77c: 2b 8e 00 34 lw r14,(sp+52)
800a780: 2b 8f 00 30 lw r15,(sp+48)
800a784: 2b 90 00 2c lw r16,(sp+44)
800a788: 2b 91 00 28 lw r17,(sp+40)
800a78c: 2b 92 00 24 lw r18,(sp+36)
800a790: 2b 93 00 20 lw r19,(sp+32)
800a794: 2b 94 00 1c lw r20,(sp+28)
800a798: 2b 95 00 18 lw r21,(sp+24)
800a79c: 2b 96 00 14 lw r22,(sp+20)
800a7a0: 2b 97 00 10 lw r23,(sp+16)
800a7a4: 2b 98 00 0c lw r24,(sp+12)
800a7a8: 2b 99 00 08 lw r25,(sp+8)
800a7ac: 37 9c 00 48 addi sp,sp,72
800a7b0: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
800a7b4: b8 20 b0 00 mv r22,r1
800a7b8: e3 ff ff 8e bi 800a5f0 <_Heap_Extend+0xd0>
return false;
}
if ( extend_area_end == sub_area_begin ) {
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
800a7bc: b9 80 c8 00 mv r25,r12
800a7c0: e3 ff ff 85 bi 800a5d4 <_Heap_Extend+0xb4>
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
800a7c4: 29 61 00 18 lw r1,(r11+24)
800a7c8: e3 ff ff 90 bi 800a608 <_Heap_Extend+0xe8>
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
heap->first_block = extend_first_block;
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
800a7cc: 29 62 00 24 lw r2,(r11+36)
800a7d0: 50 41 ff af bgeu r2,r1,800a68c <_Heap_Extend+0x16c>
heap->last_block = extend_last_block;
800a7d4: 59 61 00 24 sw (r11+36),r1
800a7d8: e3 ff ff ad bi 800a68c <_Heap_Extend+0x16c>
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
if ( extend_area_begin < heap->area_begin ) {
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
800a7dc: 29 61 00 1c lw r1,(r11+28)
800a7e0: 50 2e ff a0 bgeu r1,r14,800a660 <_Heap_Extend+0x140>
heap->area_end = extend_area_end;
800a7e4: 59 6e 00 1c sw (r11+28),r14
800a7e8: e3 ff ff 9e bi 800a660 <_Heap_Extend+0x140>
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
800a7ec: 34 0c 00 00 mvi r12,0
800a7f0: e3 ff ff de bi 800a768 <_Heap_Extend+0x248>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
800a7f4: 46 d1 ff ca be r22,r17,800a71c <_Heap_Extend+0x1fc>
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a7f8: 2a c3 00 04 lw r3,(r22+4)
)
{
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
800a7fc: 2b 82 00 48 lw r2,(sp+72)
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
_Heap_Link_above(
800a800: 2b 81 00 44 lw r1,(sp+68)
800a804: 20 63 00 01 andi r3,r3,0x1
)
{
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
800a808: c8 56 10 00 sub r2,r2,r22
block->size_and_flag = size | flag;
800a80c: b8 43 10 00 or r2,r2,r3
800a810: 5a c2 00 04 sw (r22+4),r2
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
800a814: 28 22 00 04 lw r2,(r1+4)
800a818: 38 42 00 01 ori r2,r2,0x1
800a81c: 58 22 00 04 sw (r1+4),r2
800a820: e3 ff ff bf bi 800a71c <_Heap_Extend+0x1fc>
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
_Heap_Free_block( heap, extend_first_block );
800a824: 2b 82 00 48 lw r2,(sp+72)
800a828: b9 60 08 00 mv r1,r11
800a82c: fb ff ff 30 calli 800a4ec <_Heap_Free_block>
800a830: e3 ff ff bf bi 800a72c <_Heap_Extend+0x20c>
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
_Heap_Merge_below( heap, extend_area_begin, merge_below_block );
} else if ( link_below_block != NULL ) {
800a834: 47 34 ff a7 be r25,r20,800a6d0 <_Heap_Extend+0x1b0>
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
(link_begin - last_block_begin) | HEAP_PREV_BLOCK_USED;
800a838: cb 21 c8 00 sub r25,r25,r1
800a83c: 3b 39 00 01 ori r25,r25,0x1
)
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
800a840: 58 39 00 04 sw (r1+4),r25
800a844: e3 ff ff a3 bi 800a6d0 <_Heap_Extend+0x1b0>
0800a2c4 <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
800a2c4: 37 9c ff f4 addi sp,sp,-12
800a2c8: 5b 8b 00 0c sw (sp+12),r11
800a2cc: 5b 8c 00 08 sw (sp+8),r12
800a2d0: 5b 9d 00 04 sw (sp+4),ra
800a2d4: b8 40 18 00 mv r3,r2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a2d8: 28 22 00 10 lw r2,(r1+16)
800a2dc: b8 20 58 00 mv r11,r1
800a2e0: b8 60 08 00 mv r1,r3
800a2e4: 34 6c ff f8 addi r12,r3,-8
800a2e8: f8 00 20 54 calli 8012438 <__umodsi3>
RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
800a2ec: 29 64 00 20 lw r4,(r11+32)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800a2f0: c9 81 10 00 sub r2,r12,r1
bool next_is_free = false;
_Heap_Protection_block_check( heap, block );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
return false;
800a2f4: 34 01 00 00 mvi r1,0
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800a2f8: 54 82 00 43 bgu r4,r2,800a404 <_Heap_Free+0x140>
800a2fc: 29 65 00 24 lw r5,(r11+36)
800a300: 54 45 00 41 bgu r2,r5,800a404 <_Heap_Free+0x140>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800a304: 28 48 00 04 lw r8,(r2+4)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a308: 34 07 ff fe mvi r7,-2
800a30c: a1 07 30 00 and r6,r8,r7
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800a310: b4 46 18 00 add r3,r2,r6
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800a314: 54 83 00 3c bgu r4,r3,800a404 <_Heap_Free+0x140> <== NEVER TAKEN
800a318: 54 65 00 3b bgu r3,r5,800a404 <_Heap_Free+0x140> <== NEVER TAKEN
800a31c: 28 69 00 04 lw r9,(r3+4)
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a320: 21 2a 00 01 andi r10,r9,0x1
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
_HAssert( false );
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
800a324: 45 40 00 38 be r10,r0,800a404 <_Heap_Free+0x140> <== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800a328: a1 27 48 00 and r9,r9,r7
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
800a32c: 34 07 00 00 mvi r7,0
800a330: 44 a3 00 05 be r5,r3,800a344 <_Heap_Free+0x80>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800a334: b4 69 08 00 add r1,r3,r9
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a338: 28 27 00 04 lw r7,(r1+4)
800a33c: 20 e7 00 01 andi r7,r7,0x1
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
800a340: 18 e7 00 01 xori r7,r7,0x1
800a344: 21 08 00 01 andi r8,r8,0x1
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
800a348: 5d 00 00 19 bne r8,r0,800a3ac <_Heap_Free+0xe8>
uintptr_t const prev_size = block->prev_size;
800a34c: 28 4a 00 00 lw r10,(r2+0)
Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size );
if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) {
_HAssert( false );
return( false );
800a350: 34 01 00 00 mvi r1,0
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800a354: c8 4a 10 00 sub r2,r2,r10
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800a358: 54 82 00 2b bgu r4,r2,800a404 <_Heap_Free+0x140> <== NEVER TAKEN
800a35c: b9 00 08 00 mv r1,r8
800a360: 54 45 00 29 bgu r2,r5,800a404 <_Heap_Free+0x140> <== NEVER TAKEN
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a364: 28 44 00 04 lw r4,(r2+4)
800a368: 20 84 00 01 andi r4,r4,0x1
}
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
800a36c: 44 80 00 26 be r4,r0,800a404 <_Heap_Free+0x140> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
800a370: 44 e0 00 3d be r7,r0,800a464 <_Heap_Free+0x1a0>
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
800a374: 29 64 00 38 lw r4,(r11+56)
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800a378: 28 61 00 08 lw r1,(r3+8)
800a37c: 28 63 00 0c lw r3,(r3+12)
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
800a380: b4 c9 48 00 add r9,r6,r9
800a384: b5 2a 50 00 add r10,r9,r10
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
800a388: 58 61 00 08 sw (r3+8),r1
next->prev = prev;
800a38c: 58 23 00 0c sw (r1+12),r3
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
800a390: 34 81 ff ff addi r1,r4,-1
800a394: 59 61 00 38 sw (r11+56),r1
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800a398: 39 43 00 01 ori r3,r10,0x1
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
800a39c: b4 4a 08 00 add r1,r2,r10
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800a3a0: 58 43 00 04 sw (r2+4),r3
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
800a3a4: 58 2a 00 00 sw (r1+0),r10
800a3a8: e0 00 00 0d bi 800a3dc <_Heap_Free+0x118>
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
800a3ac: 44 e0 00 1b be r7,r0,800a418 <_Heap_Free+0x154>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800a3b0: 28 64 00 08 lw r4,(r3+8)
800a3b4: 28 61 00 0c lw r1,(r3+12)
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
800a3b8: b5 26 48 00 add r9,r9,r6
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
800a3bc: 58 44 00 08 sw (r2+8),r4
new_block->prev = prev;
800a3c0: 58 41 00 0c sw (r2+12),r1
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800a3c4: 39 25 00 01 ori r5,r9,0x1
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
800a3c8: b4 49 18 00 add r3,r2,r9
next->prev = new_block;
800a3cc: 58 82 00 0c sw (r4+12),r2
prev->next = new_block;
800a3d0: 58 22 00 08 sw (r1+8),r2
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800a3d4: 58 45 00 04 sw (r2+4),r5
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
800a3d8: 58 69 00 00 sw (r3+0),r9
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
800a3dc: 29 62 00 40 lw r2,(r11+64)
++stats->frees;
800a3e0: 29 61 00 50 lw r1,(r11+80)
stats->free_size += block_size;
800a3e4: 29 63 00 30 lw r3,(r11+48)
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
800a3e8: 34 42 ff ff addi r2,r2,-1
++stats->frees;
800a3ec: 34 21 00 01 addi r1,r1,1
stats->free_size += block_size;
800a3f0: b4 66 30 00 add r6,r3,r6
}
}
/* Statistics */
--stats->used_blocks;
++stats->frees;
800a3f4: 59 61 00 50 sw (r11+80),r1
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
800a3f8: 59 62 00 40 sw (r11+64),r2
++stats->frees;
stats->free_size += block_size;
800a3fc: 59 66 00 30 sw (r11+48),r6
return( true );
800a400: 34 01 00 01 mvi r1,1
}
800a404: 2b 9d 00 04 lw ra,(sp+4)
800a408: 2b 8b 00 0c lw r11,(sp+12)
800a40c: 2b 8c 00 08 lw r12,(sp+8)
800a410: 37 9c 00 0c addi sp,sp,12
800a414: c3 a0 00 00 ret
next_block->prev_size = size;
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
800a418: 38 c1 00 01 ori r1,r6,0x1
800a41c: 58 41 00 04 sw (r2+4),r1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800a420: 28 67 00 04 lw r7,(r3+4)
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
800a424: 29 61 00 38 lw r1,(r11+56)
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
800a428: 29 64 00 08 lw r4,(r11+8)
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800a42c: 34 05 ff fe mvi r5,-2
new_block->next = next;
new_block->prev = block_before;
800a430: 58 4b 00 0c sw (r2+12),r11
800a434: a0 e5 28 00 and r5,r7,r5
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
if ( stats->max_free_blocks < stats->free_blocks ) {
800a438: 29 67 00 3c lw r7,(r11+60)
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
800a43c: 34 21 00 01 addi r1,r1,1
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
800a440: 58 44 00 08 sw (r2+8),r4
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
800a444: 58 82 00 0c sw (r4+12),r2
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800a448: 58 65 00 04 sw (r3+4),r5
next_block->prev_size = block_size;
800a44c: 58 66 00 00 sw (r3+0),r6
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
800a450: 59 62 00 08 sw (r11+8),r2
/* Statistics */
++stats->free_blocks;
800a454: 59 61 00 38 sw (r11+56),r1
if ( stats->max_free_blocks < stats->free_blocks ) {
800a458: 50 e1 ff e1 bgeu r7,r1,800a3dc <_Heap_Free+0x118>
stats->max_free_blocks = stats->free_blocks;
800a45c: 59 61 00 3c sw (r11+60),r1
800a460: e3 ff ff df bi 800a3dc <_Heap_Free+0x118>
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
800a464: b4 ca 50 00 add r10,r6,r10
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800a468: 39 41 00 01 ori r1,r10,0x1
800a46c: 58 41 00 04 sw (r2+4),r1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800a470: 28 62 00 04 lw r2,(r3+4)
800a474: 34 01 ff fe mvi r1,-2
next_block->prev_size = size;
800a478: 58 6a 00 00 sw (r3+0),r10
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800a47c: a0 41 08 00 and r1,r2,r1
800a480: 58 61 00 04 sw (r3+4),r1
800a484: e3 ff ff d6 bi 800a3dc <_Heap_Free+0x118>
0800ae9c <_Heap_Get_information>:
void _Heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
800ae9c: 37 9c ff fc addi sp,sp,-4
800aea0: 5b 8b 00 04 sw (sp+4),r11
Heap_Block *the_block = the_heap->first_block;
800aea4: 28 26 00 20 lw r6,(r1+32)
Heap_Block *const end = the_heap->last_block;
800aea8: 28 29 00 24 lw r9,(r1+36)
memset(the_info, 0, sizeof(*the_info));
800aeac: 58 40 00 00 sw (r2+0),r0
800aeb0: 58 40 00 04 sw (r2+4),r0
800aeb4: 58 40 00 08 sw (r2+8),r0
800aeb8: 58 40 00 0c sw (r2+12),r0
800aebc: 58 40 00 10 sw (r2+16),r0
800aec0: 58 40 00 14 sw (r2+20),r0
while ( the_block != end ) {
800aec4: 44 c9 00 15 be r6,r9,800af18 <_Heap_Get_information+0x7c> <== NEVER TAKEN
800aec8: 28 c5 00 04 lw r5,(r6+4)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800aecc: 34 0a ff fe mvi r10,-2
800aed0: a0 aa 18 00 and r3,r5,r10
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800aed4: b4 c3 20 00 add r4,r6,r3
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
800aed8: 28 85 00 04 lw r5,(r4+4)
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
else
info = &the_info->Free;
800aedc: b8 40 08 00 mv r1,r2
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
800aee0: b8 80 30 00 mv r6,r4
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800aee4: 20 a7 00 01 andi r7,r5,0x1
uintptr_t const the_size = _Heap_Block_size(the_block);
Heap_Block *const next_block = _Heap_Block_at(the_block, the_size);
Heap_Information *info;
if ( _Heap_Is_prev_used(next_block) )
800aee8: 44 e0 00 02 be r7,r0,800aef0 <_Heap_Get_information+0x54>
info = &the_info->Used;
800aeec: 34 41 00 0c addi r1,r2,12
else
info = &the_info->Free;
info->number++;
800aef0: 28 28 00 00 lw r8,(r1+0)
info->total += the_size;
800aef4: 28 27 00 08 lw r7,(r1+8)
if ( info->largest < the_size )
800aef8: 28 2b 00 04 lw r11,(r1+4)
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
else
info = &the_info->Free;
info->number++;
800aefc: 35 08 00 01 addi r8,r8,1
info->total += the_size;
800af00: b4 e3 38 00 add r7,r7,r3
if ( _Heap_Is_prev_used(next_block) )
info = &the_info->Used;
else
info = &the_info->Free;
info->number++;
800af04: 58 28 00 00 sw (r1+0),r8
info->total += the_size;
800af08: 58 27 00 08 sw (r1+8),r7
if ( info->largest < the_size )
800af0c: 51 63 00 02 bgeu r11,r3,800af14 <_Heap_Get_information+0x78>
info->largest = the_size;
800af10: 58 23 00 04 sw (r1+4),r3
Heap_Block *the_block = the_heap->first_block;
Heap_Block *const end = the_heap->last_block;
memset(the_info, 0, sizeof(*the_info));
while ( the_block != end ) {
800af14: 5d 24 ff ef bne r9,r4,800aed0 <_Heap_Get_information+0x34>
if ( info->largest < the_size )
info->largest = the_size;
the_block = next_block;
}
}
800af18: 2b 8b 00 04 lw r11,(sp+4)
800af1c: 37 9c 00 04 addi sp,sp,4
800af20: c3 a0 00 00 ret
08012e60 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
8012e60: 37 9c ff f0 addi sp,sp,-16
8012e64: 5b 8b 00 10 sw (sp+16),r11
8012e68: 5b 8c 00 0c sw (sp+12),r12
8012e6c: 5b 8d 00 08 sw (sp+8),r13
8012e70: 5b 9d 00 04 sw (sp+4),ra
8012e74: b8 40 60 00 mv r12,r2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
8012e78: 28 22 00 10 lw r2,(r1+16)
8012e7c: b8 20 58 00 mv r11,r1
8012e80: b9 80 08 00 mv r1,r12
8012e84: b8 60 68 00 mv r13,r3
8012e88: fb ff fd 6c calli 8012438 <__umodsi3>
RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
8012e8c: 29 62 00 20 lw r2,(r11+32)
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
8012e90: 35 84 ff f8 addi r4,r12,-8
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
8012e94: c8 81 20 00 sub r4,r4,r1
Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
Heap_Block *next_block = NULL;
uintptr_t block_size = 0;
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
return false;
8012e98: 34 01 00 00 mvi r1,0
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
8012e9c: 54 44 00 10 bgu r2,r4,8012edc <_Heap_Size_of_alloc_area+0x7c>
8012ea0: 29 65 00 24 lw r5,(r11+36)
8012ea4: 54 85 00 0e bgu r4,r5,8012edc <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8012ea8: 28 86 00 04 lw r6,(r4+4)
8012eac: 34 03 ff fe mvi r3,-2
8012eb0: a0 66 18 00 and r3,r3,r6
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
8012eb4: b4 83 20 00 add r4,r4,r3
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
8012eb8: 54 44 00 09 bgu r2,r4,8012edc <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN
8012ebc: 54 85 00 08 bgu r4,r5,8012edc <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8012ec0: 28 82 00 04 lw r2,(r4+4)
8012ec4: 20 42 00 01 andi r2,r2,0x1
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
8012ec8: 44 40 00 05 be r2,r0,8012edc <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
8012ecc: c8 8c 20 00 sub r4,r4,r12
8012ed0: 34 84 00 04 addi r4,r4,4
8012ed4: 59 a4 00 00 sw (r13+0),r4
return true;
8012ed8: 34 01 00 01 mvi r1,1
}
8012edc: 2b 9d 00 04 lw ra,(sp+4)
8012ee0: 2b 8b 00 10 lw r11,(sp+16)
8012ee4: 2b 8c 00 0c lw r12,(sp+12)
8012ee8: 2b 8d 00 08 lw r13,(sp+8)
8012eec: 37 9c 00 10 addi sp,sp,16
8012ef0: c3 a0 00 00 ret
08004e7c <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
8004e7c: 37 9c ff 9c addi sp,sp,-100
8004e80: 5b 8b 00 50 sw (sp+80),r11
8004e84: 5b 8c 00 4c sw (sp+76),r12
8004e88: 5b 8d 00 48 sw (sp+72),r13
8004e8c: 5b 8e 00 44 sw (sp+68),r14
8004e90: 5b 8f 00 40 sw (sp+64),r15
8004e94: 5b 90 00 3c sw (sp+60),r16
8004e98: 5b 91 00 38 sw (sp+56),r17
8004e9c: 5b 92 00 34 sw (sp+52),r18
8004ea0: 5b 93 00 30 sw (sp+48),r19
8004ea4: 5b 94 00 2c sw (sp+44),r20
8004ea8: 5b 95 00 28 sw (sp+40),r21
8004eac: 5b 96 00 24 sw (sp+36),r22
8004eb0: 5b 97 00 20 sw (sp+32),r23
8004eb4: 5b 98 00 1c sw (sp+28),r24
8004eb8: 5b 99 00 18 sw (sp+24),r25
8004ebc: 5b 9b 00 14 sw (sp+20),fp
8004ec0: 5b 9d 00 10 sw (sp+16),ra
uintptr_t const min_block_size = heap->min_block_size;
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
8004ec4: 78 0f 08 00 mvhi r15,0x800
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
8004ec8: 20 63 00 ff andi r3,r3,0xff
8004ecc: b8 20 68 00 mv r13,r1
8004ed0: b8 40 98 00 mv r19,r2
uintptr_t const page_size = heap->page_size;
8004ed4: 28 35 00 10 lw r21,(r1+16)
uintptr_t const min_block_size = heap->min_block_size;
8004ed8: 28 36 00 14 lw r22,(r1+20)
Heap_Block *const first_block = heap->first_block;
8004edc: 28 34 00 20 lw r20,(r1+32)
Heap_Block *const last_block = heap->last_block;
8004ee0: 28 37 00 24 lw r23,(r1+36)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
8004ee4: 39 ef 4d d4 ori r15,r15,0x4dd4
8004ee8: 44 60 00 03 be r3,r0,8004ef4 <_Heap_Walk+0x78>
8004eec: 78 0f 08 00 mvhi r15,0x800
8004ef0: 39 ef 4d f8 ori r15,r15,0x4df8
if ( !_System_state_Is_up( _System_state_Get() ) ) {
8004ef4: 78 03 08 01 mvhi r3,0x801
8004ef8: 38 63 7a 68 ori r3,r3,0x7a68
8004efc: 28 69 00 00 lw r9,(r3+0)
8004f00: 34 07 00 03 mvi r7,3
return true;
8004f04: 34 03 00 01 mvi r3,1
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
if ( !_System_state_Is_up( _System_state_Get() ) ) {
8004f08: 45 27 00 15 be r9,r7,8004f5c <_Heap_Walk+0xe0>
block = next_block;
} while ( block != first_block );
return true;
}
8004f0c: b8 60 08 00 mv r1,r3
8004f10: 2b 9d 00 10 lw ra,(sp+16)
8004f14: 2b 8b 00 50 lw r11,(sp+80)
8004f18: 2b 8c 00 4c lw r12,(sp+76)
8004f1c: 2b 8d 00 48 lw r13,(sp+72)
8004f20: 2b 8e 00 44 lw r14,(sp+68)
8004f24: 2b 8f 00 40 lw r15,(sp+64)
8004f28: 2b 90 00 3c lw r16,(sp+60)
8004f2c: 2b 91 00 38 lw r17,(sp+56)
8004f30: 2b 92 00 34 lw r18,(sp+52)
8004f34: 2b 93 00 30 lw r19,(sp+48)
8004f38: 2b 94 00 2c lw r20,(sp+44)
8004f3c: 2b 95 00 28 lw r21,(sp+40)
8004f40: 2b 96 00 24 lw r22,(sp+36)
8004f44: 2b 97 00 20 lw r23,(sp+32)
8004f48: 2b 98 00 1c lw r24,(sp+28)
8004f4c: 2b 99 00 18 lw r25,(sp+24)
8004f50: 2b 9b 00 14 lw fp,(sp+20)
8004f54: 37 9c 00 64 addi sp,sp,100
8004f58: c3 a0 00 00 ret
Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
(*printer)(
8004f5c: 29 a2 00 08 lw r2,(r13+8)
8004f60: 29 a1 00 0c lw r1,(r13+12)
8004f64: 29 a6 00 18 lw r6,(r13+24)
8004f68: 29 a7 00 1c lw r7,(r13+28)
8004f6c: 78 03 08 01 mvhi r3,0x801
8004f70: 5b 82 00 08 sw (sp+8),r2
8004f74: 5b 81 00 0c sw (sp+12),r1
8004f78: 5b 97 00 04 sw (sp+4),r23
8004f7c: ba 60 08 00 mv r1,r19
8004f80: 34 02 00 00 mvi r2,0
8004f84: 38 63 48 30 ori r3,r3,0x4830
8004f88: ba a0 20 00 mv r4,r21
8004f8c: ba c0 28 00 mv r5,r22
8004f90: ba 80 40 00 mv r8,r20
8004f94: d9 e0 00 00 call r15
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
8004f98: 46 a0 00 26 be r21,r0,8005030 <_Heap_Walk+0x1b4> <== NEVER TAKEN
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
8004f9c: 22 ab 00 07 andi r11,r21,0x7
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
8004fa0: 5d 60 00 2b bne r11,r0,800504c <_Heap_Walk+0x1d0> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8004fa4: ba c0 08 00 mv r1,r22
8004fa8: ba a0 10 00 mv r2,r21
8004fac: fb ff ee 91 calli 80009f0 <__umodsi3>
8004fb0: b8 20 60 00 mv r12,r1
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
8004fb4: 5c 2b 00 2e bne r1,r11,800506c <_Heap_Walk+0x1f0> <== NEVER TAKEN
8004fb8: 36 81 00 08 addi r1,r20,8
8004fbc: ba a0 10 00 mv r2,r21
8004fc0: fb ff ee 8c calli 80009f0 <__umodsi3>
8004fc4: b8 20 18 00 mv r3,r1
);
return false;
}
if (
8004fc8: 5c 2c 00 31 bne r1,r12,800508c <_Heap_Walk+0x210> <== NEVER TAKEN
block = next_block;
} while ( block != first_block );
return true;
}
8004fcc: 2a 8c 00 04 lw r12,(r20+4)
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8004fd0: 21 81 00 01 andi r1,r12,0x1
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
8004fd4: 44 23 00 fe be r1,r3,80053cc <_Heap_Walk+0x550> <== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8004fd8: 2a e2 00 04 lw r2,(r23+4)
8004fdc: 34 01 ff fe mvi r1,-2
8004fe0: a0 22 08 00 and r1,r1,r2
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
8004fe4: b6 e1 08 00 add r1,r23,r1
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8004fe8: 28 22 00 04 lw r2,(r1+4)
8004fec: 20 42 00 01 andi r2,r2,0x1
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
8004ff0: 44 43 00 09 be r2,r3,8005014 <_Heap_Walk+0x198> <== NEVER TAKEN
);
return false;
}
if (
8004ff4: 46 81 00 2e be r20,r1,80050ac <_Heap_Walk+0x230> <== ALWAYS TAKEN
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
8004ff8: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED
8004ffc: 38 63 49 98 ori r3,r3,0x4998 <== NOT EXECUTED
8005000: ba 60 08 00 mv r1,r19 <== NOT EXECUTED
8005004: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8005008: d9 e0 00 00 call r15 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
800500c: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8005010: e3 ff ff bf bi 8004f0c <_Heap_Walk+0x90> <== NOT EXECUTED
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
8005014: 78 03 08 01 mvhi r3,0x801
8005018: 38 63 49 80 ori r3,r3,0x4980
800501c: ba 60 08 00 mv r1,r19
8005020: 34 02 00 01 mvi r2,1
8005024: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005028: 34 03 00 00 mvi r3,0
800502c: e3 ff ff b8 bi 8004f0c <_Heap_Walk+0x90>
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
(*printer)( source, true, "page size is zero\n" );
8005030: 78 03 08 01 mvhi r3,0x801
8005034: 38 63 48 c4 ori r3,r3,0x48c4
8005038: ba 60 08 00 mv r1,r19
800503c: 34 02 00 01 mvi r2,1
8005040: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005044: 34 03 00 00 mvi r3,0
8005048: e3 ff ff b1 bi 8004f0c <_Heap_Walk+0x90>
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
800504c: 78 03 08 01 mvhi r3,0x801
8005050: 38 63 48 d8 ori r3,r3,0x48d8
8005054: ba 60 08 00 mv r1,r19
8005058: 34 02 00 01 mvi r2,1
800505c: ba a0 20 00 mv r4,r21
8005060: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005064: 34 03 00 00 mvi r3,0
8005068: e3 ff ff a9 bi 8004f0c <_Heap_Walk+0x90>
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
800506c: 78 03 08 01 mvhi r3,0x801
8005070: 38 63 48 f8 ori r3,r3,0x48f8
8005074: ba 60 08 00 mv r1,r19
8005078: 34 02 00 01 mvi r2,1
800507c: ba c0 20 00 mv r4,r22
8005080: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005084: 34 03 00 00 mvi r3,0
8005088: e3 ff ff a1 bi 8004f0c <_Heap_Walk+0x90>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
800508c: 78 03 08 01 mvhi r3,0x801
8005090: 38 63 49 1c ori r3,r3,0x491c
8005094: ba 60 08 00 mv r1,r19
8005098: 34 02 00 01 mvi r2,1
800509c: ba 80 20 00 mv r4,r20
80050a0: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80050a4: 34 03 00 00 mvi r3,0
80050a8: e3 ff ff 99 bi 8004f0c <_Heap_Walk+0x90>
block = next_block;
} while ( block != first_block );
return true;
}
80050ac: 29 ab 00 08 lw r11,(r13+8)
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
80050b0: 29 b2 00 10 lw r18,(r13+16)
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
80050b4: 45 ab 00 2f be r13,r11,8005170 <_Heap_Walk+0x2f4>
block = next_block;
} while ( block != first_block );
return true;
}
80050b8: 29 ae 00 20 lw r14,(r13+32)
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
80050bc: 55 cb 00 dd bgu r14,r11,8005430 <_Heap_Walk+0x5b4> <== NEVER TAKEN
80050c0: 29 b8 00 24 lw r24,(r13+36)
80050c4: 55 78 00 db bgu r11,r24,8005430 <_Heap_Walk+0x5b4> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
80050c8: 35 61 00 08 addi r1,r11,8
80050cc: ba 40 10 00 mv r2,r18
80050d0: fb ff ee 48 calli 80009f0 <__umodsi3>
);
return false;
}
if (
80050d4: 5c 20 00 df bne r1,r0,8005450 <_Heap_Walk+0x5d4> <== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
80050d8: 29 63 00 04 lw r3,(r11+4)
80050dc: 34 02 ff fe mvi r2,-2
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
80050e0: b9 60 80 00 mv r16,r11
80050e4: a0 43 10 00 and r2,r2,r3
block = next_block;
} while ( block != first_block );
return true;
}
80050e8: b5 62 10 00 add r2,r11,r2
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
80050ec: 28 42 00 04 lw r2,(r2+4)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
80050f0: b9 a0 18 00 mv r3,r13
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
80050f4: 34 11 ff fe mvi r17,-2
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
80050f8: 20 42 00 01 andi r2,r2,0x1
80050fc: 44 41 00 12 be r2,r1,8005144 <_Heap_Walk+0x2c8> <== ALWAYS TAKEN
8005100: e0 00 00 dc bi 8005470 <_Heap_Walk+0x5f4> <== NOT EXECUTED
return false;
}
prev_block = free_block;
free_block = free_block->next;
8005104: 29 6b 00 08 lw r11,(r11+8)
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
8005108: 45 ab 00 1b be r13,r11,8005174 <_Heap_Walk+0x2f8>
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800510c: 55 cb 00 c9 bgu r14,r11,8005430 <_Heap_Walk+0x5b4>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8005110: 35 61 00 08 addi r1,r11,8
8005114: ba 40 10 00 mv r2,r18
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
8005118: 55 78 00 c6 bgu r11,r24,8005430 <_Heap_Walk+0x5b4> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
800511c: fb ff ee 35 calli 80009f0 <__umodsi3>
);
return false;
}
if (
8005120: 5c 20 00 cc bne r1,r0,8005450 <_Heap_Walk+0x5d4>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8005124: 29 64 00 04 lw r4,(r11+4)
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
8005128: ba 00 18 00 mv r3,r16
800512c: b9 60 80 00 mv r16,r11
8005130: a2 24 20 00 and r4,r17,r4
block = next_block;
} while ( block != first_block );
return true;
}
8005134: b4 8b 20 00 add r4,r4,r11
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8005138: 28 84 00 04 lw r4,(r4+4)
800513c: 20 84 00 01 andi r4,r4,0x1
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
8005140: 5c 81 00 cc bne r4,r1,8005470 <_Heap_Walk+0x5f4>
);
return false;
}
if ( free_block->prev != prev_block ) {
8005144: 29 67 00 0c lw r7,(r11+12)
8005148: 44 e3 ff ef be r7,r3,8005104 <_Heap_Walk+0x288>
(*printer)(
800514c: 78 03 08 01 mvhi r3,0x801
8005150: 38 63 4a 34 ori r3,r3,0x4a34
8005154: ba 60 08 00 mv r1,r19
8005158: 34 02 00 01 mvi r2,1
800515c: b9 60 20 00 mv r4,r11
8005160: b8 e0 28 00 mv r5,r7
8005164: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005168: 34 03 00 00 mvi r3,0
800516c: e3 ff ff 68 bi 8004f0c <_Heap_Walk+0x90>
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
8005170: 29 ae 00 20 lw r14,(r13+32)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8005174: 78 01 08 01 mvhi r1,0x801
8005178: 5b 81 00 54 sw (sp+84),r1
800517c: 78 01 08 01 mvhi r1,0x801
8005180: 5b 81 00 58 sw (sp+88),r1
8005184: 78 01 08 01 mvhi r1,0x801
8005188: 5b 81 00 5c sw (sp+92),r1
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
800518c: 78 01 08 01 mvhi r1,0x801
8005190: 5b 81 00 60 sw (sp+96),r1
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
8005194: 78 01 08 01 mvhi r1,0x801
8005198: 5b 81 00 64 sw (sp+100),r1
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
800519c: 2b 81 00 54 lw r1,(sp+84)
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
80051a0: 78 1b 08 01 mvhi fp,0x801
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
(*printer)(
80051a4: 78 19 08 01 mvhi r25,0x801
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
80051a8: 38 21 47 f8 ori r1,r1,0x47f8
80051ac: 5b 81 00 54 sw (sp+84),r1
80051b0: 2b 81 00 58 lw r1,(sp+88)
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
80051b4: 78 18 08 01 mvhi r24,0x801
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
80051b8: ba 80 88 00 mv r17,r20
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
80051bc: 38 21 48 14 ori r1,r1,0x4814
80051c0: 5b 81 00 58 sw (sp+88),r1
80051c4: 2b 81 00 5c lw r1,(sp+92)
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
80051c8: 3b 7b 4b e4 ori fp,fp,0x4be4
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
(*printer)(
80051cc: 3b 39 4b cc ori r25,r25,0x4bcc
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
80051d0: 38 21 4b 28 ori r1,r1,0x4b28
80051d4: 5b 81 00 5c sw (sp+92),r1
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
80051d8: 2b 81 00 60 lw r1,(sp+96)
80051dc: 3b 18 4b 98 ori r24,r24,0x4b98
80051e0: 38 21 48 24 ori r1,r1,0x4824
80051e4: 5b 81 00 60 sw (sp+96),r1
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
80051e8: 2b 81 00 64 lw r1,(sp+100)
80051ec: 38 21 48 08 ori r1,r1,0x4808
80051f0: 5b 81 00 64 sw (sp+100),r1
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
80051f4: 34 01 ff fe mvi r1,-2
80051f8: a1 81 90 00 and r18,r12,r1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
80051fc: b6 51 80 00 add r16,r18,r17
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
8005200: 55 d0 00 7a bgu r14,r16,80053e8 <_Heap_Walk+0x56c> <== NEVER TAKEN
8005204: 29 a4 00 24 lw r4,(r13+36)
8005208: 56 04 00 78 bgu r16,r4,80053e8 <_Heap_Walk+0x56c>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
800520c: ba 40 08 00 mv r1,r18
8005210: ba a0 10 00 mv r2,r21
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
bool const prev_used = _Heap_Is_prev_used( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
8005214: fe 37 58 00 cmpne r11,r17,r23
8005218: fb ff ed f6 calli 80009f0 <__umodsi3>
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
800521c: 44 20 00 02 be r1,r0,8005224 <_Heap_Walk+0x3a8>
8005220: 5d 60 00 15 bne r11,r0,8005274 <_Heap_Walk+0x3f8>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
8005224: 52 56 00 02 bgeu r18,r22,800522c <_Heap_Walk+0x3b0>
8005228: 5d 60 00 1c bne r11,r0,8005298 <_Heap_Walk+0x41c> <== ALWAYS TAKEN
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
800522c: 56 11 00 02 bgu r16,r17,8005234 <_Heap_Walk+0x3b8>
8005230: 5d 60 00 77 bne r11,r0,800540c <_Heap_Walk+0x590>
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8005234: 2a 06 00 04 lw r6,(r16+4)
8005238: 21 8c 00 01 andi r12,r12,0x1
800523c: 20 c6 00 01 andi r6,r6,0x1
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
8005240: 44 c0 00 28 be r6,r0,80052e0 <_Heap_Walk+0x464>
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
8005244: 45 80 00 1f be r12,r0,80052c0 <_Heap_Walk+0x444>
(*printer)(
8005248: ba 60 08 00 mv r1,r19
800524c: 34 02 00 00 mvi r2,0
8005250: bb 20 18 00 mv r3,r25
8005254: ba 20 20 00 mv r4,r17
8005258: ba 40 28 00 mv r5,r18
800525c: d9 e0 00 00 call r15
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
8005260: 46 90 00 43 be r20,r16,800536c <_Heap_Walk+0x4f0>
8005264: 2a 0c 00 04 lw r12,(r16+4)
8005268: 29 ae 00 20 lw r14,(r13+32)
800526c: ba 00 88 00 mv r17,r16
8005270: e3 ff ff e1 bi 80051f4 <_Heap_Walk+0x378>
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
8005274: 78 03 08 01 mvhi r3,0x801
8005278: 38 63 4a 98 ori r3,r3,0x4a98
800527c: ba 60 08 00 mv r1,r19
8005280: 34 02 00 01 mvi r2,1
8005284: ba 20 20 00 mv r4,r17
8005288: ba 40 28 00 mv r5,r18
800528c: d9 e0 00 00 call r15
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
8005290: 34 03 00 00 mvi r3,0
8005294: e3 ff ff 1e bi 8004f0c <_Heap_Walk+0x90>
}
if ( block_size < min_block_size && is_not_last_block ) {
(*printer)(
8005298: 78 03 08 01 mvhi r3,0x801
800529c: 38 63 4a c8 ori r3,r3,0x4ac8
80052a0: ba 60 08 00 mv r1,r19
80052a4: 34 02 00 01 mvi r2,1
80052a8: ba 20 20 00 mv r4,r17
80052ac: ba 40 28 00 mv r5,r18
80052b0: ba c0 30 00 mv r6,r22
80052b4: d9 e0 00 00 call r15
block,
block_size,
min_block_size
);
return false;
80052b8: 34 03 00 00 mvi r3,0
80052bc: e3 ff ff 14 bi 8004f0c <_Heap_Walk+0x90>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
80052c0: 2a 26 00 00 lw r6,(r17+0)
80052c4: ba 20 20 00 mv r4,r17
80052c8: ba 60 08 00 mv r1,r19
80052cc: 34 02 00 00 mvi r2,0
80052d0: bb 60 18 00 mv r3,fp
80052d4: ba 40 28 00 mv r5,r18
80052d8: d9 e0 00 00 call r15
80052dc: e3 ff ff e1 bi 8005260 <_Heap_Walk+0x3e4>
false,
"block 0x%08x: size %u, prev 0x%08x%s, next 0x%08x%s\n",
block,
block_size,
block->prev,
block->prev == first_free_block ?
80052e0: 2a 26 00 0c lw r6,(r17+12)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
80052e4: 29 a4 00 08 lw r4,(r13+8)
block = next_block;
} while ( block != first_block );
return true;
}
80052e8: 29 a5 00 0c lw r5,(r13+12)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
80052ec: 2b 87 00 54 lw r7,(sp+84)
80052f0: 44 86 00 03 be r4,r6,80052fc <_Heap_Walk+0x480>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
80052f4: bb 00 38 00 mv r7,r24
80052f8: 45 a6 00 29 be r13,r6,800539c <_Heap_Walk+0x520>
block->next,
block->next == last_free_block ?
80052fc: 2a 28 00 08 lw r8,(r17+8)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8005300: 2b 84 00 58 lw r4,(sp+88)
8005304: 44 a8 00 03 be r5,r8,8005310 <_Heap_Walk+0x494>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
8005308: bb 00 20 00 mv r4,r24
800530c: 45 a8 00 26 be r13,r8,80053a4 <_Heap_Walk+0x528>
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8005310: 2b 83 00 5c lw r3,(sp+92)
8005314: 5b 84 00 04 sw (sp+4),r4
8005318: ba 60 08 00 mv r1,r19
800531c: 34 02 00 00 mvi r2,0
8005320: ba 20 20 00 mv r4,r17
8005324: ba 40 28 00 mv r5,r18
8005328: d9 e0 00 00 call r15
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
800532c: 2a 06 00 00 lw r6,(r16+0)
8005330: 5e 46 00 11 bne r18,r6,8005374 <_Heap_Walk+0x4f8>
);
return false;
}
if ( !prev_used ) {
8005334: 45 80 00 1e be r12,r0,80053ac <_Heap_Walk+0x530>
block = next_block;
} while ( block != first_block );
return true;
}
8005338: 29 a5 00 08 lw r5,(r13+8)
)
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
800533c: 45 a5 00 04 be r13,r5,800534c <_Heap_Walk+0x4d0> <== NEVER TAKEN
if ( free_block == block ) {
8005340: 46 25 ff c8 be r17,r5,8005260 <_Heap_Walk+0x3e4>
return true;
}
free_block = free_block->next;
8005344: 28 a5 00 08 lw r5,(r5+8)
)
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
8005348: 5d a5 ff fe bne r13,r5,8005340 <_Heap_Walk+0x4c4>
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
800534c: 78 03 08 01 mvhi r3,0x801
8005350: 38 63 4c 0c ori r3,r3,0x4c0c
8005354: ba 60 08 00 mv r1,r19
8005358: 34 02 00 01 mvi r2,1
800535c: ba 20 20 00 mv r4,r17
8005360: d9 e0 00 00 call r15
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
8005364: 34 03 00 00 mvi r3,0
8005368: e3 ff fe e9 bi 8004f0c <_Heap_Walk+0x90>
}
block = next_block;
} while ( block != first_block );
return true;
800536c: 34 03 00 01 mvi r3,1
8005370: e3 ff fe e7 bi 8004f0c <_Heap_Walk+0x90>
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
8005374: 78 03 08 01 mvhi r3,0x801
8005378: 38 63 4b 60 ori r3,r3,0x4b60
800537c: ba 60 08 00 mv r1,r19
8005380: 34 02 00 01 mvi r2,1
8005384: ba 20 20 00 mv r4,r17
8005388: ba 40 28 00 mv r5,r18
800538c: ba 00 38 00 mv r7,r16
8005390: d9 e0 00 00 call r15
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
8005394: 34 03 00 00 mvi r3,0
8005398: e3 ff fe dd bi 8004f0c <_Heap_Walk+0x90>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
800539c: 2b 87 00 64 lw r7,(sp+100)
80053a0: e3 ff ff d7 bi 80052fc <_Heap_Walk+0x480>
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
80053a4: 2b 84 00 60 lw r4,(sp+96)
80053a8: e3 ff ff da bi 8005310 <_Heap_Walk+0x494>
return false;
}
if ( !prev_used ) {
(*printer)(
80053ac: 78 03 08 01 mvhi r3,0x801
80053b0: 38 63 4b 9c ori r3,r3,0x4b9c
80053b4: ba 60 08 00 mv r1,r19
80053b8: 34 02 00 01 mvi r2,1
80053bc: ba 20 20 00 mv r4,r17
80053c0: d9 e0 00 00 call r15
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
80053c4: 34 03 00 00 mvi r3,0
80053c8: e3 ff fe d1 bi 8004f0c <_Heap_Walk+0x90>
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
80053cc: 78 03 08 01 mvhi r3,0x801
80053d0: 38 63 49 50 ori r3,r3,0x4950
80053d4: ba 60 08 00 mv r1,r19
80053d8: 34 02 00 01 mvi r2,1
80053dc: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
80053e0: 34 03 00 00 mvi r3,0
80053e4: e3 ff fe ca bi 8004f0c <_Heap_Walk+0x90>
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
80053e8: 78 03 08 01 mvhi r3,0x801
80053ec: 38 63 4a 68 ori r3,r3,0x4a68
80053f0: ba 60 08 00 mv r1,r19
80053f4: 34 02 00 01 mvi r2,1
80053f8: ba 20 20 00 mv r4,r17
80053fc: ba 00 28 00 mv r5,r16
8005400: d9 e0 00 00 call r15
"block 0x%08x: next block 0x%08x not in heap\n",
block,
next_block
);
return false;
8005404: 34 03 00 00 mvi r3,0
8005408: e3 ff fe c1 bi 8004f0c <_Heap_Walk+0x90>
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
800540c: 78 03 08 01 mvhi r3,0x801
8005410: 38 63 4a f4 ori r3,r3,0x4af4
8005414: ba 60 08 00 mv r1,r19
8005418: 34 02 00 01 mvi r2,1
800541c: ba 20 20 00 mv r4,r17
8005420: ba 00 28 00 mv r5,r16
8005424: d9 e0 00 00 call r15
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
8005428: 34 03 00 00 mvi r3,0
800542c: e3 ff fe b8 bi 8004f0c <_Heap_Walk+0x90>
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
(*printer)(
8005430: 78 03 08 01 mvhi r3,0x801
8005434: 38 63 49 c8 ori r3,r3,0x49c8
8005438: ba 60 08 00 mv r1,r19
800543c: 34 02 00 01 mvi r2,1
8005440: b9 60 20 00 mv r4,r11
8005444: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005448: 34 03 00 00 mvi r3,0
800544c: e3 ff fe b0 bi 8004f0c <_Heap_Walk+0x90>
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
8005450: 78 03 08 01 mvhi r3,0x801
8005454: 38 63 49 e8 ori r3,r3,0x49e8
8005458: ba 60 08 00 mv r1,r19
800545c: 34 02 00 01 mvi r2,1
8005460: b9 60 20 00 mv r4,r11
8005464: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005468: 34 03 00 00 mvi r3,0
800546c: e3 ff fe a8 bi 8004f0c <_Heap_Walk+0x90>
return false;
}
if ( _Heap_Is_used( free_block ) ) {
(*printer)(
8005470: 78 03 08 01 mvhi r3,0x801
8005474: 38 63 4a 18 ori r3,r3,0x4a18
8005478: ba 60 08 00 mv r1,r19
800547c: 34 02 00 01 mvi r2,1
8005480: b9 60 20 00 mv r4,r11
8005484: d9 e0 00 00 call r15
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8005488: 34 03 00 00 mvi r3,0
800548c: e3 ff fe a0 bi 8004f0c <_Heap_Walk+0x90>
08003584 <_IO_Initialize_all_drivers>:
*
* Output Parameters: NONE
*/
void _IO_Initialize_all_drivers( void )
{
8003584: 37 9c ff f4 addi sp,sp,-12
8003588: 5b 8b 00 0c sw (sp+12),r11
800358c: 5b 8c 00 08 sw (sp+8),r12
8003590: 5b 9d 00 04 sw (sp+4),ra
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
8003594: 78 0c 08 01 mvhi r12,0x801
8003598: 39 8c 51 a8 ori r12,r12,0x51a8
800359c: 29 81 00 00 lw r1,(r12+0)
80035a0: 44 20 00 09 be r1,r0,80035c4 <_IO_Initialize_all_drivers+0x40><== NEVER TAKEN
80035a4: 34 0b 00 00 mvi r11,0
(void) rtems_io_initialize( major, 0, NULL );
80035a8: b9 60 08 00 mv r1,r11
80035ac: 34 02 00 00 mvi r2,0
80035b0: 34 03 00 00 mvi r3,0
80035b4: f8 00 19 f7 calli 8009d90 <rtems_io_initialize>
void _IO_Initialize_all_drivers( void )
{
rtems_device_major_number major;
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
80035b8: 29 81 00 00 lw r1,(r12+0)
80035bc: 35 6b 00 01 addi r11,r11,1
80035c0: 54 2b ff fa bgu r1,r11,80035a8 <_IO_Initialize_all_drivers+0x24>
(void) rtems_io_initialize( major, 0, NULL );
}
80035c4: 2b 9d 00 04 lw ra,(sp+4)
80035c8: 2b 8b 00 0c lw r11,(sp+12)
80035cc: 2b 8c 00 08 lw r12,(sp+8)
80035d0: 37 9c 00 0c addi sp,sp,12
80035d4: c3 a0 00 00 ret
08003464 <_IO_Manager_initialization>:
* workspace.
*
*/
void _IO_Manager_initialization(void)
{
8003464: 37 9c ff e8 addi sp,sp,-24
8003468: 5b 8b 00 18 sw (sp+24),r11
800346c: 5b 8c 00 14 sw (sp+20),r12
8003470: 5b 8d 00 10 sw (sp+16),r13
8003474: 5b 8e 00 0c sw (sp+12),r14
8003478: 5b 8f 00 08 sw (sp+8),r15
800347c: 5b 9d 00 04 sw (sp+4),ra
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = Configuration.Device_driver_table;
8003480: 78 01 08 01 mvhi r1,0x801
8003484: 38 21 40 c4 ori r1,r1,0x40c4
drivers_in_table = Configuration.number_of_device_drivers;
8003488: 28 2b 00 34 lw r11,(r1+52)
number_of_drivers = Configuration.maximum_drivers;
800348c: 28 2e 00 30 lw r14,(r1+48)
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = Configuration.Device_driver_table;
8003490: 28 2d 00 38 lw r13,(r1+56)
/*
* If the user claims there are less drivers than are actually in
* the table, then let's just go with the table's count.
*/
if ( number_of_drivers <= drivers_in_table )
8003494: 51 6e 00 2e bgeu r11,r14,800354c <_IO_Manager_initialization+0xe8>
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
8003498: b5 ce 60 00 add r12,r14,r14
800349c: b5 8e 60 00 add r12,r12,r14
80034a0: b5 8c 60 00 add r12,r12,r12
80034a4: b5 8c 60 00 add r12,r12,r12
80034a8: b5 8c 60 00 add r12,r12,r12
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
80034ac: b9 80 08 00 mv r1,r12
80034b0: f8 00 0e bb calli 8006f9c <_Workspace_Allocate_or_fatal_error>
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
80034b4: 78 04 08 01 mvhi r4,0x801
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
80034b8: 78 0f 08 01 mvhi r15,0x801
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
80034bc: 38 84 51 a8 ori r4,r4,0x51a8
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
80034c0: 39 ef 51 ac ori r15,r15,0x51ac
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
80034c4: 34 02 00 00 mvi r2,0
80034c8: b9 80 18 00 mv r3,r12
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
80034cc: 58 8e 00 00 sw (r4+0),r14
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
80034d0: 59 e1 00 00 sw (r15+0),r1
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
80034d4: f8 00 29 33 calli 800d9a0 <memset>
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
80034d8: 45 60 00 15 be r11,r0,800352c <_IO_Manager_initialization+0xc8><== NEVER TAKEN
80034dc: 29 e5 00 00 lw r5,(r15+0)
80034e0: 34 03 00 00 mvi r3,0
80034e4: 34 04 00 00 mvi r4,0
* registration. The driver table is now allocated in the
* workspace.
*
*/
void _IO_Manager_initialization(void)
80034e8: b5 a3 08 00 add r1,r13,r3
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
80034ec: 28 26 00 00 lw r6,(r1+0)
* registration. The driver table is now allocated in the
* workspace.
*
*/
void _IO_Manager_initialization(void)
80034f0: b4 a3 10 00 add r2,r5,r3
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
80034f4: 34 84 00 01 addi r4,r4,1
_IO_Driver_address_table[index] = driver_table[index];
80034f8: 58 46 00 00 sw (r2+0),r6
80034fc: 28 26 00 04 lw r6,(r1+4)
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
8003500: 34 63 00 18 addi r3,r3,24
_IO_Driver_address_table[index] = driver_table[index];
8003504: 58 46 00 04 sw (r2+4),r6
8003508: 28 26 00 08 lw r6,(r1+8)
800350c: 58 46 00 08 sw (r2+8),r6
8003510: 28 26 00 0c lw r6,(r1+12)
8003514: 58 46 00 0c sw (r2+12),r6
8003518: 28 26 00 10 lw r6,(r1+16)
800351c: 58 46 00 10 sw (r2+16),r6
8003520: 28 21 00 14 lw r1,(r1+20)
8003524: 58 41 00 14 sw (r2+20),r1
memset(
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
8003528: 55 64 ff f0 bgu r11,r4,80034e8 <_IO_Manager_initialization+0x84>
_IO_Driver_address_table[index] = driver_table[index];
}
800352c: 2b 9d 00 04 lw ra,(sp+4)
8003530: 2b 8b 00 18 lw r11,(sp+24)
8003534: 2b 8c 00 14 lw r12,(sp+20)
8003538: 2b 8d 00 10 lw r13,(sp+16)
800353c: 2b 8e 00 0c lw r14,(sp+12)
8003540: 2b 8f 00 08 lw r15,(sp+8)
8003544: 37 9c 00 18 addi sp,sp,24
8003548: c3 a0 00 00 ret
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
800354c: 78 02 08 01 mvhi r2,0x801
_IO_Number_of_drivers = number_of_drivers;
8003550: 78 01 08 01 mvhi r1,0x801
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
8003554: 38 42 51 ac ori r2,r2,0x51ac
_IO_Number_of_drivers = number_of_drivers;
8003558: 38 21 51 a8 ori r1,r1,0x51a8
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
800355c: 58 4d 00 00 sw (r2+0),r13
_IO_Number_of_drivers = number_of_drivers;
8003560: 58 2b 00 00 sw (r1+0),r11
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
}
8003564: 2b 9d 00 04 lw ra,(sp+4)
8003568: 2b 8b 00 18 lw r11,(sp+24)
800356c: 2b 8c 00 14 lw r12,(sp+20)
8003570: 2b 8d 00 10 lw r13,(sp+16)
8003574: 2b 8e 00 0c lw r14,(sp+12)
8003578: 2b 8f 00 08 lw r15,(sp+8)
800357c: 37 9c 00 18 addi sp,sp,24
8003580: c3 a0 00 00 ret
080044d0 <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
80044d0: 37 9c ff ec addi sp,sp,-20
80044d4: 5b 8b 00 14 sw (sp+20),r11
80044d8: 5b 8c 00 10 sw (sp+16),r12
80044dc: 5b 8d 00 0c sw (sp+12),r13
80044e0: 5b 8e 00 08 sw (sp+8),r14
80044e4: 5b 9d 00 04 sw (sp+4),ra
80044e8: b8 20 58 00 mv r11,r1
* If the application is using the optional manager stubs and
* still attempts to create the object, the information block
* should be all zeroed out because it is in the BSS. So let's
* check that code for this manager is even present.
*/
if ( information->size == 0 )
80044ec: 28 21 00 18 lw r1,(r1+24)
return NULL;
80044f0: 34 0c 00 00 mvi r12,0
* If the application is using the optional manager stubs and
* still attempts to create the object, the information block
* should be all zeroed out because it is in the BSS. So let's
* check that code for this manager is even present.
*/
if ( information->size == 0 )
80044f4: 5c 20 00 09 bne r1,r0,8004518 <_Objects_Allocate+0x48> <== ALWAYS TAKEN
);
}
#endif
return the_object;
}
80044f8: b9 80 08 00 mv r1,r12
80044fc: 2b 9d 00 04 lw ra,(sp+4)
8004500: 2b 8b 00 14 lw r11,(sp+20)
8004504: 2b 8c 00 10 lw r12,(sp+16)
8004508: 2b 8d 00 0c lw r13,(sp+12)
800450c: 2b 8e 00 08 lw r14,(sp+8)
8004510: 37 9c 00 14 addi sp,sp,20
8004514: c3 a0 00 00 ret
/*
* OK. The manager should be initialized and configured to have objects.
* With any luck, it is safe to attempt to allocate an object.
*/
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
8004518: 35 6d 00 20 addi r13,r11,32
800451c: b9 a0 08 00 mv r1,r13
8004520: fb ff fc fa calli 8003908 <_Chain_Get>
8004524: b8 20 60 00 mv r12,r1
if ( information->auto_extend ) {
8004528: 41 61 00 12 lbu r1,(r11+18)
/*
* OK. The manager should be initialized and configured to have objects.
* With any luck, it is safe to attempt to allocate an object.
*/
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
800452c: b9 80 70 00 mv r14,r12
if ( information->auto_extend ) {
8004530: 44 20 ff f2 be r1,r0,80044f8 <_Objects_Allocate+0x28>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
8004534: 45 80 00 18 be r12,r0,8004594 <_Objects_Allocate+0xc4>
}
if ( the_object ) {
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
8004538: 2d 83 00 0a lhu r3,(r12+10)
800453c: 2d 61 00 0a lhu r1,(r11+10)
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
8004540: 2d 62 00 14 lhu r2,(r11+20)
8004544: c8 61 08 00 sub r1,r3,r1
8004548: f8 00 37 ac calli 80123f8 <__udivsi3>
information->inactive_per_block[ block ]--;
800454c: 29 62 00 30 lw r2,(r11+48)
8004550: b4 21 08 00 add r1,r1,r1
8004554: b4 21 08 00 add r1,r1,r1
8004558: b4 41 08 00 add r1,r2,r1
800455c: 28 22 00 00 lw r2,(r1+0)
information->inactive--;
8004560: 2d 63 00 2c lhu r3,(r11+44)
block = (uint32_t) _Objects_Get_index( the_object->id ) -
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
information->inactive_per_block[ block ]--;
8004564: 34 42 ff ff addi r2,r2,-1
8004568: 58 22 00 00 sw (r1+0),r2
information->inactive--;
800456c: 34 61 ff ff addi r1,r3,-1
8004570: 0d 61 00 2c sh (r11+44),r1
);
}
#endif
return the_object;
}
8004574: b9 80 08 00 mv r1,r12
8004578: 2b 9d 00 04 lw ra,(sp+4)
800457c: 2b 8b 00 14 lw r11,(sp+20)
8004580: 2b 8c 00 10 lw r12,(sp+16)
8004584: 2b 8d 00 0c lw r13,(sp+12)
8004588: 2b 8e 00 08 lw r14,(sp+8)
800458c: 37 9c 00 14 addi sp,sp,20
8004590: c3 a0 00 00 ret
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
_Objects_Extend_information( information );
8004594: b9 60 08 00 mv r1,r11
8004598: f8 00 00 06 calli 80045b0 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
800459c: b9 a0 08 00 mv r1,r13
80045a0: fb ff fc da calli 8003908 <_Chain_Get>
80045a4: b8 20 60 00 mv r12,r1
}
if ( the_object ) {
80045a8: 44 2e ff d4 be r1,r14,80044f8 <_Objects_Allocate+0x28>
80045ac: e3 ff ff e3 bi 8004538 <_Objects_Allocate+0x68>
080045b0 <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
80045b0: 37 9c ff c8 addi sp,sp,-56
80045b4: 5b 8b 00 2c sw (sp+44),r11
80045b8: 5b 8c 00 28 sw (sp+40),r12
80045bc: 5b 8d 00 24 sw (sp+36),r13
80045c0: 5b 8e 00 20 sw (sp+32),r14
80045c4: 5b 8f 00 1c sw (sp+28),r15
80045c8: 5b 90 00 18 sw (sp+24),r16
80045cc: 5b 91 00 14 sw (sp+20),r17
80045d0: 5b 92 00 10 sw (sp+16),r18
80045d4: 5b 93 00 0c sw (sp+12),r19
80045d8: 5b 94 00 08 sw (sp+8),r20
80045dc: 5b 9d 00 04 sw (sp+4),ra
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
80045e0: 28 2c 00 34 lw r12,(r1+52)
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
80045e4: b8 20 58 00 mv r11,r1
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
80045e8: 2c 30 00 0a lhu r16,(r1+10)
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
80045ec: 45 80 00 aa be r12,r0,8004894 <_Objects_Extend_information+0x2e4>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
80045f0: 2c 2f 00 14 lhu r15,(r1+20)
80045f4: 2c 31 00 10 lhu r17,(r1+16)
80045f8: b9 e0 10 00 mv r2,r15
80045fc: ba 20 08 00 mv r1,r17
8004600: f8 00 37 7e calli 80123f8 <__udivsi3>
8004604: 20 2e ff ff andi r14,r1,0xffff
for ( ; block < block_count; block++ ) {
8004608: 45 c0 00 a9 be r14,r0,80048ac <_Objects_Extend_information+0x2fc><== NEVER TAKEN
if ( information->object_blocks[ block ] == NULL ) {
800460c: 29 81 00 00 lw r1,(r12+0)
8004610: 44 20 00 ac be r1,r0,80048c0 <_Objects_Extend_information+0x310><== NEVER TAKEN
8004614: b9 80 18 00 mv r3,r12
8004618: b9 e0 08 00 mv r1,r15
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
800461c: ba 00 68 00 mv r13,r16
index_base = minimum_index;
block = 0;
8004620: 34 0c 00 00 mvi r12,0
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
8004624: 35 8c 00 01 addi r12,r12,1
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
break;
} else
index_base += information->allocation_size;
8004628: b5 af 68 00 add r13,r13,r15
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
800462c: 55 cc 00 81 bgu r14,r12,8004830 <_Objects_Extend_information+0x280>
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
8004630: 34 12 00 01 mvi r18,1
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
8004634: b6 21 88 00 add r17,r17,r1
/*
* We need to limit the number of objects to the maximum number
* representable in the index portion of the object Id. In the
* case of 16-bit Ids, this is only 256 object instances.
*/
if ( maximum > OBJECTS_ID_FINAL_INDEX ) {
8004638: 38 02 ff ff mvu r2,0xffff
800463c: 56 22 00 70 bgu r17,r2,80047fc <_Objects_Extend_information+0x24c>
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
8004640: 29 62 00 18 lw r2,(r11+24)
8004644: f8 00 37 08 calli 8012264 <__mulsi3>
if ( information->auto_extend ) {
8004648: 41 62 00 12 lbu r2,(r11+18)
800464c: 44 40 00 7e be r2,r0,8004844 <_Objects_Extend_information+0x294>
new_object_block = _Workspace_Allocate( block_size );
8004650: f8 00 0a 3f calli 8006f4c <_Workspace_Allocate>
8004654: b8 20 78 00 mv r15,r1
if ( !new_object_block )
8004658: 44 20 00 69 be r1,r0,80047fc <_Objects_Extend_information+0x24c>
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
800465c: 46 40 00 41 be r18,r0,8004760 <_Objects_Extend_information+0x1b0>
*/
/*
* Up the block count and maximum
*/
block_count++;
8004660: 35 c1 00 01 addi r1,r14,1
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
8004664: b4 21 98 00 add r19,r1,r1
8004668: b6 61 08 00 add r1,r19,r1
((maximum + minimum_index) * sizeof(Objects_Control *));
800466c: b6 21 08 00 add r1,r17,r1
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
8004670: b4 30 08 00 add r1,r1,r16
block_count++;
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
8004674: b4 21 08 00 add r1,r1,r1
8004678: b4 21 08 00 add r1,r1,r1
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
800467c: f8 00 0a 34 calli 8006f4c <_Workspace_Allocate>
8004680: b8 20 90 00 mv r18,r1
if ( !object_blocks ) {
8004684: 44 20 00 94 be r1,r0,80048d4 <_Objects_Extend_information+0x324>
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
8004688: 2d 62 00 10 lhu r2,(r11+16)
}
/*
* Break the block into the various sections.
*/
inactive_per_block = (uint32_t *) _Addresses_Add_offset(
800468c: b6 73 a0 00 add r20,r19,r19
8004690: b4 34 98 00 add r19,r1,r20
8004694: b6 74 a0 00 add r20,r19,r20
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
8004698: 54 50 00 6e bgu r2,r16,8004850 <_Objects_Extend_information+0x2a0>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
800469c: ba 80 20 00 mv r4,r20
80046a0: 34 03 00 00 mvi r3,0
80046a4: 46 00 00 05 be r16,r0,80046b8 <_Objects_Extend_information+0x108><== NEVER TAKEN
local_table[ index ] = NULL;
80046a8: 58 80 00 00 sw (r4+0),r0
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
80046ac: 34 63 00 01 addi r3,r3,1
80046b0: 34 84 00 04 addi r4,r4,4
80046b4: 56 03 ff fd bgu r16,r3,80046a8 <_Objects_Extend_information+0xf8><== NEVER TAKEN
80046b8: b5 ce 70 00 add r14,r14,r14
80046bc: b5 ce 70 00 add r14,r14,r14
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
80046c0: 2d 65 00 14 lhu r5,(r11+20)
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
80046c4: b6 4e 08 00 add r1,r18,r14
80046c8: 58 20 00 00 sw (r1+0),r0
inactive_per_block[block_count] = 0;
80046cc: b6 6e 70 00 add r14,r19,r14
80046d0: 59 c0 00 00 sw (r14+0),r0
for ( index=index_base ;
index < ( information->allocation_size + index_base );
80046d4: b5 a5 28 00 add r5,r13,r5
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
80046d8: 51 a5 00 09 bgeu r13,r5,80046fc <_Objects_Extend_information+0x14c><== NEVER TAKEN
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
80046dc: b5 ad 20 00 add r4,r13,r13
80046e0: b4 84 20 00 add r4,r4,r4
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
80046e4: b6 84 20 00 add r4,r20,r4
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
80046e8: b9 a0 18 00 mv r3,r13
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
80046ec: 58 80 00 00 sw (r4+0),r0
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
80046f0: 34 63 00 01 addi r3,r3,1
80046f4: 34 84 00 04 addi r4,r4,4
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
80046f8: 54 a3 ff fd bgu r5,r3,80046ec <_Objects_Extend_information+0x13c>
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
}
_ISR_Disable( level );
80046fc: 90 00 70 00 rcsr r14,IE
8004700: 34 01 ff fe mvi r1,-2
8004704: a1 c1 08 00 and r1,r14,r1
8004708: d0 01 00 00 wcsr IE,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
800470c: 29 61 00 00 lw r1,(r11+0)
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
8004710: 22 31 ff ff andi r17,r17,0xffff
8004714: 0d 71 00 10 sh (r11+16),r17
local_table[ index ] = NULL;
}
_ISR_Disable( level );
old_tables = information->object_blocks;
8004718: 29 70 00 34 lw r16,(r11+52)
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
800471c: 59 73 00 30 sw (r11+48),r19
_ISR_Disable( level );
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
8004720: 59 72 00 34 sw (r11+52),r18
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
8004724: 59 74 00 1c sw (r11+28),r20
8004728: 34 02 00 18 mvi r2,24
800472c: f8 00 36 59 calli 8012090 <__ashlsi3>
8004730: 78 12 00 01 mvhi r18,0x1
8004734: b8 32 90 00 or r18,r1,r18
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
8004738: 2d 61 00 04 lhu r1,(r11+4)
800473c: 34 02 00 1b mvi r2,27
8004740: f8 00 36 54 calli 8012090 <__ashlsi3>
8004744: ba 41 08 00 or r1,r18,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
8004748: b8 31 88 00 or r17,r1,r17
information->maximum = (Objects_Maximum) maximum;
information->maximum_id = _Objects_Build_id(
800474c: 59 71 00 0c sw (r11+12),r17
information->the_class,
_Objects_Local_node,
information->maximum
);
_ISR_Enable( level );
8004750: d0 0e 00 00 wcsr IE,r14
if ( old_tables )
8004754: 46 00 00 03 be r16,r0,8004760 <_Objects_Extend_information+0x1b0>
_Workspace_Free( old_tables );
8004758: ba 00 08 00 mv r1,r16
800475c: f8 00 0a 07 calli 8006f78 <_Workspace_Free>
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
8004760: 29 61 00 34 lw r1,(r11+52)
8004764: b5 8c 60 00 add r12,r12,r12
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
8004768: 2d 63 00 14 lhu r3,(r11+20)
800476c: 29 64 00 18 lw r4,(r11+24)
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
8004770: b5 8c 60 00 add r12,r12,r12
8004774: b4 2c 08 00 add r1,r1,r12
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
8004778: 37 90 00 30 addi r16,sp,48
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
800477c: 58 2f 00 00 sw (r1+0),r15
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
8004780: b9 e0 10 00 mv r2,r15
8004784: ba 00 08 00 mv r1,r16
8004788: f8 00 15 9b calli 8009df4 <_Chain_Initialize>
800478c: 78 12 00 01 mvhi r18,0x1
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
8004790: 35 71 00 20 addi r17,r11,32
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
8004794: e0 00 00 0e bi 80047cc <_Objects_Extend_information+0x21c>
8004798: 29 61 00 00 lw r1,(r11+0)
800479c: f8 00 36 3d calli 8012090 <__ashlsi3>
80047a0: b8 32 78 00 or r15,r1,r18
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
80047a4: 2d 61 00 04 lhu r1,(r11+4)
80047a8: 34 02 00 1b mvi r2,27
80047ac: f8 00 36 39 calli 8012090 <__ashlsi3>
80047b0: b9 e1 10 00 or r2,r15,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
80047b4: b8 4d 10 00 or r2,r2,r13
the_object->id = _Objects_Build_id(
80047b8: 59 c2 00 08 sw (r14+8),r2
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
80047bc: ba 20 08 00 mv r1,r17
80047c0: b9 c0 10 00 mv r2,r14
80047c4: fb ff fc 3b calli 80038b0 <_Chain_Append>
index++;
80047c8: 35 ad 00 01 addi r13,r13,1
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
80047cc: ba 00 08 00 mv r1,r16
80047d0: fb ff fc 4e calli 8003908 <_Chain_Get>
80047d4: b8 20 70 00 mv r14,r1
80047d8: 34 02 00 18 mvi r2,24
80047dc: 5c 20 ff ef bne r1,r0,8004798 <_Objects_Extend_information+0x1e8>
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
80047e0: 29 63 00 30 lw r3,(r11+48)
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
80047e4: 2d 62 00 2c lhu r2,(r11+44)
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
80047e8: 2d 61 00 14 lhu r1,(r11+20)
80047ec: b4 6c 60 00 add r12,r3,r12
80047f0: 59 81 00 00 sw (r12+0),r1
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
80047f4: b4 22 08 00 add r1,r1,r2
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
information->inactive =
80047f8: 0d 61 00 2c sh (r11+44),r1
(Objects_Maximum)(information->inactive + information->allocation_size);
}
80047fc: 2b 9d 00 04 lw ra,(sp+4)
8004800: 2b 8b 00 2c lw r11,(sp+44)
8004804: 2b 8c 00 28 lw r12,(sp+40)
8004808: 2b 8d 00 24 lw r13,(sp+36)
800480c: 2b 8e 00 20 lw r14,(sp+32)
8004810: 2b 8f 00 1c lw r15,(sp+28)
8004814: 2b 90 00 18 lw r16,(sp+24)
8004818: 2b 91 00 14 lw r17,(sp+20)
800481c: 2b 92 00 10 lw r18,(sp+16)
8004820: 2b 93 00 0c lw r19,(sp+12)
8004824: 2b 94 00 08 lw r20,(sp+8)
8004828: 37 9c 00 38 addi sp,sp,56
800482c: c3 a0 00 00 ret
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
8004830: 28 62 00 04 lw r2,(r3+4)
8004834: 34 63 00 04 addi r3,r3,4
8004838: 5c 40 ff 7b bne r2,r0,8004624 <_Objects_Extend_information+0x74>
do_extend = false;
800483c: 34 12 00 00 mvi r18,0
8004840: e3 ff ff 7d bi 8004634 <_Objects_Extend_information+0x84>
if ( information->auto_extend ) {
new_object_block = _Workspace_Allocate( block_size );
if ( !new_object_block )
return;
} else {
new_object_block = _Workspace_Allocate_or_fatal_error( block_size );
8004844: f8 00 09 d6 calli 8006f9c <_Workspace_Allocate_or_fatal_error>
8004848: b8 20 78 00 mv r15,r1
800484c: e3 ff ff 84 bi 800465c <_Objects_Extend_information+0xac>
/*
* Copy each section of the table over. This has to be performed as
* separate parts as size of each block has changed.
*/
memcpy( object_blocks,
8004850: 29 62 00 34 lw r2,(r11+52)
information->object_blocks,
block_count * sizeof(void*) );
8004854: b5 ce 70 00 add r14,r14,r14
8004858: b5 ce 70 00 add r14,r14,r14
/*
* Copy each section of the table over. This has to be performed as
* separate parts as size of each block has changed.
*/
memcpy( object_blocks,
800485c: b9 c0 18 00 mv r3,r14
8004860: f8 00 24 0f calli 800d89c <memcpy>
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
8004864: 29 62 00 30 lw r2,(r11+48)
8004868: b9 c0 18 00 mv r3,r14
800486c: ba 60 08 00 mv r1,r19
8004870: f8 00 24 0b calli 800d89c <memcpy>
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
8004874: 2d 63 00 10 lhu r3,(r11+16)
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
8004878: 29 62 00 1c lw r2,(r11+28)
800487c: ba 80 08 00 mv r1,r20
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
8004880: b6 03 18 00 add r3,r16,r3
8004884: b4 63 18 00 add r3,r3,r3
8004888: b4 63 18 00 add r3,r3,r3
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
800488c: f8 00 24 04 calli 800d89c <memcpy>
8004890: e3 ff ff 8c bi 80046c0 <_Objects_Extend_information+0x110>
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
8004894: 2c 31 00 10 lhu r17,(r1+16)
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
8004898: ba 00 68 00 mv r13,r16
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
800489c: 2c 21 00 14 lhu r1,(r1+20)
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
80048a0: 34 12 00 01 mvi r18,1
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
80048a4: 34 0e 00 00 mvi r14,0
80048a8: e3 ff ff 63 bi 8004634 <_Objects_Extend_information+0x84>
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
80048ac: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
80048b0: ba 00 68 00 mv r13,r16 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
80048b4: 34 12 00 01 mvi r18,1 <== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
80048b8: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
80048bc: e3 ff ff 5e bi 8004634 <_Objects_Extend_information+0x84> <== NOT EXECUTED
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
80048c0: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
80048c4: ba 00 68 00 mv r13,r16 <== NOT EXECUTED
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
80048c8: 34 12 00 00 mvi r18,0 <== NOT EXECUTED
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
80048cc: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
80048d0: e3 ff ff 59 bi 8004634 <_Objects_Extend_information+0x84> <== NOT EXECUTED
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
80048d4: b9 e0 08 00 mv r1,r15
80048d8: f8 00 09 a8 calli 8006f78 <_Workspace_Free>
return;
80048dc: e3 ff ff c8 bi 80047fc <_Objects_Extend_information+0x24c>
080049c8 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
80049c8: 37 9c ff f0 addi sp,sp,-16
80049cc: 5b 8b 00 10 sw (sp+16),r11
80049d0: 5b 8c 00 0c sw (sp+12),r12
80049d4: 5b 8d 00 08 sw (sp+8),r13
80049d8: 5b 9d 00 04 sw (sp+4),ra
80049dc: 20 4c ff ff andi r12,r2,0xffff
80049e0: b8 20 68 00 mv r13,r1
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
return NULL;
80049e4: 34 0b 00 00 mvi r11,0
)
{
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
80049e8: 5d 80 00 08 bne r12,r0,8004a08 <_Objects_Get_information+0x40>
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
80049ec: b9 60 08 00 mv r1,r11
80049f0: 2b 9d 00 04 lw ra,(sp+4)
80049f4: 2b 8b 00 10 lw r11,(sp+16)
80049f8: 2b 8c 00 0c lw r12,(sp+12)
80049fc: 2b 8d 00 08 lw r13,(sp+8)
8004a00: 37 9c 00 10 addi sp,sp,16
8004a04: c3 a0 00 00 ret
/*
* This call implicitly validates the_api so we do not call
* _Objects_Is_api_valid above here.
*/
the_class_api_maximum = _Objects_API_maximum_class( the_api );
8004a08: f8 00 16 a0 calli 800a488 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
8004a0c: 44 20 ff f8 be r1,r0,80049ec <_Objects_Get_information+0x24>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
8004a10: 55 81 ff f7 bgu r12,r1,80049ec <_Objects_Get_information+0x24>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
8004a14: 78 01 08 01 mvhi r1,0x801
8004a18: b5 ad 68 00 add r13,r13,r13
8004a1c: 38 21 48 44 ori r1,r1,0x4844
8004a20: b5 ad 68 00 add r13,r13,r13
8004a24: b4 2d 08 00 add r1,r1,r13
8004a28: 28 21 00 00 lw r1,(r1+0)
8004a2c: 44 20 ff f0 be r1,r0,80049ec <_Objects_Get_information+0x24><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
8004a30: b5 8c 60 00 add r12,r12,r12
8004a34: b5 8c 60 00 add r12,r12,r12
8004a38: b4 2c 08 00 add r1,r1,r12
8004a3c: 28 2b 00 00 lw r11,(r1+0)
if ( !info )
8004a40: 45 60 ff eb be r11,r0,80049ec <_Objects_Get_information+0x24><== NEVER TAKEN
* In a multprocessing configuration, we may access remote objects.
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
8004a44: 2d 61 00 10 lhu r1,(r11+16)
return NULL;
8004a48: 7c 21 00 00 cmpnei r1,r1,0
8004a4c: c8 01 08 00 sub r1,r0,r1
8004a50: a1 61 58 00 and r11,r11,r1
8004a54: e3 ff ff e6 bi 80049ec <_Objects_Get_information+0x24>
08006a0c <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
8006a0c: 37 9c ff e0 addi sp,sp,-32
8006a10: 5b 8b 00 14 sw (sp+20),r11
8006a14: 5b 8c 00 10 sw (sp+16),r12
8006a18: 5b 8d 00 0c sw (sp+12),r13
8006a1c: 5b 8e 00 08 sw (sp+8),r14
8006a20: 5b 9d 00 04 sw (sp+4),ra
8006a24: b8 40 60 00 mv r12,r2
8006a28: b8 60 58 00 mv r11,r3
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
8006a2c: 5c 40 00 0a bne r2,r0,8006a54 <_Objects_Get_name_as_string+0x48>
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
8006a30: 34 0b 00 00 mvi r11,0
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
8006a34: b9 60 08 00 mv r1,r11
8006a38: 2b 9d 00 04 lw ra,(sp+4)
8006a3c: 2b 8b 00 14 lw r11,(sp+20)
8006a40: 2b 8c 00 10 lw r12,(sp+16)
8006a44: 2b 8d 00 0c lw r13,(sp+12)
8006a48: 2b 8e 00 08 lw r14,(sp+8)
8006a4c: 37 9c 00 20 addi sp,sp,32
8006a50: c3 a0 00 00 ret
Objects_Id tmpId;
if ( length == 0 )
return NULL;
if ( name == NULL )
8006a54: 44 60 ff f8 be r3,r0,8006a34 <_Objects_Get_name_as_string+0x28>
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
8006a58: b8 20 68 00 mv r13,r1
8006a5c: 5c 20 00 05 bne r1,r0,8006a70 <_Objects_Get_name_as_string+0x64>
8006a60: 78 01 08 02 mvhi r1,0x802
8006a64: 38 21 ab a8 ori r1,r1,0xaba8
8006a68: 28 21 00 0c lw r1,(r1+12)
8006a6c: 28 2d 00 08 lw r13,(r1+8)
information = _Objects_Get_information_id( tmpId );
8006a70: b9 a0 08 00 mv r1,r13
8006a74: fb ff ff 94 calli 80068c4 <_Objects_Get_information_id>
8006a78: b8 20 70 00 mv r14,r1
if ( !information )
8006a7c: 44 20 ff ed be r1,r0,8006a30 <_Objects_Get_name_as_string+0x24>
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
8006a80: b9 a0 10 00 mv r2,r13
8006a84: 37 83 00 20 addi r3,sp,32
8006a88: f8 00 00 36 calli 8006b60 <_Objects_Get>
switch ( location ) {
8006a8c: 2b 82 00 20 lw r2,(sp+32)
8006a90: 5c 40 ff e8 bne r2,r0,8006a30 <_Objects_Get_name_as_string+0x24>
return NULL;
case OBJECTS_LOCAL:
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string ) {
8006a94: 41 c3 00 38 lbu r3,(r14+56)
8006a98: 44 62 00 1c be r3,r2,8006b08 <_Objects_Get_name_as_string+0xfc>
s = the_object->name.name_p;
8006a9c: 28 27 00 0c lw r7,(r1+12)
lname[ 4 ] = '\0';
s = lname;
}
d = name;
if ( s ) {
8006aa0: b9 60 10 00 mv r2,r11
8006aa4: 44 e0 00 16 be r7,r0,8006afc <_Objects_Get_name_as_string+0xf0>
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
8006aa8: 35 8c ff ff addi r12,r12,-1
8006aac: b9 60 10 00 mv r2,r11
8006ab0: 45 80 00 13 be r12,r0,8006afc <_Objects_Get_name_as_string+0xf0><== NEVER TAKEN
8006ab4: 40 e1 00 00 lbu r1,(r7+0)
8006ab8: 44 20 00 11 be r1,r0,8006afc <_Objects_Get_name_as_string+0xf0>
8006abc: 78 04 08 02 mvhi r4,0x802
8006ac0: 34 03 00 00 mvi r3,0
8006ac4: 38 84 22 00 ori r4,r4,0x2200
*d = (isprint((unsigned char)*s)) ? *s : '*';
8006ac8: 28 85 00 00 lw r5,(r4+0)
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
8006acc: 34 63 00 01 addi r3,r3,1
* This method objects the name of an object and returns its name
* in the form of a C string. It attempts to be careful about
* overflowing the user's string and about returning unprintable characters.
*/
char *_Objects_Get_name_as_string(
8006ad0: b4 e3 30 00 add r6,r7,r3
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
*d = (isprint((unsigned char)*s)) ? *s : '*';
8006ad4: b4 a1 28 00 add r5,r5,r1
8006ad8: 40 a5 00 01 lbu r5,(r5+1)
8006adc: 20 a5 00 97 andi r5,r5,0x97
8006ae0: 5c a0 00 02 bne r5,r0,8006ae8 <_Objects_Get_name_as_string+0xdc>
8006ae4: 34 01 00 2a mvi r1,42
8006ae8: 30 41 00 00 sb (r2+0),r1
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
8006aec: 34 42 00 01 addi r2,r2,1
8006af0: 50 6c 00 03 bgeu r3,r12,8006afc <_Objects_Get_name_as_string+0xf0>
8006af4: 40 c1 00 00 lbu r1,(r6+0)
8006af8: 5c 20 ff f4 bne r1,r0,8006ac8 <_Objects_Get_name_as_string+0xbc>
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
8006afc: 30 40 00 00 sb (r2+0),r0
_Thread_Enable_dispatch();
8006b00: f8 00 03 43 calli 800780c <_Thread_Enable_dispatch>
return name;
8006b04: e3 ff ff cc bi 8006a34 <_Objects_Get_name_as_string+0x28>
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
8006b08: 28 2d 00 0c lw r13,(r1+12)
lname[ 0 ] = (u32_name >> 24) & 0xff;
8006b0c: 34 02 00 18 mvi r2,24
8006b10: b9 a0 08 00 mv r1,r13
8006b14: fb ff e9 a6 calli 80011ac <__lshrsi3>
8006b18: 33 81 00 18 sb (sp+24),r1
lname[ 1 ] = (u32_name >> 16) & 0xff;
8006b1c: 34 02 00 10 mvi r2,16
8006b20: b9 a0 08 00 mv r1,r13
8006b24: fb ff e9 a2 calli 80011ac <__lshrsi3>
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b28: 01 a2 00 01 srui r2,r13,1
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
8006b2c: 33 81 00 19 sb (sp+25),r1
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b30: 00 42 00 01 srui r2,r2,1
lname[ 3 ] = (u32_name >> 0) & 0xff;
8006b34: 33 8d 00 1b sb (sp+27),r13
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b38: 00 42 00 01 srui r2,r2,1
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
8006b3c: 33 80 00 1c sb (sp+28),r0
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b40: 00 42 00 01 srui r2,r2,1
lname[ 3 ] = (u32_name >> 0) & 0xff;
lname[ 4 ] = '\0';
s = lname;
8006b44: 37 87 00 18 addi r7,sp,24
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
lname[ 1 ] = (u32_name >> 16) & 0xff;
lname[ 2 ] = (u32_name >> 8) & 0xff;
8006b48: 00 42 00 01 srui r2,r2,1
8006b4c: 00 42 00 01 srui r2,r2,1
8006b50: 00 42 00 01 srui r2,r2,1
8006b54: 00 42 00 01 srui r2,r2,1
8006b58: 33 82 00 1a sb (sp+26),r2
8006b5c: e3 ff ff d3 bi 8006aa8 <_Objects_Get_name_as_string+0x9c>
08017654 <_Objects_Get_no_protection>:
/*
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
8017654: 28 25 00 08 lw r5,(r1+8)
if ( information->maximum >= index ) {
8017658: 2c 24 00 10 lhu r4,(r1+16)
/*
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
801765c: c8 45 10 00 sub r2,r2,r5
8017660: 34 42 00 01 addi r2,r2,1
if ( information->maximum >= index ) {
8017664: 54 44 00 09 bgu r2,r4,8017688 <_Objects_Get_no_protection+0x34>
if ( (the_object = information->local_table[ index ]) != NULL ) {
8017668: 28 24 00 1c lw r4,(r1+28)
801766c: b4 42 08 00 add r1,r2,r2
8017670: b4 21 08 00 add r1,r1,r1
8017674: b4 81 08 00 add r1,r4,r1
8017678: 28 21 00 00 lw r1,(r1+0)
801767c: 44 20 00 03 be r1,r0,8017688 <_Objects_Get_no_protection+0x34><== NEVER TAKEN
*location = OBJECTS_LOCAL;
8017680: 58 60 00 00 sw (r3+0),r0
return the_object;
8017684: c3 a0 00 00 ret
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
8017688: 34 01 00 01 mvi r1,1
801768c: 58 61 00 00 sw (r3+0),r1
return NULL;
8017690: 34 01 00 00 mvi r1,0
}
8017694: c3 a0 00 00 ret
08006558 <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
8006558: 37 9c ff e8 addi sp,sp,-24
800655c: 5b 8b 00 14 sw (sp+20),r11
8006560: 5b 8c 00 10 sw (sp+16),r12
8006564: 5b 8d 00 0c sw (sp+12),r13
8006568: 5b 8e 00 08 sw (sp+8),r14
800656c: 5b 9d 00 04 sw (sp+4),ra
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
8006570: b8 20 58 00 mv r11,r1
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
8006574: b8 40 70 00 mv r14,r2
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
8006578: 5c 20 00 05 bne r1,r0,800658c <_Objects_Id_to_name+0x34>
800657c: 78 01 08 02 mvhi r1,0x802
8006580: 38 21 0d c0 ori r1,r1,0xdc0
8006584: 28 21 00 0c lw r1,(r1+12)
8006588: 28 2b 00 08 lw r11,(r1+8)
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
800658c: b9 60 08 00 mv r1,r11
8006590: 34 02 00 18 mvi r2,24
8006594: f8 00 58 36 calli 801c66c <__lshrsi3>
8006598: 20 23 00 07 andi r3,r1,0x7
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
800659c: 34 64 ff ff addi r4,r3,-1
80065a0: 34 01 00 02 mvi r1,2
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
80065a4: 34 0c 00 03 mvi r12,3
80065a8: 54 81 00 12 bgu r4,r1,80065f0 <_Objects_Id_to_name+0x98>
if ( !_Objects_Information_table[ the_api ] )
80065ac: 78 04 08 02 mvhi r4,0x802
80065b0: b4 63 18 00 add r3,r3,r3
80065b4: 38 84 08 8c ori r4,r4,0x88c
80065b8: b4 63 18 00 add r3,r3,r3
80065bc: b4 83 18 00 add r3,r4,r3
80065c0: 28 6d 00 00 lw r13,(r3+0)
80065c4: 45 a0 00 0b be r13,r0,80065f0 <_Objects_Id_to_name+0x98>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
80065c8: b9 60 08 00 mv r1,r11
80065cc: 34 02 00 1b mvi r2,27
80065d0: f8 00 58 27 calli 801c66c <__lshrsi3>
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
80065d4: b4 21 18 00 add r3,r1,r1
80065d8: b4 63 18 00 add r3,r3,r3
80065dc: b5 a3 18 00 add r3,r13,r3
80065e0: 28 63 00 00 lw r3,(r3+0)
if ( !information )
80065e4: 44 60 00 03 be r3,r0,80065f0 <_Objects_Id_to_name+0x98> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
80065e8: 40 6d 00 38 lbu r13,(r3+56)
80065ec: 45 a0 00 09 be r13,r0,8006610 <_Objects_Id_to_name+0xb8> <== ALWAYS TAKEN
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
80065f0: b9 80 08 00 mv r1,r12
80065f4: 2b 9d 00 04 lw ra,(sp+4)
80065f8: 2b 8b 00 14 lw r11,(sp+20)
80065fc: 2b 8c 00 10 lw r12,(sp+16)
8006600: 2b 8d 00 0c lw r13,(sp+12)
8006604: 2b 8e 00 08 lw r14,(sp+8)
8006608: 37 9c 00 18 addi sp,sp,24
800660c: c3 a0 00 00 ret
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
8006610: b8 60 08 00 mv r1,r3
8006614: b9 60 10 00 mv r2,r11
8006618: 37 83 00 18 addi r3,sp,24
800661c: fb ff ff a9 calli 80064c0 <_Objects_Get>
if ( !the_object )
8006620: 44 2d ff f4 be r1,r13,80065f0 <_Objects_Id_to_name+0x98>
return OBJECTS_INVALID_ID;
*name = the_object->name;
8006624: 28 21 00 0c lw r1,(r1+12)
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
8006628: 34 0c 00 00 mvi r12,0
the_object = _Objects_Get( information, tmpId, &ignored_location );
if ( !the_object )
return OBJECTS_INVALID_ID;
*name = the_object->name;
800662c: 59 c1 00 00 sw (r14+0),r1
_Thread_Enable_dispatch();
8006630: f8 00 03 77 calli 800740c <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
8006634: b9 80 08 00 mv r1,r12
8006638: 2b 9d 00 04 lw ra,(sp+4)
800663c: 2b 8b 00 14 lw r11,(sp+20)
8006640: 2b 8c 00 10 lw r12,(sp+16)
8006644: 2b 8d 00 0c lw r13,(sp+12)
8006648: 2b 8e 00 08 lw r14,(sp+8)
800664c: 37 9c 00 18 addi sp,sp,24
8006650: c3 a0 00 00 ret
08004b5c <_Objects_Initialize_information>:
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004b5c: 37 9c ff e8 addi sp,sp,-24
8004b60: 5b 8b 00 18 sw (sp+24),r11
8004b64: 5b 8c 00 14 sw (sp+20),r12
8004b68: 5b 8d 00 10 sw (sp+16),r13
8004b6c: 5b 8e 00 0c sw (sp+12),r14
8004b70: 5b 8f 00 08 sw (sp+8),r15
8004b74: 5b 9d 00 04 sw (sp+4),ra
8004b78: b8 40 68 00 mv r13,r2
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004b7c: b5 ad 40 00 add r8,r13,r13
8004b80: 78 02 08 01 mvhi r2,0x801
8004b84: 38 42 48 44 ori r2,r2,0x4844
8004b88: b5 08 40 00 add r8,r8,r8
8004b8c: b4 48 40 00 add r8,r2,r8
8004b90: 29 02 00 00 lw r2,(r8+0)
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004b94: 20 6c ff ff andi r12,r3,0xffff
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004b98: b5 8c 40 00 add r8,r12,r12
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004b9c: 20 a5 ff ff andi r5,r5,0xffff
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004ba0: b5 08 40 00 add r8,r8,r8
uint32_t maximum_per_allocation;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t index;
#endif
information->the_api = the_api;
8004ba4: 58 2d 00 00 sw (r1+0),r13
information->the_class = the_class;
8004ba8: 0c 2c 00 04 sh (r1+4),r12
information->size = size;
8004bac: 58 25 00 18 sw (r1+24),r5
information->local_table = 0;
8004bb0: 58 20 00 1c sw (r1+28),r0
information->inactive_per_block = 0;
8004bb4: 58 20 00 30 sw (r1+48),r0
information->object_blocks = 0;
8004bb8: 58 20 00 34 sw (r1+52),r0
information->inactive = 0;
8004bbc: 0c 20 00 2c sh (r1+44),r0
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
information->is_string = is_string;
8004bc0: 30 26 00 38 sb (r1+56),r6
/*
* Set the maximum value to 0. It will be updated when objects are
* added to the inactive set from _Objects_Extend_information()
*/
information->maximum = 0;
8004bc4: 0c 20 00 10 sh (r1+16),r0
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004bc8: b4 48 40 00 add r8,r2,r8
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004bcc: b8 20 58 00 mv r11,r1
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8004bd0: 59 01 00 00 sw (r8+0),r1
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
8004bd4: 34 02 00 1f mvi r2,31
8004bd8: b8 80 08 00 mv r1,r4
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8004bdc: b8 80 70 00 mv r14,r4
8004be0: b8 e0 78 00 mv r15,r7
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
8004be4: f8 00 35 79 calli 80121c8 <__lshrsi3>
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8004be8: 78 03 08 01 mvhi r3,0x801
8004bec: 38 63 36 14 ori r3,r3,0x3614
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
8004bf0: 20 22 00 ff andi r2,r1,0xff
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8004bf4: 28 61 00 00 lw r1,(r3+0)
_Objects_Information_table[ the_api ][ the_class ] = information;
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
8004bf8: 31 62 00 12 sb (r11+18),r2
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8004bfc: a1 c1 70 00 and r14,r14,r1
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
8004c00: 44 40 00 02 be r2,r0,8004c08 <_Objects_Initialize_information+0xac>
8004c04: 45 c0 00 29 be r14,r0,8004ca8 <_Objects_Initialize_information+0x14c><== NEVER TAKEN
information->allocation_size = maximum_per_allocation;
/*
* Provide a null local table entry for the case of any empty table.
*/
information->local_table = &null_local_table;
8004c08: 78 01 08 01 mvhi r1,0x801
8004c0c: 38 21 46 b4 ori r1,r1,0x46b4
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
8004c10: 34 02 00 18 mvi r2,24
8004c14: 59 61 00 1c sw (r11+28),r1
}
/*
* The allocation unit is the maximum value
*/
information->allocation_size = maximum_per_allocation;
8004c18: 0d 6e 00 14 sh (r11+20),r14
8004c1c: b9 a0 08 00 mv r1,r13
8004c20: f8 00 35 1c calli 8012090 <__ashlsi3>
8004c24: 78 0d 00 01 mvhi r13,0x1
8004c28: b8 2d 68 00 or r13,r1,r13
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
8004c2c: 34 02 00 1b mvi r2,27
8004c30: b9 80 08 00 mv r1,r12
8004c34: f8 00 35 17 calli 8012090 <__ashlsi3>
information->local_table = &null_local_table;
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
8004c38: 7d c2 00 00 cmpnei r2,r14,0
8004c3c: b9 a1 08 00 or r1,r13,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
8004c40: b8 22 08 00 or r1,r1,r2
information->minimum_id =
8004c44: 59 61 00 08 sw (r11+8),r1
/*
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
8004c48: 21 e1 00 03 andi r1,r15,0x3
8004c4c: b9 e0 38 00 mv r7,r15
8004c50: 5c 20 00 12 bne r1,r0,8004c98 <_Objects_Initialize_information+0x13c>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
8004c54: 35 62 00 24 addi r2,r11,36
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
8004c58: 35 61 00 20 addi r1,r11,32
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
~(OBJECTS_NAME_ALIGNMENT-1);
information->name_length = name_length;
8004c5c: 0d 67 00 3a sh (r11+58),r7
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8004c60: 59 62 00 20 sw (r11+32),r2
head->previous = NULL;
8004c64: 59 60 00 24 sw (r11+36),r0
tail->previous = head;
8004c68: 59 61 00 28 sw (r11+40),r1
_Chain_Initialize_empty( &information->Inactive );
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
8004c6c: 45 c0 00 03 be r14,r0,8004c78 <_Objects_Initialize_information+0x11c>
/*
* Always have the maximum size available so the current performance
* figures are create are met. If the user moves past the maximum
* number then a performance hit is taken.
*/
_Objects_Extend_information( information );
8004c70: b9 60 08 00 mv r1,r11
8004c74: fb ff fe 4f calli 80045b0 <_Objects_Extend_information>
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
8004c78: 2b 9d 00 04 lw ra,(sp+4)
8004c7c: 2b 8b 00 18 lw r11,(sp+24)
8004c80: 2b 8c 00 14 lw r12,(sp+20)
8004c84: 2b 8d 00 10 lw r13,(sp+16)
8004c88: 2b 8e 00 0c lw r14,(sp+12)
8004c8c: 2b 8f 00 08 lw r15,(sp+8)
8004c90: 37 9c 00 18 addi sp,sp,24
8004c94: c3 a0 00 00 ret
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
8004c98: 35 e7 00 04 addi r7,r15,4
8004c9c: 34 01 ff fc mvi r1,-4
8004ca0: a0 e1 38 00 and r7,r7,r1
8004ca4: e3 ff ff ec bi 8004c54 <_Objects_Initialize_information+0xf8>
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
_Internal_error_Occurred(
8004ca8: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8004cac: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8004cb0: 34 03 00 13 mvi r3,19 <== NOT EXECUTED
8004cb4: fb ff fd d4 calli 8004404 <_Internal_error_Occurred> <== NOT EXECUTED
08004d34 <_Objects_Shrink_information>:
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
8004d34: 37 9c ff ec addi sp,sp,-20
8004d38: 5b 8b 00 14 sw (sp+20),r11
8004d3c: 5b 8c 00 10 sw (sp+16),r12
8004d40: 5b 8d 00 0c sw (sp+12),r13
8004d44: 5b 8e 00 08 sw (sp+8),r14
8004d48: 5b 9d 00 04 sw (sp+4),ra
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
8004d4c: 2c 2c 00 0a lhu r12,(r1+10)
block_count = (information->maximum - index_base) /
8004d50: 2c 2d 00 14 lhu r13,(r1+20)
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
8004d54: b8 20 70 00 mv r14,r1
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
8004d58: 2c 21 00 10 lhu r1,(r1+16)
8004d5c: b9 a0 10 00 mv r2,r13
8004d60: c8 2c 08 00 sub r1,r1,r12
8004d64: f8 00 35 a5 calli 80123f8 <__udivsi3>
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
8004d68: 44 20 00 09 be r1,r0,8004d8c <_Objects_Shrink_information+0x58><== NEVER TAKEN
if ( information->inactive_per_block[ block ] ==
8004d6c: 29 c5 00 30 lw r5,(r14+48)
8004d70: 34 0b 00 04 mvi r11,4
8004d74: 34 03 00 00 mvi r3,0
8004d78: 28 a2 00 00 lw r2,(r5+0)
8004d7c: 45 a2 00 11 be r13,r2,8004dc0 <_Objects_Shrink_information+0x8c><== NEVER TAKEN
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
8004d80: 34 63 00 01 addi r3,r3,1
* the_block - the block to remove
*
* Output parameters: NONE
*/
void _Objects_Shrink_information(
8004d84: b4 ab 10 00 add r2,r5,r11
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
8004d88: 54 23 00 08 bgu r1,r3,8004da8 <_Objects_Shrink_information+0x74>
return;
}
index_base += information->allocation_size;
}
}
8004d8c: 2b 9d 00 04 lw ra,(sp+4)
8004d90: 2b 8b 00 14 lw r11,(sp+20)
8004d94: 2b 8c 00 10 lw r12,(sp+16)
8004d98: 2b 8d 00 0c lw r13,(sp+12)
8004d9c: 2b 8e 00 08 lw r14,(sp+8)
8004da0: 37 9c 00 14 addi sp,sp,20
8004da4: c3 a0 00 00 ret
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
8004da8: 28 42 00 00 lw r2,(r2+0)
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
8004dac: 35 64 00 04 addi r4,r11,4
8004db0: b5 8d 60 00 add r12,r12,r13
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
8004db4: 45 a2 00 04 be r13,r2,8004dc4 <_Objects_Shrink_information+0x90>
8004db8: b8 80 58 00 mv r11,r4
8004dbc: e3 ff ff f1 bi 8004d80 <_Objects_Shrink_information+0x4c>
8004dc0: 34 0b 00 00 mvi r11,0 <== NOT EXECUTED
information->allocation_size ) {
/*
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
8004dc4: 29 c1 00 20 lw r1,(r14+32)
do {
index = _Objects_Get_index( the_object->id );
8004dc8: 2c 22 00 0a lhu r2,(r1+10)
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
8004dcc: 28 2d 00 00 lw r13,(r1+0)
if ((index >= index_base) &&
8004dd0: 55 82 00 05 bgu r12,r2,8004de4 <_Objects_Shrink_information+0xb0>
(index < (index_base + information->allocation_size))) {
8004dd4: 2d c3 00 14 lhu r3,(r14+20)
8004dd8: b5 83 18 00 add r3,r12,r3
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
8004ddc: 50 43 00 02 bgeu r2,r3,8004de4 <_Objects_Shrink_information+0xb0>
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
8004de0: fb ff fa c0 calli 80038e0 <_Chain_Extract>
}
}
while ( the_object );
8004de4: 45 a0 00 03 be r13,r0,8004df0 <_Objects_Shrink_information+0xbc>
index = _Objects_Get_index( the_object->id );
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
8004de8: b9 a0 08 00 mv r1,r13
8004dec: e3 ff ff f7 bi 8004dc8 <_Objects_Shrink_information+0x94>
while ( the_object );
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
8004df0: 29 c1 00 34 lw r1,(r14+52)
8004df4: b4 2b 08 00 add r1,r1,r11
8004df8: 28 21 00 00 lw r1,(r1+0)
8004dfc: f8 00 08 5f calli 8006f78 <_Workspace_Free>
information->object_blocks[ block ] = NULL;
8004e00: 29 c2 00 34 lw r2,(r14+52)
information->inactive_per_block[ block ] = 0;
8004e04: 29 c4 00 30 lw r4,(r14+48)
information->inactive -= information->allocation_size;
8004e08: 2d c3 00 2c lhu r3,(r14+44)
8004e0c: 2d c1 00 14 lhu r1,(r14+20)
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
8004e10: b4 4b 10 00 add r2,r2,r11
8004e14: 58 40 00 00 sw (r2+0),r0
information->inactive_per_block[ block ] = 0;
8004e18: b4 8b 58 00 add r11,r4,r11
8004e1c: 59 60 00 00 sw (r11+0),r0
information->inactive -= information->allocation_size;
8004e20: c8 61 08 00 sub r1,r3,r1
8004e24: 0d c1 00 2c sh (r14+44),r1
return;
}
index_base += information->allocation_size;
}
}
8004e28: 2b 9d 00 04 lw ra,(sp+4)
8004e2c: 2b 8b 00 14 lw r11,(sp+20)
8004e30: 2b 8c 00 10 lw r12,(sp+16)
8004e34: 2b 8d 00 0c lw r13,(sp+12)
8004e38: 2b 8e 00 08 lw r14,(sp+8)
8004e3c: 37 9c 00 14 addi sp,sp,20
8004e40: c3 a0 00 00 ret
08009018 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
8009018: 37 9c ff dc addi sp,sp,-36
800901c: 5b 8b 00 1c sw (sp+28),r11
8009020: 5b 8c 00 18 sw (sp+24),r12
8009024: 5b 8d 00 14 sw (sp+20),r13
8009028: 5b 8e 00 10 sw (sp+16),r14
800902c: 5b 8f 00 0c sw (sp+12),r15
8009030: 5b 90 00 08 sw (sp+8),r16
8009034: 5b 9d 00 04 sw (sp+4),ra
8009038: b8 20 60 00 mv r12,r1
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd (
mqd_t id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control_fd *) _Objects_Get(
800903c: 78 01 08 02 mvhi r1,0x802
8009040: b8 40 78 00 mv r15,r2
8009044: b8 60 58 00 mv r11,r3
8009048: b9 80 10 00 mv r2,r12
800904c: 38 21 a2 1c ori r1,r1,0xa21c
8009050: 37 83 00 24 addi r3,sp,36
8009054: b8 80 68 00 mv r13,r4
8009058: b8 c0 70 00 mv r14,r6
800905c: 20 b0 00 ff andi r16,r5,0xff
8009060: f8 00 0d 2c calli 800c510 <_Objects_Get>
Objects_Locations location;
size_t length_out;
bool do_wait;
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
8009064: 2b 82 00 24 lw r2,(sp+36)
8009068: 44 40 00 0e be r2,r0,80090a0 <_POSIX_Message_queue_Receive_support+0x88>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
800906c: f8 00 30 8d calli 80152a0 <__errno>
8009070: 34 02 00 09 mvi r2,9
8009074: 58 22 00 00 sw (r1+0),r2
8009078: 34 01 ff ff mvi r1,-1
}
800907c: 2b 9d 00 04 lw ra,(sp+4)
8009080: 2b 8b 00 1c lw r11,(sp+28)
8009084: 2b 8c 00 18 lw r12,(sp+24)
8009088: 2b 8d 00 14 lw r13,(sp+20)
800908c: 2b 8e 00 10 lw r14,(sp+16)
8009090: 2b 8f 00 0c lw r15,(sp+12)
8009094: 2b 90 00 08 lw r16,(sp+8)
8009098: 37 9c 00 24 addi sp,sp,36
800909c: c3 a0 00 00 ret
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
80090a0: 28 28 00 14 lw r8,(r1+20)
80090a4: 34 07 00 01 mvi r7,1
80090a8: 21 09 00 03 andi r9,r8,0x3
80090ac: 45 27 00 2e be r9,r7,8009164 <_POSIX_Message_queue_Receive_support+0x14c>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
80090b0: 28 27 00 10 lw r7,(r1+16)
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
80090b4: 28 e1 00 68 lw r1,(r7+104)
80090b8: 51 61 00 07 bgeu r11,r1,80090d4 <_POSIX_Message_queue_Receive_support+0xbc>
_Thread_Enable_dispatch();
80090bc: f8 00 10 b3 calli 800d388 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
80090c0: f8 00 30 78 calli 80152a0 <__errno>
80090c4: 34 02 00 7a mvi r2,122
80090c8: 58 22 00 00 sw (r1+0),r2
80090cc: 34 01 ff ff mvi r1,-1
80090d0: e3 ff ff eb bi 800907c <_POSIX_Message_queue_Receive_support+0x64>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
80090d4: 34 01 ff ff mvi r1,-1
80090d8: 5b 81 00 20 sw (sp+32),r1
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
80090dc: 34 05 00 00 mvi r5,0
80090e0: 5e 00 00 16 bne r16,r0,8009138 <_POSIX_Message_queue_Receive_support+0x120><== ALWAYS TAKEN
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
80090e4: 78 0b 08 02 mvhi r11,0x802
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
80090e8: 34 e1 00 1c addi r1,r7,28
80090ec: b9 80 10 00 mv r2,r12
80090f0: b9 e0 18 00 mv r3,r15
80090f4: 37 84 00 20 addi r4,sp,32
80090f8: b9 c0 30 00 mv r6,r14
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
80090fc: 39 6b a2 88 ori r11,r11,0xa288
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
8009100: f8 00 07 d1 calli 800b044 <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
8009104: f8 00 10 a1 calli 800d388 <_Thread_Enable_dispatch>
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
8009108: 29 6c 00 0c lw r12,(r11+12)
RTEMS_INLINE_ROUTINE unsigned int _POSIX_Message_queue_Priority_from_core(
CORE_message_queue_Submit_types priority
)
{
/* absolute value without a library dependency */
return ((priority >= 0) ? priority : -priority);
800910c: 34 02 00 1f mvi r2,31
8009110: 29 81 00 24 lw r1,(r12+36)
8009114: f8 00 6e 11 calli 8024958 <__ashrsi3>
8009118: 29 83 00 24 lw r3,(r12+36)
if ( !_Thread_Executing->Wait.return_code )
800911c: 29 82 00 34 lw r2,(r12+52)
8009120: 98 23 18 00 xor r3,r1,r3
8009124: c8 61 08 00 sub r1,r3,r1
do_wait,
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
8009128: 59 a1 00 00 sw (r13+0),r1
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
800912c: 5c 40 00 06 bne r2,r0,8009144 <_POSIX_Message_queue_Receive_support+0x12c>
return length_out;
8009130: 2b 81 00 20 lw r1,(sp+32)
8009134: e3 ff ff d2 bi 800907c <_POSIX_Message_queue_Receive_support+0x64>
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
8009138: 21 05 40 00 andi r5,r8,0x4000
length_out = -1;
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
800913c: 64 a5 00 00 cmpei r5,r5,0
8009140: e3 ff ff e9 bi 80090e4 <_POSIX_Message_queue_Receive_support+0xcc>
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
return length_out;
rtems_set_errno_and_return_minus_one(
8009144: f8 00 30 57 calli 80152a0 <__errno>
8009148: b8 20 60 00 mv r12,r1
800914c: 29 61 00 0c lw r1,(r11+12)
8009150: 28 21 00 34 lw r1,(r1+52)
8009154: f8 00 00 c2 calli 800945c <_POSIX_Message_queue_Translate_core_message_queue_return_code>
8009158: 59 81 00 00 sw (r12+0),r1
800915c: 34 01 ff ff mvi r1,-1
8009160: e3 ff ff c7 bi 800907c <_POSIX_Message_queue_Receive_support+0x64>
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
_Thread_Enable_dispatch();
8009164: f8 00 10 89 calli 800d388 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EBADF );
8009168: f8 00 30 4e calli 80152a0 <__errno>
800916c: 34 02 00 09 mvi r2,9
8009170: 58 22 00 00 sw (r1+0),r2
8009174: 34 01 ff ff mvi r1,-1
8009178: e3 ff ff c1 bi 800907c <_POSIX_Message_queue_Receive_support+0x64>
08008b9c <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
8008b9c: 37 9c ff fc addi sp,sp,-4
8008ba0: 5b 9d 00 04 sw (sp+4),ra
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
8008ba4: 28 22 01 20 lw r2,(r1+288)
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
8008ba8: 28 43 00 d8 lw r3,(r2+216)
8008bac: 5c 60 00 04 bne r3,r0,8008bbc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x20><== NEVER TAKEN
8008bb0: 28 44 00 dc lw r4,(r2+220)
8008bb4: 34 03 00 01 mvi r3,1
8008bb8: 44 83 00 05 be r4,r3,8008bcc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x30>
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
} else
_Thread_Enable_dispatch();
8008bbc: fb ff f3 30 calli 800587c <_Thread_Enable_dispatch>
}
8008bc0: 2b 9d 00 04 lw ra,(sp+4)
8008bc4: 37 9c 00 04 addi sp,sp,4
8008bc8: c3 a0 00 00 ret
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
8008bcc: 28 42 00 e0 lw r2,(r2+224)
8008bd0: 44 40 ff fb be r2,r0,8008bbc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x20>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
8008bd4: 78 03 08 01 mvhi r3,0x801
8008bd8: 38 63 68 58 ori r3,r3,0x6858
8008bdc: 28 64 00 00 lw r4,(r3+0)
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
8008be0: 34 02 ff ff mvi r2,-1
8008be4: 34 84 ff ff addi r4,r4,-1
8008be8: 58 64 00 00 sw (r3+0),r4
8008bec: f8 00 02 89 calli 8009610 <_POSIX_Thread_Exit>
8008bf0: e3 ff ff f4 bi 8008bc0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x24>
0800a6d8 <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
800a6d8: 37 9c ff e8 addi sp,sp,-24
800a6dc: 5b 8b 00 18 sw (sp+24),r11
800a6e0: 5b 8c 00 14 sw (sp+20),r12
800a6e4: 5b 8d 00 10 sw (sp+16),r13
800a6e8: 5b 8e 00 0c sw (sp+12),r14
800a6ec: 5b 8f 00 08 sw (sp+8),r15
800a6f0: 5b 9d 00 04 sw (sp+4),ra
800a6f4: b8 20 68 00 mv r13,r1
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a6f8: 28 41 00 00 lw r1,(r2+0)
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
800a6fc: b8 40 60 00 mv r12,r2
800a700: b8 60 70 00 mv r14,r3
800a704: b8 80 78 00 mv r15,r4
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a708: fb ff ff ec calli 800a6b8 <_POSIX_Priority_Is_valid>
return EINVAL;
800a70c: 34 0b 00 16 mvi r11,22
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a710: 44 20 00 0c be r1,r0,800a740 <_POSIX_Thread_Translate_sched_param+0x68><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
800a714: 59 c0 00 00 sw (r14+0),r0
*budget_callout = NULL;
800a718: 59 e0 00 00 sw (r15+0),r0
if ( policy == SCHED_OTHER ) {
800a71c: 45 a0 00 12 be r13,r0,800a764 <_POSIX_Thread_Translate_sched_param+0x8c>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
800a720: 34 01 00 01 mvi r1,1
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
800a724: 34 0b 00 00 mvi r11,0
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
800a728: 45 a1 00 06 be r13,r1,800a740 <_POSIX_Thread_Translate_sched_param+0x68>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
800a72c: 34 01 00 02 mvi r1,2
800a730: 45 a1 00 2b be r13,r1,800a7dc <_POSIX_Thread_Translate_sched_param+0x104>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
800a734: 34 01 00 04 mvi r1,4
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
800a738: 34 0b 00 16 mvi r11,22
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
800a73c: 45 a1 00 0e be r13,r1,800a774 <_POSIX_Thread_Translate_sched_param+0x9c>
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
return 0;
}
return EINVAL;
}
800a740: b9 60 08 00 mv r1,r11
800a744: 2b 9d 00 04 lw ra,(sp+4)
800a748: 2b 8b 00 18 lw r11,(sp+24)
800a74c: 2b 8c 00 14 lw r12,(sp+20)
800a750: 2b 8d 00 10 lw r13,(sp+16)
800a754: 2b 8e 00 0c lw r14,(sp+12)
800a758: 2b 8f 00 08 lw r15,(sp+8)
800a75c: 37 9c 00 18 addi sp,sp,24
800a760: c3 a0 00 00 ret
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
*budget_callout = NULL;
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
800a764: 34 01 00 01 mvi r1,1
800a768: 59 c1 00 00 sw (r14+0),r1
return 0;
800a76c: 34 0b 00 00 mvi r11,0
800a770: e3 ff ff f4 bi 800a740 <_POSIX_Thread_Translate_sched_param+0x68>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
800a774: 29 81 00 08 lw r1,(r12+8)
800a778: 5c 20 00 03 bne r1,r0,800a784 <_POSIX_Thread_Translate_sched_param+0xac>
800a77c: 29 82 00 0c lw r2,(r12+12)
800a780: 44 41 ff f0 be r2,r1,800a740 <_POSIX_Thread_Translate_sched_param+0x68>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
800a784: 29 81 00 10 lw r1,(r12+16)
800a788: 5c 20 00 04 bne r1,r0,800a798 <_POSIX_Thread_Translate_sched_param+0xc0>
800a78c: 29 82 00 14 lw r2,(r12+20)
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
800a790: 34 0b 00 16 mvi r11,22
if ( policy == SCHED_SPORADIC ) {
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
800a794: 44 41 ff eb be r2,r1,800a740 <_POSIX_Thread_Translate_sched_param+0x68>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
800a798: 35 81 00 08 addi r1,r12,8
800a79c: fb ff f4 34 calli 800786c <_Timespec_To_ticks>
800a7a0: b8 20 68 00 mv r13,r1
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
800a7a4: 35 81 00 10 addi r1,r12,16
800a7a8: fb ff f4 31 calli 800786c <_Timespec_To_ticks>
return EINVAL;
800a7ac: 34 0b 00 16 mvi r11,22
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
800a7b0: 54 2d ff e4 bgu r1,r13,800a740 <_POSIX_Thread_Translate_sched_param+0x68>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
800a7b4: 29 81 00 04 lw r1,(r12+4)
800a7b8: fb ff ff c0 calli 800a6b8 <_POSIX_Priority_Is_valid>
800a7bc: 44 20 ff e1 be r1,r0,800a740 <_POSIX_Thread_Translate_sched_param+0x68>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
800a7c0: 78 01 08 00 mvhi r1,0x800
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
800a7c4: 34 02 00 03 mvi r2,3
800a7c8: 59 c2 00 00 sw (r14+0),r2
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
800a7cc: 38 21 3b b4 ori r1,r1,0x3bb4
800a7d0: 59 e1 00 00 sw (r15+0),r1
return 0;
800a7d4: 34 0b 00 00 mvi r11,0
800a7d8: e3 ff ff da bi 800a740 <_POSIX_Thread_Translate_sched_param+0x68>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
800a7dc: 59 cd 00 00 sw (r14+0),r13
return 0;
800a7e0: e3 ff ff d8 bi 800a740 <_POSIX_Thread_Translate_sched_param+0x68>
0800934c <_POSIX_Threads_Exitted_extension>:
* This method is invoked each time a thread exits.
*/
void _POSIX_Threads_Exitted_extension(
Thread_Control *executing
)
{
800934c: 37 9c ff f8 addi sp,sp,-8
8009350: 5b 8b 00 08 sw (sp+8),r11
8009354: 5b 9d 00 04 sw (sp+4),ra
8009358: b8 20 58 00 mv r11,r1
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
800935c: 28 21 00 08 lw r1,(r1+8)
8009360: 34 02 00 18 mvi r2,24
8009364: f8 00 23 99 calli 80121c8 <__lshrsi3>
8009368: 20 21 00 07 andi r1,r1,0x7
/*
* If the executing thread was not created with the POSIX API, then this
* API do not get to define its exit behavior.
*/
if ( _Objects_Get_API( executing->Object.id ) == OBJECTS_POSIX_API )
800936c: 34 02 00 03 mvi r2,3
8009370: 44 22 00 05 be r1,r2,8009384 <_POSIX_Threads_Exitted_extension+0x38>
pthread_exit( executing->Wait.return_argument );
}
8009374: 2b 9d 00 04 lw ra,(sp+4)
8009378: 2b 8b 00 08 lw r11,(sp+8)
800937c: 37 9c 00 08 addi sp,sp,8
8009380: c3 a0 00 00 ret
/*
* If the executing thread was not created with the POSIX API, then this
* API do not get to define its exit behavior.
*/
if ( _Objects_Get_API( executing->Object.id ) == OBJECTS_POSIX_API )
pthread_exit( executing->Wait.return_argument );
8009384: 29 61 00 28 lw r1,(r11+40)
8009388: f8 00 0c e5 calli 800c71c <pthread_exit>
}
800938c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8009390: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
8009394: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
8009398: c3 a0 00 00 ret <== NOT EXECUTED
0800380c <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
800380c: 37 9c ff a8 addi sp,sp,-88
8003810: 5b 8b 00 14 sw (sp+20),r11
8003814: 5b 8c 00 10 sw (sp+16),r12
8003818: 5b 8d 00 0c sw (sp+12),r13
800381c: 5b 8e 00 08 sw (sp+8),r14
8003820: 5b 9d 00 04 sw (sp+4),ra
uint32_t maximum;
posix_initialization_threads_table *user_threads;
pthread_t thread_id;
pthread_attr_t attr;
user_threads = Configuration_POSIX_API.User_initialization_threads_table;
8003824: 78 01 08 01 mvhi r1,0x801
8003828: 38 21 f0 a8 ori r1,r1,0xf0a8
maximum = Configuration_POSIX_API.number_of_initialization_threads;
800382c: 28 2e 00 30 lw r14,(r1+48)
uint32_t maximum;
posix_initialization_threads_table *user_threads;
pthread_t thread_id;
pthread_attr_t attr;
user_threads = Configuration_POSIX_API.User_initialization_threads_table;
8003830: 28 2c 00 34 lw r12,(r1+52)
maximum = Configuration_POSIX_API.number_of_initialization_threads;
if ( !user_threads || maximum == 0 )
8003834: 65 c2 00 00 cmpei r2,r14,0
8003838: 65 81 00 00 cmpei r1,r12,0
800383c: b8 41 08 00 or r1,r2,r1
8003840: 5c 20 00 15 bne r1,r0,8003894 <_POSIX_Threads_Initialize_user_threads_body+0x88><== NEVER TAKEN
8003844: 34 0d 00 00 mvi r13,0
8003848: 37 8b 00 18 addi r11,sp,24
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
800384c: b9 60 08 00 mv r1,r11
8003850: f8 00 1b e5 calli 800a7e4 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
8003854: 34 02 00 02 mvi r2,2
8003858: b9 60 08 00 mv r1,r11
800385c: f8 00 1c 19 calli 800a8c0 <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
8003860: 29 82 00 04 lw r2,(r12+4)
8003864: b9 60 08 00 mv r1,r11
8003868: f8 00 1c 22 calli 800a8f0 <pthread_attr_setstacksize>
status = pthread_create(
800386c: 29 83 00 00 lw r3,(r12+0)
8003870: 37 81 00 58 addi r1,sp,88
8003874: b9 60 10 00 mv r2,r11
8003878: 34 04 00 00 mvi r4,0
800387c: fb ff fe db calli 80033e8 <pthread_create>
8003880: b8 20 18 00 mv r3,r1
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
8003884: 5c 20 00 0b bne r1,r0,80038b0 <_POSIX_Threads_Initialize_user_threads_body+0xa4><== NEVER TAKEN
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
8003888: 35 ad 00 01 addi r13,r13,1
800388c: 35 8c 00 08 addi r12,r12,8
8003890: 55 cd ff ef bgu r14,r13,800384c <_POSIX_Threads_Initialize_user_threads_body+0x40><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
8003894: 2b 9d 00 04 lw ra,(sp+4)
8003898: 2b 8b 00 14 lw r11,(sp+20)
800389c: 2b 8c 00 10 lw r12,(sp+16)
80038a0: 2b 8d 00 0c lw r13,(sp+12)
80038a4: 2b 8e 00 08 lw r14,(sp+8)
80038a8: 37 9c 00 58 addi sp,sp,88
80038ac: c3 a0 00 00 ret
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
80038b0: 34 01 00 02 mvi r1,2 <== NOT EXECUTED
80038b4: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
80038b8: f8 00 07 5f calli 8005634 <_Internal_error_Occurred> <== NOT EXECUTED
08009594 <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
8009594: 37 9c ff f4 addi sp,sp,-12
8009598: 5b 8b 00 0c sw (sp+12),r11
800959c: 5b 8c 00 08 sw (sp+8),r12
80095a0: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
POSIX_API_Control *api;
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
80095a4: 28 4c 01 20 lw r12,(r2+288)
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
80095a8: b8 40 58 00 mv r11,r2
the_thread = argument;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
80095ac: 35 81 00 98 addi r1,r12,152
80095b0: f8 00 05 5c calli 800ab20 <_Timespec_To_ticks>
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
80095b4: 78 03 08 01 mvhi r3,0x801
80095b8: 38 63 40 c0 ori r3,r3,0x40c0
80095bc: 29 84 00 88 lw r4,(r12+136)
80095c0: 40 62 00 00 lbu r2,(r3+0)
*/
#if 0
printk( "TSR %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
80095c4: 29 63 00 1c lw r3,(r11+28)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
the_thread->cpu_time_budget = ticks;
80095c8: 59 61 00 78 sw (r11+120),r1
80095cc: c8 44 10 00 sub r2,r2,r4
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
80095d0: 59 62 00 18 sw (r11+24),r2
*/
#if 0
printk( "TSR %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
80095d4: 5c 60 00 06 bne r3,r0,80095ec <_POSIX_Threads_Sporadic_budget_TSR+0x58><== NEVER TAKEN
/*
* If this would make them less important, then do not change it.
*/
if ( the_thread->current_priority > new_priority ) {
80095d8: 29 61 00 14 lw r1,(r11+20)
80095dc: 50 41 00 04 bgeu r2,r1,80095ec <_POSIX_Threads_Sporadic_budget_TSR+0x58>
_Thread_Change_priority( the_thread, new_priority, true );
80095e0: b9 60 08 00 mv r1,r11
80095e4: 34 03 00 01 mvi r3,1
80095e8: fb ff ef 5a calli 8005350 <_Thread_Change_priority>
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
80095ec: 35 81 00 90 addi r1,r12,144
80095f0: f8 00 05 4c calli 800ab20 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
80095f4: 59 81 00 b4 sw (r12+180),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
80095f8: 78 01 08 01 mvhi r1,0x801
80095fc: 35 82 00 a8 addi r2,r12,168
8009600: 38 21 49 88 ori r1,r1,0x4988
8009604: fb ff f5 5a calli 8006b6c <_Watchdog_Insert>
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
}
8009608: 2b 9d 00 04 lw ra,(sp+4)
800960c: 2b 8b 00 0c lw r11,(sp+12)
8009610: 2b 8c 00 08 lw r12,(sp+8)
8009614: 37 9c 00 0c addi sp,sp,12
8009618: c3 a0 00 00 ret
0800961c <_POSIX_Threads_Sporadic_budget_callout>:
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
800961c: 37 9c ff fc addi sp,sp,-4
8009620: 5b 9d 00 04 sw (sp+4),ra
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8009624: 28 22 01 20 lw r2,(r1+288)
8009628: 78 04 08 01 mvhi r4,0x801
800962c: 38 84 40 c0 ori r4,r4,0x40c0
8009630: 28 42 00 8c lw r2,(r2+140)
8009634: 40 84 00 00 lbu r4,(r4+0)
*/
#if 0
printk( "callout %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
8009638: 28 25 00 1c lw r5,(r1+28)
800963c: c8 82 10 00 sub r2,r4,r2
/*
* This will prevent the thread from consuming its entire "budget"
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
8009640: 34 04 ff ff mvi r4,-1
8009644: 58 24 00 78 sw (r1+120),r4
new_priority = _POSIX_Priority_To_core(api->schedparam.sched_ss_low_priority);
the_thread->real_priority = new_priority;
8009648: 58 22 00 18 sw (r1+24),r2
*/
#if 0
printk( "callout %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
800964c: 5c a0 00 05 bne r5,r0,8009660 <_POSIX_Threads_Sporadic_budget_callout+0x44><== NEVER TAKEN
/*
* Make sure we are actually lowering it. If they have lowered it
* to logically lower than sched_ss_low_priority, then we do not want to
* change it.
*/
if ( the_thread->current_priority < new_priority ) {
8009650: 28 23 00 14 lw r3,(r1+20)
8009654: 50 62 00 03 bgeu r3,r2,8009660 <_POSIX_Threads_Sporadic_budget_callout+0x44><== NEVER TAKEN
_Thread_Change_priority( the_thread, new_priority, true );
8009658: 34 03 00 01 mvi r3,1
800965c: fb ff ef 3d calli 8005350 <_Thread_Change_priority>
#if 0
printk( "lower priority\n" );
#endif
}
}
}
8009660: 2b 9d 00 04 lw ra,(sp+4)
8009664: 37 9c 00 04 addi sp,sp,4
8009668: c3 a0 00 00 ret
0800c200 <_POSIX_Threads_cancel_run>:
#include <rtems/posix/threadsup.h>
void _POSIX_Threads_cancel_run(
Thread_Control *the_thread
)
{
800c200: 37 9c ff ec addi sp,sp,-20
800c204: 5b 8b 00 14 sw (sp+20),r11
800c208: 5b 8c 00 10 sw (sp+16),r12
800c20c: 5b 8d 00 0c sw (sp+12),r13
800c210: 5b 8e 00 08 sw (sp+8),r14
800c214: 5b 9d 00 04 sw (sp+4),ra
POSIX_Cancel_Handler_control *handler;
Chain_Control *handler_stack;
POSIX_API_Control *thread_support;
ISR_Level level;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
800c218: 28 2c 01 20 lw r12,(r1+288)
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
800c21c: 34 01 00 01 mvi r1,1
while ( !_Chain_Is_empty( handler_stack ) ) {
800c220: 29 82 00 e4 lw r2,(r12+228)
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
800c224: 59 81 00 d8 sw (r12+216),r1
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800c228: 35 8d 00 e8 addi r13,r12,232
while ( !_Chain_Is_empty( handler_stack ) ) {
800c22c: 44 4d 00 12 be r2,r13,800c274 <_POSIX_Threads_cancel_run+0x74>
_ISR_Disable( level );
800c230: 34 0e ff fe mvi r14,-2
800c234: 90 00 08 00 rcsr r1,IE
800c238: a0 2e 10 00 and r2,r1,r14
800c23c: d0 02 00 00 wcsr IE,r2
handler = (POSIX_Cancel_Handler_control *)
800c240: 29 8b 00 ec lw r11,(r12+236)
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
800c244: 29 63 00 00 lw r3,(r11+0)
previous = the_node->previous;
800c248: 29 62 00 04 lw r2,(r11+4)
next->previous = previous;
800c24c: 58 62 00 04 sw (r3+4),r2
previous->next = next;
800c250: 58 43 00 00 sw (r2+0),r3
_Chain_Tail( handler_stack )->previous;
_Chain_Extract_unprotected( &handler->Node );
_ISR_Enable( level );
800c254: d0 01 00 00 wcsr IE,r1
(*handler->routine)( handler->arg );
800c258: 29 62 00 08 lw r2,(r11+8)
800c25c: 29 61 00 0c lw r1,(r11+12)
800c260: d8 40 00 00 call r2
_Workspace_Free( handler );
800c264: b9 60 08 00 mv r1,r11
800c268: fb ff eb 44 calli 8006f78 <_Workspace_Free>
handler_stack = &thread_support->Cancellation_Handlers;
thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
while ( !_Chain_Is_empty( handler_stack ) ) {
800c26c: 29 81 00 e4 lw r1,(r12+228)
800c270: 5c 2d ff f1 bne r1,r13,800c234 <_POSIX_Threads_cancel_run+0x34><== NEVER TAKEN
(*handler->routine)( handler->arg );
_Workspace_Free( handler );
}
}
800c274: 2b 9d 00 04 lw ra,(sp+4)
800c278: 2b 8b 00 14 lw r11,(sp+20)
800c27c: 2b 8c 00 10 lw r12,(sp+16)
800c280: 2b 8d 00 0c lw r13,(sp+12)
800c284: 2b 8e 00 08 lw r14,(sp+8)
800c288: 37 9c 00 14 addi sp,sp,20
800c28c: c3 a0 00 00 ret
080034c8 <_POSIX_Timer_TSR>:
* This is the operation that is run when a timer expires
*/
void _POSIX_Timer_TSR(
Objects_Id timer __attribute__((unused)),
void *data)
{
80034c8: 37 9c ff f8 addi sp,sp,-8
80034cc: 5b 8b 00 08 sw (sp+8),r11
80034d0: 5b 9d 00 04 sw (sp+4),ra
80034d4: b8 40 58 00 mv r11,r2
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
80034d8: 28 42 00 68 lw r2,(r2+104)
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
80034dc: 29 61 00 54 lw r1,(r11+84)
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
80034e0: 34 42 00 01 addi r2,r2,1
80034e4: 59 62 00 68 sw (r11+104),r2
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
80034e8: 5c 20 00 0d bne r1,r0,800351c <_POSIX_Timer_TSR+0x54>
80034ec: 29 62 00 58 lw r2,(r11+88)
80034f0: 5c 41 00 0b bne r2,r1,800351c <_POSIX_Timer_TSR+0x54> <== ALWAYS TAKEN
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
80034f4: 34 01 00 04 mvi r1,4 <== NOT EXECUTED
80034f8: 31 61 00 3c sb (r11+60),r1 <== NOT EXECUTED
/*
* The sending of the signal to the process running the handling function
* specified for that signal is simulated
*/
if ( pthread_kill ( ptimer->thread_id, ptimer->inf.sigev_signo ) ) {
80034fc: 29 61 00 38 lw r1,(r11+56)
8003500: 29 62 00 44 lw r2,(r11+68)
8003504: f8 00 19 f0 calli 8009cc4 <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
8003508: 59 60 00 68 sw (r11+104),r0
}
800350c: 2b 9d 00 04 lw ra,(sp+4)
8003510: 2b 8b 00 08 lw r11,(sp+8)
8003514: 37 9c 00 08 addi sp,sp,8
8003518: c3 a0 00 00 ret
ptimer->overrun = ptimer->overrun + 1;
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
800351c: 29 62 00 64 lw r2,(r11+100)
8003520: 29 63 00 08 lw r3,(r11+8)
8003524: 78 04 08 00 mvhi r4,0x800
8003528: 35 61 00 10 addi r1,r11,16
800352c: 38 84 34 c8 ori r4,r4,0x34c8
8003530: b9 60 28 00 mv r5,r11
8003534: f8 00 1b 45 calli 800a248 <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
8003538: 44 20 ff f5 be r1,r0,800350c <_POSIX_Timer_TSR+0x44> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
800353c: 35 61 00 6c addi r1,r11,108
8003540: f8 00 04 af calli 80047fc <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
8003544: 34 01 00 03 mvi r1,3
8003548: 31 61 00 3c sb (r11+60),r1
800354c: e3 ff ff ec bi 80034fc <_POSIX_Timer_TSR+0x34>
0800c368 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
800c368: 37 9c ff a0 addi sp,sp,-96
800c36c: 5b 8b 00 2c sw (sp+44),r11
800c370: 5b 8c 00 28 sw (sp+40),r12
800c374: 5b 8d 00 24 sw (sp+36),r13
800c378: 5b 8e 00 20 sw (sp+32),r14
800c37c: 5b 8f 00 1c sw (sp+28),r15
800c380: 5b 90 00 18 sw (sp+24),r16
800c384: 5b 91 00 14 sw (sp+20),r17
800c388: 5b 92 00 10 sw (sp+16),r18
800c38c: 5b 93 00 0c sw (sp+12),r19
800c390: 5b 94 00 08 sw (sp+8),r20
800c394: 5b 9d 00 04 sw (sp+4),ra
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
800c398: 37 8e 00 58 addi r14,sp,88
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
800c39c: 20 64 00 ff andi r4,r3,0xff
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
800c3a0: 34 05 00 01 mvi r5,1
800c3a4: b9 c0 18 00 mv r3,r14
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
800c3a8: b8 20 68 00 mv r13,r1
800c3ac: b8 40 58 00 mv r11,r2
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
800c3b0: f8 00 00 57 calli 800c50c <_POSIX_signals_Clear_signals>
is_global, true ) )
return false;
800c3b4: 34 06 00 00 mvi r6,0
{
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
800c3b8: 44 20 00 42 be r1,r0,800c4c0 <_POSIX_signals_Check_signal+0x158>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
800c3bc: b5 6b 20 00 add r4,r11,r11
800c3c0: b4 8b 20 00 add r4,r4,r11
800c3c4: 78 05 08 01 mvhi r5,0x801
800c3c8: b4 84 20 00 add r4,r4,r4
800c3cc: 38 a5 4d c8 ori r5,r5,0x4dc8
800c3d0: b4 84 20 00 add r4,r4,r4
800c3d4: b4 a4 28 00 add r5,r5,r4
800c3d8: 28 a7 00 08 lw r7,(r5+8)
800c3dc: 34 01 00 01 mvi r1,1
800c3e0: 44 e1 00 38 be r7,r1,800c4c0 <_POSIX_signals_Check_signal+0x158><== NEVER TAKEN
/*
* We have to save the blocking information of the current wait queue
* because the signal handler may subsequently go on and put the thread
* on a wait queue, for its own purposes.
*/
memcpy( &stored_thread_wait_information, &_Thread_Executing->Wait,
800c3e4: 78 0c 08 01 mvhi r12,0x801
800c3e8: 39 8c 4d 78 ori r12,r12,0x4d78
800c3ec: 29 84 00 0c lw r4,(r12+12)
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
800c3f0: 29 af 00 d0 lw r15,(r13+208)
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
800c3f4: 28 a1 00 04 lw r1,(r5+4)
/*
* We have to save the blocking information of the current wait queue
* because the signal handler may subsequently go on and put the thread
* on a wait queue, for its own purposes.
*/
memcpy( &stored_thread_wait_information, &_Thread_Executing->Wait,
800c3f8: 28 94 00 20 lw r20,(r4+32)
800c3fc: 28 93 00 24 lw r19,(r4+36)
800c400: 28 92 00 28 lw r18,(r4+40)
800c404: 28 91 00 2c lw r17,(r4+44)
800c408: 28 90 00 30 lw r16,(r4+48)
800c40c: 28 8a 00 34 lw r10,(r4+52)
800c410: 28 89 00 38 lw r9,(r4+56)
800c414: 28 88 00 3c lw r8,(r4+60)
800c418: 28 86 00 40 lw r6,(r4+64)
800c41c: 28 83 00 44 lw r3,(r4+68)
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
800c420: 28 a2 00 00 lw r2,(r5+0)
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
800c424: b8 2f 08 00 or r1,r1,r15
800c428: 59 a1 00 d0 sw (r13+208),r1
/*
* We have to save the blocking information of the current wait queue
* because the signal handler may subsequently go on and put the thread
* on a wait queue, for its own purposes.
*/
memcpy( &stored_thread_wait_information, &_Thread_Executing->Wait,
800c42c: 5b 94 00 30 sw (sp+48),r20
800c430: 5b 93 00 34 sw (sp+52),r19
800c434: 5b 92 00 38 sw (sp+56),r18
800c438: 5b 91 00 3c sw (sp+60),r17
800c43c: 5b 90 00 40 sw (sp+64),r16
800c440: 5b 8a 00 44 sw (sp+68),r10
800c444: 5b 89 00 48 sw (sp+72),r9
800c448: 5b 88 00 4c sw (sp+76),r8
800c44c: 5b 86 00 50 sw (sp+80),r6
800c450: 5b 83 00 54 sw (sp+84),r3
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
800c454: 34 01 00 02 mvi r1,2
800c458: 44 41 00 28 be r2,r1,800c4f8 <_POSIX_signals_Check_signal+0x190>
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
800c45c: b9 60 08 00 mv r1,r11
800c460: d8 e0 00 00 call r7
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
800c464: 2b 81 00 30 lw r1,(sp+48)
800c468: 29 82 00 0c lw r2,(r12+12)
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
return true;
800c46c: 34 06 00 01 mvi r6,1
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
800c470: 58 41 00 20 sw (r2+32),r1
800c474: 2b 81 00 34 lw r1,(sp+52)
800c478: 58 41 00 24 sw (r2+36),r1
800c47c: 2b 81 00 38 lw r1,(sp+56)
800c480: 58 41 00 28 sw (r2+40),r1
800c484: 2b 81 00 3c lw r1,(sp+60)
800c488: 58 41 00 2c sw (r2+44),r1
800c48c: 2b 81 00 40 lw r1,(sp+64)
800c490: 58 41 00 30 sw (r2+48),r1
800c494: 2b 81 00 44 lw r1,(sp+68)
800c498: 58 41 00 34 sw (r2+52),r1
800c49c: 2b 81 00 48 lw r1,(sp+72)
800c4a0: 58 41 00 38 sw (r2+56),r1
800c4a4: 2b 81 00 4c lw r1,(sp+76)
800c4a8: 58 41 00 3c sw (r2+60),r1
800c4ac: 2b 81 00 50 lw r1,(sp+80)
800c4b0: 58 41 00 40 sw (r2+64),r1
800c4b4: 2b 81 00 54 lw r1,(sp+84)
800c4b8: 58 41 00 44 sw (r2+68),r1
sizeof( Thread_Wait_information ));
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
800c4bc: 59 af 00 d0 sw (r13+208),r15
return true;
}
800c4c0: b8 c0 08 00 mv r1,r6
800c4c4: 2b 9d 00 04 lw ra,(sp+4)
800c4c8: 2b 8b 00 2c lw r11,(sp+44)
800c4cc: 2b 8c 00 28 lw r12,(sp+40)
800c4d0: 2b 8d 00 24 lw r13,(sp+36)
800c4d4: 2b 8e 00 20 lw r14,(sp+32)
800c4d8: 2b 8f 00 1c lw r15,(sp+28)
800c4dc: 2b 90 00 18 lw r16,(sp+24)
800c4e0: 2b 91 00 14 lw r17,(sp+20)
800c4e4: 2b 92 00 10 lw r18,(sp+16)
800c4e8: 2b 93 00 0c lw r19,(sp+12)
800c4ec: 2b 94 00 08 lw r20,(sp+8)
800c4f0: 37 9c 00 60 addi sp,sp,96
800c4f4: c3 a0 00 00 ret
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
800c4f8: b9 60 08 00 mv r1,r11
800c4fc: b9 c0 10 00 mv r2,r14
800c500: 34 03 00 00 mvi r3,0
800c504: d8 e0 00 00 call r7
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
800c508: e3 ff ff d7 bi 800c464 <_POSIX_signals_Check_signal+0xfc>
0800ccdc <_POSIX_signals_Clear_process_signals>:
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
800ccdc: 37 9c ff f4 addi sp,sp,-12
800cce0: 5b 8b 00 0c sw (sp+12),r11
800cce4: 5b 8c 00 08 sw (sp+8),r12
800cce8: 5b 9d 00 04 sw (sp+4),ra
800ccec: b8 20 10 00 mv r2,r1
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
800ccf0: 90 00 60 00 rcsr r12,IE
800ccf4: 34 01 ff fe mvi r1,-2
800ccf8: a1 81 08 00 and r1,r12,r1
800ccfc: d0 01 00 00 wcsr IE,r1
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
800cd00: b4 42 20 00 add r4,r2,r2
800cd04: b4 82 20 00 add r4,r4,r2
800cd08: 78 01 08 01 mvhi r1,0x801
800cd0c: b4 84 18 00 add r3,r4,r4
800cd10: 38 21 4d c8 ori r1,r1,0x4dc8
800cd14: b4 63 18 00 add r3,r3,r3
800cd18: b4 23 18 00 add r3,r1,r3
800cd1c: 28 63 00 00 lw r3,(r3+0)
800cd20: 34 01 00 02 mvi r1,2
800cd24: 44 61 00 10 be r3,r1,800cd64 <_POSIX_signals_Clear_process_signals+0x88>
800cd28: 34 42 ff ff addi r2,r2,-1
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
800cd2c: 78 0b 08 01 mvhi r11,0x801
800cd30: 34 01 00 01 mvi r1,1
800cd34: f8 00 14 d7 calli 8012090 <__ashlsi3>
800cd38: 39 6b 4f bc ori r11,r11,0x4fbc
800cd3c: 29 62 00 00 lw r2,(r11+0)
800cd40: a4 20 08 00 not r1,r1
800cd44: a0 22 08 00 and r1,r1,r2
800cd48: 59 61 00 00 sw (r11+0),r1
}
_ISR_Enable( level );
800cd4c: d0 0c 00 00 wcsr IE,r12
}
800cd50: 2b 9d 00 04 lw ra,(sp+4)
800cd54: 2b 8b 00 0c lw r11,(sp+12)
800cd58: 2b 8c 00 08 lw r12,(sp+8)
800cd5c: 37 9c 00 0c addi sp,sp,12
800cd60: c3 a0 00 00 ret
800cd64: 78 01 08 01 mvhi r1,0x801
800cd68: b4 84 20 00 add r4,r4,r4
800cd6c: 38 21 4f c0 ori r1,r1,0x4fc0
800cd70: b4 84 20 00 add r4,r4,r4
800cd74: b4 24 20 00 add r4,r1,r4
ISR_Level level;
_ISR_Disable( level );
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
800cd78: 28 81 00 00 lw r1,(r4+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800cd7c: 34 84 00 04 addi r4,r4,4
800cd80: 44 24 ff ea be r1,r4,800cd28 <_POSIX_signals_Clear_process_signals+0x4c><== ALWAYS TAKEN
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
}
_ISR_Enable( level );
800cd84: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED
}
800cd88: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800cd8c: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
800cd90: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
800cd94: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
800cd98: c3 a0 00 00 ret <== NOT EXECUTED
0800419c <_POSIX_signals_Get_lowest>:
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
800419c: 37 9c ff f0 addi sp,sp,-16
80041a0: 5b 8b 00 10 sw (sp+16),r11
80041a4: 5b 8c 00 0c sw (sp+12),r12
80041a8: 5b 8d 00 08 sw (sp+8),r13
80041ac: 5b 9d 00 04 sw (sp+4),ra
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
80041b0: 34 0b 00 1b mvi r11,27
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
80041b4: b8 20 60 00 mv r12,r1
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
80041b8: 34 0d 00 20 mvi r13,32
80041bc: 35 62 ff ff addi r2,r11,-1
80041c0: 34 01 00 01 mvi r1,1
80041c4: f8 00 66 ff calli 801ddc0 <__ashlsi3>
if ( set & signo_to_mask( signo ) ) {
80041c8: a0 2c 08 00 and r1,r1,r12
80041cc: 5c 20 00 0d bne r1,r0,8004200 <_POSIX_signals_Get_lowest+0x64><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
80041d0: 35 6b 00 01 addi r11,r11,1
80041d4: 5d 6d ff fa bne r11,r13,80041bc <_POSIX_signals_Get_lowest+0x20>
80041d8: 34 0b 00 01 mvi r11,1
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
80041dc: 34 0d 00 1b mvi r13,27
80041e0: e0 00 00 03 bi 80041ec <_POSIX_signals_Get_lowest+0x50>
80041e4: 35 6b 00 01 addi r11,r11,1
80041e8: 45 6d 00 06 be r11,r13,8004200 <_POSIX_signals_Get_lowest+0x64><== NEVER TAKEN
80041ec: 35 62 ff ff addi r2,r11,-1
80041f0: 34 01 00 01 mvi r1,1
80041f4: f8 00 66 f3 calli 801ddc0 <__ashlsi3>
if ( set & signo_to_mask( signo ) ) {
80041f8: a0 2c 10 00 and r2,r1,r12
80041fc: 44 40 ff fa be r2,r0,80041e4 <_POSIX_signals_Get_lowest+0x48>
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
8004200: b9 60 08 00 mv r1,r11
8004204: 2b 9d 00 04 lw ra,(sp+4)
8004208: 2b 8b 00 10 lw r11,(sp+16)
800420c: 2b 8c 00 0c lw r12,(sp+12)
8004210: 2b 8d 00 08 lw r13,(sp+8)
8004214: 37 9c 00 10 addi sp,sp,16
8004218: c3 a0 00 00 ret
08026324 <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
8026324: 37 9c ff ec addi sp,sp,-20
8026328: 5b 8b 00 14 sw (sp+20),r11
802632c: 5b 8c 00 10 sw (sp+16),r12
8026330: 5b 8d 00 0c sw (sp+12),r13
8026334: 5b 8e 00 08 sw (sp+8),r14
8026338: 5b 9d 00 04 sw (sp+4),ra
802633c: b8 20 58 00 mv r11,r1
8026340: b8 40 70 00 mv r14,r2
8026344: 34 01 00 01 mvi r1,1
8026348: 34 42 ff ff addi r2,r2,-1
802634c: b8 60 68 00 mv r13,r3
8026350: fb ff 6f 84 calli 8002160 <__ashlsi3>
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
8026354: 78 02 08 02 mvhi r2,0x802
8026358: 38 42 7b b0 ori r2,r2,0x7bb0
802635c: 29 64 00 10 lw r4,(r11+16)
8026360: 28 43 00 00 lw r3,(r2+0)
{
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8026364: 29 65 01 20 lw r5,(r11+288)
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
8026368: a0 83 10 00 and r2,r4,r3
802636c: 44 43 00 21 be r2,r3,80263f0 <_POSIX_signals_Unblock_thread+0xcc>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
8026370: 28 a2 00 d0 lw r2,(r5+208)
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
8026374: 34 0c 00 00 mvi r12,0
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
8026378: a4 40 10 00 not r2,r2
802637c: a0 22 08 00 and r1,r1,r2
8026380: 44 20 00 14 be r1,r0,80263d0 <_POSIX_signals_Unblock_thread+0xac>
8026384: 78 01 10 00 mvhi r1,0x1000
8026388: a0 81 08 00 and r1,r4,r1
* it is not blocked, THEN
* we need to dispatch at the end of this ISR.
* + Any other combination, do nothing.
*/
if ( _States_Is_interruptible_by_signal( the_thread->current_state ) ) {
802638c: 44 20 00 31 be r1,r0,8026450 <_POSIX_signals_Unblock_thread+0x12c>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
8026390: 78 03 08 02 mvhi r3,0x802
the_thread->Wait.return_code = EINTR;
8026394: 34 01 00 04 mvi r1,4
8026398: 38 63 79 58 ori r3,r3,0x7958
802639c: 59 61 00 34 sw (r11+52),r1
80263a0: 28 61 00 00 lw r1,(r3+0)
80263a4: a0 81 08 00 and r1,r4,r1
/*
* In pthread_cond_wait, a thread will be blocking on a thread
* queue, but is also interruptible by a POSIX signal.
*/
if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) )
80263a8: 5c 20 00 3a bne r1,r0,8026490 <_POSIX_signals_Unblock_thread+0x16c>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_delaying (
States_Control the_states
)
{
return (the_states & STATES_DELAYING);
80263ac: 20 84 00 08 andi r4,r4,0x8
_Thread_queue_Extract_with_proxy( the_thread );
else if ( _States_Is_delaying(the_thread->current_state) ) {
80263b0: 44 8c 00 08 be r4,r12,80263d0 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
80263b4: 35 61 00 48 addi r1,r11,72
80263b8: fb ff 9e ba calli 800dea0 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
80263bc: 78 03 08 02 mvhi r3,0x802
80263c0: 38 63 77 bc ori r3,r3,0x77bc
80263c4: 28 62 00 00 lw r2,(r3+0)
80263c8: b9 60 08 00 mv r1,r11
80263cc: fb ff 98 81 calli 800c5d0 <_Thread_Clear_state>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
80263d0: b9 80 08 00 mv r1,r12
80263d4: 2b 9d 00 04 lw ra,(sp+4)
80263d8: 2b 8b 00 14 lw r11,(sp+20)
80263dc: 2b 8c 00 10 lw r12,(sp+16)
80263e0: 2b 8d 00 0c lw r13,(sp+12)
80263e4: 2b 8e 00 08 lw r14,(sp+8)
80263e8: 37 9c 00 14 addi sp,sp,20
80263ec: c3 a0 00 00 ret
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
80263f0: 29 62 00 30 lw r2,(r11+48)
80263f4: a0 22 10 00 and r2,r1,r2
80263f8: 44 40 00 20 be r2,r0,8026478 <_POSIX_signals_Unblock_thread+0x154>
the_thread->Wait.return_code = EINTR;
80263fc: 34 01 00 04 mvi r1,4
8026400: 59 61 00 34 sw (r11+52),r1
the_info = (siginfo_t *) the_thread->Wait.return_argument;
8026404: 29 61 00 28 lw r1,(r11+40)
if ( !info ) {
8026408: 45 a0 00 25 be r13,r0,802649c <_POSIX_signals_Unblock_thread+0x178>
the_info->si_signo = signo;
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
} else {
*the_info = *info;
802640c: 29 a2 00 00 lw r2,(r13+0)
8026410: 58 22 00 00 sw (r1+0),r2
8026414: 29 a2 00 04 lw r2,(r13+4)
8026418: 58 22 00 04 sw (r1+4),r2
802641c: 29 a2 00 08 lw r2,(r13+8)
8026420: 58 22 00 08 sw (r1+8),r2
}
_Thread_queue_Extract_with_proxy( the_thread );
8026424: b9 60 08 00 mv r1,r11
8026428: fb ff 9b b2 calli 800d2f0 <_Thread_queue_Extract_with_proxy>
return true;
802642c: 34 0c 00 01 mvi r12,1
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
}
8026430: b9 80 08 00 mv r1,r12
8026434: 2b 9d 00 04 lw ra,(sp+4)
8026438: 2b 8b 00 14 lw r11,(sp+20)
802643c: 2b 8c 00 10 lw r12,(sp+16)
8026440: 2b 8d 00 0c lw r13,(sp+12)
8026444: 2b 8e 00 08 lw r14,(sp+8)
8026448: 37 9c 00 14 addi sp,sp,20
802644c: c3 a0 00 00 ret
else if ( _States_Is_delaying(the_thread->current_state) ) {
(void) _Watchdog_Remove( &the_thread->Timer );
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
8026450: 5c 8c ff e0 bne r4,r12,80263d0 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
8026454: 78 01 08 02 mvhi r1,0x802
8026458: 38 21 ae f0 ori r1,r1,0xaef0
802645c: 28 22 00 08 lw r2,(r1+8)
8026460: 44 4c ff dc be r2,r12,80263d0 <_POSIX_signals_Unblock_thread+0xac>
8026464: 28 22 00 0c lw r2,(r1+12)
8026468: 5d 62 ff da bne r11,r2,80263d0 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
802646c: 34 02 00 01 mvi r2,1
8026470: 30 22 00 18 sb (r1+24),r2
8026474: e3 ff ff d7 bi 80263d0 <_POSIX_signals_Unblock_thread+0xac>
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
8026478: 28 a2 00 d0 lw r2,(r5+208)
/*
* This should only be reached via pthread_kill().
*/
return false;
802647c: 34 0c 00 00 mvi r12,0
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
8026480: a4 40 10 00 not r2,r2
8026484: a0 22 08 00 and r1,r1,r2
8026488: 5c 2c ff dd bne r1,r12,80263fc <_POSIX_signals_Unblock_thread+0xd8>
802648c: e3 ff ff d1 bi 80263d0 <_POSIX_signals_Unblock_thread+0xac>
/*
* In pthread_cond_wait, a thread will be blocking on a thread
* queue, but is also interruptible by a POSIX signal.
*/
if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) )
_Thread_queue_Extract_with_proxy( the_thread );
8026490: b9 60 08 00 mv r1,r11
8026494: fb ff 9b 97 calli 800d2f0 <_Thread_queue_Extract_with_proxy>
8026498: e3 ff ff ce bi 80263d0 <_POSIX_signals_Unblock_thread+0xac>
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
the_info->si_code = SI_USER;
802649c: 34 02 00 01 mvi r2,1
the_thread->Wait.return_code = EINTR;
the_info = (siginfo_t *) the_thread->Wait.return_argument;
if ( !info ) {
the_info->si_signo = signo;
80264a0: 58 2e 00 00 sw (r1+0),r14
the_info->si_code = SI_USER;
80264a4: 58 22 00 04 sw (r1+4),r2
the_info->si_value.sival_int = 0;
80264a8: 58 20 00 08 sw (r1+8),r0
80264ac: e3 ff ff de bi 8026424 <_POSIX_signals_Unblock_thread+0x100>
08003194 <_RTEMS_tasks_Initialize_user_tasks_body>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
8003194: 37 9c ff e8 addi sp,sp,-24
8003198: 5b 8b 00 14 sw (sp+20),r11
800319c: 5b 8c 00 10 sw (sp+16),r12
80031a0: 5b 8d 00 0c sw (sp+12),r13
80031a4: 5b 8e 00 08 sw (sp+8),r14
80031a8: 5b 9d 00 04 sw (sp+4),ra
rtems_initialization_tasks_table *user_tasks;
/*
* Move information into local variables
*/
user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table;
80031ac: 78 01 08 01 mvhi r1,0x801
80031b0: 38 21 40 8c ori r1,r1,0x408c
80031b4: 28 2b 00 2c lw r11,(r1+44)
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
80031b8: 28 2e 00 28 lw r14,(r1+40)
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
80031bc: 45 60 00 15 be r11,r0,8003210 <_RTEMS_tasks_Initialize_user_tasks_body+0x7c>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
80031c0: 45 c0 00 14 be r14,r0,8003210 <_RTEMS_tasks_Initialize_user_tasks_body+0x7c><== NEVER TAKEN
80031c4: 34 0c 00 00 mvi r12,0
return_value = rtems_task_create(
80031c8: 29 61 00 00 lw r1,(r11+0)
80031cc: 29 62 00 08 lw r2,(r11+8)
80031d0: 29 63 00 04 lw r3,(r11+4)
80031d4: 29 64 00 14 lw r4,(r11+20)
80031d8: 29 65 00 0c lw r5,(r11+12)
80031dc: 37 86 00 18 addi r6,sp,24
80031e0: fb ff ff 52 calli 8002f28 <rtems_task_create>
80031e4: b8 20 68 00 mv r13,r1
user_tasks[ index ].stack_size,
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
80031e8: 5c 20 00 11 bne r1,r0,800322c <_RTEMS_tasks_Initialize_user_tasks_body+0x98><== NEVER TAKEN
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
return_value = rtems_task_start(
80031ec: 29 63 00 18 lw r3,(r11+24)
80031f0: 2b 81 00 18 lw r1,(sp+24)
80031f4: 29 62 00 10 lw r2,(r11+16)
80031f8: f8 00 00 14 calli 8003248 <rtems_task_start>
80031fc: b8 20 18 00 mv r3,r1
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
8003200: 5c 2d 00 0f bne r1,r13,800323c <_RTEMS_tasks_Initialize_user_tasks_body+0xa8><== NEVER TAKEN
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
8003204: 35 8c 00 01 addi r12,r12,1
8003208: 35 6b 00 1c addi r11,r11,28
800320c: 55 cc ff ef bgu r14,r12,80031c8 <_RTEMS_tasks_Initialize_user_tasks_body+0x34><== NEVER TAKEN
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
}
}
8003210: 2b 9d 00 04 lw ra,(sp+4)
8003214: 2b 8b 00 14 lw r11,(sp+20)
8003218: 2b 8c 00 10 lw r12,(sp+16)
800321c: 2b 8d 00 0c lw r13,(sp+12)
8003220: 2b 8e 00 08 lw r14,(sp+8)
8003224: 37 9c 00 18 addi sp,sp,24
8003228: c3 a0 00 00 ret
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
800322c: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
8003230: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8003234: b9 a0 18 00 mv r3,r13 <== NOT EXECUTED
8003238: f8 00 04 73 calli 8004404 <_Internal_error_Occurred> <== NOT EXECUTED
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
800323c: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
8003240: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8003244: f8 00 04 70 calli 8004404 <_Internal_error_Occurred> <== NOT EXECUTED
08009a80 <_RTEMS_tasks_Switch_extension>:
/*
* Per Task Variables
*/
tvp = executing->task_variables;
8009a80: 28 21 01 28 lw r1,(r1+296)
while (tvp) {
8009a84: 44 20 00 08 be r1,r0,8009aa4 <_RTEMS_tasks_Switch_extension+0x24>
tvp->tval = *tvp->ptr;
8009a88: 28 23 00 04 lw r3,(r1+4)
*tvp->ptr = tvp->gval;
8009a8c: 28 24 00 08 lw r4,(r1+8)
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
tvp->tval = *tvp->ptr;
8009a90: 28 65 00 00 lw r5,(r3+0)
8009a94: 58 25 00 0c sw (r1+12),r5
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
8009a98: 28 21 00 00 lw r1,(r1+0)
*/
tvp = executing->task_variables;
while (tvp) {
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
8009a9c: 58 64 00 00 sw (r3+0),r4
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
8009aa0: 5c 20 ff fa bne r1,r0,8009a88 <_RTEMS_tasks_Switch_extension+0x8><== NEVER TAKEN
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
8009aa4: 28 41 01 28 lw r1,(r2+296)
while (tvp) {
8009aa8: 44 20 00 08 be r1,r0,8009ac8 <_RTEMS_tasks_Switch_extension+0x48>
tvp->gval = *tvp->ptr;
8009aac: 28 22 00 04 lw r2,(r1+4)
*tvp->ptr = tvp->tval;
8009ab0: 28 23 00 0c lw r3,(r1+12)
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
tvp->gval = *tvp->ptr;
8009ab4: 28 44 00 00 lw r4,(r2+0)
8009ab8: 58 24 00 08 sw (r1+8),r4
*tvp->ptr = tvp->tval;
tvp = (rtems_task_variable_t *)tvp->next;
8009abc: 28 21 00 00 lw r1,(r1+0)
}
tvp = heir->task_variables;
while (tvp) {
tvp->gval = *tvp->ptr;
*tvp->ptr = tvp->tval;
8009ac0: 58 43 00 00 sw (r2+0),r3
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
8009ac4: 5c 20 ff fa bne r1,r0,8009aac <_RTEMS_tasks_Switch_extension+0x2c><== NEVER TAKEN
8009ac8: c3 a0 00 00 ret
08004878 <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
8004878: 37 9c ff f4 addi sp,sp,-12
800487c: 5b 8b 00 08 sw (sp+8),r11
8004880: 5b 9d 00 04 sw (sp+4),ra
8004884: b8 20 10 00 mv r2,r1
8004888: 78 01 08 02 mvhi r1,0x802
800488c: 38 21 18 90 ori r1,r1,0x1890
8004890: 37 83 00 0c addi r3,sp,12
8004894: f8 00 09 30 calli 8006d54 <_Objects_Get>
/*
* When we get here, the Timer is already off the chain so we do not
* have to worry about that -- hence no _Watchdog_Remove().
*/
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
8004898: 2b 82 00 0c lw r2,(sp+12)
800489c: b8 20 58 00 mv r11,r1
80048a0: 44 40 00 05 be r2,r0,80048b4 <_Rate_monotonic_Timeout+0x3c><== ALWAYS TAKEN
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
80048a4: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80048a8: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
80048ac: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
80048b0: c3 a0 00 00 ret <== NOT EXECUTED
*/
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_thread = the_period->owner;
80048b4: 28 21 00 40 lw r1,(r1+64)
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_period (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_PERIOD);
80048b8: 28 23 00 10 lw r3,(r1+16)
80048bc: 20 63 40 00 andi r3,r3,0x4000
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
80048c0: 44 62 00 04 be r3,r2,80048d0 <_Rate_monotonic_Timeout+0x58>
80048c4: 28 23 00 20 lw r3,(r1+32)
80048c8: 29 62 00 08 lw r2,(r11+8)
80048cc: 44 62 00 1a be r3,r2,8004934 <_Rate_monotonic_Timeout+0xbc>
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
80048d0: 29 62 00 38 lw r2,(r11+56)
80048d4: 34 01 00 01 mvi r1,1
80048d8: 44 41 00 0c be r2,r1,8004908 <_Rate_monotonic_Timeout+0x90><== NEVER TAKEN
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
80048dc: 34 01 00 04 mvi r1,4
80048e0: 59 61 00 38 sw (r11+56),r1
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
80048e4: 78 01 08 02 mvhi r1,0x802
80048e8: 38 21 19 b8 ori r1,r1,0x19b8
80048ec: 28 22 00 00 lw r2,(r1+0)
80048f0: 34 42 ff ff addi r2,r2,-1
80048f4: 58 22 00 00 sw (r1+0),r2
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
80048f8: 2b 9d 00 04 lw ra,(sp+4)
80048fc: 2b 8b 00 08 lw r11,(sp+8)
8004900: 37 9c 00 0c addi sp,sp,12
8004904: c3 a0 00 00 ret
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
8004908: 34 02 00 03 mvi r2,3 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
800490c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
8004910: 59 62 00 38 sw (r11+56),r2 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
8004914: fb ff fe 00 calli 8004114 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004918: 29 62 00 3c lw r2,(r11+60)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800491c: 78 01 08 02 mvhi r1,0x802
8004920: 38 21 1a 98 ori r1,r1,0x1a98
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004924: 59 62 00 1c sw (r11+28),r2
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8004928: 35 62 00 10 addi r2,r11,16
800492c: f8 00 11 fd calli 8009120 <_Watchdog_Insert>
8004930: e3 ff ff ed bi 80048e4 <_Rate_monotonic_Timeout+0x6c>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
8004934: 78 03 08 01 mvhi r3,0x801
8004938: 38 63 f0 ec ori r3,r3,0xf0ec
800493c: 28 62 00 00 lw r2,(r3+0)
8004940: f8 00 0b a4 calli 80077d0 <_Thread_Clear_state>
the_thread = the_period->owner;
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
the_thread->Wait.id == the_period->Object.id ) {
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
8004944: b9 60 08 00 mv r1,r11
8004948: e3 ff ff f3 bi 8004914 <_Rate_monotonic_Timeout+0x9c>
080041c0 <_Rate_monotonic_Update_statistics>:
void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
80041c0: 37 9c ff e0 addi sp,sp,-32
80041c4: 5b 8b 00 10 sw (sp+16),r11
80041c8: 5b 8c 00 0c sw (sp+12),r12
80041cc: 5b 8d 00 08 sw (sp+8),r13
80041d0: 5b 9d 00 04 sw (sp+4),ra
80041d4: b8 20 58 00 mv r11,r1
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
80041d8: 28 21 00 54 lw r1,(r1+84)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
80041dc: 29 62 00 38 lw r2,(r11+56)
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
80041e0: 34 21 00 01 addi r1,r1,1
80041e4: 59 61 00 54 sw (r11+84),r1
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
80041e8: 34 01 00 04 mvi r1,4
80041ec: 44 41 00 36 be r2,r1,80042c4 <_Rate_monotonic_Update_statistics+0x104>
/*
* Grab status for time statistics.
*/
valid_status =
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
80041f0: 37 8c 00 14 addi r12,sp,20
80041f4: 37 8d 00 1c addi r13,sp,28
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
80041f8: b9 60 08 00 mv r1,r11
80041fc: b9 80 10 00 mv r2,r12
8004200: b9 a0 18 00 mv r3,r13
8004204: fb ff ff 8a calli 800402c <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
if (!valid_status)
8004208: 5c 20 00 07 bne r1,r0,8004224 <_Rate_monotonic_Update_statistics+0x64><== ALWAYS TAKEN
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
800420c: 2b 9d 00 04 lw ra,(sp+4)
8004210: 2b 8b 00 10 lw r11,(sp+16)
8004214: 2b 8c 00 0c lw r12,(sp+12)
8004218: 2b 8d 00 08 lw r13,(sp+8)
800421c: 37 9c 00 20 addi sp,sp,32
8004220: c3 a0 00 00 ret
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
8004224: b9 a0 10 00 mv r2,r13
8004228: 35 61 00 6c addi r1,r11,108
800422c: f8 00 11 bf calli 8008928 <_Timespec_Add_to>
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
8004230: b9 a0 08 00 mv r1,r13
8004234: 35 62 00 5c addi r2,r11,92
8004238: f8 00 12 a8 calli 8008cd8 <_Timespec_Less_than>
800423c: 44 20 00 05 be r1,r0,8004250 <_Rate_monotonic_Update_statistics+0x90>
stats->min_cpu_time = executed;
8004240: 2b 81 00 1c lw r1,(sp+28)
8004244: 59 61 00 5c sw (r11+92),r1
8004248: 2b 81 00 20 lw r1,(sp+32)
800424c: 59 61 00 60 sw (r11+96),r1
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
8004250: b9 a0 08 00 mv r1,r13
8004254: 35 62 00 64 addi r2,r11,100
8004258: f8 00 12 95 calli 8008cac <_Timespec_Greater_than>
800425c: 44 20 00 05 be r1,r0,8004270 <_Rate_monotonic_Update_statistics+0xb0>
stats->max_cpu_time = executed;
8004260: 2b 81 00 1c lw r1,(sp+28)
8004264: 59 61 00 64 sw (r11+100),r1
8004268: 2b 81 00 20 lw r1,(sp+32)
800426c: 59 61 00 68 sw (r11+104),r1
/*
* Update Wall time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
8004270: b9 80 10 00 mv r2,r12
8004274: 35 61 00 84 addi r1,r11,132
8004278: f8 00 11 ac calli 8008928 <_Timespec_Add_to>
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
800427c: b9 80 08 00 mv r1,r12
8004280: 35 62 00 74 addi r2,r11,116
8004284: f8 00 12 95 calli 8008cd8 <_Timespec_Less_than>
8004288: 5c 20 00 13 bne r1,r0,80042d4 <_Rate_monotonic_Update_statistics+0x114>
stats->min_wall_time = since_last_period;
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
800428c: b9 80 08 00 mv r1,r12
8004290: 35 62 00 7c addi r2,r11,124
8004294: f8 00 12 86 calli 8008cac <_Timespec_Greater_than>
8004298: 44 20 ff dd be r1,r0,800420c <_Rate_monotonic_Update_statistics+0x4c>
stats->max_wall_time = since_last_period;
800429c: 2b 81 00 14 lw r1,(sp+20)
80042a0: 59 61 00 7c sw (r11+124),r1
80042a4: 2b 81 00 18 lw r1,(sp+24)
80042a8: 59 61 00 80 sw (r11+128),r1
stats->min_wall_time = since_last_period;
if ( since_last_period > stats->max_wall_time )
stats->max_wall_time = since_last_period;
#endif
}
80042ac: 2b 9d 00 04 lw ra,(sp+4)
80042b0: 2b 8b 00 10 lw r11,(sp+16)
80042b4: 2b 8c 00 0c lw r12,(sp+12)
80042b8: 2b 8d 00 08 lw r13,(sp+8)
80042bc: 37 9c 00 20 addi sp,sp,32
80042c0: c3 a0 00 00 ret
*/
stats = &the_period->Statistics;
stats->count++;
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
stats->missed_count++;
80042c4: 29 61 00 58 lw r1,(r11+88)
80042c8: 34 21 00 01 addi r1,r1,1
80042cc: 59 61 00 58 sw (r11+88),r1
80042d0: e3 ff ff c8 bi 80041f0 <_Rate_monotonic_Update_statistics+0x30>
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_wall_time, &since_last_period );
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
stats->min_wall_time = since_last_period;
80042d4: 2b 81 00 14 lw r1,(sp+20)
80042d8: 59 61 00 74 sw (r11+116),r1
80042dc: 2b 81 00 18 lw r1,(sp+24)
80042e0: 59 61 00 78 sw (r11+120),r1
80042e4: e3 ff ff ea bi 800428c <_Rate_monotonic_Update_statistics+0xcc>
0800a518 <_Scheduler_priority_Block>:
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_extract(
Thread_Control *the_thread
)
{
Chain_Control *ready = the_thread->scheduler.priority->ready_chain;
800a518: 28 43 00 8c lw r3,(r2+140)
800a51c: 28 63 00 00 lw r3,(r3+0)
if ( _Chain_Has_only_one_node( ready ) ) {
800a520: 28 65 00 00 lw r5,(r3+0)
800a524: 28 64 00 08 lw r4,(r3+8)
800a528: 44 a4 00 35 be r5,r4,800a5fc <_Scheduler_priority_Block+0xe4>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
800a52c: 28 44 00 00 lw r4,(r2+0)
previous = the_node->previous;
800a530: 28 43 00 04 lw r3,(r2+4)
next->previous = previous;
800a534: 58 83 00 04 sw (r4+4),r3
previous->next = next;
800a538: 58 64 00 00 sw (r3+0),r4
RTEMS_INLINE_ROUTINE bool _Thread_Is_heir (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Heir );
800a53c: 78 03 08 01 mvhi r3,0x801
800a540: 38 63 4d 78 ori r3,r3,0x4d78
{
_Scheduler_priority_Ready_queue_extract(the_thread);
/* TODO: flash critical section */
if ( _Thread_Is_heir( the_thread ) )
800a544: 28 64 00 10 lw r4,(r3+16)
800a548: 44 44 00 07 be r2,r4,800a564 <_Scheduler_priority_Block+0x4c>
_Scheduler_priority_Schedule_body(the_scheduler);
if ( _Thread_Is_executing( the_thread ) )
800a54c: 28 61 00 0c lw r1,(r3+12)
800a550: 44 41 00 02 be r2,r1,800a558 <_Scheduler_priority_Block+0x40>
800a554: c3 a0 00 00 ret
_Thread_Dispatch_necessary = true;
800a558: 34 01 00 01 mvi r1,1
800a55c: 30 61 00 18 sb (r3+24),r1
800a560: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
800a564: 78 04 08 01 mvhi r4,0x801
800a568: 38 84 4d 98 ori r4,r4,0x4d98
800a56c: 2c 84 00 00 lhu r4,(r4+0)
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
_Scheduler_priority_Block_body(the_scheduler, the_thread);
}
800a570: 28 27 00 00 lw r7,(r1+0)
800a574: 34 01 00 ff mvi r1,255
800a578: 20 84 ff ff andi r4,r4,0xffff
800a57c: 54 81 00 3d bgu r4,r1,800a670 <_Scheduler_priority_Block+0x158>
800a580: 78 05 08 01 mvhi r5,0x801
800a584: 38 a5 34 b0 ori r5,r5,0x34b0
800a588: b4 a4 20 00 add r4,r5,r4
800a58c: 40 84 00 00 lbu r4,(r4+0)
800a590: 34 84 00 08 addi r4,r4,8
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
800a594: 78 06 08 01 mvhi r6,0x801
800a598: 38 c6 4d a0 ori r6,r6,0x4da0
800a59c: b4 84 20 00 add r4,r4,r4
800a5a0: b4 c4 30 00 add r6,r6,r4
800a5a4: 2c c1 00 00 lhu r1,(r6+0)
800a5a8: 34 06 00 ff mvi r6,255
800a5ac: 54 26 00 26 bgu r1,r6,800a644 <_Scheduler_priority_Block+0x12c>
800a5b0: b4 a1 08 00 add r1,r5,r1
800a5b4: 40 25 00 00 lbu r5,(r1+0)
800a5b8: 34 a5 00 08 addi r5,r5,8
return (_Priority_Bits_index( major ) << 4) +
800a5bc: b4 84 08 00 add r1,r4,r4
800a5c0: b4 21 08 00 add r1,r1,r1
800a5c4: b4 21 08 00 add r1,r1,r1
800a5c8: b4 a1 08 00 add r1,r5,r1
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
800a5cc: b4 21 20 00 add r4,r1,r1
800a5d0: b4 81 08 00 add r1,r4,r1
800a5d4: b4 21 08 00 add r1,r1,r1
800a5d8: b4 21 08 00 add r1,r1,r1
800a5dc: b4 e1 08 00 add r1,r7,r1
800a5e0: 28 25 00 00 lw r5,(r1+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800a5e4: 34 21 00 04 addi r1,r1,4
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
800a5e8: 34 04 00 00 mvi r4,0
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
800a5ec: 44 a1 00 02 be r5,r1,800a5f4 <_Scheduler_priority_Block+0xdc><== NEVER TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
800a5f0: b8 a0 20 00 mv r4,r5
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
800a5f4: 58 64 00 10 sw (r3+16),r4
800a5f8: e3 ff ff d5 bi 800a54c <_Scheduler_priority_Block+0x34>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
800a5fc: 34 64 00 04 addi r4,r3,4
head->next = tail;
head->previous = NULL;
800a600: 58 60 00 04 sw (r3+4),r0
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
800a604: 58 64 00 00 sw (r3+0),r4
head->previous = NULL;
tail->previous = head;
800a608: 58 63 00 08 sw (r3+8),r3
{
Chain_Control *ready = the_thread->scheduler.priority->ready_chain;
if ( _Chain_Has_only_one_node( ready ) ) {
_Chain_Initialize_empty( ready );
_Priority_bit_map_Remove( &the_thread->scheduler.priority->Priority_map );
800a60c: 28 43 00 8c lw r3,(r2+140)
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
800a610: 28 65 00 04 lw r5,(r3+4)
800a614: 2c 66 00 0e lhu r6,(r3+14)
800a618: 2c a4 00 00 lhu r4,(r5+0)
800a61c: a0 86 20 00 and r4,r4,r6
800a620: 0c a4 00 00 sh (r5+0),r4
if ( *the_priority_map->minor == 0 )
800a624: 5c 80 ff c6 bne r4,r0,800a53c <_Scheduler_priority_Block+0x24>
_Priority_Major_bit_map &= the_priority_map->block_major;
800a628: 78 04 08 01 mvhi r4,0x801
800a62c: 38 84 4d 98 ori r4,r4,0x4d98
800a630: 2c 85 00 00 lhu r5,(r4+0)
800a634: 2c 63 00 0c lhu r3,(r3+12)
800a638: a0 65 18 00 and r3,r3,r5
800a63c: 0c 83 00 00 sh (r4+0),r3
800a640: e3 ff ff bf bi 800a53c <_Scheduler_priority_Block+0x24>
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
800a644: 00 21 00 01 srui r1,r1,1
800a648: 00 21 00 01 srui r1,r1,1
800a64c: 00 21 00 01 srui r1,r1,1
800a650: 00 21 00 01 srui r1,r1,1
800a654: 00 21 00 01 srui r1,r1,1
800a658: 00 21 00 01 srui r1,r1,1
800a65c: 00 21 00 01 srui r1,r1,1
800a660: 00 21 00 01 srui r1,r1,1
800a664: b4 a1 08 00 add r1,r5,r1
800a668: 40 25 00 00 lbu r5,(r1+0)
800a66c: e3 ff ff d4 bi 800a5bc <_Scheduler_priority_Block+0xa4>
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
800a670: 00 84 00 01 srui r4,r4,1
800a674: 78 05 08 01 mvhi r5,0x801
800a678: 00 84 00 01 srui r4,r4,1
800a67c: 38 a5 34 b0 ori r5,r5,0x34b0
800a680: 00 84 00 01 srui r4,r4,1
800a684: 00 84 00 01 srui r4,r4,1
800a688: 00 84 00 01 srui r4,r4,1
800a68c: 00 84 00 01 srui r4,r4,1
800a690: 00 84 00 01 srui r4,r4,1
800a694: 00 84 00 01 srui r4,r4,1
800a698: b4 a4 20 00 add r4,r5,r4
800a69c: 40 84 00 00 lbu r4,(r4+0)
800a6a0: e3 ff ff bd bi 800a594 <_Scheduler_priority_Block+0x7c>
08005040 <_Scheduler_priority_Schedule>:
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
8005040: 78 02 08 01 mvhi r2,0x801
8005044: 38 42 4d 98 ori r2,r2,0x4d98
8005048: 2c 42 00 00 lhu r2,(r2+0)
void _Scheduler_priority_Schedule(
Scheduler_Control *the_scheduler
)
{
_Scheduler_priority_Schedule_body( the_scheduler );
}
800504c: 28 25 00 00 lw r5,(r1+0)
8005050: 34 01 00 ff mvi r1,255
8005054: 20 42 ff ff andi r2,r2,0xffff
8005058: 54 41 00 2d bgu r2,r1,800510c <_Scheduler_priority_Schedule+0xcc>
800505c: 78 03 08 01 mvhi r3,0x801
8005060: 38 63 34 b0 ori r3,r3,0x34b0
8005064: b4 62 10 00 add r2,r3,r2
8005068: 40 42 00 00 lbu r2,(r2+0)
800506c: 34 42 00 08 addi r2,r2,8
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
8005070: 78 04 08 01 mvhi r4,0x801
8005074: 38 84 4d a0 ori r4,r4,0x4da0
8005078: b4 42 10 00 add r2,r2,r2
800507c: b4 82 20 00 add r4,r4,r2
8005080: 2c 81 00 00 lhu r1,(r4+0)
8005084: 34 04 00 ff mvi r4,255
8005088: 54 24 00 16 bgu r1,r4,80050e0 <_Scheduler_priority_Schedule+0xa0>
800508c: b4 61 08 00 add r1,r3,r1
8005090: 40 23 00 00 lbu r3,(r1+0)
8005094: 34 63 00 08 addi r3,r3,8
return (_Priority_Bits_index( major ) << 4) +
8005098: b4 42 08 00 add r1,r2,r2
800509c: b4 21 08 00 add r1,r1,r1
80050a0: b4 21 08 00 add r1,r1,r1
80050a4: b4 61 08 00 add r1,r3,r1
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
80050a8: b4 21 10 00 add r2,r1,r1
80050ac: b4 41 08 00 add r1,r2,r1
80050b0: b4 21 08 00 add r1,r1,r1
80050b4: b4 21 08 00 add r1,r1,r1
80050b8: b4 a1 08 00 add r1,r5,r1
80050bc: 28 23 00 00 lw r3,(r1+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
80050c0: 34 21 00 04 addi r1,r1,4
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
80050c4: 34 02 00 00 mvi r2,0
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
80050c8: 44 61 00 02 be r3,r1,80050d0 <_Scheduler_priority_Schedule+0x90><== NEVER TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
80050cc: b8 60 10 00 mv r2,r3
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
80050d0: 78 01 08 01 mvhi r1,0x801
80050d4: 38 21 4d 78 ori r1,r1,0x4d78
80050d8: 58 22 00 10 sw (r1+16),r2
80050dc: c3 a0 00 00 ret
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
80050e0: 00 21 00 01 srui r1,r1,1
80050e4: 00 21 00 01 srui r1,r1,1
80050e8: 00 21 00 01 srui r1,r1,1
80050ec: 00 21 00 01 srui r1,r1,1
80050f0: 00 21 00 01 srui r1,r1,1
80050f4: 00 21 00 01 srui r1,r1,1
80050f8: 00 21 00 01 srui r1,r1,1
80050fc: 00 21 00 01 srui r1,r1,1
8005100: b4 61 08 00 add r1,r3,r1
8005104: 40 23 00 00 lbu r3,(r1+0)
8005108: e3 ff ff e4 bi 8005098 <_Scheduler_priority_Schedule+0x58>
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
800510c: 00 42 00 01 srui r2,r2,1
8005110: 78 03 08 01 mvhi r3,0x801
8005114: 00 42 00 01 srui r2,r2,1
8005118: 38 63 34 b0 ori r3,r3,0x34b0
800511c: 00 42 00 01 srui r2,r2,1
8005120: 00 42 00 01 srui r2,r2,1
8005124: 00 42 00 01 srui r2,r2,1
8005128: 00 42 00 01 srui r2,r2,1
800512c: 00 42 00 01 srui r2,r2,1
8005130: 00 42 00 01 srui r2,r2,1
8005134: b4 62 10 00 add r2,r3,r2
8005138: 40 42 00 00 lbu r2,(r2+0)
800513c: e3 ff ff cd bi 8005070 <_Scheduler_priority_Schedule+0x30>
08003d7c <_TOD_Get>:
*/
void _TOD_Get(
struct timespec *time
)
{
8003d7c: 37 9c ff e4 addi sp,sp,-28
8003d80: 5b 8b 00 0c sw (sp+12),r11
8003d84: 5b 8c 00 08 sw (sp+8),r12
8003d88: 5b 9d 00 04 sw (sp+4),ra
8003d8c: b8 20 58 00 mv r11,r1
/* assume time checked for NULL by caller */
/* _TOD_Now is the native current time */
nanoseconds = 0;
_ISR_Disable( level );
8003d90: 90 00 60 00 rcsr r12,IE
8003d94: 34 01 ff fe mvi r1,-2
8003d98: a1 81 08 00 and r1,r12,r1
8003d9c: d0 01 00 00 wcsr IE,r1
now = _TOD_Now;
8003da0: 78 02 08 01 mvhi r2,0x801
8003da4: 38 42 49 50 ori r2,r2,0x4950
if ( _Watchdog_Nanoseconds_since_tick_handler )
8003da8: 78 03 08 01 mvhi r3,0x801
/* assume time checked for NULL by caller */
/* _TOD_Now is the native current time */
nanoseconds = 0;
_ISR_Disable( level );
now = _TOD_Now;
8003dac: 28 44 00 00 lw r4,(r2+0)
if ( _Watchdog_Nanoseconds_since_tick_handler )
8003db0: 38 63 4a 24 ori r3,r3,0x4a24
/* assume time checked for NULL by caller */
/* _TOD_Now is the native current time */
nanoseconds = 0;
_ISR_Disable( level );
now = _TOD_Now;
8003db4: 28 42 00 04 lw r2,(r2+4)
if ( _Watchdog_Nanoseconds_since_tick_handler )
8003db8: 28 61 00 00 lw r1,(r3+0)
/* assume time checked for NULL by caller */
/* _TOD_Now is the native current time */
nanoseconds = 0;
_ISR_Disable( level );
now = _TOD_Now;
8003dbc: 5b 84 00 10 sw (sp+16),r4
8003dc0: 5b 82 00 14 sw (sp+20),r2
long nanoseconds;
/* assume time checked for NULL by caller */
/* _TOD_Now is the native current time */
nanoseconds = 0;
8003dc4: 34 03 00 00 mvi r3,0
_ISR_Disable( level );
now = _TOD_Now;
if ( _Watchdog_Nanoseconds_since_tick_handler )
8003dc8: 44 20 00 03 be r1,r0,8003dd4 <_TOD_Get+0x58> <== ALWAYS TAKEN
nanoseconds = (*_Watchdog_Nanoseconds_since_tick_handler)();
8003dcc: d8 20 00 00 call r1 <== NOT EXECUTED
8003dd0: b8 20 18 00 mv r3,r1 <== NOT EXECUTED
_ISR_Enable( level );
8003dd4: d0 0c 00 00 wcsr IE,r12
_Timestamp_Set( &offset, 0, nanoseconds );
_Timestamp_Add_to( &now, &offset );
8003dd8: 37 82 00 18 addi r2,sp,24
8003ddc: 37 81 00 10 addi r1,sp,16
now = _TOD_Now;
if ( _Watchdog_Nanoseconds_since_tick_handler )
nanoseconds = (*_Watchdog_Nanoseconds_since_tick_handler)();
_ISR_Enable( level );
_Timestamp_Set( &offset, 0, nanoseconds );
8003de0: 5b 80 00 18 sw (sp+24),r0
8003de4: 5b 83 00 1c sw (sp+28),r3
_Timestamp_Add_to( &now, &offset );
8003de8: f8 00 0a 28 calli 8006688 <_Timespec_Add_to>
_Timestamp_To_timespec( &now, time );
8003dec: 2b 81 00 14 lw r1,(sp+20)
8003df0: 2b 82 00 10 lw r2,(sp+16)
8003df4: 59 61 00 04 sw (r11+4),r1
8003df8: 59 62 00 00 sw (r11+0),r2
}
8003dfc: 2b 9d 00 04 lw ra,(sp+4)
8003e00: 2b 8b 00 0c lw r11,(sp+12)
8003e04: 2b 8c 00 08 lw r12,(sp+8)
8003e08: 37 9c 00 1c addi sp,sp,28
8003e0c: c3 a0 00 00 ret
08009ffc <_TOD_Get_uptime>:
*/
void _TOD_Get_uptime(
Timestamp_Control *uptime
)
{
8009ffc: 37 9c ff e4 addi sp,sp,-28
800a000: 5b 8b 00 0c sw (sp+12),r11
800a004: 5b 8c 00 08 sw (sp+8),r12
800a008: 5b 9d 00 04 sw (sp+4),ra
800a00c: b8 20 58 00 mv r11,r1
/* assume time checked for NULL by caller */
/* _TOD_Uptime is in native timestamp format */
nanoseconds = 0;
_ISR_Disable( level );
800a010: 90 00 60 00 rcsr r12,IE
800a014: 34 01 ff fe mvi r1,-2
800a018: a1 81 08 00 and r1,r12,r1
800a01c: d0 01 00 00 wcsr IE,r1
up = _TOD_Uptime;
800a020: 78 02 08 01 mvhi r2,0x801
800a024: 38 42 49 24 ori r2,r2,0x4924
if ( _Watchdog_Nanoseconds_since_tick_handler )
800a028: 78 03 08 01 mvhi r3,0x801
/* assume time checked for NULL by caller */
/* _TOD_Uptime is in native timestamp format */
nanoseconds = 0;
_ISR_Disable( level );
up = _TOD_Uptime;
800a02c: 28 44 00 00 lw r4,(r2+0)
if ( _Watchdog_Nanoseconds_since_tick_handler )
800a030: 38 63 4a 24 ori r3,r3,0x4a24
/* assume time checked for NULL by caller */
/* _TOD_Uptime is in native timestamp format */
nanoseconds = 0;
_ISR_Disable( level );
up = _TOD_Uptime;
800a034: 28 42 00 04 lw r2,(r2+4)
if ( _Watchdog_Nanoseconds_since_tick_handler )
800a038: 28 61 00 00 lw r1,(r3+0)
/* assume time checked for NULL by caller */
/* _TOD_Uptime is in native timestamp format */
nanoseconds = 0;
_ISR_Disable( level );
up = _TOD_Uptime;
800a03c: 5b 84 00 10 sw (sp+16),r4
800a040: 5b 82 00 14 sw (sp+20),r2
long nanoseconds;
/* assume time checked for NULL by caller */
/* _TOD_Uptime is in native timestamp format */
nanoseconds = 0;
800a044: 34 03 00 00 mvi r3,0
_ISR_Disable( level );
up = _TOD_Uptime;
if ( _Watchdog_Nanoseconds_since_tick_handler )
800a048: 44 20 00 03 be r1,r0,800a054 <_TOD_Get_uptime+0x58> <== ALWAYS TAKEN
nanoseconds = (*_Watchdog_Nanoseconds_since_tick_handler)();
800a04c: d8 20 00 00 call r1 <== NOT EXECUTED
800a050: b8 20 18 00 mv r3,r1 <== NOT EXECUTED
_ISR_Enable( level );
800a054: d0 0c 00 00 wcsr IE,r12
_Timestamp_Set( &offset, 0, nanoseconds );
_Timestamp_Add_to( &up, &offset );
800a058: 37 82 00 18 addi r2,sp,24
800a05c: 37 81 00 10 addi r1,sp,16
up = _TOD_Uptime;
if ( _Watchdog_Nanoseconds_since_tick_handler )
nanoseconds = (*_Watchdog_Nanoseconds_since_tick_handler)();
_ISR_Enable( level );
_Timestamp_Set( &offset, 0, nanoseconds );
800a060: 5b 80 00 18 sw (sp+24),r0
800a064: 5b 83 00 1c sw (sp+28),r3
_Timestamp_Add_to( &up, &offset );
800a068: fb ff f1 88 calli 8006688 <_Timespec_Add_to>
*uptime = up;
800a06c: 2b 81 00 14 lw r1,(sp+20)
800a070: 2b 82 00 10 lw r2,(sp+16)
800a074: 59 61 00 04 sw (r11+4),r1
800a078: 59 62 00 00 sw (r11+0),r2
}
800a07c: 2b 9d 00 04 lw ra,(sp+4)
800a080: 2b 8b 00 0c lw r11,(sp+12)
800a084: 2b 8c 00 08 lw r12,(sp+8)
800a088: 37 9c 00 1c addi sp,sp,28
800a08c: c3 a0 00 00 ret
08003e4c <_TOD_Tickle_ticks>:
*
* Output parameters: NONE
*/
void _TOD_Tickle_ticks( void )
{
8003e4c: 37 9c ff ec addi sp,sp,-20
8003e50: 5b 8b 00 0c sw (sp+12),r11
8003e54: 5b 8c 00 08 sw (sp+8),r12
8003e58: 5b 9d 00 04 sw (sp+4),ra
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
8003e5c: 78 01 08 01 mvhi r1,0x801
8003e60: 38 21 40 c4 ori r1,r1,0x40c4
8003e64: 28 21 00 0c lw r1,(r1+12)
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
8003e68: 78 03 08 01 mvhi r3,0x801
8003e6c: 38 63 49 d8 ori r3,r3,0x49d8
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
8003e70: b4 21 08 00 add r1,r1,r1
8003e74: b4 21 08 00 add r1,r1,r1
8003e78: b4 21 08 00 add r1,r1,r1
8003e7c: b4 21 10 00 add r2,r1,r1
8003e80: b4 42 10 00 add r2,r2,r2
8003e84: b4 22 08 00 add r1,r1,r2
8003e88: b4 21 10 00 add r2,r1,r1
8003e8c: b4 42 10 00 add r2,r2,r2
8003e90: b4 22 08 00 add r1,r1,r2
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
8003e94: 28 65 00 00 lw r5,(r3+0)
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
8003e98: b4 21 20 00 add r4,r1,r1
8003e9c: b4 84 20 00 add r4,r4,r4
8003ea0: b4 24 20 00 add r4,r1,r4
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
8003ea4: 37 8b 00 10 addi r11,sp,16
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
8003ea8: 34 a5 00 01 addi r5,r5,1
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
8003eac: 78 01 08 01 mvhi r1,0x801
8003eb0: b9 60 10 00 mv r2,r11
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
8003eb4: 58 65 00 00 sw (r3+0),r5
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
8003eb8: 38 21 49 24 ori r1,r1,0x4924
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
8003ebc: 5b 84 00 14 sw (sp+20),r4
8003ec0: 5b 80 00 10 sw (sp+16),r0
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
8003ec4: f8 00 09 f1 calli 8006688 <_Timespec_Add_to>
/* we do not care how much the uptime changed */
/* Update the timespec format TOD */
seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick );
8003ec8: 78 01 08 01 mvhi r1,0x801
8003ecc: b9 60 10 00 mv r2,r11
8003ed0: 38 21 49 50 ori r1,r1,0x4950
8003ed4: f8 00 09 ed calli 8006688 <_Timespec_Add_to>
8003ed8: b8 20 58 00 mv r11,r1
while ( seconds ) {
8003edc: 44 20 00 07 be r1,r0,8003ef8 <_TOD_Tickle_ticks+0xac>
8003ee0: 78 0c 08 01 mvhi r12,0x801
8003ee4: 39 8c 49 7c ori r12,r12,0x497c
_Watchdog_Tickle_seconds();
seconds--;
8003ee8: 35 6b ff ff addi r11,r11,-1
*/
RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void )
{
_Watchdog_Tickle( &_Watchdog_Seconds_chain );
8003eec: b9 80 08 00 mv r1,r12
8003ef0: f8 00 0b bd calli 8006de4 <_Watchdog_Tickle>
_Timestamp_Add_to( &_TOD_Uptime, &tick );
/* we do not care how much the uptime changed */
/* Update the timespec format TOD */
seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick );
while ( seconds ) {
8003ef4: 5d 60 ff fd bne r11,r0,8003ee8 <_TOD_Tickle_ticks+0x9c> <== NEVER TAKEN
_Watchdog_Tickle_seconds();
seconds--;
}
}
8003ef8: 2b 9d 00 04 lw ra,(sp+4)
8003efc: 2b 8b 00 0c lw r11,(sp+12)
8003f00: 2b 8c 00 08 lw r12,(sp+8)
8003f04: 37 9c 00 14 addi sp,sp,20
8003f08: c3 a0 00 00 ret
08004440 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
8004440: 37 9c ff f4 addi sp,sp,-12
8004444: 5b 8b 00 0c sw (sp+12),r11
8004448: 5b 8c 00 08 sw (sp+8),r12
800444c: 5b 9d 00 04 sw (sp+4),ra
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
8004450: 78 02 08 02 mvhi r2,0x802
8004454: 38 42 20 c4 ori r2,r2,0x20c4
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
8004458: b8 20 58 00 mv r11,r1
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
800445c: 28 42 00 0c lw r2,(r2+12)
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
return false;
8004460: 34 0c 00 00 mvi r12,0
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
8004464: 44 20 00 22 be r1,r0,80044ec <_TOD_Validate+0xac> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
8004468: 78 03 08 01 mvhi r3,0x801
800446c: 38 63 f1 c0 ori r3,r3,0xf1c0
8004470: 28 61 00 00 lw r1,(r3+0)
8004474: f8 00 65 97 calli 801dad0 <__udivsi3>
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
8004478: 29 62 00 18 lw r2,(r11+24)
800447c: 50 41 00 1c bgeu r2,r1,80044ec <_TOD_Validate+0xac>
(the_tod->ticks >= ticks_per_second) ||
8004480: 29 62 00 14 lw r2,(r11+20)
8004484: 34 01 00 3b mvi r1,59
8004488: 54 41 00 19 bgu r2,r1,80044ec <_TOD_Validate+0xac>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
800448c: 29 62 00 10 lw r2,(r11+16)
8004490: 54 41 00 17 bgu r2,r1,80044ec <_TOD_Validate+0xac>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
8004494: 29 62 00 0c lw r2,(r11+12)
8004498: 34 01 00 17 mvi r1,23
800449c: 54 41 00 14 bgu r2,r1,80044ec <_TOD_Validate+0xac>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
80044a0: 29 61 00 04 lw r1,(r11+4)
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
(the_tod->ticks >= ticks_per_second) ||
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
80044a4: 44 20 00 12 be r1,r0,80044ec <_TOD_Validate+0xac> <== NEVER TAKEN
(the_tod->month == 0) ||
80044a8: 34 02 00 0c mvi r2,12
80044ac: 54 22 00 10 bgu r1,r2,80044ec <_TOD_Validate+0xac>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
80044b0: 29 62 00 00 lw r2,(r11+0)
(the_tod->ticks >= ticks_per_second) ||
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
80044b4: 34 03 07 c3 mvi r3,1987
80044b8: 50 62 00 0d bgeu r3,r2,80044ec <_TOD_Validate+0xac>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
80044bc: 29 63 00 08 lw r3,(r11+8)
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
80044c0: 44 60 00 0b be r3,r0,80044ec <_TOD_Validate+0xac> <== NEVER TAKEN
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
80044c4: 20 42 00 03 andi r2,r2,0x3
80044c8: 5c 40 00 02 bne r2,r0,80044d0 <_TOD_Validate+0x90>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
80044cc: 34 21 00 0d addi r1,r1,13
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
80044d0: 78 02 08 01 mvhi r2,0x801
80044d4: b4 21 08 00 add r1,r1,r1
80044d8: 38 42 fa 70 ori r2,r2,0xfa70
80044dc: b4 21 08 00 add r1,r1,r1
80044e0: b4 41 08 00 add r1,r2,r1
80044e4: 28 2c 00 00 lw r12,(r1+0)
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
80044e8: f1 83 60 00 cmpgeu r12,r12,r3
if ( the_tod->day > days_in_month )
return false;
return true;
}
80044ec: b9 80 08 00 mv r1,r12
80044f0: 2b 9d 00 04 lw ra,(sp+4)
80044f4: 2b 8b 00 0c lw r11,(sp+12)
80044f8: 2b 8c 00 08 lw r12,(sp+8)
80044fc: 37 9c 00 0c addi sp,sp,12
8004500: c3 a0 00 00 ret
08005350 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
8005350: 37 9c ff ec addi sp,sp,-20
8005354: 5b 8b 00 14 sw (sp+20),r11
8005358: 5b 8c 00 10 sw (sp+16),r12
800535c: 5b 8d 00 0c sw (sp+12),r13
8005360: 5b 8e 00 08 sw (sp+8),r14
8005364: 5b 9d 00 04 sw (sp+4),ra
8005368: b8 20 58 00 mv r11,r1
*/
/*
* Save original state
*/
original_state = the_thread->current_state;
800536c: 28 2d 00 10 lw r13,(r1+16)
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
8005370: b8 40 60 00 mv r12,r2
8005374: 20 6e 00 ff andi r14,r3,0xff
/*
* Set a transient state for the thread so it is pulled off the Ready chains.
* This will prevent it from being scheduled no matter what happens in an
* ISR.
*/
_Thread_Set_transient( the_thread );
8005378: f8 00 04 1b calli 80063e4 <_Thread_Set_transient>
/*
* Do not bother recomputing all the priority related information if
* we are not REALLY changing priority.
*/
if ( the_thread->current_priority != new_priority )
800537c: 29 61 00 14 lw r1,(r11+20)
8005380: 44 2c 00 04 be r1,r12,8005390 <_Thread_Change_priority+0x40>
_Thread_Set_priority( the_thread, new_priority );
8005384: b9 60 08 00 mv r1,r11
8005388: b9 80 10 00 mv r2,r12
800538c: f8 00 03 ed calli 8006340 <_Thread_Set_priority>
_ISR_Disable( level );
8005390: 90 00 60 00 rcsr r12,IE
8005394: 34 02 ff fe mvi r2,-2
8005398: a1 82 10 00 and r2,r12,r2
800539c: d0 02 00 00 wcsr IE,r2
/*
* If the thread has more than STATES_TRANSIENT set, then it is blocked,
* If it is blocked on a thread queue, then we need to requeue it.
*/
state = the_thread->current_state;
80053a0: 29 61 00 10 lw r1,(r11+16)
if ( state != STATES_TRANSIENT ) {
80053a4: 34 04 00 04 mvi r4,4
80053a8: 44 24 00 23 be r1,r4,8005434 <_Thread_Change_priority+0xe4>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_transient (
States_Control the_states
)
{
return (the_states & STATES_TRANSIENT);
80053ac: 21 ad 00 04 andi r13,r13,0x4
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
80053b0: 45 a0 00 0e be r13,r0,80053e8 <_Thread_Change_priority+0x98><== ALWAYS TAKEN
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
80053b4: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
80053b8: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED
80053bc: 38 63 36 18 ori r3,r3,0x3618 <== NOT EXECUTED
80053c0: 28 62 00 00 lw r2,(r3+0) <== NOT EXECUTED
80053c4: a0 22 08 00 and r1,r1,r2 <== NOT EXECUTED
if ( _States_Is_waiting_on_thread_queue( state ) ) {
80053c8: 5c 20 00 11 bne r1,r0,800540c <_Thread_Change_priority+0xbc><== NOT EXECUTED
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
80053cc: 2b 9d 00 04 lw ra,(sp+4)
80053d0: 2b 8b 00 14 lw r11,(sp+20)
80053d4: 2b 8c 00 10 lw r12,(sp+16)
80053d8: 2b 8d 00 0c lw r13,(sp+12)
80053dc: 2b 8e 00 08 lw r14,(sp+8)
80053e0: 37 9c 00 14 addi sp,sp,20
80053e4: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
80053e8: 34 02 ff fb mvi r2,-5
80053ec: a0 22 10 00 and r2,r1,r2
*/
state = the_thread->current_state;
if ( state != STATES_TRANSIENT ) {
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
80053f0: 59 62 00 10 sw (r11+16),r2
_ISR_Enable( level );
80053f4: d0 0c 00 00 wcsr IE,r12
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
80053f8: 78 03 08 01 mvhi r3,0x801
80053fc: 38 63 36 18 ori r3,r3,0x3618
8005400: 28 62 00 00 lw r2,(r3+0)
8005404: a0 22 08 00 and r1,r1,r2
if ( _States_Is_waiting_on_thread_queue( state ) ) {
8005408: 44 20 ff f1 be r1,r0,80053cc <_Thread_Change_priority+0x7c>
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
800540c: 29 61 00 44 lw r1,(r11+68)
8005410: b9 60 10 00 mv r2,r11
8005414: f8 00 03 8e calli 800624c <_Thread_queue_Requeue>
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
8005418: 2b 9d 00 04 lw ra,(sp+4)
800541c: 2b 8b 00 14 lw r11,(sp+20)
8005420: 2b 8c 00 10 lw r12,(sp+16)
8005424: 2b 8d 00 0c lw r13,(sp+12)
8005428: 2b 8e 00 08 lw r14,(sp+8)
800542c: 37 9c 00 14 addi sp,sp,20
8005430: c3 a0 00 00 ret
*/
RTEMS_INLINE_ROUTINE bool _States_Is_transient (
States_Control the_states
)
{
return (the_states & STATES_TRANSIENT);
8005434: 21 ad 00 04 andi r13,r13,0x4
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
8005438: 5d a0 00 16 bne r13,r0,8005490 <_Thread_Change_priority+0x140><== NEVER TAKEN
* Ready Queue with interrupts off.
*
* FIXME: hard-coded for priority scheduling. Might be ok since this
* function is specific to priority scheduling?
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
800543c: 59 60 00 10 sw (r11+16),r0
if ( prepend_it )
8005440: 45 cd 00 2b be r14,r13,80054ec <_Thread_Change_priority+0x19c>
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue_first(
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
8005444: 29 61 00 8c lw r1,(r11+140)
8005448: 78 03 08 01 mvhi r3,0x801
800544c: 38 63 4d 98 ori r3,r3,0x4d98
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
8005450: 28 25 00 04 lw r5,(r1+4)
8005454: 2c 26 00 0a lhu r6,(r1+10)
_Chain_Prepend_unprotected( the_thread->scheduler.priority->ready_chain,
8005458: 28 24 00 00 lw r4,(r1+0)
800545c: 2c a7 00 00 lhu r7,(r5+0)
8005460: b8 e6 30 00 or r6,r7,r6
8005464: 0c a6 00 00 sh (r5+0),r6
_Priority_Major_bit_map |= the_priority_map->ready_major;
8005468: 2c 26 00 08 lhu r6,(r1+8)
800546c: 2c 65 00 00 lhu r5,(r3+0)
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
8005470: 28 81 00 00 lw r1,(r4+0)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
8005474: 59 64 00 04 sw (r11+4),r4
8005478: b8 c5 28 00 or r5,r6,r5
800547c: 20 a5 ff ff andi r5,r5,0xffff
8005480: 0c 65 00 00 sh (r3+0),r5
before_node = after_node->next;
after_node->next = the_node;
8005484: 58 8b 00 00 sw (r4+0),r11
the_node->next = before_node;
8005488: 59 61 00 00 sw (r11+0),r1
before_node->previous = the_node;
800548c: 58 2b 00 04 sw (r1+4),r11
_Scheduler_priority_Ready_queue_enqueue_first( the_thread );
else
_Scheduler_priority_Ready_queue_enqueue( the_thread );
}
_ISR_Flash( level );
8005490: d0 0c 00 00 wcsr IE,r12
8005494: d0 02 00 00 wcsr IE,r2
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule(
Scheduler_Control *the_scheduler
)
{
the_scheduler->Operations.schedule( the_scheduler );
8005498: 78 01 08 01 mvhi r1,0x801
800549c: 38 21 49 2c ori r1,r1,0x492c
80054a0: 28 22 00 04 lw r2,(r1+4)
80054a4: d8 40 00 00 call r2
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
80054a8: 78 01 08 01 mvhi r1,0x801
80054ac: 38 21 4d 78 ori r1,r1,0x4d78
80054b0: 28 22 00 0c lw r2,(r1+12)
* We altered the set of thread priorities. So let's figure out
* who is the heir and if we need to switch to them.
*/
_Scheduler_Schedule(&_Scheduler);
if ( !_Thread_Is_executing_also_the_heir() &&
80054b4: 28 23 00 10 lw r3,(r1+16)
80054b8: 44 43 00 05 be r2,r3,80054cc <_Thread_Change_priority+0x17c>
80054bc: 40 42 00 74 lbu r2,(r2+116)
80054c0: 44 40 00 03 be r2,r0,80054cc <_Thread_Change_priority+0x17c>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
80054c4: 34 02 00 01 mvi r2,1
80054c8: 30 22 00 18 sb (r1+24),r2
_ISR_Enable( level );
80054cc: d0 0c 00 00 wcsr IE,r12
}
80054d0: 2b 9d 00 04 lw ra,(sp+4)
80054d4: 2b 8b 00 14 lw r11,(sp+20)
80054d8: 2b 8c 00 10 lw r12,(sp+16)
80054dc: 2b 8d 00 0c lw r13,(sp+12)
80054e0: 2b 8e 00 08 lw r14,(sp+8)
80054e4: 37 9c 00 14 addi sp,sp,20
80054e8: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue(
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
80054ec: 29 61 00 8c lw r1,(r11+140)
80054f0: 78 03 08 01 mvhi r3,0x801
80054f4: 38 63 4d 98 ori r3,r3,0x4d98
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
80054f8: 28 25 00 04 lw r5,(r1+4)
80054fc: 2c 27 00 0a lhu r7,(r1+10)
_Chain_Append_unprotected( the_thread->scheduler.priority->ready_chain,
8005500: 28 24 00 00 lw r4,(r1+0)
8005504: 2c a8 00 00 lhu r8,(r5+0)
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
8005508: 34 86 00 04 addi r6,r4,4
800550c: b9 07 38 00 or r7,r8,r7
8005510: 0c a7 00 00 sh (r5+0),r7
_Priority_Major_bit_map |= the_priority_map->ready_major;
8005514: 2c 27 00 08 lhu r7,(r1+8)
8005518: 2c 65 00 00 lhu r5,(r3+0)
Chain_Node *old_last = tail->previous;
800551c: 28 81 00 08 lw r1,(r4+8)
the_node->next = tail;
tail->previous = the_node;
8005520: 58 8b 00 08 sw (r4+8),r11
8005524: b8 e5 20 00 or r4,r7,r5
8005528: 20 84 ff ff andi r4,r4,0xffff
800552c: 0c 64 00 00 sh (r3+0),r4
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
8005530: 59 66 00 00 sw (r11+0),r6
tail->previous = the_node;
old_last->next = the_node;
8005534: 58 2b 00 00 sw (r1+0),r11
the_node->previous = old_last;
8005538: 59 61 00 04 sw (r11+4),r1
800553c: e3 ff ff d5 bi 8005490 <_Thread_Change_priority+0x140>
0800c81c <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
800c81c: 37 9c ff f8 addi sp,sp,-8
800c820: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
800c824: 37 82 00 08 addi r2,sp,8
800c828: f8 00 00 8a calli 800ca50 <_Thread_Get>
switch ( location ) {
800c82c: 2b 82 00 08 lw r2,(sp+8)
800c830: 5c 40 00 0a bne r2,r0,800c858 <_Thread_Delay_ended+0x3c> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
800c834: 78 03 08 02 mvhi r3,0x802
800c838: 38 63 79 60 ori r3,r3,0x7960
800c83c: 28 62 00 00 lw r2,(r3+0)
800c840: fb ff ff 64 calli 800c5d0 <_Thread_Clear_state>
800c844: 78 01 08 02 mvhi r1,0x802
800c848: 38 21 aa 20 ori r1,r1,0xaa20
800c84c: 28 22 00 00 lw r2,(r1+0)
800c850: 34 42 ff ff addi r2,r2,-1
800c854: 58 22 00 00 sw (r1+0),r2
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
800c858: 2b 9d 00 04 lw ra,(sp+4)
800c85c: 37 9c 00 08 addi sp,sp,8
800c860: c3 a0 00 00 ret
08005714 <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
8005714: 37 9c ff bc addi sp,sp,-68
8005718: 5b 8b 00 34 sw (sp+52),r11
800571c: 5b 8c 00 30 sw (sp+48),r12
8005720: 5b 8d 00 2c sw (sp+44),r13
8005724: 5b 8e 00 28 sw (sp+40),r14
8005728: 5b 8f 00 24 sw (sp+36),r15
800572c: 5b 90 00 20 sw (sp+32),r16
8005730: 5b 91 00 1c sw (sp+28),r17
8005734: 5b 92 00 18 sw (sp+24),r18
8005738: 5b 93 00 14 sw (sp+20),r19
800573c: 5b 94 00 10 sw (sp+16),r20
8005740: 5b 95 00 0c sw (sp+12),r21
8005744: 5b 96 00 08 sw (sp+8),r22
8005748: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
800574c: 78 01 08 01 mvhi r1,0x801
8005750: 38 21 4d 78 ori r1,r1,0x4d78
8005754: 28 2c 00 0c lw r12,(r1+12)
_ISR_Disable( level );
8005758: 90 00 08 00 rcsr r1,IE
800575c: 34 02 ff fe mvi r2,-2
8005760: a0 22 10 00 and r2,r1,r2
8005764: d0 02 00 00 wcsr IE,r2
while ( _Thread_Dispatch_necessary == true ) {
8005768: 78 0e 08 01 mvhi r14,0x801
800576c: 39 ce 4d 78 ori r14,r14,0x4d78
8005770: 41 c2 00 18 lbu r2,(r14+24)
8005774: 78 10 08 01 mvhi r16,0x801
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
8005778: b8 20 20 00 mv r4,r1
while ( _Thread_Dispatch_necessary == true ) {
800577c: 20 42 00 ff andi r2,r2,0xff
8005780: 3a 10 48 a8 ori r16,r16,0x48a8
8005784: 44 40 00 40 be r2,r0,8005884 <_Thread_Dispatch+0x170>
heir = _Thread_Heir;
8005788: 29 cb 00 10 lw r11,(r14+16)
_Thread_Dispatch_disable_level = 1;
800578c: 34 02 00 01 mvi r2,1
8005790: 5a 02 00 00 sw (r16+0),r2
_Thread_Dispatch_necessary = false;
8005794: 31 c0 00 18 sb (r14+24),r0
_Thread_Executing = heir;
8005798: 59 cb 00 0c sw (r14+12),r11
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
800579c: 45 8b 00 3a be r12,r11,8005884 <_Thread_Dispatch+0x170>
80057a0: 78 0f 08 01 mvhi r15,0x801
80057a4: 78 14 08 01 mvhi r20,0x801
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
80057a8: 78 15 08 01 mvhi r21,0x801
80057ac: 37 92 00 40 addi r18,sp,64
80057b0: 39 ef 49 74 ori r15,r15,0x4974
80057b4: 37 91 00 38 addi r17,sp,56
80057b8: 3a 94 49 4c ori r20,r20,0x494c
*/
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
80057bc: 34 13 00 01 mvi r19,1
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
80057c0: 3a b5 48 40 ori r21,r21,0x4840
#endif
#endif
executing = _Thread_Executing;
_ISR_Disable( level );
80057c4: 34 16 ff fe mvi r22,-2
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
80057c8: b9 c0 68 00 mv r13,r14
80057cc: e0 00 00 29 bi 8005870 <_Thread_Dispatch+0x15c>
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
_ISR_Enable( level );
80057d0: d0 01 00 00 wcsr IE,r1
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
80057d4: ba 40 08 00 mv r1,r18
80057d8: f8 00 12 09 calli 8009ffc <_TOD_Get_uptime>
_Timestamp_Subtract(
80057dc: ba 20 18 00 mv r3,r17
80057e0: b9 e0 08 00 mv r1,r15
80057e4: ba 40 10 00 mv r2,r18
80057e8: f8 00 03 bf calli 80066e4 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
80057ec: ba 20 10 00 mv r2,r17
80057f0: 35 81 00 84 addi r1,r12,132
80057f4: f8 00 03 a5 calli 8006688 <_Timespec_Add_to>
_Thread_Time_of_last_context_switch = uptime;
80057f8: 2b 83 00 40 lw r3,(sp+64)
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
80057fc: 2a 84 00 00 lw r4,(r20+0)
executing->libc_reent = *_Thread_libc_reent;
*_Thread_libc_reent = heir->libc_reent;
}
_User_extensions_Thread_switch( executing, heir );
8005800: b9 80 08 00 mv r1,r12
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
8005804: 59 e3 00 00 sw (r15+0),r3
8005808: 2b 83 00 44 lw r3,(sp+68)
if ( _Thread_libc_reent ) {
executing->libc_reent = *_Thread_libc_reent;
*_Thread_libc_reent = heir->libc_reent;
}
_User_extensions_Thread_switch( executing, heir );
800580c: b9 60 10 00 mv r2,r11
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
8005810: 59 e3 00 04 sw (r15+4),r3
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
8005814: 44 80 00 05 be r4,r0,8005828 <_Thread_Dispatch+0x114> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
8005818: 28 83 00 00 lw r3,(r4+0)
800581c: 59 83 01 18 sw (r12+280),r3
*_Thread_libc_reent = heir->libc_reent;
8005820: 29 63 01 18 lw r3,(r11+280)
8005824: 58 83 00 00 sw (r4+0),r3
}
_User_extensions_Thread_switch( executing, heir );
8005828: f8 00 04 b6 calli 8006b00 <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
800582c: 35 81 00 c4 addi r1,r12,196
8005830: 35 62 00 c4 addi r2,r11,196
8005834: f8 00 05 e9 calli 8006fd8 <_CPU_Context_switch>
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
8005838: 29 cc 00 0c lw r12,(r14+12)
_ISR_Disable( level );
800583c: 90 00 20 00 rcsr r4,IE
8005840: a0 96 08 00 and r1,r4,r22
8005844: d0 01 00 00 wcsr IE,r1
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
8005848: 41 a2 00 18 lbu r2,(r13+24)
800584c: b9 a0 70 00 mv r14,r13
#endif
#endif
executing = _Thread_Executing;
_ISR_Disable( level );
8005850: b8 80 08 00 mv r1,r4
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
8005854: 20 42 00 ff andi r2,r2,0xff
8005858: 44 40 00 0b be r2,r0,8005884 <_Thread_Dispatch+0x170> <== ALWAYS TAKEN
heir = _Thread_Heir;
800585c: 29 ab 00 10 lw r11,(r13+16) <== NOT EXECUTED
_Thread_Dispatch_disable_level = 1;
8005860: 5a 13 00 00 sw (r16+0),r19 <== NOT EXECUTED
_Thread_Dispatch_necessary = false;
8005864: 31 a0 00 18 sb (r13+24),r0 <== NOT EXECUTED
_Thread_Executing = heir;
8005868: 59 ab 00 0c sw (r13+12),r11 <== NOT EXECUTED
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
800586c: 45 6c 00 06 be r11,r12,8005884 <_Thread_Dispatch+0x170> <== NOT EXECUTED
*/
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
8005870: 29 62 00 7c lw r2,(r11+124)
8005874: 5c 53 ff d7 bne r2,r19,80057d0 <_Thread_Dispatch+0xbc>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
8005878: 2a a2 00 00 lw r2,(r21+0)
800587c: 59 62 00 78 sw (r11+120),r2
8005880: e3 ff ff d4 bi 80057d0 <_Thread_Dispatch+0xbc>
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
8005884: 5a 00 00 00 sw (r16+0),r0
_ISR_Enable( level );
8005888: d0 04 00 00 wcsr IE,r4
_API_extensions_Run_postswitch();
800588c: fb ff f7 a1 calli 8003710 <_API_extensions_Run_postswitch>
}
8005890: 2b 9d 00 04 lw ra,(sp+4)
8005894: 2b 8b 00 34 lw r11,(sp+52)
8005898: 2b 8c 00 30 lw r12,(sp+48)
800589c: 2b 8d 00 2c lw r13,(sp+44)
80058a0: 2b 8e 00 28 lw r14,(sp+40)
80058a4: 2b 8f 00 24 lw r15,(sp+36)
80058a8: 2b 90 00 20 lw r16,(sp+32)
80058ac: 2b 91 00 1c lw r17,(sp+28)
80058b0: 2b 92 00 18 lw r18,(sp+24)
80058b4: 2b 93 00 14 lw r19,(sp+20)
80058b8: 2b 94 00 10 lw r20,(sp+16)
80058bc: 2b 95 00 0c lw r21,(sp+12)
80058c0: 2b 96 00 08 lw r22,(sp+8)
80058c4: 37 9c 00 44 addi sp,sp,68
80058c8: c3 a0 00 00 ret
0800cb2c <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
800cb2c: 37 9c ff f4 addi sp,sp,-12
800cb30: 5b 8b 00 0c sw (sp+12),r11
800cb34: 5b 8c 00 08 sw (sp+8),r12
800cb38: 5b 9d 00 04 sw (sp+4),ra
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
800cb3c: 78 01 08 01 mvhi r1,0x801
800cb40: 38 21 4d 78 ori r1,r1,0x4d78
800cb44: 28 2b 00 0c lw r11,(r1+12)
/*
* have to put level into a register for those cpu's that use
* inline asm here
*/
level = executing->Start.isr_level;
800cb48: 29 61 00 ac lw r1,(r11+172)
_ISR_Set_level(level);
800cb4c: 64 21 00 00 cmpei r1,r1,0
800cb50: d0 01 00 00 wcsr IE,r1
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
800cb54: 78 02 08 01 mvhi r2,0x801
800cb58: 38 42 46 bc ori r2,r2,0x46bc
800cb5c: 40 4c 00 00 lbu r12,(r2+0)
doneConstructors = 1;
800cb60: 34 03 00 01 mvi r3,1
/*
* Take care that 'begin' extensions get to complete before
* 'switch' extensions can run. This means must keep dispatch
* disabled until all 'begin' extensions complete.
*/
_User_extensions_Thread_begin( executing );
800cb64: b9 60 08 00 mv r1,r11
level = executing->Start.isr_level;
_ISR_Set_level(level);
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
doneConstructors = 1;
800cb68: 30 43 00 00 sb (r2+0),r3
/*
* Take care that 'begin' extensions get to complete before
* 'switch' extensions can run. This means must keep dispatch
* disabled until all 'begin' extensions complete.
*/
_User_extensions_Thread_begin( executing );
800cb6c: fb ff e7 39 calli 8006850 <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
800cb70: fb ff e3 57 calli 80058cc <_Thread_Enable_dispatch>
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
800cb74: 45 80 00 0b be r12,r0,800cba0 <_Thread_Handler+0x74>
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
800cb78: 29 61 00 94 lw r1,(r11+148)
800cb7c: 44 20 00 0c be r1,r0,800cbac <_Thread_Handler+0x80>
(*(Thread_Entry_numeric) executing->Start.entry_point)(
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
800cb80: 34 02 00 01 mvi r2,1
800cb84: 44 22 00 0f be r1,r2,800cbc0 <_Thread_Handler+0x94> <== ALWAYS TAKEN
* was placed in return_argument. This assumed that if it returned
* anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
800cb88: b9 60 08 00 mv r1,r11
800cb8c: fb ff e7 49 calli 80068b0 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
800cb90: 34 01 00 00 mvi r1,0
800cb94: 34 02 00 01 mvi r2,1
800cb98: 34 03 00 05 mvi r3,5
800cb9c: fb ff de 1a calli 8004404 <_Internal_error_Occurred>
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
INIT_NAME ();
800cba0: fb ff cd 18 calli 8000000 <RamBase>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
800cba4: 29 61 00 94 lw r1,(r11+148)
800cba8: 5c 20 ff f6 bne r1,r0,800cb80 <_Thread_Handler+0x54>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
800cbac: 29 62 00 90 lw r2,(r11+144)
800cbb0: 29 61 00 9c lw r1,(r11+156)
800cbb4: d8 40 00 00 call r2
INIT_NAME ();
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
executing->Wait.return_argument =
800cbb8: 59 61 00 28 sw (r11+40),r1
800cbbc: e3 ff ff f3 bi 800cb88 <_Thread_Handler+0x5c>
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
800cbc0: 29 62 00 90 lw r2,(r11+144)
800cbc4: 29 61 00 98 lw r1,(r11+152)
800cbc8: d8 40 00 00 call r2
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
executing->Wait.return_argument =
800cbcc: 59 61 00 28 sw (r11+40),r1
800cbd0: e3 ff ff ee bi 800cb88 <_Thread_Handler+0x5c>
0800a9c4 <_Thread_Resume>:
void _Thread_Resume(
Thread_Control *the_thread,
bool force
)
{
800a9c4: 37 9c ff f8 addi sp,sp,-8
800a9c8: 5b 8b 00 08 sw (sp+8),r11
800a9cc: 5b 9d 00 04 sw (sp+4),ra
800a9d0: b8 20 10 00 mv r2,r1
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
800a9d4: 90 00 58 00 rcsr r11,IE
800a9d8: 34 01 ff fe mvi r1,-2
800a9dc: a1 61 08 00 and r1,r11,r1
800a9e0: d0 01 00 00 wcsr IE,r1
current_state = the_thread->current_state;
800a9e4: 28 41 00 10 lw r1,(r2+16)
if ( current_state & STATES_SUSPENDED ) {
800a9e8: 20 23 00 02 andi r3,r1,0x2
800a9ec: 44 60 00 05 be r3,r0,800aa00 <_Thread_Resume+0x3c> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
800a9f0: 34 03 ff fd mvi r3,-3
800a9f4: a0 23 08 00 and r1,r1,r3
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
800a9f8: 58 41 00 10 sw (r2+16),r1
if ( _States_Is_ready( current_state ) ) {
800a9fc: 44 20 00 06 be r1,r0,800aa14 <_Thread_Resume+0x50>
_Scheduler_Unblock( &_Scheduler, the_thread );
}
}
_ISR_Enable( level );
800aa00: d0 0b 00 00 wcsr IE,r11
}
800aa04: 2b 9d 00 04 lw ra,(sp+4)
800aa08: 2b 8b 00 08 lw r11,(sp+8)
800aa0c: 37 9c 00 08 addi sp,sp,8
800aa10: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
the_scheduler->Operations.unblock( the_scheduler, the_thread );
800aa14: 78 01 08 01 mvhi r1,0x801
800aa18: 38 21 a9 f4 ori r1,r1,0xa9f4
800aa1c: 28 23 00 10 lw r3,(r1+16)
800aa20: d8 60 00 00 call r3
if ( _States_Is_ready( current_state ) ) {
_Scheduler_Unblock( &_Scheduler, the_thread );
}
}
_ISR_Enable( level );
800aa24: d0 0b 00 00 wcsr IE,r11
}
800aa28: 2b 9d 00 04 lw ra,(sp+4)
800aa2c: 2b 8b 00 08 lw r11,(sp+8)
800aa30: 37 9c 00 08 addi sp,sp,8
800aa34: c3 a0 00 00 ret
080065e4 <_Thread_Tickle_timeslice>:
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
80065e4: 37 9c ff f8 addi sp,sp,-8
80065e8: 5b 8b 00 08 sw (sp+8),r11
80065ec: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *executing;
executing = _Thread_Executing;
80065f0: 78 01 08 01 mvhi r1,0x801
80065f4: 38 21 4d 78 ori r1,r1,0x4d78
80065f8: 28 2b 00 0c lw r11,(r1+12)
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
80065fc: 41 61 00 74 lbu r1,(r11+116)
8006600: 44 20 00 09 be r1,r0,8006624 <_Thread_Tickle_timeslice+0x40>
return;
if ( !_States_Is_ready( executing->current_state ) )
8006604: 29 61 00 10 lw r1,(r11+16)
8006608: 5c 20 00 07 bne r1,r0,8006624 <_Thread_Tickle_timeslice+0x40><== NEVER TAKEN
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
800660c: 29 61 00 7c lw r1,(r11+124)
8006610: 44 20 00 05 be r1,r0,8006624 <_Thread_Tickle_timeslice+0x40>
8006614: 34 02 00 02 mvi r2,2
8006618: 50 41 00 0f bgeu r2,r1,8006654 <_Thread_Tickle_timeslice+0x70>
800661c: 34 02 00 03 mvi r2,3
8006620: 44 22 00 05 be r1,r2,8006634 <_Thread_Tickle_timeslice+0x50><== ALWAYS TAKEN
if ( --executing->cpu_time_budget == 0 )
(*executing->budget_callout)( executing );
break;
#endif
}
}
8006624: 2b 9d 00 04 lw ra,(sp+4)
8006628: 2b 8b 00 08 lw r11,(sp+8)
800662c: 37 9c 00 08 addi sp,sp,8
8006630: c3 a0 00 00 ret
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
8006634: 29 61 00 78 lw r1,(r11+120)
8006638: 34 21 ff ff addi r1,r1,-1
800663c: 59 61 00 78 sw (r11+120),r1
8006640: 5c 20 ff f9 bne r1,r0,8006624 <_Thread_Tickle_timeslice+0x40>
(*executing->budget_callout)( executing );
8006644: 29 62 00 80 lw r2,(r11+128)
8006648: b9 60 08 00 mv r1,r11
800664c: d8 40 00 00 call r2
8006650: e3 ff ff f5 bi 8006624 <_Thread_Tickle_timeslice+0x40>
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
#endif
if ( (int)(--executing->cpu_time_budget) <= 0 ) {
8006654: 29 61 00 78 lw r1,(r11+120)
8006658: 34 21 ff ff addi r1,r1,-1
800665c: 59 61 00 78 sw (r11+120),r1
8006660: 48 20 ff f1 bg r1,r0,8006624 <_Thread_Tickle_timeslice+0x40>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield( &_Scheduler );
8006664: 78 01 08 01 mvhi r1,0x801
8006668: 38 21 49 2c ori r1,r1,0x492c
800666c: 28 22 00 08 lw r2,(r1+8)
8006670: d8 40 00 00 call r2
* executing thread's timeslice is reset. Otherwise, the
* currently executing thread is placed at the rear of the
* FIFO for this priority and a new heir is selected.
*/
_Scheduler_Yield( );
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006674: 78 01 08 01 mvhi r1,0x801
8006678: 38 21 48 40 ori r1,r1,0x4840
800667c: 28 21 00 00 lw r1,(r1+0)
8006680: 59 61 00 78 sw (r11+120),r1
8006684: e3 ff ff e8 bi 8006624 <_Thread_Tickle_timeslice+0x40>
0800a6a4 <_Thread_blocking_operation_Cancel>:
Thread_blocking_operation_States sync_state __attribute__((unused)),
#endif
Thread_Control *the_thread,
ISR_Level level
)
{
800a6a4: 37 9c ff f8 addi sp,sp,-8 <== NOT EXECUTED
800a6a8: 5b 8b 00 08 sw (sp+8),r11 <== NOT EXECUTED
800a6ac: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
800a6b0: b8 40 58 00 mv r11,r2 <== NOT EXECUTED
/*
* If the sync state is timed out, this is very likely not needed.
* But better safe than sorry when it comes to critical sections.
*/
if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
800a6b4: 28 42 00 50 lw r2,(r2+80) <== NOT EXECUTED
#endif
/*
* The thread is not waiting on anything after this completes.
*/
the_thread->Wait.queue = NULL;
800a6b8: 59 60 00 44 sw (r11+68),r0 <== NOT EXECUTED
/*
* If the sync state is timed out, this is very likely not needed.
* But better safe than sorry when it comes to critical sections.
*/
if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
800a6bc: 34 01 00 02 mvi r1,2 <== NOT EXECUTED
800a6c0: 44 41 00 0b be r2,r1,800a6ec <_Thread_blocking_operation_Cancel+0x48><== NOT EXECUTED
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
} else
_ISR_Enable( level );
800a6c4: d0 03 00 00 wcsr IE,r3 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800a6c8: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
800a6cc: 38 21 36 20 ori r1,r1,0x3620 <== NOT EXECUTED
800a6d0: 28 22 00 00 lw r2,(r1+0) <== NOT EXECUTED
800a6d4: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800a6d8: f8 00 00 0b calli 800a704 <_Thread_Clear_state> <== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
800a6dc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800a6e0: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
800a6e4: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
800a6e8: c3 a0 00 00 ret <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
800a6ec: 34 01 00 03 mvi r1,3 <== NOT EXECUTED
800a6f0: 59 61 00 50 sw (r11+80),r1 <== NOT EXECUTED
* If the sync state is timed out, this is very likely not needed.
* But better safe than sorry when it comes to critical sections.
*/
if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
800a6f4: d0 03 00 00 wcsr IE,r3 <== NOT EXECUTED
(void) _Watchdog_Remove( &the_thread->Timer );
800a6f8: 35 61 00 48 addi r1,r11,72 <== NOT EXECUTED
800a6fc: fb ff f1 85 calli 8006d10 <_Watchdog_Remove> <== NOT EXECUTED
800a700: e3 ff ff f2 bi 800a6c8 <_Thread_blocking_operation_Cancel+0x24><== NOT EXECUTED
08005d00 <_Thread_queue_Dequeue>:
*/
Thread_Control *_Thread_queue_Dequeue(
Thread_queue_Control *the_thread_queue
)
{
8005d00: 37 9c ff f8 addi sp,sp,-8
8005d04: 5b 8b 00 08 sw (sp+8),r11
8005d08: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *(*dequeue_p)( Thread_queue_Control * );
Thread_Control *the_thread;
ISR_Level level;
Thread_blocking_operation_States sync_state;
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005d0c: 28 23 00 34 lw r3,(r1+52)
*/
Thread_Control *_Thread_queue_Dequeue(
Thread_queue_Control *the_thread_queue
)
{
8005d10: b8 20 58 00 mv r11,r1
Thread_blocking_operation_States sync_state;
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
dequeue_p = _Thread_queue_Dequeue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
dequeue_p = _Thread_queue_Dequeue_fifo;
8005d14: 78 02 08 00 mvhi r2,0x800
Thread_Control *(*dequeue_p)( Thread_queue_Control * );
Thread_Control *the_thread;
ISR_Level level;
Thread_blocking_operation_States sync_state;
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005d18: 34 01 00 01 mvi r1,1
dequeue_p = _Thread_queue_Dequeue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
dequeue_p = _Thread_queue_Dequeue_fifo;
8005d1c: 38 42 a7 c8 ori r2,r2,0xa7c8
Thread_Control *(*dequeue_p)( Thread_queue_Control * );
Thread_Control *the_thread;
ISR_Level level;
Thread_blocking_operation_States sync_state;
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005d20: 44 61 00 0d be r3,r1,8005d54 <_Thread_queue_Dequeue+0x54>
dequeue_p = _Thread_queue_Dequeue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
dequeue_p = _Thread_queue_Dequeue_fifo;
the_thread = (*dequeue_p)( the_thread_queue );
8005d24: b9 60 08 00 mv r1,r11
8005d28: d8 40 00 00 call r2
_ISR_Disable( level );
8005d2c: 90 00 10 00 rcsr r2,IE
8005d30: 34 03 ff fe mvi r3,-2
8005d34: a0 43 18 00 and r3,r2,r3
8005d38: d0 03 00 00 wcsr IE,r3
if ( !the_thread ) {
8005d3c: 44 20 00 0f be r1,r0,8005d78 <_Thread_queue_Dequeue+0x78>
(sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) ) {
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
the_thread = _Thread_Executing;
}
}
_ISR_Enable( level );
8005d40: d0 02 00 00 wcsr IE,r2
return the_thread;
}
8005d44: 2b 9d 00 04 lw ra,(sp+4)
8005d48: 2b 8b 00 08 lw r11,(sp+8)
8005d4c: 37 9c 00 08 addi sp,sp,8
8005d50: c3 a0 00 00 ret
Thread_Control *the_thread;
ISR_Level level;
Thread_blocking_operation_States sync_state;
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
dequeue_p = _Thread_queue_Dequeue_priority;
8005d54: 78 02 08 00 mvhi r2,0x800
8005d58: 38 42 5d a0 ori r2,r2,0x5da0
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
dequeue_p = _Thread_queue_Dequeue_fifo;
the_thread = (*dequeue_p)( the_thread_queue );
8005d5c: b9 60 08 00 mv r1,r11
8005d60: d8 40 00 00 call r2
_ISR_Disable( level );
8005d64: 90 00 10 00 rcsr r2,IE
8005d68: 34 03 ff fe mvi r3,-2
8005d6c: a0 43 18 00 and r3,r2,r3
8005d70: d0 03 00 00 wcsr IE,r3
if ( !the_thread ) {
8005d74: 5c 20 ff f3 bne r1,r0,8005d40 <_Thread_queue_Dequeue+0x40>
sync_state = the_thread_queue->sync_state;
if ( (sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
8005d78: 29 64 00 30 lw r4,(r11+48)
8005d7c: 34 03 00 01 mvi r3,1
8005d80: 34 84 ff ff addi r4,r4,-1
8005d84: 54 83 ff ef bgu r4,r3,8005d40 <_Thread_queue_Dequeue+0x40> <== ALWAYS TAKEN
(sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) ) {
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
the_thread = _Thread_Executing;
8005d88: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8005d8c: 38 21 4d 78 ori r1,r1,0x4d78 <== NOT EXECUTED
_ISR_Disable( level );
if ( !the_thread ) {
sync_state = the_thread_queue->sync_state;
if ( (sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) ) {
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
8005d90: 34 03 00 03 mvi r3,3 <== NOT EXECUTED
the_thread = _Thread_Executing;
8005d94: 28 21 00 0c lw r1,(r1+12) <== NOT EXECUTED
_ISR_Disable( level );
if ( !the_thread ) {
sync_state = the_thread_queue->sync_state;
if ( (sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) ) {
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
8005d98: 59 63 00 30 sw (r11+48),r3 <== NOT EXECUTED
8005d9c: e3 ff ff e9 bi 8005d40 <_Thread_queue_Dequeue+0x40> <== NOT EXECUTED
0800a894 <_Thread_queue_Enqueue_fifo>:
)
{
Thread_blocking_operation_States sync_state;
ISR_Level level;
_ISR_Disable( level );
800a894: 90 00 20 00 rcsr r4,IE
800a898: 34 05 ff fe mvi r5,-2
800a89c: a0 85 28 00 and r5,r4,r5
800a8a0: d0 05 00 00 wcsr IE,r5
sync_state = the_thread_queue->sync_state;
800a8a4: 28 25 00 30 lw r5,(r1+48)
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) {
800a8a8: 34 06 00 01 mvi r6,1
ISR_Level level;
_ISR_Disable( level );
sync_state = the_thread_queue->sync_state;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
800a8ac: 58 20 00 30 sw (r1+48),r0
if (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) {
800a8b0: 44 a6 00 04 be r5,r6,800a8c0 <_Thread_queue_Enqueue_fifo+0x2c><== ALWAYS TAKEN
* For example, the blocking thread could have been given
* the mutex by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
800a8b4: 58 64 00 00 sw (r3+0),r4 <== NOT EXECUTED
return sync_state;
}
800a8b8: b8 a0 08 00 mv r1,r5 <== NOT EXECUTED
800a8bc: c3 a0 00 00 ret <== NOT EXECUTED
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
800a8c0: 28 23 00 08 lw r3,(r1+8)
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
800a8c4: 34 26 00 04 addi r6,r1,4
Chain_Node *old_last = tail->previous;
the_node->next = tail;
800a8c8: 58 46 00 00 sw (r2+0),r6
tail->previous = the_node;
800a8cc: 58 22 00 08 sw (r1+8),r2
old_last->next = the_node;
800a8d0: 58 62 00 00 sw (r3+0),r2
the_node->previous = old_last;
800a8d4: 58 43 00 04 sw (r2+4),r3
if (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) {
_Chain_Append_unprotected(
&the_thread_queue->Queues.Fifo,
&the_thread->Object.Node
);
the_thread->Wait.queue = the_thread_queue;
800a8d8: 58 41 00 44 sw (r2+68),r1
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
_ISR_Enable( level );
800a8dc: d0 04 00 00 wcsr IE,r4
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return sync_state;
}
800a8e0: b8 a0 08 00 mv r1,r5
800a8e4: c3 a0 00 00 ret
08005fac <_Thread_queue_Enqueue_priority>:
Thread_blocking_operation_States _Thread_queue_Enqueue_priority (
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
ISR_Level *level_p
)
{
8005fac: 37 9c ff f4 addi sp,sp,-12
8005fb0: 5b 8b 00 0c sw (sp+12),r11
8005fb4: 5b 8c 00 08 sw (sp+8),r12
8005fb8: 5b 8d 00 04 sw (sp+4),r13
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
8005fbc: 28 45 00 14 lw r5,(r2+20)
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
8005fc0: 34 47 00 3c addi r7,r2,60
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
8005fc4: 34 46 00 38 addi r6,r2,56
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
8005fc8: 00 a4 00 01 srui r4,r5,1
8005fcc: 78 0c 08 01 mvhi r12,0x801
8005fd0: 00 84 00 01 srui r4,r4,1
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8005fd4: 58 47 00 38 sw (r2+56),r7
8005fd8: 00 84 00 01 srui r4,r4,1
head->previous = NULL;
tail->previous = head;
8005fdc: 58 46 00 40 sw (r2+64),r6
8005fe0: 00 84 00 01 srui r4,r4,1
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
8005fe4: 58 40 00 3c sw (r2+60),r0
8005fe8: 00 84 00 01 srui r4,r4,1
RTEMS_INLINE_ROUTINE bool _Thread_queue_Is_reverse_search (
Priority_Control the_priority
)
{
return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK );
8005fec: 20 a8 00 20 andi r8,r5,0x20
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
8005ff0: 00 84 00 01 srui r4,r4,1
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
block_state = the_thread_queue->state;
8005ff4: 28 27 00 38 lw r7,(r1+56)
8005ff8: b4 84 30 00 add r6,r4,r4
8005ffc: 39 8c 40 c0 ori r12,r12,0x40c0
if ( _Thread_queue_Is_reverse_search( priority ) )
8006000: 5d 00 00 18 bne r8,r0,8006060 <_Thread_queue_Enqueue_priority+0xb4>
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006004: b4 c4 20 00 add r4,r6,r4
8006008: b4 84 20 00 add r4,r4,r4
800600c: b4 84 20 00 add r4,r4,r4
8006010: b4 24 60 00 add r12,r1,r4
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
8006014: 34 0d ff fe mvi r13,-2
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
8006018: 35 8b 00 04 addi r11,r12,4
800601c: 90 00 40 00 rcsr r8,IE
8006020: a1 0d 50 00 and r10,r8,r13
8006024: d0 0a 00 00 wcsr IE,r10
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006028: 29 84 00 00 lw r4,(r12+0)
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
800602c: 5c 8b 00 04 bne r4,r11,800603c <_Thread_queue_Enqueue_priority+0x90>
8006030: e0 00 00 24 bi 80060c0 <_Thread_queue_Enqueue_priority+0x114>
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
goto restart_forward_search;
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
8006034: 28 84 00 00 lw r4,(r4+0)
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
8006038: 44 8b 00 23 be r4,r11,80060c4 <_Thread_queue_Enqueue_priority+0x118>
search_priority = search_thread->current_priority;
800603c: 28 86 00 14 lw r6,(r4+20)
if ( priority <= search_priority )
8006040: 50 c5 00 21 bgeu r6,r5,80060c4 <_Thread_queue_Enqueue_priority+0x118>
break;
search_priority = search_thread->current_priority;
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
8006044: d0 08 00 00 wcsr IE,r8
8006048: d0 0a 00 00 wcsr IE,r10
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
800604c: 28 89 00 10 lw r9,(r4+16)
8006050: a0 e9 48 00 and r9,r7,r9
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
8006054: 5d 20 ff f8 bne r9,r0,8006034 <_Thread_queue_Enqueue_priority+0x88><== ALWAYS TAKEN
_ISR_Enable( level );
8006058: d0 08 00 00 wcsr IE,r8 <== NOT EXECUTED
goto restart_forward_search;
800605c: e3 ff ff f0 bi 800601c <_Thread_queue_Enqueue_priority+0x70><== NOT EXECUTED
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006060: b4 c4 20 00 add r4,r6,r4
8006064: b4 84 20 00 add r4,r4,r4
8006068: b4 84 20 00 add r4,r4,r4
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
800606c: 34 0d ff fe mvi r13,-2
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006070: b4 24 50 00 add r10,r1,r4
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
8006074: 41 86 00 00 lbu r6,(r12+0)
8006078: 34 c6 00 01 addi r6,r6,1
_ISR_Disable( level );
800607c: 90 00 40 00 rcsr r8,IE
8006080: a1 0d 58 00 and r11,r8,r13
8006084: d0 0b 00 00 wcsr IE,r11
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006088: 29 44 00 08 lw r4,(r10+8)
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
800608c: 5c 8a 00 04 bne r4,r10,800609c <_Thread_queue_Enqueue_priority+0xf0>
8006090: e0 00 00 18 bi 80060f0 <_Thread_queue_Enqueue_priority+0x144>
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
_ISR_Enable( level );
goto restart_reverse_search;
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
8006094: 28 84 00 04 lw r4,(r4+4)
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
8006098: 44 8a 00 16 be r4,r10,80060f0 <_Thread_queue_Enqueue_priority+0x144>
search_priority = search_thread->current_priority;
800609c: 28 86 00 14 lw r6,(r4+20)
if ( priority >= search_priority )
80060a0: 50 a6 00 14 bgeu r5,r6,80060f0 <_Thread_queue_Enqueue_priority+0x144>
break;
search_priority = search_thread->current_priority;
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
80060a4: d0 08 00 00 wcsr IE,r8
80060a8: d0 0b 00 00 wcsr IE,r11
80060ac: 28 89 00 10 lw r9,(r4+16)
80060b0: a0 e9 48 00 and r9,r7,r9
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
80060b4: 5d 20 ff f8 bne r9,r0,8006094 <_Thread_queue_Enqueue_priority+0xe8><== ALWAYS TAKEN
_ISR_Enable( level );
80060b8: d0 08 00 00 wcsr IE,r8 <== NOT EXECUTED
goto restart_reverse_search;
80060bc: e3 ff ff ee bi 8006074 <_Thread_queue_Enqueue_priority+0xc8><== NOT EXECUTED
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
80060c0: 34 06 ff ff mvi r6,-1
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
80060c4: 28 27 00 30 lw r7,(r1+48)
80060c8: 34 0a 00 01 mvi r10,1
80060cc: b9 00 48 00 mv r9,r8
80060d0: 44 ea 00 1b be r7,r10,800613c <_Thread_queue_Enqueue_priority+0x190><== ALWAYS TAKEN
* For example, the blocking thread could have been given
* the mutex by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
80060d4: 58 69 00 00 sw (r3+0),r9 <== NOT EXECUTED
return the_thread_queue->sync_state;
}
80060d8: b8 e0 08 00 mv r1,r7
80060dc: 2b 8b 00 0c lw r11,(sp+12)
80060e0: 2b 8c 00 08 lw r12,(sp+8)
80060e4: 2b 8d 00 04 lw r13,(sp+4)
80060e8: 37 9c 00 0c addi sp,sp,12
80060ec: c3 a0 00 00 ret
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
80060f0: 28 27 00 30 lw r7,(r1+48)
80060f4: 34 0a 00 01 mvi r10,1
80060f8: b9 00 48 00 mv r9,r8
80060fc: 5c ea ff f6 bne r7,r10,80060d4 <_Thread_queue_Enqueue_priority+0x128><== NEVER TAKEN
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
8006100: 58 20 00 30 sw (r1+48),r0
if ( priority == search_priority )
8006104: 44 a6 00 1d be r5,r6,8006178 <_Thread_queue_Enqueue_priority+0x1cc>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
8006108: 28 83 00 00 lw r3,(r4+0)
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
the_node->previous = search_node;
800610c: 58 44 00 04 sw (r2+4),r4
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
8006110: 58 43 00 00 sw (r2+0),r3
the_node->previous = search_node;
search_node->next = the_node;
8006114: 58 82 00 00 sw (r4+0),r2
next_node->previous = the_node;
8006118: 58 62 00 04 sw (r3+4),r2
the_thread->Wait.queue = the_thread_queue;
800611c: 58 41 00 44 sw (r2+68),r1
_ISR_Enable( level );
8006120: d0 08 00 00 wcsr IE,r8
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006124: b8 e0 08 00 mv r1,r7
8006128: 2b 8b 00 0c lw r11,(sp+12)
800612c: 2b 8c 00 08 lw r12,(sp+8)
8006130: 2b 8d 00 04 lw r13,(sp+4)
8006134: 37 9c 00 0c addi sp,sp,12
8006138: c3 a0 00 00 ret
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
800613c: 58 20 00 30 sw (r1+48),r0
if ( priority == search_priority )
8006140: 44 a6 00 0e be r5,r6,8006178 <_Thread_queue_Enqueue_priority+0x1cc>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
8006144: 28 83 00 04 lw r3,(r4+4)
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
8006148: 58 44 00 00 sw (r2+0),r4
the_node->previous = previous_node;
800614c: 58 43 00 04 sw (r2+4),r3
previous_node->next = the_node;
8006150: 58 62 00 00 sw (r3+0),r2
search_node->previous = the_node;
8006154: 58 82 00 04 sw (r4+4),r2
the_thread->Wait.queue = the_thread_queue;
8006158: 58 41 00 44 sw (r2+68),r1
_ISR_Enable( level );
800615c: d0 08 00 00 wcsr IE,r8
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8006160: b8 e0 08 00 mv r1,r7
8006164: 2b 8b 00 0c lw r11,(sp+12)
8006168: 2b 8c 00 08 lw r12,(sp+8)
800616c: 2b 8d 00 04 lw r13,(sp+4)
8006170: 37 9c 00 0c addi sp,sp,12
8006174: c3 a0 00 00 ret
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
previous_node = search_node->previous;
8006178: 28 83 00 40 lw r3,(r4+64)
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
800617c: 34 85 00 3c addi r5,r4,60
previous_node = search_node->previous;
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
8006180: 58 45 00 00 sw (r2+0),r5
the_node->previous = previous_node;
8006184: 58 43 00 04 sw (r2+4),r3
previous_node->next = the_node;
8006188: 58 62 00 00 sw (r3+0),r2
search_node->previous = the_node;
800618c: 58 82 00 40 sw (r4+64),r2
the_thread->Wait.queue = the_thread_queue;
8006190: 58 41 00 44 sw (r2+68),r1
_ISR_Enable( level );
8006194: d0 08 00 00 wcsr IE,r8
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
8006198: 34 07 00 01 mvi r7,1
800619c: e3 ff ff cf bi 80060d8 <_Thread_queue_Enqueue_priority+0x12c>
08005ed0 <_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
)
{
8005ed0: 37 9c ff e8 addi sp,sp,-24
8005ed4: 5b 8b 00 14 sw (sp+20),r11
8005ed8: 5b 8c 00 10 sw (sp+16),r12
8005edc: 5b 8d 00 0c sw (sp+12),r13
8005ee0: 5b 8e 00 08 sw (sp+8),r14
8005ee4: 5b 9d 00 04 sw (sp+4),ra
Thread_queue_Control *,
Thread_Control *,
ISR_Level *
);
the_thread = _Thread_Executing;
8005ee8: 78 04 08 01 mvhi r4,0x801
8005eec: 38 84 4d 78 ori r4,r4,0x4d78
8005ef0: 28 8b 00 0c lw r11,(r4+12)
void _Thread_queue_Enqueue_with_handler(
Thread_queue_Control *the_thread_queue,
Watchdog_Interval timeout,
Thread_queue_Timeout_callout handler
)
{
8005ef4: b8 40 68 00 mv r13,r2
else
#endif
/*
* Set the blocking state for this thread queue in the thread.
*/
_Thread_Set_state( the_thread, the_thread_queue->state );
8005ef8: 28 22 00 38 lw r2,(r1+56)
void _Thread_queue_Enqueue_with_handler(
Thread_queue_Control *the_thread_queue,
Watchdog_Interval timeout,
Thread_queue_Timeout_callout handler
)
{
8005efc: b8 20 60 00 mv r12,r1
else
#endif
/*
* Set the blocking state for this thread queue in the thread.
*/
_Thread_Set_state( the_thread, the_thread_queue->state );
8005f00: b9 60 08 00 mv r1,r11
void _Thread_queue_Enqueue_with_handler(
Thread_queue_Control *the_thread_queue,
Watchdog_Interval timeout,
Thread_queue_Timeout_callout handler
)
{
8005f04: b8 60 70 00 mv r14,r3
else
#endif
/*
* Set the blocking state for this thread queue in the thread.
*/
_Thread_Set_state( the_thread, the_thread_queue->state );
8005f08: f8 00 01 1b calli 8006374 <_Thread_Set_state>
/*
* If the thread wants to timeout, then schedule its timer.
*/
if ( timeout ) {
8005f0c: 5d a0 00 16 bne r13,r0,8005f64 <_Thread_queue_Enqueue_with_handler+0x94>
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005f10: 29 82 00 34 lw r2,(r12+52)
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
8005f14: 78 04 08 00 mvhi r4,0x800
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005f18: 34 01 00 01 mvi r1,1
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
8005f1c: 38 84 a8 94 ori r4,r4,0xa894
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005f20: 44 41 00 20 be r2,r1,8005fa0 <_Thread_queue_Enqueue_with_handler+0xd0>
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
sync_state = (*enqueue_p)( the_thread_queue, the_thread, &level );
8005f24: b9 60 10 00 mv r2,r11
8005f28: b9 80 08 00 mv r1,r12
8005f2c: 37 83 00 18 addi r3,sp,24
8005f30: d8 80 00 00 call r4
if ( sync_state != THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
8005f34: 34 02 00 01 mvi r2,1
8005f38: 44 22 00 04 be r1,r2,8005f48 <_Thread_queue_Enqueue_with_handler+0x78><== ALWAYS TAKEN
_Thread_blocking_operation_Cancel( sync_state, the_thread, level );
8005f3c: 2b 83 00 18 lw r3,(sp+24) <== NOT EXECUTED
8005f40: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8005f44: f8 00 11 d8 calli 800a6a4 <_Thread_blocking_operation_Cancel><== NOT EXECUTED
}
8005f48: 2b 9d 00 04 lw ra,(sp+4)
8005f4c: 2b 8b 00 14 lw r11,(sp+20)
8005f50: 2b 8c 00 10 lw r12,(sp+16)
8005f54: 2b 8d 00 0c lw r13,(sp+12)
8005f58: 2b 8e 00 08 lw r14,(sp+8)
8005f5c: 37 9c 00 18 addi sp,sp,24
8005f60: c3 a0 00 00 ret
/*
* If the thread wants to timeout, then schedule its timer.
*/
if ( timeout ) {
_Watchdog_Initialize(
8005f64: 29 61 00 08 lw r1,(r11+8)
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8005f68: 35 62 00 48 addi r2,r11,72
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8005f6c: 59 60 00 50 sw (r11+80),r0
the_watchdog->routine = routine;
the_watchdog->id = id;
8005f70: 59 61 00 68 sw (r11+104),r1
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8005f74: 78 01 08 01 mvhi r1,0x801
8005f78: 38 21 49 88 ori r1,r1,0x4988
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
8005f7c: 59 6e 00 64 sw (r11+100),r14
the_watchdog->id = id;
the_watchdog->user_data = user_data;
8005f80: 59 60 00 6c sw (r11+108),r0
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8005f84: 59 6d 00 54 sw (r11+84),r13
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8005f88: f8 00 02 f9 calli 8006b6c <_Watchdog_Insert>
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005f8c: 29 82 00 34 lw r2,(r12+52)
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
8005f90: 78 04 08 00 mvhi r4,0x800
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005f94: 34 01 00 01 mvi r1,1
enqueue_p = _Thread_queue_Enqueue_priority;
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
enqueue_p = _Thread_queue_Enqueue_fifo;
8005f98: 38 84 a8 94 ori r4,r4,0xa894
}
/*
* Now enqueue the thread per the discipline for this thread queue.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
8005f9c: 5c 41 ff e2 bne r2,r1,8005f24 <_Thread_queue_Enqueue_with_handler+0x54>
enqueue_p = _Thread_queue_Enqueue_priority;
8005fa0: 78 04 08 00 mvhi r4,0x800
8005fa4: 38 84 5f ac ori r4,r4,0x5fac
8005fa8: e3 ff ff df bi 8005f24 <_Thread_queue_Enqueue_with_handler+0x54>
0800aa74 <_Thread_queue_Process_timeout>:
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
800aa74: 37 9c ff fc addi sp,sp,-4
800aa78: 5b 9d 00 04 sw (sp+4),ra
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
800aa7c: 28 23 00 44 lw r3,(r1+68)
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
800aa80: b8 20 20 00 mv r4,r1
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
800aa84: 28 62 00 30 lw r2,(r3+48)
800aa88: 44 40 00 05 be r2,r0,800aa9c <_Thread_queue_Process_timeout+0x28><== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
800aa8c: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
800aa90: 38 21 4d 78 ori r1,r1,0x4d78 <== NOT EXECUTED
800aa94: 28 21 00 0c lw r1,(r1+12) <== NOT EXECUTED
800aa98: 44 81 00 09 be r4,r1,800aabc <_Thread_queue_Process_timeout+0x48><== NOT EXECUTED
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
800aa9c: 28 65 00 3c lw r5,(r3+60)
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
800aaa0: b8 60 08 00 mv r1,r3
800aaa4: b8 80 10 00 mv r2,r4
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
800aaa8: 58 85 00 34 sw (r4+52),r5
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
800aaac: fb ff ff 8f calli 800a8e8 <_Thread_queue_Extract>
}
}
800aab0: 2b 9d 00 04 lw ra,(sp+4)
800aab4: 37 9c 00 04 addi sp,sp,4
800aab8: c3 a0 00 00 ret
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
_Thread_Is_executing( the_thread ) ) {
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
800aabc: 34 01 00 03 mvi r1,3 <== NOT EXECUTED
800aac0: 44 41 ff fc be r2,r1,800aab0 <_Thread_queue_Process_timeout+0x3c><== NOT EXECUTED
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
800aac4: 28 61 00 3c lw r1,(r3+60) <== NOT EXECUTED
800aac8: 58 81 00 34 sw (r4+52),r1 <== NOT EXECUTED
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
800aacc: 34 01 00 02 mvi r1,2 <== NOT EXECUTED
800aad0: 58 61 00 30 sw (r3+48),r1 <== NOT EXECUTED
800aad4: e3 ff ff f7 bi 800aab0 <_Thread_queue_Process_timeout+0x3c><== NOT EXECUTED
0800624c <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
800624c: 37 9c ff ec addi sp,sp,-20
8006250: 5b 8b 00 10 sw (sp+16),r11
8006254: 5b 8c 00 0c sw (sp+12),r12
8006258: 5b 8d 00 08 sw (sp+8),r13
800625c: 5b 9d 00 04 sw (sp+4),ra
8006260: b8 20 58 00 mv r11,r1
8006264: b8 40 60 00 mv r12,r2
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
8006268: 44 20 00 04 be r1,r0,8006278 <_Thread_queue_Requeue+0x2c> <== NEVER TAKEN
/*
* If queueing by FIFO, there is nothing to do. This only applies to
* priority blocking discipline.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
800626c: 28 22 00 34 lw r2,(r1+52)
8006270: 34 01 00 01 mvi r1,1
8006274: 44 41 00 07 be r2,r1,8006290 <_Thread_queue_Requeue+0x44> <== ALWAYS TAKEN
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
8006278: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800627c: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
8006280: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
8006284: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
8006288: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED
800628c: c3 a0 00 00 ret <== NOT EXECUTED
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
8006290: 90 00 68 00 rcsr r13,IE
8006294: 34 01 ff fe mvi r1,-2
8006298: a1 a1 08 00 and r1,r13,r1
800629c: d0 01 00 00 wcsr IE,r1
80062a0: 78 03 08 01 mvhi r3,0x801
80062a4: 38 63 36 18 ori r3,r3,0x3618
80062a8: 29 82 00 10 lw r2,(r12+16)
80062ac: 28 61 00 00 lw r1,(r3+0)
80062b0: a0 41 08 00 and r1,r2,r1
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
80062b4: 5c 20 00 08 bne r1,r0,80062d4 <_Thread_queue_Requeue+0x88> <== ALWAYS TAKEN
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
80062b8: d0 0d 00 00 wcsr IE,r13 <== NOT EXECUTED
}
}
80062bc: 2b 9d 00 04 lw ra,(sp+4)
80062c0: 2b 8b 00 10 lw r11,(sp+16)
80062c4: 2b 8c 00 0c lw r12,(sp+12)
80062c8: 2b 8d 00 08 lw r13,(sp+8)
80062cc: 37 9c 00 14 addi sp,sp,20
80062d0: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
80062d4: 34 01 00 01 mvi r1,1
80062d8: 59 61 00 30 sw (r11+48),r1
ISR_Level level_ignored;
_ISR_Disable( level );
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
80062dc: b9 80 10 00 mv r2,r12
80062e0: b9 60 08 00 mv r1,r11
80062e4: 34 03 00 01 mvi r3,1
80062e8: f8 00 11 8e calli 800a920 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
80062ec: b9 60 08 00 mv r1,r11
80062f0: b9 80 10 00 mv r2,r12
80062f4: 37 83 00 14 addi r3,sp,20
80062f8: fb ff ff 2d calli 8005fac <_Thread_queue_Enqueue_priority>
}
_ISR_Enable( level );
80062fc: d0 0d 00 00 wcsr IE,r13
8006300: e3 ff ff ef bi 80062bc <_Thread_queue_Requeue+0x70>
08006304 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
8006304: 37 9c ff f8 addi sp,sp,-8
8006308: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
800630c: 37 82 00 08 addi r2,sp,8
8006310: fb ff fd 7c calli 8005900 <_Thread_Get>
switch ( location ) {
8006314: 2b 82 00 08 lw r2,(sp+8)
8006318: 5c 40 00 07 bne r2,r0,8006334 <_Thread_queue_Timeout+0x30> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
800631c: f8 00 11 d6 calli 800aa74 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
8006320: 78 01 08 01 mvhi r1,0x801
8006324: 38 21 48 a8 ori r1,r1,0x48a8
8006328: 28 22 00 00 lw r2,(r1+0)
800632c: 34 42 ff ff addi r2,r2,-1
8006330: 58 22 00 00 sw (r1+0),r2
_Thread_Unnest_dispatch();
break;
}
}
8006334: 2b 9d 00 04 lw ra,(sp+4)
8006338: 37 9c 00 08 addi sp,sp,8
800633c: c3 a0 00 00 ret
080144a4 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
80144a4: 37 9c ff a4 addi sp,sp,-92
80144a8: 5b 8b 00 44 sw (sp+68),r11
80144ac: 5b 8c 00 40 sw (sp+64),r12
80144b0: 5b 8d 00 3c sw (sp+60),r13
80144b4: 5b 8e 00 38 sw (sp+56),r14
80144b8: 5b 8f 00 34 sw (sp+52),r15
80144bc: 5b 90 00 30 sw (sp+48),r16
80144c0: 5b 91 00 2c sw (sp+44),r17
80144c4: 5b 92 00 28 sw (sp+40),r18
80144c8: 5b 93 00 24 sw (sp+36),r19
80144cc: 5b 94 00 20 sw (sp+32),r20
80144d0: 5b 95 00 1c sw (sp+28),r21
80144d4: 5b 96 00 18 sw (sp+24),r22
80144d8: 5b 97 00 14 sw (sp+20),r23
80144dc: 5b 98 00 10 sw (sp+16),r24
80144e0: 5b 99 00 0c sw (sp+12),r25
80144e4: 5b 9b 00 08 sw (sp+8),fp
80144e8: 5b 9d 00 04 sw (sp+4),ra
80144ec: 78 14 08 04 mvhi r20,0x804
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80144f0: 37 96 00 54 addi r22,sp,84
80144f4: 37 95 00 58 addi r21,sp,88
80144f8: 37 8e 00 48 addi r14,sp,72
80144fc: 37 92 00 4c addi r18,sp,76
8014500: 78 13 08 04 mvhi r19,0x804
8014504: 78 17 08 04 mvhi r23,0x804
8014508: b8 20 58 00 mv r11,r1
801450c: 5b 95 00 54 sw (sp+84),r21
head->previous = NULL;
8014510: 5b 80 00 58 sw (sp+88),r0
tail->previous = head;
8014514: 5b 96 00 5c sw (sp+92),r22
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8014518: 5b 92 00 48 sw (sp+72),r18
head->previous = NULL;
801451c: 5b 80 00 4c sw (sp+76),r0
tail->previous = head;
8014520: 5b 8e 00 50 sw (sp+80),r14
8014524: 3a 94 0d e0 ori r20,r20,0xde0
8014528: 34 30 00 30 addi r16,r1,48
801452c: 3a 73 0d 58 ori r19,r19,0xd58
8014530: 34 2f 00 68 addi r15,r1,104
8014534: 3a f7 0c b0 ori r23,r23,0xcb0
8014538: 34 3b 00 08 addi fp,r1,8
801453c: 34 39 00 40 addi r25,r1,64
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
8014540: 34 0d 00 03 mvi r13,3
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
8014544: 34 11 ff fe mvi r17,-2
_Thread_Set_state( ts->thread, STATES_DELAYING );
_Timer_server_Reset_interval_system_watchdog( ts );
_Timer_server_Reset_tod_system_watchdog( ts );
_Thread_Enable_dispatch();
ts->active = true;
8014548: 34 18 00 01 mvi r24,1
Chain_Control *tmp;
/*
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
801454c: 59 76 00 78 sw (r11+120),r22
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
8014550: 2a 82 00 00 lw r2,(r20+0)
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
8014554: 29 63 00 3c lw r3,(r11+60)
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014558: ba 00 08 00 mv r1,r16
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
801455c: 59 62 00 3c sw (r11+60),r2
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014560: c8 43 10 00 sub r2,r2,r3
8014564: b9 c0 18 00 mv r3,r14
8014568: f8 00 15 a6 calli 8019c00 <_Watchdog_Adjust_to_chain>
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
801456c: 29 64 00 74 lw r4,(r11+116)
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
8014570: 2a 6c 00 00 lw r12,(r19+0)
/*
* Process the seconds chain. Start by checking that the Time
* of Day (TOD) has not been set backwards. If it has then
* we want to adjust the watchdogs->Chain to indicate this.
*/
if ( snapshot > last_snapshot ) {
8014574: 50 8c 00 31 bgeu r4,r12,8014638 <_Timer_server_Body+0x194>
/*
* This path is for normal forward movement and cases where the
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014578: b9 e0 08 00 mv r1,r15
801457c: c9 84 10 00 sub r2,r12,r4
8014580: b9 c0 18 00 mv r3,r14
8014584: f8 00 15 9f calli 8019c00 <_Watchdog_Adjust_to_chain>
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
8014588: 59 6c 00 74 sw (r11+116),r12
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
801458c: 34 0c 00 01 mvi r12,1
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
8014590: 29 61 00 78 lw r1,(r11+120)
8014594: f8 00 03 50 calli 80152d4 <_Chain_Get>
8014598: b8 20 10 00 mv r2,r1
if ( timer == NULL ) {
801459c: 44 20 00 0b be r1,r0,80145c8 <_Timer_server_Body+0x124> <== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
80145a0: 28 24 00 38 lw r4,(r1+56) <== NOT EXECUTED
80145a4: 44 8c 00 2b be r4,r12,8014650 <_Timer_server_Body+0x1ac> <== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
80145a8: 5c 8d ff fa bne r4,r13,8014590 <_Timer_server_Body+0xec> <== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
80145ac: 34 42 00 10 addi r2,r2,16 <== NOT EXECUTED
80145b0: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
80145b4: f8 00 15 b9 calli 8019c98 <_Watchdog_Insert> <== NOT EXECUTED
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
80145b8: 29 61 00 78 lw r1,(r11+120) <== NOT EXECUTED
80145bc: f8 00 03 46 calli 80152d4 <_Chain_Get> <== NOT EXECUTED
80145c0: b8 20 10 00 mv r2,r1 <== NOT EXECUTED
if ( timer == NULL ) {
80145c4: 5c 20 ff f7 bne r1,r0,80145a0 <_Timer_server_Body+0xfc> <== NOT EXECUTED
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
80145c8: 90 00 10 00 rcsr r2,IE
80145cc: a0 51 18 00 and r3,r2,r17
80145d0: d0 03 00 00 wcsr IE,r3
tmp = ts->insert_chain;
if ( _Chain_Is_empty( insert_chain ) ) {
80145d4: 2b 84 00 54 lw r4,(sp+84)
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
tmp = ts->insert_chain;
80145d8: 29 63 00 78 lw r3,(r11+120)
if ( _Chain_Is_empty( insert_chain ) ) {
80145dc: 34 03 00 01 mvi r3,1
80145e0: 44 95 00 20 be r4,r21,8014660 <_Timer_server_Body+0x1bc> <== ALWAYS TAKEN
ts->insert_chain = NULL;
do_loop = false;
}
_ISR_Enable( level );
80145e4: d0 02 00 00 wcsr IE,r2
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
while ( do_loop ) {
80145e8: 5c 60 ff da bne r3,r0,8014550 <_Timer_server_Body+0xac> <== NEVER TAKEN
_Chain_Initialize_empty( &fire_chain );
while ( true ) {
_Timer_server_Get_watchdogs_that_fire_now( ts, &insert_chain, &fire_chain );
if ( !_Chain_Is_empty( &fire_chain ) ) {
80145ec: 2b 82 00 48 lw r2,(sp+72)
80145f0: 5c 52 00 0b bne r2,r18,801461c <_Timer_server_Body+0x178>
80145f4: e0 00 00 1e bi 801466c <_Timer_server_Body+0x1c8>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
80145f8: 28 43 00 00 lw r3,(r2+0)
head->next = new_first;
new_first->previous = head;
80145fc: 58 6e 00 04 sw (r3+4),r14
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
8014600: 5b 83 00 48 sw (sp+72),r3
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
8014604: 58 40 00 08 sw (r2+8),r0
_ISR_Enable( level );
8014608: d0 04 00 00 wcsr IE,r4
/*
* The timer server may block here and wait for resources or time.
* The system watchdogs are inactive and will remain inactive since
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
801460c: 28 43 00 1c lw r3,(r2+28)
8014610: 28 41 00 20 lw r1,(r2+32)
8014614: 28 42 00 24 lw r2,(r2+36)
8014618: d8 60 00 00 call r3
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
801461c: 90 00 20 00 rcsr r4,IE
8014620: a0 91 10 00 and r2,r4,r17
8014624: d0 02 00 00 wcsr IE,r2
initialized = false;
}
#endif
return status;
}
8014628: 2b 82 00 48 lw r2,(sp+72)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
801462c: 5c 52 ff f3 bne r2,r18,80145f8 <_Timer_server_Body+0x154>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
8014630: d0 04 00 00 wcsr IE,r4
8014634: e3 ff ff c6 bi 801454c <_Timer_server_Body+0xa8>
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
} else if ( snapshot < last_snapshot ) {
8014638: 51 84 ff d4 bgeu r12,r4,8014588 <_Timer_server_Body+0xe4>
/*
* The current TOD is before the last TOD which indicates that
* TOD has been set backwards.
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
801463c: b9 e0 08 00 mv r1,r15
8014640: 34 02 00 01 mvi r2,1
8014644: c8 8c 18 00 sub r3,r4,r12
8014648: f8 00 15 30 calli 8019b08 <_Watchdog_Adjust>
801464c: e3 ff ff cf bi 8014588 <_Timer_server_Body+0xe4>
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
8014650: ba 00 08 00 mv r1,r16 <== NOT EXECUTED
8014654: 34 42 00 10 addi r2,r2,16 <== NOT EXECUTED
8014658: f8 00 15 90 calli 8019c98 <_Watchdog_Insert> <== NOT EXECUTED
801465c: e3 ff ff cd bi 8014590 <_Timer_server_Body+0xec> <== NOT EXECUTED
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
tmp = ts->insert_chain;
if ( _Chain_Is_empty( insert_chain ) ) {
ts->insert_chain = NULL;
8014660: 59 60 00 78 sw (r11+120),r0
do_loop = false;
8014664: 34 03 00 00 mvi r3,0
8014668: e3 ff ff df bi 80145e4 <_Timer_server_Body+0x140>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
801466c: 31 60 00 7c sb (r11+124),r0
8014670: 2a e1 00 00 lw r1,(r23+0)
8014674: 34 21 00 01 addi r1,r1,1
8014678: 5a e1 00 00 sw (r23+0),r1
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
801467c: 29 61 00 00 lw r1,(r11+0)
8014680: 34 02 00 08 mvi r2,8
8014684: f8 00 12 d4 calli 80191d4 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
8014688: b9 60 08 00 mv r1,r11
801468c: fb ff ff 44 calli 801439c <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
8014690: b9 60 08 00 mv r1,r11
8014694: fb ff ff 63 calli 8014420 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
8014698: f8 00 0f d7 calli 80185f4 <_Thread_Enable_dispatch>
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
801469c: bb 60 08 00 mv r1,fp
_Thread_Set_state( ts->thread, STATES_DELAYING );
_Timer_server_Reset_interval_system_watchdog( ts );
_Timer_server_Reset_tod_system_watchdog( ts );
_Thread_Enable_dispatch();
ts->active = true;
80146a0: 31 78 00 7c sb (r11+124),r24
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
80146a4: f8 00 15 e6 calli 8019e3c <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
80146a8: bb 20 08 00 mv r1,r25
80146ac: f8 00 15 e4 calli 8019e3c <_Watchdog_Remove>
80146b0: e3 ff ff a7 bi 801454c <_Timer_server_Body+0xa8>
080146b4 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
80146b4: 37 9c ff f8 addi sp,sp,-8
80146b8: 5b 8b 00 08 sw (sp+8),r11
80146bc: 5b 9d 00 04 sw (sp+4),ra
80146c0: b8 20 58 00 mv r11,r1
if ( ts->insert_chain == NULL ) {
80146c4: 28 21 00 78 lw r1,(r1+120)
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
80146c8: b8 40 18 00 mv r3,r2
if ( ts->insert_chain == NULL ) {
80146cc: 44 20 00 07 be r1,r0,80146e8 <_Timer_server_Schedule_operation_method+0x34><== ALWAYS TAKEN
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
80146d0: 29 61 00 78 lw r1,(r11+120) <== NOT EXECUTED
80146d4: f8 00 02 ea calli 801527c <_Chain_Append> <== NOT EXECUTED
}
}
80146d8: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80146dc: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
80146e0: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
80146e4: c3 a0 00 00 ret <== NOT EXECUTED
80146e8: 78 01 08 04 mvhi r1,0x804
80146ec: 38 21 0c b0 ori r1,r1,0xcb0
80146f0: 28 22 00 00 lw r2,(r1+0)
80146f4: 34 42 00 01 addi r2,r2,1
80146f8: 58 22 00 00 sw (r1+0),r2
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
80146fc: 28 61 00 38 lw r1,(r3+56)
8014700: 34 02 00 01 mvi r2,1
8014704: 44 22 00 28 be r1,r2,80147a4 <_Timer_server_Schedule_operation_method+0xf0>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
if ( !ts->active ) {
_Timer_server_Reset_interval_system_watchdog( ts );
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
8014708: 34 02 00 03 mvi r2,3
801470c: 44 22 00 06 be r1,r2,8014724 <_Timer_server_Schedule_operation_method+0x70>
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
8014710: f8 00 0f b9 calli 80185f4 <_Thread_Enable_dispatch>
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
}
}
8014714: 2b 9d 00 04 lw ra,(sp+4)
8014718: 2b 8b 00 08 lw r11,(sp+8)
801471c: 37 9c 00 08 addi sp,sp,8
8014720: c3 a0 00 00 ret
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
8014724: 90 00 38 00 rcsr r7,IE
8014728: 34 01 ff fe mvi r1,-2
801472c: a0 e1 08 00 and r1,r7,r1
8014730: d0 01 00 00 wcsr IE,r1
initialized = false;
}
#endif
return status;
}
8014734: 29 62 00 68 lw r2,(r11+104)
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
8014738: 78 01 08 04 mvhi r1,0x804
last_snapshot = ts->TOD_watchdogs.last_snapshot;
801473c: 29 64 00 74 lw r4,(r11+116)
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
8014740: 38 21 0d 58 ori r1,r1,0xd58
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8014744: 35 65 00 6c addi r5,r11,108
8014748: 28 21 00 00 lw r1,(r1+0)
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
801474c: 44 45 00 0a be r2,r5,8014774 <_Timer_server_Schedule_operation_method+0xc0>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
8014750: 28 46 00 10 lw r6,(r2+16)
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
8014754: b4 c4 28 00 add r5,r6,r4
delta_interval += delta;
8014758: c8 a1 28 00 sub r5,r5,r1
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
if ( snapshot > last_snapshot ) {
801475c: 50 81 00 05 bgeu r4,r1,8014770 <_Timer_server_Schedule_operation_method+0xbc>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
8014760: c8 24 20 00 sub r4,r1,r4
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
8014764: 34 05 00 00 mvi r5,0
if ( snapshot > last_snapshot ) {
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
8014768: 50 86 00 02 bgeu r4,r6,8014770 <_Timer_server_Schedule_operation_method+0xbc><== NEVER TAKEN
delta_interval -= delta;
801476c: c8 c4 28 00 sub r5,r6,r4
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
8014770: 58 45 00 10 sw (r2+16),r5
}
ts->TOD_watchdogs.last_snapshot = snapshot;
8014774: 59 61 00 74 sw (r11+116),r1
_ISR_Enable( level );
8014778: d0 07 00 00 wcsr IE,r7
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
801477c: 35 61 00 68 addi r1,r11,104
8014780: 34 62 00 10 addi r2,r3,16
8014784: f8 00 15 45 calli 8019c98 <_Watchdog_Insert>
if ( !ts->active ) {
8014788: 41 61 00 7c lbu r1,(r11+124)
801478c: 20 21 00 ff andi r1,r1,0xff
8014790: 5c 20 ff e0 bne r1,r0,8014710 <_Timer_server_Schedule_operation_method+0x5c>
_Timer_server_Reset_tod_system_watchdog( ts );
8014794: b9 60 08 00 mv r1,r11
8014798: fb ff ff 22 calli 8014420 <_Timer_server_Reset_tod_system_watchdog>
}
}
_Thread_Enable_dispatch();
801479c: f8 00 0f 96 calli 80185f4 <_Thread_Enable_dispatch>
80147a0: e3 ff ff dd bi 8014714 <_Timer_server_Schedule_operation_method+0x60>
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
80147a4: 90 00 20 00 rcsr r4,IE
80147a8: 34 01 ff fe mvi r1,-2
80147ac: a0 81 08 00 and r1,r4,r1
80147b0: d0 01 00 00 wcsr IE,r1
snapshot = _Watchdog_Ticks_since_boot;
80147b4: 78 01 08 04 mvhi r1,0x804
80147b8: 38 21 0d e0 ori r1,r1,0xde0
initialized = false;
}
#endif
return status;
}
80147bc: 29 62 00 30 lw r2,(r11+48)
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
80147c0: 28 21 00 00 lw r1,(r1+0)
last_snapshot = ts->Interval_watchdogs.last_snapshot;
80147c4: 29 66 00 3c lw r6,(r11+60)
80147c8: 35 65 00 34 addi r5,r11,52
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
80147cc: 44 45 00 07 be r2,r5,80147e8 <_Timer_server_Schedule_operation_method+0x134>
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
80147d0: 28 47 00 10 lw r7,(r2+16)
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
80147d4: c8 26 30 00 sub r6,r1,r6
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
80147d8: 34 05 00 00 mvi r5,0
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
80147dc: 50 c7 00 02 bgeu r6,r7,80147e4 <_Timer_server_Schedule_operation_method+0x130>
delta_interval -= delta;
80147e0: c8 e6 28 00 sub r5,r7,r6
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
80147e4: 58 45 00 10 sw (r2+16),r5
}
ts->Interval_watchdogs.last_snapshot = snapshot;
80147e8: 59 61 00 3c sw (r11+60),r1
_ISR_Enable( level );
80147ec: d0 04 00 00 wcsr IE,r4
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
80147f0: 35 61 00 30 addi r1,r11,48
80147f4: 34 62 00 10 addi r2,r3,16
80147f8: f8 00 15 28 calli 8019c98 <_Watchdog_Insert>
if ( !ts->active ) {
80147fc: 41 61 00 7c lbu r1,(r11+124)
8014800: 20 21 00 ff andi r1,r1,0xff
8014804: 5c 20 ff c3 bne r1,r0,8014710 <_Timer_server_Schedule_operation_method+0x5c>
_Timer_server_Reset_interval_system_watchdog( ts );
8014808: b9 60 08 00 mv r1,r11
801480c: fb ff fe e4 calli 801439c <_Timer_server_Reset_interval_system_watchdog>
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
8014810: f8 00 0f 79 calli 80185f4 <_Thread_Enable_dispatch>
8014814: e3 ff ff c0 bi 8014714 <_Timer_server_Schedule_operation_method+0x60>
08006908 <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
8006908: 37 9c ff e8 addi sp,sp,-24
800690c: 5b 8b 00 18 sw (sp+24),r11
8006910: 5b 8c 00 14 sw (sp+20),r12
8006914: 5b 8d 00 10 sw (sp+16),r13
8006918: 5b 8e 00 0c sw (sp+12),r14
800691c: 5b 8f 00 08 sw (sp+8),r15
8006920: 5b 9d 00 04 sw (sp+4),ra
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
8006924: 78 0c 08 01 mvhi r12,0x801
8006928: 39 8c 4a 28 ori r12,r12,0x4a28
800692c: 29 8b 00 08 lw r11,(r12+8)
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
8006930: b8 20 78 00 mv r15,r1
8006934: b8 60 70 00 mv r14,r3
8006938: 20 4d 00 ff andi r13,r2,0xff
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
800693c: 45 6c 00 09 be r11,r12,8006960 <_User_extensions_Fatal+0x58><== NEVER TAKEN
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
8006940: 29 64 00 30 lw r4,(r11+48)
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
8006944: b9 e0 08 00 mv r1,r15
8006948: b9 a0 10 00 mv r2,r13
800694c: b9 c0 18 00 mv r3,r14
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
8006950: 44 80 00 02 be r4,r0,8006958 <_User_extensions_Fatal+0x50>
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
8006954: d8 80 00 00 call r4
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
8006958: 29 6b 00 04 lw r11,(r11+4)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
800695c: 5d 6c ff f9 bne r11,r12,8006940 <_User_extensions_Fatal+0x38>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
8006960: 2b 9d 00 04 lw ra,(sp+4)
8006964: 2b 8b 00 18 lw r11,(sp+24)
8006968: 2b 8c 00 14 lw r12,(sp+20)
800696c: 2b 8d 00 10 lw r13,(sp+16)
8006970: 2b 8e 00 0c lw r14,(sp+12)
8006974: 2b 8f 00 08 lw r15,(sp+8)
8006978: 37 9c 00 18 addi sp,sp,24
800697c: c3 a0 00 00 ret
0800673c <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
800673c: 37 9c ff ec addi sp,sp,-20
8006740: 5b 8b 00 14 sw (sp+20),r11
8006744: 5b 8c 00 10 sw (sp+16),r12
8006748: 5b 8d 00 0c sw (sp+12),r13
800674c: 5b 8e 00 08 sw (sp+8),r14
8006750: 5b 9d 00 04 sw (sp+4),ra
User_extensions_Control *extension;
uint32_t i;
uint32_t number_of_extensions;
User_extensions_Table *initial_extensions;
number_of_extensions = Configuration.number_of_initial_extensions;
8006754: 78 03 08 01 mvhi r3,0x801
8006758: 38 63 40 c4 ori r3,r3,0x40c4
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
800675c: 78 02 08 01 mvhi r2,0x801
8006760: 78 05 08 01 mvhi r5,0x801
8006764: 78 01 08 01 mvhi r1,0x801
8006768: 78 04 08 01 mvhi r4,0x801
initial_extensions = Configuration.User_extension_table;
800676c: 28 6b 00 40 lw r11,(r3+64)
8006770: 38 42 4a 28 ori r2,r2,0x4a28
8006774: 38 21 48 ac ori r1,r1,0x48ac
8006778: 38 a5 4a 2c ori r5,r5,0x4a2c
800677c: 38 84 48 b0 ori r4,r4,0x48b0
8006780: 58 45 00 00 sw (r2+0),r5
head->previous = NULL;
8006784: 58 40 00 04 sw (r2+4),r0
tail->previous = head;
8006788: 58 42 00 08 sw (r2+8),r2
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
800678c: 58 24 00 00 sw (r1+0),r4
head->previous = NULL;
8006790: 58 20 00 04 sw (r1+4),r0
tail->previous = head;
8006794: 58 21 00 08 sw (r1+8),r1
User_extensions_Control *extension;
uint32_t i;
uint32_t number_of_extensions;
User_extensions_Table *initial_extensions;
number_of_extensions = Configuration.number_of_initial_extensions;
8006798: 28 6e 00 3c lw r14,(r3+60)
initial_extensions = Configuration.User_extension_table;
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
800679c: 45 60 00 26 be r11,r0,8006834 <_User_extensions_Handler_initialization+0xf8><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
number_of_extensions * sizeof( User_extensions_Control )
80067a0: b5 ce 68 00 add r13,r14,r14
80067a4: b5 ae 68 00 add r13,r13,r14
80067a8: b5 ad 68 00 add r13,r13,r13
80067ac: b5 ad 68 00 add r13,r13,r13
80067b0: b5 ae 68 00 add r13,r13,r14
80067b4: b5 ad 68 00 add r13,r13,r13
80067b8: b5 ad 68 00 add r13,r13,r13
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
80067bc: b9 a0 08 00 mv r1,r13
80067c0: f8 00 01 f7 calli 8006f9c <_Workspace_Allocate_or_fatal_error>
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
80067c4: 34 02 00 00 mvi r2,0
80067c8: b9 a0 18 00 mv r3,r13
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
80067cc: b8 20 60 00 mv r12,r1
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
80067d0: f8 00 1c 74 calli 800d9a0 <memset>
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
80067d4: 45 c0 00 18 be r14,r0,8006834 <_User_extensions_Handler_initialization+0xf8><== NEVER TAKEN
80067d8: 34 0d 00 00 mvi r13,0
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
80067dc: 29 62 00 00 lw r2,(r11+0)
_User_extensions_Add_set( extension );
80067e0: b9 80 08 00 mv r1,r12
80067e4: 35 ad 00 01 addi r13,r13,1
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
80067e8: 59 82 00 14 sw (r12+20),r2
80067ec: 29 62 00 04 lw r2,(r11+4)
80067f0: 59 82 00 18 sw (r12+24),r2
80067f4: 29 62 00 08 lw r2,(r11+8)
80067f8: 59 82 00 1c sw (r12+28),r2
80067fc: 29 62 00 0c lw r2,(r11+12)
8006800: 59 82 00 20 sw (r12+32),r2
8006804: 29 62 00 10 lw r2,(r11+16)
8006808: 59 82 00 24 sw (r12+36),r2
800680c: 29 62 00 14 lw r2,(r11+20)
8006810: 59 82 00 28 sw (r12+40),r2
8006814: 29 62 00 18 lw r2,(r11+24)
8006818: 59 82 00 2c sw (r12+44),r2
800681c: 29 62 00 1c lw r2,(r11+28)
8006820: 35 6b 00 20 addi r11,r11,32
8006824: 59 82 00 30 sw (r12+48),r2
_User_extensions_Add_set( extension );
8006828: f8 00 10 ea calli 800abd0 <_User_extensions_Add_set>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
800682c: 35 8c 00 34 addi r12,r12,52
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
8006830: 55 cd ff eb bgu r14,r13,80067dc <_User_extensions_Handler_initialization+0xa0>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
8006834: 2b 9d 00 04 lw ra,(sp+4)
8006838: 2b 8b 00 14 lw r11,(sp+20)
800683c: 2b 8c 00 10 lw r12,(sp+16)
8006840: 2b 8d 00 0c lw r13,(sp+12)
8006844: 2b 8e 00 08 lw r14,(sp+8)
8006848: 37 9c 00 14 addi sp,sp,20
800684c: c3 a0 00 00 ret
08006850 <_User_extensions_Thread_begin>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
8006850: 37 9c ff f0 addi sp,sp,-16
8006854: 5b 8b 00 10 sw (sp+16),r11
8006858: 5b 8c 00 0c sw (sp+12),r12
800685c: 5b 8d 00 08 sw (sp+8),r13
8006860: 5b 9d 00 04 sw (sp+4),ra
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
8006864: 78 02 08 01 mvhi r2,0x801
8006868: 38 42 4a 28 ori r2,r2,0x4a28
800686c: 28 4b 00 00 lw r11,(r2+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8006870: 78 0c 08 01 mvhi r12,0x801
8006874: 39 8c 4a 2c ori r12,r12,0x4a2c
#include <rtems/score/userext.h>
void _User_extensions_Thread_begin (
Thread_Control *executing
)
{
8006878: b8 20 68 00 mv r13,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
800687c: 45 6c 00 07 be r11,r12,8006898 <_User_extensions_Thread_begin+0x48><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
8006880: 29 62 00 28 lw r2,(r11+40)
(*the_extension->Callouts.thread_begin)( executing );
8006884: b9 a0 08 00 mv r1,r13
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
8006888: 44 40 00 02 be r2,r0,8006890 <_User_extensions_Thread_begin+0x40>
(*the_extension->Callouts.thread_begin)( executing );
800688c: d8 40 00 00 call r2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
8006890: 29 6b 00 00 lw r11,(r11+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8006894: 5d 6c ff fb bne r11,r12,8006880 <_User_extensions_Thread_begin+0x30>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_begin != NULL )
(*the_extension->Callouts.thread_begin)( executing );
}
}
8006898: 2b 9d 00 04 lw ra,(sp+4)
800689c: 2b 8b 00 10 lw r11,(sp+16)
80068a0: 2b 8c 00 0c lw r12,(sp+12)
80068a4: 2b 8d 00 08 lw r13,(sp+8)
80068a8: 37 9c 00 10 addi sp,sp,16
80068ac: c3 a0 00 00 ret
08006980 <_User_extensions_Thread_create>:
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
8006980: 37 9c ff ec addi sp,sp,-20
8006984: 5b 8b 00 14 sw (sp+20),r11
8006988: 5b 8c 00 10 sw (sp+16),r12
800698c: 5b 8d 00 0c sw (sp+12),r13
8006990: 5b 8e 00 08 sw (sp+8),r14
8006994: 5b 9d 00 04 sw (sp+4),ra
return false;
}
}
return true;
}
8006998: 78 02 08 01 mvhi r2,0x801
800699c: 38 42 4a 28 ori r2,r2,0x4a28
80069a0: 28 4b 00 00 lw r11,(r2+0)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
80069a4: 78 0c 08 01 mvhi r12,0x801
80069a8: 39 8c 4a 2c ori r12,r12,0x4a2c
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
80069ac: b8 20 70 00 mv r14,r1
if ( !status )
return false;
}
}
return true;
80069b0: 34 01 00 01 mvi r1,1
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
80069b4: 45 6c 00 0c be r11,r12,80069e4 <_User_extensions_Thread_create+0x64><== NEVER TAKEN
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
status = (*the_extension->Callouts.thread_create)(
80069b8: 78 0d 08 01 mvhi r13,0x801
80069bc: 39 ad 4d 78 ori r13,r13,0x4d78
!_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 ) {
80069c0: 29 63 00 14 lw r3,(r11+20)
status = (*the_extension->Callouts.thread_create)(
80069c4: b9 c0 10 00 mv r2,r14
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
80069c8: 44 60 00 04 be r3,r0,80069d8 <_User_extensions_Thread_create+0x58>
status = (*the_extension->Callouts.thread_create)(
80069cc: 29 a1 00 0c lw r1,(r13+12)
80069d0: d8 60 00 00 call r3
_Thread_Executing,
the_thread
);
if ( !status )
80069d4: 44 20 00 0b be r1,r0,8006a00 <_User_extensions_Thread_create+0x80>
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
80069d8: 29 6b 00 00 lw r11,(r11+0)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
80069dc: 5d 6c ff f9 bne r11,r12,80069c0 <_User_extensions_Thread_create+0x40>
if ( !status )
return false;
}
}
return true;
80069e0: 34 01 00 01 mvi r1,1
}
80069e4: 2b 9d 00 04 lw ra,(sp+4)
80069e8: 2b 8b 00 14 lw r11,(sp+20)
80069ec: 2b 8c 00 10 lw r12,(sp+16)
80069f0: 2b 8d 00 0c lw r13,(sp+12)
80069f4: 2b 8e 00 08 lw r14,(sp+8)
80069f8: 37 9c 00 14 addi sp,sp,20
80069fc: c3 a0 00 00 ret
status = (*the_extension->Callouts.thread_create)(
_Thread_Executing,
the_thread
);
if ( !status )
return false;
8006a00: 34 01 00 00 mvi r1,0
}
}
return true;
}
8006a04: 2b 9d 00 04 lw ra,(sp+4)
8006a08: 2b 8b 00 14 lw r11,(sp+20)
8006a0c: 2b 8c 00 10 lw r12,(sp+16)
8006a10: 2b 8d 00 0c lw r13,(sp+12)
8006a14: 2b 8e 00 08 lw r14,(sp+8)
8006a18: 37 9c 00 14 addi sp,sp,20
8006a1c: c3 a0 00 00 ret
08006a20 <_User_extensions_Thread_delete>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
8006a20: 37 9c ff ec addi sp,sp,-20
8006a24: 5b 8b 00 14 sw (sp+20),r11
8006a28: 5b 8c 00 10 sw (sp+16),r12
8006a2c: 5b 8d 00 0c sw (sp+12),r13
8006a30: 5b 8e 00 08 sw (sp+8),r14
8006a34: 5b 9d 00 04 sw (sp+4),ra
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
8006a38: 78 0c 08 01 mvhi r12,0x801
8006a3c: 39 8c 4a 28 ori r12,r12,0x4a28
8006a40: 29 8b 00 08 lw r11,(r12+8)
#include <rtems/score/userext.h>
void _User_extensions_Thread_delete (
Thread_Control *the_thread
)
{
8006a44: b8 20 70 00 mv r14,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
8006a48: 45 6c 00 0a be r11,r12,8006a70 <_User_extensions_Thread_delete+0x50><== NEVER TAKEN
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
(*the_extension->Callouts.thread_delete)(
8006a4c: 78 0d 08 01 mvhi r13,0x801
8006a50: 39 ad 4d 78 ori r13,r13,0x4d78
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
8006a54: 29 63 00 20 lw r3,(r11+32)
(*the_extension->Callouts.thread_delete)(
8006a58: b9 c0 10 00 mv r2,r14
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_delete != NULL )
8006a5c: 44 60 00 03 be r3,r0,8006a68 <_User_extensions_Thread_delete+0x48>
(*the_extension->Callouts.thread_delete)(
8006a60: 29 a1 00 0c lw r1,(r13+12)
8006a64: d8 60 00 00 call r3
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
8006a68: 29 6b 00 04 lw r11,(r11+4)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
8006a6c: 5d 6c ff fa bne r11,r12,8006a54 <_User_extensions_Thread_delete+0x34>
(*the_extension->Callouts.thread_delete)(
_Thread_Executing,
the_thread
);
}
}
8006a70: 2b 9d 00 04 lw ra,(sp+4)
8006a74: 2b 8b 00 14 lw r11,(sp+20)
8006a78: 2b 8c 00 10 lw r12,(sp+16)
8006a7c: 2b 8d 00 0c lw r13,(sp+12)
8006a80: 2b 8e 00 08 lw r14,(sp+8)
8006a84: 37 9c 00 14 addi sp,sp,20
8006a88: c3 a0 00 00 ret
080068b0 <_User_extensions_Thread_exitted>:
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
80068b0: 37 9c ff f0 addi sp,sp,-16
80068b4: 5b 8b 00 10 sw (sp+16),r11
80068b8: 5b 8c 00 0c sw (sp+12),r12
80068bc: 5b 8d 00 08 sw (sp+8),r13
80068c0: 5b 9d 00 04 sw (sp+4),ra
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
80068c4: 78 0c 08 01 mvhi r12,0x801
80068c8: 39 8c 4a 28 ori r12,r12,0x4a28
80068cc: 29 8b 00 08 lw r11,(r12+8)
}
void _User_extensions_Thread_exitted (
Thread_Control *executing
)
{
80068d0: b8 20 68 00 mv r13,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
80068d4: 45 6c 00 07 be r11,r12,80068f0 <_User_extensions_Thread_exitted+0x40><== NEVER TAKEN
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
80068d8: 29 62 00 2c lw r2,(r11+44)
(*the_extension->Callouts.thread_exitted)( executing );
80068dc: b9 a0 08 00 mv r1,r13
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
80068e0: 44 40 00 02 be r2,r0,80068e8 <_User_extensions_Thread_exitted+0x38>
(*the_extension->Callouts.thread_exitted)( executing );
80068e4: d8 40 00 00 call r2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
80068e8: 29 6b 00 04 lw r11,(r11+4)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
80068ec: 5d 6c ff fb bne r11,r12,80068d8 <_User_extensions_Thread_exitted+0x28>
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_exitted != NULL )
(*the_extension->Callouts.thread_exitted)( executing );
}
}
80068f0: 2b 9d 00 04 lw ra,(sp+4)
80068f4: 2b 8b 00 10 lw r11,(sp+16)
80068f8: 2b 8c 00 0c lw r12,(sp+12)
80068fc: 2b 8d 00 08 lw r13,(sp+8)
8006900: 37 9c 00 10 addi sp,sp,16
8006904: c3 a0 00 00 ret
08007a74 <_User_extensions_Thread_restart>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
8007a74: 37 9c ff ec addi sp,sp,-20
8007a78: 5b 8b 00 14 sw (sp+20),r11
8007a7c: 5b 8c 00 10 sw (sp+16),r12
8007a80: 5b 8d 00 0c sw (sp+12),r13
8007a84: 5b 8e 00 08 sw (sp+8),r14
8007a88: 5b 9d 00 04 sw (sp+4),ra
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
8007a8c: 78 02 08 01 mvhi r2,0x801
8007a90: 38 42 fa 70 ori r2,r2,0xfa70
8007a94: 28 4b 00 00 lw r11,(r2+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8007a98: 78 0c 08 01 mvhi r12,0x801
8007a9c: 39 8c fa 74 ori r12,r12,0xfa74
#include <rtems/score/userext.h>
void _User_extensions_Thread_restart (
Thread_Control *the_thread
)
{
8007aa0: b8 20 70 00 mv r14,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8007aa4: 45 6c 00 0a be r11,r12,8007acc <_User_extensions_Thread_restart+0x58><== NEVER TAKEN
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
(*the_extension->Callouts.thread_restart)(
8007aa8: 78 0d 08 01 mvhi r13,0x801
8007aac: 39 ad fd c0 ori r13,r13,0xfdc0
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
8007ab0: 29 63 00 1c lw r3,(r11+28)
(*the_extension->Callouts.thread_restart)(
8007ab4: b9 c0 10 00 mv r2,r14
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_restart != NULL )
8007ab8: 44 60 00 03 be r3,r0,8007ac4 <_User_extensions_Thread_restart+0x50>
(*the_extension->Callouts.thread_restart)(
8007abc: 29 a1 00 0c lw r1,(r13+12)
8007ac0: d8 60 00 00 call r3
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
8007ac4: 29 6b 00 00 lw r11,(r11+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8007ac8: 5d 6c ff fa bne r11,r12,8007ab0 <_User_extensions_Thread_restart+0x3c>
(*the_extension->Callouts.thread_restart)(
_Thread_Executing,
the_thread
);
}
}
8007acc: 2b 9d 00 04 lw ra,(sp+4)
8007ad0: 2b 8b 00 14 lw r11,(sp+20)
8007ad4: 2b 8c 00 10 lw r12,(sp+16)
8007ad8: 2b 8d 00 0c lw r13,(sp+12)
8007adc: 2b 8e 00 08 lw r14,(sp+8)
8007ae0: 37 9c 00 14 addi sp,sp,20
8007ae4: c3 a0 00 00 ret
08006a8c <_User_extensions_Thread_start>:
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
8006a8c: 37 9c ff ec addi sp,sp,-20
8006a90: 5b 8b 00 14 sw (sp+20),r11
8006a94: 5b 8c 00 10 sw (sp+16),r12
8006a98: 5b 8d 00 0c sw (sp+12),r13
8006a9c: 5b 8e 00 08 sw (sp+8),r14
8006aa0: 5b 9d 00 04 sw (sp+4),ra
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
8006aa4: 78 02 08 01 mvhi r2,0x801
8006aa8: 38 42 4a 28 ori r2,r2,0x4a28
8006aac: 28 4b 00 00 lw r11,(r2+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8006ab0: 78 0c 08 01 mvhi r12,0x801
8006ab4: 39 8c 4a 2c ori r12,r12,0x4a2c
#include <rtems/score/userext.h>
void _User_extensions_Thread_start (
Thread_Control *the_thread
)
{
8006ab8: b8 20 70 00 mv r14,r1
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8006abc: 45 6c 00 0a be r11,r12,8006ae4 <_User_extensions_Thread_start+0x58><== NEVER TAKEN
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
(*the_extension->Callouts.thread_start)(
8006ac0: 78 0d 08 01 mvhi r13,0x801
8006ac4: 39 ad 4d 78 ori r13,r13,0x4d78
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
8006ac8: 29 63 00 18 lw r3,(r11+24)
(*the_extension->Callouts.thread_start)(
8006acc: b9 c0 10 00 mv r2,r14
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_start != NULL )
8006ad0: 44 60 00 03 be r3,r0,8006adc <_User_extensions_Thread_start+0x50>
(*the_extension->Callouts.thread_start)(
8006ad4: 29 a1 00 0c lw r1,(r13+12)
8006ad8: d8 60 00 00 call r3
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
8006adc: 29 6b 00 00 lw r11,(r11+0)
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_First( &_User_extensions_List );
8006ae0: 5d 6c ff fa bne r11,r12,8006ac8 <_User_extensions_Thread_start+0x3c>
(*the_extension->Callouts.thread_start)(
_Thread_Executing,
the_thread
);
}
}
8006ae4: 2b 9d 00 04 lw ra,(sp+4)
8006ae8: 2b 8b 00 14 lw r11,(sp+20)
8006aec: 2b 8c 00 10 lw r12,(sp+16)
8006af0: 2b 8d 00 0c lw r13,(sp+12)
8006af4: 2b 8e 00 08 lw r14,(sp+8)
8006af8: 37 9c 00 14 addi sp,sp,20
8006afc: c3 a0 00 00 ret
08006b00 <_User_extensions_Thread_switch>:
void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
{
8006b00: 37 9c ff ec addi sp,sp,-20
8006b04: 5b 8b 00 14 sw (sp+20),r11
8006b08: 5b 8c 00 10 sw (sp+16),r12
8006b0c: 5b 8d 00 0c sw (sp+12),r13
8006b10: 5b 8e 00 08 sw (sp+8),r14
8006b14: 5b 9d 00 04 sw (sp+4),ra
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
8006b18: 78 03 08 01 mvhi r3,0x801
8006b1c: 38 63 48 ac ori r3,r3,0x48ac
8006b20: 28 6b 00 00 lw r11,(r3+0)
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
8006b24: 78 0c 08 01 mvhi r12,0x801
8006b28: 39 8c 48 b0 ori r12,r12,0x48b0
void _User_extensions_Thread_switch (
Thread_Control *executing,
Thread_Control *heir
)
{
8006b2c: b8 20 70 00 mv r14,r1
8006b30: b8 40 68 00 mv r13,r2
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
8006b34: 45 6c 00 07 be r11,r12,8006b50 <_User_extensions_Thread_switch+0x50><== NEVER TAKEN
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
8006b38: 29 63 00 08 lw r3,(r11+8)
8006b3c: b9 c0 08 00 mv r1,r14
8006b40: b9 a0 10 00 mv r2,r13
8006b44: d8 60 00 00 call r3
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
!_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ;
the_node = the_node->next ) {
8006b48: 29 6b 00 00 lw r11,(r11+0)
)
{
Chain_Node *the_node;
User_extensions_Switch_control *the_extension_switch;
for ( the_node = _Chain_First( &_User_extensions_Switches_list );
8006b4c: 5d 6c ff fb bne r11,r12,8006b38 <_User_extensions_Thread_switch+0x38>
the_extension_switch = (User_extensions_Switch_control *) the_node;
(*the_extension_switch->thread_switch)( executing, heir );
}
}
8006b50: 2b 9d 00 04 lw ra,(sp+4)
8006b54: 2b 8b 00 14 lw r11,(sp+20)
8006b58: 2b 8c 00 10 lw r12,(sp+16)
8006b5c: 2b 8d 00 0c lw r13,(sp+12)
8006b60: 2b 8e 00 08 lw r14,(sp+8)
8006b64: 37 9c 00 14 addi sp,sp,20
8006b68: c3 a0 00 00 ret
0800924c <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
800924c: 37 9c ff e4 addi sp,sp,-28
8009250: 5b 8b 00 1c sw (sp+28),r11
8009254: 5b 8c 00 18 sw (sp+24),r12
8009258: 5b 8d 00 14 sw (sp+20),r13
800925c: 5b 8e 00 10 sw (sp+16),r14
8009260: 5b 8f 00 0c sw (sp+12),r15
8009264: 5b 90 00 08 sw (sp+8),r16
8009268: 5b 9d 00 04 sw (sp+4),ra
800926c: b8 20 60 00 mv r12,r1
8009270: b8 60 58 00 mv r11,r3
ISR_Level level;
_ISR_Disable( level );
8009274: 90 00 18 00 rcsr r3,IE
8009278: 34 01 ff fe mvi r1,-2
800927c: a0 61 08 00 and r1,r3,r1
8009280: d0 01 00 00 wcsr IE,r1
}
}
_ISR_Enable( level );
}
8009284: 29 81 00 00 lw r1,(r12+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8009288: 35 8e 00 04 addi r14,r12,4
Watchdog_Interval units
)
{
ISR_Level level;
_ISR_Disable( level );
800928c: b8 60 20 00 mv r4,r3
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
8009290: 44 2e 00 04 be r1,r14,80092a0 <_Watchdog_Adjust+0x54>
switch ( direction ) {
8009294: 44 40 00 11 be r2,r0,80092d8 <_Watchdog_Adjust+0x8c>
8009298: 34 03 00 01 mvi r3,1
800929c: 44 43 00 0b be r2,r3,80092c8 <_Watchdog_Adjust+0x7c> <== ALWAYS TAKEN
}
break;
}
}
_ISR_Enable( level );
80092a0: d0 04 00 00 wcsr IE,r4
}
80092a4: 2b 9d 00 04 lw ra,(sp+4)
80092a8: 2b 8b 00 1c lw r11,(sp+28)
80092ac: 2b 8c 00 18 lw r12,(sp+24)
80092b0: 2b 8d 00 14 lw r13,(sp+20)
80092b4: 2b 8e 00 10 lw r14,(sp+16)
80092b8: 2b 8f 00 0c lw r15,(sp+12)
80092bc: 2b 90 00 08 lw r16,(sp+8)
80092c0: 37 9c 00 1c addi sp,sp,28
80092c4: c3 a0 00 00 ret
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
80092c8: 28 22 00 10 lw r2,(r1+16)
80092cc: b4 4b 58 00 add r11,r2,r11
80092d0: 58 2b 00 10 sw (r1+16),r11
break;
80092d4: e3 ff ff f3 bi 80092a0 <_Watchdog_Adjust+0x54>
case WATCHDOG_FORWARD:
while ( units ) {
80092d8: b8 60 20 00 mv r4,r3
80092dc: 45 62 ff f1 be r11,r2,80092a0 <_Watchdog_Adjust+0x54> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
80092e0: 28 2d 00 10 lw r13,(r1+16)
80092e4: 55 ab 00 13 bgu r13,r11,8009330 <_Watchdog_Adjust+0xe4> <== NEVER TAKEN
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
80092e8: 34 10 00 01 mvi r16,1
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
80092ec: 34 0f ff fe mvi r15,-2
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
80092f0: 58 30 00 10 sw (r1+16),r16
_ISR_Enable( level );
80092f4: d0 03 00 00 wcsr IE,r3
_Watchdog_Tickle( header );
80092f8: b9 80 08 00 mv r1,r12
80092fc: f8 00 00 b0 calli 80095bc <_Watchdog_Tickle>
_ISR_Disable( level );
8009300: 90 00 10 00 rcsr r2,IE
8009304: a0 4f 08 00 and r1,r2,r15
8009308: d0 01 00 00 wcsr IE,r1
}
}
_ISR_Enable( level );
}
800930c: 29 84 00 00 lw r4,(r12+0)
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
8009310: c9 6d 58 00 sub r11,r11,r13
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
8009314: b8 40 18 00 mv r3,r2
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
8009318: b8 80 08 00 mv r1,r4
if ( _Chain_Is_empty( header ) )
800931c: 45 c4 00 08 be r14,r4,800933c <_Watchdog_Adjust+0xf0>
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
8009320: 45 60 00 07 be r11,r0,800933c <_Watchdog_Adjust+0xf0> <== NEVER TAKEN
if ( units < _Watchdog_First( header )->delta_interval ) {
8009324: 28 2d 00 10 lw r13,(r1+16)
8009328: 51 6d ff f2 bgeu r11,r13,80092f0 <_Watchdog_Adjust+0xa4>
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
800932c: b8 40 20 00 mv r4,r2
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
8009330: c9 ab 58 00 sub r11,r13,r11
8009334: 58 2b 00 10 sw (r1+16),r11
break;
8009338: e3 ff ff da bi 80092a0 <_Watchdog_Adjust+0x54>
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
800933c: b8 40 20 00 mv r4,r2
8009340: e3 ff ff d8 bi 80092a0 <_Watchdog_Adjust+0x54>
08006b6c <_Watchdog_Insert>:
void _Watchdog_Insert(
Chain_Control *header,
Watchdog_Control *the_watchdog
)
{
8006b6c: 37 9c ff f8 addi sp,sp,-8
8006b70: 5b 8b 00 08 sw (sp+8),r11
8006b74: 5b 8c 00 04 sw (sp+4),r12
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
8006b78: 78 03 08 01 mvhi r3,0x801
8006b7c: 38 63 4d 78 ori r3,r3,0x4d78
8006b80: 28 69 00 08 lw r9,(r3+8)
_ISR_Disable( level );
8006b84: 90 00 30 00 rcsr r6,IE
8006b88: 34 08 ff fe mvi r8,-2
8006b8c: a0 c8 40 00 and r8,r6,r8
8006b90: d0 08 00 00 wcsr IE,r8
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
8006b94: 28 43 00 08 lw r3,(r2+8)
8006b98: 5c 60 00 3f bne r3,r0,8006c94 <_Watchdog_Insert+0x128>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
_Watchdog_Sync_count++;
8006b9c: 78 0c 08 01 mvhi r12,0x801
8006ba0: 39 8c 49 d4 ori r12,r12,0x49d4
8006ba4: 29 83 00 00 lw r3,(r12+0)
8006ba8: 78 07 08 01 mvhi r7,0x801
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
8006bac: 34 04 00 01 mvi r4,1
_Watchdog_Sync_count++;
8006bb0: 34 63 00 01 addi r3,r3,1
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
8006bb4: 58 44 00 08 sw (r2+8),r4
_Watchdog_Sync_count++;
8006bb8: 59 83 00 00 sw (r12+0),r3
8006bbc: 38 e7 49 6c ori r7,r7,0x496c
delta_interval -= after->delta_interval;
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
8006bc0: 34 0a 00 01 mvi r10,1
the_watchdog->state = WATCHDOG_BEING_INSERTED;
_Watchdog_Sync_count++;
restart:
delta_interval = the_watchdog->initial;
8006bc4: 28 44 00 0c lw r4,(r2+12)
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
8006bc8: 28 23 00 00 lw r3,(r1+0)
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
8006bcc: 44 80 00 14 be r4,r0,8006c1c <_Watchdog_Insert+0xb0>
8006bd0: 28 65 00 00 lw r5,(r3+0)
8006bd4: 44 a0 00 12 be r5,r0,8006c1c <_Watchdog_Insert+0xb0>
break;
if ( delta_interval < after->delta_interval ) {
8006bd8: 28 65 00 10 lw r5,(r3+16)
8006bdc: 54 a4 00 0e bgu r5,r4,8006c14 <_Watchdog_Insert+0xa8>
break;
}
delta_interval -= after->delta_interval;
_ISR_Flash( level );
8006be0: d0 06 00 00 wcsr IE,r6
8006be4: d0 08 00 00 wcsr IE,r8
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
8006be8: 28 4b 00 08 lw r11,(r2+8)
8006bec: 5d 6a 00 19 bne r11,r10,8006c50 <_Watchdog_Insert+0xe4>
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
8006bf0: 28 eb 00 00 lw r11,(r7+0)
8006bf4: 55 69 00 2d bgu r11,r9,8006ca8 <_Watchdog_Insert+0x13c>
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
8006bf8: c8 85 20 00 sub r4,r4,r5
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
8006bfc: 28 63 00 00 lw r3,(r3+0)
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
8006c00: 44 80 00 07 be r4,r0,8006c1c <_Watchdog_Insert+0xb0>
8006c04: 28 65 00 00 lw r5,(r3+0)
8006c08: 44 a0 00 05 be r5,r0,8006c1c <_Watchdog_Insert+0xb0>
break;
if ( delta_interval < after->delta_interval ) {
8006c0c: 28 65 00 10 lw r5,(r3+16)
8006c10: 50 85 00 19 bgeu r4,r5,8006c74 <_Watchdog_Insert+0x108>
after->delta_interval -= delta_interval;
8006c14: c8 a4 28 00 sub r5,r5,r4
8006c18: 58 65 00 10 sw (r3+16),r5
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
8006c1c: 28 63 00 04 lw r3,(r3+4)
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
8006c20: 78 01 08 01 mvhi r1,0x801
8006c24: 38 21 49 d8 ori r1,r1,0x49d8
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
8006c28: 28 65 00 00 lw r5,(r3+0)
8006c2c: 28 28 00 00 lw r8,(r1+0)
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
8006c30: 34 01 00 02 mvi r1,2
8006c34: 58 41 00 08 sw (r2+8),r1
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
8006c38: 58 44 00 10 sw (r2+16),r4
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
8006c3c: 58 43 00 04 sw (r2+4),r3
before_node = after_node->next;
after_node->next = the_node;
8006c40: 58 62 00 00 sw (r3+0),r2
the_node->next = before_node;
before_node->previous = the_node;
8006c44: 58 a2 00 04 sw (r5+4),r2
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
8006c48: 58 45 00 00 sw (r2+0),r5
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
8006c4c: 58 48 00 14 sw (r2+20),r8
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
8006c50: 58 e9 00 00 sw (r7+0),r9
_Watchdog_Sync_count--;
8006c54: 29 81 00 00 lw r1,(r12+0)
8006c58: 34 21 ff ff addi r1,r1,-1
8006c5c: 59 81 00 00 sw (r12+0),r1
_ISR_Enable( level );
8006c60: d0 06 00 00 wcsr IE,r6
}
8006c64: 2b 8b 00 08 lw r11,(sp+8)
8006c68: 2b 8c 00 04 lw r12,(sp+4)
8006c6c: 37 9c 00 08 addi sp,sp,8
8006c70: c3 a0 00 00 ret
break;
}
delta_interval -= after->delta_interval;
_ISR_Flash( level );
8006c74: d0 06 00 00 wcsr IE,r6
8006c78: d0 08 00 00 wcsr IE,r8
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
8006c7c: 28 4b 00 08 lw r11,(r2+8)
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
8006c80: c8 85 20 00 sub r4,r4,r5
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
8006c84: 5d 6a ff f3 bne r11,r10,8006c50 <_Watchdog_Insert+0xe4> <== NEVER TAKEN
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
8006c88: 28 e5 00 00 lw r5,(r7+0)
8006c8c: 54 a9 00 07 bgu r5,r9,8006ca8 <_Watchdog_Insert+0x13c> <== NEVER TAKEN
8006c90: e3 ff ff db bi 8006bfc <_Watchdog_Insert+0x90>
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
8006c94: d0 06 00 00 wcsr IE,r6
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
8006c98: 2b 8b 00 08 lw r11,(sp+8)
8006c9c: 2b 8c 00 04 lw r12,(sp+4)
8006ca0: 37 9c 00 08 addi sp,sp,8
8006ca4: c3 a0 00 00 ret
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
_Watchdog_Sync_level = insert_isr_nest_level;
8006ca8: 58 e9 00 00 sw (r7+0),r9
goto restart;
8006cac: e3 ff ff c6 bi 8006bc4 <_Watchdog_Insert+0x58>
08006d10 <_Watchdog_Remove>:
{
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
8006d10: 90 00 20 00 rcsr r4,IE
8006d14: 34 02 ff fe mvi r2,-2
8006d18: a0 82 10 00 and r2,r4,r2
8006d1c: d0 02 00 00 wcsr IE,r2
previous_state = the_watchdog->state;
8006d20: 28 22 00 08 lw r2,(r1+8)
switch ( previous_state ) {
8006d24: 34 03 00 01 mvi r3,1
8006d28: 44 43 00 27 be r2,r3,8006dc4 <_Watchdog_Remove+0xb4>
8006d2c: 5c 40 00 08 bne r2,r0,8006d4c <_Watchdog_Remove+0x3c>
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8006d30: 78 03 08 01 mvhi r3,0x801
8006d34: 38 63 49 d8 ori r3,r3,0x49d8
8006d38: 28 63 00 00 lw r3,(r3+0)
8006d3c: 58 23 00 18 sw (r1+24),r3
_ISR_Enable( level );
8006d40: d0 04 00 00 wcsr IE,r4
return( previous_state );
}
8006d44: b8 40 08 00 mv r1,r2
8006d48: c3 a0 00 00 ret
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
previous_state = the_watchdog->state;
switch ( previous_state ) {
8006d4c: 34 03 00 03 mvi r3,3
8006d50: 54 43 ff f8 bgu r2,r3,8006d30 <_Watchdog_Remove+0x20> <== NEVER TAKEN
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
8006d54: 28 23 00 00 lw r3,(r1+0)
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
8006d58: 58 20 00 08 sw (r1+8),r0
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
8006d5c: 28 65 00 00 lw r5,(r3+0)
8006d60: 44 a0 00 05 be r5,r0,8006d74 <_Watchdog_Remove+0x64>
next_watchdog->delta_interval += the_watchdog->delta_interval;
8006d64: 28 66 00 10 lw r6,(r3+16)
8006d68: 28 25 00 10 lw r5,(r1+16)
8006d6c: b4 c5 28 00 add r5,r6,r5
8006d70: 58 65 00 10 sw (r3+16),r5
if ( _Watchdog_Sync_count )
8006d74: 78 05 08 01 mvhi r5,0x801
8006d78: 38 a5 49 d4 ori r5,r5,0x49d4
8006d7c: 28 a5 00 00 lw r5,(r5+0)
8006d80: 44 a0 00 07 be r5,r0,8006d9c <_Watchdog_Remove+0x8c>
_Watchdog_Sync_level = _ISR_Nest_level;
8006d84: 78 05 08 01 mvhi r5,0x801
8006d88: 38 a5 4d 78 ori r5,r5,0x4d78
8006d8c: 28 a6 00 08 lw r6,(r5+8)
8006d90: 78 05 08 01 mvhi r5,0x801
8006d94: 38 a5 49 6c ori r5,r5,0x496c
8006d98: 58 a6 00 00 sw (r5+0),r6
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
8006d9c: 28 25 00 04 lw r5,(r1+4)
next->previous = previous;
8006da0: 58 65 00 04 sw (r3+4),r5
previous->next = next;
8006da4: 58 a3 00 00 sw (r5+0),r3
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8006da8: 78 03 08 01 mvhi r3,0x801
8006dac: 38 63 49 d8 ori r3,r3,0x49d8
8006db0: 28 63 00 00 lw r3,(r3+0)
8006db4: 58 23 00 18 sw (r1+24),r3
_ISR_Enable( level );
8006db8: d0 04 00 00 wcsr IE,r4
return( previous_state );
}
8006dbc: b8 40 08 00 mv r1,r2
8006dc0: c3 a0 00 00 ret
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8006dc4: 78 03 08 01 mvhi r3,0x801
8006dc8: 38 63 49 d8 ori r3,r3,0x49d8
8006dcc: 28 63 00 00 lw r3,(r3+0)
/*
* It is not actually on the chain so just change the state and
* the Insert operation we interrupted will be aborted.
*/
the_watchdog->state = WATCHDOG_INACTIVE;
8006dd0: 58 20 00 08 sw (r1+8),r0
_Watchdog_Sync_level = _ISR_Nest_level;
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8006dd4: 58 23 00 18 sw (r1+24),r3
_ISR_Enable( level );
8006dd8: d0 04 00 00 wcsr IE,r4
return( previous_state );
}
8006ddc: b8 40 08 00 mv r1,r2
8006de0: c3 a0 00 00 ret
080089c0 <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
80089c0: 37 9c ff ec addi sp,sp,-20
80089c4: 5b 8b 00 14 sw (sp+20),r11
80089c8: 5b 8c 00 10 sw (sp+16),r12
80089cc: 5b 8d 00 0c sw (sp+12),r13
80089d0: 5b 8e 00 08 sw (sp+8),r14
80089d4: 5b 9d 00 04 sw (sp+4),ra
80089d8: b8 20 70 00 mv r14,r1
80089dc: b8 40 60 00 mv r12,r2
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
80089e0: 90 00 68 00 rcsr r13,IE
80089e4: 34 01 ff fe mvi r1,-2
80089e8: a1 a1 08 00 and r1,r13,r1
80089ec: d0 01 00 00 wcsr IE,r1
printk( "Watchdog Chain: %s %p\n", name, header );
80089f0: 78 01 08 01 mvhi r1,0x801
80089f4: b9 80 18 00 mv r3,r12
80089f8: 38 21 f0 b0 ori r1,r1,0xf0b0
80089fc: b9 c0 10 00 mv r2,r14
8008a00: fb ff ea d8 calli 8003560 <printk>
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
8008a04: 29 8b 00 00 lw r11,(r12+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8008a08: 35 8c 00 04 addi r12,r12,4
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
8008a0c: 45 6c 00 12 be r11,r12,8008a54 <_Watchdog_Report_chain+0x94>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
8008a10: b9 60 10 00 mv r2,r11
8008a14: 34 01 00 00 mvi r1,0
8008a18: f8 00 00 13 calli 8008a64 <_Watchdog_Report>
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
node != _Chain_Tail(header) ;
node = node->next )
8008a1c: 29 6b 00 00 lw r11,(r11+0)
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
8008a20: 5d 6c ff fc bne r11,r12,8008a10 <_Watchdog_Report_chain+0x50><== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
8008a24: 78 01 08 01 mvhi r1,0x801
8008a28: 38 21 f0 c8 ori r1,r1,0xf0c8
8008a2c: b9 c0 10 00 mv r2,r14
8008a30: fb ff ea cc calli 8003560 <printk>
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
8008a34: d0 0d 00 00 wcsr IE,r13
}
8008a38: 2b 9d 00 04 lw ra,(sp+4)
8008a3c: 2b 8b 00 14 lw r11,(sp+20)
8008a40: 2b 8c 00 10 lw r12,(sp+16)
8008a44: 2b 8d 00 0c lw r13,(sp+12)
8008a48: 2b 8e 00 08 lw r14,(sp+8)
8008a4c: 37 9c 00 14 addi sp,sp,20
8008a50: c3 a0 00 00 ret
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
8008a54: 78 01 08 01 mvhi r1,0x801
8008a58: 38 21 f0 d8 ori r1,r1,0xf0d8
8008a5c: fb ff ea c1 calli 8003560 <printk>
8008a60: e3 ff ff f5 bi 8008a34 <_Watchdog_Report_chain+0x74>
08006de4 <_Watchdog_Tickle>:
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
8006de4: 37 9c ff e4 addi sp,sp,-28
8006de8: 5b 8b 00 1c sw (sp+28),r11
8006dec: 5b 8c 00 18 sw (sp+24),r12
8006df0: 5b 8d 00 14 sw (sp+20),r13
8006df4: 5b 8e 00 10 sw (sp+16),r14
8006df8: 5b 8f 00 0c sw (sp+12),r15
8006dfc: 5b 90 00 08 sw (sp+8),r16
8006e00: 5b 9d 00 04 sw (sp+4),ra
8006e04: b8 20 60 00 mv r12,r1
* See the comment in watchdoginsert.c and watchdogadjust.c
* about why it's safe not to declare header a pointer to
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
8006e08: 90 00 68 00 rcsr r13,IE
8006e0c: 34 01 ff fe mvi r1,-2
8006e10: a1 a1 08 00 and r1,r13,r1
8006e14: d0 01 00 00 wcsr IE,r1
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
8006e18: 29 8b 00 00 lw r11,(r12+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8006e1c: 35 8e 00 04 addi r14,r12,4
* See the comment in watchdoginsert.c and watchdogadjust.c
* about why it's safe not to declare header a pointer to
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
8006e20: b9 a0 10 00 mv r2,r13
if ( _Chain_Is_empty( header ) )
8006e24: 45 6e 00 1e be r11,r14,8006e9c <_Watchdog_Tickle+0xb8>
* to be inserted has already had its delta_interval adjusted to 0, and
* so is added to the head of the chain with a delta_interval of 0.
*
* Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
*/
if (the_watchdog->delta_interval != 0) {
8006e28: 29 61 00 10 lw r1,(r11+16)
8006e2c: 5c 20 00 26 bne r1,r0,8006ec4 <_Watchdog_Tickle+0xe0>
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
_ISR_Enable( level );
switch( watchdog_state ) {
8006e30: 34 10 00 02 mvi r16,2
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
8006e34: 34 0f ff fe mvi r15,-2
8006e38: e0 00 00 0a bi 8006e60 <_Watchdog_Tickle+0x7c>
8006e3c: 90 00 10 00 rcsr r2,IE <== NOT EXECUTED
8006e40: a0 4f 08 00 and r1,r2,r15 <== NOT EXECUTED
8006e44: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
8006e48: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
8006e4c: b8 40 68 00 mv r13,r2 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
8006e50: b8 20 58 00 mv r11,r1 <== NOT EXECUTED
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
8006e54: 44 2e 00 12 be r1,r14,8006e9c <_Watchdog_Tickle+0xb8> <== NOT EXECUTED
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
8006e58: 28 21 00 10 lw r1,(r1+16)
8006e5c: 5c 20 00 10 bne r1,r0,8006e9c <_Watchdog_Tickle+0xb8>
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
8006e60: b9 60 08 00 mv r1,r11
8006e64: fb ff ff ab calli 8006d10 <_Watchdog_Remove>
_ISR_Enable( level );
8006e68: d0 0d 00 00 wcsr IE,r13
switch( watchdog_state ) {
8006e6c: 5c 30 ff f4 bne r1,r16,8006e3c <_Watchdog_Tickle+0x58> <== NEVER TAKEN
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
8006e70: 29 63 00 1c lw r3,(r11+28)
8006e74: 29 61 00 20 lw r1,(r11+32)
8006e78: 29 62 00 24 lw r2,(r11+36)
8006e7c: d8 60 00 00 call r3
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
8006e80: 90 00 10 00 rcsr r2,IE
8006e84: a0 4f 08 00 and r1,r2,r15
8006e88: d0 01 00 00 wcsr IE,r1
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
8006e8c: 29 81 00 00 lw r1,(r12+0)
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
8006e90: b8 40 68 00 mv r13,r2
8006e94: b8 20 58 00 mv r11,r1
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
8006e98: 5c 2e ff f0 bne r1,r14,8006e58 <_Watchdog_Tickle+0x74>
leave:
_ISR_Enable(level);
8006e9c: d0 02 00 00 wcsr IE,r2
}
8006ea0: 2b 9d 00 04 lw ra,(sp+4)
8006ea4: 2b 8b 00 1c lw r11,(sp+28)
8006ea8: 2b 8c 00 18 lw r12,(sp+24)
8006eac: 2b 8d 00 14 lw r13,(sp+20)
8006eb0: 2b 8e 00 10 lw r14,(sp+16)
8006eb4: 2b 8f 00 0c lw r15,(sp+12)
8006eb8: 2b 90 00 08 lw r16,(sp+8)
8006ebc: 37 9c 00 1c addi sp,sp,28
8006ec0: c3 a0 00 00 ret
* so is added to the head of the chain with a delta_interval of 0.
*
* Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
*/
if (the_watchdog->delta_interval != 0) {
the_watchdog->delta_interval--;
8006ec4: 34 21 ff ff addi r1,r1,-1
8006ec8: 59 61 00 10 sw (r11+16),r1
if ( the_watchdog->delta_interval != 0 )
8006ecc: 44 20 ff d9 be r1,r0,8006e30 <_Watchdog_Tickle+0x4c>
8006ed0: e3 ff ff f3 bi 8006e9c <_Watchdog_Tickle+0xb8>
080062f0 <_rename_r>:
int _rename_r(
struct _reent *ptr __attribute__((unused)),
const char *old,
const char *new
)
{
80062f0: 37 9c ff a0 addi sp,sp,-96
80062f4: 5b 8b 00 1c sw (sp+28),r11
80062f8: 5b 8c 00 18 sw (sp+24),r12
80062fc: 5b 8d 00 14 sw (sp+20),r13
8006300: 5b 8e 00 10 sw (sp+16),r14
8006304: 5b 8f 00 0c sw (sp+12),r15
8006308: 5b 90 00 08 sw (sp+8),r16
800630c: 5b 9d 00 04 sw (sp+4),ra
/*
* Get the parent node of the old path to be renamed. Find the parent path.
*/
old_parent_pathlen = rtems_filesystem_dirname ( old );
8006310: b8 40 08 00 mv r1,r2
int _rename_r(
struct _reent *ptr __attribute__((unused)),
const char *old,
const char *new
)
{
8006314: b8 40 60 00 mv r12,r2
8006318: b8 60 70 00 mv r14,r3
/*
* Get the parent node of the old path to be renamed. Find the parent path.
*/
old_parent_pathlen = rtems_filesystem_dirname ( old );
800631c: fb ff f9 13 calli 8004768 <rtems_filesystem_dirname>
if ( old_parent_pathlen == 0 )
8006320: 5c 20 00 62 bne r1,r0,80064a8 <_rename_r+0x1b8>
rtems_filesystem_get_start_loc( old, &i, &old_parent_loc );
8006324: 37 8d 00 34 addi r13,sp,52
8006328: b9 80 08 00 mv r1,r12
800632c: 37 82 00 60 addi r2,sp,96
8006330: b9 a0 18 00 mv r3,r13
8006334: f8 00 01 09 calli 8006758 <rtems_filesystem_get_start_loc>
8006338: 34 0b 00 00 mvi r11,0
rtems_filesystem_location_info_t old_parent_loc;
rtems_filesystem_location_info_t new_parent_loc;
int i;
int result;
const char *name;
bool free_old_parentloc = false;
800633c: 34 10 00 00 mvi r16,0
/*
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
8006340: 2b 82 00 34 lw r2,(sp+52)
name = old + old_parent_pathlen;
8006344: b5 8b 58 00 add r11,r12,r11
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8006348: b9 60 08 00 mv r1,r11
/*
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
800634c: 5b 82 00 48 sw (sp+72),r2
8006350: 2b 82 00 38 lw r2,(sp+56)
name = old + old_parent_pathlen;
8006354: 5b 8b 00 5c sw (sp+92),r11
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
8006358: 37 8c 00 48 addi r12,sp,72
/*
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
800635c: 5b 82 00 4c sw (sp+76),r2
8006360: 2b 82 00 3c lw r2,(sp+60)
8006364: 5b 82 00 50 sw (sp+80),r2
8006368: 2b 82 00 40 lw r2,(sp+64)
800636c: 5b 82 00 54 sw (sp+84),r2
8006370: 2b 82 00 44 lw r2,(sp+68)
8006374: 5b 82 00 58 sw (sp+88),r2
name = old + old_parent_pathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8006378: f8 00 39 d5 calli 8014acc <strlen>
800637c: b8 20 10 00 mv r2,r1
8006380: b9 60 08 00 mv r1,r11
8006384: fb ff f9 0e calli 80047bc <rtems_filesystem_prefix_separators>
8006388: b5 61 58 00 add r11,r11,r1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
800638c: b9 60 08 00 mv r1,r11
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
name = old + old_parent_pathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8006390: 5b 8b 00 5c sw (sp+92),r11
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
8006394: f8 00 39 ce calli 8014acc <strlen>
8006398: b8 20 10 00 mv r2,r1
800639c: 34 03 00 00 mvi r3,0
80063a0: b9 60 08 00 mv r1,r11
80063a4: b9 80 20 00 mv r4,r12
80063a8: 34 05 00 00 mvi r5,0
80063ac: fb ff f8 b1 calli 8004670 <rtems_filesystem_evaluate_relative_path>
80063b0: b8 20 78 00 mv r15,r1
0, &old_loc, false );
if ( result != 0 ) {
80063b4: 5c 20 00 38 bne r1,r0,8006494 <_rename_r+0x1a4>
/*
* Get the parent of the new node we are renaming to.
*/
rtems_filesystem_get_start_loc( new, &i, &new_parent_loc );
80063b8: 37 8b 00 20 addi r11,sp,32
80063bc: b9 c0 08 00 mv r1,r14
80063c0: 37 82 00 60 addi r2,sp,96
80063c4: b9 60 18 00 mv r3,r11
80063c8: f8 00 00 e4 calli 8006758 <rtems_filesystem_get_start_loc>
result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name );
80063cc: 2b 81 00 2c lw r1,(sp+44)
80063d0: b9 60 10 00 mv r2,r11
80063d4: 37 83 00 5c addi r3,sp,92
80063d8: 28 24 00 04 lw r4,(r1+4)
80063dc: 2b 81 00 60 lw r1,(sp+96)
80063e0: b5 c1 08 00 add r1,r14,r1
80063e4: d8 80 00 00 call r4
80063e8: b8 20 70 00 mv r14,r1
if ( result != 0 ) {
80063ec: 5c 2f 00 3b bne r1,r15,80064d8 <_rename_r+0x1e8>
/*
* Check to see if the caller is trying to rename across file system
* boundaries.
*/
if ( old_parent_loc.mt_entry != new_parent_loc.mt_entry ) {
80063f0: 2b 81 00 30 lw r1,(sp+48)
80063f4: 2b 82 00 44 lw r2,(sp+68)
80063f8: 5c 41 00 1b bne r2,r1,8006464 <_rename_r+0x174>
rtems_filesystem_freenode( &old_parent_loc );
rtems_filesystem_freenode( &old_loc );
rtems_set_errno_and_return_minus_one( EXDEV );
}
result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name );
80063fc: 2b 82 00 2c lw r2,(sp+44)
8006400: 2b 84 00 5c lw r4,(sp+92)
8006404: b9 a0 08 00 mv r1,r13
8006408: 28 45 00 40 lw r5,(r2+64)
800640c: b9 60 18 00 mv r3,r11
8006410: b9 80 10 00 mv r2,r12
8006414: d8 a0 00 00 call r5
8006418: b8 20 78 00 mv r15,r1
rtems_filesystem_freenode( &new_parent_loc );
800641c: b9 60 08 00 mv r1,r11
8006420: fb ff f9 9c calli 8004a90 <rtems_filesystem_freenode>
if ( free_old_parentloc )
8006424: 5e 0e 00 0d bne r16,r14,8006458 <_rename_r+0x168>
rtems_filesystem_freenode( &old_parent_loc );
rtems_filesystem_freenode( &old_loc );
8006428: b9 80 08 00 mv r1,r12
800642c: fb ff f9 99 calli 8004a90 <rtems_filesystem_freenode>
return result;
}
8006430: b9 e0 08 00 mv r1,r15
8006434: 2b 9d 00 04 lw ra,(sp+4)
8006438: 2b 8b 00 1c lw r11,(sp+28)
800643c: 2b 8c 00 18 lw r12,(sp+24)
8006440: 2b 8d 00 14 lw r13,(sp+20)
8006444: 2b 8e 00 10 lw r14,(sp+16)
8006448: 2b 8f 00 0c lw r15,(sp+12)
800644c: 2b 90 00 08 lw r16,(sp+8)
8006450: 37 9c 00 60 addi sp,sp,96
8006454: c3 a0 00 00 ret
result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name );
rtems_filesystem_freenode( &new_parent_loc );
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
8006458: b9 a0 08 00 mv r1,r13
800645c: fb ff f9 8d calli 8004a90 <rtems_filesystem_freenode>
8006460: e3 ff ff f2 bi 8006428 <_rename_r+0x138>
* Check to see if the caller is trying to rename across file system
* boundaries.
*/
if ( old_parent_loc.mt_entry != new_parent_loc.mt_entry ) {
rtems_filesystem_freenode( &new_parent_loc );
8006464: b9 60 08 00 mv r1,r11
8006468: fb ff f9 8a calli 8004a90 <rtems_filesystem_freenode>
if ( free_old_parentloc )
800646c: 46 0e 00 03 be r16,r14,8006478 <_rename_r+0x188>
rtems_filesystem_freenode( &old_parent_loc );
8006470: b9 a0 08 00 mv r1,r13
8006474: fb ff f9 87 calli 8004a90 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &old_loc );
8006478: b9 80 08 00 mv r1,r12
800647c: fb ff f9 85 calli 8004a90 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EXDEV );
8006480: f8 00 2b ad calli 8011334 <__errno>
8006484: 34 02 00 12 mvi r2,18
8006488: 58 22 00 00 sw (r1+0),r2
800648c: 34 0f ff ff mvi r15,-1
8006490: e3 ff ff e8 bi 8006430 <_rename_r+0x140>
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &old_loc, false );
if ( result != 0 ) {
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
return -1;
8006494: 34 0f ff ff mvi r15,-1
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &old_loc, false );
if ( result != 0 ) {
if ( free_old_parentloc )
8006498: 46 00 ff e6 be r16,r0,8006430 <_rename_r+0x140> <== NEVER TAKEN
rtems_filesystem_freenode( &old_parent_loc );
800649c: b9 a0 08 00 mv r1,r13
80064a0: fb ff f9 7c calli 8004a90 <rtems_filesystem_freenode>
80064a4: e3 ff ff e3 bi 8006430 <_rename_r+0x140>
old_parent_pathlen = rtems_filesystem_dirname ( old );
if ( old_parent_pathlen == 0 )
rtems_filesystem_get_start_loc( old, &i, &old_parent_loc );
else {
result = rtems_filesystem_evaluate_path( old, old_parent_pathlen,
80064a8: b8 20 58 00 mv r11,r1
80064ac: 37 8d 00 34 addi r13,sp,52
80064b0: b9 80 08 00 mv r1,r12
80064b4: b9 60 10 00 mv r2,r11
80064b8: 34 03 00 02 mvi r3,2
80064bc: b9 a0 20 00 mv r4,r13
80064c0: 34 05 00 00 mvi r5,0
80064c4: fb ff f8 8e calli 80046fc <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&old_parent_loc,
false );
if ( result != 0 )
return -1;
80064c8: 34 0f ff ff mvi r15,-1
else {
result = rtems_filesystem_evaluate_path( old, old_parent_pathlen,
RTEMS_LIBIO_PERMS_WRITE,
&old_parent_loc,
false );
if ( result != 0 )
80064cc: 5c 20 ff d9 bne r1,r0,8006430 <_rename_r+0x140> <== NEVER TAKEN
return -1;
free_old_parentloc = true;
80064d0: 34 10 00 01 mvi r16,1
80064d4: e3 ff ff 9b bi 8006340 <_rename_r+0x50>
rtems_filesystem_get_start_loc( new, &i, &new_parent_loc );
result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name );
if ( result != 0 ) {
rtems_filesystem_freenode( &new_parent_loc );
80064d8: b9 60 08 00 mv r1,r11
80064dc: fb ff f9 6d calli 8004a90 <rtems_filesystem_freenode>
if ( free_old_parentloc )
80064e0: 46 00 00 03 be r16,r0,80064ec <_rename_r+0x1fc> <== NEVER TAKEN
rtems_filesystem_freenode( &old_parent_loc );
80064e4: b9 a0 08 00 mv r1,r13
80064e8: fb ff f9 6a calli 8004a90 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &old_loc );
80064ec: b9 80 08 00 mv r1,r12
80064f0: fb ff f9 68 calli 8004a90 <rtems_filesystem_freenode>
return -1;
80064f4: 34 0f ff ff mvi r15,-1
80064f8: e3 ff ff ce bi 8006430 <_rename_r+0x140>
080032dc <adjtime>:
int adjtime(
struct timeval *delta,
struct timeval *olddelta
)
{
80032dc: 37 9c ff e8 addi sp,sp,-24
80032e0: 5b 8b 00 10 sw (sp+16),r11
80032e4: 5b 8c 00 0c sw (sp+12),r12
80032e8: 5b 8d 00 08 sw (sp+8),r13
80032ec: 5b 9d 00 04 sw (sp+4),ra
80032f0: b8 20 58 00 mv r11,r1
80032f4: b8 40 60 00 mv r12,r2
long adjustment;
/*
* Simple validations
*/
if ( !delta )
80032f8: 44 20 00 06 be r1,r0,8003310 <adjtime+0x34>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
80032fc: 78 03 08 01 mvhi r3,0x801
8003300: 38 63 e0 f4 ori r3,r3,0xe0f4
8003304: 28 22 00 04 lw r2,(r1+4)
8003308: 28 61 00 00 lw r1,(r3+0)
800330c: 50 22 00 0b bgeu r1,r2,8003338 <adjtime+0x5c>
rtems_set_errno_and_return_minus_one( EINVAL );
8003310: f8 00 2a c9 calli 800de34 <__errno>
8003314: 34 02 00 16 mvi r2,22
8003318: 58 22 00 00 sw (r1+0),r2
800331c: 34 01 ff ff mvi r1,-1
/* set the user's output */
if ( olddelta )
*olddelta = *delta;
return 0;
}
8003320: 2b 9d 00 04 lw ra,(sp+4)
8003324: 2b 8b 00 10 lw r11,(sp+16)
8003328: 2b 8c 00 0c lw r12,(sp+12)
800332c: 2b 8d 00 08 lw r13,(sp+8)
8003330: 37 9c 00 18 addi sp,sp,24
8003334: c3 a0 00 00 ret
rtems_set_errno_and_return_minus_one( EINVAL );
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( olddelta ) {
8003338: 45 80 00 04 be r12,r0,8003348 <adjtime+0x6c>
olddelta->tv_sec = 0;
olddelta->tv_usec = 0;
800333c: 59 80 00 04 sw (r12+4),r0
8003340: 29 62 00 04 lw r2,(r11+4)
if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( olddelta ) {
olddelta->tv_sec = 0;
8003344: 59 80 00 00 sw (r12+0),r0
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
8003348: 29 63 00 00 lw r3,(r11+0)
adjustment += delta->tv_usec;
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
800334c: 78 01 08 02 mvhi r1,0x802
8003350: 38 21 00 c4 ori r1,r1,0xc4
olddelta->tv_sec = 0;
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
8003354: b4 63 20 00 add r4,r3,r3
8003358: b4 84 20 00 add r4,r4,r4
800335c: b4 84 20 00 add r4,r4,r4
8003360: b4 84 28 00 add r5,r4,r4
8003364: b4 a5 28 00 add r5,r5,r5
8003368: b4 a5 28 00 add r5,r5,r5
800336c: b4 a5 28 00 add r5,r5,r5
8003370: b4 a5 28 00 add r5,r5,r5
8003374: c8 a4 28 00 sub r5,r5,r4
8003378: b4 a5 20 00 add r4,r5,r5
800337c: b4 84 20 00 add r4,r4,r4
8003380: b4 84 20 00 add r4,r4,r4
8003384: b4 84 20 00 add r4,r4,r4
8003388: b4 84 20 00 add r4,r4,r4
800338c: b4 84 20 00 add r4,r4,r4
8003390: c8 85 20 00 sub r4,r4,r5
8003394: b4 83 18 00 add r3,r4,r3
8003398: b4 63 18 00 add r3,r3,r3
800339c: b4 63 18 00 add r3,r3,r3
80033a0: b4 63 18 00 add r3,r3,r3
80033a4: b4 63 18 00 add r3,r3,r3
80033a8: b4 63 18 00 add r3,r3,r3
adjustment += delta->tv_usec;
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
80033ac: 28 24 00 0c lw r4,(r1+12)
olddelta->tv_sec = 0;
olddelta->tv_usec = 0;
}
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
80033b0: b4 63 18 00 add r3,r3,r3
adjustment += delta->tv_usec;
80033b4: b4 43 18 00 add r3,r2,r3
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
return 0;
80033b8: 34 01 00 00 mvi r1,0
/* convert delta to microseconds */
adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND);
adjustment += delta->tv_usec;
/* too small to account for */
if ( adjustment < rtems_configuration_get_microseconds_per_tick() )
80033bc: 54 83 ff d9 bgu r4,r3,8003320 <adjtime+0x44>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80033c0: 78 01 08 02 mvhi r1,0x802
80033c4: 38 21 09 90 ori r1,r1,0x990
80033c8: 28 22 00 00 lw r2,(r1+0)
80033cc: 34 42 00 01 addi r2,r2,1
80033d0: 58 22 00 00 sw (r1+0),r2
* This prevents context switches while we are adjusting the TOD
*/
_Thread_Disable_dispatch();
_TOD_Get( &ts );
80033d4: 37 8d 00 14 addi r13,sp,20
80033d8: b9 a0 08 00 mv r1,r13
80033dc: f8 00 05 84 calli 80049ec <_TOD_Get>
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
80033e0: 29 63 00 04 lw r3,(r11+4)
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
80033e4: 78 04 08 01 mvhi r4,0x801
80033e8: 38 84 e2 70 ori r4,r4,0xe270
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
80033ec: b4 63 18 00 add r3,r3,r3
80033f0: b4 63 18 00 add r3,r3,r3
80033f4: b4 63 18 00 add r3,r3,r3
80033f8: b4 63 10 00 add r2,r3,r3
80033fc: b4 42 10 00 add r2,r2,r2
8003400: b4 62 18 00 add r3,r3,r2
8003404: b4 63 10 00 add r2,r3,r3
8003408: b4 42 10 00 add r2,r2,r2
800340c: b4 62 18 00 add r3,r3,r2
8003410: b4 63 10 00 add r2,r3,r3
8003414: b4 42 10 00 add r2,r2,r2
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
8003418: 29 61 00 00 lw r1,(r11+0)
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
800341c: b4 62 18 00 add r3,r3,r2
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
8003420: 28 82 00 00 lw r2,(r4+0)
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
8003424: 2b 84 00 14 lw r4,(sp+20)
8003428: b4 81 20 00 add r4,r4,r1
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
800342c: 2b 81 00 18 lw r1,(sp+24)
_Thread_Disable_dispatch();
_TOD_Get( &ts );
ts.tv_sec += delta->tv_sec;
8003430: 5b 84 00 14 sw (sp+20),r4
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
8003434: b4 61 18 00 add r3,r3,r1
8003438: 5b 83 00 18 sw (sp+24),r3
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
800343c: 50 43 00 09 bgeu r2,r3,8003460 <adjtime+0x184>
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
8003440: 78 01 08 01 mvhi r1,0x801
8003444: 38 21 e2 74 ori r1,r1,0xe274
8003448: 28 25 00 00 lw r5,(r1+0)
800344c: b4 65 18 00 add r3,r3,r5
* At one point there was a static variable named adjustment
* used by this implementation. I don't see any reason for it
* to be here based upon the GNU/Linux documentation.
*/
int adjtime(
8003450: 34 84 00 01 addi r4,r4,1
ts.tv_sec += delta->tv_sec;
ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND;
/* if adjustment is too much positive */
while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
8003454: 54 62 ff fe bgu r3,r2,800344c <adjtime+0x170> <== NEVER TAKEN
8003458: 5b 83 00 18 sw (sp+24),r3
800345c: 5b 84 00 14 sw (sp+20),r4
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
8003460: 78 04 08 01 mvhi r4,0x801
8003464: 38 84 e2 74 ori r4,r4,0xe274
8003468: 28 82 00 00 lw r2,(r4+0)
800346c: 54 62 00 0a bgu r3,r2,8003494 <adjtime+0x1b8> <== NEVER TAKEN
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
8003470: 78 01 08 01 mvhi r1,0x801
8003474: 38 21 e0 f0 ori r1,r1,0xe0f0
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
8003478: 2b 84 00 14 lw r4,(sp+20)
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
800347c: 28 25 00 00 lw r5,(r1+0)
8003480: b4 65 18 00 add r3,r3,r5
* At one point there was a static variable named adjustment
* used by this implementation. I don't see any reason for it
* to be here based upon the GNU/Linux documentation.
*/
int adjtime(
8003484: 34 84 ff ff addi r4,r4,-1
ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec++;
}
/* if adjustment is too much negative */
while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) {
8003488: 50 43 ff fe bgeu r2,r3,8003480 <adjtime+0x1a4>
800348c: 5b 83 00 18 sw (sp+24),r3
8003490: 5b 84 00 14 sw (sp+20),r4
ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND;
ts.tv_sec--;
}
_TOD_Set( &ts );
8003494: b9 a0 08 00 mv r1,r13
8003498: f8 00 05 89 calli 8004abc <_TOD_Set>
_Thread_Enable_dispatch();
800349c: f8 00 0b d4 calli 80063ec <_Thread_Enable_dispatch>
/* set the user's output */
if ( olddelta )
*olddelta = *delta;
return 0;
80034a0: 34 01 00 00 mvi r1,0
_TOD_Set( &ts );
_Thread_Enable_dispatch();
/* set the user's output */
if ( olddelta )
80034a4: 45 80 ff 9f be r12,r0,8003320 <adjtime+0x44>
*olddelta = *delta;
80034a8: 29 62 00 00 lw r2,(r11+0)
80034ac: 59 82 00 00 sw (r12+0),r2
80034b0: 29 62 00 04 lw r2,(r11+4)
80034b4: 59 82 00 04 sw (r12+4),r2
return 0;
}
80034b8: 2b 9d 00 04 lw ra,(sp+4)
80034bc: 2b 8b 00 10 lw r11,(sp+16)
80034c0: 2b 8c 00 0c lw r12,(sp+12)
80034c4: 2b 8d 00 08 lw r13,(sp+8)
80034c8: 37 9c 00 18 addi sp,sp,24
80034cc: c3 a0 00 00 ret
08003d40 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
8003d40: 37 9c ff ec addi sp,sp,-20
8003d44: 5b 8b 00 14 sw (sp+20),r11
8003d48: 5b 8c 00 10 sw (sp+16),r12
8003d4c: 5b 8d 00 0c sw (sp+12),r13
8003d50: 5b 8e 00 08 sw (sp+8),r14
8003d54: 5b 9d 00 04 sw (sp+4),ra
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
8003d58: 78 0b 08 01 mvhi r11,0x801
8003d5c: 39 6b 87 f8 ori r11,r11,0x87f8
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
8003d60: b8 20 68 00 mv r13,r1
8003d64: b8 40 60 00 mv r12,r2
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
8003d68: b9 60 08 00 mv r1,r11
8003d6c: f8 00 05 09 calli 8005190 <pthread_mutex_lock>
if (aiocbp == NULL)
8003d70: 45 80 00 3b be r12,r0,8003e5c <aio_cancel+0x11c>
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
}
else
{
if (aiocbp->aio_fildes != fildes) {
8003d74: 29 8e 00 00 lw r14,(r12+0)
8003d78: 5d cd 00 32 bne r14,r13,8003e40 <aio_cancel+0x100> <== ALWAYS TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EINVAL);
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
8003d7c: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003d80: 38 21 88 40 ori r1,r1,0x8840 <== NOT EXECUTED
8003d84: b9 c0 10 00 mv r2,r14 <== NOT EXECUTED
8003d88: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8003d8c: f8 00 00 ea calli 8004134 <rtems_aio_search_fd> <== NOT EXECUTED
8003d90: b8 20 68 00 mv r13,r1 <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
8003d94: 44 20 00 14 be r1,r0,8003de4 <aio_cancel+0xa4> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
pthread_mutex_lock (&r_chain->mutex);
8003d98: 35 ae 00 1c addi r14,r13,28 <== NOT EXECUTED
8003d9c: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
8003da0: f8 00 04 fc calli 8005190 <pthread_mutex_lock> <== NOT EXECUTED
result = rtems_aio_remove_req (&r_chain->next_fd, aiocbp);
8003da4: b9 80 10 00 mv r2,r12 <== NOT EXECUTED
8003da8: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003dac: f8 00 02 08 calli 80045cc <rtems_aio_remove_req> <== NOT EXECUTED
8003db0: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
8003db4: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
8003db8: f8 00 05 26 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
8003dbc: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003dc0: f8 00 05 24 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
}
return AIO_ALLDONE;
}
8003dc4: b9 80 08 00 mv r1,r12
8003dc8: 2b 9d 00 04 lw ra,(sp+4)
8003dcc: 2b 8b 00 14 lw r11,(sp+20)
8003dd0: 2b 8c 00 10 lw r12,(sp+16)
8003dd4: 2b 8d 00 0c lw r13,(sp+12)
8003dd8: 2b 8e 00 08 lw r14,(sp+8)
8003ddc: 37 9c 00 14 addi sp,sp,20
8003de0: c3 a0 00 00 ret
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
fildes,
0);
if (r_chain == NULL)
if (!rtems_chain_is_empty (&aio_request_queue.idle_req))
8003de4: 29 62 00 54 lw r2,(r11+84) <== NOT EXECUTED
8003de8: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003dec: 38 21 88 50 ori r1,r1,0x8850 <== NOT EXECUTED
8003df0: 44 41 ff ea be r2,r1,8003d98 <aio_cancel+0x58> <== NOT EXECUTED
{
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
8003df4: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003df8: 38 21 88 4c ori r1,r1,0x884c <== NOT EXECUTED
8003dfc: b9 c0 10 00 mv r2,r14 <== NOT EXECUTED
8003e00: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8003e04: f8 00 00 cc calli 8004134 <rtems_aio_search_fd> <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
8003e08: 44 20 00 0e be r1,r0,8003e40 <aio_cancel+0x100> <== NOT EXECUTED
{
pthread_mutex_unlock (&aio_request_queue.mutex);
rtems_set_errno_and_return_minus_one (EINVAL);
}
result = rtems_aio_remove_req (&r_chain->next_fd, aiocbp);
8003e0c: b9 80 10 00 mv r2,r12 <== NOT EXECUTED
8003e10: f8 00 01 ef calli 80045cc <rtems_aio_remove_req> <== NOT EXECUTED
8003e14: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
8003e18: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003e1c: f8 00 05 0d calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
}
return AIO_ALLDONE;
}
8003e20: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003e24: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8003e28: 2b 8b 00 14 lw r11,(sp+20) <== NOT EXECUTED
8003e2c: 2b 8c 00 10 lw r12,(sp+16) <== NOT EXECUTED
8003e30: 2b 8d 00 0c lw r13,(sp+12) <== NOT EXECUTED
8003e34: 2b 8e 00 08 lw r14,(sp+8) <== NOT EXECUTED
8003e38: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED
8003e3c: c3 a0 00 00 ret <== NOT EXECUTED
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
fildes,
0);
if (r_chain == NULL)
{
pthread_mutex_unlock (&aio_request_queue.mutex);
8003e40: b9 60 08 00 mv r1,r11
8003e44: f8 00 05 03 calli 8005250 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
8003e48: f8 00 30 3d calli 800ff3c <__errno>
8003e4c: 34 02 00 16 mvi r2,22
8003e50: 58 22 00 00 sw (r1+0),r2
8003e54: 34 0c ff ff mvi r12,-1
8003e58: e3 ff ff db bi 8003dc4 <aio_cancel+0x84>
pthread_mutex_lock (&aio_request_queue.mutex);
if (aiocbp == NULL)
{
if (fcntl (fildes, F_GETFL) < 0) {
8003e5c: b9 a0 08 00 mv r1,r13
8003e60: 34 02 00 03 mvi r2,3
8003e64: f8 00 1e a6 calli 800b8fc <fcntl>
8003e68: 4c 2c 00 08 bge r1,r12,8003e88 <aio_cancel+0x148> <== NEVER TAKEN
pthread_mutex_unlock(&aio_request_queue.mutex);
8003e6c: b9 60 08 00 mv r1,r11
8003e70: f8 00 04 f8 calli 8005250 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
8003e74: f8 00 30 32 calli 800ff3c <__errno>
8003e78: 34 02 00 09 mvi r2,9
8003e7c: 58 22 00 00 sw (r1+0),r2
8003e80: 34 0c ff ff mvi r12,-1
8003e84: e3 ff ff d0 bi 8003dc4 <aio_cancel+0x84>
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
8003e88: 78 01 08 01 mvhi r1,0x801
8003e8c: 38 21 88 40 ori r1,r1,0x8840 <== NOT EXECUTED
8003e90: b9 a0 10 00 mv r2,r13 <== NOT EXECUTED
8003e94: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8003e98: f8 00 00 a7 calli 8004134 <rtems_aio_search_fd> <== NOT EXECUTED
8003e9c: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
8003ea0: 44 20 00 0e be r1,r0,8003ed8 <aio_cancel+0x198> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_ALLDONE;
}
pthread_mutex_lock (&r_chain->mutex);
8003ea4: 34 2d 00 1c addi r13,r1,28 <== NOT EXECUTED
8003ea8: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003eac: f8 00 04 b9 calli 8005190 <pthread_mutex_lock> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8003eb0: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003eb4: f8 00 0a fd calli 8006aa8 <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
8003eb8: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003ebc: f8 00 01 a3 calli 8004548 <rtems_aio_remove_fd> <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
8003ec0: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003ec4: f8 00 04 e3 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
8003ec8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003ecc: f8 00 04 e1 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_CANCELED;
8003ed0: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
8003ed4: e3 ff ff bc bi 8003dc4 <aio_cancel+0x84> <== NOT EXECUTED
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
fildes,
0);
if (r_chain == NULL)
{
if (!rtems_chain_is_empty (&aio_request_queue.idle_req))
8003ed8: 29 62 00 54 lw r2,(r11+84) <== NOT EXECUTED
8003edc: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003ee0: 38 21 88 50 ori r1,r1,0x8850 <== NOT EXECUTED
8003ee4: 44 41 00 16 be r2,r1,8003f3c <aio_cancel+0x1fc> <== NOT EXECUTED
{
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
8003ee8: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003eec: 38 21 88 4c ori r1,r1,0x884c <== NOT EXECUTED
8003ef0: b9 a0 10 00 mv r2,r13 <== NOT EXECUTED
8003ef4: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8003ef8: f8 00 00 8f calli 8004134 <rtems_aio_search_fd> <== NOT EXECUTED
8003efc: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL) {
8003f00: 44 20 00 0f be r1,r0,8003f3c <aio_cancel+0x1fc> <== NOT EXECUTED
8003f04: f8 00 0a e9 calli 8006aa8 <_Chain_Extract> <== NOT EXECUTED
pthread_mutex_unlock(&aio_request_queue.mutex);
return AIO_ALLDONE;
}
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
8003f08: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
pthread_mutex_destroy (&r_chain->mutex);
8003f0c: 35 8d 00 1c addi r13,r12,28 <== NOT EXECUTED
pthread_mutex_unlock(&aio_request_queue.mutex);
return AIO_ALLDONE;
}
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
8003f10: f8 00 01 8e calli 8004548 <rtems_aio_remove_fd> <== NOT EXECUTED
pthread_mutex_destroy (&r_chain->mutex);
8003f14: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003f18: f8 00 03 d6 calli 8004e70 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_cond_destroy (&r_chain->mutex);
8003f1c: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003f20: f8 00 02 c3 calli 8004a2c <pthread_cond_destroy> <== NOT EXECUTED
free (r_chain);
8003f24: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003f28: fb ff f9 00 calli 8002328 <free> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
8003f2c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003f30: f8 00 04 c8 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_CANCELED;
8003f34: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
8003f38: e3 ff ff a3 bi 8003dc4 <aio_cancel+0x84> <== NOT EXECUTED
}
pthread_mutex_unlock (&aio_request_queue.mutex);
8003f3c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003f40: f8 00 04 c4 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
8003f44: 34 0c 00 02 mvi r12,2 <== NOT EXECUTED
8003f48: e3 ff ff 9f bi 8003dc4 <aio_cancel+0x84> <== NOT EXECUTED
08003f54 <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
8003f54: 37 9c ff f4 addi sp,sp,-12
8003f58: 5b 8b 00 0c sw (sp+12),r11
8003f5c: 5b 8c 00 08 sw (sp+8),r12
8003f60: 5b 9d 00 04 sw (sp+4),ra
8003f64: b8 40 58 00 mv r11,r2
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
8003f68: 34 02 20 00 mvi r2,8192
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
8003f6c: 34 0c 00 16 mvi r12,22
)
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
8003f70: 5c 22 00 09 bne r1,r2,8003f94 <aio_fsync+0x40>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
8003f74: 29 61 00 00 lw r1,(r11+0)
8003f78: 34 02 00 03 mvi r2,3
8003f7c: f8 00 1e 60 calli 800b8fc <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
8003f80: 20 21 00 03 andi r1,r1,0x3
8003f84: 34 21 ff ff addi r1,r1,-1
8003f88: 34 02 00 01 mvi r2,1
8003f8c: 50 41 00 0d bgeu r2,r1,8003fc0 <aio_fsync+0x6c> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
8003f90: 34 0c 00 09 mvi r12,9
8003f94: 34 01 ff ff mvi r1,-1
8003f98: 59 6c 00 2c sw (r11+44),r12
8003f9c: 59 61 00 30 sw (r11+48),r1
8003fa0: f8 00 2f e7 calli 800ff3c <__errno>
8003fa4: 58 2c 00 00 sw (r1+0),r12
8003fa8: 34 01 ff ff mvi r1,-1
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
8003fac: 2b 9d 00 04 lw ra,(sp+4)
8003fb0: 2b 8b 00 0c lw r11,(sp+12)
8003fb4: 2b 8c 00 08 lw r12,(sp+8)
8003fb8: 37 9c 00 0c addi sp,sp,12
8003fbc: c3 a0 00 00 ret
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
8003fc0: 34 01 00 18 mvi r1,24 <== NOT EXECUTED
8003fc4: fb ff fa b2 calli 8002a8c <malloc> <== NOT EXECUTED
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
8003fc8: 34 0c 00 0b mvi r12,11 <== NOT EXECUTED
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
8003fcc: 44 20 ff f2 be r1,r0,8003f94 <aio_fsync+0x40> <== NOT EXECUTED
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
8003fd0: 34 03 00 03 mvi r3,3 <== NOT EXECUTED
8003fd4: 59 63 00 28 sw (r11+40),r3 <== NOT EXECUTED
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
8003fd8: 58 2b 00 14 sw (r1+20),r11 <== NOT EXECUTED
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
8003fdc: f8 00 01 9b calli 8004648 <rtems_aio_enqueue> <== NOT EXECUTED
}
8003fe0: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8003fe4: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
8003fe8: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
8003fec: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
8003ff0: c3 a0 00 00 ret <== NOT EXECUTED
0800485c <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
800485c: 37 9c ff f4 addi sp,sp,-12
8004860: 5b 8b 00 0c sw (sp+12),r11
8004864: 5b 8c 00 08 sw (sp+8),r12
8004868: 5b 9d 00 04 sw (sp+4),ra
800486c: b8 20 58 00 mv r11,r1
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
8004870: 28 21 00 00 lw r1,(r1+0)
8004874: 34 02 00 03 mvi r2,3
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
8004878: 34 0c 00 09 mvi r12,9
aio_read (struct aiocb *aiocbp)
{
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
800487c: f8 00 1c 20 calli 800b8fc <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
8004880: 20 21 00 03 andi r1,r1,0x3
8004884: 7c 22 00 02 cmpnei r2,r1,2
8004888: 7c 21 00 00 cmpnei r1,r1,0
800488c: a0 41 08 00 and r1,r2,r1
8004890: 5c 20 00 06 bne r1,r0,80048a8 <aio_read+0x4c>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
8004894: 29 6c 00 10 lw r12,(r11+16)
8004898: 5d 81 00 03 bne r12,r1,80048a4 <aio_read+0x48>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
800489c: 29 61 00 04 lw r1,(r11+4)
80048a0: 4c 2c 00 09 bge r1,r12,80048c4 <aio_read+0x68>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
80048a4: 34 0c 00 16 mvi r12,22
80048a8: 34 01 ff ff mvi r1,-1
80048ac: 59 6c 00 2c sw (r11+44),r12
80048b0: 59 61 00 30 sw (r11+48),r1
80048b4: f8 00 2d a2 calli 800ff3c <__errno>
80048b8: 58 2c 00 00 sw (r1+0),r12
80048bc: 34 01 ff ff mvi r1,-1
80048c0: e0 00 00 08 bi 80048e0 <aio_read+0x84>
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
80048c4: 34 01 00 18 mvi r1,24
80048c8: fb ff f8 71 calli 8002a8c <malloc>
if (req == NULL)
80048cc: 44 2c 00 0a be r1,r12,80048f4 <aio_read+0x98> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
80048d0: 34 03 00 01 mvi r3,1
80048d4: 59 63 00 28 sw (r11+40),r3
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
80048d8: 58 2b 00 14 sw (r1+20),r11
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
80048dc: fb ff ff 5b calli 8004648 <rtems_aio_enqueue>
}
80048e0: 2b 9d 00 04 lw ra,(sp+4)
80048e4: 2b 8b 00 0c lw r11,(sp+12)
80048e8: 2b 8c 00 08 lw r12,(sp+8)
80048ec: 37 9c 00 0c addi sp,sp,12
80048f0: c3 a0 00 00 ret
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
80048f4: 34 0c 00 0b mvi r12,11 <== NOT EXECUTED
80048f8: e3 ff ff ec bi 80048a8 <aio_read+0x4c> <== NOT EXECUTED
08004904 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
8004904: 37 9c ff f4 addi sp,sp,-12
8004908: 5b 8b 00 0c sw (sp+12),r11
800490c: 5b 8c 00 08 sw (sp+8),r12
8004910: 5b 9d 00 04 sw (sp+4),ra
8004914: b8 20 58 00 mv r11,r1
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
8004918: 28 21 00 00 lw r1,(r1+0)
800491c: 34 02 00 03 mvi r2,3
8004920: f8 00 1b f7 calli 800b8fc <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
8004924: 20 21 00 03 andi r1,r1,0x3
8004928: 34 21 ff ff addi r1,r1,-1
800492c: 34 02 00 01 mvi r2,1
8004930: 50 41 00 09 bgeu r2,r1,8004954 <aio_write+0x50>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
8004934: 34 0c 00 09 mvi r12,9
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
8004938: 34 01 ff ff mvi r1,-1
800493c: 59 6c 00 2c sw (r11+44),r12
8004940: 59 61 00 30 sw (r11+48),r1
8004944: f8 00 2d 7e calli 800ff3c <__errno>
8004948: 58 2c 00 00 sw (r1+0),r12
800494c: 34 01 ff ff mvi r1,-1
8004950: e0 00 00 0f bi 800498c <aio_write+0x88>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
8004954: 29 61 00 10 lw r1,(r11+16)
8004958: 5c 20 00 03 bne r1,r0,8004964 <aio_write+0x60>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
800495c: 29 62 00 04 lw r2,(r11+4)
8004960: 4c 41 00 03 bge r2,r1,800496c <aio_write+0x68>
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
8004964: 34 0c 00 16 mvi r12,22
8004968: e3 ff ff f4 bi 8004938 <aio_write+0x34>
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
800496c: 34 01 00 18 mvi r1,24
8004970: fb ff f8 47 calli 8002a8c <malloc>
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
8004974: 34 0c 00 0b mvi r12,11
if (aiocbp->aio_offset < 0)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
8004978: 44 20 ff f0 be r1,r0,8004938 <aio_write+0x34> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
800497c: 34 03 00 02 mvi r3,2
8004980: 59 63 00 28 sw (r11+40),r3
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
8004984: 58 2b 00 14 sw (r1+20),r11
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
8004988: fb ff ff 30 calli 8004648 <rtems_aio_enqueue>
}
800498c: 2b 9d 00 04 lw ra,(sp+4)
8004990: 2b 8b 00 0c lw r11,(sp+12)
8004994: 2b 8c 00 08 lw r12,(sp+8)
8004998: 37 9c 00 0c addi sp,sp,12
800499c: c3 a0 00 00 ret
080014f8 <chroot>:
#include <rtems/seterr.h>
int chroot(
const char *pathname
)
{
80014f8: 37 9c ff dc addi sp,sp,-36
80014fc: 5b 8b 00 10 sw (sp+16),r11
8001500: 5b 8c 00 0c sw (sp+12),r12
8001504: 5b 8d 00 08 sw (sp+8),r13
8001508: 5b 9d 00 04 sw (sp+4),ra
int result;
rtems_filesystem_location_info_t loc;
/* an automatic call to new private env the first time */
if (rtems_current_user_env == &rtems_global_user_env) {
800150c: 78 0b 08 01 mvhi r11,0x801
8001510: 39 6b 51 08 ori r11,r11,0x5108
8001514: 29 6d 00 00 lw r13,(r11+0)
8001518: 78 02 08 01 mvhi r2,0x801
800151c: 38 42 57 50 ori r2,r2,0x5750
#include <rtems/seterr.h>
int chroot(
const char *pathname
)
{
8001520: b8 20 60 00 mv r12,r1
int result;
rtems_filesystem_location_info_t loc;
/* an automatic call to new private env the first time */
if (rtems_current_user_env == &rtems_global_user_env) {
8001524: 45 a2 00 22 be r13,r2,80015ac <chroot+0xb4>
rtems_libio_set_private_env(); /* try to set a new private env*/
if (rtems_current_user_env == &rtems_global_user_env) /* not ok */
rtems_set_errno_and_return_minus_one( ENOTSUP );
}
result = chdir(pathname);
8001528: b9 80 08 00 mv r1,r12
800152c: f8 00 1d ac calli 8008bdc <chdir>
8001530: b8 20 60 00 mv r12,r1
if (result) {
8001534: 5c 20 00 26 bne r1,r0,80015cc <chroot+0xd4>
rtems_set_errno_and_return_minus_one( errno );
}
/* clone the new root location */
if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) {
8001538: 78 01 08 01 mvhi r1,0x801
800153c: 38 21 38 b4 ori r1,r1,0x38b4
8001540: 34 02 00 01 mvi r2,1
8001544: 34 03 00 00 mvi r3,0
8001548: 37 84 00 14 addi r4,sp,20
800154c: 34 05 00 00 mvi r5,0
8001550: f8 00 00 79 calli 8001734 <rtems_filesystem_evaluate_path>
8001554: 5c 2c 00 1e bne r1,r12,80015cc <chroot+0xd4> <== NEVER TAKEN
/* our cwd has changed, though - but there is no easy way of return :-( */
rtems_set_errno_and_return_minus_one( errno );
}
rtems_filesystem_freenode(&rtems_filesystem_root);
8001558: 29 61 00 00 lw r1,(r11+0)
800155c: 34 21 00 18 addi r1,r1,24
8001560: f8 00 00 c3 calli 800186c <rtems_filesystem_freenode>
rtems_filesystem_root = loc;
8001564: 29 61 00 00 lw r1,(r11+0)
8001568: 2b 82 00 14 lw r2,(sp+20)
800156c: 58 22 00 18 sw (r1+24),r2
8001570: 2b 82 00 18 lw r2,(sp+24)
8001574: 58 22 00 1c sw (r1+28),r2
8001578: 2b 82 00 1c lw r2,(sp+28)
800157c: 58 22 00 20 sw (r1+32),r2
8001580: 2b 82 00 20 lw r2,(sp+32)
8001584: 58 22 00 24 sw (r1+36),r2
8001588: 2b 82 00 24 lw r2,(sp+36)
800158c: 58 22 00 28 sw (r1+40),r2
return 0;
8001590: 34 01 00 00 mvi r1,0
}
8001594: 2b 9d 00 04 lw ra,(sp+4)
8001598: 2b 8b 00 10 lw r11,(sp+16)
800159c: 2b 8c 00 0c lw r12,(sp+12)
80015a0: 2b 8d 00 08 lw r13,(sp+8)
80015a4: 37 9c 00 24 addi sp,sp,36
80015a8: c3 a0 00 00 ret
int result;
rtems_filesystem_location_info_t loc;
/* an automatic call to new private env the first time */
if (rtems_current_user_env == &rtems_global_user_env) {
rtems_libio_set_private_env(); /* try to set a new private env*/
80015ac: f8 00 05 e3 calli 8002d38 <rtems_libio_set_private_env>
if (rtems_current_user_env == &rtems_global_user_env) /* not ok */
80015b0: 29 61 00 00 lw r1,(r11+0)
80015b4: 5c 2d ff dd bne r1,r13,8001528 <chroot+0x30>
rtems_set_errno_and_return_minus_one( ENOTSUP );
80015b8: f8 00 2f 74 calli 800d388 <__errno>
80015bc: 34 02 00 86 mvi r2,134
80015c0: 58 22 00 00 sw (r1+0),r2
80015c4: 34 01 ff ff mvi r1,-1
80015c8: e3 ff ff f3 bi 8001594 <chroot+0x9c>
}
/* clone the new root location */
if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) {
/* our cwd has changed, though - but there is no easy way of return :-( */
rtems_set_errno_and_return_minus_one( errno );
80015cc: f8 00 2f 6f calli 800d388 <__errno>
80015d0: b8 20 58 00 mv r11,r1
80015d4: f8 00 2f 6d calli 800d388 <__errno>
80015d8: 28 22 00 00 lw r2,(r1+0)
80015dc: 34 01 ff ff mvi r1,-1
80015e0: 59 62 00 00 sw (r11+0),r2
80015e4: e3 ff ff ec bi 8001594 <chroot+0x9c>
080030e8 <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
80030e8: 37 9c ff fc addi sp,sp,-4
80030ec: 5b 9d 00 04 sw (sp+4),ra
if ( !tp )
80030f0: 44 40 00 09 be r2,r0,8003114 <clock_gettime+0x2c>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
80030f4: 34 03 00 01 mvi r3,1
80030f8: 44 23 00 1b be r1,r3,8003164 <clock_gettime+0x7c>
_TOD_Get(tp);
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
80030fc: 34 03 00 04 mvi r3,4
8003100: 44 23 00 13 be r1,r3,800314c <clock_gettime+0x64> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
8003104: 34 03 00 02 mvi r3,2
8003108: 44 23 00 11 be r1,r3,800314c <clock_gettime+0x64>
return 0;
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
800310c: 34 02 00 03 mvi r2,3
8003110: 44 22 00 08 be r1,r2,8003130 <clock_gettime+0x48>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
8003114: f8 00 2c 4c calli 800e244 <__errno>
8003118: 34 02 00 16 mvi r2,22
800311c: 58 22 00 00 sw (r1+0),r2
8003120: 34 01 ff ff mvi r1,-1
return 0;
}
8003124: 2b 9d 00 04 lw ra,(sp+4)
8003128: 37 9c 00 04 addi sp,sp,4
800312c: c3 a0 00 00 ret
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
8003130: f8 00 2c 45 calli 800e244 <__errno>
8003134: 34 02 00 58 mvi r2,88
8003138: 58 22 00 00 sw (r1+0),r2
800313c: 34 01 ff ff mvi r1,-1
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
8003140: 2b 9d 00 04 lw ra,(sp+4)
8003144: 37 9c 00 04 addi sp,sp,4
8003148: c3 a0 00 00 ret
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
_TOD_Get_uptime_as_timespec( tp );
800314c: b8 40 08 00 mv r1,r2
8003150: f8 00 07 64 calli 8004ee0 <_TOD_Get_uptime_as_timespec>
return 0;
8003154: 34 01 00 00 mvi r1,0
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
8003158: 2b 9d 00 04 lw ra,(sp+4)
800315c: 37 9c 00 04 addi sp,sp,4
8003160: c3 a0 00 00 ret
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
_TOD_Get(tp);
8003164: b8 40 08 00 mv r1,r2
8003168: f8 00 07 39 calli 8004e4c <_TOD_Get>
return 0;
800316c: 34 01 00 00 mvi r1,0
8003170: e3 ff ff ed bi 8003124 <clock_gettime+0x3c>
08003174 <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
8003174: 37 9c ff fc addi sp,sp,-4
8003178: 5b 9d 00 04 sw (sp+4),ra
if ( !tp )
800317c: 44 40 00 07 be r2,r0,8003198 <clock_settime+0x24> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
8003180: 34 03 00 01 mvi r3,1
8003184: 44 23 00 0c be r1,r3,80031b4 <clock_settime+0x40>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
8003188: 34 02 00 02 mvi r2,2
800318c: 44 22 00 1c be r1,r2,80031fc <clock_settime+0x88>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
8003190: 34 02 00 03 mvi r2,3
8003194: 44 22 00 1a be r1,r2,80031fc <clock_settime+0x88>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
8003198: f8 00 2c 2b calli 800e244 <__errno>
800319c: 34 02 00 16 mvi r2,22
80031a0: 58 22 00 00 sw (r1+0),r2
80031a4: 34 01 ff ff mvi r1,-1
return 0;
}
80031a8: 2b 9d 00 04 lw ra,(sp+4)
80031ac: 37 9c 00 04 addi sp,sp,4
80031b0: c3 a0 00 00 ret
{
if ( !tp )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
80031b4: 78 04 08 01 mvhi r4,0x801
80031b8: 38 84 ed 1c ori r4,r4,0xed1c
80031bc: 28 43 00 00 lw r3,(r2+0)
80031c0: 28 81 00 00 lw r1,(r4+0)
80031c4: 54 61 00 02 bgu r3,r1,80031cc <clock_settime+0x58>
80031c8: e3 ff ff f4 bi 8003198 <clock_settime+0x24>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80031cc: 78 01 08 02 mvhi r1,0x802
80031d0: 38 21 08 b8 ori r1,r1,0x8b8
80031d4: 28 23 00 00 lw r3,(r1+0)
80031d8: 34 63 00 01 addi r3,r3,1
80031dc: 58 23 00 00 sw (r1+0),r3
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
80031e0: b8 40 08 00 mv r1,r2
80031e4: f8 00 07 5c calli 8004f54 <_TOD_Set>
_Thread_Enable_dispatch();
80031e8: f8 00 0d a7 calli 8006884 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
80031ec: 34 01 00 00 mvi r1,0
}
80031f0: 2b 9d 00 04 lw ra,(sp+4)
80031f4: 37 9c 00 04 addi sp,sp,4
80031f8: c3 a0 00 00 ret
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
rtems_set_errno_and_return_minus_one( ENOSYS );
80031fc: f8 00 2c 12 calli 800e244 <__errno>
8003200: 34 02 00 58 mvi r2,88
8003204: 58 22 00 00 sw (r1+0),r2
8003208: 34 01 ff ff mvi r1,-1
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
}
800320c: 2b 9d 00 04 lw ra,(sp+4)
8003210: 37 9c 00 04 addi sp,sp,4
8003214: c3 a0 00 00 ret
08006aa8 <devFS_evaluate_path>:
const char *pathname,
size_t pathnamelen,
int flags,
rtems_filesystem_location_info_t *pathloc
)
{
8006aa8: 37 9c ff dc addi sp,sp,-36
8006aac: 5b 8b 00 24 sw (sp+36),r11
8006ab0: 5b 8c 00 20 sw (sp+32),r12
8006ab4: 5b 8d 00 1c sw (sp+28),r13
8006ab8: 5b 8e 00 18 sw (sp+24),r14
8006abc: 5b 8f 00 14 sw (sp+20),r15
8006ac0: 5b 90 00 10 sw (sp+16),r16
8006ac4: 5b 91 00 0c sw (sp+12),r17
8006ac8: 5b 92 00 08 sw (sp+8),r18
8006acc: 5b 9d 00 04 sw (sp+4),ra
int i;
rtems_device_name_t *device_name_table;
/* see if 'flags' is valid */
if ( !rtems_libio_is_valid_perms( flags ) )
8006ad0: 34 05 ff f8 mvi r5,-8
8006ad4: a0 65 18 00 and r3,r3,r5
const char *pathname,
size_t pathnamelen,
int flags,
rtems_filesystem_location_info_t *pathloc
)
{
8006ad8: b8 20 90 00 mv r18,r1
8006adc: b8 40 70 00 mv r14,r2
8006ae0: b8 80 78 00 mv r15,r4
int i;
rtems_device_name_t *device_name_table;
/* see if 'flags' is valid */
if ( !rtems_libio_is_valid_perms( flags ) )
8006ae4: 5c 60 00 39 bne r3,r0,8006bc8 <devFS_evaluate_path+0x120> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
8006ae8: 28 90 00 00 lw r16,(r4+0)
if (!device_name_table)
8006aec: 46 03 00 3c be r16,r3,8006bdc <devFS_evaluate_path+0x134>
rtems_set_errno_and_return_minus_one( EFAULT );
for (i = 0; i < rtems_device_table_size; i++) {
8006af0: 78 02 08 01 mvhi r2,0x801
8006af4: 38 42 10 14 ori r2,r2,0x1014
8006af8: 28 51 00 00 lw r17,(r2+0)
8006afc: 34 05 00 00 mvi r5,0
8006b00: 34 0b 00 00 mvi r11,0
8006b04: 46 20 00 14 be r17,r0,8006b54 <devFS_evaluate_path+0xac> <== NEVER TAKEN
if (!device_name_table[i].device_name)
8006b08: b4 a5 28 00 add r5,r5,r5
8006b0c: b4 a5 28 00 add r5,r5,r5
8006b10: b4 a5 30 00 add r6,r5,r5
8006b14: b4 c6 30 00 add r6,r6,r6
8006b18: b4 a6 28 00 add r5,r5,r6
8006b1c: b6 05 68 00 add r13,r16,r5
8006b20: 29 ac 00 00 lw r12,(r13+0)
continue;
if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0)
8006b24: ba 40 08 00 mv r1,r18
8006b28: b9 c0 18 00 mv r3,r14
8006b2c: b9 80 10 00 mv r2,r12
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (i = 0; i < rtems_device_table_size; i++) {
8006b30: 35 6b 00 01 addi r11,r11,1
if (!device_name_table[i].device_name)
8006b34: 45 80 00 06 be r12,r0,8006b4c <devFS_evaluate_path+0xa4>
continue;
if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0)
8006b38: f8 00 13 30 calli 800b7f8 <strncmp>
continue;
if (device_name_table[i].device_name[pathnamelen] != '\0')
8006b3c: b5 8e 60 00 add r12,r12,r14
for (i = 0; i < rtems_device_table_size; i++) {
if (!device_name_table[i].device_name)
continue;
if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0)
8006b40: 5c 20 00 03 bne r1,r0,8006b4c <devFS_evaluate_path+0xa4>
continue;
if (device_name_table[i].device_name[pathnamelen] != '\0')
8006b44: 41 82 00 00 lbu r2,(r12+0)
8006b48: 44 41 00 08 be r2,r1,8006b68 <devFS_evaluate_path+0xc0> <== ALWAYS TAKEN
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (i = 0; i < rtems_device_table_size; i++) {
8006b4c: b9 60 28 00 mv r5,r11
8006b50: 56 2b ff ee bgu r17,r11,8006b08 <devFS_evaluate_path+0x60>
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
return 0;
}
/* no such file or directory */
rtems_set_errno_and_return_minus_one( ENOENT );
8006b54: f8 00 0e e0 calli 800a6d4 <__errno>
8006b58: 34 02 00 02 mvi r2,2
8006b5c: 58 22 00 00 sw (r1+0),r2
8006b60: 34 01 ff ff mvi r1,-1
8006b64: e0 00 00 0e bi 8006b9c <devFS_evaluate_path+0xf4>
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
pathloc->handlers = &devFS_file_handlers;
pathloc->ops = &devFS_ops;
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
8006b68: 78 01 08 01 mvhi r1,0x801
8006b6c: 38 21 11 a0 ori r1,r1,0x11a0
8006b70: 28 23 00 00 lw r3,(r1+0)
if (device_name_table[i].device_name[pathnamelen] != '\0')
continue;
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
pathloc->handlers = &devFS_file_handlers;
8006b74: 78 02 08 01 mvhi r2,0x801
pathloc->ops = &devFS_ops;
8006b78: 78 01 08 01 mvhi r1,0x801
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
8006b7c: 28 63 00 28 lw r3,(r3+40)
continue;
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
pathloc->handlers = &devFS_file_handlers;
pathloc->ops = &devFS_ops;
8006b80: 38 21 11 14 ori r1,r1,0x1114
if (device_name_table[i].device_name[pathnamelen] != '\0')
continue;
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
pathloc->handlers = &devFS_file_handlers;
8006b84: 38 42 11 5c ori r2,r2,0x115c
pathloc->ops = &devFS_ops;
8006b88: 59 e1 00 0c sw (r15+12),r1
if (device_name_table[i].device_name[pathnamelen] != '\0')
continue;
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
8006b8c: 59 ed 00 00 sw (r15+0),r13
pathloc->handlers = &devFS_file_handlers;
8006b90: 59 e2 00 08 sw (r15+8),r2
pathloc->ops = &devFS_ops;
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
8006b94: 59 e3 00 10 sw (r15+16),r3
return 0;
8006b98: 34 01 00 00 mvi r1,0
}
/* no such file or directory */
rtems_set_errno_and_return_minus_one( ENOENT );
}
8006b9c: 2b 9d 00 04 lw ra,(sp+4)
8006ba0: 2b 8b 00 24 lw r11,(sp+36)
8006ba4: 2b 8c 00 20 lw r12,(sp+32)
8006ba8: 2b 8d 00 1c lw r13,(sp+28)
8006bac: 2b 8e 00 18 lw r14,(sp+24)
8006bb0: 2b 8f 00 14 lw r15,(sp+20)
8006bb4: 2b 90 00 10 lw r16,(sp+16)
8006bb8: 2b 91 00 0c lw r17,(sp+12)
8006bbc: 2b 92 00 08 lw r18,(sp+8)
8006bc0: 37 9c 00 24 addi sp,sp,36
8006bc4: c3 a0 00 00 ret
int i;
rtems_device_name_t *device_name_table;
/* see if 'flags' is valid */
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
8006bc8: f8 00 0e c3 calli 800a6d4 <__errno> <== NOT EXECUTED
8006bcc: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8006bd0: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8006bd4: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8006bd8: e3 ff ff f1 bi 8006b9c <devFS_evaluate_path+0xf4> <== NOT EXECUTED
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
8006bdc: f8 00 0e be calli 800a6d4 <__errno>
8006be0: 34 02 00 0e mvi r2,14
8006be4: 58 22 00 00 sw (r1+0),r2
8006be8: 34 01 ff ff mvi r1,-1
8006bec: e3 ff ff ec bi 8006b9c <devFS_evaluate_path+0xf4>
08000a78 <devFS_mknod>:
const char *path,
mode_t mode,
dev_t dev,
rtems_filesystem_location_info_t *pathloc
)
{
8000a78: 37 9c ff dc addi sp,sp,-36
8000a7c: 5b 8b 00 24 sw (sp+36),r11
8000a80: 5b 8c 00 20 sw (sp+32),r12
8000a84: 5b 8d 00 1c sw (sp+28),r13
8000a88: 5b 8e 00 18 sw (sp+24),r14
8000a8c: 5b 8f 00 14 sw (sp+20),r15
8000a90: 5b 90 00 10 sw (sp+16),r16
8000a94: 5b 91 00 0c sw (sp+12),r17
8000a98: 5b 92 00 08 sw (sp+8),r18
8000a9c: 5b 9d 00 04 sw (sp+4),ra
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
8000aa0: 40 26 00 00 lbu r6,(r1+0)
const char *path,
mode_t mode,
dev_t dev,
rtems_filesystem_location_info_t *pathloc
)
{
8000aa4: b8 20 60 00 mv r12,r1
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
8000aa8: 34 01 00 64 mvi r1,100
const char *path,
mode_t mode,
dev_t dev,
rtems_filesystem_location_info_t *pathloc
)
{
8000aac: b8 40 80 00 mv r16,r2
8000ab0: b8 60 90 00 mv r18,r3
8000ab4: b8 80 88 00 mv r17,r4
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
8000ab8: 44 c1 00 45 be r6,r1,8000bcc <devFS_mknod+0x154>
(path[2] == 'v') && (path[3] == '\0'))
return 0;
/* must be a character device or a block device */
if (!S_ISBLK(mode) && !S_ISCHR(mode))
8000abc: 22 01 f0 00 andi r1,r16,0xf000
8000ac0: 7c 22 20 00 cmpnei r2,r1,8192
8000ac4: 7c 21 60 00 cmpnei r1,r1,24576
8000ac8: a0 41 08 00 and r1,r2,r1
8000acc: 5c 20 00 4a bne r1,r0,8000bf4 <devFS_mknod+0x17c>
rtems_set_errno_and_return_minus_one( EINVAL );
else
rtems_filesystem_split_dev_t(dev, major, minor);
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
8000ad0: 28 ad 00 00 lw r13,(r5+0)
if (!device_name_table)
8000ad4: 45 a1 00 52 be r13,r1,8000c1c <devFS_mknod+0x1a4>
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
8000ad8: 78 01 08 01 mvhi r1,0x801
8000adc: 38 21 10 14 ori r1,r1,0x1014
8000ae0: 28 2e 00 00 lw r14,(r1+0)
8000ae4: 34 05 00 00 mvi r5,0
8000ae8: 34 0f ff ff mvi r15,-1
8000aec: 34 0b 00 00 mvi r11,0
8000af0: 45 c0 00 46 be r14,r0,8000c08 <devFS_mknod+0x190>
if (device_name_table[i].device_name == NULL)
8000af4: b4 a5 28 00 add r5,r5,r5
8000af8: b4 a5 28 00 add r5,r5,r5
8000afc: b4 a5 30 00 add r6,r5,r5
8000b00: b4 c6 30 00 add r6,r6,r6
8000b04: b4 a6 28 00 add r5,r5,r6
8000b08: b5 a5 28 00 add r5,r13,r5
8000b0c: 28 a5 00 00 lw r5,(r5+0)
slot = i;
else
if (strcmp(path, device_name_table[i].device_name) == 0)
8000b10: b9 80 08 00 mv r1,r12
8000b14: b8 a0 10 00 mv r2,r5
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
if (device_name_table[i].device_name == NULL)
8000b18: 44 a0 00 26 be r5,r0,8000bb0 <devFS_mknod+0x138>
slot = i;
else
if (strcmp(path, device_name_table[i].device_name) == 0)
8000b1c: f8 00 2a d8 calli 800b67c <strcmp>
8000b20: 44 20 00 26 be r1,r0,8000bb8 <devFS_mknod+0x140>
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
8000b24: 35 6b 00 01 addi r11,r11,1
8000b28: b9 60 28 00 mv r5,r11
8000b2c: 55 cb ff f2 bgu r14,r11,8000af4 <devFS_mknod+0x7c>
else
if (strcmp(path, device_name_table[i].device_name) == 0)
rtems_set_errno_and_return_minus_one( EEXIST );
}
if (slot == -1)
8000b30: 34 01 ff ff mvi r1,-1
8000b34: 45 e1 00 35 be r15,r1,8000c08 <devFS_mknod+0x190> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( ENOMEM );
_ISR_Disable(level);
8000b38: 90 00 58 00 rcsr r11,IE
8000b3c: 34 01 ff fe mvi r1,-2
8000b40: a1 61 08 00 and r1,r11,r1
8000b44: d0 01 00 00 wcsr IE,r1
device_name_table[slot].device_name = (char *)path;
8000b48: b5 ef 78 00 add r15,r15,r15
8000b4c: b5 ef 78 00 add r15,r15,r15
8000b50: b5 ef 08 00 add r1,r15,r15
8000b54: b4 21 08 00 add r1,r1,r1
8000b58: b5 e1 78 00 add r15,r15,r1
8000b5c: b5 af 68 00 add r13,r13,r15
8000b60: 59 ac 00 00 sw (r13+0),r12
device_name_table[slot].device_name_length = strlen(path);
8000b64: b9 80 08 00 mv r1,r12
8000b68: f8 00 2a f5 calli 800b73c <strlen>
8000b6c: 59 a1 00 04 sw (r13+4),r1
device_name_table[slot].major = major;
8000b70: 59 b2 00 08 sw (r13+8),r18
device_name_table[slot].minor = minor;
8000b74: 59 b1 00 0c sw (r13+12),r17
device_name_table[slot].mode = mode;
8000b78: 59 b0 00 10 sw (r13+16),r16
_ISR_Enable(level);
8000b7c: d0 0b 00 00 wcsr IE,r11
return 0;
8000b80: 34 01 00 00 mvi r1,0
}
8000b84: 2b 9d 00 04 lw ra,(sp+4)
8000b88: 2b 8b 00 24 lw r11,(sp+36)
8000b8c: 2b 8c 00 20 lw r12,(sp+32)
8000b90: 2b 8d 00 1c lw r13,(sp+28)
8000b94: 2b 8e 00 18 lw r14,(sp+24)
8000b98: 2b 8f 00 14 lw r15,(sp+20)
8000b9c: 2b 90 00 10 lw r16,(sp+16)
8000ba0: 2b 91 00 0c lw r17,(sp+12)
8000ba4: 2b 92 00 08 lw r18,(sp+8)
8000ba8: 37 9c 00 24 addi sp,sp,36
8000bac: c3 a0 00 00 ret
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
if (device_name_table[i].device_name == NULL)
8000bb0: b9 60 78 00 mv r15,r11
8000bb4: e3 ff ff dc bi 8000b24 <devFS_mknod+0xac>
slot = i;
else
if (strcmp(path, device_name_table[i].device_name) == 0)
rtems_set_errno_and_return_minus_one( EEXIST );
8000bb8: f8 00 26 c7 calli 800a6d4 <__errno>
8000bbc: 34 02 00 11 mvi r2,17
8000bc0: 58 22 00 00 sw (r1+0),r2
8000bc4: 34 01 ff ff mvi r1,-1
8000bc8: e3 ff ff ef bi 8000b84 <devFS_mknod+0x10c>
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
8000bcc: 41 82 00 01 lbu r2,(r12+1)
8000bd0: 34 01 00 65 mvi r1,101
8000bd4: 5c 41 ff ba bne r2,r1,8000abc <devFS_mknod+0x44> <== NEVER TAKEN
8000bd8: 41 82 00 02 lbu r2,(r12+2)
8000bdc: 34 01 00 76 mvi r1,118
8000be0: 5c 41 ff b7 bne r2,r1,8000abc <devFS_mknod+0x44> <== NEVER TAKEN
(path[2] == 'v') && (path[3] == '\0'))
8000be4: 41 82 00 03 lbu r2,(r12+3)
return 0;
8000be8: 34 01 00 00 mvi r1,0
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
(path[2] == 'v') && (path[3] == '\0'))
8000bec: 5c 40 ff b4 bne r2,r0,8000abc <devFS_mknod+0x44>
8000bf0: e3 ff ff e5 bi 8000b84 <devFS_mknod+0x10c>
return 0;
/* must be a character device or a block device */
if (!S_ISBLK(mode) && !S_ISCHR(mode))
rtems_set_errno_and_return_minus_one( EINVAL );
8000bf4: f8 00 26 b8 calli 800a6d4 <__errno>
8000bf8: 34 02 00 16 mvi r2,22
8000bfc: 58 22 00 00 sw (r1+0),r2
8000c00: 34 01 ff ff mvi r1,-1
8000c04: e3 ff ff e0 bi 8000b84 <devFS_mknod+0x10c>
if (strcmp(path, device_name_table[i].device_name) == 0)
rtems_set_errno_and_return_minus_one( EEXIST );
}
if (slot == -1)
rtems_set_errno_and_return_minus_one( ENOMEM );
8000c08: f8 00 26 b3 calli 800a6d4 <__errno>
8000c0c: 34 02 00 0c mvi r2,12
8000c10: 58 22 00 00 sw (r1+0),r2
8000c14: 34 01 ff ff mvi r1,-1
8000c18: e3 ff ff db bi 8000b84 <devFS_mknod+0x10c>
rtems_filesystem_split_dev_t(dev, major, minor);
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
8000c1c: f8 00 26 ae calli 800a6d4 <__errno>
8000c20: 34 02 00 0e mvi r2,14
8000c24: 58 22 00 00 sw (r1+0),r2
8000c28: 34 01 ff ff mvi r1,-1
8000c2c: e3 ff ff d6 bi 8000b84 <devFS_mknod+0x10c>
08004cc8 <drainOutput>:
/*
* Drain output queue
*/
static void
drainOutput (struct rtems_termios_tty *tty)
{
8004cc8: 37 9c ff f0 addi sp,sp,-16
8004ccc: 5b 8b 00 10 sw (sp+16),r11
8004cd0: 5b 8c 00 0c sw (sp+12),r12
8004cd4: 5b 8d 00 08 sw (sp+8),r13
8004cd8: 5b 9d 00 04 sw (sp+4),ra
8004cdc: b8 20 58 00 mv r11,r1
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
8004ce0: 28 21 00 b4 lw r1,(r1+180)
8004ce4: 44 20 00 18 be r1,r0,8004d44 <drainOutput+0x7c>
rtems_interrupt_disable (level);
8004ce8: 90 00 08 00 rcsr r1,IE
8004cec: 34 02 ff fe mvi r2,-2
8004cf0: a0 22 10 00 and r2,r1,r2
8004cf4: d0 02 00 00 wcsr IE,r2
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
8004cf8: 29 63 00 84 lw r3,(r11+132)
8004cfc: 29 62 00 80 lw r2,(r11+128)
8004d00: 44 62 00 10 be r3,r2,8004d40 <drainOutput+0x78> <== ALWAYS TAKEN
tty->rawOutBufState = rob_wait;
8004d04: 34 0c 00 02 mvi r12,2 <== NOT EXECUTED
rtems_interrupt_enable (level);
sc = rtems_semaphore_obtain(
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
8004d08: 34 0d ff fe mvi r13,-2 <== NOT EXECUTED
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
rtems_interrupt_disable (level);
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
tty->rawOutBufState = rob_wait;
8004d0c: 59 6c 00 94 sw (r11+148),r12 <== NOT EXECUTED
rtems_interrupt_enable (level);
8004d10: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
sc = rtems_semaphore_obtain(
8004d14: 29 61 00 8c lw r1,(r11+140) <== NOT EXECUTED
8004d18: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
8004d1c: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8004d20: f8 00 0a f3 calli 80078ec <rtems_semaphore_obtain> <== NOT EXECUTED
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
8004d24: 5c 20 00 0e bne r1,r0,8004d5c <drainOutput+0x94> <== NOT EXECUTED
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
8004d28: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED
8004d2c: a0 2d 10 00 and r2,r1,r13 <== NOT EXECUTED
8004d30: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
rtems_interrupt_disable (level);
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
8004d34: 29 63 00 84 lw r3,(r11+132) <== NOT EXECUTED
8004d38: 29 62 00 80 lw r2,(r11+128) <== NOT EXECUTED
8004d3c: 5c 62 ff f4 bne r3,r2,8004d0c <drainOutput+0x44> <== NOT EXECUTED
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
rtems_interrupt_enable (level);
8004d40: d0 01 00 00 wcsr IE,r1
}
}
8004d44: 2b 9d 00 04 lw ra,(sp+4)
8004d48: 2b 8b 00 10 lw r11,(sp+16)
8004d4c: 2b 8c 00 0c lw r12,(sp+12)
8004d50: 2b 8d 00 08 lw r13,(sp+8)
8004d54: 37 9c 00 10 addi sp,sp,16
8004d58: c3 a0 00 00 ret
tty->rawOutBufState = rob_wait;
rtems_interrupt_enable (level);
sc = rtems_semaphore_obtain(
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
8004d5c: f8 00 0c e3 calli 80080e8 <rtems_fatal_error_occurred>
08005b5c <echo>:
/*
* Echo a typed character
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
8005b5c: 37 9c ff f4 addi sp,sp,-12
8005b60: 5b 8b 00 08 sw (sp+8),r11
8005b64: 5b 9d 00 04 sw (sp+4),ra
8005b68: b8 40 58 00 mv r11,r2
if ((tty->termios.c_lflag & ECHOCTL) &&
8005b6c: 28 42 00 3c lw r2,(r2+60)
8005b70: 20 42 02 00 andi r2,r2,0x200
8005b74: 44 40 00 0b be r2,r0,8005ba0 <echo+0x44> <== NEVER TAKEN
iscntrl(c) && (c != '\t') && (c != '\n')) {
8005b78: 78 02 08 02 mvhi r2,0x802
8005b7c: 38 42 44 10 ori r2,r2,0x4410
8005b80: 28 42 00 00 lw r2,(r2+0)
8005b84: 7c 23 00 09 cmpnei r3,r1,9
8005b88: b4 41 10 00 add r2,r2,r1
8005b8c: 40 42 00 01 lbu r2,(r2+1)
8005b90: 20 42 00 20 andi r2,r2,0x20
* Echo a typed character
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
if ((tty->termios.c_lflag & ECHOCTL) &&
8005b94: 7c 42 00 00 cmpnei r2,r2,0
iscntrl(c) && (c != '\t') && (c != '\n')) {
8005b98: a0 43 10 00 and r2,r2,r3
8005b9c: 5c 40 00 07 bne r2,r0,8005bb8 <echo+0x5c>
echobuf[0] = '^';
echobuf[1] = c ^ 0x40;
rtems_termios_puts (echobuf, 2, tty);
tty->column += 2;
} else {
oproc (c, tty);
8005ba0: b9 60 10 00 mv r2,r11
8005ba4: fb ff ff 8c calli 80059d4 <oproc>
}
}
8005ba8: 2b 9d 00 04 lw ra,(sp+4)
8005bac: 2b 8b 00 08 lw r11,(sp+8)
8005bb0: 37 9c 00 0c addi sp,sp,12
8005bb4: c3 a0 00 00 ret
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
if ((tty->termios.c_lflag & ECHOCTL) &&
iscntrl(c) && (c != '\t') && (c != '\n')) {
8005bb8: 34 02 00 0a mvi r2,10
8005bbc: 44 22 ff f9 be r1,r2,8005ba0 <echo+0x44>
char echobuf[2];
echobuf[0] = '^';
echobuf[1] = c ^ 0x40;
8005bc0: 18 24 00 40 xori r4,r1,0x40
{
if ((tty->termios.c_lflag & ECHOCTL) &&
iscntrl(c) && (c != '\t') && (c != '\n')) {
char echobuf[2];
echobuf[0] = '^';
8005bc4: 34 05 00 5e mvi r5,94
echobuf[1] = c ^ 0x40;
rtems_termios_puts (echobuf, 2, tty);
8005bc8: 37 81 00 0c addi r1,sp,12
8005bcc: 34 02 00 02 mvi r2,2
8005bd0: b9 60 18 00 mv r3,r11
{
if ((tty->termios.c_lflag & ECHOCTL) &&
iscntrl(c) && (c != '\t') && (c != '\n')) {
char echobuf[2];
echobuf[0] = '^';
8005bd4: 33 85 00 0c sb (sp+12),r5
echobuf[1] = c ^ 0x40;
8005bd8: 33 84 00 0d sb (sp+13),r4
rtems_termios_puts (echobuf, 2, tty);
8005bdc: fb ff ff 25 calli 8005870 <rtems_termios_puts>
tty->column += 2;
8005be0: 29 61 00 28 lw r1,(r11+40)
8005be4: 34 21 00 02 addi r1,r1,2
8005be8: 59 61 00 28 sw (r11+40),r1
} else {
oproc (c, tty);
}
}
8005bec: 2b 9d 00 04 lw ra,(sp+4)
8005bf0: 2b 8b 00 08 lw r11,(sp+8)
8005bf4: 37 9c 00 0c addi sp,sp,12
8005bf8: c3 a0 00 00 ret
080028b4 <endgrent>:
void endgrent(void)
{
80028b4: 37 9c ff fc addi sp,sp,-4
80028b8: 5b 9d 00 04 sw (sp+4),ra
if (group_fp != NULL)
80028bc: 78 01 08 01 mvhi r1,0x801
80028c0: 38 21 66 b4 ori r1,r1,0x66b4
80028c4: 28 21 00 00 lw r1,(r1+0)
80028c8: 44 20 00 02 be r1,r0,80028d0 <endgrent+0x1c> <== NEVER TAKEN
fclose(group_fp);
80028cc: f8 00 2e 33 calli 800e198 <fclose>
}
80028d0: 2b 9d 00 04 lw ra,(sp+4)
80028d4: 37 9c 00 04 addi sp,sp,4
80028d8: c3 a0 00 00 ret
080026dc <endpwent>:
void endpwent(void)
{
80026dc: 37 9c ff fc addi sp,sp,-4
80026e0: 5b 9d 00 04 sw (sp+4),ra
if (passwd_fp != NULL)
80026e4: 78 01 08 01 mvhi r1,0x801
80026e8: 38 21 67 90 ori r1,r1,0x6790
80026ec: 28 21 00 00 lw r1,(r1+0)
80026f0: 44 20 00 02 be r1,r0,80026f8 <endpwent+0x1c> <== NEVER TAKEN
fclose(passwd_fp);
80026f4: f8 00 2e a9 calli 800e198 <fclose>
}
80026f8: 2b 9d 00 04 lw ra,(sp+4)
80026fc: 37 9c 00 04 addi sp,sp,4
8002700: c3 a0 00 00 ret
08005bfc <erase>:
* 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)
{
8005bfc: 37 9c ff e0 addi sp,sp,-32
8005c00: 5b 8b 00 20 sw (sp+32),r11
8005c04: 5b 8c 00 1c sw (sp+28),r12
8005c08: 5b 8d 00 18 sw (sp+24),r13
8005c0c: 5b 8e 00 14 sw (sp+20),r14
8005c10: 5b 8f 00 10 sw (sp+16),r15
8005c14: 5b 90 00 0c sw (sp+12),r16
8005c18: 5b 91 00 08 sw (sp+8),r17
8005c1c: 5b 9d 00 04 sw (sp+4),ra
if (tty->ccount == 0)
8005c20: 28 24 00 20 lw r4,(r1+32)
* FIXME: Needs support for WERASE and ECHOPRT.
* FIXME: Some of the tests should check for IEXTEN, too.
*/
static void
erase (struct rtems_termios_tty *tty, int lineFlag)
{
8005c24: b8 20 58 00 mv r11,r1
8005c28: b8 40 68 00 mv r13,r2
if (tty->ccount == 0)
8005c2c: 44 80 00 27 be r4,r0,8005cc8 <erase+0xcc>
return;
if (lineFlag) {
8005c30: 5c 40 00 30 bne r2,r0,8005cf0 <erase+0xf4>
echo ('\n', tty);
return;
}
}
while (tty->ccount) {
8005c34: 28 25 00 3c lw r5,(r1+60)
8005c38: 20 a2 00 08 andi r2,r5,0x8
rtems_termios_puts ("\b", 1, tty);
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
8005c3c: 78 0f 08 02 mvhi r15,0x802
8005c40: 78 11 08 02 mvhi r17,0x802
8005c44: 78 0e 08 02 mvhi r14,0x802
unsigned char c = tty->cbuf[--tty->ccount];
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
8005c48: 34 10 00 09 mvi r16,9
rtems_termios_puts ("\b", 1, tty);
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
8005c4c: 39 ef 44 10 ori r15,r15,0x4410
8005c50: 3a 31 1b 30 ori r17,r17,0x1b30
8005c54: 39 ce 1b 2c ori r14,r14,0x1b2c
return;
}
}
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
8005c58: 29 67 00 1c lw r7,(r11+28)
8005c5c: 34 84 ff ff addi r4,r4,-1
8005c60: 59 64 00 20 sw (r11+32),r4
8005c64: b4 e4 18 00 add r3,r7,r4
8005c68: 40 63 00 00 lbu r3,(r3+0)
if (tty->termios.c_lflag & ECHO) {
8005c6c: 44 40 00 0e be r2,r0,8005ca4 <erase+0xa8> <== NEVER TAKEN
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
8005c70: 5d a0 00 03 bne r13,r0,8005c7c <erase+0x80>
8005c74: 20 a1 00 10 andi r1,r5,0x10
8005c78: 44 2d 00 11 be r1,r13,8005cbc <erase+0xc0> <== NEVER TAKEN
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
8005c7c: 44 70 00 45 be r3,r16,8005d90 <erase+0x194>
rtems_termios_puts ("\b", 1, tty);
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
8005c80: 29 e2 00 00 lw r2,(r15+0)
8005c84: 34 6c 00 01 addi r12,r3,1
8005c88: ba 20 08 00 mv r1,r17
8005c8c: b4 4c 10 00 add r2,r2,r12
8005c90: 40 42 00 00 lbu r2,(r2+0)
8005c94: 20 42 00 20 andi r2,r2,0x20
8005c98: 44 40 00 36 be r2,r0,8005d70 <erase+0x174> <== ALWAYS TAKEN
8005c9c: 20 a5 02 00 andi r5,r5,0x200 <== NOT EXECUTED
8005ca0: 5c a0 00 24 bne r5,r0,8005d30 <erase+0x134> <== NOT EXECUTED
if (tty->column)
tty->column--;
}
}
}
if (!lineFlag)
8005ca4: 45 a0 00 09 be r13,r0,8005cc8 <erase+0xcc>
echo ('\n', tty);
return;
}
}
while (tty->ccount) {
8005ca8: 29 64 00 20 lw r4,(r11+32)
8005cac: 44 80 00 07 be r4,r0,8005cc8 <erase+0xcc>
}
if (!(tty->termios.c_lflag & ECHOE)) {
tty->ccount = 0;
echo (tty->termios.c_cc[VKILL], tty);
if (tty->termios.c_lflag & ECHOK)
echo ('\n', tty);
8005cb0: 29 65 00 3c lw r5,(r11+60)
8005cb4: 20 a2 00 08 andi r2,r5,0x8
8005cb8: e3 ff ff e8 bi 8005c58 <erase+0x5c>
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
8005cbc: 41 61 00 43 lbu r1,(r11+67) <== NOT EXECUTED
8005cc0: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8005cc4: fb ff ff a6 calli 8005b5c <echo> <== NOT EXECUTED
}
}
if (!lineFlag)
break;
}
}
8005cc8: 2b 9d 00 04 lw ra,(sp+4)
8005ccc: 2b 8b 00 20 lw r11,(sp+32)
8005cd0: 2b 8c 00 1c lw r12,(sp+28)
8005cd4: 2b 8d 00 18 lw r13,(sp+24)
8005cd8: 2b 8e 00 14 lw r14,(sp+20)
8005cdc: 2b 8f 00 10 lw r15,(sp+16)
8005ce0: 2b 90 00 0c lw r16,(sp+12)
8005ce4: 2b 91 00 08 lw r17,(sp+8)
8005ce8: 37 9c 00 20 addi sp,sp,32
8005cec: c3 a0 00 00 ret
erase (struct rtems_termios_tty *tty, int lineFlag)
{
if (tty->ccount == 0)
return;
if (lineFlag) {
if (!(tty->termios.c_lflag & ECHO)) {
8005cf0: 28 25 00 3c lw r5,(r1+60)
8005cf4: 20 a2 00 08 andi r2,r5,0x8
8005cf8: 44 40 00 48 be r2,r0,8005e18 <erase+0x21c> <== NEVER TAKEN
tty->ccount = 0;
return;
}
if (!(tty->termios.c_lflag & ECHOE)) {
8005cfc: 20 ac 00 10 andi r12,r5,0x10
8005d00: 5d 80 ff cf bne r12,r0,8005c3c <erase+0x40> <== ALWAYS TAKEN
tty->ccount = 0;
echo (tty->termios.c_cc[VKILL], tty);
8005d04: 40 21 00 44 lbu r1,(r1+68) <== NOT EXECUTED
if (!(tty->termios.c_lflag & ECHO)) {
tty->ccount = 0;
return;
}
if (!(tty->termios.c_lflag & ECHOE)) {
tty->ccount = 0;
8005d08: 59 60 00 20 sw (r11+32),r0 <== NOT EXECUTED
echo (tty->termios.c_cc[VKILL], tty);
8005d0c: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8005d10: fb ff ff 93 calli 8005b5c <echo> <== NOT EXECUTED
if (tty->termios.c_lflag & ECHOK)
8005d14: 29 61 00 3c lw r1,(r11+60) <== NOT EXECUTED
8005d18: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED
8005d1c: 44 2c ff eb be r1,r12,8005cc8 <erase+0xcc> <== NOT EXECUTED
echo ('\n', tty);
8005d20: 34 01 00 0a mvi r1,10 <== NOT EXECUTED
8005d24: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8005d28: fb ff ff 8d calli 8005b5c <echo> <== NOT EXECUTED
8005d2c: e3 ff ff e7 bi 8005cc8 <erase+0xcc> <== NOT EXECUTED
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
rtems_termios_puts ("\b \b", 3, tty);
8005d30: 34 02 00 03 mvi r2,3 <== NOT EXECUTED
8005d34: b9 60 18 00 mv r3,r11 <== NOT EXECUTED
8005d38: fb ff fe ce calli 8005870 <rtems_termios_puts> <== NOT EXECUTED
if (tty->column)
8005d3c: 29 62 00 28 lw r2,(r11+40) <== NOT EXECUTED
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
rtems_termios_puts ("\b \b", 3, tty);
8005d40: ba 20 08 00 mv r1,r17 <== NOT EXECUTED
if (tty->column)
8005d44: 44 40 00 03 be r2,r0,8005d50 <erase+0x154> <== NOT EXECUTED
tty->column--;
8005d48: 34 42 ff ff addi r2,r2,-1 <== NOT EXECUTED
8005d4c: 59 62 00 28 sw (r11+40),r2 <== NOT EXECUTED
}
if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) {
8005d50: 29 e2 00 00 lw r2,(r15+0) <== NOT EXECUTED
8005d54: b4 4c 60 00 add r12,r2,r12 <== NOT EXECUTED
8005d58: 41 82 00 00 lbu r2,(r12+0) <== NOT EXECUTED
8005d5c: 20 42 00 20 andi r2,r2,0x20 <== NOT EXECUTED
8005d60: 44 40 00 04 be r2,r0,8005d70 <erase+0x174> <== NOT EXECUTED
8005d64: 29 62 00 3c lw r2,(r11+60) <== NOT EXECUTED
8005d68: 20 42 02 00 andi r2,r2,0x200 <== NOT EXECUTED
8005d6c: 44 40 ff ce be r2,r0,8005ca4 <erase+0xa8> <== NOT EXECUTED
rtems_termios_puts ("\b \b", 3, tty);
8005d70: 34 02 00 03 mvi r2,3
8005d74: b9 60 18 00 mv r3,r11
8005d78: fb ff fe be calli 8005870 <rtems_termios_puts>
if (tty->column)
8005d7c: 29 61 00 28 lw r1,(r11+40)
8005d80: 44 20 ff c9 be r1,r0,8005ca4 <erase+0xa8> <== NEVER TAKEN
tty->column--;
8005d84: 34 21 ff ff addi r1,r1,-1
8005d88: 59 61 00 28 sw (r11+40),r1
8005d8c: e3 ff ff c6 bi 8005ca4 <erase+0xa8>
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
int col = tty->read_start_column;
8005d90: 29 6c 00 2c lw r12,(r11+44)
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
8005d94: 44 80 00 0f be r4,r0,8005dd0 <erase+0x1d4>
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
8005d98: 29 e1 00 00 lw r1,(r15+0)
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
int col = tty->read_start_column;
int i = 0;
8005d9c: 34 03 00 00 mvi r3,0
while (i != tty->ccount) {
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
if (tty->termios.c_lflag & ECHOCTL)
8005da0: 20 a5 02 00 andi r5,r5,0x200
* Erase a character or line
* FIXME: Needs support for WERASE and ECHOPRT.
* FIXME: Some of the tests should check for IEXTEN, too.
*/
static void
erase (struct rtems_termios_tty *tty, int lineFlag)
8005da4: b4 e3 10 00 add r2,r7,r3
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
8005da8: 40 46 00 00 lbu r6,(r2+0)
8005dac: 34 63 00 01 addi r3,r3,1
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
8005db0: b4 26 10 00 add r2,r1,r6
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
if (c == '\t') {
8005db4: 44 d0 00 15 be r6,r16,8005e08 <erase+0x20c>
col = (col | 7) + 1;
} else if (iscntrl (c)) {
8005db8: 40 42 00 01 lbu r2,(r2+1)
8005dbc: 20 42 00 20 andi r2,r2,0x20
8005dc0: 44 40 00 0f be r2,r0,8005dfc <erase+0x200> <== ALWAYS TAKEN
if (tty->termios.c_lflag & ECHOCTL)
8005dc4: 44 a0 00 02 be r5,r0,8005dcc <erase+0x1d0> <== NOT EXECUTED
col += 2;
8005dc8: 35 8c 00 02 addi r12,r12,2 <== NOT EXECUTED
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
8005dcc: 5c 83 ff f6 bne r4,r3,8005da4 <erase+0x1a8> <== NOT EXECUTED
}
/*
* Back up over the tab
*/
while (tty->column > col) {
8005dd0: 29 61 00 28 lw r1,(r11+40)
8005dd4: 4d 81 ff b4 bge r12,r1,8005ca4 <erase+0xa8> <== NEVER TAKEN
rtems_termios_puts ("\b", 1, tty);
8005dd8: b9 60 18 00 mv r3,r11
8005ddc: b9 c0 08 00 mv r1,r14
8005de0: 34 02 00 01 mvi r2,1
8005de4: fb ff fe a3 calli 8005870 <rtems_termios_puts>
tty->column--;
8005de8: 29 63 00 28 lw r3,(r11+40)
8005dec: 34 63 ff ff addi r3,r3,-1
8005df0: 59 63 00 28 sw (r11+40),r3
}
/*
* Back up over the tab
*/
while (tty->column > col) {
8005df4: 48 6c ff f9 bg r3,r12,8005dd8 <erase+0x1dc>
8005df8: e3 ff ff ab bi 8005ca4 <erase+0xa8>
col = (col | 7) + 1;
} else if (iscntrl (c)) {
if (tty->termios.c_lflag & ECHOCTL)
col += 2;
} else {
col++;
8005dfc: 35 8c 00 01 addi r12,r12,1
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
8005e00: 5c 83 ff e9 bne r4,r3,8005da4 <erase+0x1a8>
8005e04: e3 ff ff f3 bi 8005dd0 <erase+0x1d4>
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
8005e08: 39 8c 00 07 ori r12,r12,0x7
8005e0c: 35 8c 00 01 addi r12,r12,1
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
8005e10: 5c 83 ff e5 bne r4,r3,8005da4 <erase+0x1a8> <== ALWAYS TAKEN
8005e14: e3 ff ff ef bi 8005dd0 <erase+0x1d4> <== NOT EXECUTED
{
if (tty->ccount == 0)
return;
if (lineFlag) {
if (!(tty->termios.c_lflag & ECHO)) {
tty->ccount = 0;
8005e18: 58 20 00 20 sw (r1+32),r0 <== NOT EXECUTED
return;
8005e1c: e3 ff ff ab bi 8005cc8 <erase+0xcc> <== NOT EXECUTED
08002018 <fcntl>:
int fcntl(
int fd,
int cmd,
...
)
{
8002018: 37 9c ff d0 addi sp,sp,-48
800201c: 5b 8b 00 10 sw (sp+16),r11
8002020: 5b 8c 00 0c sw (sp+12),r12
8002024: 5b 8d 00 08 sw (sp+8),r13
8002028: 5b 9d 00 04 sw (sp+4),ra
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
800202c: 78 09 08 01 mvhi r9,0x801
8002030: 39 29 60 10 ori r9,r9,0x6010
8002034: 29 29 00 00 lw r9,(r9+0)
int fcntl(
int fd,
int cmd,
...
)
{
8002038: 5b 85 00 24 sw (sp+36),r5
800203c: 5b 82 00 18 sw (sp+24),r2
8002040: 5b 83 00 1c sw (sp+28),r3
8002044: 5b 84 00 20 sw (sp+32),r4
8002048: 5b 86 00 28 sw (sp+40),r6
800204c: 5b 87 00 2c sw (sp+44),r7
8002050: 5b 88 00 30 sw (sp+48),r8
int ret;
va_list ap;
va_start( ap, cmd );
8002054: 37 85 00 1c addi r5,sp,28
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
8002058: 55 21 00 06 bgu r9,r1,8002070 <fcntl+0x58>
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open(iop);
800205c: f8 00 30 50 calli 800e19c <__errno>
8002060: 34 02 00 09 mvi r2,9
8002064: 58 22 00 00 sw (r1+0),r2
8002068: 34 0c ff ff mvi r12,-1
800206c: e0 00 00 1b bi 80020d8 <fcntl+0xc0>
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
8002070: b4 21 18 00 add r3,r1,r1
8002074: 78 0c 08 01 mvhi r12,0x801
8002078: b4 63 18 00 add r3,r3,r3
800207c: 39 8c 67 2c ori r12,r12,0x672c
8002080: b4 63 18 00 add r3,r3,r3
8002084: 29 86 00 00 lw r6,(r12+0)
8002088: b4 63 18 00 add r3,r3,r3
800208c: b4 63 18 00 add r3,r3,r3
8002090: b4 63 18 00 add r3,r3,r3
8002094: b4 c3 58 00 add r11,r6,r3
rtems_libio_check_is_open(iop);
8002098: 29 61 00 18 lw r1,(r11+24)
800209c: 20 23 01 00 andi r3,r1,0x100
80020a0: 44 60 ff ef be r3,r0,800205c <fcntl+0x44>
/*
* This switch should contain all the cases from POSIX.
*/
switch ( cmd ) {
80020a4: 34 03 00 09 mvi r3,9
80020a8: 54 43 00 58 bgu r2,r3,8002208 <fcntl+0x1f0>
80020ac: 78 04 08 01 mvhi r4,0x801
80020b0: b4 42 18 00 add r3,r2,r2
80020b4: 38 84 52 38 ori r4,r4,0x5238
80020b8: b4 63 18 00 add r3,r3,r3
80020bc: b4 83 18 00 add r3,r4,r3
80020c0: 28 63 00 00 lw r3,(r3+0)
80020c4: c0 60 00 00 b r3
errno = ENOTSUP;
ret = -1;
break;
case F_GETOWN: /* for sockets. */
errno = ENOTSUP;
80020c8: f8 00 30 35 calli 800e19c <__errno>
80020cc: 34 02 00 86 mvi r2,134
80020d0: 58 22 00 00 sw (r1+0),r2
if (ret >= 0) {
int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop );
if (err) {
errno = err;
ret = -1;
80020d4: 34 0c ff ff mvi r12,-1
va_list ap;
va_start( ap, cmd );
ret = vfcntl(fd,cmd,ap);
va_end(ap);
return ret;
}
80020d8: b9 80 08 00 mv r1,r12
80020dc: 2b 9d 00 04 lw ra,(sp+4)
80020e0: 2b 8b 00 10 lw r11,(sp+16)
80020e4: 2b 8c 00 0c lw r12,(sp+12)
80020e8: 2b 8d 00 08 lw r13,(sp+8)
80020ec: 37 9c 00 30 addi sp,sp,48
80020f0: c3 a0 00 00 ret
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
break;
case F_SETFL:
flags = rtems_libio_fcntl_flags( va_arg( ap, int ) );
80020f4: 28 a1 00 00 lw r1,(r5+0)
80020f8: 5b 82 00 14 sw (sp+20),r2
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
int flags;
int mask;
int ret = 0;
80020fc: 34 0c 00 00 mvi r12,0
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
break;
case F_SETFL:
flags = rtems_libio_fcntl_flags( va_arg( ap, int ) );
8002100: f8 00 01 bd calli 80027f4 <rtems_libio_fcntl_flags>
/*
* XXX If we are turning on append, should we seek to the end?
*/
iop->flags = (iop->flags & ~mask) | (flags & mask);
8002104: 29 64 00 18 lw r4,(r11+24)
8002108: 34 03 fd fe mvi r3,-514
800210c: 20 21 02 01 andi r1,r1,0x201
8002110: a0 64 18 00 and r3,r3,r4
8002114: 2b 82 00 14 lw r2,(sp+20)
8002118: b8 23 08 00 or r1,r1,r3
800211c: 59 61 00 18 sw (r11+24),r1
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop );
8002120: 29 63 00 24 lw r3,(r11+36)
8002124: b8 40 08 00 mv r1,r2
8002128: b9 60 10 00 mv r2,r11
800212c: 28 63 00 30 lw r3,(r3+48)
8002130: d8 60 00 00 call r3
8002134: b8 20 58 00 mv r11,r1
if (err) {
8002138: 44 20 ff e8 be r1,r0,80020d8 <fcntl+0xc0> <== ALWAYS TAKEN
errno = err;
800213c: f8 00 30 18 calli 800e19c <__errno> <== NOT EXECUTED
8002140: 58 2b 00 00 sw (r1+0),r11 <== NOT EXECUTED
8002144: e3 ff ff e4 bi 80020d4 <fcntl+0xbc> <== NOT EXECUTED
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
break;
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
8002148: 5b 82 00 14 sw (sp+20),r2
800214c: f8 00 01 c0 calli 800284c <rtems_libio_to_fcntl_flags>
8002150: b8 20 60 00 mv r12,r1
8002154: 2b 82 00 14 lw r2,(sp+20)
/*
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
8002158: 48 0c ff e0 bg r0,r12,80020d8 <fcntl+0xc0> <== NEVER TAKEN
800215c: e3 ff ff f1 bi 8002120 <fcntl+0x108>
* if a new process is exec()'ed. Since RTEMS does not support
* processes, then we can ignore this one except to make
* F_GETFD work.
*/
if ( va_arg( ap, int ) )
8002160: 28 a3 00 00 lw r3,(r5+0)
8002164: 44 60 00 2d be r3,r0,8002218 <fcntl+0x200>
iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC;
8002168: 38 21 08 00 ori r1,r1,0x800
800216c: 59 61 00 18 sw (r11+24),r1
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
int flags;
int mask;
int ret = 0;
8002170: 34 0c 00 00 mvi r12,0
8002174: e3 ff ff eb bi 8002120 <fcntl+0x108>
diop->pathinfo = iop->pathinfo;
ret = (int) (diop - rtems_libio_iops);
break;
case F_GETFD: /* get f_flags */
ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0);
8002178: 20 2c 08 00 andi r12,r1,0x800
800217c: 7d 8c 00 00 cmpnei r12,r12,0
8002180: e3 ff ff e8 bi 8002120 <fcntl+0x108>
* This switch should contain all the cases from POSIX.
*/
switch ( cmd ) {
case F_DUPFD: /* dup */
fd2 = va_arg( ap, int );
8002184: 28 ad 00 00 lw r13,(r5+0)
if ( fd2 )
8002188: 45 a0 00 29 be r13,r0,800222c <fcntl+0x214>
diop = rtems_libio_iop( fd2 );
800218c: 34 0c 00 00 mvi r12,0
8002190: 34 03 00 00 mvi r3,0
8002194: 51 a9 00 09 bgeu r13,r9,80021b8 <fcntl+0x1a0> <== NEVER TAKEN
8002198: b5 ad 18 00 add r3,r13,r13
800219c: b4 63 18 00 add r3,r3,r3
80021a0: b4 63 18 00 add r3,r3,r3
80021a4: b4 63 18 00 add r3,r3,r3
80021a8: b4 63 18 00 add r3,r3,r3
80021ac: b4 63 18 00 add r3,r3,r3
80021b0: b4 c3 18 00 add r3,r6,r3
80021b4: b8 60 60 00 mv r12,r3
break;
}
}
diop->flags = iop->flags;
diop->pathinfo = iop->pathinfo;
80021b8: 29 64 00 1c lw r4,(r11+28)
ret = (int) (diop - rtems_libio_iops);
80021bc: c9 86 60 00 sub r12,r12,r6
80021c0: 15 8c 00 01 sri r12,r12,1
break;
}
}
diop->flags = iop->flags;
diop->pathinfo = iop->pathinfo;
80021c4: 58 64 00 1c sw (r3+28),r4
80021c8: 29 64 00 20 lw r4,(r11+32)
ret = -1;
break;
}
}
diop->flags = iop->flags;
80021cc: 58 61 00 18 sw (r3+24),r1
diop->pathinfo = iop->pathinfo;
ret = (int) (diop - rtems_libio_iops);
80021d0: 15 8c 00 01 sri r12,r12,1
break;
}
}
diop->flags = iop->flags;
diop->pathinfo = iop->pathinfo;
80021d4: 58 64 00 20 sw (r3+32),r4
80021d8: 29 61 00 24 lw r1,(r11+36)
ret = (int) (diop - rtems_libio_iops);
80021dc: 15 8c 00 01 sri r12,r12,1
break;
}
}
diop->flags = iop->flags;
diop->pathinfo = iop->pathinfo;
80021e0: 58 61 00 24 sw (r3+36),r1
80021e4: 29 61 00 28 lw r1,(r11+40)
ret = (int) (diop - rtems_libio_iops);
80021e8: 15 8c 00 01 sri r12,r12,1
break;
}
}
diop->flags = iop->flags;
diop->pathinfo = iop->pathinfo;
80021ec: 58 61 00 28 sw (r3+40),r1
80021f0: 29 61 00 2c lw r1,(r11+44)
ret = (int) (diop - rtems_libio_iops);
80021f4: 15 8c 00 01 sri r12,r12,1
80021f8: 15 8c 00 01 sri r12,r12,1
break;
}
}
diop->flags = iop->flags;
diop->pathinfo = iop->pathinfo;
80021fc: 58 61 00 2c sw (r3+44),r1
/*
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
8002200: 48 0c ff b6 bg r0,r12,80020d8 <fcntl+0xc0> <== NEVER TAKEN
8002204: e3 ff ff c7 bi 8002120 <fcntl+0x108>
errno = ENOTSUP;
ret = -1;
break;
default:
errno = EINVAL;
8002208: f8 00 2f e5 calli 800e19c <__errno>
800220c: 34 02 00 16 mvi r2,22
8002210: 58 22 00 00 sw (r1+0),r2
8002214: e3 ff ff b0 bi 80020d4 <fcntl+0xbc>
*/
if ( va_arg( ap, int ) )
iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC;
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
8002218: 34 03 f7 ff mvi r3,-2049
800221c: a0 23 08 00 and r1,r1,r3
8002220: 59 61 00 18 sw (r11+24),r1
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
int flags;
int mask;
int ret = 0;
8002224: 34 0c 00 00 mvi r12,0
8002228: e3 ff ff be bi 8002120 <fcntl+0x108>
fd2 = va_arg( ap, int );
if ( fd2 )
diop = rtems_libio_iop( fd2 );
else {
/* allocate a file control block */
diop = rtems_libio_allocate();
800222c: 5b 82 00 14 sw (sp+20),r2
8002230: f8 00 01 9c calli 80028a0 <rtems_libio_allocate>
8002234: b8 20 18 00 mv r3,r1
if ( diop == 0 ) {
8002238: 2b 82 00 14 lw r2,(sp+20)
800223c: 44 2d ff a6 be r1,r13,80020d4 <fcntl+0xbc> <== NEVER TAKEN
8002240: 29 86 00 00 lw r6,(r12+0)
8002244: 29 61 00 18 lw r1,(r11+24)
8002248: b8 60 60 00 mv r12,r3
800224c: e3 ff ff db bi 80021b8 <fcntl+0x1a0>
0800a944 <fifo_open>:
*/
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
800a944: 37 9c ff d8 addi sp,sp,-40
800a948: 5b 8b 00 20 sw (sp+32),r11
800a94c: 5b 8c 00 1c sw (sp+28),r12
800a950: 5b 8d 00 18 sw (sp+24),r13
800a954: 5b 8e 00 14 sw (sp+20),r14
800a958: 5b 8f 00 10 sw (sp+16),r15
800a95c: 5b 90 00 0c sw (sp+12),r16
800a960: 5b 91 00 08 sw (sp+8),r17
800a964: 5b 9d 00 04 sw (sp+4),ra
static rtems_status_code pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
800a968: 78 0b 08 02 mvhi r11,0x802
800a96c: 39 6b 36 cc ori r11,r11,0x36cc
800a970: 29 6c 00 00 lw r12,(r11+0)
*/
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
800a974: b8 20 70 00 mv r14,r1
800a978: b8 40 68 00 mv r13,r2
static rtems_status_code pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
800a97c: 45 80 00 2c be r12,r0,800aa2c <fifo_open+0xe8>
rtems_libio_unlock();
}
if (sc == RTEMS_SUCCESSFUL) {
sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
800a980: b9 80 08 00 mv r1,r12
800a984: 34 02 00 00 mvi r2,0
800a988: 34 03 00 00 mvi r3,0
800a98c: fb ff ea fc calli 800557c <rtems_semaphore_obtain>
)
{
pipe_control_t *pipe;
int err = 0;
err = pipe_lock();
800a990: 34 0c ff f4 mvi r12,-12
if (sc == RTEMS_SUCCESSFUL) {
sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
}
if (sc == RTEMS_SUCCESSFUL) {
800a994: 5c 20 00 1b bne r1,r0,800aa00 <fifo_open+0xbc> <== NEVER TAKEN
err = pipe_lock();
if (err)
return err;
pipe = *pipep;
800a998: 29 cb 00 00 lw r11,(r14+0)
if (pipe == NULL) {
800a99c: 45 61 00 80 be r11,r1,800ab9c <fifo_open+0x258>
err = pipe_alloc(&pipe);
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
800a9a0: 29 61 00 28 lw r1,(r11+40)
800a9a4: 34 02 00 00 mvi r2,0
800a9a8: 34 03 00 00 mvi r3,0
800a9ac: fb ff ea f4 calli 800557c <rtems_semaphore_obtain>
800a9b0: 7c 21 00 00 cmpnei r1,r1,0
err = -EINTR;
if (*pipep == NULL) {
800a9b4: 29 c2 00 00 lw r2,(r14+0)
err = pipe_alloc(&pipe);
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
800a9b8: c8 01 60 00 sub r12,r0,r1
800a9bc: 34 03 ff fc mvi r3,-4
800a9c0: a1 83 60 00 and r12,r12,r3
err = -EINTR;
if (*pipep == NULL) {
800a9c4: 44 40 00 cb be r2,r0,800acf0 <fifo_open+0x3ac>
else
*pipep = pipe;
}
out:
pipe_unlock();
800a9c8: fb ff ff 89 calli 800a7ec <pipe_unlock>
pipe_control_t *pipe;
unsigned int prevCounter;
int err;
err = pipe_new(pipep);
if (err)
800a9cc: 5d 80 00 0d bne r12,r0,800aa00 <fifo_open+0xbc> <== NEVER TAKEN
return err;
pipe = *pipep;
switch (LIBIO_ACCMODE(iop)) {
800a9d0: 29 a1 00 18 lw r1,(r13+24)
800a9d4: 34 02 00 04 mvi r2,4
int err;
err = pipe_new(pipep);
if (err)
return err;
pipe = *pipep;
800a9d8: 29 cb 00 00 lw r11,(r14+0)
switch (LIBIO_ACCMODE(iop)) {
800a9dc: 20 21 00 06 andi r1,r1,0x6
800a9e0: 44 22 00 1f be r1,r2,800aa5c <fifo_open+0x118>
800a9e4: 34 02 00 06 mvi r2,6
800a9e8: 44 22 00 5b be r1,r2,800ab54 <fifo_open+0x210>
800a9ec: 34 02 00 02 mvi r2,2
800a9f0: 44 22 00 3c be r1,r2,800aae0 <fifo_open+0x19c> <== ALWAYS TAKEN
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
break;
}
PIPE_UNLOCK(pipe);
800a9f4: 29 61 00 28 lw r1,(r11+40)
return 0;
800a9f8: 34 0c 00 00 mvi r12,0
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
break;
}
PIPE_UNLOCK(pipe);
800a9fc: fb ff eb 3c calli 80056ec <rtems_semaphore_release>
return 0;
out_error:
pipe_release(pipep, iop);
return err;
}
800aa00: b9 80 08 00 mv r1,r12
800aa04: 2b 9d 00 04 lw ra,(sp+4)
800aa08: 2b 8b 00 20 lw r11,(sp+32)
800aa0c: 2b 8c 00 1c lw r12,(sp+28)
800aa10: 2b 8d 00 18 lw r13,(sp+24)
800aa14: 2b 8e 00 14 lw r14,(sp+20)
800aa18: 2b 8f 00 10 lw r15,(sp+16)
800aa1c: 2b 90 00 0c lw r16,(sp+12)
800aa20: 2b 91 00 08 lw r17,(sp+8)
800aa24: 37 9c 00 28 addi sp,sp,40
800aa28: c3 a0 00 00 ret
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
800aa2c: 78 0f 08 02 mvhi r15,0x802
800aa30: 39 ef 37 48 ori r15,r15,0x3748
800aa34: 29 e1 00 00 lw r1,(r15+0)
800aa38: 34 02 00 00 mvi r2,0
800aa3c: 34 03 00 00 mvi r3,0
800aa40: fb ff ea cf calli 800557c <rtems_semaphore_obtain>
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
800aa44: 29 61 00 00 lw r1,(r11+0)
800aa48: 44 2c 00 ae be r1,r12,800ad00 <fifo_open+0x3bc> <== ALWAYS TAKEN
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
800aa4c: 29 e1 00 00 lw r1,(r15+0) <== NOT EXECUTED
800aa50: fb ff eb 27 calli 80056ec <rtems_semaphore_release> <== NOT EXECUTED
800aa54: 29 6c 00 00 lw r12,(r11+0) <== NOT EXECUTED
800aa58: e3 ff ff ca bi 800a980 <fifo_open+0x3c> <== NOT EXECUTED
} while (prevCounter == pipe->writerCounter);
}
break;
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
800aa5c: 29 63 00 24 lw r3,(r11+36)
if (pipe->Writers ++ == 0)
800aa60: 29 61 00 14 lw r1,(r11+20)
} while (prevCounter == pipe->writerCounter);
}
break;
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
800aa64: 34 63 00 01 addi r3,r3,1
if (pipe->Writers ++ == 0)
800aa68: 34 22 00 01 addi r2,r1,1
} while (prevCounter == pipe->writerCounter);
}
break;
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
800aa6c: 59 63 00 24 sw (r11+36),r3
if (pipe->Writers ++ == 0)
800aa70: 59 62 00 14 sw (r11+20),r2
800aa74: 44 20 00 ba be r1,r0,800ad5c <fifo_open+0x418> <== ALWAYS TAKEN
PIPE_WAKEUPREADERS(pipe);
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
800aa78: 29 61 00 10 lw r1,(r11+16)
800aa7c: 5c 20 ff de bne r1,r0,800a9f4 <fifo_open+0xb0>
800aa80: 29 a2 00 18 lw r2,(r13+24)
800aa84: 20 42 00 01 andi r2,r2,0x1
800aa88: 5c 41 00 c5 bne r2,r1,800ad9c <fifo_open+0x458>
err = -ENXIO;
goto out_error;
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
800aa8c: 29 6f 00 20 lw r15,(r11+32)
800aa90: e0 00 00 06 bi 800aaa8 <fifo_open+0x164>
err = -EINTR;
do {
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
goto out_error;
if (! PIPE_LOCK(pipe))
800aa94: 29 61 00 28 lw r1,(r11+40)
800aa98: fb ff ea b9 calli 800557c <rtems_semaphore_obtain>
800aa9c: 5c 2c 00 0c bne r1,r12,800aacc <fifo_open+0x188> <== NEVER TAKEN
goto out_error;
} while (prevCounter == pipe->readerCounter);
800aaa0: 29 61 00 20 lw r1,(r11+32)
800aaa4: 5c 2f ff d4 bne r1,r15,800a9f4 <fifo_open+0xb0> <== ALWAYS TAKEN
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
do {
PIPE_UNLOCK(pipe);
800aaa8: 29 61 00 28 lw r1,(r11+40)
800aaac: fb ff eb 10 calli 80056ec <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
800aab0: 29 61 00 30 lw r1,(r11+48)
800aab4: 34 02 00 00 mvi r2,0
800aab8: f8 00 08 50 calli 800cbf8 <rtems_barrier_wait>
800aabc: b8 20 60 00 mv r12,r1
goto out_error;
if (! PIPE_LOCK(pipe))
800aac0: 34 02 00 00 mvi r2,0
800aac4: 34 03 00 00 mvi r3,0
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
do {
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
800aac8: 44 20 ff f3 be r1,r0,800aa94 <fifo_open+0x150> <== ALWAYS TAKEN
goto out_error;
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
800aacc: 34 0c ff fc mvi r12,-4 <== NOT EXECUTED
PIPE_UNLOCK(pipe);
return 0;
out_error:
pipe_release(pipep, iop);
800aad0: b9 c0 08 00 mv r1,r14
800aad4: b9 a0 10 00 mv r2,r13
800aad8: fb ff ff 4e calli 800a810 <pipe_release>
return err;
800aadc: e3 ff ff c9 bi 800aa00 <fifo_open+0xbc>
return err;
pipe = *pipep;
switch (LIBIO_ACCMODE(iop)) {
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
800aae0: 29 63 00 20 lw r3,(r11+32)
if (pipe->Readers ++ == 0)
800aae4: 29 61 00 10 lw r1,(r11+16)
return err;
pipe = *pipep;
switch (LIBIO_ACCMODE(iop)) {
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
800aae8: 34 63 00 01 addi r3,r3,1
if (pipe->Readers ++ == 0)
800aaec: 34 22 00 01 addi r2,r1,1
return err;
pipe = *pipep;
switch (LIBIO_ACCMODE(iop)) {
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
800aaf0: 59 63 00 20 sw (r11+32),r3
if (pipe->Readers ++ == 0)
800aaf4: 59 62 00 10 sw (r11+16),r2
800aaf8: 44 20 00 91 be r1,r0,800ad3c <fifo_open+0x3f8> <== ALWAYS TAKEN
PIPE_WAKEUPWRITERS(pipe);
if (pipe->Writers == 0) {
800aafc: 29 61 00 14 lw r1,(r11+20)
800ab00: 5c 20 ff bd bne r1,r0,800a9f4 <fifo_open+0xb0>
/* Not an error */
if (LIBIO_NODELAY(iop))
800ab04: 29 a2 00 18 lw r2,(r13+24)
800ab08: 20 42 00 01 andi r2,r2,0x1
800ab0c: 5c 41 ff ba bne r2,r1,800a9f4 <fifo_open+0xb0>
break;
prevCounter = pipe->writerCounter;
800ab10: 29 6f 00 24 lw r15,(r11+36)
800ab14: e0 00 00 06 bi 800ab2c <fifo_open+0x1e8>
/* Wait until a writer opens the pipe */
do {
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
goto out_error;
if (! PIPE_LOCK(pipe))
800ab18: 29 61 00 28 lw r1,(r11+40)
800ab1c: fb ff ea 98 calli 800557c <rtems_semaphore_obtain>
800ab20: 5c 2c ff eb bne r1,r12,800aacc <fifo_open+0x188> <== NEVER TAKEN
goto out_error;
} while (prevCounter == pipe->writerCounter);
800ab24: 29 61 00 24 lw r1,(r11+36)
800ab28: 5c 2f ff b3 bne r1,r15,800a9f4 <fifo_open+0xb0> <== ALWAYS TAKEN
prevCounter = pipe->writerCounter;
err = -EINTR;
/* Wait until a writer opens the pipe */
do {
PIPE_UNLOCK(pipe);
800ab2c: 29 61 00 28 lw r1,(r11+40)
800ab30: fb ff ea ef calli 80056ec <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
800ab34: 29 61 00 2c lw r1,(r11+44)
800ab38: 34 02 00 00 mvi r2,0
800ab3c: f8 00 08 2f calli 800cbf8 <rtems_barrier_wait>
800ab40: b8 20 60 00 mv r12,r1
goto out_error;
if (! PIPE_LOCK(pipe))
800ab44: 34 02 00 00 mvi r2,0
800ab48: 34 03 00 00 mvi r3,0
prevCounter = pipe->writerCounter;
err = -EINTR;
/* Wait until a writer opens the pipe */
do {
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
800ab4c: 44 20 ff f3 be r1,r0,800ab18 <fifo_open+0x1d4> <== ALWAYS TAKEN
800ab50: e3 ff ff df bi 800aacc <fifo_open+0x188> <== NOT EXECUTED
} while (prevCounter == pipe->readerCounter);
}
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
800ab54: 29 63 00 20 lw r3,(r11+32)
if (pipe->Readers ++ == 0)
800ab58: 29 61 00 10 lw r1,(r11+16)
} while (prevCounter == pipe->readerCounter);
}
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
800ab5c: 34 63 00 01 addi r3,r3,1
if (pipe->Readers ++ == 0)
800ab60: 34 22 00 01 addi r2,r1,1
} while (prevCounter == pipe->readerCounter);
}
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
800ab64: 59 63 00 20 sw (r11+32),r3
if (pipe->Readers ++ == 0)
800ab68: 59 62 00 10 sw (r11+16),r2
800ab6c: 44 20 00 78 be r1,r0,800ad4c <fifo_open+0x408> <== ALWAYS TAKEN
PIPE_WAKEUPWRITERS(pipe);
pipe->writerCounter ++;
800ab70: 29 63 00 24 lw r3,(r11+36)
if (pipe->Writers ++ == 0)
800ab74: 29 61 00 14 lw r1,(r11+20)
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
if (pipe->Readers ++ == 0)
PIPE_WAKEUPWRITERS(pipe);
pipe->writerCounter ++;
800ab78: 34 63 00 01 addi r3,r3,1
if (pipe->Writers ++ == 0)
800ab7c: 34 22 00 01 addi r2,r1,1
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
if (pipe->Readers ++ == 0)
PIPE_WAKEUPWRITERS(pipe);
pipe->writerCounter ++;
800ab80: 59 63 00 24 sw (r11+36),r3
if (pipe->Writers ++ == 0)
800ab84: 59 62 00 14 sw (r11+20),r2
800ab88: 5c 20 ff 9b bne r1,r0,800a9f4 <fifo_open+0xb0> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
800ab8c: 29 61 00 2c lw r1,(r11+44)
800ab90: 37 82 00 28 addi r2,sp,40
800ab94: f8 00 07 f8 calli 800cb74 <rtems_barrier_release>
800ab98: e3 ff ff 97 bi 800a9f4 <fifo_open+0xb0>
{
static char c = 'a';
pipe_control_t *pipe;
int err = -ENOMEM;
pipe = malloc(sizeof(pipe_control_t));
800ab9c: 34 01 00 34 mvi r1,52
800aba0: fb ff e4 df calli 8003f1c <malloc>
800aba4: b8 20 58 00 mv r11,r1
800aba8: b8 20 88 00 mv r17,r1
if (pipe == NULL)
800abac: 44 20 00 88 be r1,r0,800adcc <fifo_open+0x488>
return err;
memset(pipe, 0, sizeof(pipe_control_t));
800abb0: 58 20 00 00 sw (r1+0),r0
800abb4: 58 20 00 08 sw (r1+8),r0
800abb8: 58 20 00 0c sw (r1+12),r0
800abbc: 58 20 00 10 sw (r1+16),r0
800abc0: 58 20 00 14 sw (r1+20),r0
800abc4: 58 20 00 18 sw (r1+24),r0
800abc8: 58 20 00 1c sw (r1+28),r0
800abcc: 58 20 00 20 sw (r1+32),r0
800abd0: 58 20 00 24 sw (r1+36),r0
800abd4: 58 20 00 28 sw (r1+40),r0
800abd8: 58 20 00 2c sw (r1+44),r0
800abdc: 58 20 00 30 sw (r1+48),r0
pipe->Size = PIPE_BUF;
800abe0: 34 01 02 00 mvi r1,512
800abe4: 59 61 00 04 sw (r11+4),r1
pipe->Buffer = malloc(pipe->Size);
800abe8: fb ff e4 cd calli 8003f1c <malloc>
800abec: 59 61 00 00 sw (r11+0),r1
if (! pipe->Buffer)
800abf0: 44 20 00 75 be r1,r0,800adc4 <fifo_open+0x480> <== NEVER TAKEN
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'r', c),
800abf4: 78 0c 08 02 mvhi r12,0x802
if (! pipe->Buffer)
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
800abf8: 78 05 08 02 mvhi r5,0x802
800abfc: 38 a5 20 f4 ori r5,r5,0x20f4
rtems_build_name ('P', 'I', 'r', c),
800ac00: 39 8c 31 24 ori r12,r12,0x3124
800ac04: 41 84 00 00 lbu r4,(r12+0)
if (! pipe->Buffer)
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
800ac08: 28 a1 00 00 lw r1,(r5+0)
800ac0c: 34 02 00 00 mvi r2,0
800ac10: 34 03 00 00 mvi r3,0
800ac14: b8 81 08 00 or r1,r4,r1
800ac18: 35 64 00 2c addi r4,r11,44
800ac1c: f8 00 07 5f calli 800c998 <rtems_barrier_create>
800ac20: b8 20 78 00 mv r15,r1
800ac24: 5c 20 00 66 bne r1,r0,800adbc <fifo_open+0x478>
rtems_build_name ('P', 'I', 'r', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->readBarrier) != RTEMS_SUCCESSFUL)
goto err_rbar;
if (rtems_barrier_create(
800ac28: 78 05 08 02 mvhi r5,0x802
800ac2c: 38 a5 20 f8 ori r5,r5,0x20f8
rtems_build_name ('P', 'I', 'w', c),
800ac30: 41 84 00 00 lbu r4,(r12+0)
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'r', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->readBarrier) != RTEMS_SUCCESSFUL)
goto err_rbar;
if (rtems_barrier_create(
800ac34: 28 a1 00 00 lw r1,(r5+0)
800ac38: 34 02 00 00 mvi r2,0
800ac3c: 34 03 00 00 mvi r3,0
800ac40: b8 81 08 00 or r1,r4,r1
800ac44: 35 64 00 30 addi r4,r11,48
800ac48: f8 00 07 54 calli 800c998 <rtems_barrier_create>
800ac4c: b8 20 80 00 mv r16,r1
800ac50: 5c 2f 00 59 bne r1,r15,800adb4 <fifo_open+0x470>
rtems_build_name ('P', 'I', 'w', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
if (rtems_semaphore_create(
800ac54: 78 05 08 02 mvhi r5,0x802
800ac58: 38 a5 20 fc ori r5,r5,0x20fc
rtems_build_name ('P', 'I', 's', c), 1,
800ac5c: 41 84 00 00 lbu r4,(r12+0)
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'w', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
if (rtems_semaphore_create(
800ac60: 28 a1 00 00 lw r1,(r5+0)
800ac64: 34 02 00 01 mvi r2,1
800ac68: 34 03 00 10 mvi r3,16
800ac6c: b8 81 08 00 or r1,r4,r1
800ac70: 35 65 00 28 addi r5,r11,40
800ac74: 34 04 00 00 mvi r4,0
800ac78: fb ff e9 86 calli 8005290 <rtems_semaphore_create>
800ac7c: 5c 30 00 4c bne r1,r16,800adac <fifo_open+0x468>
Objects_Id id,
Objects_Locations *location
)
{
return (Barrier_Control *)
_Objects_Get( &_Barrier_Information, id, location );
800ac80: 29 62 00 2c lw r2,(r11+44)
800ac84: 78 0f 08 02 mvhi r15,0x802
800ac88: 39 ef 41 38 ori r15,r15,0x4138
/* Set barriers to be interruptible by signals. */
static void pipe_interruptible(pipe_control_t *pipe)
{
Objects_Locations location;
_Barrier_Get(pipe->readBarrier, &location)->Barrier.Wait_queue.state
800ac8c: 37 91 00 24 addi r17,sp,36
800ac90: ba 20 18 00 mv r3,r17
800ac94: b9 e0 08 00 mv r1,r15
800ac98: fb ff f0 de calli 8007010 <_Objects_Get>
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
800ac9c: 28 22 00 4c lw r2,(r1+76)
800aca0: 78 10 10 00 mvhi r16,0x1000
800aca4: b8 50 10 00 or r2,r2,r16
800aca8: 58 22 00 4c sw (r1+76),r2
_Thread_Enable_dispatch();
800acac: fb ff f4 26 calli 8007d44 <_Thread_Enable_dispatch>
800acb0: 29 62 00 30 lw r2,(r11+48)
800acb4: ba 20 18 00 mv r3,r17
800acb8: b9 e0 08 00 mv r1,r15
800acbc: fb ff f0 d5 calli 8007010 <_Objects_Get>
_Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
800acc0: 28 22 00 4c lw r2,(r1+76)
800acc4: b8 50 80 00 or r16,r2,r16
800acc8: 58 30 00 4c sw (r1+76),r16
_Thread_Enable_dispatch();
800accc: fb ff f4 1e calli 8007d44 <_Thread_Enable_dispatch>
#ifdef RTEMS_POSIX_API
pipe_interruptible(pipe);
#endif
*pipep = pipe;
if (c ++ == 'z')
800acd0: 41 81 00 00 lbu r1,(r12+0)
800acd4: 34 22 00 01 addi r2,r1,1
800acd8: 31 82 00 00 sb (r12+0),r2
800acdc: 34 02 00 7a mvi r2,122
800ace0: 5c 22 ff 30 bne r1,r2,800a9a0 <fifo_open+0x5c>
c = 'a';
800ace4: 34 01 00 61 mvi r1,97
800ace8: 31 81 00 00 sb (r12+0),r1
800acec: e3 ff ff 2d bi 800a9a0 <fifo_open+0x5c>
if (! PIPE_LOCK(pipe))
err = -EINTR;
if (*pipep == NULL) {
if (err)
800acf0: 5d 82 00 1f bne r12,r2,800ad6c <fifo_open+0x428> <== NEVER TAKEN
pipe_free(pipe);
else
*pipep = pipe;
800acf4: 59 cb 00 00 sw (r14+0),r11
}
out:
pipe_unlock();
800acf8: fb ff fe bd calli 800a7ec <pipe_unlock>
800acfc: e3 ff ff 35 bi 800a9d0 <fifo_open+0x8c>
if (pipe_semaphore == RTEMS_ID_NONE) {
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
sc = rtems_semaphore_create(
800ad00: 78 02 08 02 mvhi r2,0x802
800ad04: 38 42 20 f0 ori r2,r2,0x20f0
800ad08: 28 41 00 00 lw r1,(r2+0)
800ad0c: 34 03 00 54 mvi r3,84
800ad10: 34 02 00 01 mvi r2,1
800ad14: 34 04 00 00 mvi r4,0
800ad18: b9 60 28 00 mv r5,r11
800ad1c: fb ff e9 5d calli 8005290 <rtems_semaphore_create>
800ad20: b8 20 80 00 mv r16,r1
800ad24: 29 e1 00 00 lw r1,(r15+0)
)
{
pipe_control_t *pipe;
int err = 0;
err = pipe_lock();
800ad28: 34 0c ff f4 mvi r12,-12
800ad2c: fb ff ea 70 calli 80056ec <rtems_semaphore_release>
}
rtems_libio_unlock();
}
if (sc == RTEMS_SUCCESSFUL) {
800ad30: 5e 00 ff 34 bne r16,r0,800aa00 <fifo_open+0xbc>
800ad34: 29 6c 00 00 lw r12,(r11+0)
800ad38: e3 ff ff 12 bi 800a980 <fifo_open+0x3c>
switch (LIBIO_ACCMODE(iop)) {
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
if (pipe->Readers ++ == 0)
PIPE_WAKEUPWRITERS(pipe);
800ad3c: 29 61 00 30 lw r1,(r11+48)
800ad40: 37 82 00 28 addi r2,sp,40
800ad44: f8 00 07 8c calli 800cb74 <rtems_barrier_release>
800ad48: e3 ff ff 6d bi 800aafc <fifo_open+0x1b8>
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
if (pipe->Readers ++ == 0)
PIPE_WAKEUPWRITERS(pipe);
800ad4c: 29 61 00 30 lw r1,(r11+48)
800ad50: 37 82 00 28 addi r2,sp,40
800ad54: f8 00 07 88 calli 800cb74 <rtems_barrier_release>
800ad58: e3 ff ff 86 bi 800ab70 <fifo_open+0x22c>
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
800ad5c: 29 61 00 2c lw r1,(r11+44)
800ad60: 37 82 00 28 addi r2,sp,40
800ad64: f8 00 07 84 calli 800cb74 <rtems_barrier_release>
800ad68: e3 ff ff 44 bi 800aa78 <fifo_open+0x134>
/* Called with pipe_semaphore held. */
static inline void pipe_free(
pipe_control_t *pipe
)
{
rtems_barrier_delete(pipe->readBarrier);
800ad6c: 29 61 00 2c lw r1,(r11+44) <== NOT EXECUTED
800ad70: f8 00 07 4d calli 800caa4 <rtems_barrier_delete> <== NOT EXECUTED
rtems_barrier_delete(pipe->writeBarrier);
800ad74: 29 61 00 30 lw r1,(r11+48) <== NOT EXECUTED
800ad78: f8 00 07 4b calli 800caa4 <rtems_barrier_delete> <== NOT EXECUTED
rtems_semaphore_delete(pipe->Semaphore);
800ad7c: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED
800ad80: fb ff e9 c8 calli 80054a0 <rtems_semaphore_delete> <== NOT EXECUTED
free(pipe->Buffer);
800ad84: 29 61 00 00 lw r1,(r11+0) <== NOT EXECUTED
800ad88: fb ff e1 f3 calli 8003554 <free> <== NOT EXECUTED
free(pipe);
800ad8c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800ad90: fb ff e1 f1 calli 8003554 <free> <== NOT EXECUTED
else
*pipep = pipe;
}
out:
pipe_unlock();
800ad94: fb ff fe 96 calli 800a7ec <pipe_unlock> <== NOT EXECUTED
800ad98: e3 ff ff 1a bi 800aa00 <fifo_open+0xbc> <== NOT EXECUTED
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
PIPE_UNLOCK(pipe);
800ad9c: 29 61 00 28 lw r1,(r11+40)
err = -ENXIO;
800ada0: 34 0c ff fa mvi r12,-6
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
PIPE_UNLOCK(pipe);
800ada4: fb ff ea 52 calli 80056ec <rtems_semaphore_release>
err = -ENXIO;
goto out_error;
800ada8: e3 ff ff 4a bi 800aad0 <fifo_open+0x18c>
if (c ++ == 'z')
c = 'a';
return 0;
err_sem:
rtems_barrier_delete(pipe->writeBarrier);
800adac: 29 61 00 30 lw r1,(r11+48)
800adb0: f8 00 07 3d calli 800caa4 <rtems_barrier_delete>
err_wbar:
rtems_barrier_delete(pipe->readBarrier);
800adb4: 2a 21 00 2c lw r1,(r17+44)
800adb8: f8 00 07 3b calli 800caa4 <rtems_barrier_delete>
err_rbar:
free(pipe->Buffer);
800adbc: 2a 21 00 00 lw r1,(r17+0)
800adc0: fb ff e1 e5 calli 8003554 <free>
err_buf:
free(pipe);
800adc4: ba 20 08 00 mv r1,r17
800adc8: fb ff e1 e3 calli 8003554 <free>
)
{
pipe_control_t *pipe;
int err = 0;
err = pipe_lock();
800adcc: 34 0c ff f4 mvi r12,-12
else
*pipep = pipe;
}
out:
pipe_unlock();
800add0: fb ff fe 87 calli 800a7ec <pipe_unlock>
800add4: e3 ff ff 0b bi 800aa00 <fifo_open+0xbc>
08002308 <fpathconf>:
long fpathconf(
int fd,
int name
)
{
8002308: 37 9c ff fc addi sp,sp,-4
800230c: 5b 9d 00 04 sw (sp+4),ra
long return_value;
rtems_libio_t *iop;
rtems_filesystem_limits_and_options_t *the_limits;
rtems_libio_check_fd(fd);
8002310: 78 03 08 01 mvhi r3,0x801
8002314: 38 63 60 10 ori r3,r3,0x6010
8002318: 28 63 00 00 lw r3,(r3+0)
800231c: 54 61 00 06 bgu r3,r1,8002334 <fpathconf+0x2c>
iop = rtems_libio_iop(fd);
rtems_libio_check_is_open(iop);
8002320: f8 00 2f 9f calli 800e19c <__errno>
8002324: 34 02 00 09 mvi r2,9
8002328: 58 22 00 00 sw (r1+0),r2
800232c: 34 01 ff ff mvi r1,-1
8002330: e0 00 00 1b bi 800239c <fpathconf+0x94>
long return_value;
rtems_libio_t *iop;
rtems_filesystem_limits_and_options_t *the_limits;
rtems_libio_check_fd(fd);
iop = rtems_libio_iop(fd);
8002334: b4 21 08 00 add r1,r1,r1
8002338: 78 03 08 01 mvhi r3,0x801
800233c: b4 21 08 00 add r1,r1,r1
8002340: 38 63 67 2c ori r3,r3,0x672c
8002344: b4 21 08 00 add r1,r1,r1
8002348: 28 63 00 00 lw r3,(r3+0)
800234c: b4 21 08 00 add r1,r1,r1
8002350: b4 21 08 00 add r1,r1,r1
8002354: b4 21 08 00 add r1,r1,r1
8002358: b4 61 08 00 add r1,r3,r1
rtems_libio_check_is_open(iop);
800235c: 28 23 00 18 lw r3,(r1+24)
8002360: 20 64 01 00 andi r4,r3,0x100
8002364: 44 80 ff ef be r4,r0,8002320 <fpathconf+0x18> <== NEVER TAKEN
rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
8002368: 20 63 00 02 andi r3,r3,0x2
800236c: 44 60 00 25 be r3,r0,8002400 <fpathconf+0xf8>
* Now process the information request.
*/
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
switch ( name ) {
8002370: 34 03 00 0b mvi r3,11
/*
* Now process the information request.
*/
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
8002374: 28 21 00 2c lw r1,(r1+44)
switch ( name ) {
8002378: 54 43 00 22 bgu r2,r3,8002400 <fpathconf+0xf8>
800237c: 78 03 08 01 mvhi r3,0x801
8002380: b4 42 10 00 add r2,r2,r2
8002384: 38 63 52 60 ori r3,r3,0x5260
8002388: b4 42 10 00 add r2,r2,r2
800238c: b4 62 10 00 add r2,r3,r2
8002390: 28 42 00 00 lw r2,(r2+0)
8002394: c0 40 00 00 b r2
break;
case _PC_ASYNC_IO:
return_value = the_limits->posix_async_io;
break;
case _PC_PRIO_IO:
return_value = the_limits->posix_prio_io;
8002398: 28 21 00 5c lw r1,(r1+92)
rtems_set_errno_and_return_minus_one( EINVAL );
break;
}
return return_value;
}
800239c: 2b 9d 00 04 lw ra,(sp+4)
80023a0: 37 9c 00 04 addi sp,sp,4
80023a4: c3 a0 00 00 ret
break;
case _PC_VDISABLE:
return_value = the_limits->posix_vdisable;
break;
case _PC_ASYNC_IO:
return_value = the_limits->posix_async_io;
80023a8: 28 21 00 50 lw r1,(r1+80)
break;
80023ac: e3 ff ff fc bi 800239c <fpathconf+0x94>
break;
case _PC_NO_TRUNC:
return_value = the_limits->posix_no_trunc;
break;
case _PC_VDISABLE:
return_value = the_limits->posix_vdisable;
80023b0: 28 21 00 64 lw r1,(r1+100)
break;
80023b4: e3 ff ff fa bi 800239c <fpathconf+0x94>
break;
case _PC_CHOWN_RESTRICTED:
return_value = the_limits->posix_chown_restrictions;
break;
case _PC_NO_TRUNC:
return_value = the_limits->posix_no_trunc;
80023b8: 28 21 00 58 lw r1,(r1+88)
break;
80023bc: e3 ff ff f8 bi 800239c <fpathconf+0x94>
break;
case _PC_PIPE_BUF:
return_value = the_limits->pipe_buf;
break;
case _PC_CHOWN_RESTRICTED:
return_value = the_limits->posix_chown_restrictions;
80023c0: 28 21 00 54 lw r1,(r1+84)
break;
80023c4: e3 ff ff f6 bi 800239c <fpathconf+0x94>
break;
case _PC_PATH_MAX:
return_value = the_limits->path_max;
break;
case _PC_PIPE_BUF:
return_value = the_limits->pipe_buf;
80023c8: 28 21 00 4c lw r1,(r1+76)
break;
80023cc: e3 ff ff f4 bi 800239c <fpathconf+0x94>
break;
case _PC_NAME_MAX:
return_value = the_limits->name_max;
break;
case _PC_PATH_MAX:
return_value = the_limits->path_max;
80023d0: 28 21 00 48 lw r1,(r1+72)
break;
80023d4: e3 ff ff f2 bi 800239c <fpathconf+0x94>
break;
case _PC_MAX_INPUT:
return_value = the_limits->max_input;
break;
case _PC_NAME_MAX:
return_value = the_limits->name_max;
80023d8: 28 21 00 44 lw r1,(r1+68)
break;
80023dc: e3 ff ff f0 bi 800239c <fpathconf+0x94>
break;
case _PC_MAX_CANON:
return_value = the_limits->max_canon;
break;
case _PC_MAX_INPUT:
return_value = the_limits->max_input;
80023e0: 28 21 00 40 lw r1,(r1+64)
break;
80023e4: e3 ff ff ee bi 800239c <fpathconf+0x94>
switch ( name ) {
case _PC_LINK_MAX:
return_value = the_limits->link_max;
break;
case _PC_MAX_CANON:
return_value = the_limits->max_canon;
80023e8: 28 21 00 3c lw r1,(r1+60)
break;
80023ec: e3 ff ff ec bi 800239c <fpathconf+0x94>
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
switch ( name ) {
case _PC_LINK_MAX:
return_value = the_limits->link_max;
80023f0: 28 21 00 38 lw r1,(r1+56)
break;
80023f4: e3 ff ff ea bi 800239c <fpathconf+0x94>
break;
case _PC_PRIO_IO:
return_value = the_limits->posix_prio_io;
break;
case _PC_SYNC_IO:
return_value = the_limits->posix_sync_io;
80023f8: 28 21 00 60 lw r1,(r1+96)
break;
80023fc: e3 ff ff e8 bi 800239c <fpathconf+0x94>
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8002400: f8 00 2f 67 calli 800e19c <__errno>
8002404: 34 02 00 16 mvi r2,22
8002408: 58 22 00 00 sw (r1+0),r2
800240c: 34 01 ff ff mvi r1,-1
8002410: e3 ff ff e3 bi 800239c <fpathconf+0x94>
080014a8 <free>:
#include <stdlib.h>
void free(
void *ptr
)
{
80014a8: 37 9c ff f4 addi sp,sp,-12
80014ac: 5b 8b 00 0c sw (sp+12),r11
80014b0: 5b 8c 00 08 sw (sp+8),r12
80014b4: 5b 9d 00 04 sw (sp+4),ra
MSBUMP(free_calls, 1);
80014b8: 78 03 08 01 mvhi r3,0x801
80014bc: 38 63 47 48 ori r3,r3,0x4748
80014c0: 28 62 00 0c lw r2,(r3+12)
#include <stdlib.h>
void free(
void *ptr
)
{
80014c4: b8 20 58 00 mv r11,r1
MSBUMP(free_calls, 1);
80014c8: 34 41 00 01 addi r1,r2,1
80014cc: 58 61 00 0c sw (r3+12),r1
if ( !ptr )
80014d0: 45 60 00 1a be r11,r0,8001538 <free+0x90>
return;
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
80014d4: 78 01 08 01 mvhi r1,0x801
80014d8: 38 21 4a 20 ori r1,r1,0x4a20
80014dc: 28 22 00 00 lw r2,(r1+0)
80014e0: 34 01 00 03 mvi r1,3
80014e4: 44 41 00 1a be r2,r1,800154c <free+0xa4> <== ALWAYS TAKEN
}
/*
* If configured, update the statistics
*/
if ( rtems_malloc_statistics_helpers )
80014e8: 78 01 08 01 mvhi r1,0x801
80014ec: 38 21 46 60 ori r1,r1,0x4660
80014f0: 28 21 00 00 lw r1,(r1+0)
80014f4: 44 20 00 04 be r1,r0,8001504 <free+0x5c>
(*rtems_malloc_statistics_helpers->at_free)(ptr);
80014f8: 28 22 00 08 lw r2,(r1+8)
80014fc: b9 60 08 00 mv r1,r11
8001500: d8 40 00 00 call r2
if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) {
8001504: 78 0c 08 01 mvhi r12,0x801
8001508: 39 8c 40 1c ori r12,r12,0x401c
800150c: 29 81 00 00 lw r1,(r12+0)
8001510: b9 60 10 00 mv r2,r11
8001514: f8 00 0e 66 calli 8004eac <_Protected_heap_Free>
8001518: 5c 20 00 08 bne r1,r0,8001538 <free+0x90>
printk( "Program heap: free of bad pointer %p -- range %p - %p \n",
ptr,
RTEMS_Malloc_Heap->area_begin,
800151c: 29 82 00 00 lw r2,(r12+0)
*/
if ( rtems_malloc_statistics_helpers )
(*rtems_malloc_statistics_helpers->at_free)(ptr);
if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) {
printk( "Program heap: free of bad pointer %p -- range %p - %p \n",
8001520: 78 01 08 01 mvhi r1,0x801
8001524: 38 21 33 f4 ori r1,r1,0x33f4
8001528: 28 43 00 18 lw r3,(r2+24)
800152c: 28 44 00 1c lw r4,(r2+28)
8001530: b9 60 10 00 mv r2,r11
8001534: f8 00 04 05 calli 8002548 <printk>
RTEMS_Malloc_Heap->area_begin,
RTEMS_Malloc_Heap->area_end
);
}
}
8001538: 2b 9d 00 04 lw ra,(sp+4)
800153c: 2b 8b 00 0c lw r11,(sp+12)
8001540: 2b 8c 00 08 lw r12,(sp+8)
8001544: 37 9c 00 0c addi sp,sp,12
8001548: c3 a0 00 00 ret
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
!malloc_is_system_state_OK() ) {
800154c: f8 00 00 6b calli 80016f8 <malloc_is_system_state_OK>
return;
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
8001550: 5c 20 ff e6 bne r1,r0,80014e8 <free+0x40>
!malloc_is_system_state_OK() ) {
malloc_deferred_free(ptr);
8001554: b9 60 08 00 mv r1,r11
8001558: f8 00 00 88 calli 8001778 <malloc_deferred_free>
return;
800155c: e3 ff ff f7 bi 8001538 <free+0x90>
08002cf4 <free_user_env>:
* NOTE: this must be called with
* thread dispatching disabled!
*/
static void
free_user_env(void *venv)
{
8002cf4: 37 9c ff f8 addi sp,sp,-8
8002cf8: 5b 8b 00 08 sw (sp+8),r11
8002cfc: 5b 9d 00 04 sw (sp+4),ra
rtems_user_env_t *env = (rtems_user_env_t*) venv ;
if (env != &rtems_global_user_env
8002d00: 78 02 08 01 mvhi r2,0x801
8002d04: 38 42 57 50 ori r2,r2,0x5750
* NOTE: this must be called with
* thread dispatching disabled!
*/
static void
free_user_env(void *venv)
{
8002d08: b8 20 58 00 mv r11,r1
rtems_user_env_t *env = (rtems_user_env_t*) venv ;
if (env != &rtems_global_user_env
8002d0c: 44 22 00 07 be r1,r2,8002d28 <free_user_env+0x34> <== NEVER TAKEN
#ifdef HAVE_USERENV_REFCNT
&& --env->refcnt <= 0
#endif
) {
rtems_filesystem_freenode( &env->current_directory);
8002d10: 34 21 00 04 addi r1,r1,4
8002d14: fb ff fa d6 calli 800186c <rtems_filesystem_freenode>
rtems_filesystem_freenode( &env->root_directory);
8002d18: 35 61 00 18 addi r1,r11,24
8002d1c: fb ff fa d4 calli 800186c <rtems_filesystem_freenode>
free(env);
8002d20: b9 60 08 00 mv r1,r11
8002d24: fb ff fa da calli 800188c <free>
}
}
8002d28: 2b 9d 00 04 lw ra,(sp+4)
8002d2c: 2b 8b 00 08 lw r11,(sp+8)
8002d30: 37 9c 00 08 addi sp,sp,8
8002d34: c3 a0 00 00 ret
08013fc0 <getdents>:
int getdents(
int dd_fd,
char *dd_buf,
int dd_len
)
{
8013fc0: 37 9c ff dc addi sp,sp,-36
8013fc4: 5b 8b 00 10 sw (sp+16),r11
8013fc8: 5b 8c 00 0c sw (sp+12),r12
8013fcc: 5b 8d 00 08 sw (sp+8),r13
8013fd0: 5b 9d 00 04 sw (sp+4),ra
rtems_filesystem_location_info_t loc;
/*
* Get the file control block structure associated with the file descriptor
*/
iop = rtems_libio_iop( dd_fd );
8013fd4: 78 04 08 01 mvhi r4,0x801
8013fd8: 38 84 70 10 ori r4,r4,0x7010
8013fdc: 28 84 00 00 lw r4,(r4+0)
int getdents(
int dd_fd,
char *dd_buf,
int dd_len
)
{
8013fe0: b8 40 68 00 mv r13,r2
8013fe4: b8 60 60 00 mv r12,r3
rtems_filesystem_location_info_t loc;
/*
* Get the file control block structure associated with the file descriptor
*/
iop = rtems_libio_iop( dd_fd );
8013fe8: 34 0b 00 00 mvi r11,0
8013fec: 50 24 00 0b bgeu r1,r4,8014018 <getdents+0x58> <== NEVER TAKEN
8013ff0: b4 21 08 00 add r1,r1,r1
8013ff4: 78 04 08 01 mvhi r4,0x801
8013ff8: b4 21 08 00 add r1,r1,r1
8013ffc: 38 84 78 48 ori r4,r4,0x7848
8014000: b4 21 08 00 add r1,r1,r1
8014004: b4 21 08 00 add r1,r1,r1
8014008: 28 8b 00 00 lw r11,(r4+0)
801400c: b4 21 08 00 add r1,r1,r1
8014010: b4 21 08 00 add r1,r1,r1
8014014: b5 61 58 00 add r11,r11,r1
/*
* Make sure we are working on a directory
*/
loc = iop->pathinfo;
8014018: 29 61 00 28 lw r1,(r11+40)
801401c: 29 66 00 1c lw r6,(r11+28)
8014020: 29 65 00 20 lw r5,(r11+32)
8014024: 29 63 00 24 lw r3,(r11+36)
8014028: 29 62 00 2c lw r2,(r11+44)
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
801402c: 28 24 00 10 lw r4,(r1+16)
iop = rtems_libio_iop( dd_fd );
/*
* Make sure we are working on a directory
*/
loc = iop->pathinfo;
8014030: 5b 81 00 20 sw (sp+32),r1
8014034: 5b 86 00 14 sw (sp+20),r6
8014038: 5b 85 00 18 sw (sp+24),r5
801403c: 5b 83 00 1c sw (sp+28),r3
8014040: 5b 82 00 24 sw (sp+36),r2
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
8014044: 37 81 00 14 addi r1,sp,20
8014048: d8 80 00 00 call r4
801404c: 34 04 00 01 mvi r4,1
8014050: 5c 24 00 0d bne r1,r4,8014084 <getdents+0xc4>
/*
* Return the number of bytes that were actually transfered as a result
* of the read attempt.
*/
return (*iop->pathinfo.handlers->read_h)( iop, dd_buf, dd_len );
8014054: 29 63 00 24 lw r3,(r11+36)
8014058: b9 60 08 00 mv r1,r11
801405c: b9 a0 10 00 mv r2,r13
8014060: 28 64 00 08 lw r4,(r3+8)
8014064: b9 80 18 00 mv r3,r12
8014068: d8 80 00 00 call r4
}
801406c: 2b 9d 00 04 lw ra,(sp+4)
8014070: 2b 8b 00 10 lw r11,(sp+16)
8014074: 2b 8c 00 0c lw r12,(sp+12)
8014078: 2b 8d 00 08 lw r13,(sp+8)
801407c: 37 9c 00 24 addi sp,sp,36
8014080: c3 a0 00 00 ret
/*
* Make sure we are working on a directory
*/
loc = iop->pathinfo;
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
rtems_set_errno_and_return_minus_one( ENOTDIR );
8014084: fb ff e6 fe calli 800dc7c <__errno>
8014088: 34 02 00 14 mvi r2,20
801408c: 58 22 00 00 sw (r1+0),r2
8014090: 34 01 ff ff mvi r1,-1
8014094: e3 ff ff f6 bi 801406c <getdents+0xac>
0800bc70 <imfs_dir_open>:
IMFS_jnode_t *the_jnode;
/* Is the node a directory ? */
the_jnode = (IMFS_jnode_t *) iop->pathinfo.node_access;
if ( the_jnode->type != IMFS_DIRECTORY )
800bc70: 28 23 00 1c lw r3,(r1+28)
return -1; /* It wasn't a directory --> return error */
800bc74: 34 02 ff ff mvi r2,-1
IMFS_jnode_t *the_jnode;
/* Is the node a directory ? */
the_jnode = (IMFS_jnode_t *) iop->pathinfo.node_access;
if ( the_jnode->type != IMFS_DIRECTORY )
800bc78: 28 64 00 4c lw r4,(r3+76)
800bc7c: 34 03 00 01 mvi r3,1
800bc80: 5c 83 00 04 bne r4,r3,800bc90 <imfs_dir_open+0x20> <== NEVER TAKEN
return -1; /* It wasn't a directory --> return error */
iop->offset = 0;
800bc84: 58 20 00 10 sw (r1+16),r0
800bc88: 58 20 00 14 sw (r1+20),r0
return 0;
800bc8c: 34 02 00 00 mvi r2,0
}
800bc90: b8 40 08 00 mv r1,r2
800bc94: c3 a0 00 00 ret
0800bc98 <imfs_dir_read>:
ssize_t imfs_dir_read(
rtems_libio_t *iop,
void *buffer,
size_t count
)
{
800bc98: 37 9c fe c0 addi sp,sp,-320
800bc9c: 5b 8b 00 34 sw (sp+52),r11
800bca0: 5b 8c 00 30 sw (sp+48),r12
800bca4: 5b 8d 00 2c sw (sp+44),r13
800bca8: 5b 8e 00 28 sw (sp+40),r14
800bcac: 5b 8f 00 24 sw (sp+36),r15
800bcb0: 5b 90 00 20 sw (sp+32),r16
800bcb4: 5b 91 00 1c sw (sp+28),r17
800bcb8: 5b 92 00 18 sw (sp+24),r18
800bcbc: 5b 93 00 14 sw (sp+20),r19
800bcc0: 5b 94 00 10 sw (sp+16),r20
800bcc4: 5b 95 00 0c sw (sp+12),r21
800bcc8: 5b 96 00 08 sw (sp+8),r22
800bccc: 5b 9d 00 04 sw (sp+4),ra
int current_entry;
int first_entry;
int last_entry;
struct dirent tmp_dirent;
the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access;
800bcd0: 28 31 00 1c lw r17,(r1+28)
ssize_t imfs_dir_read(
rtems_libio_t *iop,
void *buffer,
size_t count
)
{
800bcd4: b8 20 68 00 mv r13,r1
800bcd8: b8 40 98 00 mv r19,r2
IMFS_create_orphan( the_jnode );
IMFS_check_node_remove( the_jnode );
return 0;
}
800bcdc: 2a 2c 00 50 lw r12,(r17+80)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800bce0: 36 31 00 54 addi r17,r17,84
the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access;
the_chain = &the_jnode->info.directory.Entries;
if ( rtems_chain_is_empty( the_chain ) )
return 0;
800bce4: 34 0e 00 00 mvi r14,0
struct dirent tmp_dirent;
the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access;
the_chain = &the_jnode->info.directory.Entries;
if ( rtems_chain_is_empty( the_chain ) )
800bce8: 45 91 00 15 be r12,r17,800bd3c <imfs_dir_read+0xa4>
bytes_transferred = 0;
first_entry = iop->offset;
/* protect against using sizes that are not exact multiples of the */
/* -dirent- size. These could result in unexpected results */
last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent);
800bcec: b8 60 08 00 mv r1,r3
800bcf0: 34 02 01 0c mvi r2,268
800bcf4: f8 00 19 c1 calli 80123f8 <__udivsi3>
800bcf8: b4 21 20 00 add r4,r1,r1
800bcfc: b4 84 20 00 add r4,r4,r4
800bd00: b4 84 18 00 add r3,r4,r4
800bd04: b4 63 18 00 add r3,r3,r3
800bd08: b4 63 18 00 add r3,r3,r3
800bd0c: b4 63 18 00 add r3,r3,r3
800bd10: b4 83 78 00 add r15,r4,r3
/* Move to the first of the desired directory entries */
the_node = rtems_chain_first( the_chain );
bytes_transferred = 0;
first_entry = iop->offset;
800bd14: 29 b0 00 14 lw r16,(r13+20)
/* protect against using sizes that are not exact multiples of the */
/* -dirent- size. These could result in unexpected results */
last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent);
800bd18: c9 e1 78 00 sub r15,r15,r1
800bd1c: b5 ef 78 00 add r15,r15,r15
800bd20: b5 ef 78 00 add r15,r15,r15
800bd24: b5 f0 78 00 add r15,r15,r16
/* The directory was not empty so try to move to the desired entry in chain*/
for (
800bd28: 34 0b 00 00 mvi r11,0
}
if( current_entry >= first_entry ) {
/* Move the entry to the return buffer */
tmp_dirent.d_off = current_entry;
tmp_dirent.d_reclen = sizeof( struct dirent );
800bd2c: 34 16 01 0c mvi r22,268
the_jnode = (IMFS_jnode_t *) the_node;
tmp_dirent.d_ino = the_jnode->st_ino;
tmp_dirent.d_namlen = strlen( the_jnode->name );
strcpy( tmp_dirent.d_name, the_jnode->name );
800bd30: 37 95 00 38 addi r21,sp,56
800bd34: 37 94 00 44 addi r20,sp,68
/* protect against using sizes that are not exact multiples of the */
/* -dirent- size. These could result in unexpected results */
last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent);
/* The directory was not empty so try to move to the desired entry in chain*/
for (
800bd38: 49 e0 00 12 bg r15,r0,800bd80 <imfs_dir_read+0xe8> <== ALWAYS TAKEN
the_node = the_node->next;
}
/* Success */
return bytes_transferred;
}
800bd3c: b9 c0 08 00 mv r1,r14
800bd40: 2b 9d 00 04 lw ra,(sp+4)
800bd44: 2b 8b 00 34 lw r11,(sp+52)
800bd48: 2b 8c 00 30 lw r12,(sp+48)
800bd4c: 2b 8d 00 2c lw r13,(sp+44)
800bd50: 2b 8e 00 28 lw r14,(sp+40)
800bd54: 2b 8f 00 24 lw r15,(sp+36)
800bd58: 2b 90 00 20 lw r16,(sp+32)
800bd5c: 2b 91 00 1c lw r17,(sp+28)
800bd60: 2b 92 00 18 lw r18,(sp+24)
800bd64: 2b 93 00 14 lw r19,(sp+20)
800bd68: 2b 94 00 10 lw r20,(sp+16)
800bd6c: 2b 95 00 0c lw r21,(sp+12)
800bd70: 2b 96 00 08 lw r22,(sp+8)
800bd74: 37 9c 01 40 addi sp,sp,320
800bd78: c3 a0 00 00 ret
for (
current_entry = 0;
current_entry < last_entry;
current_entry = current_entry + sizeof(struct dirent) ){
if ( rtems_chain_is_tail( the_chain, the_node ) ){
800bd7c: 45 91 ff f0 be r12,r17,800bd3c <imfs_dir_read+0xa4>
/* entry in the read */
return bytes_transferred; /* Indicate that there are no more */
/* entries to return */
}
if( current_entry >= first_entry ) {
800bd80: 4a 0b 00 18 bg r16,r11,800bde0 <imfs_dir_read+0x148>
/* Move the entry to the return buffer */
tmp_dirent.d_off = current_entry;
tmp_dirent.d_reclen = sizeof( struct dirent );
the_jnode = (IMFS_jnode_t *) the_node;
tmp_dirent.d_ino = the_jnode->st_ino;
800bd84: 29 82 00 38 lw r2,(r12+56)
tmp_dirent.d_namlen = strlen( the_jnode->name );
800bd88: 35 92 00 0c addi r18,r12,12
800bd8c: ba 40 08 00 mv r1,r18
if( current_entry >= first_entry ) {
/* Move the entry to the return buffer */
tmp_dirent.d_off = current_entry;
tmp_dirent.d_reclen = sizeof( struct dirent );
the_jnode = (IMFS_jnode_t *) the_node;
tmp_dirent.d_ino = the_jnode->st_ino;
800bd90: 5b 82 00 38 sw (sp+56),r2
/* entries to return */
}
if( current_entry >= first_entry ) {
/* Move the entry to the return buffer */
tmp_dirent.d_off = current_entry;
800bd94: 5b 8b 00 3c sw (sp+60),r11
tmp_dirent.d_reclen = sizeof( struct dirent );
800bd98: 0f 96 00 40 sh (sp+64),r22
the_jnode = (IMFS_jnode_t *) the_node;
tmp_dirent.d_ino = the_jnode->st_ino;
tmp_dirent.d_namlen = strlen( the_jnode->name );
800bd9c: f8 00 08 ab calli 800e048 <strlen>
800bda0: 0f 81 00 42 sh (sp+66),r1
strcpy( tmp_dirent.d_name, the_jnode->name );
800bda4: ba 40 10 00 mv r2,r18
800bda8: ba 80 08 00 mv r1,r20
800bdac: f8 00 08 60 calli 800df2c <strcpy>
memcpy(
800bdb0: b6 6e 08 00 add r1,r19,r14
800bdb4: 34 03 01 0c mvi r3,268
800bdb8: ba a0 10 00 mv r2,r21
800bdbc: f8 00 06 b8 calli 800d89c <memcpy>
buffer + bytes_transferred,
(void *)&tmp_dirent,
sizeof( struct dirent )
);
iop->offset = iop->offset + sizeof(struct dirent);
800bdc0: 29 a4 00 14 lw r4,(r13+20)
800bdc4: 29 a1 00 10 lw r1,(r13+16)
bytes_transferred = bytes_transferred + sizeof( struct dirent );
800bdc8: 35 ce 01 0c addi r14,r14,268
memcpy(
buffer + bytes_transferred,
(void *)&tmp_dirent,
sizeof( struct dirent )
);
iop->offset = iop->offset + sizeof(struct dirent);
800bdcc: 34 83 01 0c addi r3,r4,268
800bdd0: f4 83 20 00 cmpgu r4,r4,r3
800bdd4: 59 a3 00 14 sw (r13+20),r3
800bdd8: b4 81 18 00 add r3,r4,r1
800bddc: 59 a3 00 10 sw (r13+16),r3
* to the end of the exisiting file, the remaining entries will be placed in
* the buffer and the returned value will be equal to -m actual- times the
* size of a directory entry.
*/
ssize_t imfs_dir_read(
800bde0: 35 6b 01 0c addi r11,r11,268
);
iop->offset = iop->offset + sizeof(struct dirent);
bytes_transferred = bytes_transferred + sizeof( struct dirent );
}
the_node = the_node->next;
800bde4: 29 8c 00 00 lw r12,(r12+0)
/* protect against using sizes that are not exact multiples of the */
/* -dirent- size. These could result in unexpected results */
last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent);
/* The directory was not empty so try to move to the desired entry in chain*/
for (
800bde8: 49 eb ff e5 bg r15,r11,800bd7c <imfs_dir_read+0xe4>
800bdec: e3 ff ff d4 bi 800bd3c <imfs_dir_read+0xa4>
0800bf88 <imfs_dir_rmnod>:
int imfs_dir_rmnod(
rtems_filesystem_location_info_t *parent_pathloc, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN */
)
{
800bf88: 37 9c ff f8 addi sp,sp,-8
800bf8c: 5b 8b 00 08 sw (sp+8),r11
800bf90: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *the_jnode;
the_jnode = (IMFS_jnode_t *) pathloc->node_access;
800bf94: 28 4b 00 00 lw r11,(r2+0)
/*
* You cannot remove a node that still has children
*/
if ( ! rtems_chain_is_empty( &the_jnode->info.directory.Entries ) )
800bf98: 29 63 00 50 lw r3,(r11+80)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800bf9c: 35 61 00 54 addi r1,r11,84
800bfa0: 5c 61 00 17 bne r3,r1,800bffc <imfs_dir_rmnod+0x74>
/*
* You cannot remove the file system root node.
*/
if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access )
800bfa4: 28 41 00 10 lw r1,(r2+16)
800bfa8: 28 21 00 1c lw r1,(r1+28)
800bfac: 45 61 00 0c be r11,r1,800bfdc <imfs_dir_rmnod+0x54>
/*
* You cannot remove a mountpoint.
*/
if ( the_jnode->info.directory.mt_fs != NULL )
800bfb0: 29 61 00 5c lw r1,(r11+92)
800bfb4: 5c 20 00 0a bne r1,r0,800bfdc <imfs_dir_rmnod+0x54> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EBUSY );
IMFS_create_orphan( the_jnode );
800bfb8: b9 60 08 00 mv r1,r11
800bfbc: fb ff f0 a8 calli 800825c <IMFS_create_orphan>
IMFS_check_node_remove( the_jnode );
800bfc0: b9 60 08 00 mv r1,r11
800bfc4: fb ff f0 ba calli 80082ac <IMFS_check_node_remove>
return 0;
800bfc8: 34 01 00 00 mvi r1,0
}
800bfcc: 2b 9d 00 04 lw ra,(sp+4)
800bfd0: 2b 8b 00 08 lw r11,(sp+8)
800bfd4: 37 9c 00 08 addi sp,sp,8
800bfd8: c3 a0 00 00 ret
/*
* You cannot remove a mountpoint.
*/
if ( the_jnode->info.directory.mt_fs != NULL )
rtems_set_errno_and_return_minus_one( EBUSY );
800bfdc: f8 00 03 7a calli 800cdc4 <__errno>
800bfe0: 34 02 00 10 mvi r2,16
800bfe4: 58 22 00 00 sw (r1+0),r2
800bfe8: 34 01 ff ff mvi r1,-1
IMFS_create_orphan( the_jnode );
IMFS_check_node_remove( the_jnode );
return 0;
}
800bfec: 2b 9d 00 04 lw ra,(sp+4)
800bff0: 2b 8b 00 08 lw r11,(sp+8)
800bff4: 37 9c 00 08 addi sp,sp,8
800bff8: c3 a0 00 00 ret
/*
* You cannot remove a node that still has children
*/
if ( ! rtems_chain_is_empty( &the_jnode->info.directory.Entries ) )
rtems_set_errno_and_return_minus_one( ENOTEMPTY );
800bffc: f8 00 03 72 calli 800cdc4 <__errno>
800c000: 34 02 00 5a mvi r2,90
800c004: 58 22 00 00 sw (r1+0),r2
800c008: 34 01 ff ff mvi r1,-1
800c00c: e3 ff ff f0 bi 800bfcc <imfs_dir_rmnod+0x44>
08002210 <init_etc_passwd_group>:
/*
* Initialize useable but dummy databases
*/
void init_etc_passwd_group(void)
{
8002210: 37 9c ff ec addi sp,sp,-20
8002214: 5b 8b 00 14 sw (sp+20),r11
8002218: 5b 8c 00 10 sw (sp+16),r12
800221c: 5b 8d 00 0c sw (sp+12),r13
8002220: 5b 8e 00 08 sw (sp+8),r14
8002224: 5b 9d 00 04 sw (sp+4),ra
FILE *fp;
static char etc_passwd_initted = 0;
if (etc_passwd_initted)
8002228: 78 03 08 01 mvhi r3,0x801
800222c: 38 63 68 78 ori r3,r3,0x6878
8002230: 40 6d 00 00 lbu r13,(r3+0)
8002234: 45 a0 00 08 be r13,r0,8002254 <init_etc_passwd_group+0x44>
fprintf( fp, "root:x:0:root\n"
"rtems:x:1:rtems\n"
"tty:x:2:tty\n" );
fclose(fp);
}
}
8002238: 2b 9d 00 04 lw ra,(sp+4)
800223c: 2b 8b 00 14 lw r11,(sp+20)
8002240: 2b 8c 00 10 lw r12,(sp+16)
8002244: 2b 8d 00 0c lw r13,(sp+12)
8002248: 2b 8e 00 08 lw r14,(sp+8)
800224c: 37 9c 00 14 addi sp,sp,20
8002250: c3 a0 00 00 ret
FILE *fp;
static char etc_passwd_initted = 0;
if (etc_passwd_initted)
return;
etc_passwd_initted = 1;
8002254: 34 04 00 01 mvi r4,1
mkdir("/etc", 0777);
8002258: 78 01 08 01 mvhi r1,0x801
800225c: 34 02 01 ff mvi r2,511
FILE *fp;
static char etc_passwd_initted = 0;
if (etc_passwd_initted)
return;
etc_passwd_initted = 1;
8002260: 30 64 00 00 sb (r3+0),r4
mkdir("/etc", 0777);
8002264: 38 21 51 e0 ori r1,r1,0x51e0
/*
* Initialize /etc/passwd
*/
if ((fp = fopen("/etc/passwd", "r")) != NULL) {
8002268: 78 0c 08 01 mvhi r12,0x801
800226c: 78 0b 08 01 mvhi r11,0x801
static char etc_passwd_initted = 0;
if (etc_passwd_initted)
return;
etc_passwd_initted = 1;
mkdir("/etc", 0777);
8002270: f8 00 02 b5 calli 8002d44 <mkdir>
/*
* Initialize /etc/passwd
*/
if ((fp = fopen("/etc/passwd", "r")) != NULL) {
8002274: 39 8c 51 e8 ori r12,r12,0x51e8
8002278: 39 6b 51 f4 ori r11,r11,0x51f4
800227c: b9 80 08 00 mv r1,r12
8002280: b9 60 10 00 mv r2,r11
8002284: f8 00 31 f4 calli 800ea54 <fopen>
8002288: b8 20 70 00 mv r14,r1
800228c: 44 2d 00 20 be r1,r13,800230c <init_etc_passwd_group+0xfc>
}
else if ((fp = fopen("/etc/passwd", "w")) != NULL) {
fprintf(fp, "root:*:0:0:root::/:/bin/sh\n"
"rtems:*:1:1:RTEMS Application::/:/bin/sh\n"
"tty:!:2:2:tty owner::/:/bin/false\n" );
fclose(fp);
8002290: f8 00 2f c2 calli 800e198 <fclose>
}
/*
* Initialize /etc/group
*/
if ((fp = fopen("/etc/group", "r")) != NULL) {
8002294: 78 0c 08 01 mvhi r12,0x801
8002298: 39 8c 52 64 ori r12,r12,0x5264
800229c: b9 60 10 00 mv r2,r11
80022a0: b9 80 08 00 mv r1,r12
80022a4: f8 00 31 ec calli 800ea54 <fopen>
80022a8: b8 20 58 00 mv r11,r1
80022ac: 44 20 00 09 be r1,r0,80022d0 <init_etc_passwd_group+0xc0>
}
else if ((fp = fopen("/etc/group", "w")) != NULL) {
fprintf( fp, "root:x:0:root\n"
"rtems:x:1:rtems\n"
"tty:x:2:tty\n" );
fclose(fp);
80022b0: f8 00 2f ba calli 800e198 <fclose>
}
}
80022b4: 2b 9d 00 04 lw ra,(sp+4)
80022b8: 2b 8b 00 14 lw r11,(sp+20)
80022bc: 2b 8c 00 10 lw r12,(sp+16)
80022c0: 2b 8d 00 0c lw r13,(sp+12)
80022c4: 2b 8e 00 08 lw r14,(sp+8)
80022c8: 37 9c 00 14 addi sp,sp,20
80022cc: c3 a0 00 00 ret
* Initialize /etc/group
*/
if ((fp = fopen("/etc/group", "r")) != NULL) {
fclose(fp);
}
else if ((fp = fopen("/etc/group", "w")) != NULL) {
80022d0: 78 02 08 01 mvhi r2,0x801
80022d4: b9 80 08 00 mv r1,r12
80022d8: 38 42 51 f8 ori r2,r2,0x51f8
80022dc: f8 00 31 de calli 800ea54 <fopen>
80022e0: b8 20 60 00 mv r12,r1
80022e4: 44 2b ff d5 be r1,r11,8002238 <init_etc_passwd_group+0x28> <== NEVER TAKEN
fprintf( fp, "root:x:0:root\n"
80022e8: 78 01 08 01 mvhi r1,0x801
80022ec: 34 02 00 01 mvi r2,1
80022f0: 34 03 00 2a mvi r3,42
80022f4: b9 80 20 00 mv r4,r12
80022f8: 38 21 52 70 ori r1,r1,0x5270
80022fc: f8 00 33 bf calli 800f1f8 <fwrite>
"rtems:x:1:rtems\n"
"tty:x:2:tty\n" );
fclose(fp);
8002300: b9 80 08 00 mv r1,r12
8002304: f8 00 2f a5 calli 800e198 <fclose>
8002308: e3 ff ff eb bi 80022b4 <init_etc_passwd_group+0xa4>
* Initialize /etc/passwd
*/
if ((fp = fopen("/etc/passwd", "r")) != NULL) {
fclose(fp);
}
else if ((fp = fopen("/etc/passwd", "w")) != NULL) {
800230c: 78 02 08 01 mvhi r2,0x801
8002310: b9 80 08 00 mv r1,r12
8002314: 38 42 51 f8 ori r2,r2,0x51f8
8002318: f8 00 31 cf calli 800ea54 <fopen>
800231c: b8 20 60 00 mv r12,r1
8002320: 44 2e ff dd be r1,r14,8002294 <init_etc_passwd_group+0x84> <== NEVER TAKEN
fprintf(fp, "root:*:0:0:root::/:/bin/sh\n"
8002324: 78 01 08 01 mvhi r1,0x801
8002328: 38 21 51 fc ori r1,r1,0x51fc
800232c: 34 02 00 01 mvi r2,1
8002330: 34 03 00 66 mvi r3,102
8002334: b9 80 20 00 mv r4,r12
8002338: f8 00 33 b0 calli 800f1f8 <fwrite>
"rtems:*:1:1:RTEMS Application::/:/bin/sh\n"
"tty:!:2:2:tty owner::/:/bin/false\n" );
fclose(fp);
800233c: b9 80 08 00 mv r1,r12
8002340: e3 ff ff d4 bi 8002290 <init_etc_passwd_group+0x80>
08005e20 <iproc>:
/*
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
8005e20: 37 9c ff f4 addi sp,sp,-12
8005e24: 5b 8b 00 0c sw (sp+12),r11
8005e28: 5b 8c 00 08 sw (sp+8),r12
8005e2c: 5b 9d 00 04 sw (sp+4),ra
8005e30: b8 40 60 00 mv r12,r2
if (tty->termios.c_iflag & ISTRIP)
8005e34: 28 42 00 30 lw r2,(r2+48)
/*
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
8005e38: b8 20 58 00 mv r11,r1
if (tty->termios.c_iflag & ISTRIP)
8005e3c: 20 41 00 20 andi r1,r2,0x20
8005e40: 44 20 00 02 be r1,r0,8005e48 <iproc+0x28> <== ALWAYS TAKEN
c &= 0x7f;
8005e44: 21 6b 00 7f andi r11,r11,0x7f <== NOT EXECUTED
if (tty->termios.c_iflag & IUCLC)
8005e48: 20 41 02 00 andi r1,r2,0x200
8005e4c: 44 20 00 0b be r1,r0,8005e78 <iproc+0x58>
c = tolower (c);
8005e50: 78 01 08 02 mvhi r1,0x802
8005e54: 38 21 44 10 ori r1,r1,0x4410
8005e58: 28 23 00 00 lw r3,(r1+0)
8005e5c: b9 60 08 00 mv r1,r11
8005e60: b4 6b 58 00 add r11,r3,r11
8005e64: 41 64 00 01 lbu r4,(r11+1)
8005e68: 34 03 00 01 mvi r3,1
8005e6c: 20 84 00 03 andi r4,r4,0x3
8005e70: 44 83 00 40 be r4,r3,8005f70 <iproc+0x150>
8005e74: 20 2b 00 ff andi r11,r1,0xff
if (c == '\r') {
8005e78: 34 01 00 0d mvi r1,13
8005e7c: 45 61 00 19 be r11,r1,8005ee0 <iproc+0xc0>
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)) {
8005e80: 34 01 00 0a mvi r1,10
8005e84: 45 61 00 37 be r11,r1,8005f60 <iproc+0x140>
c = '\r';
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
8005e88: 5d 60 00 1c bne r11,r0,8005ef8 <iproc+0xd8> <== ALWAYS TAKEN
}
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
8005e8c: 78 01 08 02 mvhi r1,0x802
8005e90: 38 21 43 40 ori r1,r1,0x4340
8005e94: 28 23 00 00 lw r3,(r1+0)
8005e98: 29 82 00 20 lw r2,(r12+32)
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
}
return 0;
8005e9c: 34 01 00 00 mvi r1,0
}
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
8005ea0: 34 63 ff ff addi r3,r3,-1
8005ea4: 4c 43 00 0a bge r2,r3,8005ecc <iproc+0xac> <== NEVER TAKEN
if (tty->termios.c_lflag & ECHO)
8005ea8: 29 81 00 3c lw r1,(r12+60)
8005eac: 20 21 00 08 andi r1,r1,0x8
8005eb0: 5c 20 00 32 bne r1,r0,8005f78 <iproc+0x158> <== ALWAYS TAKEN
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
8005eb4: 29 84 00 1c lw r4,(r12+28)
8005eb8: 34 43 00 01 addi r3,r2,1
}
return 0;
8005ebc: 34 01 00 00 mvi r1,0
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
8005ec0: b4 82 10 00 add r2,r4,r2
8005ec4: 30 4b 00 00 sb (r2+0),r11
8005ec8: 59 83 00 20 sw (r12+32),r3
}
return 0;
}
8005ecc: 2b 9d 00 04 lw ra,(sp+4)
8005ed0: 2b 8b 00 0c lw r11,(sp+12)
8005ed4: 2b 8c 00 08 lw r12,(sp+8)
8005ed8: 37 9c 00 0c addi sp,sp,12
8005edc: c3 a0 00 00 ret
if (tty->termios.c_iflag & IUCLC)
c = tolower (c);
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
8005ee0: 20 43 00 80 andi r3,r2,0x80
return 0;
8005ee4: 34 01 00 00 mvi r1,0
if (tty->termios.c_iflag & IUCLC)
c = tolower (c);
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
8005ee8: 5c 60 ff f9 bne r3,r0,8005ecc <iproc+0xac> <== NEVER TAKEN
return 0;
if (tty->termios.c_iflag & ICRNL)
8005eec: 20 42 01 00 andi r2,r2,0x100
8005ef0: 44 43 00 02 be r2,r3,8005ef8 <iproc+0xd8> <== NEVER TAKEN
c = '\n';
8005ef4: 34 0b 00 0a mvi r11,10
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
c = '\r';
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
8005ef8: 29 82 00 3c lw r2,(r12+60)
8005efc: 20 41 00 02 andi r1,r2,0x2
8005f00: 44 20 ff e3 be r1,r0,8005e8c <iproc+0x6c>
if (c == tty->termios.c_cc[VERASE]) {
8005f04: 41 81 00 43 lbu r1,(r12+67)
8005f08: 44 2b 00 37 be r1,r11,8005fe4 <iproc+0x1c4>
erase (tty, 0);
return 0;
}
else if (c == tty->termios.c_cc[VKILL]) {
8005f0c: 41 81 00 44 lbu r1,(r12+68)
8005f10: 44 2b 00 23 be r1,r11,8005f9c <iproc+0x17c>
erase (tty, 1);
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
8005f14: 41 83 00 45 lbu r3,(r12+69)
return 1;
8005f18: 34 01 00 01 mvi r1,1
}
else if (c == tty->termios.c_cc[VKILL]) {
erase (tty, 1);
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
8005f1c: 44 6b ff ec be r3,r11,8005ecc <iproc+0xac> <== NEVER TAKEN
return 1;
} else if (c == '\n') {
8005f20: 34 01 00 0a mvi r1,10
8005f24: 45 61 00 23 be r11,r1,8005fb0 <iproc+0x190>
if (tty->termios.c_lflag & (ECHO | ECHONL))
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
return 1;
} else if ((c == tty->termios.c_cc[VEOL]) ||
8005f28: 41 81 00 4c lbu r1,(r12+76)
8005f2c: 44 2b 00 03 be r1,r11,8005f38 <iproc+0x118> <== NEVER TAKEN
8005f30: 41 81 00 51 lbu r1,(r12+81)
8005f34: 5c 2b ff d6 bne r1,r11,8005e8c <iproc+0x6c> <== ALWAYS TAKEN
(c == tty->termios.c_cc[VEOL2])) {
if (tty->termios.c_lflag & ECHO)
8005f38: 20 42 00 08 andi r2,r2,0x8 <== NOT EXECUTED
8005f3c: 5c 40 00 14 bne r2,r0,8005f8c <iproc+0x16c> <== NOT EXECUTED
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
8005f40: 29 83 00 20 lw r3,(r12+32) <== NOT EXECUTED
8005f44: 29 84 00 1c lw r4,(r12+28) <== NOT EXECUTED
return 1;
8005f48: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
return 1;
} else if ((c == tty->termios.c_cc[VEOL]) ||
(c == tty->termios.c_cc[VEOL2])) {
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
8005f4c: 34 62 00 01 addi r2,r3,1 <== NOT EXECUTED
8005f50: b4 83 18 00 add r3,r4,r3 <== NOT EXECUTED
8005f54: 30 6b 00 00 sb (r3+0),r11 <== NOT EXECUTED
8005f58: 59 82 00 20 sw (r12+32),r2 <== NOT EXECUTED
return 1;
8005f5c: e3 ff ff dc bi 8005ecc <iproc+0xac> <== NOT EXECUTED
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
return 0;
if (tty->termios.c_iflag & ICRNL)
c = '\n';
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
8005f60: 20 42 00 40 andi r2,r2,0x40
8005f64: 44 40 ff e5 be r2,r0,8005ef8 <iproc+0xd8> <== ALWAYS TAKEN
c = '\r';
8005f68: 34 0b 00 0d mvi r11,13 <== NOT EXECUTED
8005f6c: e3 ff ff e3 bi 8005ef8 <iproc+0xd8> <== NOT EXECUTED
{
if (tty->termios.c_iflag & ISTRIP)
c &= 0x7f;
if (tty->termios.c_iflag & IUCLC)
c = tolower (c);
8005f70: 34 21 00 20 addi r1,r1,32
8005f74: e3 ff ff c0 bi 8005e74 <iproc+0x54>
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
8005f78: b9 80 10 00 mv r2,r12
8005f7c: b9 60 08 00 mv r1,r11
8005f80: fb ff fe f7 calli 8005b5c <echo>
8005f84: 29 82 00 20 lw r2,(r12+32)
8005f88: e3 ff ff cb bi 8005eb4 <iproc+0x94>
tty->cbuf[tty->ccount++] = c;
return 1;
} else if ((c == tty->termios.c_cc[VEOL]) ||
(c == tty->termios.c_cc[VEOL2])) {
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
8005f8c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8005f90: b9 80 10 00 mv r2,r12 <== NOT EXECUTED
8005f94: fb ff fe f2 calli 8005b5c <echo> <== NOT EXECUTED
8005f98: e3 ff ff ea bi 8005f40 <iproc+0x120> <== NOT EXECUTED
if (c == tty->termios.c_cc[VERASE]) {
erase (tty, 0);
return 0;
}
else if (c == tty->termios.c_cc[VKILL]) {
erase (tty, 1);
8005f9c: b9 80 08 00 mv r1,r12
8005fa0: 34 02 00 01 mvi r2,1
8005fa4: fb ff ff 16 calli 8005bfc <erase>
return 0;
8005fa8: 34 01 00 00 mvi r1,0
8005fac: e3 ff ff c8 bi 8005ecc <iproc+0xac>
}
else if (c == tty->termios.c_cc[VEOF]) {
return 1;
} else if (c == '\n') {
if (tty->termios.c_lflag & (ECHO | ECHONL))
8005fb0: 20 42 00 48 andi r2,r2,0x48
8005fb4: 44 40 00 03 be r2,r0,8005fc0 <iproc+0x1a0> <== NEVER TAKEN
echo (c, tty);
8005fb8: b9 80 10 00 mv r2,r12
8005fbc: fb ff fe e8 calli 8005b5c <echo>
tty->cbuf[tty->ccount++] = c;
8005fc0: 29 82 00 20 lw r2,(r12+32)
8005fc4: 29 83 00 1c lw r3,(r12+28)
8005fc8: 34 41 00 01 addi r1,r2,1
8005fcc: b4 62 10 00 add r2,r3,r2
8005fd0: 34 03 00 0a mvi r3,10
8005fd4: 30 43 00 00 sb (r2+0),r3
8005fd8: 59 81 00 20 sw (r12+32),r1
return 1;
8005fdc: 34 01 00 01 mvi r1,1
8005fe0: e3 ff ff bb bi 8005ecc <iproc+0xac>
c = '\r';
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
if (c == tty->termios.c_cc[VERASE]) {
erase (tty, 0);
8005fe4: b9 80 08 00 mv r1,r12
8005fe8: 34 02 00 00 mvi r2,0
8005fec: fb ff ff 04 calli 8005bfc <erase>
return 0;
8005ff0: 34 01 00 00 mvi r1,0
8005ff4: e3 ff ff b6 bi 8005ecc <iproc+0xac>
08026010 <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
8026010: 37 9c ff d8 addi sp,sp,-40
8026014: 5b 8b 00 1c sw (sp+28),r11
8026018: 5b 8c 00 18 sw (sp+24),r12
802601c: 5b 8d 00 14 sw (sp+20),r13
8026020: 5b 8e 00 10 sw (sp+16),r14
8026024: 5b 8f 00 0c sw (sp+12),r15
8026028: 5b 90 00 08 sw (sp+8),r16
802602c: 5b 9d 00 04 sw (sp+4),ra
8026030: b8 20 58 00 mv r11,r1
8026034: b8 40 60 00 mv r12,r2
8026038: b8 60 70 00 mv r14,r3
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
802603c: fb ff fe e3 calli 8025bc8 <getpid>
8026040: 5c 2b 00 a3 bne r1,r11,80262cc <killinfo+0x2bc>
rtems_set_errno_and_return_minus_one( ESRCH );
/*
* Validate the signal passed.
*/
if ( !sig )
8026044: 45 80 00 04 be r12,r0,8026054 <killinfo+0x44>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
8026048: 35 82 ff ff addi r2,r12,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
802604c: 34 01 00 1f mvi r1,31
8026050: 50 22 00 0e bgeu r1,r2,8026088 <killinfo+0x78>
rtems_set_errno_and_return_minus_one( EINVAL );
8026054: fb ff b7 70 calli 8013e14 <__errno>
8026058: 34 02 00 16 mvi r2,22
802605c: 58 22 00 00 sw (r1+0),r2
8026060: 34 01 ff ff mvi r1,-1
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
8026064: 2b 9d 00 04 lw ra,(sp+4)
8026068: 2b 8b 00 1c lw r11,(sp+28)
802606c: 2b 8c 00 18 lw r12,(sp+24)
8026070: 2b 8d 00 14 lw r13,(sp+20)
8026074: 2b 8e 00 10 lw r14,(sp+16)
8026078: 2b 8f 00 0c lw r15,(sp+12)
802607c: 2b 90 00 08 lw r16,(sp+8)
8026080: 37 9c 00 28 addi sp,sp,40
8026084: c3 a0 00 00 ret
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
8026088: b5 8c 80 00 add r16,r12,r12
802608c: b6 0c 08 00 add r1,r16,r12
8026090: 78 0d 08 02 mvhi r13,0x802
8026094: b4 21 08 00 add r1,r1,r1
8026098: 39 ad af 40 ori r13,r13,0xaf40
802609c: b4 21 08 00 add r1,r1,r1
80260a0: b5 a1 08 00 add r1,r13,r1
80260a4: 28 23 00 08 lw r3,(r1+8)
80260a8: 34 0f 00 01 mvi r15,1
return 0;
80260ac: 34 01 00 00 mvi r1,0
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* If the signal is being ignored, then we are out of here.
*/
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
80260b0: 44 6f ff ed be r3,r15,8026064 <killinfo+0x54>
/*
* P1003.1c/Draft 10, p. 33 says that certain signals should always
* be directed to the executing thread such as those caused by hardware
* faults.
*/
if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) )
80260b4: 65 83 00 04 cmpei r3,r12,4
80260b8: 65 81 00 08 cmpei r1,r12,8
80260bc: b8 61 08 00 or r1,r3,r1
80260c0: 5c 20 00 3f bne r1,r0,80261bc <killinfo+0x1ac>
80260c4: 34 01 00 0b mvi r1,11
80260c8: 45 81 00 3d be r12,r1,80261bc <killinfo+0x1ac>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
80260cc: 34 01 00 01 mvi r1,1
80260d0: fb ff 70 24 calli 8002160 <__ashlsi3>
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
80260d4: 5b 8c 00 20 sw (sp+32),r12
siginfo->si_code = SI_USER;
80260d8: 5b 8f 00 24 sw (sp+36),r15
80260dc: b8 20 58 00 mv r11,r1
if ( !value ) {
80260e0: 45 c0 00 3b be r14,r0,80261cc <killinfo+0x1bc>
siginfo->si_value.sival_int = 0;
} else {
siginfo->si_value = *value;
80260e4: 29 c1 00 00 lw r1,(r14+0)
80260e8: 5b 81 00 28 sw (sp+40),r1
80260ec: 78 01 08 02 mvhi r1,0x802
80260f0: 38 21 aa 20 ori r1,r1,0xaa20
80260f4: 28 22 00 00 lw r2,(r1+0)
80260f8: 34 42 00 01 addi r2,r2,1
80260fc: 58 22 00 00 sw (r1+0),r2
/*
* Is the currently executing thread interested? If so then it will
* get it an execute it as soon as the dispatcher executes.
*/
the_thread = _Thread_Executing;
8026100: 78 01 08 02 mvhi r1,0x802
8026104: 38 21 ae f0 ori r1,r1,0xaef0
8026108: 28 21 00 0c lw r1,(r1+12)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
802610c: 28 22 01 20 lw r2,(r1+288)
8026110: 28 42 00 d0 lw r2,(r2+208)
8026114: a4 40 10 00 not r2,r2
8026118: a1 62 10 00 and r2,r11,r2
802611c: 5c 40 00 18 bne r2,r0,802617c <killinfo+0x16c>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
8026120: 78 01 08 02 mvhi r1,0x802
8026124: 38 21 b0 cc ori r1,r1,0xb0cc
8026128: 28 23 00 00 lw r3,(r1+0)
/* XXX violation of visibility -- need to define thread queue support */
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
802612c: 78 04 08 02 mvhi r4,0x802
8026130: 38 84 b0 d0 ori r4,r4,0xb0d0
8026134: 44 64 00 28 be r3,r4,80261d4 <killinfo+0x1c4>
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
8026138: 28 62 00 30 lw r2,(r3+48)
for ( the_node = _Chain_First( the_chain );
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
802613c: b8 60 08 00 mv r1,r3
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8026140: 28 65 01 20 lw r5,(r3+288)
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
8026144: a1 62 10 00 and r2,r11,r2
8026148: 44 40 00 09 be r2,r0,802616c <killinfo+0x15c>
802614c: e0 00 00 0c bi 802617c <killinfo+0x16c>
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
8026150: 28 63 00 00 lw r3,(r3+0)
/* XXX violation of visibility -- need to define thread queue support */
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
8026154: 44 64 00 20 be r3,r4,80261d4 <killinfo+0x1c4> <== ALWAYS TAKEN
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
8026158: 28 62 00 30 lw r2,(r3+48) <== NOT EXECUTED
for ( the_node = _Chain_First( the_chain );
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
802615c: 28 65 01 20 lw r5,(r3+288) <== NOT EXECUTED
for ( the_node = _Chain_First( the_chain );
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
8026160: b8 60 08 00 mv r1,r3 <== NOT EXECUTED
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
8026164: a1 62 10 00 and r2,r11,r2 <== NOT EXECUTED
8026168: 5c 40 00 05 bne r2,r0,802617c <killinfo+0x16c> <== NOT EXECUTED
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
802616c: 28 a5 00 d0 lw r5,(r5+208)
8026170: a4 a0 28 00 not r5,r5
8026174: a1 65 28 00 and r5,r11,r5
8026178: 44 a2 ff f6 be r5,r2,8026150 <killinfo+0x140>
/*
* 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 ) ) {
802617c: b9 80 10 00 mv r2,r12
8026180: 37 83 00 20 addi r3,sp,32
8026184: f8 00 00 68 calli 8026324 <_POSIX_signals_Unblock_thread>
8026188: 5c 20 00 0a bne r1,r0,80261b0 <killinfo+0x1a0>
* 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 );
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
802618c: b6 0c 60 00 add r12,r16,r12
8026190: b5 8c 60 00 add r12,r12,r12
/*
* 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 );
8026194: b9 60 08 00 mv r1,r11
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
8026198: b5 8c 60 00 add r12,r12,r12
/*
* 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 );
802619c: f8 00 00 57 calli 80262f8 <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
80261a0: b5 ac 68 00 add r13,r13,r12
80261a4: 29 a2 00 00 lw r2,(r13+0)
80261a8: 34 01 00 02 mvi r1,2
80261ac: 44 41 00 38 be r2,r1,802628c <killinfo+0x27c>
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
80261b0: fb ff 9a 1b calli 800ca1c <_Thread_Enable_dispatch>
return 0;
80261b4: 34 01 00 00 mvi r1,0
80261b8: e3 ff ff ab bi 8026064 <killinfo+0x54>
* P1003.1c/Draft 10, p. 33 says that certain signals should always
* be directed to the executing thread such as those caused by hardware
* faults.
*/
if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) )
return pthread_kill( pthread_self(), sig );
80261bc: f8 00 01 09 calli 80265e0 <pthread_self>
80261c0: b9 80 10 00 mv r2,r12
80261c4: f8 00 00 bb calli 80264b0 <pthread_kill>
80261c8: e3 ff ff a7 bi 8026064 <killinfo+0x54>
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
siginfo->si_code = SI_USER;
if ( !value ) {
siginfo->si_value.sival_int = 0;
80261cc: 5b 80 00 28 sw (sp+40),r0
80261d0: e3 ff ff c7 bi 80260ec <killinfo+0xdc>
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
80261d4: 78 01 08 02 mvhi r1,0x802
80261d8: 38 21 a0 c0 ori r1,r1,0xa0c0
80261dc: 40 26 00 00 lbu r6,(r1+0)
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
80261e0: 78 01 08 02 mvhi r1,0x802
80261e4: 38 21 a9 bc ori r1,r1,0xa9bc
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
80261e8: 78 08 08 02 mvhi r8,0x802
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
80261ec: 34 2a 00 10 addi r10,r1,16
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
80261f0: 34 c6 00 01 addi r6,r6,1
80261f4: 39 08 a9 c4 ori r8,r8,0xa9c4
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
80261f8: 34 01 00 00 mvi r1,0
*/
RTEMS_INLINE_ROUTINE bool _States_Is_interruptible_by_signal (
States_Control the_states
)
{
return (the_states & STATES_INTERRUPTIBLE_BY_SIGNAL);
80261fc: 78 0f 10 00 mvhi r15,0x1000
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
/*
* This can occur when no one is interested and an API is not configured.
*/
if ( !_Objects_Information_table[ the_api ] )
8026200: 29 02 00 00 lw r2,(r8+0)
8026204: 44 40 00 1e be r2,r0,802627c <killinfo+0x26c> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
8026208: 28 42 00 04 lw r2,(r2+4)
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
802620c: 2c 47 00 10 lhu r7,(r2+16)
object_table = the_info->local_table;
8026210: 28 44 00 1c lw r4,(r2+28)
for ( index = 1 ; index <= maximum ; index++ ) {
8026214: 44 e0 00 1a be r7,r0,802627c <killinfo+0x26c>
8026218: 34 03 00 01 mvi r3,1
the_thread = (Thread_Control *) object_table[ index ];
802621c: 28 82 00 04 lw r2,(r4+4)
if ( !the_thread )
8026220: 44 40 00 14 be r2,r0,8026270 <killinfo+0x260>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
8026224: 28 45 00 14 lw r5,(r2+20)
8026228: 54 a6 00 12 bgu r5,r6,8026270 <killinfo+0x260>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
802622c: 28 49 01 20 lw r9,(r2+288)
8026230: 29 29 00 d0 lw r9,(r9+208)
8026234: a5 20 48 00 not r9,r9
8026238: a1 69 48 00 and r9,r11,r9
802623c: 45 20 00 0d be r9,r0,8026270 <killinfo+0x260>
*
* NOTE: We initialized interested_priority to PRIORITY_MAXIMUM + 1
* so we never have to worry about deferencing a NULL
* interested thread.
*/
if ( the_thread->current_priority < interested_priority ) {
8026240: 54 c5 00 0a bgu r6,r5,8026268 <killinfo+0x258>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
8026244: 44 20 00 0b be r1,r0,8026270 <killinfo+0x260> <== NEVER TAKEN
8026248: 28 29 00 10 lw r9,(r1+16)
802624c: 45 20 00 09 be r9,r0,8026270 <killinfo+0x260> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
8026250: 28 4e 00 10 lw r14,(r2+16)
8026254: 45 c0 00 05 be r14,r0,8026268 <killinfo+0x258>
8026258: a1 2f 48 00 and r9,r9,r15
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
802625c: 5d 20 00 05 bne r9,r0,8026270 <killinfo+0x260>
8026260: a1 cf 70 00 and r14,r14,r15
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
8026264: 45 c9 00 03 be r14,r9,8026270 <killinfo+0x260>
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
8026268: b8 a0 30 00 mv r6,r5
802626c: b8 40 08 00 mv r1,r2
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
8026270: 34 63 00 01 addi r3,r3,1
8026274: 34 84 00 04 addi r4,r4,4
8026278: 50 e3 ff e9 bgeu r7,r3,802621c <killinfo+0x20c>
802627c: 35 08 00 04 addi r8,r8,4
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
8026280: 5d 0a ff e0 bne r8,r10,8026200 <killinfo+0x1f0>
}
}
}
}
if ( interested ) {
8026284: 5c 20 ff be bne r1,r0,802617c <killinfo+0x16c>
8026288: e3 ff ff c1 bi 802618c <killinfo+0x17c>
_POSIX_signals_Set_process_signals( mask );
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
802628c: 78 01 08 02 mvhi r1,0x802
8026290: 38 21 b0 c0 ori r1,r1,0xb0c0
8026294: fb ff 91 5d calli 800a808 <_Chain_Get>
8026298: b8 20 10 00 mv r2,r1
if ( !psiginfo ) {
802629c: 44 20 00 11 be r1,r0,80262e0 <killinfo+0x2d0>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
80262a0: 2b 83 00 20 lw r3,(sp+32)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
80262a4: 78 01 08 02 mvhi r1,0x802
80262a8: 38 21 b1 38 ori r1,r1,0xb138
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
80262ac: 58 43 00 08 sw (r2+8),r3
80262b0: 2b 83 00 24 lw r3,(sp+36)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
80262b4: b5 81 08 00 add r1,r12,r1
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
80262b8: 58 43 00 0c sw (r2+12),r3
80262bc: 2b 83 00 28 lw r3,(sp+40)
80262c0: 58 43 00 10 sw (r2+16),r3
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
80262c4: fb ff 91 3b calli 800a7b0 <_Chain_Append>
80262c8: e3 ff ff ba bi 80261b0 <killinfo+0x1a0>
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
rtems_set_errno_and_return_minus_one( ESRCH );
80262cc: fb ff b6 d2 calli 8013e14 <__errno>
80262d0: 34 02 00 03 mvi r2,3
80262d4: 58 22 00 00 sw (r1+0),r2
80262d8: 34 01 ff ff mvi r1,-1
80262dc: e3 ff ff 62 bi 8026064 <killinfo+0x54>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
if ( !psiginfo ) {
_Thread_Enable_dispatch();
80262e0: fb ff 99 cf calli 800ca1c <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
80262e4: fb ff b6 cc calli 8013e14 <__errno>
80262e8: 34 02 00 0b mvi r2,11
80262ec: 58 22 00 00 sw (r1+0),r2
80262f0: 34 01 ff ff mvi r1,-1
80262f4: e3 ff ff 5c bi 8026064 <killinfo+0x54>
080127bc <libc_wrapup>:
extern void _wrapup_reent(struct _reent *);
extern void _reclaim_reent(struct _reent *);
void libc_wrapup(void)
{
80127bc: 37 9c ff f4 addi sp,sp,-12
80127c0: 5b 8b 00 0c sw (sp+12),r11
80127c4: 5b 8c 00 08 sw (sp+8),r12
80127c8: 5b 9d 00 04 sw (sp+4),ra
/*
* In case RTEMS is already down, don't do this. It could be
* dangerous.
*/
if (!_System_state_Is_up(_System_state_Get()))
80127cc: 78 01 08 01 mvhi r1,0x801
80127d0: 38 21 4a 20 ori r1,r1,0x4a20
80127d4: 28 22 00 00 lw r2,(r1+0)
80127d8: 34 01 00 03 mvi r1,3
80127dc: 44 41 00 06 be r2,r1,80127f4 <libc_wrapup+0x38> <== ALWAYS TAKEN
*/
fclose (stdin);
fclose (stdout);
fclose (stderr);
}
80127e0: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80127e4: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
80127e8: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
80127ec: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
80127f0: c3 a0 00 00 ret <== NOT EXECUTED
/*
* This was already done if the user called exit() directly .
_wrapup_reent(0);
*/
if (_REENT != _global_impure_ptr) {
80127f4: 78 0b 08 01 mvhi r11,0x801
80127f8: 78 01 08 01 mvhi r1,0x801
80127fc: 39 6b 41 b8 ori r11,r11,0x41b8
8012800: 38 21 3a b4 ori r1,r1,0x3ab4
8012804: 29 62 00 00 lw r2,(r11+0)
8012808: 28 2c 00 00 lw r12,(r1+0)
801280c: 44 4c 00 04 be r2,r12,801281c <libc_wrapup+0x60>
_wrapup_reent(_global_impure_ptr);
8012810: b9 80 08 00 mv r1,r12
8012814: f8 00 02 1b calli 8013080 <_wrapup_reent>
/* Don't reclaim this one, just in case we do printfs
* on the way out to ROM.
*/
_reclaim_reent(&libc_global_reent);
#endif
_REENT = _global_impure_ptr;
8012818: 59 6c 00 00 sw (r11+0),r12
*
* Should this be changed to do *all* file streams?
* _fwalk (_REENT, fclose);
*/
fclose (stdin);
801281c: 29 81 00 04 lw r1,(r12+4)
8012820: fb ff e9 c9 calli 800cf44 <fclose>
fclose (stdout);
8012824: 29 61 00 00 lw r1,(r11+0)
8012828: 28 21 00 08 lw r1,(r1+8)
801282c: fb ff e9 c6 calli 800cf44 <fclose>
fclose (stderr);
8012830: 29 61 00 00 lw r1,(r11+0)
8012834: 28 21 00 0c lw r1,(r1+12)
8012838: fb ff e9 c3 calli 800cf44 <fclose>
}
801283c: 2b 9d 00 04 lw ra,(sp+4)
8012840: 2b 8b 00 0c lw r11,(sp+12)
8012844: 2b 8c 00 08 lw r12,(sp+8)
8012848: 37 9c 00 0c addi sp,sp,12
801284c: c3 a0 00 00 ret
080018ac <malloc>:
#include "malloc_p.h"
void *malloc(
size_t size
)
{
80018ac: 37 9c ff f4 addi sp,sp,-12
80018b0: 5b 8b 00 0c sw (sp+12),r11
80018b4: 5b 8c 00 08 sw (sp+8),r12
80018b8: 5b 9d 00 04 sw (sp+4),ra
void *return_this;
MSBUMP(malloc_calls, 1);
80018bc: 78 03 08 01 mvhi r3,0x801
80018c0: 38 63 47 48 ori r3,r3,0x4748
80018c4: 28 62 00 04 lw r2,(r3+4)
#include "malloc_p.h"
void *malloc(
size_t size
)
{
80018c8: b8 20 60 00 mv r12,r1
/*
* Validate the parameters
*/
if ( !size )
return (void *) 0;
80018cc: 34 0b 00 00 mvi r11,0
size_t size
)
{
void *return_this;
MSBUMP(malloc_calls, 1);
80018d0: 34 41 00 01 addi r1,r2,1
80018d4: 58 61 00 04 sw (r3+4),r1
/*
* If some free's have been deferred, then do them now.
*/
malloc_deferred_frees_process();
80018d8: fb ff ff 9a calli 8001740 <malloc_deferred_frees_process>
/*
* Validate the parameters
*/
if ( !size )
80018dc: 45 80 00 1d be r12,r0,8001950 <malloc+0xa4>
return (void *) 0;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
80018e0: 78 01 08 01 mvhi r1,0x801
80018e4: 38 21 4a 20 ori r1,r1,0x4a20
80018e8: 28 22 00 00 lw r2,(r1+0)
80018ec: 34 01 00 03 mvi r1,3
80018f0: 44 41 00 28 be r2,r1,8001990 <malloc+0xe4>
RTEMS_INLINE_ROUTINE void *_Protected_heap_Allocate(
Heap_Control *heap,
uintptr_t size
)
{
return _Protected_heap_Allocate_aligned_with_boundary( heap, size, 0, 0 );
80018f4: 78 01 08 01 mvhi r1,0x801
80018f8: 38 21 40 1c ori r1,r1,0x401c
80018fc: 28 21 00 00 lw r1,(r1+0)
8001900: b9 80 10 00 mv r2,r12
8001904: 34 03 00 00 mvi r3,0
8001908: 34 04 00 00 mvi r4,0
800190c: f8 00 0d 4e calli 8004e44 <_Protected_heap_Allocate_aligned_with_boundary>
8001910: b8 20 58 00 mv r11,r1
* If this fails then return a NULL pointer.
*/
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
if ( !return_this ) {
8001914: 44 20 00 15 be r1,r0,8001968 <malloc+0xbc>
}
/*
* If the user wants us to dirty the allocated memory, then do it.
*/
if ( rtems_malloc_dirty_helper )
8001918: 78 01 08 01 mvhi r1,0x801
800191c: 38 21 46 68 ori r1,r1,0x4668
8001920: 28 23 00 00 lw r3,(r1+0)
8001924: 44 60 00 04 be r3,r0,8001934 <malloc+0x88>
(*rtems_malloc_dirty_helper)( return_this, size );
8001928: b9 60 08 00 mv r1,r11
800192c: b9 80 10 00 mv r2,r12
8001930: d8 60 00 00 call r3
/*
* If configured, update the statistics
*/
if ( rtems_malloc_statistics_helpers )
8001934: 78 01 08 01 mvhi r1,0x801
8001938: 38 21 46 60 ori r1,r1,0x4660
800193c: 28 21 00 00 lw r1,(r1+0)
8001940: 44 20 00 04 be r1,r0,8001950 <malloc+0xa4>
(*rtems_malloc_statistics_helpers->at_malloc)(return_this);
8001944: 28 22 00 04 lw r2,(r1+4)
8001948: b9 60 08 00 mv r1,r11
800194c: d8 40 00 00 call r2
return return_this;
}
8001950: b9 60 08 00 mv r1,r11
8001954: 2b 9d 00 04 lw ra,(sp+4)
8001958: 2b 8b 00 0c lw r11,(sp+12)
800195c: 2b 8c 00 08 lw r12,(sp+8)
8001960: 37 9c 00 0c addi sp,sp,12
8001964: c3 a0 00 00 ret
*/
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
if ( !return_this ) {
if (rtems_malloc_sbrk_helpers)
8001968: 78 01 08 01 mvhi r1,0x801
800196c: 38 21 46 64 ori r1,r1,0x4664
8001970: 28 21 00 00 lw r1,(r1+0)
8001974: 44 2b 00 0a be r1,r11,800199c <malloc+0xf0>
return_this = (*rtems_malloc_sbrk_helpers->extend)( size );
8001978: 28 22 00 04 lw r2,(r1+4)
800197c: b9 80 08 00 mv r1,r12
8001980: d8 40 00 00 call r2
if ( !return_this ) {
8001984: 44 20 00 06 be r1,r0,800199c <malloc+0xf0>
8001988: b8 20 58 00 mv r11,r1
800198c: e3 ff ff e3 bi 8001918 <malloc+0x6c>
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
!malloc_is_system_state_OK() )
8001990: fb ff ff 5a calli 80016f8 <malloc_is_system_state_OK>
return (void *) 0;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
8001994: 5c 20 ff d8 bne r1,r0,80018f4 <malloc+0x48> <== ALWAYS TAKEN
8001998: e3 ff ff ee bi 8001950 <malloc+0xa4> <== NOT EXECUTED
if ( !return_this ) {
if (rtems_malloc_sbrk_helpers)
return_this = (*rtems_malloc_sbrk_helpers->extend)( size );
if ( !return_this ) {
errno = ENOMEM;
800199c: f8 00 2d 0a calli 800cdc4 <__errno>
80019a0: 34 02 00 0c mvi r2,12
80019a4: 58 22 00 00 sw (r1+0),r2
return (void *) 0;
80019a8: e3 ff ff ea bi 8001950 <malloc+0xa4>
08001d54 <malloc_sbrk_extend_and_allocate>:
}
void *malloc_sbrk_extend_and_allocate(
size_t size
)
{
8001d54: 37 9c ff ec addi sp,sp,-20
8001d58: 5b 8b 00 14 sw (sp+20),r11
8001d5c: 5b 8c 00 10 sw (sp+16),r12
8001d60: 5b 8d 00 0c sw (sp+12),r13
8001d64: 5b 8e 00 08 sw (sp+8),r14
8001d68: 5b 9d 00 04 sw (sp+4),ra
* Round to the "requested sbrk amount" so hopefully we won't have
* to grow again for a while. This effectively does sbrk() calls
* in "page" amounts.
*/
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
8001d6c: 78 02 08 01 mvhi r2,0x801
8001d70: 38 42 58 b0 ori r2,r2,0x58b0
8001d74: 28 4b 00 00 lw r11,(r2+0)
}
void *malloc_sbrk_extend_and_allocate(
size_t size
)
{
8001d78: b8 20 68 00 mv r13,r1
*/
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
if ( sbrk_amount == 0 )
return (void *) 0;
8001d7c: 34 0c 00 00 mvi r12,0
* in "page" amounts.
*/
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
if ( sbrk_amount == 0 )
8001d80: 5d 60 00 09 bne r11,r0,8001da4 <malloc_sbrk_extend_and_allocate+0x50><== ALWAYS TAKEN
MSBUMP(space_available, the_size);
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
return return_this;
}
8001d84: b9 80 08 00 mv r1,r12
8001d88: 2b 9d 00 04 lw ra,(sp+4)
8001d8c: 2b 8b 00 14 lw r11,(sp+20)
8001d90: 2b 8c 00 10 lw r12,(sp+16)
8001d94: 2b 8d 00 0c lw r13,(sp+12)
8001d98: 2b 8e 00 08 lw r14,(sp+8)
8001d9c: 37 9c 00 14 addi sp,sp,20
8001da0: c3 a0 00 00 ret
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
if ( sbrk_amount == 0 )
return (void *) 0;
the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount);
8001da4: b9 60 10 00 mv r2,r11
8001da8: b4 2b 08 00 add r1,r1,r11
8001dac: f8 00 43 17 calli 8012a08 <__udivsi3>
8001db0: b9 60 10 00 mv r2,r11
8001db4: f8 00 42 b0 calli 8012874 <__mulsi3>
8001db8: b8 20 70 00 mv r14,r1
starting_address = (void *) sbrk(the_size);
8001dbc: fb ff f9 c2 calli 80004c4 <sbrk>
8001dc0: b8 20 10 00 mv r2,r1
if ( starting_address == (void*) -1 )
8001dc4: 34 01 ff ff mvi r1,-1
8001dc8: 44 41 ff ef be r2,r1,8001d84 <malloc_sbrk_extend_and_allocate+0x30>
return (void *) 0;
if ( !_Protected_heap_Extend(
8001dcc: 78 0b 08 01 mvhi r11,0x801
8001dd0: 39 6b 50 1c ori r11,r11,0x501c
8001dd4: 29 61 00 00 lw r1,(r11+0)
8001dd8: b9 c0 18 00 mv r3,r14
8001ddc: f8 00 0d 08 calli 80051fc <_Protected_heap_Extend>
8001de0: 44 20 00 0d be r1,r0,8001e14 <malloc_sbrk_extend_and_allocate+0xc0>
sbrk(-the_size);
errno = ENOMEM;
return (void *) 0;
}
MSBUMP(space_available, the_size);
8001de4: 78 05 08 01 mvhi r5,0x801
8001de8: 38 a5 58 80 ori r5,r5,0x5880
8001dec: 28 a3 00 00 lw r3,(r5+0)
8001df0: 29 61 00 00 lw r1,(r11+0)
8001df4: b9 a0 10 00 mv r2,r13
8001df8: b5 c3 70 00 add r14,r14,r3
8001dfc: 34 04 00 00 mvi r4,0
8001e00: 34 03 00 00 mvi r3,0
8001e04: 58 ae 00 00 sw (r5+0),r14
8001e08: f8 00 0c e3 calli 8005194 <_Protected_heap_Allocate_aligned_with_boundary>
8001e0c: b8 20 60 00 mv r12,r1
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
return return_this;
8001e10: e3 ff ff dd bi 8001d84 <malloc_sbrk_extend_and_allocate+0x30>
if ( starting_address == (void*) -1 )
return (void *) 0;
if ( !_Protected_heap_Extend(
RTEMS_Malloc_Heap, starting_address, the_size) ) {
sbrk(-the_size);
8001e14: c8 0e 08 00 sub r1,r0,r14
8001e18: fb ff f9 ab calli 80004c4 <sbrk>
errno = ENOMEM;
8001e1c: f8 00 2d ae calli 800d4d4 <__errno>
8001e20: 34 02 00 0c mvi r2,12
8001e24: 58 22 00 00 sw (r1+0),r2
return (void *) 0;
8001e28: e3 ff ff d7 bi 8001d84 <malloc_sbrk_extend_and_allocate+0x30>
0800b1f0 <memfile_free_blocks_in_table>:
*/
void memfile_free_blocks_in_table(
block_p **block_table,
int entries
)
{
800b1f0: 37 9c ff ec addi sp,sp,-20
800b1f4: 5b 8b 00 14 sw (sp+20),r11
800b1f8: 5b 8c 00 10 sw (sp+16),r12
800b1fc: 5b 8d 00 0c sw (sp+12),r13
800b200: 5b 8e 00 08 sw (sp+8),r14
800b204: 5b 9d 00 04 sw (sp+4),ra
800b208: b8 20 70 00 mv r14,r1
800b20c: b8 40 68 00 mv r13,r2
IMFS_assert( block_table );
/*
* Now go through all the slots in the table and free the memory.
*/
b = *block_table;
800b210: 28 2b 00 00 lw r11,(r1+0)
for ( i=0 ; i<entries ; i++ ) {
800b214: 4c 02 00 0b bge r0,r2,800b240 <memfile_free_blocks_in_table+0x50><== NEVER TAKEN
800b218: 34 0c 00 00 mvi r12,0
if ( b[i] ) {
800b21c: 29 63 00 00 lw r3,(r11+0)
/*
* Now go through all the slots in the table and free the memory.
*/
b = *block_table;
for ( i=0 ; i<entries ; i++ ) {
800b220: 35 8c 00 01 addi r12,r12,1
if ( b[i] ) {
memfile_free_block( b[i] );
800b224: b8 60 08 00 mv r1,r3
* Now go through all the slots in the table and free the memory.
*/
b = *block_table;
for ( i=0 ; i<entries ; i++ ) {
if ( b[i] ) {
800b228: 44 60 00 03 be r3,r0,800b234 <memfile_free_blocks_in_table+0x44>
memfile_free_block( b[i] );
800b22c: fb ff ff e6 calli 800b1c4 <memfile_free_block>
b[i] = 0;
800b230: 59 60 00 00 sw (r11+0),r0
/*
* Now go through all the slots in the table and free the memory.
*/
b = *block_table;
for ( i=0 ; i<entries ; i++ ) {
800b234: 35 6b 00 04 addi r11,r11,4
800b238: 49 ac ff f9 bg r13,r12,800b21c <memfile_free_blocks_in_table+0x2c>
800b23c: 29 cb 00 00 lw r11,(r14+0)
/*
* Now that all the blocks in the block table are free, we can
* free the block table itself.
*/
memfile_free_block( *block_table );
800b240: b9 60 08 00 mv r1,r11
800b244: fb ff ff e0 calli 800b1c4 <memfile_free_block>
*block_table = 0;
800b248: 59 c0 00 00 sw (r14+0),r0
}
800b24c: 2b 9d 00 04 lw ra,(sp+4)
800b250: 2b 8b 00 14 lw r11,(sp+20)
800b254: 2b 8c 00 10 lw r12,(sp+16)
800b258: 2b 8d 00 0c lw r13,(sp+12)
800b25c: 2b 8e 00 08 lw r14,(sp+8)
800b260: 37 9c 00 14 addi sp,sp,20
800b264: c3 a0 00 00 ret
0800b87c <memfile_ftruncate>:
*/
int memfile_ftruncate(
rtems_libio_t *iop,
rtems_off64_t length
)
{
800b87c: 37 9c ff f0 addi sp,sp,-16
800b880: 5b 8b 00 08 sw (sp+8),r11
800b884: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
800b888: 28 2b 00 1c lw r11,(r1+28)
* POSIX 1003.1b does not specify what happens if you truncate a file
* and the new length is greater than the current size. We treat this
* as an extend operation.
*/
if ( length > the_jnode->info.file.size )
800b88c: 29 64 00 50 lw r4,(r11+80)
800b890: 48 44 00 13 bg r2,r4,800b8dc <memfile_ftruncate+0x60> <== NEVER TAKEN
800b894: 44 82 00 0f be r4,r2,800b8d0 <memfile_ftruncate+0x54> <== ALWAYS TAKEN
/*
* The in-memory files do not currently reclaim memory until the file is
* deleted. So we leave the previously allocated blocks in place for
* future use and just set the length.
*/
the_jnode->info.file.size = length;
800b898: 59 62 00 50 sw (r11+80),r2
800b89c: 59 63 00 54 sw (r11+84),r3
iop->size = the_jnode->info.file.size;
800b8a0: 58 22 00 08 sw (r1+8),r2
800b8a4: 58 23 00 0c sw (r1+12),r3
IMFS_update_atime( the_jnode );
800b8a8: 34 02 00 00 mvi r2,0
800b8ac: 37 81 00 0c addi r1,sp,12
800b8b0: fb ff d7 2c calli 8001560 <gettimeofday>
800b8b4: 2b 82 00 0c lw r2,(sp+12)
return 0;
800b8b8: 34 01 00 00 mvi r1,0
* future use and just set the length.
*/
the_jnode->info.file.size = length;
iop->size = the_jnode->info.file.size;
IMFS_update_atime( the_jnode );
800b8bc: 59 62 00 40 sw (r11+64),r2
return 0;
}
800b8c0: 2b 9d 00 04 lw ra,(sp+4)
800b8c4: 2b 8b 00 08 lw r11,(sp+8)
800b8c8: 37 9c 00 10 addi sp,sp,16
800b8cc: c3 a0 00 00 ret
* POSIX 1003.1b does not specify what happens if you truncate a file
* and the new length is greater than the current size. We treat this
* as an extend operation.
*/
if ( length > the_jnode->info.file.size )
800b8d0: 29 64 00 54 lw r4,(r11+84)
800b8d4: 54 64 00 02 bgu r3,r4,800b8dc <memfile_ftruncate+0x60>
800b8d8: e3 ff ff f0 bi 800b898 <memfile_ftruncate+0x1c>
return IMFS_memfile_extend( the_jnode, length );
800b8dc: b9 60 08 00 mv r1,r11
800b8e0: b8 60 10 00 mv r2,r3
800b8e4: fb ff fe d8 calli 800b444 <IMFS_memfile_extend>
iop->size = the_jnode->info.file.size;
IMFS_update_atime( the_jnode );
return 0;
}
800b8e8: 2b 9d 00 04 lw ra,(sp+4)
800b8ec: 2b 8b 00 08 lw r11,(sp+8)
800b8f0: 37 9c 00 10 addi sp,sp,16
800b8f4: c3 a0 00 00 ret
0800b8f8 <memfile_lseek>:
rtems_off64_t memfile_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
800b8f8: 37 9c ff f4 addi sp,sp,-12
800b8fc: 5b 8b 00 0c sw (sp+12),r11
800b900: 5b 8c 00 08 sw (sp+8),r12
800b904: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
800b908: 28 2c 00 1c lw r12,(r1+28)
rtems_off64_t memfile_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
800b90c: b8 20 58 00 mv r11,r1
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
if (the_jnode->type == IMFS_LINEAR_FILE) {
800b910: 34 01 00 06 mvi r1,6
800b914: 29 82 00 4c lw r2,(r12+76)
800b918: 44 41 00 10 be r2,r1,800b958 <memfile_lseek+0x60>
if (iop->offset > the_jnode->info.linearfile.size)
iop->offset = the_jnode->info.linearfile.size;
}
else { /* Must be a block file (IMFS_MEMORY_FILE). */
if (IMFS_memfile_extend( the_jnode, iop->offset ))
800b91c: 29 62 00 14 lw r2,(r11+20)
800b920: b9 80 08 00 mv r1,r12
800b924: fb ff fe c8 calli 800b444 <IMFS_memfile_extend>
800b928: 5c 20 00 1d bne r1,r0,800b99c <memfile_lseek+0xa4>
rtems_set_errno_and_return_minus_one( ENOSPC );
iop->size = the_jnode->info.file.size;
800b92c: 29 83 00 50 lw r3,(r12+80)
800b930: 29 61 00 10 lw r1,(r11+16)
800b934: 29 62 00 14 lw r2,(r11+20)
800b938: 59 63 00 08 sw (r11+8),r3
800b93c: 29 83 00 54 lw r3,(r12+84)
800b940: 59 63 00 0c sw (r11+12),r3
}
return iop->offset;
}
800b944: 2b 9d 00 04 lw ra,(sp+4)
800b948: 2b 8b 00 0c lw r11,(sp+12)
800b94c: 2b 8c 00 08 lw r12,(sp+8)
800b950: 37 9c 00 0c addi sp,sp,12
800b954: c3 a0 00 00 ret
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
if (the_jnode->type == IMFS_LINEAR_FILE) {
if (iop->offset > the_jnode->info.linearfile.size)
800b958: 29 61 00 10 lw r1,(r11+16)
800b95c: 29 83 00 50 lw r3,(r12+80)
800b960: 29 62 00 14 lw r2,(r11+20)
800b964: 29 84 00 54 lw r4,(r12+84)
800b968: 48 23 00 04 bg r1,r3,800b978 <memfile_lseek+0x80> <== NEVER TAKEN
800b96c: 5c 23 ff f6 bne r1,r3,800b944 <memfile_lseek+0x4c> <== NEVER TAKEN
800b970: 54 44 00 02 bgu r2,r4,800b978 <memfile_lseek+0x80> <== NEVER TAKEN
800b974: e3 ff ff f4 bi 800b944 <memfile_lseek+0x4c>
iop->offset = the_jnode->info.linearfile.size;
800b978: b8 60 08 00 mv r1,r3 <== NOT EXECUTED
800b97c: b8 80 10 00 mv r2,r4 <== NOT EXECUTED
800b980: 59 63 00 10 sw (r11+16),r3 <== NOT EXECUTED
800b984: 59 64 00 14 sw (r11+20),r4 <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( ENOSPC );
iop->size = the_jnode->info.file.size;
}
return iop->offset;
}
800b988: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800b98c: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
800b990: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
800b994: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
800b998: c3 a0 00 00 ret <== NOT EXECUTED
if (iop->offset > the_jnode->info.linearfile.size)
iop->offset = the_jnode->info.linearfile.size;
}
else { /* Must be a block file (IMFS_MEMORY_FILE). */
if (IMFS_memfile_extend( the_jnode, iop->offset ))
rtems_set_errno_and_return_minus_one( ENOSPC );
800b99c: f8 00 05 0a calli 800cdc4 <__errno>
800b9a0: 34 02 00 1c mvi r2,28
800b9a4: 58 22 00 00 sw (r1+0),r2
800b9a8: 34 01 ff ff mvi r1,-1
800b9ac: 34 02 ff ff mvi r2,-1
800b9b0: e3 ff ff e5 bi 800b944 <memfile_lseek+0x4c>
0800b7ac <memfile_open>:
rtems_libio_t *iop,
const char *pathname,
uint32_t flag,
uint32_t mode
)
{
800b7ac: 37 9c ff f4 addi sp,sp,-12
800b7b0: 5b 8b 00 0c sw (sp+12),r11
800b7b4: 5b 8c 00 08 sw (sp+8),r12
800b7b8: 5b 9d 00 04 sw (sp+4),ra
800b7bc: b8 20 60 00 mv r12,r1
the_jnode = iop->pathinfo.node_access;
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
800b7c0: 28 21 00 18 lw r1,(r1+24)
uint32_t mode
)
{
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
800b7c4: 29 8b 00 1c lw r11,(r12+28)
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
800b7c8: 20 22 02 04 andi r2,r1,0x204
800b7cc: 44 40 00 04 be r2,r0,800b7dc <memfile_open+0x30>
&& (the_jnode->type == IMFS_LINEAR_FILE)) {
800b7d0: 29 63 00 4c lw r3,(r11+76)
800b7d4: 34 02 00 06 mvi r2,6
800b7d8: 44 62 00 13 be r3,r2,800b824 <memfile_open+0x78> <== NEVER TAKEN
the_jnode->info.file.size = 0;
the_jnode->info.file.indirect = 0;
the_jnode->info.file.doubly_indirect = 0;
the_jnode->info.file.triply_indirect = 0;
if ((count != 0)
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
800b7dc: 29 63 00 50 lw r3,(r11+80)
800b7e0: 29 62 00 54 lw r2,(r11+84)
return -1;
}
if (iop->flags & LIBIO_FLAGS_APPEND)
800b7e4: 20 21 02 00 andi r1,r1,0x200
800b7e8: 5c 20 00 0a bne r1,r0,800b810 <memfile_open+0x64>
iop->offset = the_jnode->info.file.size;
iop->size = the_jnode->info.file.size;
800b7ec: 59 82 00 0c sw (r12+12),r2
800b7f0: 59 83 00 08 sw (r12+8),r3
return 0;
800b7f4: 34 02 00 00 mvi r2,0
}
800b7f8: b8 40 08 00 mv r1,r2
800b7fc: 2b 9d 00 04 lw ra,(sp+4)
800b800: 2b 8b 00 0c lw r11,(sp+12)
800b804: 2b 8c 00 08 lw r12,(sp+8)
800b808: 37 9c 00 0c addi sp,sp,12
800b80c: c3 a0 00 00 ret
if ((count != 0)
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
return -1;
}
if (iop->flags & LIBIO_FLAGS_APPEND)
iop->offset = the_jnode->info.file.size;
800b810: 59 83 00 10 sw (r12+16),r3
800b814: 59 82 00 14 sw (r12+20),r2
800b818: 29 63 00 50 lw r3,(r11+80)
800b81c: 29 62 00 54 lw r2,(r11+84)
800b820: e3 ff ff f3 bi 800b7ec <memfile_open+0x40>
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
&& (the_jnode->type == IMFS_LINEAR_FILE)) {
uint32_t count = the_jnode->info.linearfile.size;
800b824: 29 64 00 54 lw r4,(r11+84) <== NOT EXECUTED
const unsigned char *buffer = the_jnode->info.linearfile.direct;
the_jnode->type = IMFS_MEMORY_FILE;
800b828: 34 01 00 05 mvi r1,5 <== NOT EXECUTED
* Perform 'copy on write' for linear files
*/
if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
&& (the_jnode->type == IMFS_LINEAR_FILE)) {
uint32_t count = the_jnode->info.linearfile.size;
const unsigned char *buffer = the_jnode->info.linearfile.direct;
800b82c: 29 63 00 58 lw r3,(r11+88) <== NOT EXECUTED
the_jnode->type = IMFS_MEMORY_FILE;
800b830: 59 61 00 4c sw (r11+76),r1 <== NOT EXECUTED
the_jnode->info.file.size = 0;
800b834: 59 60 00 50 sw (r11+80),r0 <== NOT EXECUTED
800b838: 59 60 00 54 sw (r11+84),r0 <== NOT EXECUTED
the_jnode->info.file.indirect = 0;
800b83c: 59 60 00 58 sw (r11+88),r0 <== NOT EXECUTED
the_jnode->info.file.doubly_indirect = 0;
800b840: 59 60 00 5c sw (r11+92),r0 <== NOT EXECUTED
the_jnode->info.file.triply_indirect = 0;
800b844: 59 60 00 60 sw (r11+96),r0 <== NOT EXECUTED
if ((count != 0)
800b848: 5c 80 00 05 bne r4,r0,800b85c <memfile_open+0xb0> <== NOT EXECUTED
800b84c: 29 81 00 18 lw r1,(r12+24) <== NOT EXECUTED
800b850: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
800b854: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
800b858: e3 ff ff e3 bi 800b7e4 <memfile_open+0x38> <== NOT EXECUTED
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
800b85c: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
800b860: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800b864: fb ff ff 4e calli 800b59c <IMFS_memfile_write> <== NOT EXECUTED
800b868: 34 03 ff ff mvi r3,-1 <== NOT EXECUTED
return -1;
800b86c: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
the_jnode->info.file.size = 0;
the_jnode->info.file.indirect = 0;
the_jnode->info.file.doubly_indirect = 0;
the_jnode->info.file.triply_indirect = 0;
if ((count != 0)
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
800b870: 44 23 ff e2 be r1,r3,800b7f8 <memfile_open+0x4c> <== NOT EXECUTED
800b874: 29 81 00 18 lw r1,(r12+24) <== NOT EXECUTED
800b878: e3 ff ff d9 bi 800b7dc <memfile_open+0x30> <== NOT EXECUTED
08001b68 <mount>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
8001b68: 37 9c ff b0 addi sp,sp,-80
8001b6c: 5b 8b 00 3c sw (sp+60),r11
8001b70: 5b 8c 00 38 sw (sp+56),r12
8001b74: 5b 8d 00 34 sw (sp+52),r13
8001b78: 5b 8e 00 30 sw (sp+48),r14
8001b7c: 5b 8f 00 2c sw (sp+44),r15
8001b80: 5b 90 00 28 sw (sp+40),r16
8001b84: 5b 91 00 24 sw (sp+36),r17
8001b88: 5b 92 00 20 sw (sp+32),r18
8001b8c: 5b 93 00 1c sw (sp+28),r19
8001b90: 5b 94 00 18 sw (sp+24),r20
8001b94: 5b 95 00 14 sw (sp+20),r21
8001b98: 5b 96 00 10 sw (sp+16),r22
8001b9c: 5b 97 00 0c sw (sp+12),r23
8001ba0: 5b 98 00 08 sw (sp+8),r24
8001ba4: 5b 9d 00 04 sw (sp+4),ra
8001ba8: b8 20 78 00 mv r15,r1
/*
* Are the file system options valid?
*/
if ( options != RTEMS_FILESYSTEM_READ_ONLY &&
8001bac: 34 01 00 01 mvi r1,1
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
8001bb0: b8 80 b0 00 mv r22,r4
8001bb4: b8 40 68 00 mv r13,r2
8001bb8: b8 60 70 00 mv r14,r3
8001bbc: b8 a0 c0 00 mv r24,r5
/*
* Are the file system options valid?
*/
if ( options != RTEMS_FILESYSTEM_READ_ONLY &&
8001bc0: 50 24 00 16 bgeu r1,r4,8001c18 <mount+0xb0>
/*
* Get mount handler
*/
mount_h = rtems_filesystem_get_mount_handler( filesystemtype );
if ( !mount_h )
rtems_set_errno_and_return_minus_one( EINVAL );
8001bc4: f8 00 2c 80 calli 800cdc4 <__errno>
8001bc8: 34 02 00 16 mvi r2,22
8001bcc: 58 22 00 00 sw (r1+0),r2
8001bd0: 34 01 ff ff mvi r1,-1
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
}
8001bd4: 2b 9d 00 04 lw ra,(sp+4)
8001bd8: 2b 8b 00 3c lw r11,(sp+60)
8001bdc: 2b 8c 00 38 lw r12,(sp+56)
8001be0: 2b 8d 00 34 lw r13,(sp+52)
8001be4: 2b 8e 00 30 lw r14,(sp+48)
8001be8: 2b 8f 00 2c lw r15,(sp+44)
8001bec: 2b 90 00 28 lw r16,(sp+40)
8001bf0: 2b 91 00 24 lw r17,(sp+36)
8001bf4: 2b 92 00 20 lw r18,(sp+32)
8001bf8: 2b 93 00 1c lw r19,(sp+28)
8001bfc: 2b 94 00 18 lw r20,(sp+24)
8001c00: 2b 95 00 14 lw r21,(sp+20)
8001c04: 2b 96 00 10 lw r22,(sp+16)
8001c08: 2b 97 00 0c lw r23,(sp+12)
8001c0c: 2b 98 00 08 lw r24,(sp+8)
8001c10: 37 9c 00 50 addi sp,sp,80
8001c14: c3 a0 00 00 ret
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* Get mount handler
*/
mount_h = rtems_filesystem_get_mount_handler( filesystemtype );
8001c18: b8 60 08 00 mv r1,r3
8001c1c: f8 00 1b b5 calli 8008af0 <rtems_filesystem_get_mount_handler>
8001c20: b8 20 b8 00 mv r23,r1
if ( !mount_h )
8001c24: 44 20 ff e8 be r1,r0,8001bc4 <mount+0x5c>
{
rtems_filesystem_fsmount_me_t mount_h = NULL;
rtems_filesystem_location_info_t loc;
rtems_filesystem_mount_table_entry_t *mt_entry = NULL;
rtems_filesystem_location_info_t *loc_to_free = NULL;
bool has_target = target != NULL;
8001c28: 7d b0 00 00 cmpnei r16,r13,0
const char *target_or_null,
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
8001c2c: 46 00 00 8e be r16,r0,8001e64 <mount+0x2fc>
* 4) The mount point exists with the proper permissions to allow mounting
* 5) The selected mount point already has a file system mounted to it
*
*/
int mount(
8001c30: b9 a0 08 00 mv r1,r13
8001c34: f8 00 31 05 calli 800e048 <strlen>
8001c38: b8 20 a0 00 mv r20,r1
8001c3c: 34 33 00 01 addi r19,r1,1
8001c40: b9 a0 a8 00 mv r21,r13
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
8001c44: b9 c0 08 00 mv r1,r14
8001c48: f8 00 31 00 calli 800e048 <strlen>
8001c4c: 34 31 00 01 addi r17,r1,1
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
8001c50: 34 0c 00 00 mvi r12,0
8001c54: 45 e0 00 04 be r15,r0,8001c64 <mount+0xfc>
8001c58: b9 e0 08 00 mv r1,r15
8001c5c: f8 00 30 fb calli 800e048 <strlen>
8001c60: 34 2c 00 01 addi r12,r1,1
size_t target_size = strlen( target ) + 1;
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
+ filesystemtype_size + source_size + target_size;
8001c64: 36 63 00 74 addi r3,r19,116
8001c68: b4 71 18 00 add r3,r3,r17
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
8001c6c: 34 01 00 01 mvi r1,1
8001c70: b4 6c 10 00 add r2,r3,r12
8001c74: fb ff fd 75 calli 8001248 <calloc>
8001c78: b8 20 58 00 mv r11,r1
if ( mt_entry != NULL ) {
8001c7c: 44 20 00 75 be r1,r0,8001e50 <mount+0x2e8> <== NEVER TAKEN
char *str = (char *) mt_entry + sizeof( *mt_entry );
8001c80: 34 32 00 74 addi r18,r1,116
memcpy( str, filesystemtype, filesystemtype_size );
8001c84: b9 c0 10 00 mv r2,r14
8001c88: ba 20 18 00 mv r3,r17
8001c8c: ba 40 08 00 mv r1,r18
8001c90: f8 00 2f 03 calli 800d89c <memcpy>
mt_entry->type = str;
str += filesystemtype_size;
8001c94: b6 51 88 00 add r17,r18,r17
memcpy( str, source_or_null, source_size );
8001c98: b9 80 18 00 mv r3,r12
8001c9c: b9 e0 10 00 mv r2,r15
8001ca0: ba 20 08 00 mv r1,r17
mt_entry->dev = str;
str += source_size;
8001ca4: b6 2c 60 00 add r12,r17,r12
if ( mt_entry != NULL ) {
char *str = (char *) mt_entry + sizeof( *mt_entry );
memcpy( str, filesystemtype, filesystemtype_size );
mt_entry->type = str;
8001ca8: 59 72 00 6c sw (r11+108),r18
str += filesystemtype_size;
memcpy( str, source_or_null, source_size );
8001cac: f8 00 2e fc calli 800d89c <memcpy>
mt_entry->dev = str;
str += source_size;
memcpy( str, target, target_size );
8001cb0: ba 60 18 00 mv r3,r19
8001cb4: b9 80 08 00 mv r1,r12
8001cb8: ba a0 10 00 mv r2,r21
memcpy( str, filesystemtype, filesystemtype_size );
mt_entry->type = str;
str += filesystemtype_size;
memcpy( str, source_or_null, source_size );
mt_entry->dev = str;
8001cbc: 59 71 00 70 sw (r11+112),r17
str += source_size;
memcpy( str, target, target_size );
8001cc0: f8 00 2e f7 calli 800d89c <memcpy>
if ( !mt_entry )
rtems_set_errno_and_return_minus_one( ENOMEM );
mt_entry->mt_fs_root.mt_entry = mt_entry;
mt_entry->options = options;
mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf;
8001cc4: 34 01 00 05 mvi r1,5
8001cc8: 59 61 00 38 sw (r11+56),r1
8001ccc: 34 01 00 80 mvi r1,128
8001cd0: 59 61 00 3c sw (r11+60),r1
8001cd4: 34 01 00 07 mvi r1,7
8001cd8: 34 03 00 ff mvi r3,255
8001cdc: 34 0e 00 01 mvi r14,1
8001ce0: 59 61 00 40 sw (r11+64),r1
8001ce4: 34 01 04 00 mvi r1,1024
memcpy( str, source_or_null, source_size );
mt_entry->dev = str;
str += source_size;
memcpy( str, target, target_size );
mt_entry->target = str;
8001ce8: 59 6c 00 68 sw (r11+104),r12
&target_length
);
if ( !mt_entry )
rtems_set_errno_and_return_minus_one( ENOMEM );
mt_entry->mt_fs_root.mt_entry = mt_entry;
8001cec: 59 6b 00 2c sw (r11+44),r11
mt_entry->options = options;
8001cf0: 59 76 00 30 sw (r11+48),r22
mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf;
8001cf4: 59 63 00 44 sw (r11+68),r3
8001cf8: 59 63 00 48 sw (r11+72),r3
8001cfc: 59 61 00 4c sw (r11+76),r1
8001d00: 59 60 00 50 sw (r11+80),r0
8001d04: 59 60 00 54 sw (r11+84),r0
8001d08: 59 6e 00 58 sw (r11+88),r14
8001d0c: 59 60 00 5c sw (r11+92),r0
8001d10: 59 60 00 60 sw (r11+96),r0
8001d14: 59 60 00 64 sw (r11+100),r0
/*
* The mount_point should be a directory with read/write/execute
* permissions in the existing tree.
*/
if ( has_target ) {
8001d18: 5e 00 00 28 bne r16,r0,8001db8 <mount+0x250>
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
8001d1c: 78 03 08 01 mvhi r3,0x801
8001d20: 38 63 41 14 ori r3,r3,0x4114
}
} else {
/*
* Do we already have a base file system ?
*/
if ( !rtems_chain_is_empty( &mount_chain ) ) {
8001d24: 28 61 00 00 lw r1,(r3+0)
8001d28: 78 03 08 01 mvhi r3,0x801
8001d2c: 38 63 41 18 ori r3,r3,0x4118
)
{
rtems_filesystem_fsmount_me_t mount_h = NULL;
rtems_filesystem_location_info_t loc;
rtems_filesystem_mount_table_entry_t *mt_entry = NULL;
rtems_filesystem_location_info_t *loc_to_free = NULL;
8001d30: 34 0c 00 00 mvi r12,0
}
} else {
/*
* Do we already have a base file system ?
*/
if ( !rtems_chain_is_empty( &mount_chain ) ) {
8001d34: 5c 23 00 51 bne r1,r3,8001e78 <mount+0x310> <== NEVER TAKEN
* mt_point_node.node_access will be left to null to indicate that this
* is the root of the entire file system.
*/
}
if ( (*mount_h)( mt_entry, data ) ) {
8001d38: b9 60 08 00 mv r1,r11
8001d3c: bb 00 10 00 mv r2,r24
8001d40: da e0 00 00 call r23
8001d44: 5c 20 00 54 bne r1,r0,8001e94 <mount+0x32c>
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8001d48: 78 0c 08 01 mvhi r12,0x801
8001d4c: 39 8c 47 34 ori r12,r12,0x4734
8001d50: 29 81 00 00 lw r1,(r12+0)
8001d54: 34 03 00 00 mvi r3,0
8001d58: 34 02 00 00 mvi r2,0
8001d5c: f8 00 03 de calli 8002cd4 <rtems_semaphore_obtain>
8001d60: 78 01 08 01 mvhi r1,0x801
8001d64: 38 21 41 14 ori r1,r1,0x4114
8001d68: b9 60 10 00 mv r2,r11
8001d6c: f8 00 06 d1 calli 80038b0 <_Chain_Append>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
8001d70: 29 81 00 00 lw r1,(r12+0)
8001d74: f8 00 04 34 calli 8002e44 <rtems_semaphore_release>
rtems_libio_unlock();
if ( !has_target )
rtems_filesystem_root = mt_entry->mt_fs_root;
return 0;
8001d78: 34 01 00 00 mvi r1,0
*/
rtems_libio_lock();
rtems_chain_append( &mount_chain, &mt_entry->Node );
rtems_libio_unlock();
if ( !has_target )
8001d7c: 5e 01 ff 96 bne r16,r1,8001bd4 <mount+0x6c>
rtems_filesystem_root = mt_entry->mt_fs_root;
8001d80: 78 02 08 01 mvhi r2,0x801
8001d84: 38 42 41 20 ori r2,r2,0x4120
8001d88: 28 42 00 00 lw r2,(r2+0)
8001d8c: 29 67 00 1c lw r7,(r11+28)
8001d90: 29 66 00 20 lw r6,(r11+32)
8001d94: 29 65 00 24 lw r5,(r11+36)
8001d98: 29 64 00 28 lw r4,(r11+40)
8001d9c: 29 63 00 2c lw r3,(r11+44)
8001da0: 58 47 00 18 sw (r2+24),r7
8001da4: 58 46 00 1c sw (r2+28),r6
8001da8: 58 45 00 20 sw (r2+32),r5
8001dac: 58 44 00 24 sw (r2+36),r4
8001db0: 58 43 00 28 sw (r2+40),r3
8001db4: e3 ff ff 88 bi 8001bd4 <mount+0x6c>
* The mount_point should be a directory with read/write/execute
* permissions in the existing tree.
*/
if ( has_target ) {
if ( rtems_filesystem_evaluate_path(
8001db8: 37 8c 00 40 addi r12,sp,64
8001dbc: ba 80 10 00 mv r2,r20
8001dc0: b9 a0 08 00 mv r1,r13
8001dc4: 34 03 00 07 mvi r3,7
8001dc8: b9 80 20 00 mv r4,r12
8001dcc: 34 05 00 01 mvi r5,1
8001dd0: fb ff fd 60 calli 8001350 <rtems_filesystem_evaluate_path>
8001dd4: 34 02 ff ff mvi r2,-1
8001dd8: 44 22 00 2b be r1,r2,8001e84 <mount+0x31c> <== NEVER TAKEN
/*
* Test to see if it is a directory
*/
if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
8001ddc: 2b 82 00 4c lw r2,(sp+76)
8001de0: b9 80 08 00 mv r1,r12
8001de4: 28 42 00 10 lw r2,(r2+16)
8001de8: d8 40 00 00 call r2
8001dec: 5c 2e 00 33 bne r1,r14,8001eb8 <mount+0x350>
/*
* You can only mount one file system onto a single mount point.
*/
if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) {
8001df0: 2b 82 00 40 lw r2,(sp+64)
8001df4: 78 01 08 00 mvhi r1,0x800
8001df8: 38 21 1a b0 ori r1,r1,0x1ab0
8001dfc: fb ff ff 30 calli 8001abc <rtems_filesystem_mount_iterate>
8001e00: b8 20 68 00 mv r13,r1
8001e04: 5c 20 00 31 bne r1,r0,8001ec8 <mount+0x360>
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
mt_entry->mt_point_node.handlers = loc.handlers;
mt_entry->mt_point_node.ops = loc.ops;
8001e08: 2b 81 00 4c lw r1,(sp+76)
* may have been allocated in loc should not be sent to freenode
* until the system is unmounted. It may be needed to correctly
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
8001e0c: 2b 83 00 40 lw r3,(sp+64)
/*
* This link to the parent is only done when we are dealing with system
* below the base file system
*/
if ( loc.ops->mount_h( mt_entry ) ) {
8001e10: 28 22 00 20 lw r2,(r1+32)
* may have been allocated in loc should not be sent to freenode
* until the system is unmounted. It may be needed to correctly
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
8001e14: 59 63 00 08 sw (r11+8),r3
mt_entry->mt_point_node.handlers = loc.handlers;
mt_entry->mt_point_node.ops = loc.ops;
8001e18: 59 61 00 14 sw (r11+20),r1
* until the system is unmounted. It may be needed to correctly
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
mt_entry->mt_point_node.handlers = loc.handlers;
8001e1c: 2b 83 00 48 lw r3,(sp+72)
mt_entry->mt_point_node.ops = loc.ops;
mt_entry->mt_point_node.mt_entry = loc.mt_entry;
8001e20: 2b 81 00 50 lw r1,(sp+80)
* until the system is unmounted. It may be needed to correctly
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
mt_entry->mt_point_node.handlers = loc.handlers;
8001e24: 59 63 00 10 sw (r11+16),r3
mt_entry->mt_point_node.ops = loc.ops;
mt_entry->mt_point_node.mt_entry = loc.mt_entry;
8001e28: 59 61 00 18 sw (r11+24),r1
/*
* This link to the parent is only done when we are dealing with system
* below the base file system
*/
if ( loc.ops->mount_h( mt_entry ) ) {
8001e2c: b9 60 08 00 mv r1,r11
8001e30: d8 40 00 00 call r2
8001e34: 44 2d ff c1 be r1,r13,8001d38 <mount+0x1d0> <== ALWAYS TAKEN
return 0;
cleanup_and_bail:
free( mt_entry );
8001e38: b9 60 08 00 mv r1,r11
8001e3c: fb ff fd 9b calli 80014a8 <free>
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
8001e40: b9 80 08 00 mv r1,r12
8001e44: fb ff fd 91 calli 8001488 <rtems_filesystem_freenode>
return -1;
8001e48: 34 01 ff ff mvi r1,-1
8001e4c: e3 ff ff 62 bi 8001bd4 <mount+0x6c>
target,
filesystemtype,
&target_length
);
if ( !mt_entry )
rtems_set_errno_and_return_minus_one( ENOMEM );
8001e50: f8 00 2b dd calli 800cdc4 <__errno> <== NOT EXECUTED
8001e54: 34 02 00 0c mvi r2,12 <== NOT EXECUTED
8001e58: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8001e5c: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8001e60: e3 ff ff 5d bi 8001bd4 <mount+0x6c> <== NOT EXECUTED
const char *target_or_null,
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
8001e64: 78 15 08 01 mvhi r21,0x801
8001e68: 34 13 00 02 mvi r19,2
8001e6c: 34 14 00 01 mvi r20,1
8001e70: 3a b5 33 dc ori r21,r21,0x33dc
8001e74: e3 ff ff 74 bi 8001c44 <mount+0xdc>
} else {
/*
* Do we already have a base file system ?
*/
if ( !rtems_chain_is_empty( &mount_chain ) ) {
errno = EINVAL;
8001e78: f8 00 2b d3 calli 800cdc4 <__errno> <== NOT EXECUTED
8001e7c: 34 02 00 16 mvi r2,22 <== NOT EXECUTED
8001e80: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
return 0;
cleanup_and_bail:
free( mt_entry );
8001e84: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8001e88: fb ff fd 88 calli 80014a8 <free> <== NOT EXECUTED
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
8001e8c: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8001e90: e3 ff ff 51 bi 8001bd4 <mount+0x6c> <== NOT EXECUTED
if ( (*mount_h)( mt_entry, data ) ) {
/*
* Try to undo the mount operation
*/
loc.ops->unmount_h( mt_entry );
8001e94: 2b 82 00 4c lw r2,(sp+76)
8001e98: b9 60 08 00 mv r1,r11
8001e9c: 28 42 00 28 lw r2,(r2+40)
8001ea0: d8 40 00 00 call r2
return 0;
cleanup_and_bail:
free( mt_entry );
8001ea4: b9 60 08 00 mv r1,r11
8001ea8: fb ff fd 80 calli 80014a8 <free>
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
8001eac: 34 01 ff ff mvi r1,-1
cleanup_and_bail:
free( mt_entry );
if ( loc_to_free )
8001eb0: 45 80 ff 49 be r12,r0,8001bd4 <mount+0x6c> <== NEVER TAKEN
8001eb4: e3 ff ff e3 bi 8001e40 <mount+0x2d8>
/*
* Test to see if it is a directory
*/
if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
errno = ENOTDIR;
8001eb8: f8 00 2b c3 calli 800cdc4 <__errno>
8001ebc: 34 02 00 14 mvi r2,20
8001ec0: 58 22 00 00 sw (r1+0),r2
goto cleanup_and_bail;
8001ec4: e3 ff ff dd bi 8001e38 <mount+0x2d0>
/*
* You can only mount one file system onto a single mount point.
*/
if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) {
errno = EBUSY;
8001ec8: f8 00 2b bf calli 800cdc4 <__errno>
8001ecc: 34 02 00 10 mvi r2,16
8001ed0: 58 22 00 00 sw (r1+0),r2
goto cleanup_and_bail;
8001ed4: e3 ff ff d9 bi 8001e38 <mount+0x2d0>
080021dc <mount_and_make_target_path>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
80021dc: 37 9c ff e8 addi sp,sp,-24
80021e0: 5b 8b 00 18 sw (sp+24),r11
80021e4: 5b 8c 00 14 sw (sp+20),r12
80021e8: 5b 8d 00 10 sw (sp+16),r13
80021ec: 5b 8e 00 0c sw (sp+12),r14
80021f0: 5b 8f 00 08 sw (sp+8),r15
80021f4: 5b 9d 00 04 sw (sp+4),ra
80021f8: b8 40 58 00 mv r11,r2
80021fc: b8 20 78 00 mv r15,r1
8002200: b8 60 70 00 mv r14,r3
8002204: b8 80 68 00 mv r13,r4
8002208: b8 a0 60 00 mv r12,r5
int rv = -1;
if (target != NULL) {
800220c: 44 40 00 1b be r2,r0,8002278 <mount_and_make_target_path+0x9c>
rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO);
8002210: b8 40 08 00 mv r1,r2
8002214: 34 02 01 ff mvi r2,511
8002218: f8 00 02 d2 calli 8002d60 <rtems_mkdir>
if (rv == 0) {
800221c: 44 20 00 09 be r1,r0,8002240 <mount_and_make_target_path+0x64><== ALWAYS TAKEN
} else {
errno = EINVAL;
}
return rv;
}
8002220: 2b 9d 00 04 lw ra,(sp+4)
8002224: 2b 8b 00 18 lw r11,(sp+24)
8002228: 2b 8c 00 14 lw r12,(sp+20)
800222c: 2b 8d 00 10 lw r13,(sp+16)
8002230: 2b 8e 00 0c lw r14,(sp+12)
8002234: 2b 8f 00 08 lw r15,(sp+8)
8002238: 37 9c 00 18 addi sp,sp,24
800223c: c3 a0 00 00 ret
int rv = -1;
if (target != NULL) {
rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO);
if (rv == 0) {
rv = mount(
8002240: b9 e0 08 00 mv r1,r15
8002244: b9 60 10 00 mv r2,r11
8002248: b9 c0 18 00 mv r3,r14
800224c: b9 a0 20 00 mv r4,r13
8002250: b9 80 28 00 mv r5,r12
8002254: f8 00 00 3c calli 8002344 <mount>
} else {
errno = EINVAL;
}
return rv;
}
8002258: 2b 9d 00 04 lw ra,(sp+4)
800225c: 2b 8b 00 18 lw r11,(sp+24)
8002260: 2b 8c 00 14 lw r12,(sp+20)
8002264: 2b 8d 00 10 lw r13,(sp+16)
8002268: 2b 8e 00 0c lw r14,(sp+12)
800226c: 2b 8f 00 08 lw r15,(sp+8)
8002270: 37 9c 00 18 addi sp,sp,24
8002274: c3 a0 00 00 ret
options,
data
);
}
} else {
errno = EINVAL;
8002278: f8 00 2b a5 calli 800d10c <__errno>
800227c: 34 02 00 16 mvi r2,22
8002280: 58 22 00 00 sw (r1+0),r2
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
int rv = -1;
8002284: 34 01 ff ff mvi r1,-1
8002288: e3 ff ff e6 bi 8002220 <mount_and_make_target_path+0x44>
08008df4 <mq_open>:
int oflag,
...
/* mode_t mode, */
/* struct mq_attr attr */
)
{
8008df4: 37 9c ff b8 addi sp,sp,-72
8008df8: 5b 8b 00 20 sw (sp+32),r11
8008dfc: 5b 8c 00 1c sw (sp+28),r12
8008e00: 5b 8d 00 18 sw (sp+24),r13
8008e04: 5b 8e 00 14 sw (sp+20),r14
8008e08: 5b 8f 00 10 sw (sp+16),r15
8008e0c: 5b 90 00 0c sw (sp+12),r16
8008e10: 5b 91 00 08 sw (sp+8),r17
8008e14: 5b 9d 00 04 sw (sp+4),ra
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8008e18: 78 09 08 02 mvhi r9,0x802
8008e1c: 39 29 9d b8 ori r9,r9,0x9db8
8008e20: 29 2a 00 00 lw r10,(r9+0)
8008e24: b8 20 80 00 mv r16,r1
8008e28: 5b 82 00 30 sw (sp+48),r2
8008e2c: 35 4a 00 01 addi r10,r10,1
8008e30: 5b 83 00 34 sw (sp+52),r3
8008e34: 5b 84 00 38 sw (sp+56),r4
8008e38: 5b 85 00 3c sw (sp+60),r5
8008e3c: 5b 86 00 40 sw (sp+64),r6
8008e40: 5b 87 00 44 sw (sp+68),r7
8008e44: 5b 88 00 48 sw (sp+72),r8
8008e48: b8 40 68 00 mv r13,r2
8008e4c: 59 2a 00 00 sw (r9+0),r10
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
8008e50: 20 4f 02 00 andi r15,r2,0x200
/* struct mq_attr attr */
)
{
va_list arg;
mode_t mode;
struct mq_attr *attr = NULL;
8008e54: 34 11 00 00 mvi r17,0
POSIX_Message_queue_Control_fd *the_mq_fd;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
8008e58: 5d e0 00 38 bne r15,r0,8008f38 <mq_open+0x144>
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
_POSIX_Message_queue_Allocate_fd( void )
{
return (POSIX_Message_queue_Control_fd *)
_Objects_Allocate( &_POSIX_Message_queue_Information_fds );
8008e5c: 78 0c 08 02 mvhi r12,0x802
8008e60: 39 8c a2 1c ori r12,r12,0xa21c
8008e64: b9 80 08 00 mv r1,r12
8008e68: f8 00 0c 21 calli 800beec <_Objects_Allocate>
8008e6c: b8 20 58 00 mv r11,r1
attr = (struct mq_attr *) va_arg( arg, struct mq_attr * );
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
8008e70: 44 20 00 39 be r1,r0,8008f54 <mq_open+0x160> <== NEVER TAKEN
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( ENFILE );
}
the_mq_fd->oflag = oflag;
8008e74: 58 2d 00 14 sw (r1+20),r13
status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
8008e78: 37 82 00 2c addi r2,sp,44
8008e7c: ba 00 08 00 mv r1,r16
8008e80: f8 00 1f 8e calli 8010cb8 <_POSIX_Message_queue_Name_to_id>
8008e84: b8 20 70 00 mv r14,r1
* If the name to id translation worked, then the message queue exists
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "message queue does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
8008e88: 5c 20 00 22 bne r1,r0,8008f10 <mq_open+0x11c>
} else { /* name -> ID translation succeeded */
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
8008e8c: 21 ad 0a 00 andi r13,r13,0xa00
8008e90: 34 01 0a 00 mvi r1,2560
8008e94: 45 a1 00 36 be r13,r1,8008f6c <mq_open+0x178>
Objects_Id id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control *)
_Objects_Get( &_POSIX_Message_queue_Information, id, location );
8008e98: 2b 82 00 2c lw r2,(sp+44)
8008e9c: 78 01 08 02 mvhi r1,0x802
8008ea0: 37 83 00 24 addi r3,sp,36
8008ea4: 38 21 a0 90 ori r1,r1,0xa090
8008ea8: f8 00 0d 9a calli 800c510 <_Objects_Get>
/*
* In this case we need to do an ID->pointer conversion to
* check the mode.
*/
the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
the_mq->open_count += 1;
8008eac: 28 24 00 18 lw r4,(r1+24)
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
8008eb0: 2d 62 00 0a lhu r2,(r11+10)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8008eb4: 29 83 00 1c lw r3,(r12+28)
8008eb8: 34 84 00 01 addi r4,r4,1
8008ebc: b4 42 10 00 add r2,r2,r2
8008ec0: 58 24 00 18 sw (r1+24),r4
8008ec4: b4 42 10 00 add r2,r2,r2
/*
* In this case we need to do an ID->pointer conversion to
* check the mode.
*/
the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
8008ec8: 5b 81 00 28 sw (sp+40),r1
the_mq->open_count += 1;
the_mq_fd->Queue = the_mq;
8008ecc: 59 61 00 10 sw (r11+16),r1
8008ed0: b4 62 10 00 add r2,r3,r2
8008ed4: 58 4b 00 00 sw (r2+0),r11
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
8008ed8: 59 60 00 0c sw (r11+12),r0
_Objects_Open_string(
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
8008edc: f8 00 11 2b calli 800d388 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
8008ee0: f8 00 11 2a calli 800d388 <_Thread_Enable_dispatch>
return (mqd_t)the_mq_fd->Object.id;
8008ee4: 29 61 00 08 lw r1,(r11+8)
);
_Thread_Enable_dispatch();
return (mqd_t) the_mq_fd->Object.id;
}
8008ee8: 2b 9d 00 04 lw ra,(sp+4)
8008eec: 2b 8b 00 20 lw r11,(sp+32)
8008ef0: 2b 8c 00 1c lw r12,(sp+28)
8008ef4: 2b 8d 00 18 lw r13,(sp+24)
8008ef8: 2b 8e 00 14 lw r14,(sp+20)
8008efc: 2b 8f 00 10 lw r15,(sp+16)
8008f00: 2b 90 00 0c lw r16,(sp+12)
8008f04: 2b 91 00 08 lw r17,(sp+8)
8008f08: 37 9c 00 48 addi sp,sp,72
8008f0c: c3 a0 00 00 ret
if ( status ) {
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
8008f10: 34 01 00 02 mvi r1,2
8008f14: 45 c1 00 1f be r14,r1,8008f90 <mq_open+0x19c>
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd (
POSIX_Message_queue_Control_fd *the_mq_fd
)
{
_Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object );
8008f18: b9 80 08 00 mv r1,r12
8008f1c: b9 60 10 00 mv r2,r11
8008f20: f8 00 0d 03 calli 800c32c <_Objects_Free>
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
8008f24: f8 00 11 19 calli 800d388 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
8008f28: f8 00 30 de calli 80152a0 <__errno>
8008f2c: 58 2e 00 00 sw (r1+0),r14
8008f30: 34 01 ff ff mvi r1,-1
8008f34: e3 ff ff ed bi 8008ee8 <mq_open+0xf4>
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *
_POSIX_Message_queue_Allocate_fd( void )
{
return (POSIX_Message_queue_Control_fd *)
_Objects_Allocate( &_POSIX_Message_queue_Information_fds );
8008f38: 78 0c 08 02 mvhi r12,0x802
8008f3c: 39 8c a2 1c ori r12,r12,0xa21c
8008f40: b9 80 08 00 mv r1,r12
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
attr = (struct mq_attr *) va_arg( arg, struct mq_attr * );
8008f44: 2b 91 00 38 lw r17,(sp+56)
8008f48: f8 00 0b e9 calli 800beec <_Objects_Allocate>
8008f4c: b8 20 58 00 mv r11,r1
va_end(arg);
}
the_mq_fd = _POSIX_Message_queue_Allocate_fd();
if ( !the_mq_fd ) {
8008f50: 5c 20 ff c9 bne r1,r0,8008e74 <mq_open+0x80>
_Thread_Enable_dispatch();
8008f54: f8 00 11 0d calli 800d388 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENFILE );
8008f58: f8 00 30 d2 calli 80152a0 <__errno>
8008f5c: 34 02 00 17 mvi r2,23
8008f60: 58 22 00 00 sw (r1+0),r2
8008f64: 34 01 ff ff mvi r1,-1
8008f68: e3 ff ff e0 bi 8008ee8 <mq_open+0xf4>
RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd (
POSIX_Message_queue_Control_fd *the_mq_fd
)
{
_Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object );
8008f6c: b9 60 10 00 mv r2,r11
8008f70: b9 80 08 00 mv r1,r12
8008f74: f8 00 0c ee calli 800c32c <_Objects_Free>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
8008f78: f8 00 11 04 calli 800d388 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
8008f7c: f8 00 30 c9 calli 80152a0 <__errno>
8008f80: 34 02 00 11 mvi r2,17
8008f84: 58 22 00 00 sw (r1+0),r2
8008f88: 34 01 ff ff mvi r1,-1
8008f8c: e3 ff ff d7 bi 8008ee8 <mq_open+0xf4>
if ( status ) {
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
8008f90: 45 e0 ff e2 be r15,r0,8008f18 <mq_open+0x124>
/*
* At this point, the message queue does not exist and everything has been
* checked. We should go ahead and create a message queue.
*/
status = _POSIX_Message_queue_Create_support(
8008f94: 34 02 00 01 mvi r2,1
8008f98: ba 00 08 00 mv r1,r16
8008f9c: ba 20 18 00 mv r3,r17
8008fa0: 37 84 00 28 addi r4,sp,40
8008fa4: f8 00 1e d7 calli 8010b00 <_POSIX_Message_queue_Create_support>
);
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
8008fa8: 34 02 ff ff mvi r2,-1
8008fac: 44 22 00 0d be r1,r2,8008fe0 <mq_open+0x1ec>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
8008fb0: 2d 61 00 0a lhu r1,(r11+10)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8008fb4: 29 82 00 1c lw r2,(r12+28)
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
return (mqd_t) -1;
}
the_mq_fd->Queue = the_mq;
8008fb8: 2b 83 00 28 lw r3,(sp+40)
8008fbc: b4 21 08 00 add r1,r1,r1
8008fc0: b4 21 08 00 add r1,r1,r1
8008fc4: b4 41 08 00 add r1,r2,r1
8008fc8: 59 63 00 10 sw (r11+16),r3
8008fcc: 58 2b 00 00 sw (r1+0),r11
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
8008fd0: 59 60 00 0c sw (r11+12),r0
&_POSIX_Message_queue_Information_fds,
&the_mq_fd->Object,
NULL
);
_Thread_Enable_dispatch();
8008fd4: f8 00 10 ed calli 800d388 <_Thread_Enable_dispatch>
return (mqd_t) the_mq_fd->Object.id;
8008fd8: 29 61 00 08 lw r1,(r11+8)
8008fdc: e3 ff ff c3 bi 8008ee8 <mq_open+0xf4>
8008fe0: b9 80 08 00 mv r1,r12
8008fe4: b9 60 10 00 mv r2,r11
8008fe8: f8 00 0c d1 calli 800c32c <_Objects_Free>
/*
* errno was set by Create_support, so don't set it again.
*/
if ( status == -1 ) {
_POSIX_Message_queue_Free_fd( the_mq_fd );
_Thread_Enable_dispatch();
8008fec: f8 00 10 e7 calli 800d388 <_Thread_Enable_dispatch>
return (mqd_t) -1;
8008ff0: 34 01 ff ff mvi r1,-1
8008ff4: e3 ff ff bd bi 8008ee8 <mq_open+0xf4>
08002144 <newlib_delete_hook>:
void newlib_delete_hook(
rtems_tcb *current_task,
rtems_tcb *deleted_task
)
{
8002144: 37 9c ff f0 addi sp,sp,-16
8002148: 5b 8b 00 10 sw (sp+16),r11
800214c: 5b 8c 00 0c sw (sp+12),r12
8002150: 5b 8d 00 08 sw (sp+8),r13
8002154: 5b 9d 00 04 sw (sp+4),ra
8002158: b8 20 68 00 mv r13,r1
800215c: b8 40 58 00 mv r11,r2
/*
* The reentrancy structure was allocated by newlib using malloc()
*/
if (current_task == deleted_task) {
8002160: 44 22 00 1e be r1,r2,80021d8 <newlib_delete_hook+0x94>
ptr = _REENT;
} else {
ptr = deleted_task->libc_reent;
8002164: 28 4c 01 18 lw r12,(r2+280)
}
if (ptr && ptr != _global_impure_ptr) {
8002168: 45 80 00 0b be r12,r0,8002194 <newlib_delete_hook+0x50> <== NEVER TAKEN
800216c: 78 02 08 01 mvhi r2,0x801
8002170: 38 42 3a b4 ori r2,r2,0x3ab4
8002174: 28 41 00 00 lw r1,(r2+0)
8002178: 45 81 00 07 be r12,r1,8002194 <newlib_delete_hook+0x50>
_reclaim_reent(ptr);
*/
/*
* Just in case there are some buffers lying around.
*/
_fwalk(ptr, newlib_free_buffers);
800217c: 78 02 08 00 mvhi r2,0x800
8002180: b9 80 08 00 mv r1,r12
8002184: 38 42 1e dc ori r2,r2,0x1edc
8002188: f8 00 2d 5d calli 800d6fc <_fwalk>
#if REENT_MALLOCED
free(ptr);
#else
_Workspace_Free(ptr);
800218c: b9 80 08 00 mv r1,r12
8002190: f8 00 13 7a calli 8006f78 <_Workspace_Free>
#endif
}
deleted_task->libc_reent = NULL;
8002194: 59 60 01 18 sw (r11+280),r0
/*
* Require the switch back to another task to install its own
*/
if ( current_task == deleted_task ) {
8002198: 45 ab 00 07 be r13,r11,80021b4 <newlib_delete_hook+0x70>
_REENT = 0;
}
}
800219c: 2b 9d 00 04 lw ra,(sp+4)
80021a0: 2b 8b 00 10 lw r11,(sp+16)
80021a4: 2b 8c 00 0c lw r12,(sp+12)
80021a8: 2b 8d 00 08 lw r13,(sp+8)
80021ac: 37 9c 00 10 addi sp,sp,16
80021b0: c3 a0 00 00 ret
/*
* Require the switch back to another task to install its own
*/
if ( current_task == deleted_task ) {
_REENT = 0;
80021b4: 78 01 08 01 mvhi r1,0x801
80021b8: 38 21 41 b8 ori r1,r1,0x41b8
80021bc: 58 20 00 00 sw (r1+0),r0
}
}
80021c0: 2b 9d 00 04 lw ra,(sp+4)
80021c4: 2b 8b 00 10 lw r11,(sp+16)
80021c8: 2b 8c 00 0c lw r12,(sp+12)
80021cc: 2b 8d 00 08 lw r13,(sp+8)
80021d0: 37 9c 00 10 addi sp,sp,16
80021d4: c3 a0 00 00 ret
/*
* The reentrancy structure was allocated by newlib using malloc()
*/
if (current_task == deleted_task) {
ptr = _REENT;
80021d8: 78 01 08 01 mvhi r1,0x801
80021dc: 38 21 41 b8 ori r1,r1,0x41b8
80021e0: 28 2c 00 00 lw r12,(r1+0)
80021e4: e3 ff ff e1 bi 8002168 <newlib_delete_hook+0x24>
08001edc <newlib_free_buffers>:
*/
int newlib_free_buffers(
FILE *fp
)
{
8001edc: 37 9c ff f8 addi sp,sp,-8
8001ee0: 5b 8b 00 08 sw (sp+8),r11
8001ee4: 5b 9d 00 04 sw (sp+4),ra
8001ee8: b8 20 58 00 mv r11,r1
switch ( fileno(fp) ) {
8001eec: f8 00 2c cb calli 800d218 <fileno>
8001ef0: 34 02 00 02 mvi r2,2
8001ef4: 54 22 00 09 bgu r1,r2,8001f18 <newlib_free_buffers+0x3c> <== NEVER TAKEN
case 0:
case 1:
case 2:
if (fp->_flags & __SMBF) {
8001ef8: 2d 61 00 0c lhu r1,(r11+12)
8001efc: 20 21 00 80 andi r1,r1,0x80
8001f00: 5c 20 00 0d bne r1,r0,8001f34 <newlib_free_buffers+0x58> <== NEVER TAKEN
break;
default:
fclose(fp);
}
return 0;
}
8001f04: 34 01 00 00 mvi r1,0
8001f08: 2b 9d 00 04 lw ra,(sp+4)
8001f0c: 2b 8b 00 08 lw r11,(sp+8)
8001f10: 37 9c 00 08 addi sp,sp,8
8001f14: c3 a0 00 00 ret
fp->_flags &= ~__SMBF;
fp->_bf._base = fp->_p = (unsigned char *) NULL;
}
break;
default:
fclose(fp);
8001f18: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8001f1c: f8 00 2c 0a calli 800cf44 <fclose> <== NOT EXECUTED
}
return 0;
}
8001f20: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8001f24: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8001f28: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
8001f2c: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
8001f30: c3 a0 00 00 ret <== NOT EXECUTED
switch ( fileno(fp) ) {
case 0:
case 1:
case 2:
if (fp->_flags & __SMBF) {
free( fp->_bf._base );
8001f34: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8001f38: fb ff fd 5c calli 80014a8 <free> <== NOT EXECUTED
fp->_flags &= ~__SMBF;
8001f3c: 2d 61 00 0c lhu r1,(r11+12) <== NOT EXECUTED
fp->_bf._base = fp->_p = (unsigned char *) NULL;
8001f40: 59 60 00 00 sw (r11+0),r0 <== NOT EXECUTED
8001f44: 59 60 00 10 sw (r11+16),r0 <== NOT EXECUTED
case 0:
case 1:
case 2:
if (fp->_flags & __SMBF) {
free( fp->_bf._base );
fp->_flags &= ~__SMBF;
8001f48: 20 21 ff 7f andi r1,r1,0xff7f <== NOT EXECUTED
8001f4c: 0d 61 00 0c sh (r11+12),r1 <== NOT EXECUTED
break;
default:
fclose(fp);
}
return 0;
}
8001f50: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8001f54: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8001f58: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
8001f5c: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
8001f60: c3 a0 00 00 ret <== NOT EXECUTED
08002274 <open>:
int open(
const char *pathname,
int flags,
...
)
{
8002274: 37 9c ff ac addi sp,sp,-84
8002278: 5b 8b 00 24 sw (sp+36),r11
800227c: 5b 8c 00 20 sw (sp+32),r12
8002280: 5b 8d 00 1c sw (sp+28),r13
8002284: 5b 8e 00 18 sw (sp+24),r14
8002288: 5b 8f 00 14 sw (sp+20),r15
800228c: 5b 90 00 10 sw (sp+16),r16
8002290: 5b 91 00 0c sw (sp+12),r17
8002294: 5b 92 00 08 sw (sp+8),r18
8002298: 5b 9d 00 04 sw (sp+4),ra
/*
* Set the Evaluation flags
*/
eval_flags = 0;
status = flags + 1;
800229c: 34 49 00 01 addi r9,r2,1
if ( ( status & _FREAD ) == _FREAD )
eval_flags |= RTEMS_LIBIO_PERMS_READ;
80022a0: 21 2c 00 01 andi r12,r9,0x1
80022a4: b5 8c 60 00 add r12,r12,r12
int open(
const char *pathname,
int flags,
...
)
{
80022a8: 5b 82 00 3c sw (sp+60),r2
80022ac: 5b 83 00 40 sw (sp+64),r3
80022b0: 5b 84 00 44 sw (sp+68),r4
80022b4: 5b 85 00 48 sw (sp+72),r5
80022b8: 5b 86 00 4c sw (sp+76),r6
80022bc: 5b 87 00 50 sw (sp+80),r7
80022c0: 5b 88 00 54 sw (sp+84),r8
*/
eval_flags = 0;
status = flags + 1;
if ( ( status & _FREAD ) == _FREAD )
eval_flags |= RTEMS_LIBIO_PERMS_READ;
if ( ( status & _FWRITE ) == _FWRITE )
80022c4: 21 29 00 02 andi r9,r9,0x2
int open(
const char *pathname,
int flags,
...
)
{
80022c8: b8 40 68 00 mv r13,r2
80022cc: b8 20 70 00 mv r14,r1
* Set the Evaluation flags
*/
eval_flags = 0;
status = flags + 1;
if ( ( status & _FREAD ) == _FREAD )
eval_flags |= RTEMS_LIBIO_PERMS_READ;
80022d0: b5 8c 60 00 add r12,r12,r12
if ( ( status & _FWRITE ) == _FWRITE )
80022d4: 45 20 00 02 be r9,r0,80022dc <open+0x68>
eval_flags |= RTEMS_LIBIO_PERMS_WRITE;
80022d8: 39 8c 00 02 ori r12,r12,0x2
va_start(ap, flags);
mode = va_arg( ap, int );
80022dc: 2b 91 00 40 lw r17,(sp+64)
* code does not require changes here since network file
* descriptors are obtained using socket(), not open().
*/
/* allocate a file control block */
iop = rtems_libio_allocate();
80022e0: f8 00 19 0a calli 8008708 <rtems_libio_allocate>
80022e4: b8 20 58 00 mv r11,r1
if ( iop == 0 ) {
80022e8: 44 20 00 3c be r1,r0,80023d8 <open+0x164>
}
/*
* See if the file exists.
*/
status = rtems_filesystem_evaluate_path(
80022ec: b9 c0 08 00 mv r1,r14
80022f0: f8 00 2f 56 calli 800e048 <strlen>
80022f4: 37 8f 00 28 addi r15,sp,40
80022f8: b8 20 10 00 mv r2,r1
80022fc: b9 80 18 00 mv r3,r12
8002300: b9 c0 08 00 mv r1,r14
8002304: b9 e0 20 00 mv r4,r15
8002308: 34 05 00 01 mvi r5,1
800230c: fb ff fc 11 calli 8001350 <rtems_filesystem_evaluate_path>
pathname, strlen( pathname ), eval_flags, &loc, true );
if ( status == -1 ) {
8002310: 34 02 ff ff mvi r2,-1
8002314: 44 22 00 46 be r1,r2,800242c <open+0x1b8>
if ( status != 0 ) { /* The file did not exist */
rc = EACCES;
goto done;
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
8002318: 21 a2 0a 00 andi r2,r13,0xa00
800231c: 34 01 0a 00 mvi r1,2560
8002320: 44 41 00 33 be r2,r1,80023ec <open+0x178> <== NEVER TAKEN
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
8002324: b9 a0 08 00 mv r1,r13
8002328: 29 6c 00 18 lw r12,(r11+24)
800232c: f8 00 18 cc calli 800865c <rtems_libio_fcntl_flags>
iop->pathinfo = loc;
8002330: 2b 82 00 30 lw r2,(sp+48)
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
8002334: b8 2c 08 00 or r1,r1,r12
iop->pathinfo = loc;
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
8002338: b9 a0 18 00 mv r3,r13
800233c: 28 45 00 00 lw r5,(r2+0)
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
8002340: 59 61 00 18 sw (r11+24),r1
iop->pathinfo = loc;
8002344: 2b 81 00 28 lw r1,(sp+40)
8002348: 59 62 00 24 sw (r11+36),r2
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
800234c: ba 20 20 00 mv r4,r17
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
iop->pathinfo = loc;
8002350: 59 61 00 1c sw (r11+28),r1
8002354: 2b 81 00 2c lw r1,(sp+44)
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
8002358: b9 c0 10 00 mv r2,r14
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
iop->pathinfo = loc;
800235c: 59 61 00 20 sw (r11+32),r1
8002360: 2b 81 00 34 lw r1,(sp+52)
8002364: 59 61 00 28 sw (r11+40),r1
8002368: 2b 81 00 38 lw r1,(sp+56)
800236c: 59 61 00 2c sw (r11+44),r1
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
8002370: b9 60 08 00 mv r1,r11
8002374: d8 a0 00 00 call r5
if ( rc ) {
8002378: 5c 20 00 26 bne r1,r0,8002410 <open+0x19c>
800237c: 78 0c 08 01 mvhi r12,0x801
}
/*
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
8002380: 21 ad 04 00 andi r13,r13,0x400
8002384: 39 8c 47 2c ori r12,r12,0x472c
8002388: 5d a1 00 31 bne r13,r1,800244c <open+0x1d8>
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
rtems_set_errno_and_return_minus_one( rc );
}
return iop - rtems_libio_iops;
800238c: 29 81 00 00 lw r1,(r12+0)
8002390: c9 61 08 00 sub r1,r11,r1
8002394: 14 21 00 01 sri r1,r1,1
8002398: 14 21 00 01 sri r1,r1,1
800239c: 14 21 00 01 sri r1,r1,1
80023a0: 14 21 00 01 sri r1,r1,1
80023a4: 14 21 00 01 sri r1,r1,1
80023a8: 14 21 00 01 sri r1,r1,1
}
80023ac: 2b 9d 00 04 lw ra,(sp+4)
80023b0: 2b 8b 00 24 lw r11,(sp+36)
80023b4: 2b 8c 00 20 lw r12,(sp+32)
80023b8: 2b 8d 00 1c lw r13,(sp+28)
80023bc: 2b 8e 00 18 lw r14,(sp+24)
80023c0: 2b 8f 00 14 lw r15,(sp+20)
80023c4: 2b 90 00 10 lw r16,(sp+16)
80023c8: 2b 91 00 0c lw r17,(sp+12)
80023cc: 2b 92 00 08 lw r18,(sp+8)
80023d0: 37 9c 00 54 addi sp,sp,84
80023d4: c3 a0 00 00 ret
*/
/* allocate a file control block */
iop = rtems_libio_allocate();
if ( iop == 0 ) {
rc = ENFILE;
80023d8: 34 10 00 17 mvi r16,23
if ( rc ) {
if ( iop )
rtems_libio_free( iop );
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
rtems_set_errno_and_return_minus_one( rc );
80023dc: f8 00 2a 7a calli 800cdc4 <__errno>
80023e0: 58 30 00 00 sw (r1+0),r16
80023e4: 34 01 ff ff mvi r1,-1
80023e8: e3 ff ff f1 bi 80023ac <open+0x138>
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
/* We were trying to create a file that already exists */
rc = EEXIST;
loc_to_free = &loc;
80023ec: b9 e0 90 00 mv r18,r15
goto done;
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
/* We were trying to create a file that already exists */
rc = EEXIST;
80023f0: 34 10 00 11 mvi r16,17
*/
done:
va_end(ap);
if ( rc ) {
if ( iop )
80023f4: 45 60 00 03 be r11,r0,8002400 <open+0x18c>
rtems_libio_free( iop );
80023f8: b9 60 08 00 mv r1,r11
80023fc: f8 00 18 fe calli 80087f4 <rtems_libio_free>
if ( loc_to_free )
8002400: 46 40 ff f7 be r18,r0,80023dc <open+0x168>
rtems_filesystem_freenode( loc_to_free );
8002404: ba 40 08 00 mv r1,r18
8002408: fb ff fc 20 calli 8001488 <rtems_filesystem_freenode>
800240c: e3 ff ff f4 bi 80023dc <open+0x168>
iop->flags |= rtems_libio_fcntl_flags( flags );
iop->pathinfo = loc;
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
if ( rc ) {
rc = errno;
8002410: f8 00 2a 6d calli 800cdc4 <__errno>
8002414: 28 30 00 00 lw r16,(r1+0)
rc = EEXIST;
loc_to_free = &loc;
goto done;
}
loc_to_free = &loc;
8002418: b9 e0 90 00 mv r18,r15
800241c: 78 0c 08 01 mvhi r12,0x801
8002420: 39 8c 47 2c ori r12,r12,0x472c
* Single exit and clean up path.
*/
done:
va_end(ap);
if ( rc ) {
8002424: 46 00 ff da be r16,r0,800238c <open+0x118> <== NEVER TAKEN
8002428: e3 ff ff f3 bi 80023f4 <open+0x180>
*/
status = rtems_filesystem_evaluate_path(
pathname, strlen( pathname ), eval_flags, &loc, true );
if ( status == -1 ) {
if ( errno != ENOENT ) {
800242c: f8 00 2a 66 calli 800cdc4 <__errno>
8002430: 28 22 00 00 lw r2,(r1+0)
8002434: 34 01 00 02 mvi r1,2
8002438: 44 41 00 20 be r2,r1,80024b8 <open+0x244>
rc = errno;
800243c: f8 00 2a 62 calli 800cdc4 <__errno>
8002440: 28 30 00 00 lw r16,(r1+0)
int mode;
int rc;
rtems_libio_t *iop = 0;
int status;
rtems_filesystem_location_info_t loc;
rtems_filesystem_location_info_t *loc_to_free = NULL;
8002444: 34 12 00 00 mvi r18,0
pathname, strlen( pathname ), eval_flags, &loc, true );
if ( status == -1 ) {
if ( errno != ENOENT ) {
rc = errno;
goto done;
8002448: e3 ff ff f5 bi 800241c <open+0x1a8>
/*
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
rc = ftruncate( iop - rtems_libio_iops, 0 );
800244c: 29 81 00 00 lw r1,(r12+0)
8002450: 34 02 00 00 mvi r2,0
8002454: c9 61 08 00 sub r1,r11,r1
8002458: 14 21 00 01 sri r1,r1,1
800245c: 14 21 00 01 sri r1,r1,1
8002460: 14 21 00 01 sri r1,r1,1
8002464: 14 21 00 01 sri r1,r1,1
8002468: 14 21 00 01 sri r1,r1,1
800246c: 14 21 00 01 sri r1,r1,1
8002470: f8 00 18 2a calli 8008518 <ftruncate>
8002474: b8 20 80 00 mv r16,r1
if ( rc ) {
8002478: 44 20 ff c5 be r1,r0,800238c <open+0x118>
if(errno) rc = errno;
800247c: f8 00 2a 52 calli 800cdc4 <__errno>
8002480: 28 21 00 00 lw r1,(r1+0)
8002484: 5c 20 00 1a bne r1,r0,80024ec <open+0x278> <== ALWAYS TAKEN
close( iop - rtems_libio_iops );
8002488: 29 81 00 00 lw r1,(r12+0)
/* those are released by close(): */
iop = 0;
loc_to_free = NULL;
800248c: 34 12 00 00 mvi r18,0
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
rc = ftruncate( iop - rtems_libio_iops, 0 );
if ( rc ) {
if(errno) rc = errno;
close( iop - rtems_libio_iops );
8002490: c9 61 08 00 sub r1,r11,r1
8002494: 14 21 00 01 sri r1,r1,1
/* those are released by close(): */
iop = 0;
8002498: 34 0b 00 00 mvi r11,0
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
rc = ftruncate( iop - rtems_libio_iops, 0 );
if ( rc ) {
if(errno) rc = errno;
close( iop - rtems_libio_iops );
800249c: 14 21 00 01 sri r1,r1,1
80024a0: 14 21 00 01 sri r1,r1,1
80024a4: 14 21 00 01 sri r1,r1,1
80024a8: 14 21 00 01 sri r1,r1,1
80024ac: 14 21 00 01 sri r1,r1,1
80024b0: f8 00 17 ea calli 8008458 <close>
80024b4: e3 ff ff da bi 800241c <open+0x1a8>
rc = errno;
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
80024b8: 21 a1 02 00 andi r1,r13,0x200
int mode;
int rc;
rtems_libio_t *iop = 0;
int status;
rtems_filesystem_location_info_t loc;
rtems_filesystem_location_info_t *loc_to_free = NULL;
80024bc: 34 12 00 00 mvi r18,0
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
rc = ENOENT;
80024c0: 34 10 00 02 mvi r16,2
rc = errno;
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
80024c4: 44 20 ff cc be r1,r0,80023f4 <open+0x180>
rc = ENOENT;
goto done;
}
/* Create the node for the new regular file */
rc = mknod( pathname, S_IFREG | mode, 0LL );
80024c8: b9 c0 08 00 mv r1,r14
80024cc: 3a 22 80 00 ori r2,r17,0x8000
80024d0: 34 03 00 00 mvi r3,0
80024d4: 34 04 00 00 mvi r4,0
80024d8: fb ff fd 3e calli 80019d0 <mknod>
if ( rc ) {
80024dc: 44 20 00 07 be r1,r0,80024f8 <open+0x284> <== ALWAYS TAKEN
rc = errno;
80024e0: f8 00 2a 39 calli 800cdc4 <__errno> <== NOT EXECUTED
80024e4: 28 30 00 00 lw r16,(r1+0) <== NOT EXECUTED
goto done;
80024e8: e3 ff ff cd bi 800241c <open+0x1a8> <== NOT EXECUTED
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
rc = ftruncate( iop - rtems_libio_iops, 0 );
if ( rc ) {
if(errno) rc = errno;
80024ec: f8 00 2a 36 calli 800cdc4 <__errno>
80024f0: 28 30 00 00 lw r16,(r1+0)
80024f4: e3 ff ff e5 bi 8002488 <open+0x214>
/*
* After we do the mknod(), we have to evaluate the path to get the
* "loc" structure needed to actually have the file itself open.
* So we created it, and then we need to have "look it up."
*/
status = rtems_filesystem_evaluate_path(
80024f8: b9 c0 08 00 mv r1,r14
80024fc: f8 00 2e d3 calli 800e048 <strlen>
8002500: b8 20 10 00 mv r2,r1
8002504: 34 03 00 00 mvi r3,0
8002508: b9 c0 08 00 mv r1,r14
800250c: b9 e0 20 00 mv r4,r15
8002510: 34 05 00 01 mvi r5,1
8002514: fb ff fb 8f calli 8001350 <rtems_filesystem_evaluate_path>
pathname, strlen( pathname ), 0x0, &loc, true );
if ( status != 0 ) { /* The file did not exist */
rc = EACCES;
8002518: 34 10 00 0d mvi r16,13
* "loc" structure needed to actually have the file itself open.
* So we created it, and then we need to have "look it up."
*/
status = rtems_filesystem_evaluate_path(
pathname, strlen( pathname ), 0x0, &loc, true );
if ( status != 0 ) { /* The file did not exist */
800251c: 5e 41 ff b6 bne r18,r1,80023f4 <open+0x180> <== NEVER TAKEN
8002520: e3 ff ff 81 bi 8002324 <open+0xb0>
080021e8 <open_dev_console>:
/*
* This is a replaceable stub which opens the console, if present.
*/
void open_dev_console(void)
{
80021e8: 37 9c ff f4 addi sp,sp,-12
80021ec: 5b 8b 00 0c sw (sp+12),r11
80021f0: 5b 8c 00 08 sw (sp+8),r12
80021f4: 5b 9d 00 04 sw (sp+4),ra
int stderr_fd;
/*
* Attempt to open /dev/console.
*/
if ((stdin_fd = open("/dev/console", O_RDONLY, 0)) == -1) {
80021f8: 78 0b 08 01 mvhi r11,0x801
80021fc: 39 6b 33 6c ori r11,r11,0x336c
8002200: b9 60 08 00 mv r1,r11
8002204: 34 02 00 00 mvi r2,0
8002208: 34 03 00 00 mvi r3,0
800220c: f8 00 00 1a calli 8002274 <open>
8002210: 34 0c ff ff mvi r12,-1
8002214: 44 2c 00 0b be r1,r12,8002240 <open_dev_console+0x58>
/*
* But if we find /dev/console once, we better find it twice more
* or something is REALLY wrong.
*/
if ((stdout_fd = open("/dev/console", O_WRONLY, 0)) == -1)
8002218: b9 60 08 00 mv r1,r11
800221c: 34 02 00 01 mvi r2,1
8002220: 34 03 00 00 mvi r3,0
8002224: f8 00 00 14 calli 8002274 <open>
8002228: 44 2c 00 0b be r1,r12,8002254 <open_dev_console+0x6c> <== NEVER TAKEN
rtems_fatal_error_occurred( 0x55544431 ); /* error STD1 */
if ((stderr_fd = open("/dev/console", O_WRONLY, 0)) == -1)
800222c: b9 60 08 00 mv r1,r11
8002230: 34 02 00 01 mvi r2,1
8002234: 34 03 00 00 mvi r3,0
8002238: f8 00 00 0f calli 8002274 <open>
800223c: 44 2c 00 0a be r1,r12,8002264 <open_dev_console+0x7c> <== NEVER TAKEN
rtems_fatal_error_occurred( 0x55544432 ); /* error STD2 */
}
8002240: 2b 9d 00 04 lw ra,(sp+4)
8002244: 2b 8b 00 0c lw r11,(sp+12)
8002248: 2b 8c 00 08 lw r12,(sp+8)
800224c: 37 9c 00 0c addi sp,sp,12
8002250: c3 a0 00 00 ret
/*
* But if we find /dev/console once, we better find it twice more
* or something is REALLY wrong.
*/
if ((stdout_fd = open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred( 0x55544431 ); /* error STD1 */
8002254: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
8002258: 38 42 34 64 ori r2,r2,0x3464 <== NOT EXECUTED
800225c: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED
8002260: f8 00 04 7b calli 800344c <rtems_fatal_error_occurred> <== NOT EXECUTED
if ((stderr_fd = open("/dev/console", O_WRONLY, 0)) == -1)
rtems_fatal_error_occurred( 0x55544432 ); /* error STD2 */
8002264: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
8002268: 38 42 34 68 ori r2,r2,0x3468 <== NOT EXECUTED
800226c: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED
8002270: f8 00 04 77 calli 800344c <rtems_fatal_error_occurred> <== NOT EXECUTED
080059d4 <oproc>:
/*
* Handle output processing
*/
static void
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
80059d4: 37 9c ff f4 addi sp,sp,-12
80059d8: 5b 8b 00 08 sw (sp+8),r11
80059dc: 5b 9d 00 04 sw (sp+4),ra
80059e0: b8 40 58 00 mv r11,r2
int i;
if (tty->termios.c_oflag & OPOST) {
80059e4: 28 42 00 34 lw r2,(r2+52)
/*
* Handle output processing
*/
static void
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
80059e8: 33 81 00 0c sb (sp+12),r1
int i;
if (tty->termios.c_oflag & OPOST) {
80059ec: 20 41 00 01 andi r1,r2,0x1
80059f0: 44 20 00 0b be r1,r0,8005a1c <oproc+0x48> <== NEVER TAKEN
switch (c) {
80059f4: 43 81 00 0c lbu r1,(sp+12)
80059f8: 34 03 00 09 mvi r3,9
80059fc: 44 23 00 39 be r1,r3,8005ae0 <oproc+0x10c>
8005a00: 54 23 00 0f bgu r1,r3,8005a3c <oproc+0x68> <== ALWAYS TAKEN
8005a04: 34 03 00 08 mvi r3,8 <== NOT EXECUTED
8005a08: 5c 23 00 11 bne r1,r3,8005a4c <oproc+0x78> <== NOT EXECUTED
}
tty->column += i;
break;
case '\b':
if (tty->column > 0)
8005a0c: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED
8005a10: 4c 01 00 03 bge r0,r1,8005a1c <oproc+0x48> <== NOT EXECUTED
tty->column--;
8005a14: 34 21 ff ff addi r1,r1,-1 <== NOT EXECUTED
8005a18: 59 61 00 28 sw (r11+40),r1 <== NOT EXECUTED
if (!iscntrl(c))
tty->column++;
break;
}
}
rtems_termios_puts (&c, 1, tty);
8005a1c: 37 81 00 0c addi r1,sp,12
8005a20: 34 02 00 01 mvi r2,1
8005a24: b9 60 18 00 mv r3,r11
8005a28: fb ff ff 92 calli 8005870 <rtems_termios_puts>
}
8005a2c: 2b 9d 00 04 lw ra,(sp+4)
8005a30: 2b 8b 00 08 lw r11,(sp+8)
8005a34: 37 9c 00 0c addi sp,sp,12
8005a38: c3 a0 00 00 ret
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
int i;
if (tty->termios.c_oflag & OPOST) {
switch (c) {
8005a3c: 34 03 00 0a mvi r3,10
8005a40: 44 23 00 10 be r1,r3,8005a80 <oproc+0xac>
8005a44: 34 03 00 0d mvi r3,13
8005a48: 44 23 00 1a be r1,r3,8005ab0 <oproc+0xdc> <== NEVER TAKEN
if (tty->column > 0)
tty->column--;
break;
default:
if (tty->termios.c_oflag & OLCUC)
8005a4c: 20 42 00 02 andi r2,r2,0x2
8005a50: 5c 40 00 2e bne r2,r0,8005b08 <oproc+0x134> <== NEVER TAKEN
8005a54: 78 02 08 02 mvhi r2,0x802
8005a58: 38 42 44 10 ori r2,r2,0x4410
8005a5c: 28 42 00 00 lw r2,(r2+0)
c = toupper(c);
if (!iscntrl(c))
8005a60: b4 41 08 00 add r1,r2,r1
8005a64: 40 21 00 01 lbu r1,(r1+1)
8005a68: 20 21 00 20 andi r1,r1,0x20
8005a6c: 5c 20 ff ec bne r1,r0,8005a1c <oproc+0x48> <== NEVER TAKEN
tty->column++;
8005a70: 29 61 00 28 lw r1,(r11+40)
8005a74: 34 21 00 01 addi r1,r1,1
8005a78: 59 61 00 28 sw (r11+40),r1
8005a7c: e3 ff ff e8 bi 8005a1c <oproc+0x48>
int i;
if (tty->termios.c_oflag & OPOST) {
switch (c) {
case '\n':
if (tty->termios.c_oflag & ONLRET)
8005a80: 20 41 00 20 andi r1,r2,0x20
8005a84: 44 20 00 02 be r1,r0,8005a8c <oproc+0xb8> <== ALWAYS TAKEN
tty->column = 0;
8005a88: 59 60 00 28 sw (r11+40),r0 <== NOT EXECUTED
if (tty->termios.c_oflag & ONLCR) {
8005a8c: 20 42 00 04 andi r2,r2,0x4
8005a90: 44 40 ff e3 be r2,r0,8005a1c <oproc+0x48> <== NEVER TAKEN
rtems_termios_puts ("\r", 1, tty);
8005a94: 78 01 08 02 mvhi r1,0x802
8005a98: 38 21 1b 1c ori r1,r1,0x1b1c
8005a9c: 34 02 00 01 mvi r2,1
8005aa0: b9 60 18 00 mv r3,r11
8005aa4: fb ff ff 73 calli 8005870 <rtems_termios_puts>
tty->column = 0;
8005aa8: 59 60 00 28 sw (r11+40),r0
8005aac: e3 ff ff dc bi 8005a1c <oproc+0x48>
}
break;
case '\r':
if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0))
8005ab0: 20 41 00 10 andi r1,r2,0x10 <== NOT EXECUTED
8005ab4: 44 20 00 03 be r1,r0,8005ac0 <oproc+0xec> <== NOT EXECUTED
8005ab8: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED
8005abc: 44 20 ff dc be r1,r0,8005a2c <oproc+0x58> <== NOT EXECUTED
return;
if (tty->termios.c_oflag & OCRNL) {
8005ac0: 20 41 00 08 andi r1,r2,0x8 <== NOT EXECUTED
8005ac4: 44 20 00 05 be r1,r0,8005ad8 <oproc+0x104> <== NOT EXECUTED
c = '\n';
8005ac8: 34 01 00 0a mvi r1,10 <== NOT EXECUTED
8005acc: 33 81 00 0c sb (sp+12),r1 <== NOT EXECUTED
if (tty->termios.c_oflag & ONLRET)
8005ad0: 20 42 00 20 andi r2,r2,0x20 <== NOT EXECUTED
8005ad4: 44 40 ff d2 be r2,r0,8005a1c <oproc+0x48> <== NOT EXECUTED
tty->column = 0;
break;
}
tty->column = 0;
8005ad8: 59 60 00 28 sw (r11+40),r0 <== NOT EXECUTED
break;
8005adc: e3 ff ff d0 bi 8005a1c <oproc+0x48> <== NOT EXECUTED
case '\t':
i = 8 - (tty->column & 7);
8005ae0: 29 61 00 28 lw r1,(r11+40)
8005ae4: 34 03 00 08 mvi r3,8
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
8005ae8: 20 44 18 00 andi r4,r2,0x1800
}
tty->column = 0;
break;
case '\t':
i = 8 - (tty->column & 7);
8005aec: 20 22 00 07 andi r2,r1,0x7
8005af0: c8 62 10 00 sub r2,r3,r2
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
8005af4: 34 03 18 00 mvi r3,6144
8005af8: 44 83 00 12 be r4,r3,8005b40 <oproc+0x16c> <== ALWAYS TAKEN
tty->column += i;
rtems_termios_puts ( " ", i, tty);
return;
}
tty->column += i;
8005afc: b4 41 08 00 add r1,r2,r1 <== NOT EXECUTED
8005b00: 59 61 00 28 sw (r11+40),r1 <== NOT EXECUTED
break;
8005b04: e3 ff ff c6 bi 8005a1c <oproc+0x48> <== NOT EXECUTED
tty->column--;
break;
default:
if (tty->termios.c_oflag & OLCUC)
c = toupper(c);
8005b08: 78 02 08 02 mvhi r2,0x802 <== NOT EXECUTED
8005b0c: 38 42 44 10 ori r2,r2,0x4410 <== NOT EXECUTED
8005b10: 28 42 00 00 lw r2,(r2+0) <== NOT EXECUTED
8005b14: b8 20 18 00 mv r3,r1 <== NOT EXECUTED
8005b18: b4 41 08 00 add r1,r2,r1 <== NOT EXECUTED
8005b1c: 40 24 00 01 lbu r4,(r1+1) <== NOT EXECUTED
8005b20: 34 01 00 02 mvi r1,2 <== NOT EXECUTED
8005b24: 20 84 00 03 andi r4,r4,0x3 <== NOT EXECUTED
8005b28: 44 81 00 04 be r4,r1,8005b38 <oproc+0x164> <== NOT EXECUTED
8005b2c: 20 61 00 ff andi r1,r3,0xff <== NOT EXECUTED
8005b30: 33 81 00 0c sb (sp+12),r1 <== NOT EXECUTED
8005b34: e3 ff ff cb bi 8005a60 <oproc+0x8c> <== NOT EXECUTED
8005b38: 34 63 ff e0 addi r3,r3,-32 <== NOT EXECUTED
8005b3c: e3 ff ff fc bi 8005b2c <oproc+0x158> <== NOT EXECUTED
break;
case '\t':
i = 8 - (tty->column & 7);
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
tty->column += i;
8005b40: b4 41 08 00 add r1,r2,r1
8005b44: 59 61 00 28 sw (r11+40),r1
rtems_termios_puts ( " ", i, tty);
8005b48: 78 01 08 02 mvhi r1,0x802
8005b4c: 38 21 1b 20 ori r1,r1,0x1b20
8005b50: b9 60 18 00 mv r3,r11
8005b54: fb ff ff 47 calli 8005870 <rtems_termios_puts>
return;
8005b58: e3 ff ff b5 bi 8005a2c <oproc+0x58>
08009840 <pipe_create>:
* Called by pipe() to create an anonymous pipe.
*/
int pipe_create(
int filsdes[2]
)
{
8009840: 37 9c ff d8 addi sp,sp,-40
8009844: 5b 8b 00 18 sw (sp+24),r11
8009848: 5b 8c 00 14 sw (sp+20),r12
800984c: 5b 8d 00 10 sw (sp+16),r13
8009850: 5b 8e 00 0c sw (sp+12),r14
8009854: 5b 8f 00 08 sw (sp+8),r15
8009858: 5b 9d 00 04 sw (sp+4),ra
800985c: b8 20 68 00 mv r13,r1
rtems_libio_t *iop;
int err = 0;
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
8009860: 78 01 08 01 mvhi r1,0x801
8009864: 34 02 01 ff mvi r2,511
8009868: 38 21 ec a4 ori r1,r1,0xeca4
800986c: f8 00 07 03 calli 800b478 <rtems_mkdir>
8009870: b8 20 70 00 mv r14,r1
return -1;
8009874: 34 0c ff ff mvi r12,-1
)
{
rtems_libio_t *iop;
int err = 0;
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
8009878: 44 20 00 0a be r1,r0,80098a0 <pipe_create+0x60> <== ALWAYS TAKEN
unlink(fifopath);
}
if(err != 0)
rtems_set_errno_and_return_minus_one(err);
return 0;
}
800987c: b9 80 08 00 mv r1,r12
8009880: 2b 9d 00 04 lw ra,(sp+4)
8009884: 2b 8b 00 18 lw r11,(sp+24)
8009888: 2b 8c 00 14 lw r12,(sp+20)
800988c: 2b 8d 00 10 lw r13,(sp+16)
8009890: 2b 8e 00 0c lw r14,(sp+12)
8009894: 2b 8f 00 08 lw r15,(sp+8)
8009898: 37 9c 00 28 addi sp,sp,40
800989c: c3 a0 00 00 ret
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
80098a0: 78 07 08 01 mvhi r7,0x801
80098a4: 38 e7 ec b4 ori r7,r7,0xecb4
80098a8: 28 e6 00 00 lw r6,(r7+0)
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
80098ac: 78 04 08 02 mvhi r4,0x802
80098b0: 38 84 06 cc ori r4,r4,0x6cc
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
80098b4: 78 07 08 01 mvhi r7,0x801
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
80098b8: 2c 83 00 00 lhu r3,(r4+0)
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
80098bc: 38 e7 ec b8 ori r7,r7,0xecb8
80098c0: 5b 86 00 1c sw (sp+28),r6
80098c4: 28 e6 00 00 lw r6,(r7+0)
80098c8: 37 8b 00 1c addi r11,sp,28
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
80098cc: 34 65 00 01 addi r5,r3,1
80098d0: 78 02 08 01 mvhi r2,0x801
80098d4: 38 42 ec ac ori r2,r2,0xecac
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
80098d8: 59 66 00 04 sw (r11+4),r6
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
80098dc: 0c 85 00 00 sh (r4+0),r5
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
80098e0: 34 06 66 6f mvi r6,26223
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
80098e4: 37 81 00 26 addi r1,sp,38
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
80098e8: 0d 66 00 08 sh (r11+8),r6
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
80098ec: f8 00 18 dd calli 800fc60 <sprintf>
/* Try creating FIFO file until find an available file name */
while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) {
80098f0: b9 60 08 00 mv r1,r11
80098f4: 34 02 01 80 mvi r2,384
80098f8: f8 00 05 fc calli 800b0e8 <mkfifo>
80098fc: b8 20 78 00 mv r15,r1
8009900: 5c 2e 00 31 bne r1,r14,80099c4 <pipe_create+0x184>
return -1;
/* sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); */
}
/* Non-blocking open to avoid waiting for writers */
filsdes[0] = open(fifopath, O_RDONLY | O_NONBLOCK);
8009904: 34 02 40 00 mvi r2,16384
8009908: b9 60 08 00 mv r1,r11
800990c: fb ff e8 ac calli 8003bbc <open>
8009910: 59 a1 00 00 sw (r13+0),r1
8009914: b8 20 10 00 mv r2,r1
if (filsdes[0] < 0) {
8009918: 4c 2f 00 06 bge r1,r15,8009930 <pipe_create+0xf0>
err = errno;
800991c: f8 00 15 5b calli 800ee88 <__errno>
8009920: 28 2e 00 00 lw r14,(r1+0)
/* Delete file at errors, or else if pipe is successfully created
the file node will be deleted after it is closed by all. */
unlink(fifopath);
8009924: b9 60 08 00 mv r1,r11
8009928: fb ff e9 d0 calli 8004068 <unlink>
800992c: e0 00 00 20 bi 80099ac <pipe_create+0x16c>
}
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
8009930: 78 01 08 02 mvhi r1,0x802
8009934: 38 21 00 10 ori r1,r1,0x10
8009938: 28 21 00 00 lw r1,(r1+0)
800993c: 34 03 00 00 mvi r3,0
8009940: 50 41 00 0b bgeu r2,r1,800996c <pipe_create+0x12c> <== NEVER TAKEN
8009944: b4 42 10 00 add r2,r2,r2
8009948: 78 01 08 02 mvhi r1,0x802
800994c: b4 42 10 00 add r2,r2,r2
8009950: 38 21 07 44 ori r1,r1,0x744
8009954: b4 42 10 00 add r2,r2,r2
8009958: b4 42 10 00 add r2,r2,r2
800995c: 28 23 00 00 lw r3,(r1+0)
8009960: b4 42 10 00 add r2,r2,r2
8009964: b4 42 10 00 add r2,r2,r2
8009968: b4 62 18 00 add r3,r3,r2
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
800996c: 28 64 00 18 lw r4,(r3+24)
8009970: 34 02 ff fe mvi r2,-2
filsdes[1] = open(fifopath, O_WRONLY);
8009974: b9 60 08 00 mv r1,r11
unlink(fifopath);
}
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
8009978: a0 82 10 00 and r2,r4,r2
800997c: 58 62 00 18 sw (r3+24),r2
filsdes[1] = open(fifopath, O_WRONLY);
8009980: 34 02 00 01 mvi r2,1
8009984: fb ff e8 8e calli 8003bbc <open>
8009988: 59 a1 00 04 sw (r13+4),r1
int pipe_create(
int filsdes[2]
)
{
rtems_libio_t *iop;
int err = 0;
800998c: 34 0e 00 00 mvi r14,0
iop = rtems_libio_iop(filsdes[0]);
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
filsdes[1] = open(fifopath, O_WRONLY);
if (filsdes[1] < 0) {
8009990: 4c 20 00 05 bge r1,r0,80099a4 <pipe_create+0x164>
err = errno;
8009994: f8 00 15 3d calli 800ee88 <__errno>
8009998: 28 2e 00 00 lw r14,(r1+0)
close(filsdes[0]);
800999c: 29 a1 00 00 lw r1,(r13+0)
80099a0: fb ff e3 7e calli 8002798 <close>
}
unlink(fifopath);
80099a4: b9 60 08 00 mv r1,r11
80099a8: fb ff e9 b0 calli 8004068 <unlink>
}
if(err != 0)
rtems_set_errno_and_return_minus_one(err);
return 0;
80099ac: 34 0c 00 00 mvi r12,0
err = errno;
close(filsdes[0]);
}
unlink(fifopath);
}
if(err != 0)
80099b0: 45 c0 ff b3 be r14,r0,800987c <pipe_create+0x3c>
rtems_set_errno_and_return_minus_one(err);
80099b4: f8 00 15 35 calli 800ee88 <__errno>
80099b8: 58 2e 00 00 sw (r1+0),r14
80099bc: 34 0c ff ff mvi r12,-1
80099c0: e3 ff ff af bi 800987c <pipe_create+0x3c>
memcpy(fifopath, "/tmp/.fifo", 10);
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
/* Try creating FIFO file until find an available file name */
while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) {
if (errno != EEXIST){
80099c4: f8 00 15 31 calli 800ee88 <__errno>
80099c8: e3 ff ff ad bi 800987c <pipe_create+0x3c>
0800b208 <pipe_ioctl>:
pipe_control_t *pipe,
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
800b208: 37 9c ff f4 addi sp,sp,-12
800b20c: 5b 8b 00 0c sw (sp+12),r11
800b210: 5b 8c 00 08 sw (sp+8),r12
800b214: 5b 9d 00 04 sw (sp+4),ra
800b218: b8 60 60 00 mv r12,r3
if (cmd == FIONREAD) {
800b21c: 78 03 08 02 mvhi r3,0x802
800b220: 38 63 21 00 ori r3,r3,0x2100
pipe_control_t *pipe,
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
800b224: b8 20 58 00 mv r11,r1
if (cmd == FIONREAD) {
800b228: 28 61 00 00 lw r1,(r3+0)
*(unsigned int *)buffer = pipe->Length;
PIPE_UNLOCK(pipe);
return 0;
}
return -EINVAL;
800b22c: 34 04 ff ea mvi r4,-22
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
800b230: 44 41 00 07 be r2,r1,800b24c <pipe_ioctl+0x44>
PIPE_UNLOCK(pipe);
return 0;
}
return -EINVAL;
}
800b234: b8 80 08 00 mv r1,r4
800b238: 2b 9d 00 04 lw ra,(sp+4)
800b23c: 2b 8b 00 0c lw r11,(sp+12)
800b240: 2b 8c 00 08 lw r12,(sp+8)
800b244: 37 9c 00 0c addi sp,sp,12
800b248: c3 a0 00 00 ret
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
if (buffer == NULL)
return -EFAULT;
800b24c: 34 04 ff f2 mvi r4,-14
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
if (buffer == NULL)
800b250: 45 80 ff f9 be r12,r0,800b234 <pipe_ioctl+0x2c>
return -EFAULT;
if (! PIPE_LOCK(pipe))
800b254: 29 61 00 28 lw r1,(r11+40)
800b258: 34 02 00 00 mvi r2,0
800b25c: 34 03 00 00 mvi r3,0
800b260: fb ff e8 c7 calli 800557c <rtems_semaphore_obtain>
return -EINTR;
800b264: 34 04 ff fc mvi r4,-4
{
if (cmd == FIONREAD) {
if (buffer == NULL)
return -EFAULT;
if (! PIPE_LOCK(pipe))
800b268: 5c 20 ff f3 bne r1,r0,800b234 <pipe_ioctl+0x2c> <== NEVER TAKEN
return -EINTR;
/* Return length of pipe */
*(unsigned int *)buffer = pipe->Length;
800b26c: 29 62 00 0c lw r2,(r11+12)
PIPE_UNLOCK(pipe);
800b270: 29 61 00 28 lw r1,(r11+40)
if (! PIPE_LOCK(pipe))
return -EINTR;
/* Return length of pipe */
*(unsigned int *)buffer = pipe->Length;
800b274: 59 82 00 00 sw (r12+0),r2
PIPE_UNLOCK(pipe);
800b278: fb ff e9 1d calli 80056ec <rtems_semaphore_release>
return 0;
800b27c: 34 04 00 00 mvi r4,0
800b280: e3 ff ff ed bi 800b234 <pipe_ioctl+0x2c>
0800add8 <pipe_read>:
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800add8: 37 9c ff d4 addi sp,sp,-44
800addc: 5b 8b 00 28 sw (sp+40),r11
800ade0: 5b 8c 00 24 sw (sp+36),r12
800ade4: 5b 8d 00 20 sw (sp+32),r13
800ade8: 5b 8e 00 1c sw (sp+28),r14
800adec: 5b 8f 00 18 sw (sp+24),r15
800adf0: 5b 90 00 14 sw (sp+20),r16
800adf4: 5b 91 00 10 sw (sp+16),r17
800adf8: 5b 92 00 0c sw (sp+12),r18
800adfc: 5b 93 00 08 sw (sp+8),r19
800ae00: 5b 9d 00 04 sw (sp+4),ra
800ae04: b8 20 58 00 mv r11,r1
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
800ae08: 28 21 00 28 lw r1,(r1+40)
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800ae0c: b8 40 88 00 mv r17,r2
800ae10: b8 60 80 00 mv r16,r3
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
800ae14: 34 02 00 00 mvi r2,0
800ae18: 34 03 00 00 mvi r3,0
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800ae1c: b8 80 70 00 mv r14,r4
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
800ae20: fb ff e9 d7 calli 800557c <rtems_semaphore_obtain>
return -EINTR;
800ae24: 34 0d ff fc mvi r13,-4
rtems_libio_t *iop
)
{
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
800ae28: 5c 20 00 23 bne r1,r0,800aeb4 <pipe_read+0xdc> <== NEVER TAKEN
return -EINTR;
while (read < count) {
800ae2c: 34 0d 00 00 mvi r13,0
800ae30: 34 12 00 00 mvi r18,0
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
800ae34: 34 0f ff fc mvi r15,-4
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
800ae38: 46 0d 00 42 be r16,r13,800af40 <pipe_read+0x168> <== NEVER TAKEN
while (PIPE_EMPTY(pipe)) {
800ae3c: 29 65 00 0c lw r5,(r11+12)
800ae40: 5c a0 00 42 bne r5,r0,800af48 <pipe_read+0x170>
/* Not an error */
if (pipe->Writers == 0)
800ae44: 29 64 00 14 lw r4,(r11+20)
800ae48: 44 85 00 3e be r4,r5,800af40 <pipe_read+0x168>
goto out_locked;
if (LIBIO_NODELAY(iop)) {
800ae4c: 29 cc 00 18 lw r12,(r14+24)
800ae50: 21 8c 00 01 andi r12,r12,0x1
800ae54: 5d 80 00 50 bne r12,r0,800af94 <pipe_read+0x1bc>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
800ae58: 29 64 00 18 lw r4,(r11+24)
PIPE_UNLOCK(pipe);
800ae5c: 29 61 00 28 lw r1,(r11+40)
ret = -EAGAIN;
goto out_locked;
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
800ae60: 34 84 00 01 addi r4,r4,1
800ae64: 59 64 00 18 sw (r11+24),r4
PIPE_UNLOCK(pipe);
800ae68: fb ff ea 21 calli 80056ec <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
800ae6c: 29 61 00 2c lw r1,(r11+44)
800ae70: 34 02 00 00 mvi r2,0
800ae74: f8 00 07 61 calli 800cbf8 <rtems_barrier_wait>
800ae78: fc 2c 60 00 cmpne r12,r1,r12
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800ae7c: 29 61 00 28 lw r1,(r11+40)
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
800ae80: c8 0c 60 00 sub r12,r0,r12
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800ae84: 34 02 00 00 mvi r2,0
800ae88: 34 03 00 00 mvi r3,0
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
800ae8c: a1 8f 60 00 and r12,r12,r15
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800ae90: fb ff e9 bb calli 800557c <rtems_semaphore_obtain>
800ae94: 5c 20 00 42 bne r1,r0,800af9c <pipe_read+0x1c4> <== NEVER TAKEN
/* WARN waitingReaders not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingReaders --;
800ae98: 29 64 00 18 lw r4,(r11+24)
800ae9c: 34 84 ff ff addi r4,r4,-1
800aea0: 59 64 00 18 sw (r11+24),r4
if (ret != 0)
800aea4: 45 81 ff e6 be r12,r1,800ae3c <pipe_read+0x64> <== ALWAYS TAKEN
PIPE_WAKEUPWRITERS(pipe);
read += chunk;
}
out_locked:
PIPE_UNLOCK(pipe);
800aea8: 29 61 00 28 lw r1,(r11+40)
800aeac: fb ff ea 10 calli 80056ec <rtems_semaphore_release>
out_nolock:
if (read > 0)
800aeb0: 4c 0d 00 0e bge r0,r13,800aee8 <pipe_read+0x110>
return read;
return ret;
}
800aeb4: b9 a0 08 00 mv r1,r13
800aeb8: 2b 9d 00 04 lw ra,(sp+4)
800aebc: 2b 8b 00 28 lw r11,(sp+40)
800aec0: 2b 8c 00 24 lw r12,(sp+36)
800aec4: 2b 8d 00 20 lw r13,(sp+32)
800aec8: 2b 8e 00 1c lw r14,(sp+28)
800aecc: 2b 8f 00 18 lw r15,(sp+24)
800aed0: 2b 90 00 14 lw r16,(sp+20)
800aed4: 2b 91 00 10 lw r17,(sp+16)
800aed8: 2b 92 00 0c lw r18,(sp+12)
800aedc: 2b 93 00 08 lw r19,(sp+8)
800aee0: 37 9c 00 2c addi sp,sp,44
800aee4: c3 a0 00 00 ret
PIPE_UNLOCK(pipe);
out_nolock:
if (read > 0)
return read;
return ret;
800aee8: b9 80 68 00 mv r13,r12
800aeec: e3 ff ff f2 bi 800aeb4 <pipe_read+0xdc>
if (chunk > chunk1) {
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
800aef0: 29 64 00 00 lw r4,(r11+0)
800aef4: b6 32 08 00 add r1,r17,r18
800aef8: b9 80 18 00 mv r3,r12
800aefc: b4 82 10 00 add r2,r4,r2
800af00: f8 00 17 14 calli 8010b50 <memcpy>
pipe->Start += chunk;
800af04: 29 61 00 08 lw r1,(r11+8)
pipe->Start %= pipe->Size;
800af08: 29 62 00 04 lw r2,(r11+4)
800af0c: b5 81 08 00 add r1,r12,r1
800af10: f8 00 56 00 calli 8020710 <__umodsi3>
pipe->Length -= chunk;
800af14: 29 62 00 0c lw r2,(r11+12)
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
pipe->Start += chunk;
pipe->Start %= pipe->Size;
800af18: 59 61 00 08 sw (r11+8),r1
pipe->Length -= chunk;
800af1c: c8 4c 08 00 sub r1,r2,r12
800af20: 59 61 00 0c sw (r11+12),r1
/* For buffering optimization */
if (PIPE_EMPTY(pipe))
800af24: 5c 20 00 02 bne r1,r0,800af2c <pipe_read+0x154>
pipe->Start = 0;
800af28: 59 60 00 08 sw (r11+8),r0
if (pipe->waitingWriters > 0)
800af2c: 29 61 00 1c lw r1,(r11+28)
800af30: 5c 20 00 1e bne r1,r0,800afa8 <pipe_read+0x1d0>
PIPE_WAKEUPWRITERS(pipe);
read += chunk;
800af34: b5 ac 68 00 add r13,r13,r12
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
800af38: b9 a0 90 00 mv r18,r13
800af3c: 56 0d ff c0 bgu r16,r13,800ae3c <pipe_read+0x64> <== NEVER TAKEN
while (PIPE_EMPTY(pipe)) {
/* Not an error */
if (pipe->Writers == 0)
800af40: 34 0c 00 00 mvi r12,0
800af44: e3 ff ff d9 bi 800aea8 <pipe_read+0xd0>
if (ret != 0)
goto out_locked;
}
/* Read chunk bytes */
chunk = MIN(count - read, pipe->Length);
800af48: ca 12 08 00 sub r1,r16,r18
800af4c: b8 a0 60 00 mv r12,r5
800af50: 50 25 00 02 bgeu r1,r5,800af58 <pipe_read+0x180>
800af54: b8 20 60 00 mv r12,r1
chunk1 = pipe->Size - pipe->Start;
800af58: 29 62 00 08 lw r2,(r11+8)
800af5c: 29 73 00 04 lw r19,(r11+4)
800af60: ca 62 98 00 sub r19,r19,r2
if (chunk > chunk1) {
800af64: 4e 6c ff e3 bge r19,r12,800aef0 <pipe_read+0x118>
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
800af68: 29 64 00 00 lw r4,(r11+0)
800af6c: ba 60 18 00 mv r3,r19
800af70: b6 32 08 00 add r1,r17,r18
800af74: b4 82 10 00 add r2,r4,r2
800af78: f8 00 16 f6 calli 8010b50 <memcpy>
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
800af7c: 29 62 00 00 lw r2,(r11+0)
800af80: b6 53 08 00 add r1,r18,r19
800af84: b6 21 08 00 add r1,r17,r1
800af88: c9 93 18 00 sub r3,r12,r19
800af8c: f8 00 16 f1 calli 8010b50 <memcpy>
800af90: e3 ff ff dd bi 800af04 <pipe_read+0x12c>
/* Not an error */
if (pipe->Writers == 0)
goto out_locked;
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
800af94: 34 0c ff f5 mvi r12,-11
800af98: e3 ff ff c4 bi 800aea8 <pipe_read+0xd0>
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingReaders not restored! */
ret = -EINTR;
800af9c: 34 0c ff fc mvi r12,-4 <== NOT EXECUTED
out_locked:
PIPE_UNLOCK(pipe);
out_nolock:
if (read > 0)
800afa0: 4c 0d ff d2 bge r0,r13,800aee8 <pipe_read+0x110> <== NOT EXECUTED
800afa4: e3 ff ff c4 bi 800aeb4 <pipe_read+0xdc> <== NOT EXECUTED
/* For buffering optimization */
if (PIPE_EMPTY(pipe))
pipe->Start = 0;
if (pipe->waitingWriters > 0)
PIPE_WAKEUPWRITERS(pipe);
800afa8: 29 61 00 30 lw r1,(r11+48)
800afac: 37 82 00 2c addi r2,sp,44
800afb0: f8 00 06 f1 calli 800cb74 <rtems_barrier_release>
800afb4: e3 ff ff e0 bi 800af34 <pipe_read+0x15c>
0800a810 <pipe_release>:
*/
void pipe_release(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
800a810: 37 9c ff ec addi sp,sp,-20
800a814: 5b 8b 00 10 sw (sp+16),r11
800a818: 5b 8c 00 0c sw (sp+12),r12
800a81c: 5b 8d 00 08 sw (sp+8),r13
800a820: 5b 9d 00 04 sw (sp+4),ra
/* WARN pipe not released! */
if (!PIPE_LOCK(pipe))
rtems_fatal_error_occurred(0xdeadbeef);
#endif
mode = LIBIO_ACCMODE(iop);
800a824: 28 4c 00 18 lw r12,(r2+24)
*/
void pipe_release(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
800a828: b8 20 68 00 mv r13,r1
pipe_control_t *pipe = *pipep;
800a82c: 28 2b 00 00 lw r11,(r1+0)
if (!PIPE_LOCK(pipe))
rtems_fatal_error_occurred(0xdeadbeef);
#endif
mode = LIBIO_ACCMODE(iop);
if (mode & LIBIO_FLAGS_READ)
800a830: 21 81 00 02 andi r1,r12,0x2
/* WARN pipe not released! */
if (!PIPE_LOCK(pipe))
rtems_fatal_error_occurred(0xdeadbeef);
#endif
mode = LIBIO_ACCMODE(iop);
800a834: 21 8c 00 06 andi r12,r12,0x6
if (mode & LIBIO_FLAGS_READ)
800a838: 44 20 00 04 be r1,r0,800a848 <pipe_release+0x38>
pipe->Readers --;
800a83c: 29 61 00 10 lw r1,(r11+16)
800a840: 34 21 ff ff addi r1,r1,-1
800a844: 59 61 00 10 sw (r11+16),r1
if (mode & LIBIO_FLAGS_WRITE)
800a848: 21 81 00 04 andi r1,r12,0x4
800a84c: 44 20 00 04 be r1,r0,800a85c <pipe_release+0x4c>
pipe->Writers --;
800a850: 29 61 00 14 lw r1,(r11+20)
800a854: 34 21 ff ff addi r1,r1,-1
800a858: 59 61 00 14 sw (r11+20),r1
PIPE_UNLOCK(pipe);
800a85c: 29 61 00 28 lw r1,(r11+40)
800a860: fb ff eb a3 calli 80056ec <rtems_semaphore_release>
if (pipe->Readers == 0 && pipe->Writers == 0) {
800a864: 29 62 00 10 lw r2,(r11+16)
800a868: 5c 40 00 0c bne r2,r0,800a898 <pipe_release+0x88>
800a86c: 29 61 00 14 lw r1,(r11+20)
800a870: 44 22 00 23 be r1,r2,800a8fc <pipe_release+0xec>
delfile = TRUE;
#endif
pipe_free(pipe);
*pipep = NULL;
}
else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE)
800a874: 7d 8c 00 04 cmpnei r12,r12,4
800a878: 5d 80 00 17 bne r12,r0,800a8d4 <pipe_release+0xc4> <== ALWAYS TAKEN
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
PIPE_WAKEUPREADERS(pipe);
pipe_unlock();
800a87c: fb ff ff dc calli 800a7ec <pipe_unlock> <== NOT EXECUTED
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
800a880: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800a884: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
800a888: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
800a88c: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
800a890: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED
800a894: c3 a0 00 00 ret <== NOT EXECUTED
*pipep = NULL;
}
else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE)
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
800a898: 29 61 00 14 lw r1,(r11+20)
800a89c: 7d 8c 00 02 cmpnei r12,r12,2
800a8a0: 64 21 00 00 cmpei r1,r1,0
800a8a4: a0 2c 60 00 and r12,r1,r12
800a8a8: 45 80 ff f5 be r12,r0,800a87c <pipe_release+0x6c> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
800a8ac: 29 61 00 2c lw r1,(r11+44)
800a8b0: 37 82 00 14 addi r2,sp,20
800a8b4: f8 00 08 b0 calli 800cb74 <rtems_barrier_release>
pipe_unlock();
800a8b8: fb ff ff cd calli 800a7ec <pipe_unlock>
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
800a8bc: 2b 9d 00 04 lw ra,(sp+4)
800a8c0: 2b 8b 00 10 lw r11,(sp+16)
800a8c4: 2b 8c 00 0c lw r12,(sp+12)
800a8c8: 2b 8d 00 08 lw r13,(sp+8)
800a8cc: 37 9c 00 14 addi sp,sp,20
800a8d0: c3 a0 00 00 ret
pipe_free(pipe);
*pipep = NULL;
}
else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE)
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
800a8d4: 29 61 00 30 lw r1,(r11+48)
800a8d8: 37 82 00 14 addi r2,sp,20
800a8dc: f8 00 08 a6 calli 800cb74 <rtems_barrier_release>
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
PIPE_WAKEUPREADERS(pipe);
pipe_unlock();
800a8e0: fb ff ff c3 calli 800a7ec <pipe_unlock>
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
800a8e4: 2b 9d 00 04 lw ra,(sp+4)
800a8e8: 2b 8b 00 10 lw r11,(sp+16)
800a8ec: 2b 8c 00 0c lw r12,(sp+12)
800a8f0: 2b 8d 00 08 lw r13,(sp+8)
800a8f4: 37 9c 00 14 addi sp,sp,20
800a8f8: c3 a0 00 00 ret
/* Called with pipe_semaphore held. */
static inline void pipe_free(
pipe_control_t *pipe
)
{
rtems_barrier_delete(pipe->readBarrier);
800a8fc: 29 61 00 2c lw r1,(r11+44)
800a900: f8 00 08 69 calli 800caa4 <rtems_barrier_delete>
rtems_barrier_delete(pipe->writeBarrier);
800a904: 29 61 00 30 lw r1,(r11+48)
800a908: f8 00 08 67 calli 800caa4 <rtems_barrier_delete>
rtems_semaphore_delete(pipe->Semaphore);
800a90c: 29 61 00 28 lw r1,(r11+40)
800a910: fb ff ea e4 calli 80054a0 <rtems_semaphore_delete>
free(pipe->Buffer);
800a914: 29 61 00 00 lw r1,(r11+0)
800a918: fb ff e3 0f calli 8003554 <free>
free(pipe);
800a91c: b9 60 08 00 mv r1,r11
800a920: fb ff e3 0d calli 8003554 <free>
/* To delete an anonymous pipe file when all users closed it */
if (pipe->Anonymous)
delfile = TRUE;
#endif
pipe_free(pipe);
*pipep = NULL;
800a924: 59 a0 00 00 sw (r13+0),r0
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
PIPE_WAKEUPREADERS(pipe);
pipe_unlock();
800a928: fb ff ff b1 calli 800a7ec <pipe_unlock>
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
800a92c: 2b 9d 00 04 lw ra,(sp+4)
800a930: 2b 8b 00 10 lw r11,(sp+16)
800a934: 2b 8c 00 0c lw r12,(sp+12)
800a938: 2b 8d 00 08 lw r13,(sp+8)
800a93c: 37 9c 00 14 addi sp,sp,20
800a940: c3 a0 00 00 ret
0800afb8 <pipe_write>:
pipe_control_t *pipe,
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800afb8: 37 9c ff d4 addi sp,sp,-44
800afbc: 5b 8b 00 24 sw (sp+36),r11
800afc0: 5b 8c 00 20 sw (sp+32),r12
800afc4: 5b 8d 00 1c sw (sp+28),r13
800afc8: 5b 8e 00 18 sw (sp+24),r14
800afcc: 5b 8f 00 14 sw (sp+20),r15
800afd0: 5b 90 00 10 sw (sp+16),r16
800afd4: 5b 91 00 0c sw (sp+12),r17
800afd8: 5b 92 00 08 sw (sp+8),r18
800afdc: 5b 9d 00 04 sw (sp+4),ra
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
return 0;
800afe0: 34 0b 00 00 mvi r11,0
pipe_control_t *pipe,
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800afe4: b8 60 68 00 mv r13,r3
800afe8: b8 20 60 00 mv r12,r1
800afec: b8 40 70 00 mv r14,r2
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
800aff0: 5c 60 00 0d bne r3,r0,800b024 <pipe_write+0x6c> <== ALWAYS TAKEN
#endif
if (written > 0)
return written;
return ret;
}
800aff4: b9 60 08 00 mv r1,r11
800aff8: 2b 9d 00 04 lw ra,(sp+4)
800affc: 2b 8b 00 24 lw r11,(sp+36)
800b000: 2b 8c 00 20 lw r12,(sp+32)
800b004: 2b 8d 00 1c lw r13,(sp+28)
800b008: 2b 8e 00 18 lw r14,(sp+24)
800b00c: 2b 8f 00 14 lw r15,(sp+20)
800b010: 2b 90 00 10 lw r16,(sp+16)
800b014: 2b 91 00 0c lw r17,(sp+12)
800b018: 2b 92 00 08 lw r18,(sp+8)
800b01c: 37 9c 00 2c addi sp,sp,44
800b020: c3 a0 00 00 ret
/* Write nothing */
if (count == 0)
return 0;
if (! PIPE_LOCK(pipe))
800b024: 28 21 00 28 lw r1,(r1+40)
800b028: 34 02 00 00 mvi r2,0
800b02c: 34 03 00 00 mvi r3,0
800b030: 5b 84 00 28 sw (sp+40),r4
800b034: fb ff e9 52 calli 800557c <rtems_semaphore_obtain>
return -EINTR;
800b038: 34 0b ff fc mvi r11,-4
/* Write nothing */
if (count == 0)
return 0;
if (! PIPE_LOCK(pipe))
800b03c: 2b 84 00 28 lw r4,(sp+40)
800b040: 5c 20 ff ed bne r1,r0,800aff4 <pipe_write+0x3c> <== NEVER TAKEN
return -EINTR;
if (pipe->Readers == 0) {
800b044: 29 82 00 10 lw r2,(r12+16)
800b048: 44 41 00 5a be r2,r1,800b1b0 <pipe_write+0x1f8>
ret = -EPIPE;
goto out_locked;
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
800b04c: 29 8f 00 04 lw r15,(r12+4)
800b050: 34 10 00 01 mvi r16,1
800b054: 55 af 00 02 bgu r13,r15,800b05c <pipe_write+0xa4> <== NEVER TAKEN
800b058: b9 a0 80 00 mv r16,r13
800b05c: 34 12 00 00 mvi r18,0
800b060: 34 0b 00 00 mvi r11,0
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
800b064: 34 11 ff fc mvi r17,-4
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
800b068: 29 81 00 0c lw r1,(r12+12)
800b06c: c9 e1 18 00 sub r3,r15,r1
800b070: 56 03 00 23 bgu r16,r3,800b0fc <pipe_write+0x144>
ret = -EPIPE;
goto out_locked;
}
}
chunk = MIN(count - written, PIPE_SPACE(pipe));
800b074: c9 b2 10 00 sub r2,r13,r18
800b078: b8 60 80 00 mv r16,r3
800b07c: 50 43 00 02 bgeu r2,r3,800b084 <pipe_write+0xcc>
800b080: b8 40 80 00 mv r16,r2
chunk1 = pipe->Size - PIPE_WSTART(pipe);
800b084: 29 83 00 08 lw r3,(r12+8)
800b088: b9 e0 10 00 mv r2,r15
800b08c: 5b 84 00 28 sw (sp+40),r4
800b090: b4 23 08 00 add r1,r1,r3
800b094: f8 00 55 9f calli 8020710 <__umodsi3>
800b098: c9 e1 78 00 sub r15,r15,r1
if (chunk > chunk1) {
800b09c: 2b 84 00 28 lw r4,(sp+40)
800b0a0: 4d f0 00 4c bge r15,r16,800b1d0 <pipe_write+0x218>
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1);
800b0a4: 29 85 00 00 lw r5,(r12+0)
800b0a8: b5 d2 10 00 add r2,r14,r18
800b0ac: b9 e0 18 00 mv r3,r15
800b0b0: b4 a1 08 00 add r1,r5,r1
800b0b4: f8 00 16 a7 calli 8010b50 <memcpy>
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
800b0b8: 29 81 00 00 lw r1,(r12+0)
800b0bc: b5 f2 10 00 add r2,r15,r18
800b0c0: b5 c2 10 00 add r2,r14,r2
800b0c4: ca 0f 18 00 sub r3,r16,r15
800b0c8: f8 00 16 a2 calli 8010b50 <memcpy>
800b0cc: 2b 84 00 28 lw r4,(sp+40)
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
pipe->Length += chunk;
800b0d0: 29 81 00 0c lw r1,(r12+12)
if (pipe->waitingReaders > 0)
800b0d4: 29 82 00 18 lw r2,(r12+24)
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
pipe->Length += chunk;
800b0d8: b4 30 08 00 add r1,r1,r16
800b0dc: 59 81 00 0c sw (r12+12),r1
if (pipe->waitingReaders > 0)
800b0e0: 5c 40 00 44 bne r2,r0,800b1f0 <pipe_write+0x238>
PIPE_WAKEUPREADERS(pipe);
written += chunk;
800b0e4: b5 70 58 00 add r11,r11,r16
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
800b0e8: b9 60 90 00 mv r18,r11
800b0ec: 51 6d 00 21 bgeu r11,r13,800b170 <pipe_write+0x1b8> <== ALWAYS TAKEN
800b0f0: 29 8f 00 04 lw r15,(r12+4) <== NOT EXECUTED
pipe->Length += chunk;
if (pipe->waitingReaders > 0)
PIPE_WAKEUPREADERS(pipe);
written += chunk;
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
800b0f4: 34 10 00 01 mvi r16,1 <== NOT EXECUTED
800b0f8: e3 ff ff dc bi 800b068 <pipe_write+0xb0> <== NOT EXECUTED
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
if (LIBIO_NODELAY(iop)) {
800b0fc: 28 8f 00 18 lw r15,(r4+24)
800b100: 21 ef 00 01 andi r15,r15,0x1
800b104: 5d e0 00 31 bne r15,r0,800b1c8 <pipe_write+0x210>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
800b108: 29 83 00 1c lw r3,(r12+28)
PIPE_UNLOCK(pipe);
800b10c: 29 81 00 28 lw r1,(r12+40)
ret = -EAGAIN;
goto out_locked;
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
800b110: 34 63 00 01 addi r3,r3,1
800b114: 59 83 00 1c sw (r12+28),r3
PIPE_UNLOCK(pipe);
800b118: 5b 84 00 28 sw (sp+40),r4
800b11c: fb ff e9 74 calli 80056ec <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
800b120: 29 81 00 30 lw r1,(r12+48)
800b124: 34 02 00 00 mvi r2,0
800b128: f8 00 06 b4 calli 800cbf8 <rtems_barrier_wait>
800b12c: fc 2f 78 00 cmpne r15,r1,r15
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800b130: 29 81 00 28 lw r1,(r12+40)
800b134: 34 02 00 00 mvi r2,0
800b138: 34 03 00 00 mvi r3,0
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
800b13c: c8 0f 78 00 sub r15,r0,r15
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800b140: fb ff e9 0f calli 800557c <rtems_semaphore_obtain>
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
800b144: a1 f1 78 00 and r15,r15,r17
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800b148: 2b 84 00 28 lw r4,(sp+40)
800b14c: 5c 20 00 1c bne r1,r0,800b1bc <pipe_write+0x204> <== NEVER TAKEN
/* WARN waitingWriters not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingWriters --;
800b150: 29 83 00 1c lw r3,(r12+28)
800b154: 34 63 ff ff addi r3,r3,-1
800b158: 59 83 00 1c sw (r12+28),r3
if (ret != 0)
800b15c: 5d e1 00 06 bne r15,r1,800b174 <pipe_write+0x1bc> <== NEVER TAKEN
goto out_locked;
if (pipe->Readers == 0) {
800b160: 29 81 00 10 lw r1,(r12+16)
800b164: 44 2f 00 11 be r1,r15,800b1a8 <pipe_write+0x1f0> <== NEVER TAKEN
800b168: 29 8f 00 04 lw r15,(r12+4)
800b16c: e3 ff ff bf bi 800b068 <pipe_write+0xb0>
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
800b170: 34 0f 00 00 mvi r15,0
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
}
out_locked:
PIPE_UNLOCK(pipe);
800b174: 29 81 00 28 lw r1,(r12+40)
800b178: fb ff e9 5d calli 80056ec <rtems_semaphore_release>
out_nolock:
#ifdef RTEMS_POSIX_API
/* Signal SIGPIPE */
if (ret == -EPIPE)
800b17c: 34 01 ff e0 mvi r1,-32
800b180: 45 e1 00 05 be r15,r1,800b194 <pipe_write+0x1dc>
kill(getpid(), SIGPIPE);
#endif
if (written > 0)
800b184: 4c 0b 00 02 bge r0,r11,800b18c <pipe_write+0x1d4>
800b188: e3 ff ff 9b bi 800aff4 <pipe_write+0x3c>
800b18c: b9 e0 58 00 mv r11,r15
800b190: e3 ff ff 99 bi 800aff4 <pipe_write+0x3c>
out_nolock:
#ifdef RTEMS_POSIX_API
/* Signal SIGPIPE */
if (ret == -EPIPE)
kill(getpid(), SIGPIPE);
800b194: f8 00 02 aa calli 800bc3c <getpid>
800b198: 34 02 00 0d mvi r2,13
800b19c: f8 00 03 a7 calli 800c038 <kill>
#endif
if (written > 0)
800b1a0: 4c 0b ff fb bge r0,r11,800b18c <pipe_write+0x1d4> <== ALWAYS TAKEN
800b1a4: e3 ff ff 94 bi 800aff4 <pipe_write+0x3c> <== NOT EXECUTED
pipe->waitingWriters --;
if (ret != 0)
goto out_locked;
if (pipe->Readers == 0) {
ret = -EPIPE;
800b1a8: 34 0f ff e0 mvi r15,-32 <== NOT EXECUTED
800b1ac: e3 ff ff f2 bi 800b174 <pipe_write+0x1bc> <== NOT EXECUTED
if (! PIPE_LOCK(pipe))
return -EINTR;
if (pipe->Readers == 0) {
ret = -EPIPE;
800b1b0: 34 0f ff e0 mvi r15,-32
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
int chunk, chunk1, written = 0, ret = 0;
800b1b4: 34 0b 00 00 mvi r11,0
800b1b8: e3 ff ff ef bi 800b174 <pipe_write+0x1bc>
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingWriters not restored! */
ret = -EINTR;
800b1bc: 34 0f ff fc mvi r15,-4 <== NOT EXECUTED
/* Signal SIGPIPE */
if (ret == -EPIPE)
kill(getpid(), SIGPIPE);
#endif
if (written > 0)
800b1c0: 4c 0b ff f3 bge r0,r11,800b18c <pipe_write+0x1d4> <== NOT EXECUTED
800b1c4: e3 ff ff 8c bi 800aff4 <pipe_write+0x3c> <== NOT EXECUTED
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
800b1c8: 34 0f ff f5 mvi r15,-11
800b1cc: e3 ff ff ea bi 800b174 <pipe_write+0x1bc>
if (chunk > chunk1) {
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1);
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
800b1d0: 29 85 00 00 lw r5,(r12+0)
800b1d4: b5 d2 10 00 add r2,r14,r18
800b1d8: ba 00 18 00 mv r3,r16
800b1dc: b4 a1 08 00 add r1,r5,r1
800b1e0: 5b 84 00 28 sw (sp+40),r4
800b1e4: f8 00 16 5b calli 8010b50 <memcpy>
800b1e8: 2b 84 00 28 lw r4,(sp+40)
800b1ec: e3 ff ff b9 bi 800b0d0 <pipe_write+0x118>
pipe->Length += chunk;
if (pipe->waitingReaders > 0)
PIPE_WAKEUPREADERS(pipe);
800b1f0: 29 81 00 2c lw r1,(r12+44)
800b1f4: 37 82 00 2c addi r2,sp,44
800b1f8: 5b 84 00 28 sw (sp+40),r4
800b1fc: f8 00 06 5e calli 800cb74 <rtems_barrier_release>
800b200: 2b 84 00 28 lw r4,(sp+40)
800b204: e3 ff ff b8 bi 800b0e4 <pipe_write+0x12c>
08008560 <pthread_attr_setschedpolicy>:
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
8008560: 34 03 00 16 mvi r3,22
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
8008564: 44 20 00 09 be r1,r0,8008588 <pthread_attr_setschedpolicy+0x28>
8008568: 28 24 00 00 lw r4,(r1+0)
800856c: 44 80 00 07 be r4,r0,8008588 <pthread_attr_setschedpolicy+0x28>
return EINVAL;
switch ( policy ) {
8008570: 48 02 00 05 bg r0,r2,8008584 <pthread_attr_setschedpolicy+0x24>
8008574: 34 03 00 02 mvi r3,2
8008578: 4c 62 00 06 bge r3,r2,8008590 <pthread_attr_setschedpolicy+0x30>
800857c: 34 03 00 04 mvi r3,4
8008580: 44 43 00 04 be r2,r3,8008590 <pthread_attr_setschedpolicy+0x30><== ALWAYS TAKEN
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
8008584: 34 03 00 86 mvi r3,134
}
}
8008588: b8 60 08 00 mv r1,r3
800858c: c3 a0 00 00 ret
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
8008590: 34 03 00 00 mvi r3,0
switch ( policy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
8008594: 58 22 00 14 sw (r1+20),r2
return 0;
default:
return ENOTSUP;
}
}
8008598: b8 60 08 00 mv r1,r3
800859c: c3 a0 00 00 ret
08003754 <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
8003754: 37 9c ff d8 addi sp,sp,-40
8003758: 5b 8b 00 14 sw (sp+20),r11
800375c: 5b 8c 00 10 sw (sp+16),r12
8003760: 5b 8d 00 0c sw (sp+12),r13
8003764: 5b 8e 00 08 sw (sp+8),r14
8003768: 5b 9d 00 04 sw (sp+4),ra
/*
* Error check parameters
*/
if ( !barrier )
return EINVAL;
800376c: 34 04 00 16 mvi r4,22
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
8003770: b8 20 58 00 mv r11,r1
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
8003774: 44 20 00 08 be r1,r0,8003794 <pthread_barrier_init+0x40>
return EINVAL;
if ( count == 0 )
8003778: 44 60 00 07 be r3,r0,8003794 <pthread_barrier_init+0x40>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
800377c: 44 40 00 34 be r2,r0,800384c <pthread_barrier_init+0xf8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
8003780: 28 41 00 00 lw r1,(r2+0)
return EINVAL;
8003784: 34 04 00 16 mvi r4,22
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
8003788: 44 20 00 03 be r1,r0,8003794 <pthread_barrier_init+0x40>
return EINVAL;
switch ( the_attr->process_shared ) {
800378c: 28 4e 00 04 lw r14,(r2+4)
8003790: 45 c0 00 09 be r14,r0,80037b4 <pthread_barrier_init+0x60> <== ALWAYS TAKEN
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
_Thread_Enable_dispatch();
return 0;
}
8003794: b8 80 08 00 mv r1,r4
8003798: 2b 9d 00 04 lw ra,(sp+4)
800379c: 2b 8b 00 14 lw r11,(sp+20)
80037a0: 2b 8c 00 10 lw r12,(sp+16)
80037a4: 2b 8d 00 0c lw r13,(sp+12)
80037a8: 2b 8e 00 08 lw r14,(sp+8)
80037ac: 37 9c 00 28 addi sp,sp,40
80037b0: c3 a0 00 00 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80037b4: 78 01 08 01 mvhi r1,0x801
80037b8: 38 21 68 68 ori r1,r1,0x6868
80037bc: 28 22 00 00 lw r2,(r1+0)
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
80037c0: 5b 80 00 24 sw (sp+36),r0
the_attributes.maximum_count = count;
80037c4: 5b 83 00 28 sw (sp+40),r3
80037c8: 34 42 00 01 addi r2,r2,1
80037cc: 58 22 00 00 sw (r1+0),r2
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void )
{
return (POSIX_Barrier_Control *)
_Objects_Allocate( &_POSIX_Barrier_Information );
80037d0: 78 0d 08 01 mvhi r13,0x801
80037d4: 39 ad 6b c0 ori r13,r13,0x6bc0
80037d8: b9 a0 08 00 mv r1,r13
80037dc: f8 00 08 44 calli 80058ec <_Objects_Allocate>
80037e0: b8 20 60 00 mv r12,r1
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
80037e4: 44 2e 00 17 be r1,r14,8003840 <pthread_barrier_init+0xec>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
80037e8: 37 82 00 24 addi r2,sp,36
80037ec: 34 21 00 10 addi r1,r1,16
80037f0: f8 00 05 2c calli 8004ca0 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
80037f4: 29 82 00 08 lw r2,(r12+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80037f8: 29 a3 00 1c lw r3,(r13+28)
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
80037fc: 20 41 ff ff andi r1,r2,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8003800: b4 21 08 00 add r1,r1,r1
8003804: b4 21 08 00 add r1,r1,r1
8003808: b4 61 08 00 add r1,r3,r1
800380c: 58 2c 00 00 sw (r1+0),r12
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
8003810: 59 80 00 0c sw (r12+12),r0
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
8003814: 59 62 00 00 sw (r11+0),r2
_Thread_Enable_dispatch();
8003818: f8 00 0c bf calli 8006b14 <_Thread_Enable_dispatch>
return 0;
800381c: 34 04 00 00 mvi r4,0
}
8003820: b8 80 08 00 mv r1,r4
8003824: 2b 9d 00 04 lw ra,(sp+4)
8003828: 2b 8b 00 14 lw r11,(sp+20)
800382c: 2b 8c 00 10 lw r12,(sp+16)
8003830: 2b 8d 00 0c lw r13,(sp+12)
8003834: 2b 8e 00 08 lw r14,(sp+8)
8003838: 37 9c 00 28 addi sp,sp,40
800383c: c3 a0 00 00 ret
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
8003840: f8 00 0c b5 calli 8006b14 <_Thread_Enable_dispatch>
return EAGAIN;
8003844: 34 04 00 0b mvi r4,11
8003848: e3 ff ff d3 bi 8003794 <pthread_barrier_init+0x40>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
800384c: 37 8c 00 1c addi r12,sp,28
8003850: b9 80 08 00 mv r1,r12
8003854: 5b 83 00 18 sw (sp+24),r3
8003858: fb ff ff 7c calli 8003648 <pthread_barrierattr_init>
the_attr = &my_attr;
800385c: b9 80 10 00 mv r2,r12
8003860: 2b 83 00 18 lw r3,(sp+24)
8003864: e3 ff ff c7 bi 8003780 <pthread_barrier_init+0x2c>
08002f60 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
8002f60: 37 9c ff f4 addi sp,sp,-12
8002f64: 5b 8b 00 0c sw (sp+12),r11
8002f68: 5b 8c 00 08 sw (sp+8),r12
8002f6c: 5b 9d 00 04 sw (sp+4),ra
8002f70: b8 20 58 00 mv r11,r1
8002f74: b8 40 60 00 mv r12,r2
/*
* The POSIX standard does not address what to do when the routine
* is NULL. It also does not address what happens when we cannot
* allocate memory or anything else bad happens.
*/
if ( !routine )
8002f78: 44 20 00 14 be r1,r0,8002fc8 <pthread_cleanup_push+0x68>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8002f7c: 78 03 08 01 mvhi r3,0x801
8002f80: 38 63 68 50 ori r3,r3,0x6850
8002f84: 28 61 00 00 lw r1,(r3+0)
8002f88: 34 21 00 01 addi r1,r1,1
8002f8c: 58 61 00 00 sw (r3+0),r1
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
8002f90: 34 01 00 10 mvi r1,16
8002f94: f8 00 12 1d calli 8007808 <_Workspace_Allocate>
8002f98: b8 20 18 00 mv r3,r1
if ( handler ) {
8002f9c: 44 20 00 0a be r1,r0,8002fc4 <pthread_cleanup_push+0x64> <== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
8002fa0: 78 04 08 01 mvhi r4,0x801
8002fa4: 38 84 6d 20 ori r4,r4,0x6d20
8002fa8: 28 81 00 0c lw r1,(r4+12)
handler_stack = &thread_support->Cancellation_Handlers;
handler->routine = routine;
handler->arg = arg;
_Chain_Append( handler_stack, &handler->Node );
8002fac: b8 60 10 00 mv r2,r3
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
if ( handler ) {
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
handler_stack = &thread_support->Cancellation_Handlers;
8002fb0: 28 21 01 20 lw r1,(r1+288)
handler->routine = routine;
8002fb4: 58 6b 00 08 sw (r3+8),r11
handler->arg = arg;
8002fb8: 58 6c 00 0c sw (r3+12),r12
_Chain_Append( handler_stack, &handler->Node );
8002fbc: 34 21 00 e4 addi r1,r1,228
8002fc0: f8 00 05 2c calli 8004470 <_Chain_Append>
}
_Thread_Enable_dispatch();
8002fc4: f8 00 0c a4 calli 8006254 <_Thread_Enable_dispatch>
}
8002fc8: 2b 9d 00 04 lw ra,(sp+4)
8002fcc: 2b 8b 00 0c lw r11,(sp+12)
8002fd0: 2b 8c 00 08 lw r12,(sp+8)
8002fd4: 37 9c 00 0c addi sp,sp,12
8002fd8: c3 a0 00 00 ret
0800406c <pthread_cond_init>:
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
800406c: 37 9c ff ec addi sp,sp,-20
8004070: 5b 8b 00 10 sw (sp+16),r11
8004074: 5b 8c 00 0c sw (sp+12),r12
8004078: 5b 8d 00 08 sw (sp+8),r13
800407c: 5b 9d 00 04 sw (sp+4),ra
8004080: b8 20 68 00 mv r13,r1
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
8004084: 44 40 00 35 be r2,r0,8004158 <pthread_cond_init+0xec>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
8004088: 28 44 00 04 lw r4,(r2+4)
800408c: 34 03 00 01 mvi r3,1
return EINVAL;
8004090: 34 01 00 16 mvi r1,22
else the_attr = &_POSIX_Condition_variables_Default_attributes;
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
8004094: 44 83 00 03 be r4,r3,80040a0 <pthread_cond_init+0x34> <== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
8004098: 28 43 00 00 lw r3,(r2+0)
800409c: 5c 60 00 07 bne r3,r0,80040b8 <pthread_cond_init+0x4c>
*cond = the_cond->Object.id;
_Thread_Enable_dispatch();
return 0;
}
80040a0: 2b 9d 00 04 lw ra,(sp+4)
80040a4: 2b 8b 00 10 lw r11,(sp+16)
80040a8: 2b 8c 00 0c lw r12,(sp+12)
80040ac: 2b 8d 00 08 lw r13,(sp+8)
80040b0: 37 9c 00 14 addi sp,sp,20
80040b4: c3 a0 00 00 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80040b8: 78 03 08 01 mvhi r3,0x801
80040bc: 38 63 78 68 ori r3,r3,0x7868
80040c0: 28 61 00 00 lw r1,(r3+0)
80040c4: 34 21 00 01 addi r1,r1,1
80040c8: 58 61 00 00 sw (r3+0),r1
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
_Objects_Allocate( &_POSIX_Condition_variables_Information );
80040cc: 78 0c 08 01 mvhi r12,0x801
80040d0: 39 8c 7c 58 ori r12,r12,0x7c58
80040d4: b9 80 08 00 mv r1,r12
80040d8: 5b 82 00 14 sw (sp+20),r2
80040dc: f8 00 09 e8 calli 800687c <_Objects_Allocate>
80040e0: b8 20 58 00 mv r11,r1
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
80040e4: 2b 82 00 14 lw r2,(sp+20)
80040e8: 44 20 00 1f be r1,r0,8004164 <pthread_cond_init+0xf8>
the_cond->process_shared = the_attr->process_shared;
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
80040ec: 78 01 08 01 mvhi r1,0x801
if ( !the_cond ) {
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
80040f0: 28 45 00 04 lw r5,(r2+4)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
80040f4: 38 21 61 d0 ori r1,r1,0x61d0
80040f8: 28 23 00 00 lw r3,(r1+0)
80040fc: 34 04 00 74 mvi r4,116
8004100: 35 61 00 18 addi r1,r11,24
if ( !the_cond ) {
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
8004104: 59 65 00 10 sw (r11+16),r5
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
8004108: 34 02 00 00 mvi r2,0
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
800410c: 59 60 00 14 sw (r11+20),r0
_Thread_queue_Initialize(
8004110: f8 00 11 05 calli 8008524 <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8004114: 29 61 00 08 lw r1,(r11+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8004118: 29 83 00 1c lw r3,(r12+28)
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
800411c: 20 22 ff ff andi r2,r1,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8004120: b4 42 10 00 add r2,r2,r2
8004124: b4 42 10 00 add r2,r2,r2
8004128: b4 62 10 00 add r2,r3,r2
800412c: 58 4b 00 00 sw (r2+0),r11
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
8004130: 59 60 00 0c sw (r11+12),r0
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
8004134: 59 a1 00 00 sw (r13+0),r1
_Thread_Enable_dispatch();
8004138: f8 00 0e ca calli 8007c60 <_Thread_Enable_dispatch>
return 0;
800413c: 34 01 00 00 mvi r1,0
}
8004140: 2b 9d 00 04 lw ra,(sp+4)
8004144: 2b 8b 00 10 lw r11,(sp+16)
8004148: 2b 8c 00 0c lw r12,(sp+12)
800414c: 2b 8d 00 08 lw r13,(sp+8)
8004150: 37 9c 00 14 addi sp,sp,20
8004154: c3 a0 00 00 ret
{
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
else the_attr = &_POSIX_Condition_variables_Default_attributes;
8004158: 78 02 08 01 mvhi r2,0x801
800415c: 38 42 61 c8 ori r2,r2,0x61c8
8004160: e3 ff ff ca bi 8004088 <pthread_cond_init+0x1c>
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
_Thread_Enable_dispatch();
8004164: f8 00 0e bf calli 8007c60 <_Thread_Enable_dispatch>
return ENOMEM;
8004168: 34 01 00 0c mvi r1,12
800416c: e3 ff ff cd bi 80040a0 <pthread_cond_init+0x34>
08003ec8 <pthread_condattr_destroy>:
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
8003ec8: 34 02 00 16 mvi r2,22
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
8003ecc: 44 20 00 05 be r1,r0,8003ee0 <pthread_condattr_destroy+0x18>
8003ed0: 28 23 00 00 lw r3,(r1+0)
8003ed4: 44 60 00 03 be r3,r0,8003ee0 <pthread_condattr_destroy+0x18><== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
8003ed8: 58 20 00 00 sw (r1+0),r0
return 0;
8003edc: 34 02 00 00 mvi r2,0
}
8003ee0: b8 40 08 00 mv r1,r2
8003ee4: c3 a0 00 00 ret
080033e8 <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
80033e8: 37 9c ff a0 addi sp,sp,-96
80033ec: 5b 8b 00 3c sw (sp+60),r11
80033f0: 5b 8c 00 38 sw (sp+56),r12
80033f4: 5b 8d 00 34 sw (sp+52),r13
80033f8: 5b 8e 00 30 sw (sp+48),r14
80033fc: 5b 8f 00 2c sw (sp+44),r15
8003400: 5b 90 00 28 sw (sp+40),r16
8003404: 5b 91 00 24 sw (sp+36),r17
8003408: 5b 92 00 20 sw (sp+32),r18
800340c: 5b 93 00 1c sw (sp+28),r19
8003410: 5b 94 00 18 sw (sp+24),r20
8003414: 5b 95 00 14 sw (sp+20),r21
8003418: 5b 9d 00 10 sw (sp+16),ra
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
800341c: 34 0c 00 0e mvi r12,14
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
8003420: b8 60 68 00 mv r13,r3
8003424: b8 20 78 00 mv r15,r1
8003428: b8 80 70 00 mv r14,r4
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
800342c: 44 60 00 13 be r3,r0,8003478 <pthread_create+0x90> <== NEVER TAKEN
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
8003430: b8 40 58 00 mv r11,r2
8003434: 44 40 00 66 be r2,r0,80035cc <pthread_create+0x1e4>
if ( !the_attr->is_initialized )
8003438: 29 61 00 00 lw r1,(r11+0)
return EINVAL;
800343c: 34 0c 00 16 mvi r12,22
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
if ( !the_attr->is_initialized )
8003440: 44 20 00 0e be r1,r0,8003478 <pthread_create+0x90>
* stack space if it is allowed to allocate it itself.
*
* NOTE: If the user provides the stack we will let it drop below
* twice the minimum.
*/
if ( the_attr->stackaddr && !_Stack_Is_enough(the_attr->stacksize) )
8003444: 29 61 00 04 lw r1,(r11+4)
8003448: 44 20 00 06 be r1,r0,8003460 <pthread_create+0x78>
800344c: 78 02 08 01 mvhi r2,0x801
8003450: 38 42 f0 e0 ori r2,r2,0xf0e0
8003454: 29 63 00 08 lw r3,(r11+8)
8003458: 28 41 00 00 lw r1,(r2+0)
800345c: 54 23 00 07 bgu r1,r3,8003478 <pthread_create+0x90>
* If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread
* inherits scheduling attributes from the creating thread. If it is
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
8003460: 29 61 00 10 lw r1,(r11+16)
8003464: 34 02 00 01 mvi r2,1
8003468: 44 22 00 5c be r1,r2,80035d8 <pthread_create+0x1f0>
800346c: 34 02 00 02 mvi r2,2
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
break;
default:
return EINVAL;
8003470: 34 0c 00 16 mvi r12,22
* If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread
* inherits scheduling attributes from the creating thread. If it is
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
8003474: 44 22 00 10 be r1,r2,80034b4 <pthread_create+0xcc>
*/
*thread = the_thread->Object.id;
_RTEMS_Unlock_allocator();
return 0;
}
8003478: b9 80 08 00 mv r1,r12
800347c: 2b 9d 00 10 lw ra,(sp+16)
8003480: 2b 8b 00 3c lw r11,(sp+60)
8003484: 2b 8c 00 38 lw r12,(sp+56)
8003488: 2b 8d 00 34 lw r13,(sp+52)
800348c: 2b 8e 00 30 lw r14,(sp+48)
8003490: 2b 8f 00 2c lw r15,(sp+44)
8003494: 2b 90 00 28 lw r16,(sp+40)
8003498: 2b 91 00 24 lw r17,(sp+36)
800349c: 2b 92 00 20 lw r18,(sp+32)
80034a0: 2b 93 00 1c lw r19,(sp+28)
80034a4: 2b 94 00 18 lw r20,(sp+24)
80034a8: 2b 95 00 14 lw r21,(sp+20)
80034ac: 37 9c 00 60 addi sp,sp,96
80034b0: c3 a0 00 00 ret
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
80034b4: 29 67 00 18 lw r7,(r11+24)
80034b8: 29 66 00 1c lw r6,(r11+28)
80034bc: 29 65 00 20 lw r5,(r11+32)
80034c0: 29 64 00 24 lw r4,(r11+36)
80034c4: 29 63 00 28 lw r3,(r11+40)
80034c8: 29 62 00 2c lw r2,(r11+44)
80034cc: 29 61 00 30 lw r1,(r11+48)
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
80034d0: 29 71 00 14 lw r17,(r11+20)
schedparam = the_attr->schedparam;
80034d4: 5b 87 00 40 sw (sp+64),r7
80034d8: 5b 86 00 44 sw (sp+68),r6
80034dc: 5b 85 00 48 sw (sp+72),r5
80034e0: 5b 84 00 4c sw (sp+76),r4
80034e4: 5b 83 00 50 sw (sp+80),r3
80034e8: 5b 82 00 54 sw (sp+84),r2
80034ec: 5b 81 00 58 sw (sp+88),r1
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
80034f0: 29 70 00 0c lw r16,(r11+12)
return ENOTSUP;
80034f4: 34 0c 00 86 mvi r12,134
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
80034f8: 5e 00 ff e0 bne r16,r0,8003478 <pthread_create+0x90>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
80034fc: 2b 81 00 40 lw r1,(sp+64)
return EINVAL;
8003500: 34 0c 00 16 mvi r12,22
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
8003504: f8 00 1c 6d calli 800a6b8 <_POSIX_Priority_Is_valid>
8003508: 44 30 ff dc be r1,r16,8003478 <pthread_create+0x90> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
800350c: 78 05 08 01 mvhi r5,0x801
8003510: 38 a5 f0 e4 ori r5,r5,0xf0e4
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
8003514: ba 20 08 00 mv r1,r17
8003518: 37 82 00 40 addi r2,sp,64
800351c: 37 83 00 60 addi r3,sp,96
8003520: 37 84 00 5c addi r4,sp,92
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
return EINVAL;
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
8003524: 2b 94 00 40 lw r20,(sp+64)
8003528: 40 b5 00 00 lbu r21,(r5+0)
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
800352c: f8 00 1c 6b calli 800a6d8 <_POSIX_Thread_Translate_sched_param>
8003530: b8 20 60 00 mv r12,r1
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
8003534: 5c 20 ff d1 bne r1,r0,8003478 <pthread_create+0x90>
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
8003538: 78 12 08 01 mvhi r18,0x801
800353c: 3a 52 f9 18 ori r18,r18,0xf918
8003540: 2a 41 00 00 lw r1,(r18+0)
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
8003544: 78 10 08 01 mvhi r16,0x801
8003548: 3a 10 fa 30 ori r16,r16,0xfa30
800354c: f8 00 05 3a calli 8004a34 <_API_Mutex_Lock>
8003550: ba 00 08 00 mv r1,r16
8003554: f8 00 08 6b calli 8005700 <_Objects_Allocate>
8003558: b8 20 98 00 mv r19,r1
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
800355c: 44 2c 00 18 be r1,r12,80035bc <pthread_create+0x1d4>
static inline size_t _POSIX_Threads_Ensure_minimum_stack (
size_t size
)
{
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
8003560: 78 01 08 01 mvhi r1,0x801
8003564: 38 21 f0 e0 ori r1,r1,0xf0e0
8003568: 28 24 00 00 lw r4,(r1+0)
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
800356c: 29 61 00 08 lw r1,(r11+8)
8003570: 29 63 00 04 lw r3,(r11+4)
static inline size_t _POSIX_Threads_Ensure_minimum_stack (
size_t size
)
{
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
8003574: b4 84 20 00 add r4,r4,r4
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
8003578: 50 81 00 02 bgeu r4,r1,8003580 <pthread_create+0x198>
800357c: b8 20 20 00 mv r4,r1
8003580: 2b 89 00 5c lw r9,(sp+92)
8003584: 2b 88 00 60 lw r8,(sp+96)
8003588: ba 00 08 00 mv r1,r16
800358c: ba 60 10 00 mv r2,r19
8003590: 34 05 00 00 mvi r5,0
8003594: ca b4 30 00 sub r6,r21,r20
8003598: 34 07 00 01 mvi r7,1
800359c: 5b 89 00 04 sw (sp+4),r9
80035a0: 5b 80 00 08 sw (sp+8),r0
80035a4: 5b 80 00 0c sw (sp+12),r0
80035a8: f8 00 0d 43 calli 8006ab4 <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
80035ac: 5c 20 00 1f bne r1,r0,8003628 <pthread_create+0x240> <== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
80035b0: ba 00 08 00 mv r1,r16 <== NOT EXECUTED
80035b4: ba 60 10 00 mv r2,r19 <== NOT EXECUTED
80035b8: f8 00 09 56 calli 8005b10 <_Objects_Free> <== NOT EXECUTED
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
80035bc: 2a 41 00 00 lw r1,(r18+0)
return EAGAIN;
80035c0: 34 0c 00 0b mvi r12,11
name /* posix threads don't have a name */
);
if ( !status ) {
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
80035c4: f8 00 05 38 calli 8004aa4 <_API_Mutex_Unlock>
return EAGAIN;
80035c8: e3 ff ff ac bi 8003478 <pthread_create+0x90>
int rc;
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
80035cc: 78 0b 08 01 mvhi r11,0x801
80035d0: 39 6b db bc ori r11,r11,0xdbbc
80035d4: e3 ff ff 99 bi 8003438 <pthread_create+0x50>
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
80035d8: 78 01 08 01 mvhi r1,0x801
80035dc: 38 21 fd 28 ori r1,r1,0xfd28
80035e0: 28 21 00 0c lw r1,(r1+12)
80035e4: 28 22 01 20 lw r2,(r1+288)
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
80035e8: 28 48 00 88 lw r8,(r2+136)
80035ec: 28 47 00 8c lw r7,(r2+140)
80035f0: 28 46 00 90 lw r6,(r2+144)
80035f4: 28 45 00 94 lw r5,(r2+148)
80035f8: 28 44 00 98 lw r4,(r2+152)
80035fc: 28 43 00 9c lw r3,(r2+156)
8003600: 28 41 00 a0 lw r1,(r2+160)
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
schedpolicy = api->schedpolicy;
8003604: 28 51 00 84 lw r17,(r2+132)
schedparam = api->schedparam;
8003608: 5b 88 00 40 sw (sp+64),r8
800360c: 5b 87 00 44 sw (sp+68),r7
8003610: 5b 86 00 48 sw (sp+72),r6
8003614: 5b 85 00 4c sw (sp+76),r5
8003618: 5b 84 00 50 sw (sp+80),r4
800361c: 5b 83 00 54 sw (sp+84),r3
8003620: 5b 81 00 58 sw (sp+88),r1
break;
8003624: e3 ff ff b3 bi 80034f0 <pthread_create+0x108>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8003628: 2a 70 01 20 lw r16,(r19+288)
api->Attributes = *the_attr;
800362c: 29 63 00 00 lw r3,(r11+0)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
8003630: ba 60 08 00 mv r1,r19
8003634: 34 02 00 01 mvi r2,1
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
8003638: 5a 03 00 00 sw (r16+0),r3
800363c: 29 65 00 04 lw r5,(r11+4)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
8003640: b9 a0 18 00 mv r3,r13
8003644: b9 c0 20 00 mv r4,r14
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
8003648: 5a 05 00 04 sw (r16+4),r5
800364c: 29 66 00 08 lw r6,(r11+8)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
8003650: 34 05 00 00 mvi r5,0
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
8003654: 5a 06 00 08 sw (r16+8),r6
8003658: 29 66 00 0c lw r6,(r11+12)
800365c: 5a 06 00 0c sw (r16+12),r6
8003660: 29 66 00 10 lw r6,(r11+16)
8003664: 5a 06 00 10 sw (r16+16),r6
8003668: 29 66 00 14 lw r6,(r11+20)
800366c: 5a 06 00 14 sw (r16+20),r6
8003670: 29 66 00 18 lw r6,(r11+24)
8003674: 5a 06 00 18 sw (r16+24),r6
8003678: 29 66 00 1c lw r6,(r11+28)
800367c: 5a 06 00 1c sw (r16+28),r6
8003680: 29 66 00 20 lw r6,(r11+32)
8003684: 5a 06 00 20 sw (r16+32),r6
8003688: 29 66 00 24 lw r6,(r11+36)
800368c: 5a 06 00 24 sw (r16+36),r6
8003690: 29 66 00 28 lw r6,(r11+40)
8003694: 5a 06 00 28 sw (r16+40),r6
8003698: 29 66 00 2c lw r6,(r11+44)
800369c: 5a 06 00 2c sw (r16+44),r6
80036a0: 29 66 00 30 lw r6,(r11+48)
80036a4: 5a 06 00 30 sw (r16+48),r6
80036a8: 29 66 00 34 lw r6,(r11+52)
80036ac: 5a 06 00 34 sw (r16+52),r6
80036b0: 29 66 00 38 lw r6,(r11+56)
80036b4: 5a 06 00 38 sw (r16+56),r6
80036b8: 29 66 00 3c lw r6,(r11+60)
80036bc: 5a 06 00 3c sw (r16+60),r6
api->detachstate = the_attr->detachstate;
80036c0: 29 66 00 3c lw r6,(r11+60)
80036c4: 5a 06 00 40 sw (r16+64),r6
api->schedpolicy = schedpolicy;
api->schedparam = schedparam;
80036c8: 2b 86 00 40 lw r6,(sp+64)
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
api->schedpolicy = schedpolicy;
80036cc: 5a 11 00 84 sw (r16+132),r17
api->schedparam = schedparam;
80036d0: 5a 06 00 88 sw (r16+136),r6
80036d4: 2b 86 00 44 lw r6,(sp+68)
80036d8: 5a 06 00 8c sw (r16+140),r6
80036dc: 2b 86 00 48 lw r6,(sp+72)
80036e0: 5a 06 00 90 sw (r16+144),r6
80036e4: 2b 86 00 4c lw r6,(sp+76)
80036e8: 5a 06 00 94 sw (r16+148),r6
80036ec: 2b 86 00 50 lw r6,(sp+80)
80036f0: 5a 06 00 98 sw (r16+152),r6
80036f4: 2b 86 00 54 lw r6,(sp+84)
80036f8: 5a 06 00 9c sw (r16+156),r6
80036fc: 2b 86 00 58 lw r6,(sp+88)
8003700: 5a 06 00 a0 sw (r16+160),r6
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
8003704: f8 00 0f c7 calli 8007620 <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
8003708: 34 01 00 04 mvi r1,4
800370c: 46 21 00 06 be r17,r1,8003724 <pthread_create+0x33c>
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
8003710: 2a 62 00 08 lw r2,(r19+8)
_RTEMS_Unlock_allocator();
8003714: 2a 41 00 00 lw r1,(r18+0)
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
8003718: 59 e2 00 00 sw (r15+0),r2
_RTEMS_Unlock_allocator();
800371c: f8 00 04 e2 calli 8004aa4 <_API_Mutex_Unlock>
return 0;
8003720: e3 ff ff 56 bi 8003478 <pthread_create+0x90>
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
_Watchdog_Insert_ticks(
8003724: 36 01 00 90 addi r1,r16,144
8003728: f8 00 10 51 calli 800786c <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
800372c: 5a 01 00 b4 sw (r16+180),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8003730: 78 01 08 01 mvhi r1,0x801
8003734: 36 02 00 a8 addi r2,r16,168
8003738: 38 21 f9 38 ori r1,r1,0xf938
800373c: f8 00 11 97 calli 8007d98 <_Watchdog_Insert>
8003740: e3 ff ff f4 bi 8003710 <pthread_create+0x328>
0800c71c <pthread_exit>:
void pthread_exit(
void *value_ptr
)
{
800c71c: 37 9c ff fc addi sp,sp,-4
800c720: 5b 9d 00 04 sw (sp+4),ra
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
800c724: 78 03 08 01 mvhi r3,0x801
800c728: 38 63 4d 78 ori r3,r3,0x4d78
}
void pthread_exit(
void *value_ptr
)
{
800c72c: b8 20 10 00 mv r2,r1
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
800c730: 28 61 00 0c lw r1,(r3+12)
800c734: fb ff ff d4 calli 800c684 <_POSIX_Thread_Exit>
}
800c738: 2b 9d 00 04 lw ra,(sp+4)
800c73c: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED
800c740: c3 a0 00 00 ret <== NOT EXECUTED
08005954 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
8005954: 37 9c ff f0 addi sp,sp,-16
8005958: 5b 8b 00 0c sw (sp+12),r11
800595c: 5b 8c 00 08 sw (sp+8),r12
8005960: 5b 9d 00 04 sw (sp+4),ra
8005964: b8 20 60 00 mv r12,r1
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
8005968: b8 40 08 00 mv r1,r2
800596c: 37 82 00 10 addi r2,sp,16
8005970: f8 00 00 49 calli 8005a94 <_POSIX_Absolute_timeout_to_ticks>
8005974: b8 20 58 00 mv r11,r1
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
8005978: 34 01 00 03 mvi r1,3
800597c: 45 61 00 15 be r11,r1,80059d0 <pthread_mutex_timedlock+0x7c>
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
8005980: 2b 83 00 10 lw r3,(sp+16)
8005984: 34 02 00 00 mvi r2,0
8005988: b9 80 08 00 mv r1,r12
800598c: fb ff ff 9f calli 8005808 <_POSIX_Mutex_Lock_support>
* This service only gives us the option to block. We used a polling
* attempt to lock if the abstime was not in the future. If we did
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
8005990: 34 02 00 10 mvi r2,16
8005994: 44 22 00 06 be r1,r2,80059ac <pthread_mutex_timedlock+0x58><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
8005998: 2b 9d 00 04 lw ra,(sp+4)
800599c: 2b 8b 00 0c lw r11,(sp+12)
80059a0: 2b 8c 00 08 lw r12,(sp+8)
80059a4: 37 9c 00 10 addi sp,sp,16
80059a8: c3 a0 00 00 ret
* attempt to lock if the abstime was not in the future. If we did
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
80059ac: 45 60 00 12 be r11,r0,80059f4 <pthread_mutex_timedlock+0xa0><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
80059b0: 35 6b ff ff addi r11,r11,-1
80059b4: 34 02 00 01 mvi r2,1
80059b8: 50 4b 00 11 bgeu r2,r11,80059fc <pthread_mutex_timedlock+0xa8><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
80059bc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80059c0: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
80059c4: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
80059c8: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED
80059cc: c3 a0 00 00 ret <== NOT EXECUTED
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
80059d0: 2b 83 00 10 lw r3,(sp+16)
80059d4: b9 80 08 00 mv r1,r12
80059d8: 34 02 00 01 mvi r2,1
80059dc: fb ff ff 8b calli 8005808 <_POSIX_Mutex_Lock_support>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return lock_status;
}
80059e0: 2b 9d 00 04 lw ra,(sp+4)
80059e4: 2b 8b 00 0c lw r11,(sp+12)
80059e8: 2b 8c 00 08 lw r12,(sp+8)
80059ec: 37 9c 00 10 addi sp,sp,16
80059f0: c3 a0 00 00 ret
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
80059f4: 34 01 00 16 mvi r1,22 <== NOT EXECUTED
80059f8: e3 ff ff e8 bi 8005998 <pthread_mutex_timedlock+0x44> <== NOT EXECUTED
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
80059fc: 34 01 00 74 mvi r1,116
8005a00: e3 ff ff e6 bi 8005998 <pthread_mutex_timedlock+0x44>
08002b88 <pthread_mutexattr_gettype>:
const pthread_mutexattr_t *attr,
int *type
)
{
if ( !attr )
return EINVAL;
8002b88: 34 03 00 16 mvi r3,22
int pthread_mutexattr_gettype(
const pthread_mutexattr_t *attr,
int *type
)
{
if ( !attr )
8002b8c: 44 20 00 07 be r1,r0,8002ba8 <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !attr->is_initialized )
8002b90: 28 24 00 00 lw r4,(r1+0)
8002b94: 44 80 00 05 be r4,r0,8002ba8 <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !type )
8002b98: 44 40 00 04 be r2,r0,8002ba8 <pthread_mutexattr_gettype+0x20><== NEVER TAKEN
return EINVAL;
*type = attr->type;
8002b9c: 28 21 00 10 lw r1,(r1+16)
return 0;
8002ba0: 34 03 00 00 mvi r3,0
return EINVAL;
if ( !type )
return EINVAL;
*type = attr->type;
8002ba4: 58 41 00 00 sw (r2+0),r1
return 0;
}
8002ba8: b8 60 08 00 mv r1,r3
8002bac: c3 a0 00 00 ret
0800543c <pthread_mutexattr_setpshared>:
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
800543c: 34 03 00 16 mvi r3,22
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
8005440: 44 20 00 07 be r1,r0,800545c <pthread_mutexattr_setpshared+0x20>
8005444: 28 24 00 00 lw r4,(r1+0)
8005448: 44 80 00 05 be r4,r0,800545c <pthread_mutexattr_setpshared+0x20>
return EINVAL;
switch ( pshared ) {
800544c: 34 04 00 01 mvi r4,1
8005450: 54 44 00 03 bgu r2,r4,800545c <pthread_mutexattr_setpshared+0x20><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
8005454: 58 22 00 04 sw (r1+4),r2
return 0;
8005458: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
800545c: b8 60 08 00 mv r1,r3
8005460: c3 a0 00 00 ret
08002bfc <pthread_mutexattr_settype>:
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
8002bfc: 34 03 00 16 mvi r3,22
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
8002c00: 44 20 00 07 be r1,r0,8002c1c <pthread_mutexattr_settype+0x20>
8002c04: 28 24 00 00 lw r4,(r1+0)
8002c08: 44 80 00 05 be r4,r0,8002c1c <pthread_mutexattr_settype+0x20><== NEVER TAKEN
return EINVAL;
switch ( type ) {
8002c0c: 34 04 00 03 mvi r4,3
8002c10: 54 44 00 03 bgu r2,r4,8002c1c <pthread_mutexattr_settype+0x20>
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
8002c14: 58 22 00 10 sw (r1+16),r2
return 0;
8002c18: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
8002c1c: b8 60 08 00 mv r1,r3
8002c20: c3 a0 00 00 ret
08003c5c <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
8003c5c: 37 9c ff ec addi sp,sp,-20
8003c60: 5b 8b 00 10 sw (sp+16),r11
8003c64: 5b 8c 00 0c sw (sp+12),r12
8003c68: 5b 8d 00 08 sw (sp+8),r13
8003c6c: 5b 9d 00 04 sw (sp+4),ra
if ( !once_control || !init_routine )
8003c70: 64 43 00 00 cmpei r3,r2,0
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
8003c74: b8 40 60 00 mv r12,r2
if ( !once_control || !init_routine )
8003c78: 64 22 00 00 cmpei r2,r1,0
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
8003c7c: b8 20 58 00 mv r11,r1
if ( !once_control || !init_routine )
8003c80: b8 62 18 00 or r3,r3,r2
return EINVAL;
8003c84: 34 01 00 16 mvi r1,22
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
8003c88: 5c 60 00 04 bne r3,r0,8003c98 <pthread_once+0x3c>
return EINVAL;
if ( !once_control->init_executed ) {
8003c8c: 29 6d 00 04 lw r13,(r11+4)
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
8003c90: 34 01 00 00 mvi r1,0
)
{
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
8003c94: 45 a3 00 07 be r13,r3,8003cb0 <pthread_once+0x54>
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
}
return 0;
}
8003c98: 2b 9d 00 04 lw ra,(sp+4)
8003c9c: 2b 8b 00 10 lw r11,(sp+16)
8003ca0: 2b 8c 00 0c lw r12,(sp+12)
8003ca4: 2b 8d 00 08 lw r13,(sp+8)
8003ca8: 37 9c 00 14 addi sp,sp,20
8003cac: c3 a0 00 00 ret
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
8003cb0: 34 01 01 00 mvi r1,256
8003cb4: 34 02 01 00 mvi r2,256
8003cb8: 37 83 00 14 addi r3,sp,20
8003cbc: f8 00 01 ab calli 8004368 <rtems_task_mode>
if ( !once_control->init_executed ) {
8003cc0: 29 61 00 04 lw r1,(r11+4)
8003cc4: 44 2d 00 0c be r1,r13,8003cf4 <pthread_once+0x98> <== ALWAYS TAKEN
once_control->is_initialized = true;
once_control->init_executed = true;
(*init_routine)();
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
8003cc8: 2b 81 00 14 lw r1,(sp+20)
8003ccc: 34 02 01 00 mvi r2,256
8003cd0: 37 83 00 14 addi r3,sp,20
8003cd4: f8 00 01 a5 calli 8004368 <rtems_task_mode>
}
return 0;
8003cd8: 34 01 00 00 mvi r1,0
}
8003cdc: 2b 9d 00 04 lw ra,(sp+4)
8003ce0: 2b 8b 00 10 lw r11,(sp+16)
8003ce4: 2b 8c 00 0c lw r12,(sp+12)
8003ce8: 2b 8d 00 08 lw r13,(sp+8)
8003cec: 37 9c 00 14 addi sp,sp,20
8003cf0: c3 a0 00 00 ret
if ( !once_control->init_executed ) {
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
if ( !once_control->init_executed ) {
once_control->is_initialized = true;
8003cf4: 34 01 00 01 mvi r1,1
8003cf8: 59 61 00 00 sw (r11+0),r1
once_control->init_executed = true;
8003cfc: 59 61 00 04 sw (r11+4),r1
(*init_routine)();
8003d00: d9 80 00 00 call r12
8003d04: e3 ff ff f1 bi 8003cc8 <pthread_once+0x6c>
0800452c <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
800452c: 37 9c ff e0 addi sp,sp,-32
8004530: 5b 8b 00 14 sw (sp+20),r11
8004534: 5b 8c 00 10 sw (sp+16),r12
8004538: 5b 8d 00 0c sw (sp+12),r13
800453c: 5b 8e 00 08 sw (sp+8),r14
8004540: 5b 9d 00 04 sw (sp+4),ra
8004544: b8 20 58 00 mv r11,r1
/*
* Error check parameters
*/
if ( !rwlock )
return EINVAL;
8004548: 34 01 00 16 mvi r1,22
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
800454c: 45 60 00 07 be r11,r0,8004568 <pthread_rwlock_init+0x3c>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
8004550: 44 40 00 31 be r2,r0,8004614 <pthread_rwlock_init+0xe8>
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
8004554: 28 43 00 00 lw r3,(r2+0)
return EINVAL;
8004558: 34 01 00 16 mvi r1,22
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
800455c: 44 60 00 03 be r3,r0,8004568 <pthread_rwlock_init+0x3c> <== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
8004560: 28 4e 00 04 lw r14,(r2+4)
8004564: 45 c0 00 08 be r14,r0,8004584 <pthread_rwlock_init+0x58> <== ALWAYS TAKEN
*rwlock = the_rwlock->Object.id;
_Thread_Enable_dispatch();
return 0;
}
8004568: 2b 9d 00 04 lw ra,(sp+4)
800456c: 2b 8b 00 14 lw r11,(sp+20)
8004570: 2b 8c 00 10 lw r12,(sp+16)
8004574: 2b 8d 00 0c lw r13,(sp+12)
8004578: 2b 8e 00 08 lw r14,(sp+8)
800457c: 37 9c 00 20 addi sp,sp,32
8004580: c3 a0 00 00 ret
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8004584: 78 01 08 01 mvhi r1,0x801
8004588: 38 21 98 68 ori r1,r1,0x9868
800458c: 28 22 00 00 lw r2,(r1+0)
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
8004590: 5b 80 00 20 sw (sp+32),r0
8004594: 34 42 00 01 addi r2,r2,1
8004598: 58 22 00 00 sw (r1+0),r2
* the inactive chain of free RWLock control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void )
{
return (POSIX_RWLock_Control *)
_Objects_Allocate( &_POSIX_RWLock_Information );
800459c: 78 0d 08 01 mvhi r13,0x801
80045a0: 39 ad 9a 00 ori r13,r13,0x9a00
80045a4: b9 a0 08 00 mv r1,r13
80045a8: f8 00 0a 15 calli 8006dfc <_Objects_Allocate>
80045ac: b8 20 60 00 mv r12,r1
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
80045b0: 44 2e 00 16 be r1,r14,8004608 <pthread_rwlock_init+0xdc>
_Thread_Enable_dispatch();
return EAGAIN;
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
80045b4: 37 82 00 20 addi r2,sp,32
80045b8: 34 21 00 10 addi r1,r1,16
80045bc: f8 00 07 29 calli 8006260 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
80045c0: 29 82 00 08 lw r2,(r12+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80045c4: 29 a3 00 1c lw r3,(r13+28)
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
80045c8: 20 41 ff ff andi r1,r2,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80045cc: b4 21 08 00 add r1,r1,r1
80045d0: b4 21 08 00 add r1,r1,r1
80045d4: b4 61 08 00 add r1,r3,r1
80045d8: 58 2c 00 00 sw (r1+0),r12
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
80045dc: 59 80 00 0c sw (r12+12),r0
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
80045e0: 59 62 00 00 sw (r11+0),r2
_Thread_Enable_dispatch();
80045e4: f8 00 0e 90 calli 8008024 <_Thread_Enable_dispatch>
return 0;
80045e8: 34 01 00 00 mvi r1,0
}
80045ec: 2b 9d 00 04 lw ra,(sp+4)
80045f0: 2b 8b 00 14 lw r11,(sp+20)
80045f4: 2b 8c 00 10 lw r12,(sp+16)
80045f8: 2b 8d 00 0c lw r13,(sp+12)
80045fc: 2b 8e 00 08 lw r14,(sp+8)
8004600: 37 9c 00 20 addi sp,sp,32
8004604: c3 a0 00 00 ret
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
_Thread_Enable_dispatch();
8004608: f8 00 0e 87 calli 8008024 <_Thread_Enable_dispatch>
return EAGAIN;
800460c: 34 01 00 0b mvi r1,11
8004610: e3 ff ff d6 bi 8004568 <pthread_rwlock_init+0x3c>
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
8004614: 37 8c 00 18 addi r12,sp,24
8004618: b9 80 08 00 mv r1,r12
800461c: f8 00 02 ee calli 80051d4 <pthread_rwlockattr_init>
the_attr = &default_attr;
8004620: b9 80 10 00 mv r2,r12
8004624: e3 ff ff cc bi 8004554 <pthread_rwlock_init+0x28>
080046ac <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80046ac: 37 9c ff e0 addi sp,sp,-32
80046b0: 5b 8b 00 18 sw (sp+24),r11
80046b4: 5b 8c 00 14 sw (sp+20),r12
80046b8: 5b 8d 00 10 sw (sp+16),r13
80046bc: 5b 8e 00 0c sw (sp+12),r14
80046c0: 5b 8f 00 08 sw (sp+8),r15
80046c4: 5b 9d 00 04 sw (sp+4),ra
80046c8: b8 20 58 00 mv r11,r1
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
return EINVAL;
80046cc: 34 0c 00 16 mvi r12,22
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80046d0: b8 40 08 00 mv r1,r2
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
80046d4: 45 60 00 0c be r11,r0,8004704 <pthread_rwlock_timedrdlock+0x58>
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
80046d8: 37 82 00 1c addi r2,sp,28
80046dc: f8 00 1c f2 calli 800baa4 <_POSIX_Absolute_timeout_to_ticks>
80046e0: 78 03 08 01 mvhi r3,0x801
80046e4: 29 62 00 00 lw r2,(r11+0)
80046e8: b8 20 70 00 mv r14,r1
80046ec: b8 60 08 00 mv r1,r3
80046f0: 38 21 9a 00 ori r1,r1,0x9a00
80046f4: 37 83 00 20 addi r3,sp,32
80046f8: f8 00 0b 13 calli 8007344 <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
80046fc: 2b 8d 00 20 lw r13,(sp+32)
8004700: 45 a0 00 0a be r13,r0,8004728 <pthread_rwlock_timedrdlock+0x7c>
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
8004704: b9 80 08 00 mv r1,r12
8004708: 2b 9d 00 04 lw ra,(sp+4)
800470c: 2b 8b 00 18 lw r11,(sp+24)
8004710: 2b 8c 00 14 lw r12,(sp+20)
8004714: 2b 8d 00 10 lw r13,(sp+16)
8004718: 2b 8e 00 0c lw r14,(sp+12)
800471c: 2b 8f 00 08 lw r15,(sp+8)
8004720: 37 9c 00 20 addi sp,sp,32
8004724: c3 a0 00 00 ret
int _EXFUN(pthread_rwlock_init,
(pthread_rwlock_t *__rwlock, _CONST pthread_rwlockattr_t *__attr));
int _EXFUN(pthread_rwlock_destroy, (pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_rdlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_tryrdlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_timedrdlock,
8004728: 65 cf 00 03 cmpei r15,r14,3
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
800472c: 29 62 00 00 lw r2,(r11+0)
8004730: 2b 84 00 1c lw r4,(sp+28)
8004734: 34 21 00 10 addi r1,r1,16
8004738: b9 e0 18 00 mv r3,r15
800473c: 34 05 00 00 mvi r5,0
8004740: f8 00 06 d5 calli 8006294 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
8004744: f8 00 0e 38 calli 8008024 <_Thread_Enable_dispatch>
if ( !do_wait ) {
8004748: 5d ed 00 10 bne r15,r13,8004788 <pthread_rwlock_timedrdlock+0xdc>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
800474c: 78 01 08 01 mvhi r1,0x801
8004750: 38 21 9d 38 ori r1,r1,0x9d38
8004754: 28 21 00 0c lw r1,(r1+12)
8004758: 34 02 00 02 mvi r2,2
800475c: 28 21 00 34 lw r1,(r1+52)
8004760: 44 22 00 04 be r1,r2,8004770 <pthread_rwlock_timedrdlock+0xc4>
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
8004764: f8 00 00 4a calli 800488c <_POSIX_RWLock_Translate_core_RWLock_return_code>
8004768: b8 20 60 00 mv r12,r1
800476c: e3 ff ff e6 bi 8004704 <pthread_rwlock_timedrdlock+0x58>
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
8004770: 45 cf ff e5 be r14,r15,8004704 <pthread_rwlock_timedrdlock+0x58><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004774: 35 ce ff ff addi r14,r14,-1
8004778: 34 02 00 01 mvi r2,1
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
800477c: 34 0c 00 74 mvi r12,116
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004780: 50 4e ff e1 bgeu r2,r14,8004704 <pthread_rwlock_timedrdlock+0x58><== ALWAYS TAKEN
8004784: e3 ff ff f8 bi 8004764 <pthread_rwlock_timedrdlock+0xb8>
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait ) {
8004788: 78 01 08 01 mvhi r1,0x801
800478c: 38 21 9d 38 ori r1,r1,0x9d38
8004790: 28 21 00 0c lw r1,(r1+12)
8004794: 28 21 00 34 lw r1,(r1+52)
8004798: e3 ff ff f3 bi 8004764 <pthread_rwlock_timedrdlock+0xb8>
0800479c <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
800479c: 37 9c ff e0 addi sp,sp,-32
80047a0: 5b 8b 00 18 sw (sp+24),r11
80047a4: 5b 8c 00 14 sw (sp+20),r12
80047a8: 5b 8d 00 10 sw (sp+16),r13
80047ac: 5b 8e 00 0c sw (sp+12),r14
80047b0: 5b 8f 00 08 sw (sp+8),r15
80047b4: 5b 9d 00 04 sw (sp+4),ra
80047b8: b8 20 58 00 mv r11,r1
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
return EINVAL;
80047bc: 34 0c 00 16 mvi r12,22
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80047c0: b8 40 08 00 mv r1,r2
Objects_Locations location;
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
80047c4: 45 60 00 0c be r11,r0,80047f4 <pthread_rwlock_timedwrlock+0x58>
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
80047c8: 37 82 00 1c addi r2,sp,28
80047cc: f8 00 1c b6 calli 800baa4 <_POSIX_Absolute_timeout_to_ticks>
80047d0: 78 03 08 01 mvhi r3,0x801
80047d4: 29 62 00 00 lw r2,(r11+0)
80047d8: b8 20 70 00 mv r14,r1
80047dc: b8 60 08 00 mv r1,r3
80047e0: 38 21 9a 00 ori r1,r1,0x9a00
80047e4: 37 83 00 20 addi r3,sp,32
80047e8: f8 00 0a d7 calli 8007344 <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
80047ec: 2b 8d 00 20 lw r13,(sp+32)
80047f0: 45 a0 00 0a be r13,r0,8004818 <pthread_rwlock_timedwrlock+0x7c>
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
80047f4: b9 80 08 00 mv r1,r12
80047f8: 2b 9d 00 04 lw ra,(sp+4)
80047fc: 2b 8b 00 18 lw r11,(sp+24)
8004800: 2b 8c 00 14 lw r12,(sp+20)
8004804: 2b 8d 00 10 lw r13,(sp+16)
8004808: 2b 8e 00 0c lw r14,(sp+12)
800480c: 2b 8f 00 08 lw r15,(sp+8)
8004810: 37 9c 00 20 addi sp,sp,32
8004814: c3 a0 00 00 ret
(pthread_rwlock_t *__rwlock, _CONST struct timespec *__abstime));
int _EXFUN(pthread_rwlock_unlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_wrlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_trywrlock,(pthread_rwlock_t *__rwlock));
int _EXFUN(pthread_rwlock_timedwrlock,
8004818: 65 cf 00 03 cmpei r15,r14,3
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
800481c: 29 62 00 00 lw r2,(r11+0)
8004820: 2b 84 00 1c lw r4,(sp+28)
8004824: 34 21 00 10 addi r1,r1,16
8004828: b9 e0 18 00 mv r3,r15
800482c: 34 05 00 00 mvi r5,0
8004830: f8 00 06 e5 calli 80063c4 <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
8004834: f8 00 0d fc calli 8008024 <_Thread_Enable_dispatch>
if ( !do_wait &&
8004838: 5d ed 00 10 bne r15,r13,8004878 <pthread_rwlock_timedwrlock+0xdc>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
800483c: 78 01 08 01 mvhi r1,0x801
8004840: 38 21 9d 38 ori r1,r1,0x9d38
8004844: 28 21 00 0c lw r1,(r1+12)
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
8004848: 34 02 00 02 mvi r2,2
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
800484c: 28 21 00 34 lw r1,(r1+52)
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
8004850: 44 22 00 04 be r1,r2,8004860 <pthread_rwlock_timedwrlock+0xc4>
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
8004854: f8 00 00 0e calli 800488c <_POSIX_RWLock_Translate_core_RWLock_return_code>
8004858: b8 20 60 00 mv r12,r1
800485c: e3 ff ff e6 bi 80047f4 <pthread_rwlock_timedwrlock+0x58>
);
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
8004860: 45 cf ff e5 be r14,r15,80047f4 <pthread_rwlock_timedwrlock+0x58><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004864: 35 ce ff ff addi r14,r14,-1
8004868: 34 02 00 01 mvi r2,1
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
800486c: 34 0c 00 74 mvi r12,116
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004870: 50 4e ff e1 bgeu r2,r14,80047f4 <pthread_rwlock_timedwrlock+0x58><== ALWAYS TAKEN
8004874: e3 ff ff f8 bi 8004854 <pthread_rwlock_timedwrlock+0xb8>
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
8004878: 78 01 08 01 mvhi r1,0x801
800487c: 38 21 9d 38 ori r1,r1,0x9d38
8004880: 28 21 00 0c lw r1,(r1+12)
8004884: 28 21 00 34 lw r1,(r1+52)
8004888: e3 ff ff f3 bi 8004854 <pthread_rwlock_timedwrlock+0xb8>
080051f4 <pthread_rwlockattr_setpshared>:
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
return EINVAL;
80051f4: 34 03 00 16 mvi r3,22
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
80051f8: 44 20 00 07 be r1,r0,8005214 <pthread_rwlockattr_setpshared+0x20>
return EINVAL;
if ( !attr->is_initialized )
80051fc: 28 24 00 00 lw r4,(r1+0)
8005200: 44 80 00 05 be r4,r0,8005214 <pthread_rwlockattr_setpshared+0x20>
return EINVAL;
switch ( pshared ) {
8005204: 34 04 00 01 mvi r4,1
8005208: 54 44 00 03 bgu r2,r4,8005214 <pthread_rwlockattr_setpshared+0x20><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
800520c: 58 22 00 04 sw (r1+4),r2
return 0;
8005210: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
8005214: b8 60 08 00 mv r1,r3
8005218: c3 a0 00 00 ret
080064dc <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
80064dc: 37 9c ff dc addi sp,sp,-36
80064e0: 5b 8b 00 18 sw (sp+24),r11
80064e4: 5b 8c 00 14 sw (sp+20),r12
80064e8: 5b 8d 00 10 sw (sp+16),r13
80064ec: 5b 8e 00 0c sw (sp+12),r14
80064f0: 5b 8f 00 08 sw (sp+8),r15
80064f4: 5b 9d 00 04 sw (sp+4),ra
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
80064f8: 34 0c 00 16 mvi r12,22
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
80064fc: b8 60 58 00 mv r11,r3
8006500: b8 20 68 00 mv r13,r1
8006504: b8 40 70 00 mv r14,r2
int rc;
/*
* Check all the parameters
*/
if ( !param )
8006508: 44 60 00 08 be r3,r0,8006528 <pthread_setschedparam+0x4c>
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
800650c: b8 40 08 00 mv r1,r2
8006510: 37 84 00 20 addi r4,sp,32
8006514: b8 60 10 00 mv r2,r3
8006518: 37 83 00 24 addi r3,sp,36
800651c: f8 00 1a 8c calli 800cf4c <_POSIX_Thread_Translate_sched_param>
8006520: b8 20 60 00 mv r12,r1
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
8006524: 44 20 00 0a be r1,r0,800654c <pthread_setschedparam+0x70>
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
8006528: b9 80 08 00 mv r1,r12
800652c: 2b 9d 00 04 lw ra,(sp+4)
8006530: 2b 8b 00 18 lw r11,(sp+24)
8006534: 2b 8c 00 14 lw r12,(sp+20)
8006538: 2b 8d 00 10 lw r13,(sp+16)
800653c: 2b 8e 00 0c lw r14,(sp+12)
8006540: 2b 8f 00 08 lw r15,(sp+8)
8006544: 37 9c 00 24 addi sp,sp,36
8006548: c3 a0 00 00 ret
800654c: 78 01 08 01 mvhi r1,0x801
8006550: 38 21 aa a0 ori r1,r1,0xaaa0
8006554: b9 a0 10 00 mv r2,r13
8006558: 37 83 00 1c addi r3,sp,28
800655c: f8 00 07 bf calli 8008458 <_Objects_Get>
8006560: b8 20 78 00 mv r15,r1
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _POSIX_Threads_Get( thread, &location );
switch ( location ) {
8006564: 2b 81 00 1c lw r1,(sp+28)
8006568: 44 2c 00 03 be r1,r12,8006574 <pthread_setschedparam+0x98>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
800656c: 34 0c 00 03 mvi r12,3
8006570: e3 ff ff ee bi 8006528 <pthread_setschedparam+0x4c>
*/
the_thread = _POSIX_Threads_Get( thread, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8006574: 29 ed 01 20 lw r13,(r15+288)
if ( api->schedpolicy == SCHED_SPORADIC )
8006578: 34 01 00 04 mvi r1,4
800657c: 29 a2 00 84 lw r2,(r13+132)
8006580: 44 41 00 31 be r2,r1,8006644 <pthread_setschedparam+0x168>
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
8006584: 59 ae 00 84 sw (r13+132),r14
api->schedparam = *param;
8006588: 29 62 00 00 lw r2,(r11+0)
800658c: 59 a2 00 88 sw (r13+136),r2
8006590: 29 61 00 04 lw r1,(r11+4)
8006594: 59 a1 00 8c sw (r13+140),r1
8006598: 29 61 00 08 lw r1,(r11+8)
800659c: 59 a1 00 90 sw (r13+144),r1
80065a0: 29 61 00 0c lw r1,(r11+12)
80065a4: 59 a1 00 94 sw (r13+148),r1
80065a8: 29 61 00 10 lw r1,(r11+16)
80065ac: 59 a1 00 98 sw (r13+152),r1
80065b0: 29 61 00 14 lw r1,(r11+20)
80065b4: 59 a1 00 9c sw (r13+156),r1
80065b8: 29 61 00 18 lw r1,(r11+24)
80065bc: 59 a1 00 a0 sw (r13+160),r1
the_thread->budget_algorithm = budget_algorithm;
80065c0: 2b 81 00 24 lw r1,(sp+36)
80065c4: 59 e1 00 7c sw (r15+124),r1
the_thread->budget_callout = budget_callout;
80065c8: 2b 81 00 20 lw r1,(sp+32)
80065cc: 59 e1 00 80 sw (r15+128),r1
switch ( api->schedpolicy ) {
80065d0: 48 0e 00 05 bg r0,r14,80065e4 <pthread_setschedparam+0x108><== NEVER TAKEN
80065d4: 34 01 00 02 mvi r1,2
80065d8: 4c 2e 00 0d bge r1,r14,800660c <pthread_setschedparam+0x130>
80065dc: 34 01 00 04 mvi r1,4
80065e0: 45 c1 00 03 be r14,r1,80065ec <pthread_setschedparam+0x110><== ALWAYS TAKEN
_Watchdog_Remove( &api->Sporadic_timer );
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
break;
}
_Thread_Enable_dispatch();
80065e4: f8 00 0b 0d calli 8009218 <_Thread_Enable_dispatch> <== NOT EXECUTED
return 0;
80065e8: e3 ff ff d0 bi 8006528 <pthread_setschedparam+0x4c> <== NOT EXECUTED
true
);
break;
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
80065ec: 59 a2 00 a4 sw (r13+164),r2
_Watchdog_Remove( &api->Sporadic_timer );
80065f0: 35 a1 00 a8 addi r1,r13,168
80065f4: f8 00 10 77 calli 800a7d0 <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
80065f8: 34 01 00 00 mvi r1,0
80065fc: b9 e0 10 00 mv r2,r15
8006600: fb ff ff 66 calli 8006398 <_POSIX_Threads_Sporadic_budget_TSR>
break;
}
_Thread_Enable_dispatch();
8006604: f8 00 0b 05 calli 8009218 <_Thread_Enable_dispatch>
8006608: e3 ff ff c8 bi 8006528 <pthread_setschedparam+0x4c>
800660c: 78 03 08 01 mvhi r3,0x801
8006610: 38 63 a0 e4 ori r3,r3,0xa0e4
switch ( api->schedpolicy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006614: 78 01 08 01 mvhi r1,0x801
8006618: 38 21 a8 60 ori r1,r1,0xa860
800661c: 40 63 00 00 lbu r3,(r3+0)
8006620: 28 24 00 00 lw r4,(r1+0)
the_thread->real_priority =
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
8006624: b9 e0 08 00 mv r1,r15
8006628: c8 62 10 00 sub r2,r3,r2
switch ( api->schedpolicy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
800662c: 59 e4 00 78 sw (r15+120),r4
the_thread->real_priority =
8006630: 59 e2 00 18 sw (r15+24),r2
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
8006634: 34 03 00 01 mvi r3,1
8006638: f8 00 09 99 calli 8008c9c <_Thread_Change_priority>
_Watchdog_Remove( &api->Sporadic_timer );
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
break;
}
_Thread_Enable_dispatch();
800663c: f8 00 0a f7 calli 8009218 <_Thread_Enable_dispatch>
8006640: e3 ff ff ba bi 8006528 <pthread_setschedparam+0x4c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
8006644: 35 a1 00 a8 addi r1,r13,168
8006648: f8 00 10 62 calli 800a7d0 <_Watchdog_Remove>
800664c: e3 ff ff ce bi 8006584 <pthread_setschedparam+0xa8>
08003934 <pthread_testcancel>:
*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
8003934: 37 9c ff f8 addi sp,sp,-8
8003938: 5b 8b 00 08 sw (sp+8),r11
800393c: 5b 9d 00 04 sw (sp+4),ra
* Don't even think about deleting a resource from an ISR.
* Besides this request is supposed to be for _Thread_Executing
* and the ISR context is not a thread.
*/
if ( _ISR_Is_in_progress() )
8003940: 78 0b 08 01 mvhi r11,0x801
8003944: 39 6b 6d 20 ori r11,r11,0x6d20
8003948: 29 62 00 08 lw r2,(r11+8)
800394c: 5c 40 00 10 bne r2,r0,800398c <pthread_testcancel+0x58> <== NEVER TAKEN
8003950: 78 01 08 01 mvhi r1,0x801
8003954: 38 21 68 50 ori r1,r1,0x6850
8003958: 28 24 00 00 lw r4,(r1+0)
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
800395c: 29 63 00 0c lw r3,(r11+12)
8003960: 34 84 00 01 addi r4,r4,1
8003964: 28 63 01 20 lw r3,(r3+288)
8003968: 58 24 00 00 sw (r1+0),r4
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
800396c: 28 61 00 d8 lw r1,(r3+216)
8003970: 5c 22 00 0b bne r1,r2,800399c <pthread_testcancel+0x68> <== NEVER TAKEN
8003974: 28 62 00 e0 lw r2,(r3+224)
8003978: 44 41 00 09 be r2,r1,800399c <pthread_testcancel+0x68>
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
800397c: f8 00 0a 36 calli 8006254 <_Thread_Enable_dispatch>
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
8003980: 29 61 00 0c lw r1,(r11+12)
8003984: 34 02 ff ff mvi r2,-1
8003988: f8 00 19 a5 calli 800a01c <_POSIX_Thread_Exit>
}
800398c: 2b 9d 00 04 lw ra,(sp+4)
8003990: 2b 8b 00 08 lw r11,(sp+8)
8003994: 37 9c 00 08 addi sp,sp,8
8003998: c3 a0 00 00 ret <== NOT EXECUTED
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
800399c: f8 00 0a 2e calli 8006254 <_Thread_Enable_dispatch>
if ( cancel )
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
}
80039a0: 2b 9d 00 04 lw ra,(sp+4)
80039a4: 2b 8b 00 08 lw r11,(sp+8)
80039a8: 37 9c 00 08 addi sp,sp,8
80039ac: c3 a0 00 00 ret
0801286c <read>:
ssize_t read(
int fd,
void *buffer,
size_t count
)
{
801286c: 37 9c ff f4 addi sp,sp,-12
8012870: 5b 8b 00 0c sw (sp+12),r11
8012874: 5b 8c 00 08 sw (sp+8),r12
8012878: 5b 9d 00 04 sw (sp+4),ra
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
801287c: 78 04 08 01 mvhi r4,0x801
8012880: 38 84 40 10 ori r4,r4,0x4010
8012884: 28 84 00 00 lw r4,(r4+0)
8012888: 54 81 00 06 bgu r4,r1,80128a0 <read+0x34> <== ALWAYS TAKEN
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
801288c: fb ff e9 4e calli 800cdc4 <__errno>
8012890: 34 02 00 09 mvi r2,9
8012894: 58 22 00 00 sw (r1+0),r2
8012898: 34 0c ff ff mvi r12,-1
801289c: e0 00 00 23 bi 8012928 <read+0xbc>
{
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
80128a0: b4 21 08 00 add r1,r1,r1
80128a4: 78 04 08 01 mvhi r4,0x801
80128a8: b4 21 08 00 add r1,r1,r1
80128ac: 38 84 47 2c ori r4,r4,0x472c
80128b0: b4 21 08 00 add r1,r1,r1
80128b4: 28 8b 00 00 lw r11,(r4+0)
80128b8: b4 21 08 00 add r1,r1,r1
80128bc: b4 21 08 00 add r1,r1,r1
80128c0: b4 21 08 00 add r1,r1,r1
80128c4: b5 61 58 00 add r11,r11,r1
rtems_libio_check_is_open( iop );
80128c8: 29 61 00 18 lw r1,(r11+24)
80128cc: 20 24 01 00 andi r4,r1,0x100
80128d0: 44 80 ff ef be r4,r0,801288c <read+0x20>
rtems_libio_check_buffer( buffer );
80128d4: 44 40 00 1b be r2,r0,8012940 <read+0xd4> <== NEVER TAKEN
rtems_libio_check_count( count );
80128d8: 34 0c 00 00 mvi r12,0
80128dc: 44 60 00 13 be r3,r0,8012928 <read+0xbc>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
80128e0: 20 21 00 02 andi r1,r1,0x2
80128e4: 44 20 00 17 be r1,r0,8012940 <read+0xd4>
/*
* Now process the read().
*/
rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count );
80128e8: 29 64 00 24 lw r4,(r11+36)
80128ec: b9 60 08 00 mv r1,r11
80128f0: 28 84 00 08 lw r4,(r4+8)
80128f4: d8 80 00 00 call r4
80128f8: b8 20 60 00 mv r12,r1
if ( rc > 0 )
80128fc: 4c 01 00 0b bge r0,r1,8012928 <read+0xbc>
iop->offset += rc;
8012900: 34 02 00 1f mvi r2,31
8012904: fb ff fe 0a calli 801212c <__ashrsi3>
8012908: 29 62 00 14 lw r2,(r11+20)
801290c: 29 64 00 10 lw r4,(r11+16)
8012910: b5 82 10 00 add r2,r12,r2
8012914: f5 82 18 00 cmpgu r3,r12,r2
8012918: b4 24 08 00 add r1,r1,r4
801291c: b4 61 08 00 add r1,r3,r1
8012920: 59 61 00 10 sw (r11+16),r1
8012924: 59 62 00 14 sw (r11+20),r2
return rc;
}
8012928: b9 80 08 00 mv r1,r12
801292c: 2b 9d 00 04 lw ra,(sp+4)
8012930: 2b 8b 00 0c lw r11,(sp+12)
8012934: 2b 8c 00 08 lw r12,(sp+8)
8012938: 37 9c 00 0c addi sp,sp,12
801293c: c3 a0 00 00 ret
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
8012940: fb ff e9 21 calli 800cdc4 <__errno>
8012944: 34 02 00 16 mvi r2,22
8012948: 58 22 00 00 sw (r1+0),r2
801294c: 34 0c ff ff mvi r12,-1
8012950: e3 ff ff f6 bi 8012928 <read+0xbc>
080051c0 <readlink>:
ssize_t readlink(
const char *pathname,
char *buf,
size_t bufsize
)
{
80051c0: 37 9c ff d8 addi sp,sp,-40
80051c4: 5b 8b 00 14 sw (sp+20),r11
80051c8: 5b 8c 00 10 sw (sp+16),r12
80051cc: 5b 8d 00 0c sw (sp+12),r13
80051d0: 5b 8e 00 08 sw (sp+8),r14
80051d4: 5b 9d 00 04 sw (sp+4),ra
80051d8: b8 40 68 00 mv r13,r2
80051dc: b8 20 60 00 mv r12,r1
80051e0: b8 60 70 00 mv r14,r3
rtems_filesystem_location_info_t loc;
int result;
if (!buf)
80051e4: 44 40 00 2b be r2,r0,8005290 <readlink+0xd0>
rtems_set_errno_and_return_minus_one( EFAULT );
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
80051e8: f8 00 34 d4 calli 8012538 <strlen>
80051ec: b8 20 20 00 mv r4,r1
80051f0: 37 8b 00 18 addi r11,sp,24
80051f4: b9 80 08 00 mv r1,r12
80051f8: b8 80 10 00 mv r2,r4
80051fc: 34 03 00 00 mvi r3,0
8005200: b9 60 20 00 mv r4,r11
8005204: 34 05 00 00 mvi r5,0
8005208: fb ff fa 93 calli 8003c54 <rtems_filesystem_evaluate_path>
0, &loc, false );
if ( result != 0 )
return -1;
800520c: 34 0c ff ff mvi r12,-1
if (!buf)
rtems_set_errno_and_return_minus_one( EFAULT );
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
0, &loc, false );
if ( result != 0 )
8005210: 44 20 00 09 be r1,r0,8005234 <readlink+0x74> <== ALWAYS TAKEN
result = (*loc.ops->readlink_h)( &loc, buf, bufsize );
rtems_filesystem_freenode( &loc );
return result;
}
8005214: b9 80 08 00 mv r1,r12
8005218: 2b 9d 00 04 lw ra,(sp+4)
800521c: 2b 8b 00 14 lw r11,(sp+20)
8005220: 2b 8c 00 10 lw r12,(sp+16)
8005224: 2b 8d 00 0c lw r13,(sp+12)
8005228: 2b 8e 00 08 lw r14,(sp+8)
800522c: 37 9c 00 28 addi sp,sp,40
8005230: c3 a0 00 00 ret
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
0, &loc, false );
if ( result != 0 )
return -1;
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
8005234: 2b 82 00 24 lw r2,(sp+36)
8005238: b9 60 08 00 mv r1,r11
800523c: 28 42 00 10 lw r2,(r2+16)
8005240: d8 40 00 00 call r2
8005244: 34 02 00 04 mvi r2,4
8005248: 5c 22 00 1e bne r1,r2,80052c0 <readlink+0x100>
rtems_filesystem_freenode( &loc );
rtems_set_errno_and_return_minus_one( EINVAL );
}
result = (*loc.ops->readlink_h)( &loc, buf, bufsize );
800524c: 2b 83 00 24 lw r3,(sp+36)
8005250: b9 a0 10 00 mv r2,r13
8005254: b9 60 08 00 mv r1,r11
8005258: 28 64 00 3c lw r4,(r3+60)
800525c: b9 c0 18 00 mv r3,r14
8005260: d8 80 00 00 call r4
8005264: b8 20 60 00 mv r12,r1
rtems_filesystem_freenode( &loc );
8005268: b9 60 08 00 mv r1,r11
800526c: fb ff fa c8 calli 8003d8c <rtems_filesystem_freenode>
return result;
}
8005270: b9 80 08 00 mv r1,r12
8005274: 2b 9d 00 04 lw ra,(sp+4)
8005278: 2b 8b 00 14 lw r11,(sp+20)
800527c: 2b 8c 00 10 lw r12,(sp+16)
8005280: 2b 8d 00 0c lw r13,(sp+12)
8005284: 2b 8e 00 08 lw r14,(sp+8)
8005288: 37 9c 00 28 addi sp,sp,40
800528c: c3 a0 00 00 ret
{
rtems_filesystem_location_info_t loc;
int result;
if (!buf)
rtems_set_errno_and_return_minus_one( EFAULT );
8005290: f8 00 2d 20 calli 8010710 <__errno>
8005294: 34 02 00 0e mvi r2,14
8005298: 34 0c ff ff mvi r12,-1
800529c: 58 22 00 00 sw (r1+0),r2
result = (*loc.ops->readlink_h)( &loc, buf, bufsize );
rtems_filesystem_freenode( &loc );
return result;
}
80052a0: b9 80 08 00 mv r1,r12
80052a4: 2b 9d 00 04 lw ra,(sp+4)
80052a8: 2b 8b 00 14 lw r11,(sp+20)
80052ac: 2b 8c 00 10 lw r12,(sp+16)
80052b0: 2b 8d 00 0c lw r13,(sp+12)
80052b4: 2b 8e 00 08 lw r14,(sp+8)
80052b8: 37 9c 00 28 addi sp,sp,40
80052bc: c3 a0 00 00 ret
0, &loc, false );
if ( result != 0 )
return -1;
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
rtems_filesystem_freenode( &loc );
80052c0: b9 60 08 00 mv r1,r11
80052c4: fb ff fa b2 calli 8003d8c <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EINVAL );
80052c8: f8 00 2d 12 calli 8010710 <__errno>
80052cc: 34 02 00 16 mvi r2,22
80052d0: 58 22 00 00 sw (r1+0),r2
80052d4: e3 ff ff d0 bi 8005214 <readlink+0x54>
080039fc <readv>:
ssize_t readv(
int fd,
const struct iovec *iov,
int iovcnt
)
{
80039fc: 37 9c ff e4 addi sp,sp,-28
8003a00: 5b 8b 00 1c sw (sp+28),r11
8003a04: 5b 8c 00 18 sw (sp+24),r12
8003a08: 5b 8d 00 14 sw (sp+20),r13
8003a0c: 5b 8e 00 10 sw (sp+16),r14
8003a10: 5b 8f 00 0c sw (sp+12),r15
8003a14: 5b 90 00 08 sw (sp+8),r16
8003a18: 5b 9d 00 04 sw (sp+4),ra
int v;
int bytes;
rtems_libio_t *iop;
bool all_zeros;
rtems_libio_check_fd( fd );
8003a1c: 78 04 08 01 mvhi r4,0x801
8003a20: 38 84 60 10 ori r4,r4,0x6010
8003a24: 28 84 00 00 lw r4,(r4+0)
ssize_t readv(
int fd,
const struct iovec *iov,
int iovcnt
)
{
8003a28: b8 60 60 00 mv r12,r3
int v;
int bytes;
rtems_libio_t *iop;
bool all_zeros;
rtems_libio_check_fd( fd );
8003a2c: 54 81 00 06 bgu r4,r1,8003a44 <readv+0x48>
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
8003a30: f8 00 29 5d calli 800dfa4 <__errno>
8003a34: 34 02 00 09 mvi r2,9
8003a38: 58 22 00 00 sw (r1+0),r2
8003a3c: 34 0f ff ff mvi r15,-1
8003a40: e0 00 00 16 bi 8003a98 <readv+0x9c>
int bytes;
rtems_libio_t *iop;
bool all_zeros;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
8003a44: b4 21 08 00 add r1,r1,r1
8003a48: 78 03 08 01 mvhi r3,0x801
8003a4c: b4 21 08 00 add r1,r1,r1
8003a50: 38 63 67 2c ori r3,r3,0x672c
8003a54: b4 21 08 00 add r1,r1,r1
8003a58: 28 6b 00 00 lw r11,(r3+0)
8003a5c: b4 21 08 00 add r1,r1,r1
8003a60: b4 21 08 00 add r1,r1,r1
8003a64: b4 21 08 00 add r1,r1,r1
8003a68: b5 61 58 00 add r11,r11,r1
rtems_libio_check_is_open( iop );
8003a6c: 29 61 00 18 lw r1,(r11+24)
8003a70: 20 23 01 00 andi r3,r1,0x100
8003a74: 44 60 ff ef be r3,r0,8003a30 <readv+0x34>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
8003a78: 20 21 00 02 andi r1,r1,0x2
8003a7c: 44 20 00 03 be r1,r0,8003a88 <readv+0x8c> <== NEVER TAKEN
/*
* Argument validation on IO vector
*/
if ( !iov )
8003a80: 44 40 00 02 be r2,r0,8003a88 <readv+0x8c>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
8003a84: 49 80 00 0f bg r12,r0,8003ac0 <readv+0xc4>
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old )
rtems_set_errno_and_return_minus_one( EINVAL );
8003a88: f8 00 29 47 calli 800dfa4 <__errno>
8003a8c: 34 02 00 16 mvi r2,22
8003a90: 58 22 00 00 sw (r1+0),r2
8003a94: 34 0f ff ff mvi r15,-1
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
8003a98: b9 e0 08 00 mv r1,r15
8003a9c: 2b 9d 00 04 lw ra,(sp+4)
8003aa0: 2b 8b 00 1c lw r11,(sp+28)
8003aa4: 2b 8c 00 18 lw r12,(sp+24)
8003aa8: 2b 8d 00 14 lw r13,(sp+20)
8003aac: 2b 8e 00 10 lw r14,(sp+16)
8003ab0: 2b 8f 00 0c lw r15,(sp+12)
8003ab4: 2b 90 00 08 lw r16,(sp+8)
8003ab8: 37 9c 00 1c addi sp,sp,28
8003abc: c3 a0 00 00 ret
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
8003ac0: 34 01 04 00 mvi r1,1024
8003ac4: 4c 2c 00 02 bge r1,r12,8003acc <readv+0xd0> <== ALWAYS TAKEN
8003ac8: e3 ff ff f0 bi 8003a88 <readv+0x8c> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EINVAL );
8003acc: b8 40 70 00 mv r14,r2
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
8003ad0: b8 40 20 00 mv r4,r2
8003ad4: 34 07 00 01 mvi r7,1
8003ad8: 34 05 00 00 mvi r5,0
8003adc: 34 06 00 00 mvi r6,0
/*
* iov[v].iov_len cannot be less than 0 because size_t is unsigned.
* So we only check for zero.
*/
if ( iov[v].iov_base == 0 )
8003ae0: 28 81 00 00 lw r1,(r4+0)
* are obvious errors in the iovec. So this extra loop ensures
* that we do not do anything if there is an argument error.
*/
all_zeros = true;
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003ae4: 34 a5 00 01 addi r5,r5,1
/*
* iov[v].iov_len cannot be less than 0 because size_t is unsigned.
* So we only check for zero.
*/
if ( iov[v].iov_base == 0 )
8003ae8: 44 20 ff e8 be r1,r0,8003a88 <readv+0x8c>
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
8003aec: 28 81 00 04 lw r1,(r4+4)
* are obvious errors in the iovec. So this extra loop ensures
* that we do not do anything if there is an argument error.
*/
all_zeros = true;
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003af0: 34 84 00 08 addi r4,r4,8
total += iov[v].iov_len;
if ( total < old )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
8003af4: 64 23 00 00 cmpei r3,r1,0
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
8003af8: b4 c1 08 00 add r1,r6,r1
if ( total < old )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
8003afc: c8 03 18 00 sub r3,r0,r3
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old )
8003b00: 4c 26 00 02 bge r1,r6,8003b08 <readv+0x10c>
8003b04: e3 ff ff e1 bi 8003a88 <readv+0x8c>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
8003b08: a0 e3 38 00 and r7,r7,r3
* are obvious errors in the iovec. So this extra loop ensures
* that we do not do anything if there is an argument error.
*/
all_zeros = true;
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003b0c: 49 85 00 1e bg r12,r5,8003b84 <readv+0x188>
* A readv with all zeros logically has no effect. Even though
* OpenGroup didn't address this case as they did with writev(),
* we will handle it the same way for symmetry.
*/
if ( all_zeros == true ) {
return 0;
8003b10: 34 0f 00 00 mvi r15,0
/*
* A readv with all zeros logically has no effect. Even though
* OpenGroup didn't address this case as they did with writev(),
* we will handle it the same way for symmetry.
*/
if ( all_zeros == true ) {
8003b14: 5c e0 ff e1 bne r7,r0,8003a98 <readv+0x9c>
8003b18: 34 10 00 00 mvi r16,0
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
bytes = (*iop->pathinfo.handlers->read_h)(
8003b1c: 29 61 00 24 lw r1,(r11+36)
8003b20: 29 c2 00 00 lw r2,(r14+0)
8003b24: 29 c3 00 04 lw r3,(r14+4)
8003b28: 28 24 00 08 lw r4,(r1+8)
8003b2c: b9 60 08 00 mv r1,r11
}
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003b30: 36 10 00 01 addi r16,r16,1
bytes = (*iop->pathinfo.handlers->read_h)(
8003b34: d8 80 00 00 call r4
8003b38: b8 20 68 00 mv r13,r1
if ( bytes < 0 )
return -1;
if ( bytes > 0 ) {
iop->offset += bytes;
8003b3c: 34 02 00 1f mvi r2,31
iop,
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
8003b40: 48 01 00 13 bg r0,r1,8003b8c <readv+0x190> <== NEVER TAKEN
return -1;
if ( bytes > 0 ) {
8003b44: 44 20 00 0b be r1,r0,8003b70 <readv+0x174> <== NEVER TAKEN
iop->offset += bytes;
8003b48: f8 00 3e a0 calli 80135c8 <__ashrsi3>
8003b4c: 29 62 00 14 lw r2,(r11+20)
8003b50: 29 64 00 10 lw r4,(r11+16)
total += bytes;
8003b54: b5 ed 78 00 add r15,r15,r13
if ( bytes < 0 )
return -1;
if ( bytes > 0 ) {
iop->offset += bytes;
8003b58: b5 a2 10 00 add r2,r13,r2
8003b5c: f5 a2 18 00 cmpgu r3,r13,r2
8003b60: b4 24 08 00 add r1,r1,r4
8003b64: b4 61 08 00 add r1,r3,r1
8003b68: 59 61 00 10 sw (r11+16),r1
8003b6c: 59 62 00 14 sw (r11+20),r2
total += bytes;
}
if (bytes != iov[ v ].iov_len)
8003b70: 29 c1 00 04 lw r1,(r14+4)
}
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003b74: 35 ce 00 08 addi r14,r14,8
if ( bytes > 0 ) {
iop->offset += bytes;
total += bytes;
}
if (bytes != iov[ v ].iov_len)
8003b78: 5d a1 ff c8 bne r13,r1,8003a98 <readv+0x9c> <== NEVER TAKEN
}
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003b7c: 49 90 ff e8 bg r12,r16,8003b1c <readv+0x120>
8003b80: e3 ff ff c6 bi 8003a98 <readv+0x9c>
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
8003b84: b8 20 30 00 mv r6,r1
8003b88: e3 ff ff d6 bi 8003ae0 <readv+0xe4>
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
return -1;
8003b8c: 34 0f ff ff mvi r15,-1 <== NOT EXECUTED
8003b90: e3 ff ff c2 bi 8003a98 <readv+0x9c> <== NOT EXECUTED
080129fc <realloc>:
void *realloc(
void *ptr,
size_t size
)
{
80129fc: 37 9c ff e4 addi sp,sp,-28
8012a00: 5b 8b 00 18 sw (sp+24),r11
8012a04: 5b 8c 00 14 sw (sp+20),r12
8012a08: 5b 8d 00 10 sw (sp+16),r13
8012a0c: 5b 8e 00 0c sw (sp+12),r14
8012a10: 5b 8f 00 08 sw (sp+8),r15
8012a14: 5b 9d 00 04 sw (sp+4),ra
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
8012a18: 78 0c 08 01 mvhi r12,0x801
8012a1c: 39 8c 47 48 ori r12,r12,0x4748
8012a20: 29 84 00 10 lw r4,(r12+16)
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
8012a24: 78 03 08 01 mvhi r3,0x801
8012a28: 38 63 4a 20 ori r3,r3,0x4a20
8012a2c: 28 63 00 00 lw r3,(r3+0)
)
{
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
8012a30: 34 84 00 01 addi r4,r4,1
void *realloc(
void *ptr,
size_t size
)
{
8012a34: b8 20 58 00 mv r11,r1
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
8012a38: 59 84 00 10 sw (r12+16),r4
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
8012a3c: 34 01 00 03 mvi r1,3
void *realloc(
void *ptr,
size_t size
)
{
8012a40: b8 40 70 00 mv r14,r2
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
8012a44: 44 61 00 22 be r3,r1,8012acc <realloc+0xd0> <== ALWAYS TAKEN
}
/*
* Continue with realloc().
*/
if ( !ptr )
8012a48: 45 60 00 2d be r11,r0,8012afc <realloc+0x100>
return malloc( size );
if ( !size ) {
8012a4c: 45 c0 00 17 be r14,r0,8012aa8 <realloc+0xac> <== NEVER TAKEN
free( ptr );
return (void *) 0;
}
if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) {
8012a50: 78 0d 08 01 mvhi r13,0x801
8012a54: 39 ad 40 1c ori r13,r13,0x401c
8012a58: 29 a1 00 00 lw r1,(r13+0)
8012a5c: b9 60 10 00 mv r2,r11
8012a60: 37 83 00 1c addi r3,sp,28
8012a64: f8 00 00 76 calli 8012c3c <_Protected_heap_Get_block_size>
8012a68: 44 20 00 14 be r1,r0,8012ab8 <realloc+0xbc> <== NEVER TAKEN
}
/*
* Now resize it.
*/
if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) {
8012a6c: 29 a1 00 00 lw r1,(r13+0)
8012a70: b9 60 10 00 mv r2,r11
8012a74: b9 c0 18 00 mv r3,r14
8012a78: f8 00 00 89 calli 8012c9c <_Protected_heap_Resize_block>
8012a7c: b8 20 68 00 mv r13,r1
8012a80: 44 20 00 23 be r1,r0,8012b0c <realloc+0x110>
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
free( ptr );
return new_area;
}
8012a84: b9 60 08 00 mv r1,r11
8012a88: 2b 9d 00 04 lw ra,(sp+4)
8012a8c: 2b 8b 00 18 lw r11,(sp+24)
8012a90: 2b 8c 00 14 lw r12,(sp+20)
8012a94: 2b 8d 00 10 lw r13,(sp+16)
8012a98: 2b 8e 00 0c lw r14,(sp+12)
8012a9c: 2b 8f 00 08 lw r15,(sp+8)
8012aa0: 37 9c 00 1c addi sp,sp,28
8012aa4: c3 a0 00 00 ret
*/
if ( !ptr )
return malloc( size );
if ( !size ) {
free( ptr );
8012aa8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8012aac: fb ff ba 7f calli 80014a8 <free> <== NOT EXECUTED
return (void *) 0;
8012ab0: 34 0b 00 00 mvi r11,0 <== NOT EXECUTED
8012ab4: e3 ff ff f4 bi 8012a84 <realloc+0x88> <== NOT EXECUTED
}
if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) {
errno = EINVAL;
8012ab8: fb ff e8 c3 calli 800cdc4 <__errno>
8012abc: 34 02 00 16 mvi r2,22
8012ac0: 58 22 00 00 sw (r1+0),r2
return (void *) 0;
8012ac4: 34 0b 00 00 mvi r11,0
8012ac8: e3 ff ff ef bi 8012a84 <realloc+0x88>
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
if (_Thread_Dispatch_disable_level > 0)
8012acc: 78 01 08 01 mvhi r1,0x801
8012ad0: 38 21 48 a8 ori r1,r1,0x48a8
8012ad4: 28 21 00 00 lw r1,(r1+0)
8012ad8: 44 20 00 03 be r1,r0,8012ae4 <realloc+0xe8> <== ALWAYS TAKEN
new_area = malloc( size );
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
if ( !new_area ) {
return (void *) 0;
8012adc: 34 0b 00 00 mvi r11,0
8012ae0: e3 ff ff e9 bi 8012a84 <realloc+0x88>
if (_System_state_Is_up(_System_state_Get())) {
if (_Thread_Dispatch_disable_level > 0)
return (void *) 0;
if (_ISR_Nest_level > 0)
8012ae4: 78 02 08 01 mvhi r2,0x801
8012ae8: 38 42 4d 78 ori r2,r2,0x4d78
8012aec: 28 42 00 08 lw r2,(r2+8)
8012af0: 44 41 ff d6 be r2,r1,8012a48 <realloc+0x4c> <== ALWAYS TAKEN
new_area = malloc( size );
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
if ( !new_area ) {
return (void *) 0;
8012af4: 34 0b 00 00 mvi r11,0 <== NOT EXECUTED
8012af8: e3 ff ff e3 bi 8012a84 <realloc+0x88> <== NOT EXECUTED
/*
* Continue with realloc().
*/
if ( !ptr )
return malloc( size );
8012afc: b9 c0 08 00 mv r1,r14
8012b00: fb ff bb 6b calli 80018ac <malloc>
8012b04: b8 20 58 00 mv r11,r1
8012b08: e3 ff ff df bi 8012a84 <realloc+0x88>
* There used to be a free on this error case but it is wrong to
* free the memory per OpenGroup Single UNIX Specification V2
* and the C Standard.
*/
new_area = malloc( size );
8012b0c: b9 c0 08 00 mv r1,r14
8012b10: fb ff bb 67 calli 80018ac <malloc>
8012b14: b8 20 78 00 mv r15,r1
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
8012b18: 29 81 00 04 lw r1,(r12+4)
8012b1c: 34 21 ff ff addi r1,r1,-1
8012b20: 59 81 00 04 sw (r12+4),r1
if ( !new_area ) {
8012b24: 45 ed ff ee be r15,r13,8012adc <realloc+0xe0>
return (void *) 0;
}
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
8012b28: 2b 81 00 1c lw r1,(sp+28)
8012b2c: b9 c0 18 00 mv r3,r14
8012b30: 50 2e 00 02 bgeu r1,r14,8012b38 <realloc+0x13c> <== NEVER TAKEN
8012b34: b8 20 18 00 mv r3,r1
8012b38: b9 60 10 00 mv r2,r11
8012b3c: b9 e0 08 00 mv r1,r15
8012b40: fb ff eb 57 calli 800d89c <memcpy>
free( ptr );
8012b44: b9 60 08 00 mv r1,r11
8012b48: fb ff ba 58 calli 80014a8 <free>
return new_area;
8012b4c: b9 e0 58 00 mv r11,r15
8012b50: e3 ff ff cd bi 8012a84 <realloc+0x88>
08002b1c <rmdir>:
#include <rtems/seterr.h>
int rmdir(
const char *pathname
)
{
8002b1c: 37 9c ff bc addi sp,sp,-68
8002b20: 5b 8b 00 18 sw (sp+24),r11
8002b24: 5b 8c 00 14 sw (sp+20),r12
8002b28: 5b 8d 00 10 sw (sp+16),r13
8002b2c: 5b 8e 00 0c sw (sp+12),r14
8002b30: 5b 8f 00 08 sw (sp+8),r15
8002b34: 5b 9d 00 04 sw (sp+4),ra
8002b38: b8 20 68 00 mv r13,r1
/*
* Get the parent node of the node we wish to remove. Find the parent path.
*/
parentpathlen = rtems_filesystem_dirname ( pathname );
8002b3c: fb ff fb 86 calli 8001954 <rtems_filesystem_dirname>
if ( parentpathlen == 0 )
8002b40: 5c 20 00 4a bne r1,r0,8002c68 <rmdir+0x14c>
rtems_filesystem_get_start_loc( pathname, &i, &parentloc );
8002b44: 37 8c 00 30 addi r12,sp,48
8002b48: b9 a0 08 00 mv r1,r13
8002b4c: 37 82 00 44 addi r2,sp,68
8002b50: b9 80 18 00 mv r3,r12
8002b54: f8 00 00 51 calli 8002c98 <rtems_filesystem_get_start_loc>
8002b58: 34 0b 00 00 mvi r11,0
const char *name;
rtems_filesystem_location_info_t parentloc;
rtems_filesystem_location_info_t loc;
int i;
int result;
bool free_parentloc = false;
8002b5c: 34 0f 00 00 mvi r15,0
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
8002b60: 2b 82 00 30 lw r2,(sp+48)
name = pathname + parentpathlen;
8002b64: b5 ab 58 00 add r11,r13,r11
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8002b68: b9 60 08 00 mv r1,r11
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
8002b6c: 5b 82 00 1c sw (sp+28),r2
8002b70: 2b 82 00 34 lw r2,(sp+52)
8002b74: 5b 82 00 20 sw (sp+32),r2
8002b78: 2b 82 00 38 lw r2,(sp+56)
8002b7c: 5b 82 00 24 sw (sp+36),r2
8002b80: 2b 82 00 3c lw r2,(sp+60)
8002b84: 5b 82 00 28 sw (sp+40),r2
8002b88: 2b 82 00 40 lw r2,(sp+64)
8002b8c: 5b 82 00 2c sw (sp+44),r2
name = pathname + parentpathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8002b90: f8 00 2f 6c calli 800e940 <strlen>
8002b94: b8 20 10 00 mv r2,r1
8002b98: b9 60 08 00 mv r1,r11
8002b9c: fb ff fb 83 calli 80019a8 <rtems_filesystem_prefix_separators>
8002ba0: b5 61 68 00 add r13,r11,r1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
8002ba4: b9 a0 08 00 mv r1,r13
8002ba8: f8 00 2f 66 calli 800e940 <strlen>
8002bac: 37 8b 00 1c addi r11,sp,28
8002bb0: b8 20 10 00 mv r2,r1
8002bb4: 34 03 00 00 mvi r3,0
8002bb8: b9 a0 08 00 mv r1,r13
8002bbc: b9 60 20 00 mv r4,r11
8002bc0: 34 05 00 00 mvi r5,0
8002bc4: fb ff fb 26 calli 800185c <rtems_filesystem_evaluate_relative_path>
0, &loc, false );
if ( result != 0 ) {
8002bc8: 5c 20 00 19 bne r1,r0,8002c2c <rmdir+0x110>
}
/*
* Verify you can remove this node as a directory.
*/
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
8002bcc: 2b 82 00 28 lw r2,(sp+40)
8002bd0: b9 60 08 00 mv r1,r11
8002bd4: 28 42 00 10 lw r2,(r2+16)
8002bd8: d8 40 00 00 call r2
8002bdc: 34 02 00 01 mvi r2,1
8002be0: 5c 22 00 18 bne r1,r2,8002c40 <rmdir+0x124>
/*
* Use the filesystems rmnod to remove the node.
*/
result = (*loc.handlers->rmnod_h)( &parentloc, &loc );
8002be4: 2b 83 00 24 lw r3,(sp+36)
8002be8: b9 80 08 00 mv r1,r12
8002bec: b9 60 10 00 mv r2,r11
8002bf0: 28 63 00 34 lw r3,(r3+52)
8002bf4: d8 60 00 00 call r3
8002bf8: b8 20 70 00 mv r14,r1
rtems_filesystem_freenode( &loc );
8002bfc: b9 60 08 00 mv r1,r11
8002c00: fb ff fb 88 calli 8001a20 <rtems_filesystem_freenode>
if ( free_parentloc )
8002c04: 5d e0 00 0c bne r15,r0,8002c34 <rmdir+0x118>
rtems_filesystem_freenode( &parentloc );
return result;
}
8002c08: b9 c0 08 00 mv r1,r14
8002c0c: 2b 9d 00 04 lw ra,(sp+4)
8002c10: 2b 8b 00 18 lw r11,(sp+24)
8002c14: 2b 8c 00 14 lw r12,(sp+20)
8002c18: 2b 8d 00 10 lw r13,(sp+16)
8002c1c: 2b 8e 00 0c lw r14,(sp+12)
8002c20: 2b 8f 00 08 lw r15,(sp+8)
8002c24: 37 9c 00 44 addi sp,sp,68
8002c28: c3 a0 00 00 ret
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return -1;
8002c2c: 34 0e ff ff mvi r14,-1
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
8002c30: 45 e0 ff f6 be r15,r0,8002c08 <rmdir+0xec>
result = (*loc.handlers->rmnod_h)( &parentloc, &loc );
rtems_filesystem_freenode( &loc );
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
8002c34: b9 80 08 00 mv r1,r12
8002c38: fb ff fb 7a calli 8001a20 <rtems_filesystem_freenode>
8002c3c: e3 ff ff f3 bi 8002c08 <rmdir+0xec>
/*
* Verify you can remove this node as a directory.
*/
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
rtems_filesystem_freenode( &loc );
8002c40: b9 60 08 00 mv r1,r11
8002c44: fb ff fb 77 calli 8001a20 <rtems_filesystem_freenode>
if ( free_parentloc )
8002c48: 45 e0 00 03 be r15,r0,8002c54 <rmdir+0x138> <== NEVER TAKEN
rtems_filesystem_freenode( &parentloc );
8002c4c: b9 80 08 00 mv r1,r12
8002c50: fb ff fb 74 calli 8001a20 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( ENOTDIR );
8002c54: f8 00 2a da calli 800d7bc <__errno>
8002c58: 34 02 00 14 mvi r2,20
8002c5c: 58 22 00 00 sw (r1+0),r2
8002c60: 34 0e ff ff mvi r14,-1
8002c64: e3 ff ff e9 bi 8002c08 <rmdir+0xec>
parentpathlen = rtems_filesystem_dirname ( pathname );
if ( parentpathlen == 0 )
rtems_filesystem_get_start_loc( pathname, &i, &parentloc );
else {
result = rtems_filesystem_evaluate_path(pathname, parentpathlen,
8002c68: b8 20 58 00 mv r11,r1
8002c6c: 37 8c 00 30 addi r12,sp,48
8002c70: b9 a0 08 00 mv r1,r13
8002c74: b9 60 10 00 mv r2,r11
8002c78: 34 03 00 02 mvi r3,2
8002c7c: b9 80 20 00 mv r4,r12
8002c80: 34 05 00 00 mvi r5,0
8002c84: fb ff fb 19 calli 80018e8 <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
return -1;
8002c88: 34 0e ff ff mvi r14,-1
else {
result = rtems_filesystem_evaluate_path(pathname, parentpathlen,
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
8002c8c: 5c 20 ff df bne r1,r0,8002c08 <rmdir+0xec> <== NEVER TAKEN
return -1;
free_parentloc = true;
8002c90: 34 0f 00 01 mvi r15,1
8002c94: e3 ff ff b3 bi 8002b60 <rmdir+0x44>
08004648 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
8004648: 37 9c ff c4 addi sp,sp,-60
800464c: 5b 8b 00 18 sw (sp+24),r11
8004650: 5b 8c 00 14 sw (sp+20),r12
8004654: 5b 8d 00 10 sw (sp+16),r13
8004658: 5b 8e 00 0c sw (sp+12),r14
800465c: 5b 8f 00 08 sw (sp+8),r15
8004660: 5b 9d 00 04 sw (sp+4),ra
struct sched_param param;
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
8004664: 78 0b 08 01 mvhi r11,0x801
8004668: 39 6b 87 f8 ori r11,r11,0x87f8
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
800466c: b8 20 60 00 mv r12,r1
struct sched_param param;
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
8004670: b9 60 08 00 mv r1,r11
8004674: f8 00 02 c7 calli 8005190 <pthread_mutex_lock>
8004678: b8 20 68 00 mv r13,r1
if (result != 0) {
800467c: 5c 20 00 52 bne r1,r0,80047c4 <rtems_aio_enqueue+0x17c> <== NEVER TAKEN
return result;
}
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
8004680: f8 00 05 af calli 8005d3c <pthread_self>
8004684: 37 82 00 38 addi r2,sp,56
8004688: 37 83 00 1c addi r3,sp,28
800468c: f8 00 04 58 calli 80057ec <pthread_getschedparam>
req->caller_thread = pthread_self ();
8004690: f8 00 05 ab calli 8005d3c <pthread_self>
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
8004694: 29 82 00 14 lw r2,(r12+20)
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
req->aiocbp->return_value = 0;
if ((aio_request_queue.idle_threads == 0) &&
8004698: 29 63 00 68 lw r3,(r11+104)
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
req->caller_thread = pthread_self ();
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
800469c: 28 44 00 10 lw r4,(r2+16)
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
req->caller_thread = pthread_self ();
80046a0: 59 81 00 10 sw (r12+16),r1
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
80046a4: 2b 81 00 1c lw r1,(sp+28)
80046a8: c8 24 08 00 sub r1,r1,r4
80046ac: 59 81 00 0c sw (r12+12),r1
req->policy = policy;
80046b0: 2b 81 00 38 lw r1,(sp+56)
80046b4: 59 81 00 08 sw (r12+8),r1
req->aiocbp->error_code = EINPROGRESS;
80046b8: 34 01 00 77 mvi r1,119
80046bc: 58 41 00 2c sw (r2+44),r1
req->aiocbp->return_value = 0;
80046c0: 58 40 00 30 sw (r2+48),r0
if ((aio_request_queue.idle_threads == 0) &&
80046c4: 5c 6d 00 24 bne r3,r13,8004754 <rtems_aio_enqueue+0x10c>
80046c8: 29 63 00 64 lw r3,(r11+100)
80046cc: 34 01 00 04 mvi r1,4
80046d0: 48 61 00 21 bg r3,r1,8004754 <rtems_aio_enqueue+0x10c>
aio_request_queue.active_threads < AIO_MAX_THREADS)
/* we still have empty places on the active_threads chain */
{
chain = &aio_request_queue.work_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
80046d4: 28 42 00 00 lw r2,(r2+0)
80046d8: 78 01 08 01 mvhi r1,0x801
80046dc: 38 21 88 40 ori r1,r1,0x8840
80046e0: 34 03 00 01 mvi r3,1
80046e4: fb ff fe 94 calli 8004134 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
80046e8: 28 22 00 18 lw r2,(r1+24)
if ((aio_request_queue.idle_threads == 0) &&
aio_request_queue.active_threads < AIO_MAX_THREADS)
/* we still have empty places on the active_threads chain */
{
chain = &aio_request_queue.work_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
80046ec: b8 20 70 00 mv r14,r1
if (r_chain->new_fd == 1) {
80046f0: 34 01 00 01 mvi r1,1
80046f4: 5c 41 00 1f bne r2,r1,8004770 <rtems_aio_enqueue+0x128>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
80046f8: b9 80 10 00 mv r2,r12
80046fc: 35 c1 00 08 addi r1,r14,8
8004700: f8 00 09 05 calli 8006b14 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
8004704: 34 02 00 00 mvi r2,0
chain = &aio_request_queue.work_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
if (r_chain->new_fd == 1) {
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
8004708: 59 c0 00 18 sw (r14+24),r0
pthread_mutex_init (&r_chain->mutex, NULL);
800470c: 35 c1 00 1c addi r1,r14,28
8004710: f8 00 02 3f calli 800500c <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
8004714: 34 02 00 00 mvi r2,0
8004718: 35 c1 00 20 addi r1,r14,32
800471c: f8 00 01 04 calli 8004b2c <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
8004720: 78 02 08 01 mvhi r2,0x801
8004724: 78 03 08 00 mvhi r3,0x800
8004728: 37 81 00 3c addi r1,sp,60
800472c: 38 42 88 00 ori r2,r2,0x8800
8004730: 38 63 42 14 ori r3,r3,0x4214
8004734: b9 c0 20 00 mv r4,r14
8004738: f8 00 03 56 calli 8005490 <pthread_create>
800473c: b8 20 60 00 mv r12,r1
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
8004740: 5c 20 00 43 bne r1,r0,800484c <rtems_aio_enqueue+0x204> <== NEVER TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
++aio_request_queue.active_threads;
8004744: 29 61 00 64 lw r1,(r11+100)
8004748: 34 21 00 01 addi r1,r1,1
800474c: 59 61 00 64 sw (r11+100),r1
8004750: e0 00 00 12 bi 8004798 <rtems_aio_enqueue+0x150>
else
{
/* the maximum number of threads has been already created
even though some of them might be idle.
The request belongs to one of the active fd chain */
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
8004754: 28 42 00 00 lw r2,(r2+0)
8004758: 78 01 08 01 mvhi r1,0x801
800475c: 38 21 88 40 ori r1,r1,0x8840
8004760: 34 03 00 00 mvi r3,0
8004764: fb ff fe 74 calli 8004134 <rtems_aio_search_fd>
8004768: b8 20 70 00 mv r14,r1
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
800476c: 44 20 00 19 be r1,r0,80047d0 <rtems_aio_enqueue+0x188> <== ALWAYS TAKEN
{
pthread_mutex_lock (&r_chain->mutex);
8004770: 35 cf 00 1c addi r15,r14,28
8004774: b9 e0 08 00 mv r1,r15
8004778: f8 00 02 86 calli 8005190 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
800477c: 35 c1 00 08 addi r1,r14,8
8004780: b9 80 10 00 mv r2,r12
8004784: fb ff ff 5b calli 80044f0 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
8004788: 35 c1 00 20 addi r1,r14,32
800478c: f8 00 01 29 calli 8004c30 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
8004790: b9 e0 08 00 mv r1,r15
8004794: f8 00 02 af calli 8005250 <pthread_mutex_unlock>
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
8004798: b9 60 08 00 mv r1,r11
800479c: f8 00 02 ad calli 8005250 <pthread_mutex_unlock>
return 0;
}
80047a0: b9 a0 08 00 mv r1,r13
80047a4: 2b 9d 00 04 lw ra,(sp+4)
80047a8: 2b 8b 00 18 lw r11,(sp+24)
80047ac: 2b 8c 00 14 lw r12,(sp+20)
80047b0: 2b 8d 00 10 lw r13,(sp+16)
80047b4: 2b 8e 00 0c lw r14,(sp+12)
80047b8: 2b 8f 00 08 lw r15,(sp+8)
80047bc: 37 9c 00 3c addi sp,sp,60
80047c0: c3 a0 00 00 ret
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
if (result != 0) {
free (req);
80047c4: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
80047c8: fb ff f6 d8 calli 8002328 <free> <== NOT EXECUTED
return result;
80047cc: e3 ff ff f5 bi 80047a0 <rtems_aio_enqueue+0x158> <== NOT EXECUTED
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
80047d0: 29 82 00 14 lw r2,(r12+20)
80047d4: 78 01 08 01 mvhi r1,0x801
80047d8: 38 21 88 4c ori r1,r1,0x884c
80047dc: 28 42 00 00 lw r2,(r2+0)
80047e0: 34 03 00 01 mvi r3,1
80047e4: fb ff fe 54 calli 8004134 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
80047e8: 28 22 00 18 lw r2,(r1+24)
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
80047ec: b8 20 70 00 mv r14,r1
if (r_chain->new_fd == 1) {
80047f0: 34 01 00 01 mvi r1,1
80047f4: 44 41 00 05 be r2,r1,8004808 <rtems_aio_enqueue+0x1c0>
pthread_cond_init (&r_chain->cond, NULL);
pthread_cond_signal (&aio_request_queue.new_req);
++aio_request_queue.idle_threads;
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
80047f8: 35 c1 00 08 addi r1,r14,8
80047fc: b9 80 10 00 mv r2,r12
8004800: fb ff ff 3c calli 80044f0 <rtems_aio_insert_prio>
8004804: e3 ff ff e5 bi 8004798 <rtems_aio_enqueue+0x150>
8004808: 35 c1 00 08 addi r1,r14,8
800480c: b9 80 10 00 mv r2,r12
8004810: f8 00 08 c1 calli 8006b14 <_Chain_Insert>
/* If this is a new fd chain we signal the idle threads that
might be waiting for requests */
AIO_printf (" New chain on waiting queue \n ");
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
8004814: 34 02 00 00 mvi r2,0
if (r_chain->new_fd == 1) {
/* If this is a new fd chain we signal the idle threads that
might be waiting for requests */
AIO_printf (" New chain on waiting queue \n ");
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
8004818: 59 c0 00 18 sw (r14+24),r0
pthread_mutex_init (&r_chain->mutex, NULL);
800481c: 35 c1 00 1c addi r1,r14,28
8004820: f8 00 01 fb calli 800500c <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
8004824: 34 02 00 00 mvi r2,0
8004828: 35 c1 00 20 addi r1,r14,32
800482c: f8 00 00 c0 calli 8004b2c <pthread_cond_init>
pthread_cond_signal (&aio_request_queue.new_req);
8004830: 78 01 08 01 mvhi r1,0x801
8004834: 38 21 87 fc ori r1,r1,0x87fc
8004838: f8 00 00 fe calli 8004c30 <pthread_cond_signal>
++aio_request_queue.idle_threads;
800483c: 29 61 00 68 lw r1,(r11+104)
8004840: 34 21 00 01 addi r1,r1,1
8004844: 59 61 00 68 sw (r11+104),r1
8004848: e3 ff ff d4 bi 8004798 <rtems_aio_enqueue+0x150>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
pthread_mutex_unlock (&aio_request_queue.mutex);
800484c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004850: f8 00 02 80 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
8004854: b9 80 68 00 mv r13,r12 <== NOT EXECUTED
8004858: e3 ff ff d2 bi 80047a0 <rtems_aio_enqueue+0x158> <== NOT EXECUTED
08004214 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
8004214: 37 9c ff 9c addi sp,sp,-100 <== NOT EXECUTED
8004218: 5b 8b 00 3c sw (sp+60),r11 <== NOT EXECUTED
800421c: 5b 8c 00 38 sw (sp+56),r12 <== NOT EXECUTED
8004220: 5b 8d 00 34 sw (sp+52),r13 <== NOT EXECUTED
8004224: 5b 8e 00 30 sw (sp+48),r14 <== NOT EXECUTED
8004228: 5b 8f 00 2c sw (sp+44),r15 <== NOT EXECUTED
800422c: 5b 90 00 28 sw (sp+40),r16 <== NOT EXECUTED
8004230: 5b 91 00 24 sw (sp+36),r17 <== NOT EXECUTED
8004234: 5b 92 00 20 sw (sp+32),r18 <== NOT EXECUTED
8004238: 5b 93 00 1c sw (sp+28),r19 <== NOT EXECUTED
800423c: 5b 94 00 18 sw (sp+24),r20 <== NOT EXECUTED
8004240: 5b 95 00 14 sw (sp+20),r21 <== NOT EXECUTED
8004244: 5b 96 00 10 sw (sp+16),r22 <== NOT EXECUTED
8004248: 5b 97 00 0c sw (sp+12),r23 <== NOT EXECUTED
800424c: 5b 98 00 08 sw (sp+8),r24 <== NOT EXECUTED
8004250: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
The fd chain is already unlocked */
struct timespec timeout;
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
8004254: 78 13 08 01 mvhi r19,0x801 <== NOT EXECUTED
pthread_cond_destroy (&r_chain->cond);
free (r_chain);
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
8004258: 78 16 08 01 mvhi r22,0x801 <== NOT EXECUTED
++aio_request_queue.idle_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
800425c: 78 15 08 01 mvhi r21,0x801 <== NOT EXECUTED
/* Otherwise move this chain to the working chain and
start the loop all over again */
--aio_request_queue.idle_threads;
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
8004260: 78 14 08 01 mvhi r20,0x801 <== NOT EXECUTED
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
8004264: b8 20 68 00 mv r13,r1 <== NOT EXECUTED
8004268: 34 2e 00 1c addi r14,r1,28 <== NOT EXECUTED
The fd chain is already unlocked */
struct timespec timeout;
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
800426c: 3a 73 87 f8 ori r19,r19,0x87f8 <== NOT EXECUTED
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
8004270: 37 97 00 5c addi r23,sp,92 <== NOT EXECUTED
result = pthread_cond_timedwait (&r_chain->cond,
&aio_request_queue.mutex, &timeout);
/* If no requests were added to the chain we delete the fd chain from
the queue and start working with idle fd chains */
if (result == ETIMEDOUT) {
8004274: 34 18 00 74 mvi r24,116 <== NOT EXECUTED
pthread_cond_destroy (&r_chain->cond);
free (r_chain);
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
8004278: 3a d6 88 50 ori r22,r22,0x8850 <== NOT EXECUTED
++aio_request_queue.idle_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
800427c: 3a b5 87 fc ori r21,r21,0x87fc <== NOT EXECUTED
/* Otherwise move this chain to the working chain and
start the loop all over again */
--aio_request_queue.idle_threads;
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
8004280: 3a 94 88 40 ori r20,r20,0x8840 <== NOT EXECUTED
node = rtems_chain_first (chain);
req = (rtems_aio_request *) node;
/* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING
discussion in rtems_aio_enqueue () */
pthread_getschedparam (pthread_self(), &policy, ¶m);
8004284: 37 8f 00 40 addi r15,sp,64 <== NOT EXECUTED
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
8004288: 34 10 00 02 mvi r16,2 <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
800428c: 34 11 ff ff mvi r17,-1 <== NOT EXECUTED
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
8004290: 34 12 00 03 mvi r18,3 <== NOT EXECUTED
/* acquire the mutex of the current fd chain.
we don't need to lock the queue mutex since we can
add requests to idle fd chains or even active ones
if the working request has been extracted from the
chain */
result = pthread_mutex_lock (&r_chain->mutex);
8004294: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
8004298: f8 00 03 be calli 8005190 <pthread_mutex_lock> <== NOT EXECUTED
if (result != 0)
800429c: 5c 20 00 1f bne r1,r0,8004318 <rtems_aio_handle+0x104> <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
80042a0: 29 ab 00 08 lw r11,(r13+8) <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
80042a4: 35 a4 00 0c addi r4,r13,12 <== NOT EXECUTED
/* If the locked chain is not empty, take the first
request extract it, unlock the chain and process
the request, in this way the user can supply more
requests to this fd chain */
if (!rtems_chain_is_empty (chain)) {
80042a8: 45 64 00 44 be r11,r4,80043b8 <rtems_aio_handle+0x1a4> <== NOT EXECUTED
node = rtems_chain_first (chain);
req = (rtems_aio_request *) node;
/* See _POSIX_PRIORITIZE_IO and _POSIX_PRIORITY_SCHEDULING
discussion in rtems_aio_enqueue () */
pthread_getschedparam (pthread_self(), &policy, ¶m);
80042ac: f8 00 06 a4 calli 8005d3c <pthread_self> <== NOT EXECUTED
80042b0: 37 82 00 64 addi r2,sp,100 <== NOT EXECUTED
80042b4: b9 e0 18 00 mv r3,r15 <== NOT EXECUTED
80042b8: f8 00 05 4d calli 80057ec <pthread_getschedparam> <== NOT EXECUTED
param.sched_priority = req->priority;
80042bc: 29 64 00 0c lw r4,(r11+12) <== NOT EXECUTED
80042c0: 5b 84 00 40 sw (sp+64),r4 <== NOT EXECUTED
pthread_setschedparam (pthread_self(), req->policy, ¶m);
80042c4: f8 00 06 9e calli 8005d3c <pthread_self> <== NOT EXECUTED
80042c8: 29 62 00 08 lw r2,(r11+8) <== NOT EXECUTED
80042cc: b9 e0 18 00 mv r3,r15 <== NOT EXECUTED
80042d0: f8 00 06 a0 calli 8005d50 <pthread_setschedparam> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
80042d4: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80042d8: f8 00 09 f4 calli 8006aa8 <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
80042dc: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
80042e0: f8 00 03 dc calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
switch (req->aiocbp->aio_lio_opcode) {
80042e4: 29 6c 00 14 lw r12,(r11+20) <== NOT EXECUTED
80042e8: 29 84 00 28 lw r4,(r12+40) <== NOT EXECUTED
80042ec: 44 90 00 2c be r4,r16,800439c <rtems_aio_handle+0x188> <== NOT EXECUTED
80042f0: 44 92 00 27 be r4,r18,800438c <rtems_aio_handle+0x178> <== NOT EXECUTED
80042f4: 34 05 00 01 mvi r5,1 <== NOT EXECUTED
80042f8: 44 85 00 1a be r4,r5,8004360 <rtems_aio_handle+0x14c> <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
80042fc: 59 91 00 30 sw (r12+48),r17 <== NOT EXECUTED
req->aiocbp->error_code = errno;
8004300: f8 00 2f 0f calli 800ff3c <__errno> <== NOT EXECUTED
8004304: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED
8004308: 59 81 00 2c sw (r12+44),r1 <== NOT EXECUTED
/* acquire the mutex of the current fd chain.
we don't need to lock the queue mutex since we can
add requests to idle fd chains or even active ones
if the working request has been extracted from the
chain */
result = pthread_mutex_lock (&r_chain->mutex);
800430c: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
8004310: f8 00 03 a0 calli 8005190 <pthread_mutex_lock> <== NOT EXECUTED
if (result != 0)
8004314: 44 20 ff e3 be r1,r0,80042a0 <rtems_aio_handle+0x8c> <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
8004318: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
800431c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8004320: 2b 8b 00 3c lw r11,(sp+60) <== NOT EXECUTED
8004324: 2b 8c 00 38 lw r12,(sp+56) <== NOT EXECUTED
8004328: 2b 8d 00 34 lw r13,(sp+52) <== NOT EXECUTED
800432c: 2b 8e 00 30 lw r14,(sp+48) <== NOT EXECUTED
8004330: 2b 8f 00 2c lw r15,(sp+44) <== NOT EXECUTED
8004334: 2b 90 00 28 lw r16,(sp+40) <== NOT EXECUTED
8004338: 2b 91 00 24 lw r17,(sp+36) <== NOT EXECUTED
800433c: 2b 92 00 20 lw r18,(sp+32) <== NOT EXECUTED
8004340: 2b 93 00 1c lw r19,(sp+28) <== NOT EXECUTED
8004344: 2b 94 00 18 lw r20,(sp+24) <== NOT EXECUTED
8004348: 2b 95 00 14 lw r21,(sp+20) <== NOT EXECUTED
800434c: 2b 96 00 10 lw r22,(sp+16) <== NOT EXECUTED
8004350: 2b 97 00 0c lw r23,(sp+12) <== NOT EXECUTED
8004354: 2b 98 00 08 lw r24,(sp+8) <== NOT EXECUTED
8004358: 37 9c 00 64 addi sp,sp,100 <== NOT EXECUTED
800435c: c3 a0 00 00 ret <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
case LIO_READ:
result = pread (req->aiocbp->aio_fildes,
8004360: 29 84 00 04 lw r4,(r12+4) <== NOT EXECUTED
8004364: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED
8004368: 29 82 00 08 lw r2,(r12+8) <== NOT EXECUTED
800436c: 29 83 00 0c lw r3,(r12+12) <== NOT EXECUTED
8004370: f8 00 32 a2 calli 8010df8 <pread> <== NOT EXECUTED
8004374: b8 20 20 00 mv r4,r1 <== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
8004378: 44 91 00 59 be r4,r17,80044dc <rtems_aio_handle+0x2c8> <== NOT EXECUTED
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
} else {
req->aiocbp->return_value = result;
800437c: 29 65 00 14 lw r5,(r11+20) <== NOT EXECUTED
8004380: 58 a4 00 30 sw (r5+48),r4 <== NOT EXECUTED
req->aiocbp->error_code = 0;
8004384: 58 a0 00 2c sw (r5+44),r0 <== NOT EXECUTED
8004388: e3 ff ff c3 bi 8004294 <rtems_aio_handle+0x80> <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_SYNC:
result = fsync (req->aiocbp->aio_fildes);
800438c: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED
8004390: f8 00 1d f2 calli 800bb58 <fsync> <== NOT EXECUTED
8004394: b8 20 20 00 mv r4,r1 <== NOT EXECUTED
break;
8004398: e3 ff ff f8 bi 8004378 <rtems_aio_handle+0x164> <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
case LIO_WRITE:
result = pwrite (req->aiocbp->aio_fildes,
800439c: 29 84 00 04 lw r4,(r12+4) <== NOT EXECUTED
80043a0: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED
80043a4: 29 82 00 08 lw r2,(r12+8) <== NOT EXECUTED
80043a8: 29 83 00 0c lw r3,(r12+12) <== NOT EXECUTED
80043ac: f8 00 32 d7 calli 8010f08 <pwrite> <== NOT EXECUTED
80043b0: b8 20 20 00 mv r4,r1 <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
80043b4: e3 ff ff f1 bi 8004378 <rtems_aio_handle+0x164> <== NOT EXECUTED
wait for a signal on chain, this will unlock the queue.
The fd chain is already unlocked */
struct timespec timeout;
pthread_mutex_unlock (&r_chain->mutex);
80043b8: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
80043bc: f8 00 03 a5 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_lock (&aio_request_queue.mutex);
80043c0: ba 60 08 00 mv r1,r19 <== NOT EXECUTED
80043c4: f8 00 03 73 calli 8005190 <pthread_mutex_lock> <== NOT EXECUTED
if (rtems_chain_is_empty (chain))
80043c8: 29 a1 00 08 lw r1,(r13+8) <== NOT EXECUTED
80043cc: 5d 61 ff b2 bne r11,r1,8004294 <rtems_aio_handle+0x80> <== NOT EXECUTED
{
clock_gettime (CLOCK_REALTIME, &timeout);
80043d0: ba e0 10 00 mv r2,r23 <== NOT EXECUTED
80043d4: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
80043d8: f8 00 01 72 calli 80049a0 <clock_gettime> <== NOT EXECUTED
timeout.tv_sec += 3;
80043dc: 2b 84 00 5c lw r4,(sp+92) <== NOT EXECUTED
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
80043e0: 35 ab 00 20 addi r11,r13,32 <== NOT EXECUTED
80043e4: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
80043e8: 34 84 00 03 addi r4,r4,3 <== NOT EXECUTED
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
80043ec: ba 60 10 00 mv r2,r19 <== NOT EXECUTED
80043f0: ba e0 18 00 mv r3,r23 <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
80043f4: 5b 84 00 5c sw (sp+92),r4 <== NOT EXECUTED
timeout.tv_nsec = 0;
80043f8: 5b 80 00 60 sw (sp+96),r0 <== NOT EXECUTED
result = pthread_cond_timedwait (&r_chain->cond,
80043fc: f8 00 02 36 calli 8004cd4 <pthread_cond_timedwait> <== NOT EXECUTED
&aio_request_queue.mutex, &timeout);
/* If no requests were added to the chain we delete the fd chain from
the queue and start working with idle fd chains */
if (result == ETIMEDOUT) {
8004400: 5c 38 ff a5 bne r1,r24,8004294 <rtems_aio_handle+0x80> <== NOT EXECUTED
8004404: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8004408: f8 00 09 a8 calli 8006aa8 <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
800440c: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
8004410: f8 00 02 98 calli 8004e70 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_cond_destroy (&r_chain->cond);
8004414: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004418: f8 00 01 85 calli 8004a2c <pthread_cond_destroy> <== NOT EXECUTED
free (r_chain);
800441c: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8004420: fb ff f7 c2 calli 8002328 <free> <== NOT EXECUTED
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
8004424: 2a 61 00 54 lw r1,(r19+84) <== NOT EXECUTED
8004428: 44 36 00 04 be r1,r22,8004438 <rtems_aio_handle+0x224> <== NOT EXECUTED
r_chain->perfd = ((rtems_aio_request_chain *)node)->perfd;
}
else
/* If there was a request added in the initial fd chain then release
the mutex and process it */
pthread_mutex_unlock (&aio_request_queue.mutex);
800442c: ba 60 08 00 mv r1,r19 <== NOT EXECUTED
8004430: f8 00 03 88 calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
8004434: e3 ff ff 98 bi 8004294 <rtems_aio_handle+0x80> <== NOT EXECUTED
free (r_chain);
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
++aio_request_queue.idle_threads;
8004438: 2a 63 00 68 lw r3,(r19+104) <== NOT EXECUTED
clock_gettime (CLOCK_REALTIME, &timeout);
800443c: ba e0 10 00 mv r2,r23 <== NOT EXECUTED
8004440: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
free (r_chain);
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
++aio_request_queue.idle_threads;
8004444: 34 63 00 01 addi r3,r3,1 <== NOT EXECUTED
8004448: 5a 63 00 68 sw (r19+104),r3 <== NOT EXECUTED
clock_gettime (CLOCK_REALTIME, &timeout);
800444c: f8 00 01 55 calli 80049a0 <clock_gettime> <== NOT EXECUTED
timeout.tv_sec += 3;
8004450: 2b 84 00 5c lw r4,(sp+92) <== NOT EXECUTED
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
8004454: ba a0 08 00 mv r1,r21 <== NOT EXECUTED
8004458: ba 60 10 00 mv r2,r19 <== NOT EXECUTED
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
++aio_request_queue.idle_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
800445c: 34 84 00 03 addi r4,r4,3 <== NOT EXECUTED
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
8004460: ba e0 18 00 mv r3,r23 <== NOT EXECUTED
/* If the idle chain is empty sleep for 3 seconds and wait for a
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
++aio_request_queue.idle_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
8004464: 5b 84 00 5c sw (sp+92),r4 <== NOT EXECUTED
timeout.tv_nsec = 0;
8004468: 5b 80 00 60 sw (sp+96),r0 <== NOT EXECUTED
result = pthread_cond_timedwait (&aio_request_queue.new_req,
800446c: f8 00 02 1a calli 8004cd4 <pthread_cond_timedwait> <== NOT EXECUTED
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
8004470: 44 38 00 1d be r1,r24,80044e4 <rtems_aio_handle+0x2d0> <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
8004474: 2a 6b 00 54 lw r11,(r19+84) <== NOT EXECUTED
return NULL;
}
/* Otherwise move this chain to the working chain and
start the loop all over again */
--aio_request_queue.idle_threads;
8004478: 2a 62 00 68 lw r2,(r19+104) <== NOT EXECUTED
800447c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004480: 34 42 ff ff addi r2,r2,-1 <== NOT EXECUTED
8004484: 5a 62 00 68 sw (r19+104),r2 <== NOT EXECUTED
8004488: f8 00 09 88 calli 8006aa8 <_Chain_Extract> <== NOT EXECUTED
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
800448c: 29 62 00 14 lw r2,(r11+20) <== NOT EXECUTED
8004490: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8004494: ba 80 08 00 mv r1,r20 <== NOT EXECUTED
8004498: fb ff ff 27 calli 8004134 <rtems_aio_search_fd> <== NOT EXECUTED
((rtems_aio_request_chain *)node)->fildes,
1);
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
800449c: 34 2e 00 1c addi r14,r1,28 <== NOT EXECUTED
/* Otherwise move this chain to the working chain and
start the loop all over again */
--aio_request_queue.idle_threads;
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
80044a0: b8 20 68 00 mv r13,r1 <== NOT EXECUTED
((rtems_aio_request_chain *)node)->fildes,
1);
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
80044a4: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
node = rtems_chain_first (&aio_request_queue.idle_req);
rtems_chain_extract (node);
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
((rtems_aio_request_chain *)node)->fildes,
1);
r_chain->new_fd = 0;
80044a8: 58 20 00 18 sw (r1+24),r0 <== NOT EXECUTED
pthread_mutex_init (&r_chain->mutex, NULL);
80044ac: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
80044b0: f8 00 02 d7 calli 800500c <pthread_mutex_init> <== NOT EXECUTED
pthread_cond_init (&r_chain->cond, NULL);
80044b4: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
80044b8: 35 a1 00 20 addi r1,r13,32 <== NOT EXECUTED
80044bc: f8 00 01 9c calli 8004b2c <pthread_cond_init> <== NOT EXECUTED
r_chain->perfd = ((rtems_aio_request_chain *)node)->perfd;
80044c0: 29 62 00 08 lw r2,(r11+8) <== NOT EXECUTED
80044c4: 29 61 00 0c lw r1,(r11+12) <== NOT EXECUTED
80044c8: 29 63 00 10 lw r3,(r11+16) <== NOT EXECUTED
80044cc: 59 a2 00 08 sw (r13+8),r2 <== NOT EXECUTED
80044d0: 59 a1 00 0c sw (r13+12),r1 <== NOT EXECUTED
80044d4: 59 a3 00 10 sw (r13+16),r3 <== NOT EXECUTED
80044d8: e3 ff ff 6f bi 8004294 <rtems_aio_handle+0x80> <== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
80044dc: 29 6c 00 14 lw r12,(r11+20) <== NOT EXECUTED
80044e0: e3 ff ff 87 bi 80042fc <rtems_aio_handle+0xe8> <== NOT EXECUTED
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
pthread_mutex_unlock (&aio_request_queue.mutex);
80044e4: ba 60 08 00 mv r1,r19 <== NOT EXECUTED
80044e8: f8 00 03 5a calli 8005250 <pthread_mutex_unlock> <== NOT EXECUTED
return NULL;
80044ec: e3 ff ff 8b bi 8004318 <rtems_aio_handle+0x104> <== NOT EXECUTED
08003ff4 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
8003ff4: 37 9c ff f0 addi sp,sp,-16
8003ff8: 5b 8b 00 10 sw (sp+16),r11
8003ffc: 5b 8c 00 0c sw (sp+12),r12
8004000: 5b 8d 00 08 sw (sp+8),r13
8004004: 5b 9d 00 04 sw (sp+4),ra
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
8004008: 78 0c 08 01 mvhi r12,0x801
800400c: 39 8c 88 00 ori r12,r12,0x8800
8004010: b9 80 08 00 mv r1,r12
8004014: f8 00 04 de calli 800538c <pthread_attr_init>
8004018: b8 20 68 00 mv r13,r1
if (result != 0)
800401c: 44 20 00 08 be r1,r0,800403c <rtems_aio_init+0x48> <== ALWAYS TAKEN
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
8004020: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8004024: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8004028: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
800402c: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
8004030: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
8004034: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED
8004038: c3 a0 00 00 ret <== NOT EXECUTED
result = pthread_attr_init (&aio_request_queue.attr);
if (result != 0)
return result;
result =
800403c: b9 80 08 00 mv r1,r12
8004040: 34 02 00 00 mvi r2,0
8004044: f8 00 05 09 calli 8005468 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
8004048: 5c 2d 00 26 bne r1,r13,80040e0 <rtems_aio_init+0xec> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
800404c: 78 0b 08 01 mvhi r11,0x801
8004050: 39 6b 87 f8 ori r11,r11,0x87f8
8004054: b9 60 08 00 mv r1,r11
8004058: 34 02 00 00 mvi r2,0
800405c: f8 00 03 ec calli 800500c <pthread_mutex_init>
if (result != 0)
8004060: 5c 20 00 28 bne r1,r0,8004100 <rtems_aio_init+0x10c> <== NEVER TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
8004064: 78 01 08 01 mvhi r1,0x801
8004068: 38 21 87 fc ori r1,r1,0x87fc
800406c: 34 02 00 00 mvi r2,0
8004070: f8 00 02 af calli 8004b2c <pthread_cond_init>
8004074: b8 20 68 00 mv r13,r1
if (result != 0) {
8004078: 5c 20 00 2a bne r1,r0,8004120 <rtems_aio_init+0x12c> <== NEVER TAKEN
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
tail->previous = head;
800407c: 78 01 08 01 mvhi r1,0x801
8004080: 38 21 88 4c ori r1,r1,0x884c
8004084: 59 61 00 5c sw (r11+92),r1
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8004088: 78 04 08 01 mvhi r4,0x801
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
800408c: 38 01 b0 0b mvu r1,0xb00b
head->previous = NULL;
tail->previous = head;
8004090: 78 03 08 01 mvhi r3,0x801
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8004094: 78 02 08 01 mvhi r2,0x801
8004098: 38 84 88 44 ori r4,r4,0x8844
head->previous = NULL;
tail->previous = head;
800409c: 38 63 88 40 ori r3,r3,0x8840
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80040a0: 38 42 88 50 ori r2,r2,0x8850
80040a4: 59 61 00 60 sw (r11+96),r1
return result;
}
80040a8: b9 a0 08 00 mv r1,r13
80040ac: 59 64 00 48 sw (r11+72),r4
head->previous = NULL;
80040b0: 59 60 00 4c sw (r11+76),r0
tail->previous = head;
80040b4: 59 63 00 50 sw (r11+80),r3
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
80040b8: 59 62 00 54 sw (r11+84),r2
head->previous = NULL;
80040bc: 59 60 00 58 sw (r11+88),r0
}
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
80040c0: 59 60 00 64 sw (r11+100),r0
aio_request_queue.idle_threads = 0;
80040c4: 59 60 00 68 sw (r11+104),r0
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
return result;
}
80040c8: 2b 9d 00 04 lw ra,(sp+4)
80040cc: 2b 8b 00 10 lw r11,(sp+16)
80040d0: 2b 8c 00 0c lw r12,(sp+12)
80040d4: 2b 8d 00 08 lw r13,(sp+8)
80040d8: 37 9c 00 10 addi sp,sp,16
80040dc: c3 a0 00 00 ret
result =
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
80040e0: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
80040e4: 78 0b 08 01 mvhi r11,0x801 <== NOT EXECUTED
result =
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
pthread_attr_destroy (&aio_request_queue.attr);
80040e8: f8 00 04 a1 calli 800536c <pthread_attr_destroy> <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
80040ec: 39 6b 87 f8 ori r11,r11,0x87f8 <== NOT EXECUTED
80040f0: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80040f4: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
80040f8: f8 00 03 c5 calli 800500c <pthread_mutex_init> <== NOT EXECUTED
if (result != 0)
80040fc: 44 20 ff da be r1,r0,8004064 <rtems_aio_init+0x70> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
8004100: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8004104: f8 00 04 9a calli 800536c <pthread_attr_destroy> <== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
8004108: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
800410c: 38 21 87 fc ori r1,r1,0x87fc <== NOT EXECUTED
8004110: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
8004114: f8 00 02 86 calli 8004b2c <pthread_cond_init> <== NOT EXECUTED
8004118: b8 20 68 00 mv r13,r1 <== NOT EXECUTED
if (result != 0) {
800411c: 44 20 ff d8 be r1,r0,800407c <rtems_aio_init+0x88> <== NOT EXECUTED
pthread_mutex_destroy (&aio_request_queue.mutex);
8004120: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004124: f8 00 03 53 calli 8004e70 <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
8004128: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
800412c: f8 00 04 90 calli 800536c <pthread_attr_destroy> <== NOT EXECUTED
8004130: e3 ff ff d3 bi 800407c <rtems_aio_init+0x88> <== NOT EXECUTED
080044f0 <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
80044f0: 37 9c ff fc addi sp,sp,-4
80044f4: 5b 9d 00 04 sw (sp+4),ra
}
AIO_printf ("Thread finished\n");
return NULL;
}
80044f8: 28 23 00 00 lw r3,(r1+0)
80044fc: 34 26 00 04 addi r6,r1,4
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
8004500: b8 40 38 00 mv r7,r2
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
8004504: 44 66 00 0d be r3,r6,8004538 <rtems_aio_insert_prio+0x48> <== NEVER TAKEN
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
8004508: 28 42 00 14 lw r2,(r2+20)
if (rtems_chain_is_empty (chain)) {
AIO_printf ("First in chain \n");
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
800450c: 28 61 00 14 lw r1,(r3+20)
while (req->aiocbp->aio_reqprio > prio &&
8004510: 28 45 00 10 lw r5,(r2+16)
8004514: 28 21 00 10 lw r1,(r1+16)
8004518: 4c 25 00 06 bge r1,r5,8004530 <rtems_aio_insert_prio+0x40> <== ALWAYS TAKEN
}
AIO_printf ("Thread finished\n");
return NULL;
}
800451c: 28 63 00 00 lw r3,(r3+0)
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
!rtems_chain_is_tail (chain, node)) {
node = rtems_chain_next (node);
prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
8004520: 28 61 00 14 lw r1,(r3+20) <== NOT EXECUTED
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
8004524: 28 24 00 10 lw r4,(r1+16) <== NOT EXECUTED
8004528: 4c 85 00 02 bge r4,r5,8004530 <rtems_aio_insert_prio+0x40> <== NOT EXECUTED
800452c: 5c 66 ff fc bne r3,r6,800451c <rtems_aio_insert_prio+0x2c> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
8004530: 28 61 00 04 lw r1,(r3+4)
8004534: b8 e0 10 00 mv r2,r7
8004538: f8 00 09 77 calli 8006b14 <_Chain_Insert>
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
800453c: 2b 9d 00 04 lw ra,(sp+4)
8004540: 37 9c 00 04 addi sp,sp,4
8004544: c3 a0 00 00 ret
08004548 <rtems_aio_remove_fd>:
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
8004548: 37 9c ff f0 addi sp,sp,-16 <== NOT EXECUTED
800454c: 5b 8b 00 10 sw (sp+16),r11 <== NOT EXECUTED
8004550: 5b 8c 00 0c sw (sp+12),r12 <== NOT EXECUTED
8004554: 5b 8d 00 08 sw (sp+8),r13 <== NOT EXECUTED
8004558: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
800455c: 28 2b 00 08 lw r11,(r1+8) <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
8004560: 34 21 00 0c addi r1,r1,12 <== NOT EXECUTED
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
8004564: 45 61 00 14 be r11,r1,80045b4 <rtems_aio_remove_fd+0x6c> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8004568: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800456c: f8 00 09 4f calli 8006aa8 <_Chain_Extract> <== NOT EXECUTED
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
req->aiocbp->error_code = ECANCELED;
8004570: 29 61 00 14 lw r1,(r11+20) <== NOT EXECUTED
8004574: 34 02 00 8c mvi r2,140 <== NOT EXECUTED
8004578: 34 0d 00 8c mvi r13,140 <== NOT EXECUTED
800457c: 58 22 00 2c sw (r1+44),r2 <== NOT EXECUTED
req->aiocbp->return_value = -1;
8004580: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
8004584: 58 22 00 30 sw (r1+48),r2 <== NOT EXECUTED
free (req);
8004588: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800458c: fb ff f7 67 calli 8002328 <free> <== NOT EXECUTED
while (!rtems_chain_is_tail (chain, node))
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
req->aiocbp->error_code = ECANCELED;
req->aiocbp->return_value = -1;
8004590: 34 0c ff ff mvi r12,-1 <== NOT EXECUTED
8004594: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004598: f8 00 09 44 calli 8006aa8 <_Chain_Extract> <== NOT EXECUTED
while (!rtems_chain_is_tail (chain, node))
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
req->aiocbp->error_code = ECANCELED;
800459c: 29 62 00 14 lw r2,(r11+20) <== NOT EXECUTED
req->aiocbp->return_value = -1;
free (req);
80045a0: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
while (!rtems_chain_is_tail (chain, node))
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
req->aiocbp->error_code = ECANCELED;
80045a4: 58 4d 00 2c sw (r2+44),r13 <== NOT EXECUTED
req->aiocbp->return_value = -1;
80045a8: 58 4c 00 30 sw (r2+48),r12 <== NOT EXECUTED
free (req);
80045ac: fb ff f7 5f calli 8002328 <free> <== NOT EXECUTED
80045b0: e3 ff ff f9 bi 8004594 <rtems_aio_remove_fd+0x4c> <== NOT EXECUTED
}
}
80045b4: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80045b8: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
80045bc: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
80045c0: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
80045c4: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED
80045c8: c3 a0 00 00 ret <== NOT EXECUTED
080045cc <rtems_aio_remove_req>:
* AIO_NOTCANCELED - if request was not canceled
* AIO_CANCELED - if request was canceled
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
80045cc: 37 9c ff f8 addi sp,sp,-8 <== NOT EXECUTED
80045d0: 5b 8b 00 08 sw (sp+8),r11 <== NOT EXECUTED
80045d4: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
80045d8: 28 2b 00 00 lw r11,(r1+0) <== NOT EXECUTED
80045dc: 34 23 00 04 addi r3,r1,4 <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
80045e0: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
rtems_chain_node *node = rtems_chain_first (chain);
rtems_aio_request *current;
current = (rtems_aio_request *) node;
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
80045e4: 5d 63 00 04 bne r11,r3,80045f4 <rtems_aio_remove_req+0x28> <== NOT EXECUTED
80045e8: e0 00 00 0f bi 8004624 <rtems_aio_remove_req+0x58> <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
80045ec: 29 6b 00 00 lw r11,(r11+0) <== NOT EXECUTED
rtems_chain_node *node = rtems_chain_first (chain);
rtems_aio_request *current;
current = (rtems_aio_request *) node;
while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) {
80045f0: 45 63 00 11 be r11,r3,8004634 <rtems_aio_remove_req+0x68> <== NOT EXECUTED
80045f4: 29 61 00 14 lw r1,(r11+20) <== NOT EXECUTED
80045f8: 5c 22 ff fd bne r1,r2,80045ec <rtems_aio_remove_req+0x20> <== NOT EXECUTED
80045fc: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004600: f8 00 09 2a calli 8006aa8 <_Chain_Extract> <== NOT EXECUTED
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
8004604: 29 61 00 14 lw r1,(r11+20) <== NOT EXECUTED
8004608: 34 02 00 8c mvi r2,140 <== NOT EXECUTED
800460c: 58 22 00 2c sw (r1+44),r2 <== NOT EXECUTED
current->aiocbp->return_value = -1;
8004610: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
8004614: 58 22 00 30 sw (r1+48),r2 <== NOT EXECUTED
free (current);
8004618: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800461c: fb ff f7 43 calli 8002328 <free> <== NOT EXECUTED
}
return AIO_CANCELED;
8004620: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
}
8004624: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8004628: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
800462c: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
8004630: c3 a0 00 00 ret <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
8004634: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
8004638: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800463c: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
8004640: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
8004644: c3 a0 00 00 ret <== NOT EXECUTED
0800c0a0 <rtems_assoc_local_by_remote_bitfield>:
uint32_t rtems_assoc_local_by_remote_bitfield(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
800c0a0: 37 9c ff e8 addi sp,sp,-24
800c0a4: 5b 8b 00 18 sw (sp+24),r11
800c0a8: 5b 8c 00 14 sw (sp+20),r12
800c0ac: 5b 8d 00 10 sw (sp+16),r13
800c0b0: 5b 8e 00 0c sw (sp+12),r14
800c0b4: 5b 8f 00 08 sw (sp+8),r15
800c0b8: 5b 9d 00 04 sw (sp+4),ra
800c0bc: 34 0c 00 20 mvi r12,32
800c0c0: b8 20 78 00 mv r15,r1
800c0c4: b8 40 68 00 mv r13,r2
uint32_t b;
uint32_t local_value = 0;
800c0c8: 34 0e 00 00 mvi r14,0
for (b = 1; b; b <<= 1) {
800c0cc: 34 0b 00 01 mvi r11,1
800c0d0: e0 00 00 03 bi 800c0dc <rtems_assoc_local_by_remote_bitfield+0x3c>
800c0d4: b5 6b 58 00 add r11,r11,r11
800c0d8: 45 80 00 0a be r12,r0,800c100 <rtems_assoc_local_by_remote_bitfield+0x60>
if (b & remote_value)
800c0dc: a1 6d 18 00 and r3,r11,r13
)
{
uint32_t b;
uint32_t local_value = 0;
for (b = 1; b; b <<= 1) {
800c0e0: 35 8c ff ff addi r12,r12,-1
if (b & remote_value)
800c0e4: 44 60 ff fc be r3,r0,800c0d4 <rtems_assoc_local_by_remote_bitfield+0x34>
local_value |= rtems_assoc_local_by_remote(ap, b);
800c0e8: b9 60 10 00 mv r2,r11
800c0ec: b9 e0 08 00 mv r1,r15
800c0f0: f8 00 00 0d calli 800c124 <rtems_assoc_local_by_remote>
800c0f4: b9 c1 70 00 or r14,r14,r1
)
{
uint32_t b;
uint32_t local_value = 0;
for (b = 1; b; b <<= 1) {
800c0f8: b5 6b 58 00 add r11,r11,r11
800c0fc: 5d 80 ff f8 bne r12,r0,800c0dc <rtems_assoc_local_by_remote_bitfield+0x3c><== ALWAYS TAKEN
if (b & remote_value)
local_value |= rtems_assoc_local_by_remote(ap, b);
}
return local_value;
}
800c100: b9 c0 08 00 mv r1,r14
800c104: 2b 9d 00 04 lw ra,(sp+4)
800c108: 2b 8b 00 18 lw r11,(sp+24)
800c10c: 2b 8c 00 14 lw r12,(sp+20)
800c110: 2b 8d 00 10 lw r13,(sp+16)
800c114: 2b 8e 00 0c lw r14,(sp+12)
800c118: 2b 8f 00 08 lw r15,(sp+8)
800c11c: 37 9c 00 18 addi sp,sp,24
800c120: c3 a0 00 00 ret
0800f62c <rtems_assoc_ptr_by_local>:
const rtems_assoc_t *rtems_assoc_ptr_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
800f62c: 37 9c ff f4 addi sp,sp,-12
800f630: 5b 8b 00 0c sw (sp+12),r11
800f634: 5b 8c 00 08 sw (sp+8),r12
800f638: 5b 9d 00 04 sw (sp+4),ra
800f63c: b8 20 58 00 mv r11,r1
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
800f640: 28 21 00 00 lw r1,(r1+0)
const rtems_assoc_t *rtems_assoc_ptr_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
800f644: b8 40 60 00 mv r12,r2
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
800f648: 44 20 00 1f be r1,r0,800f6c4 <rtems_assoc_ptr_by_local+0x98><== NEVER TAKEN
800f64c: 78 02 08 02 mvhi r2,0x802
800f650: 38 42 7b 08 ori r2,r2,0x7b08
800f654: f8 00 17 52 calli 801539c <strcmp>
const rtems_assoc_t *rtems_assoc_ptr_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
const rtems_assoc_t *default_ap = 0;
800f658: 34 02 00 00 mvi r2,0
if (rtems_assoc_is_default(ap))
800f65c: 5c 20 00 0b bne r1,r0,800f688 <rtems_assoc_ptr_by_local+0x5c>
default_ap = ap++;
for ( ; ap->name; ap++)
800f660: 29 63 00 0c lw r3,(r11+12)
)
{
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
800f664: 35 61 00 0c addi r1,r11,12
for ( ; ap->name; ap++)
800f668: 44 62 00 0a be r3,r2,800f690 <rtems_assoc_ptr_by_local+0x64><== NEVER TAKEN
800f66c: b9 60 10 00 mv r2,r11
800f670: b8 20 58 00 mv r11,r1
if (ap->local_value == local_value)
800f674: 29 61 00 04 lw r1,(r11+4)
800f678: 44 2c 00 06 be r1,r12,800f690 <rtems_assoc_ptr_by_local+0x64><== NEVER TAKEN
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
800f67c: 35 6b 00 0c addi r11,r11,12
800f680: 29 61 00 00 lw r1,(r11+0)
800f684: 44 20 00 09 be r1,r0,800f6a8 <rtems_assoc_ptr_by_local+0x7c>
if (ap->local_value == local_value)
800f688: 29 61 00 04 lw r1,(r11+4)
800f68c: 5c 2c ff fc bne r1,r12,800f67c <rtems_assoc_ptr_by_local+0x50>
return ap;
return default_ap;
}
800f690: b9 60 08 00 mv r1,r11
800f694: 2b 9d 00 04 lw ra,(sp+4)
800f698: 2b 8b 00 0c lw r11,(sp+12)
800f69c: 2b 8c 00 08 lw r12,(sp+8)
800f6a0: 37 9c 00 0c addi sp,sp,12
800f6a4: c3 a0 00 00 ret
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
800f6a8: b8 40 58 00 mv r11,r2
if (ap->local_value == local_value)
return ap;
return default_ap;
}
800f6ac: b9 60 08 00 mv r1,r11
800f6b0: 2b 9d 00 04 lw ra,(sp+4)
800f6b4: 2b 8b 00 0c lw r11,(sp+12)
800f6b8: 2b 8c 00 08 lw r12,(sp+8)
800f6bc: 37 9c 00 0c addi sp,sp,12
800f6c0: c3 a0 00 00 ret
const rtems_assoc_t *rtems_assoc_ptr_by_local(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
const rtems_assoc_t *default_ap = 0;
800f6c4: 34 0b 00 00 mvi r11,0
for ( ; ap->name; ap++)
if (ap->local_value == local_value)
return ap;
return default_ap;
}
800f6c8: b9 60 08 00 mv r1,r11
800f6cc: 2b 9d 00 04 lw ra,(sp+4)
800f6d0: 2b 8b 00 0c lw r11,(sp+12)
800f6d4: 2b 8c 00 08 lw r12,(sp+8)
800f6d8: 37 9c 00 0c addi sp,sp,12
800f6dc: c3 a0 00 00 ret
08002050 <rtems_assoc_ptr_by_name>:
const rtems_assoc_t *rtems_assoc_ptr_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
8002050: 37 9c ff ec addi sp,sp,-20
8002054: 5b 8b 00 14 sw (sp+20),r11
8002058: 5b 8c 00 10 sw (sp+16),r12
800205c: 5b 8d 00 0c sw (sp+12),r13
8002060: 5b 8e 00 08 sw (sp+8),r14
8002064: 5b 9d 00 04 sw (sp+4),ra
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
8002068: 28 2b 00 00 lw r11,(r1+0)
const rtems_assoc_t *rtems_assoc_ptr_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
800206c: b8 20 60 00 mv r12,r1
8002070: b8 40 68 00 mv r13,r2
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
8002074: 45 60 00 28 be r11,r0,8002114 <rtems_assoc_ptr_by_name+0xc4>
8002078: 78 02 08 01 mvhi r2,0x801
800207c: b9 60 08 00 mv r1,r11
8002080: 38 42 47 90 ori r2,r2,0x4790
8002084: f8 00 33 1c calli 800ecf4 <strcmp>
const rtems_assoc_t *rtems_assoc_ptr_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
const rtems_assoc_t *default_ap = 0;
8002088: 34 0e 00 00 mvi r14,0
if (rtems_assoc_is_default(ap))
800208c: 5c 20 00 0d bne r1,r0,80020c0 <rtems_assoc_ptr_by_name+0x70>
default_ap = ap++;
for ( ; ap->name; ap++)
8002090: 29 8b 00 0c lw r11,(r12+12)
)
{
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
8002094: 35 81 00 0c addi r1,r12,12
for ( ; ap->name; ap++)
8002098: 45 6e 00 0e be r11,r14,80020d0 <rtems_assoc_ptr_by_name+0x80><== NEVER TAKEN
800209c: b9 80 70 00 mv r14,r12
if (strcmp(ap->name, name) == 0)
80020a0: b9 a0 10 00 mv r2,r13
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
80020a4: b8 20 60 00 mv r12,r1
if (strcmp(ap->name, name) == 0)
80020a8: b9 60 08 00 mv r1,r11
80020ac: f8 00 33 12 calli 800ecf4 <strcmp>
80020b0: 44 20 00 08 be r1,r0,80020d0 <rtems_assoc_ptr_by_name+0x80><== NEVER TAKEN
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
80020b4: 35 8c 00 0c addi r12,r12,12
80020b8: 29 8b 00 00 lw r11,(r12+0)
80020bc: 45 60 00 0d be r11,r0,80020f0 <rtems_assoc_ptr_by_name+0xa0>
if (strcmp(ap->name, name) == 0)
80020c0: b9 60 08 00 mv r1,r11
80020c4: b9 a0 10 00 mv r2,r13
80020c8: f8 00 33 0b calli 800ecf4 <strcmp>
80020cc: 5c 20 ff fa bne r1,r0,80020b4 <rtems_assoc_ptr_by_name+0x64>
return ap;
return default_ap;
}
80020d0: b9 80 08 00 mv r1,r12
80020d4: 2b 9d 00 04 lw ra,(sp+4)
80020d8: 2b 8b 00 14 lw r11,(sp+20)
80020dc: 2b 8c 00 10 lw r12,(sp+16)
80020e0: 2b 8d 00 0c lw r13,(sp+12)
80020e4: 2b 8e 00 08 lw r14,(sp+8)
80020e8: 37 9c 00 14 addi sp,sp,20
80020ec: c3 a0 00 00 ret
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
80020f0: b9 c0 60 00 mv r12,r14
if (strcmp(ap->name, name) == 0)
return ap;
return default_ap;
}
80020f4: b9 80 08 00 mv r1,r12
80020f8: 2b 9d 00 04 lw ra,(sp+4)
80020fc: 2b 8b 00 14 lw r11,(sp+20)
8002100: 2b 8c 00 10 lw r12,(sp+16)
8002104: 2b 8d 00 0c lw r13,(sp+12)
8002108: 2b 8e 00 08 lw r14,(sp+8)
800210c: 37 9c 00 14 addi sp,sp,20
8002110: c3 a0 00 00 ret
const rtems_assoc_t *rtems_assoc_ptr_by_name(
const rtems_assoc_t *ap,
const char *name
)
{
const rtems_assoc_t *default_ap = 0;
8002114: 34 0c 00 00 mvi r12,0
for ( ; ap->name; ap++)
if (strcmp(ap->name, name) == 0)
return ap;
return default_ap;
}
8002118: b9 80 08 00 mv r1,r12
800211c: 2b 9d 00 04 lw ra,(sp+4)
8002120: 2b 8b 00 14 lw r11,(sp+20)
8002124: 2b 8c 00 10 lw r12,(sp+16)
8002128: 2b 8d 00 0c lw r13,(sp+12)
800212c: 2b 8e 00 08 lw r14,(sp+8)
8002130: 37 9c 00 14 addi sp,sp,20
8002134: c3 a0 00 00 ret
0800c14c <rtems_assoc_ptr_by_remote>:
const rtems_assoc_t *rtems_assoc_ptr_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
800c14c: 37 9c ff f4 addi sp,sp,-12
800c150: 5b 8b 00 0c sw (sp+12),r11
800c154: 5b 8c 00 08 sw (sp+8),r12
800c158: 5b 9d 00 04 sw (sp+4),ra
800c15c: b8 20 58 00 mv r11,r1
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
800c160: 28 21 00 00 lw r1,(r1+0)
const rtems_assoc_t *rtems_assoc_ptr_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
800c164: b8 40 60 00 mv r12,r2
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
800c168: 44 20 00 1f be r1,r0,800c1e4 <rtems_assoc_ptr_by_remote+0x98>
800c16c: 78 02 08 01 mvhi r2,0x801
800c170: 38 42 3a 34 ori r2,r2,0x3a34
800c174: f8 00 07 3e calli 800de6c <strcmp>
const rtems_assoc_t *rtems_assoc_ptr_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
const rtems_assoc_t *default_ap = 0;
800c178: 34 02 00 00 mvi r2,0
if (rtems_assoc_is_default(ap))
800c17c: 5c 20 00 0b bne r1,r0,800c1a8 <rtems_assoc_ptr_by_remote+0x5c>
default_ap = ap++;
for ( ; ap->name; ap++)
800c180: 29 63 00 0c lw r3,(r11+12)
)
{
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
800c184: 35 61 00 0c addi r1,r11,12
for ( ; ap->name; ap++)
800c188: 44 62 00 0a be r3,r2,800c1b0 <rtems_assoc_ptr_by_remote+0x64><== NEVER TAKEN
800c18c: b9 60 10 00 mv r2,r11
800c190: b8 20 58 00 mv r11,r1
if (ap->remote_value == remote_value)
800c194: 29 61 00 08 lw r1,(r11+8)
800c198: 44 2c 00 06 be r1,r12,800c1b0 <rtems_assoc_ptr_by_remote+0x64><== NEVER TAKEN
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
800c19c: 35 6b 00 0c addi r11,r11,12
800c1a0: 29 61 00 00 lw r1,(r11+0)
800c1a4: 44 20 00 09 be r1,r0,800c1c8 <rtems_assoc_ptr_by_remote+0x7c>
if (ap->remote_value == remote_value)
800c1a8: 29 61 00 08 lw r1,(r11+8)
800c1ac: 5c 2c ff fc bne r1,r12,800c19c <rtems_assoc_ptr_by_remote+0x50>
return ap;
return default_ap;
}
800c1b0: b9 60 08 00 mv r1,r11
800c1b4: 2b 9d 00 04 lw ra,(sp+4)
800c1b8: 2b 8b 00 0c lw r11,(sp+12)
800c1bc: 2b 8c 00 08 lw r12,(sp+8)
800c1c0: 37 9c 00 0c addi sp,sp,12
800c1c4: c3 a0 00 00 ret
const rtems_assoc_t *default_ap = 0;
if (rtems_assoc_is_default(ap))
default_ap = ap++;
for ( ; ap->name; ap++)
800c1c8: b8 40 58 00 mv r11,r2
if (ap->remote_value == remote_value)
return ap;
return default_ap;
}
800c1cc: b9 60 08 00 mv r1,r11
800c1d0: 2b 9d 00 04 lw ra,(sp+4)
800c1d4: 2b 8b 00 0c lw r11,(sp+12)
800c1d8: 2b 8c 00 08 lw r12,(sp+8)
800c1dc: 37 9c 00 0c addi sp,sp,12
800c1e0: c3 a0 00 00 ret
const rtems_assoc_t *rtems_assoc_ptr_by_remote(
const rtems_assoc_t *ap,
uint32_t remote_value
)
{
const rtems_assoc_t *default_ap = 0;
800c1e4: 34 0b 00 00 mvi r11,0
for ( ; ap->name; ap++)
if (ap->remote_value == remote_value)
return ap;
return default_ap;
}
800c1e8: b9 60 08 00 mv r1,r11
800c1ec: 2b 9d 00 04 lw ra,(sp+4)
800c1f0: 2b 8b 00 0c lw r11,(sp+12)
800c1f4: 2b 8c 00 08 lw r12,(sp+8)
800c1f8: 37 9c 00 0c addi sp,sp,12
800c1fc: c3 a0 00 00 ret
080021ec <rtems_assoc_remote_by_local_bitfield>:
uint32_t rtems_assoc_remote_by_local_bitfield(
const rtems_assoc_t *ap,
uint32_t local_value
)
{
80021ec: 37 9c ff e8 addi sp,sp,-24
80021f0: 5b 8b 00 18 sw (sp+24),r11
80021f4: 5b 8c 00 14 sw (sp+20),r12
80021f8: 5b 8d 00 10 sw (sp+16),r13
80021fc: 5b 8e 00 0c sw (sp+12),r14
8002200: 5b 8f 00 08 sw (sp+8),r15
8002204: 5b 9d 00 04 sw (sp+4),ra
8002208: 34 0c 00 20 mvi r12,32
800220c: b8 20 78 00 mv r15,r1
8002210: b8 40 68 00 mv r13,r2
uint32_t b;
uint32_t remote_value = 0;
8002214: 34 0e 00 00 mvi r14,0
for (b = 1; b; b <<= 1)
8002218: 34 0b 00 01 mvi r11,1
800221c: e0 00 00 03 bi 8002228 <rtems_assoc_remote_by_local_bitfield+0x3c>
8002220: b5 6b 58 00 add r11,r11,r11
8002224: 45 80 00 0a be r12,r0,800224c <rtems_assoc_remote_by_local_bitfield+0x60>
if (b & local_value)
8002228: a1 6d 18 00 and r3,r11,r13
)
{
uint32_t b;
uint32_t remote_value = 0;
for (b = 1; b; b <<= 1)
800222c: 35 8c ff ff addi r12,r12,-1
if (b & local_value)
8002230: 44 60 ff fc be r3,r0,8002220 <rtems_assoc_remote_by_local_bitfield+0x34>
remote_value |= rtems_assoc_remote_by_local(ap, b);
8002234: b9 60 10 00 mv r2,r11
8002238: b9 e0 08 00 mv r1,r15
800223c: f8 00 00 0d calli 8002270 <rtems_assoc_remote_by_local>
8002240: b9 c1 70 00 or r14,r14,r1
)
{
uint32_t b;
uint32_t remote_value = 0;
for (b = 1; b; b <<= 1)
8002244: b5 6b 58 00 add r11,r11,r11
8002248: 5d 80 ff f8 bne r12,r0,8002228 <rtems_assoc_remote_by_local_bitfield+0x3c><== ALWAYS TAKEN
if (b & local_value)
remote_value |= rtems_assoc_remote_by_local(ap, b);
return remote_value;
}
800224c: b9 c0 08 00 mv r1,r14
8002250: 2b 9d 00 04 lw ra,(sp+4)
8002254: 2b 8b 00 18 lw r11,(sp+24)
8002258: 2b 8c 00 14 lw r12,(sp+20)
800225c: 2b 8d 00 10 lw r13,(sp+16)
8002260: 2b 8e 00 0c lw r14,(sp+12)
8002264: 2b 8f 00 08 lw r15,(sp+8)
8002268: 37 9c 00 18 addi sp,sp,24
800226c: c3 a0 00 00 ret
08000da4 <rtems_bsp_cmdline_get_param>:
const char *rtems_bsp_cmdline_get_param(
const char *name,
char *value,
size_t length
)
{
8000da4: 37 9c ff f4 addi sp,sp,-12
8000da8: 5b 9d 00 04 sw (sp+4),ra
const char *p;
if ( !name )
8000dac: 5c 20 00 06 bne r1,r0,8000dc4 <rtems_bsp_cmdline_get_param+0x20>
value[0] = '\0';
p = rtems_bsp_cmdline_get_param_raw( name );
if ( !p )
return NULL;
8000db0: 34 02 00 00 mvi r2,0
copy_string( p, value, length );
return value;
}
8000db4: b8 40 08 00 mv r1,r2
8000db8: 2b 9d 00 04 lw ra,(sp+4)
8000dbc: 37 9c 00 0c addi sp,sp,12
8000dc0: c3 a0 00 00 ret
const char *p;
if ( !name )
return NULL;
if ( !value )
8000dc4: 44 40 ff fc be r2,r0,8000db4 <rtems_bsp_cmdline_get_param+0x10>
return NULL;
if ( !length )
8000dc8: 44 60 ff fa be r3,r0,8000db0 <rtems_bsp_cmdline_get_param+0xc>
return NULL;
value[0] = '\0';
8000dcc: 30 40 00 00 sb (r2+0),r0
p = rtems_bsp_cmdline_get_param_raw( name );
8000dd0: 5b 82 00 0c sw (sp+12),r2
8000dd4: 5b 83 00 08 sw (sp+8),r3
8000dd8: f8 00 00 1e calli 8000e50 <rtems_bsp_cmdline_get_param_raw>
if ( !p )
8000ddc: 2b 82 00 0c lw r2,(sp+12)
8000de0: 2b 83 00 08 lw r3,(sp+8)
8000de4: 44 20 ff f3 be r1,r0,8000db0 <rtems_bsp_cmdline_get_param+0xc>
int i;
int quotes;
const char *p = start;
quotes=0;
for (i=0 ; *p && i<length-1; ) {
8000de8: 40 25 00 00 lbu r5,(r1+0)
8000dec: 44 a0 ff f2 be r5,r0,8000db4 <rtems_bsp_cmdline_get_param+0x10><== NEVER TAKEN
8000df0: 34 63 ff ff addi r3,r3,-1
8000df4: 44 60 ff f0 be r3,r0,8000db4 <rtems_bsp_cmdline_get_param+0x10><== NEVER TAKEN
8000df8: 34 07 00 00 mvi r7,0
8000dfc: 34 04 00 00 mvi r4,0
8000e00: 34 06 00 00 mvi r6,0
if ( *p == '\"' ) {
8000e04: 34 09 00 22 mvi r9,34
quotes++;
} else if ( ((quotes % 2) == 0) && *p == ' ' )
8000e08: 34 0a 00 20 mvi r10,32
8000e0c: 20 c8 00 01 andi r8,r6,0x1
int quotes;
const char *p = start;
quotes=0;
for (i=0 ; *p && i<length-1; ) {
if ( *p == '\"' ) {
8000e10: 44 a9 00 0e be r5,r9,8000e48 <rtems_bsp_cmdline_get_param+0xa4>
quotes++;
} else if ( ((quotes % 2) == 0) && *p == ' ' )
8000e14: 5d 00 00 02 bne r8,r0,8000e1c <rtems_bsp_cmdline_get_param+0x78>
8000e18: 44 aa ff e7 be r5,r10,8000db4 <rtems_bsp_cmdline_get_param+0x10>
break;
value[i++] = *p++;
8000e1c: 34 84 00 01 addi r4,r4,1
8000e20: b4 47 38 00 add r7,r2,r7
8000e24: 30 e5 00 00 sb (r7+0),r5
value[i] = '\0';
}
}
const char *rtems_bsp_cmdline_get_param(
8000e28: b4 44 28 00 add r5,r2,r4
if ( *p == '\"' ) {
quotes++;
} else if ( ((quotes % 2) == 0) && *p == ' ' )
break;
value[i++] = *p++;
value[i] = '\0';
8000e2c: 30 a0 00 00 sb (r5+0),r0
}
}
const char *rtems_bsp_cmdline_get_param(
8000e30: b4 24 28 00 add r5,r1,r4
int i;
int quotes;
const char *p = start;
quotes=0;
for (i=0 ; *p && i<length-1; ) {
8000e34: 40 a5 00 00 lbu r5,(r5+0)
if ( *p == '\"' ) {
quotes++;
} else if ( ((quotes % 2) == 0) && *p == ' ' )
break;
value[i++] = *p++;
8000e38: b8 80 38 00 mv r7,r4
int i;
int quotes;
const char *p = start;
quotes=0;
for (i=0 ; *p && i<length-1; ) {
8000e3c: 44 a0 ff de be r5,r0,8000db4 <rtems_bsp_cmdline_get_param+0x10>
8000e40: 54 64 ff f3 bgu r3,r4,8000e0c <rtems_bsp_cmdline_get_param+0x68>
8000e44: e3 ff ff dc bi 8000db4 <rtems_bsp_cmdline_get_param+0x10>
if ( *p == '\"' ) {
quotes++;
8000e48: 34 c6 00 01 addi r6,r6,1
8000e4c: e3 ff ff f4 bi 8000e1c <rtems_bsp_cmdline_get_param+0x78>
08003ab0 <rtems_chain_append_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
8003ab0: 37 9c ff f4 addi sp,sp,-12
8003ab4: 5b 8b 00 0c sw (sp+12),r11
8003ab8: 5b 8c 00 08 sw (sp+8),r12
8003abc: 5b 9d 00 04 sw (sp+4),ra
8003ac0: b8 60 60 00 mv r12,r3
8003ac4: b8 80 58 00 mv r11,r4
RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Append_with_empty_check( chain, node );
8003ac8: f8 00 01 a6 calli 8004160 <_Chain_Append_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
8003acc: 34 05 00 00 mvi r5,0
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
8003ad0: 44 20 00 05 be r1,r0,8003ae4 <rtems_chain_append_with_notification+0x34><== NEVER TAKEN
sc = rtems_event_send( task, events );
8003ad4: b9 80 08 00 mv r1,r12
8003ad8: b9 60 10 00 mv r2,r11
8003adc: f8 00 19 2c calli 8009f8c <rtems_event_send>
8003ae0: b8 20 28 00 mv r5,r1
}
return sc;
}
8003ae4: b8 a0 08 00 mv r1,r5
8003ae8: 2b 9d 00 04 lw ra,(sp+4)
8003aec: 2b 8b 00 0c lw r11,(sp+12)
8003af0: 2b 8c 00 08 lw r12,(sp+8)
8003af4: 37 9c 00 0c addi sp,sp,12
8003af8: c3 a0 00 00 ret
08003b4c <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
8003b4c: 37 9c ff e4 addi sp,sp,-28
8003b50: 5b 8b 00 18 sw (sp+24),r11
8003b54: 5b 8c 00 14 sw (sp+20),r12
8003b58: 5b 8d 00 10 sw (sp+16),r13
8003b5c: 5b 8e 00 0c sw (sp+12),r14
8003b60: 5b 8f 00 08 sw (sp+8),r15
8003b64: 5b 9d 00 04 sw (sp+4),ra
8003b68: b8 20 70 00 mv r14,r1
8003b6c: b8 40 68 00 mv r13,r2
8003b70: b8 60 60 00 mv r12,r3
8003b74: b8 80 78 00 mv r15,r4
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
8003b78: b9 c0 08 00 mv r1,r14
8003b7c: f8 00 01 af calli 8004238 <_Chain_Get>
8003b80: b8 20 58 00 mv r11,r1
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
8003b84: 34 02 00 00 mvi r2,0
8003b88: b9 a0 08 00 mv r1,r13
8003b8c: b9 80 18 00 mv r3,r12
8003b90: 37 84 00 1c addi r4,sp,28
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
8003b94: 5d 60 00 0e bne r11,r0,8003bcc <rtems_chain_get_with_wait+0x80>
) {
rtems_event_set out;
sc = rtems_event_receive(
8003b98: fb ff fd 9e calli 8003210 <rtems_event_receive>
8003b9c: b8 20 28 00 mv r5,r1
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
8003ba0: 44 2b ff f6 be r1,r11,8003b78 <rtems_chain_get_with_wait+0x2c><== NEVER TAKEN
}
*node_ptr = node;
return sc;
}
8003ba4: b8 a0 08 00 mv r1,r5
timeout,
&out
);
}
*node_ptr = node;
8003ba8: 59 eb 00 00 sw (r15+0),r11
return sc;
}
8003bac: 2b 9d 00 04 lw ra,(sp+4)
8003bb0: 2b 8b 00 18 lw r11,(sp+24)
8003bb4: 2b 8c 00 14 lw r12,(sp+20)
8003bb8: 2b 8d 00 10 lw r13,(sp+16)
8003bbc: 2b 8e 00 0c lw r14,(sp+12)
8003bc0: 2b 8f 00 08 lw r15,(sp+8)
8003bc4: 37 9c 00 1c addi sp,sp,28
8003bc8: c3 a0 00 00 ret
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
8003bcc: 34 05 00 00 mvi r5,0
8003bd0: e3 ff ff f5 bi 8003ba4 <rtems_chain_get_with_wait+0x58>
08003bd4 <rtems_chain_prepend_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
8003bd4: 37 9c ff f4 addi sp,sp,-12
8003bd8: 5b 8b 00 0c sw (sp+12),r11
8003bdc: 5b 8c 00 08 sw (sp+8),r12
8003be0: 5b 9d 00 04 sw (sp+4),ra
8003be4: b8 60 60 00 mv r12,r3
8003be8: b8 80 58 00 mv r11,r4
RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Prepend_with_empty_check( chain, node );
8003bec: f8 00 01 af calli 80042a8 <_Chain_Prepend_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
8003bf0: 34 05 00 00 mvi r5,0
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
8003bf4: 44 20 00 05 be r1,r0,8003c08 <rtems_chain_prepend_with_notification+0x34><== NEVER TAKEN
sc = rtems_event_send( task, events );
8003bf8: b9 80 08 00 mv r1,r12
8003bfc: b9 60 10 00 mv r2,r11
8003c00: f8 00 18 e3 calli 8009f8c <rtems_event_send>
8003c04: b8 20 28 00 mv r5,r1
}
return sc;
}
8003c08: b8 a0 08 00 mv r1,r5
8003c0c: 2b 9d 00 04 lw ra,(sp+4)
8003c10: 2b 8b 00 0c lw r11,(sp+12)
8003c14: 2b 8c 00 08 lw r12,(sp+8)
8003c18: 37 9c 00 0c addi sp,sp,12
8003c1c: c3 a0 00 00 ret
080102fc <rtems_clock_set_nanoseconds_extension>:
* error code - if unsuccessful
*/
rtems_status_code rtems_clock_set_nanoseconds_extension(
rtems_nanoseconds_extension_routine routine
)
{
80102fc: b8 20 18 00 mv r3,r1
if ( !routine )
return RTEMS_INVALID_ADDRESS;
8010300: 34 01 00 09 mvi r1,9
*/
rtems_status_code rtems_clock_set_nanoseconds_extension(
rtems_nanoseconds_extension_routine routine
)
{
if ( !routine )
8010304: 44 60 00 05 be r3,r0,8010318 <rtems_clock_set_nanoseconds_extension+0x1c><== ALWAYS TAKEN
return RTEMS_INVALID_ADDRESS;
_Watchdog_Nanoseconds_since_tick_handler = routine;
8010308: 78 02 08 04 mvhi r2,0x804
801030c: 38 42 0e 2c ori r2,r2,0xe2c
8010310: 58 43 00 00 sw (r2+0),r3
return RTEMS_SUCCESSFUL;
8010314: 34 01 00 00 mvi r1,0
}
8010318: c3 a0 00 00 ret
08001944 <rtems_cpu_usage_report_with_plugin>:
void rtems_cpu_usage_report_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
8001944: 37 9c ff 84 addi sp,sp,-124
8001948: 5b 8b 00 44 sw (sp+68),r11
800194c: 5b 8c 00 40 sw (sp+64),r12
8001950: 5b 8d 00 3c sw (sp+60),r13
8001954: 5b 8e 00 38 sw (sp+56),r14
8001958: 5b 8f 00 34 sw (sp+52),r15
800195c: 5b 90 00 30 sw (sp+48),r16
8001960: 5b 91 00 2c sw (sp+44),r17
8001964: 5b 92 00 28 sw (sp+40),r18
8001968: 5b 93 00 24 sw (sp+36),r19
800196c: 5b 94 00 20 sw (sp+32),r20
8001970: 5b 95 00 1c sw (sp+28),r21
8001974: 5b 96 00 18 sw (sp+24),r22
8001978: 5b 97 00 14 sw (sp+20),r23
800197c: 5b 98 00 10 sw (sp+16),r24
8001980: 5b 99 00 0c sw (sp+12),r25
8001984: 5b 9b 00 08 sw (sp+8),fp
8001988: 5b 9d 00 04 sw (sp+4),ra
800198c: b8 40 78 00 mv r15,r2
8001990: b8 20 80 00 mv r16,r1
Timestamp_Control uptime, total, ran;
#else
uint32_t total_units = 0;
#endif
if ( !print )
8001994: 44 40 00 58 be r2,r0,8001af4 <rtems_cpu_usage_report_with_plugin+0x1b0><== NEVER TAKEN
* When not using nanosecond CPU usage resolution, we have to count
* the number of "ticks" we gave credit for to give the user a rough
* guideline as to what each number means proportionally.
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_TOD_Get_uptime( &uptime );
8001998: 37 9b 00 70 addi fp,sp,112
800199c: bb 60 08 00 mv r1,fp
80019a0: f8 00 10 76 calli 8005b78 <_TOD_Get_uptime>
_Timestamp_Subtract( &CPU_usage_Uptime_at_last_reset, &uptime, &total );
80019a4: 37 97 00 68 addi r23,sp,104
80019a8: 78 01 08 02 mvhi r1,0x802
80019ac: 38 21 ab f8 ori r1,r1,0xabf8
80019b0: bb 60 10 00 mv r2,fp
80019b4: ba e0 18 00 mv r3,r23
80019b8: f8 00 1d 0b calli 8008de4 <_Timespec_Subtract>
}
}
}
#endif
(*print)(
80019bc: 78 02 08 01 mvhi r2,0x801
80019c0: ba 00 08 00 mv r1,r16
80019c4: 38 42 f2 08 ori r2,r2,0xf208
80019c8: 78 16 08 02 mvhi r22,0x802
if ( !the_thread )
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
(*print)(
80019cc: 78 15 08 01 mvhi r21,0x801
/*
* If this is the currently executing thread, account for time
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
80019d0: 78 11 08 02 mvhi r17,0x802
/*
* Print the information
*/
(*print)( context,
80019d4: 78 14 08 01 mvhi r20,0x801
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
Timestamp_Control used;
_Timestamp_Subtract(
80019d8: 78 19 08 02 mvhi r25,0x802
}
}
}
#endif
(*print)(
80019dc: d9 e0 00 00 call r15
80019e0: 3a d6 a6 38 ori r22,r22,0xa638
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
80019e4: 37 93 00 48 addi r19,sp,72
(*print)(
80019e8: 3a b5 f3 7c ori r21,r21,0xf37c
/*
* 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 ) {
80019ec: 3a 31 ab a8 ori r17,r17,0xaba8
_Timestamp_Subtract(
&_Thread_Time_of_last_context_switch, &uptime, &used
);
_Timestamp_Add_to( &ran, &used );
};
_Timestamp_Divide( &ran, &total, &ival, &fval );
80019f0: 37 98 00 78 addi r24,sp,120
/*
* Print the information
*/
(*print)( context,
80019f4: 3a 94 f3 90 ori r20,r20,0xf390
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
Timestamp_Control used;
_Timestamp_Subtract(
80019f8: 3b 39 a7 64 ori r25,r25,0xa764
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
80019fc: 2a c1 00 00 lw r1,(r22+0)
8001a00: 28 2e 00 04 lw r14,(r1+4)
if ( information ) {
8001a04: 45 c0 00 2e be r14,r0,8001abc <rtems_cpu_usage_report_with_plugin+0x178><== NEVER TAKEN
for ( i=1 ; i <= information->maximum ; i++ ) {
8001a08: 2d c5 00 10 lhu r5,(r14+16)
8001a0c: 44 a0 00 2c be r5,r0,8001abc <rtems_cpu_usage_report_with_plugin+0x178>
8001a10: 34 0d 00 04 mvi r13,4
8001a14: 34 0c 00 01 mvi r12,1
the_thread = (Thread_Control *)information->local_table[ i ];
8001a18: 29 c6 00 1c lw r6,(r14+28)
if ( !the_thread )
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
8001a1c: ba 60 18 00 mv r3,r19
8001a20: 34 02 00 0d mvi r2,13
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
if ( information ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
8001a24: b4 cd 30 00 add r6,r6,r13
8001a28: 28 cb 00 00 lw r11,(r6+0)
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
if ( information ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
8001a2c: 35 8c 00 01 addi r12,r12,1
8001a30: 37 92 00 60 addi r18,sp,96
8001a34: 35 ad 00 04 addi r13,r13,4
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
8001a38: 45 60 00 20 be r11,r0,8001ab8 <rtems_cpu_usage_report_with_plugin+0x174><== NEVER TAKEN
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
8001a3c: 29 61 00 08 lw r1,(r11+8)
8001a40: f8 00 0a c2 calli 8004548 <rtems_object_get_name>
(*print)(
8001a44: 29 63 00 08 lw r3,(r11+8)
8001a48: ba 60 20 00 mv r4,r19
8001a4c: ba 00 08 00 mv r1,r16
8001a50: ba a0 10 00 mv r2,r21
8001a54: d9 e0 00 00 call r15
/*
* If this is the currently executing thread, account for time
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
8001a58: 2a 25 00 0c lw r5,(r17+12)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
/*
* If this is the currently executing thread, account for time
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
8001a5c: 29 67 00 84 lw r7,(r11+132)
8001a60: 29 64 00 88 lw r4,(r11+136)
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
8001a64: 28 a6 00 08 lw r6,(r5+8)
8001a68: 29 65 00 08 lw r5,(r11+8)
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
/*
* If this is the currently executing thread, account for time
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
8001a6c: 5b 87 00 60 sw (sp+96),r7
8001a70: 5b 84 00 64 sw (sp+100),r4
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
8001a74: 44 c5 00 33 be r6,r5,8001b40 <rtems_cpu_usage_report_with_plugin+0x1fc>
_Timestamp_Subtract(
&_Thread_Time_of_last_context_switch, &uptime, &used
);
_Timestamp_Add_to( &ran, &used );
};
_Timestamp_Divide( &ran, &total, &ival, &fval );
8001a78: 37 83 00 7c addi r3,sp,124
8001a7c: bb 00 20 00 mv r4,r24
8001a80: ba 40 08 00 mv r1,r18
8001a84: ba e0 10 00 mv r2,r23
8001a88: f8 00 1b 10 calli 80086c8 <_Timespec_Divide>
/*
* Print the information
*/
(*print)( context,
8001a8c: 2b 81 00 64 lw r1,(sp+100)
8001a90: 34 02 03 e8 mvi r2,1000
8001a94: f8 00 70 0f calli 801dad0 <__udivsi3>
8001a98: 2b 85 00 7c lw r5,(sp+124)
8001a9c: 2b 83 00 60 lw r3,(sp+96)
8001aa0: 2b 86 00 78 lw r6,(sp+120)
8001aa4: b8 20 20 00 mv r4,r1
8001aa8: ba 80 10 00 mv r2,r20
8001aac: ba 00 08 00 mv r1,r16
8001ab0: d9 e0 00 00 call r15
8001ab4: 2d c5 00 10 lhu r5,(r14+16)
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
if ( information ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
8001ab8: 50 ac ff d8 bgeu r5,r12,8001a18 <rtems_cpu_usage_report_with_plugin+0xd4>
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
8001abc: 78 01 08 02 mvhi r1,0x802
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
if ( information ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
8001ac0: 36 d6 00 04 addi r22,r22,4
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
8001ac4: 38 21 a6 44 ori r1,r1,0xa644
8001ac8: 5e c1 ff cd bne r22,r1,80019fc <rtems_cpu_usage_report_with_plugin+0xb8>
}
}
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)(
8001acc: 2b 81 00 6c lw r1,(sp+108)
8001ad0: 34 02 03 e8 mvi r2,1000
8001ad4: 78 0b 08 01 mvhi r11,0x801
8001ad8: f8 00 6f fe calli 801dad0 <__udivsi3>
8001adc: 2b 83 00 68 lw r3,(sp+104)
8001ae0: 39 6b f3 a8 ori r11,r11,0xf3a8
8001ae4: b8 20 20 00 mv r4,r1
8001ae8: b9 60 10 00 mv r2,r11
8001aec: ba 00 08 00 mv r1,r16
8001af0: d9 e0 00 00 call r15
"-------------------------------------------------------------------------------\n",
_Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset,
total_units
);
#endif
}
8001af4: 2b 9d 00 04 lw ra,(sp+4)
8001af8: 2b 8b 00 44 lw r11,(sp+68)
8001afc: 2b 8c 00 40 lw r12,(sp+64)
8001b00: 2b 8d 00 3c lw r13,(sp+60)
8001b04: 2b 8e 00 38 lw r14,(sp+56)
8001b08: 2b 8f 00 34 lw r15,(sp+52)
8001b0c: 2b 90 00 30 lw r16,(sp+48)
8001b10: 2b 91 00 2c lw r17,(sp+44)
8001b14: 2b 92 00 28 lw r18,(sp+40)
8001b18: 2b 93 00 24 lw r19,(sp+36)
8001b1c: 2b 94 00 20 lw r20,(sp+32)
8001b20: 2b 95 00 1c lw r21,(sp+28)
8001b24: 2b 96 00 18 lw r22,(sp+24)
8001b28: 2b 97 00 14 lw r23,(sp+20)
8001b2c: 2b 98 00 10 lw r24,(sp+16)
8001b30: 2b 99 00 0c lw r25,(sp+12)
8001b34: 2b 9b 00 08 lw fp,(sp+8)
8001b38: 37 9c 00 7c addi sp,sp,124
8001b3c: c3 a0 00 00 ret
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
Timestamp_Control used;
_Timestamp_Subtract(
8001b40: bb 20 08 00 mv r1,r25
8001b44: bb 60 10 00 mv r2,fp
8001b48: 37 83 00 58 addi r3,sp,88
8001b4c: f8 00 1c a6 calli 8008de4 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch, &uptime, &used
);
_Timestamp_Add_to( &ran, &used );
8001b50: ba 40 08 00 mv r1,r18
8001b54: 37 82 00 58 addi r2,sp,88
8001b58: f8 00 1a c5 calli 800866c <_Timespec_Add_to>
8001b5c: e3 ff ff c7 bi 8001a78 <rtems_cpu_usage_report_with_plugin+0x134>
0800cc80 <rtems_deviceio_errno>:
[RTEMS_IO_ERROR] = EIO,
[RTEMS_PROXY_BLOCKING] = EIO
};
int rtems_deviceio_errno(rtems_status_code sc)
{
800cc80: 37 9c ff f8 addi sp,sp,-8
800cc84: 5b 8b 00 08 sw (sp+8),r11
800cc88: 5b 9d 00 04 sw (sp+4),ra
if (sc == RTEMS_SUCCESSFUL) {
return 0;
800cc8c: 34 02 00 00 mvi r2,0
[RTEMS_PROXY_BLOCKING] = EIO
};
int rtems_deviceio_errno(rtems_status_code sc)
{
if (sc == RTEMS_SUCCESSFUL) {
800cc90: 5c 20 00 06 bne r1,r0,800cca8 <rtems_deviceio_errno+0x28>
errno = eno;
return -1;
}
}
800cc94: b8 40 08 00 mv r1,r2
800cc98: 2b 9d 00 04 lw ra,(sp+4)
800cc9c: 2b 8b 00 08 lw r11,(sp+8)
800cca0: 37 9c 00 08 addi sp,sp,8
800cca4: c3 a0 00 00 ret
if (sc == RTEMS_SUCCESSFUL) {
return 0;
} else {
int eno = EINVAL;
if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) {
800cca8: 34 02 00 1c mvi r2,28
int rtems_deviceio_errno(rtems_status_code sc)
{
if (sc == RTEMS_SUCCESSFUL) {
return 0;
} else {
int eno = EINVAL;
800ccac: 34 0b 00 16 mvi r11,22
if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) {
800ccb0: 54 22 00 07 bgu r1,r2,800cccc <rtems_deviceio_errno+0x4c> <== NEVER TAKEN
eno = status_code_to_errno [sc];
800ccb4: 78 02 08 01 mvhi r2,0x801
800ccb8: b4 21 08 00 add r1,r1,r1
800ccbc: 38 42 3a 40 ori r2,r2,0x3a40
800ccc0: b4 21 08 00 add r1,r1,r1
800ccc4: b4 41 08 00 add r1,r2,r1
800ccc8: 28 2b 00 00 lw r11,(r1+0)
}
errno = eno;
800cccc: f8 00 00 3e calli 800cdc4 <__errno>
800ccd0: 58 2b 00 00 sw (r1+0),r11
return -1;
800ccd4: 34 02 ff ff mvi r2,-1
800ccd8: e3 ff ff ef bi 800cc94 <rtems_deviceio_errno+0x14>
080013bc <rtems_filesystem_dirname>:
int rtems_filesystem_dirname(
const char *pathname
)
{
80013bc: 37 9c ff f4 addi sp,sp,-12
80013c0: 5b 8b 00 0c sw (sp+12),r11
80013c4: 5b 8c 00 08 sw (sp+8),r12
80013c8: 5b 9d 00 04 sw (sp+4),ra
80013cc: b8 20 60 00 mv r12,r1
int len = strlen( pathname );
80013d0: f8 00 33 1e calli 800e048 <strlen>
80013d4: b8 20 58 00 mv r11,r1
while ( len ) {
80013d8: 5c 20 00 03 bne r1,r0,80013e4 <rtems_filesystem_dirname+0x28><== ALWAYS TAKEN
80013dc: e0 00 00 07 bi 80013f8 <rtems_filesystem_dirname+0x3c> <== NOT EXECUTED
80013e0: 45 61 00 06 be r11,r1,80013f8 <rtems_filesystem_dirname+0x3c>
len--;
80013e4: 35 6b ff ff addi r11,r11,-1
flags,
pathloc,
follow_link );
}
int rtems_filesystem_dirname(
80013e8: b5 8b 10 00 add r2,r12,r11
{
int len = strlen( pathname );
while ( len ) {
len--;
if ( rtems_filesystem_is_separator( pathname[len] ) )
80013ec: 40 41 00 00 lbu r1,(r2+0)
80013f0: f8 00 04 95 calli 8002644 <rtems_filesystem_is_separator>
80013f4: 44 20 ff fb be r1,r0,80013e0 <rtems_filesystem_dirname+0x24>
break;
}
return len;
}
80013f8: b9 60 08 00 mv r1,r11
80013fc: 2b 9d 00 04 lw ra,(sp+4)
8001400: 2b 8b 00 0c lw r11,(sp+12)
8001404: 2b 8c 00 08 lw r12,(sp+8)
8001408: 37 9c 00 0c addi sp,sp,12
800140c: c3 a0 00 00 ret
08008af0 <rtems_filesystem_get_mount_handler>:
rtems_filesystem_fsmount_me_t
rtems_filesystem_get_mount_handler(
const char *type
)
{
8008af0: 37 9c ff f4 addi sp,sp,-12
8008af4: 5b 9d 00 04 sw (sp+4),ra
find_arg fa = {
8008af8: 5b 81 00 08 sw (sp+8),r1
8008afc: 5b 80 00 0c sw (sp+12),r0
.type = type,
.mount_h = NULL
};
if ( type != NULL ) {
8008b00: 34 02 00 00 mvi r2,0
8008b04: 44 20 00 06 be r1,r0,8008b1c <rtems_filesystem_get_mount_handler+0x2c><== NEVER TAKEN
rtems_filesystem_iterate( find_handler, &fa );
8008b08: 78 01 08 00 mvhi r1,0x800
8008b0c: 37 82 00 08 addi r2,sp,8
8008b10: 38 21 89 bc ori r1,r1,0x89bc
8008b14: fb ff ff be calli 8008a0c <rtems_filesystem_iterate>
8008b18: 2b 82 00 0c lw r2,(sp+12)
}
return fa.mount_h;
}
8008b1c: b8 40 08 00 mv r1,r2
8008b20: 2b 9d 00 04 lw ra,(sp+4)
8008b24: 37 9c 00 0c addi sp,sp,12
8008b28: c3 a0 00 00 ret
080010ec <rtems_filesystem_initialize>:
* configuration is a single instantiation of the IMFS or miniIMFS with
* a single "/dev" directory in it.
*/
void rtems_filesystem_initialize( void )
{
80010ec: 37 9c ff dc addi sp,sp,-36
80010f0: 5b 8b 00 10 sw (sp+16),r11
80010f4: 5b 8c 00 0c sw (sp+12),r12
80010f8: 5b 8d 00 08 sw (sp+8),r13
80010fc: 5b 9d 00 04 sw (sp+4),ra
/*
* Set the default umask to "022".
*/
rtems_filesystem_umask = 022;
8001100: 78 0b 08 01 mvhi r11,0x801
8001104: 39 6b 41 20 ori r11,r11,0x4120
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
8001108: 78 01 08 01 mvhi r1,0x801
/*
* Set the default umask to "022".
*/
rtems_filesystem_umask = 022;
800110c: 29 63 00 00 lw r3,(r11+0)
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
8001110: 38 21 32 80 ori r1,r1,0x3280
8001114: 28 21 00 00 lw r1,(r1+0)
/*
* Set the default umask to "022".
*/
rtems_filesystem_umask = 022;
8001118: 34 02 00 12 mvi r2,18
800111c: 58 62 00 2c sw (r3+44),r2
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
8001120: 44 20 00 3e be r1,r0,8001218 <rtems_filesystem_initialize+0x12c><== NEVER TAKEN
rtems_fatal_error_occurred( 0xABCD0001 );
mt = &rtems_filesystem_mount_table[0];
8001124: 78 01 08 01 mvhi r1,0x801
8001128: 38 21 40 18 ori r1,r1,0x4018
800112c: 28 24 00 00 lw r4,(r1+0)
status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL );
8001130: 34 05 00 00 mvi r5,0
8001134: 28 82 00 0c lw r2,(r4+12)
8001138: 28 81 00 08 lw r1,(r4+8)
800113c: 28 83 00 00 lw r3,(r4+0)
8001140: 28 84 00 04 lw r4,(r4+4)
8001144: f8 00 02 89 calli 8001b68 <mount>
if ( status == -1 )
8001148: 34 02 ff ff mvi r2,-1
800114c: 44 22 00 3b be r1,r2,8001238 <rtems_filesystem_initialize+0x14c><== NEVER TAKEN
rtems_fatal_error_occurred( 0xABCD0002 );
rtems_filesystem_link_counts = 0;
8001150: 29 61 00 00 lw r1,(r11+0)
* gonna hit performance.
*
* Till Straumann, 10/25/2002
*/
/* Clone the root pathloc */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
8001154: 78 0c 08 01 mvhi r12,0x801
8001158: 39 8c 33 dc ori r12,r12,0x33dc
800115c: 37 8d 00 14 addi r13,sp,20
8001160: 34 02 00 01 mvi r2,1
8001164: 34 03 00 00 mvi r3,0
8001168: b9 a0 20 00 mv r4,r13
800116c: 34 05 00 00 mvi r5,0
status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL );
if ( status == -1 )
rtems_fatal_error_occurred( 0xABCD0002 );
rtems_filesystem_link_counts = 0;
8001170: 0c 20 00 30 sh (r1+48),r0
* gonna hit performance.
*
* Till Straumann, 10/25/2002
*/
/* Clone the root pathloc */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
8001174: b9 80 08 00 mv r1,r12
8001178: f8 00 00 76 calli 8001350 <rtems_filesystem_evaluate_path>
rtems_filesystem_root = loc;
800117c: 29 61 00 00 lw r1,(r11+0)
8001180: 2b 83 00 14 lw r3,(sp+20)
/* One more clone for the current node */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
8001184: 34 02 00 01 mvi r2,1
8001188: b9 a0 20 00 mv r4,r13
*
* Till Straumann, 10/25/2002
*/
/* Clone the root pathloc */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
rtems_filesystem_root = loc;
800118c: 58 23 00 18 sw (r1+24),r3
8001190: 2b 83 00 18 lw r3,(sp+24)
/* One more clone for the current node */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
8001194: 34 05 00 00 mvi r5,0
*
* Till Straumann, 10/25/2002
*/
/* Clone the root pathloc */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
rtems_filesystem_root = loc;
8001198: 58 23 00 1c sw (r1+28),r3
800119c: 2b 83 00 1c lw r3,(sp+28)
80011a0: 58 23 00 20 sw (r1+32),r3
80011a4: 2b 83 00 20 lw r3,(sp+32)
80011a8: 58 23 00 24 sw (r1+36),r3
80011ac: 2b 83 00 24 lw r3,(sp+36)
80011b0: 58 23 00 28 sw (r1+40),r3
/* One more clone for the current node */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
80011b4: b9 80 08 00 mv r1,r12
80011b8: 34 03 00 00 mvi r3,0
80011bc: f8 00 00 65 calli 8001350 <rtems_filesystem_evaluate_path>
rtems_filesystem_current = loc;
80011c0: 29 61 00 00 lw r1,(r11+0)
80011c4: 2b 82 00 14 lw r2,(sp+20)
80011c8: 58 22 00 04 sw (r1+4),r2
80011cc: 2b 82 00 18 lw r2,(sp+24)
80011d0: 58 22 00 08 sw (r1+8),r2
80011d4: 2b 82 00 1c lw r2,(sp+28)
80011d8: 58 22 00 0c sw (r1+12),r2
80011dc: 2b 82 00 20 lw r2,(sp+32)
80011e0: 58 22 00 10 sw (r1+16),r2
80011e4: 2b 82 00 24 lw r2,(sp+36)
80011e8: 58 22 00 14 sw (r1+20),r2
*
* NOTE: UNIX root is 755 and owned by root/root (0/0). It is actually
* created that way by the IMFS.
*/
status = mkdir( "/dev", 0777);
80011ec: 78 01 08 01 mvhi r1,0x801
80011f0: 38 21 33 e0 ori r1,r1,0x33e0
80011f4: 34 02 01 ff mvi r2,511
80011f8: f8 00 01 ed calli 80019ac <mkdir>
if ( status != 0 )
80011fc: 5c 20 00 0b bne r1,r0,8001228 <rtems_filesystem_initialize+0x13c><== NEVER TAKEN
* it will be mounted onto is created. Moreover, if it is going to
* use a device, then it is REALLY unfair to attempt this
* before device drivers are initialized. So we return via a base
* filesystem image and nothing auto-mounted at this point.
*/
}
8001200: 2b 9d 00 04 lw ra,(sp+4)
8001204: 2b 8b 00 10 lw r11,(sp+16)
8001208: 2b 8c 00 0c lw r12,(sp+12)
800120c: 2b 8d 00 08 lw r13,(sp+8)
8001210: 37 9c 00 24 addi sp,sp,36
8001214: c3 a0 00 00 ret
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
rtems_fatal_error_occurred( 0xABCD0001 );
8001218: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
800121c: 38 42 33 e8 ori r2,r2,0x33e8 <== NOT EXECUTED
8001220: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED
8001224: f8 00 08 8a calli 800344c <rtems_fatal_error_occurred> <== NOT EXECUTED
* created that way by the IMFS.
*/
status = mkdir( "/dev", 0777);
if ( status != 0 )
rtems_fatal_error_occurred( 0xABCD0003 );
8001228: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
800122c: 38 42 33 f0 ori r2,r2,0x33f0 <== NOT EXECUTED
8001230: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED
8001234: f8 00 08 86 calli 800344c <rtems_fatal_error_occurred> <== NOT EXECUTED
mt = &rtems_filesystem_mount_table[0];
status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL );
if ( status == -1 )
rtems_fatal_error_occurred( 0xABCD0002 );
8001238: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
800123c: 38 42 33 ec ori r2,r2,0x33ec <== NOT EXECUTED
8001240: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED
8001244: f8 00 08 82 calli 800344c <rtems_fatal_error_occurred> <== NOT EXECUTED
08008a0c <rtems_filesystem_iterate>:
bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
8008a0c: 37 9c ff e4 addi sp,sp,-28
8008a10: 5b 8b 00 1c sw (sp+28),r11
8008a14: 5b 8c 00 18 sw (sp+24),r12
8008a18: 5b 8d 00 14 sw (sp+20),r13
8008a1c: 5b 8e 00 10 sw (sp+16),r14
8008a20: 5b 8f 00 0c sw (sp+12),r15
8008a24: 5b 90 00 08 sw (sp+8),r16
8008a28: 5b 9d 00 04 sw (sp+4),ra
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
8008a2c: 78 0c 08 01 mvhi r12,0x801
8008a30: 39 8c 32 60 ori r12,r12,0x3260
8008a34: 29 83 00 00 lw r3,(r12+0)
bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
8008a38: b8 20 68 00 mv r13,r1
8008a3c: b8 40 70 00 mv r14,r2
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
8008a40: 5c 60 00 03 bne r3,r0,8008a4c <rtems_filesystem_iterate+0x40><== ALWAYS TAKEN
8008a44: e0 00 00 0a bi 8008a6c <rtems_filesystem_iterate+0x60> <== NOT EXECUTED
8008a48: 5c 20 00 20 bne r1,r0,8008ac8 <rtems_filesystem_iterate+0xbc>
stop = (*routine)( table_entry, routine_arg );
8008a4c: b9 80 08 00 mv r1,r12
8008a50: b9 c0 10 00 mv r2,r14
8008a54: d9 a0 00 00 call r13
++table_entry;
8008a58: 35 8c 00 08 addi r12,r12,8
{
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
8008a5c: 29 83 00 00 lw r3,(r12+0)
stop = (*routine)( table_entry, routine_arg );
8008a60: b8 20 58 00 mv r11,r1
{
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
8008a64: 5c 60 ff f9 bne r3,r0,8008a48 <rtems_filesystem_iterate+0x3c>
stop = (*routine)( table_entry, routine_arg );
++table_entry;
}
if ( !stop ) {
8008a68: 5c 23 00 18 bne r1,r3,8008ac8 <rtems_filesystem_iterate+0xbc>
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8008a6c: 78 10 08 01 mvhi r16,0x801
8008a70: 3a 10 47 34 ori r16,r16,0x4734
8008a74: 2a 01 00 00 lw r1,(r16+0)
8008a78: 34 02 00 00 mvi r2,0
8008a7c: 34 03 00 00 mvi r3,0
8008a80: fb ff e8 95 calli 8002cd4 <rtems_semaphore_obtain>
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
8008a84: 78 01 08 01 mvhi r1,0x801
8008a88: 38 21 41 24 ori r1,r1,0x4124
8008a8c: 28 2c 00 00 lw r12,(r1+0)
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
8008a90: 78 0f 08 01 mvhi r15,0x801
8008a94: 39 ef 41 28 ori r15,r15,0x4128
8008a98: 34 0b 00 00 mvi r11,0
8008a9c: 5d 8f 00 03 bne r12,r15,8008aa8 <rtems_filesystem_iterate+0x9c>
8008aa0: e0 00 00 08 bi 8008ac0 <rtems_filesystem_iterate+0xb4>
node = rtems_chain_first( &filesystem_chain );
!rtems_chain_is_tail( &filesystem_chain, node ) && !stop;
8008aa4: 5c 20 00 07 bne r1,r0,8008ac0 <rtems_filesystem_iterate+0xb4><== NEVER TAKEN
node = rtems_chain_next( node )
) {
const filesystem_node *fsn = (filesystem_node *) node;
stop = (*routine)( &fsn->entry, routine_arg );
8008aa8: 35 81 00 08 addi r1,r12,8
8008aac: b9 c0 10 00 mv r2,r14
8008ab0: d9 a0 00 00 call r13
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
8008ab4: 29 8c 00 00 lw r12,(r12+0)
!rtems_chain_is_tail( &filesystem_chain, node ) && !stop;
node = rtems_chain_next( node )
) {
const filesystem_node *fsn = (filesystem_node *) node;
stop = (*routine)( &fsn->entry, routine_arg );
8008ab8: b8 20 58 00 mv r11,r1
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
8008abc: 5d 8f ff fa bne r12,r15,8008aa4 <rtems_filesystem_iterate+0x98>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
8008ac0: 2a 01 00 00 lw r1,(r16+0)
8008ac4: fb ff e8 e0 calli 8002e44 <rtems_semaphore_release>
}
rtems_libio_unlock();
}
return stop;
}
8008ac8: b9 60 08 00 mv r1,r11
8008acc: 2b 9d 00 04 lw ra,(sp+4)
8008ad0: 2b 8b 00 1c lw r11,(sp+28)
8008ad4: 2b 8c 00 18 lw r12,(sp+24)
8008ad8: 2b 8d 00 14 lw r13,(sp+20)
8008adc: 2b 8e 00 10 lw r14,(sp+16)
8008ae0: 2b 8f 00 0c lw r15,(sp+12)
8008ae4: 2b 90 00 08 lw r16,(sp+8)
8008ae8: 37 9c 00 1c addi sp,sp,28
8008aec: c3 a0 00 00 ret
08001abc <rtems_filesystem_mount_iterate>:
bool rtems_filesystem_mount_iterate(
rtems_per_filesystem_mount_routine routine,
void *routine_arg
)
{
8001abc: 37 9c ff e4 addi sp,sp,-28
8001ac0: 5b 8b 00 1c sw (sp+28),r11
8001ac4: 5b 8c 00 18 sw (sp+24),r12
8001ac8: 5b 8d 00 14 sw (sp+20),r13
8001acc: 5b 8e 00 10 sw (sp+16),r14
8001ad0: 5b 8f 00 0c sw (sp+12),r15
8001ad4: 5b 90 00 08 sw (sp+8),r16
8001ad8: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8001adc: 78 10 08 01 mvhi r16,0x801
8001ae0: 3a 10 47 34 ori r16,r16,0x4734
8001ae4: b8 20 78 00 mv r15,r1
8001ae8: 2a 01 00 00 lw r1,(r16+0)
8001aec: b8 40 70 00 mv r14,r2
8001af0: 34 03 00 00 mvi r3,0
8001af4: 34 02 00 00 mvi r2,0
8001af8: f8 00 04 77 calli 8002cd4 <rtems_semaphore_obtain>
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
8001afc: 78 01 08 01 mvhi r1,0x801
8001b00: 38 21 41 14 ori r1,r1,0x4114
8001b04: 28 2b 00 00 lw r11,(r1+0)
{
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
for (
8001b08: 78 0d 08 01 mvhi r13,0x801
8001b0c: 39 ad 41 18 ori r13,r13,0x4118
rtems_per_filesystem_mount_routine routine,
void *routine_arg
)
{
rtems_chain_node *node = NULL;
bool stop = false;
8001b10: 34 0c 00 00 mvi r12,0
rtems_libio_lock();
for (
8001b14: 5d 6d 00 03 bne r11,r13,8001b20 <rtems_filesystem_mount_iterate+0x64><== ALWAYS TAKEN
8001b18: e0 00 00 08 bi 8001b38 <rtems_filesystem_mount_iterate+0x7c><== NOT EXECUTED
node = rtems_chain_first( &mount_chain );
!rtems_chain_is_tail( &mount_chain, node ) && !stop;
8001b1c: 5c 20 00 07 bne r1,r0,8001b38 <rtems_filesystem_mount_iterate+0x7c><== NEVER TAKEN
node = rtems_chain_next( node )
) {
const rtems_filesystem_mount_table_entry_t *mt_entry =
(rtems_filesystem_mount_table_entry_t *) node;
stop = (*routine)( mt_entry, routine_arg );
8001b20: b9 60 08 00 mv r1,r11
8001b24: b9 c0 10 00 mv r2,r14
8001b28: d9 e0 00 00 call r15
}
rtems_libio_unlock();
return stop;
}
8001b2c: 29 6b 00 00 lw r11,(r11+0)
node = rtems_chain_next( node )
) {
const rtems_filesystem_mount_table_entry_t *mt_entry =
(rtems_filesystem_mount_table_entry_t *) node;
stop = (*routine)( mt_entry, routine_arg );
8001b30: b8 20 60 00 mv r12,r1
{
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
for (
8001b34: 5d 6d ff fa bne r11,r13,8001b1c <rtems_filesystem_mount_iterate+0x60>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
8001b38: 2a 01 00 00 lw r1,(r16+0)
8001b3c: f8 00 04 c2 calli 8002e44 <rtems_semaphore_release>
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
8001b40: b9 80 08 00 mv r1,r12
8001b44: 2b 9d 00 04 lw ra,(sp+4)
8001b48: 2b 8b 00 1c lw r11,(sp+28)
8001b4c: 2b 8c 00 18 lw r12,(sp+24)
8001b50: 2b 8d 00 14 lw r13,(sp+20)
8001b54: 2b 8e 00 10 lw r14,(sp+16)
8001b58: 2b 8f 00 0c lw r15,(sp+12)
8001b5c: 2b 90 00 08 lw r16,(sp+8)
8001b60: 37 9c 00 1c addi sp,sp,28
8001b64: c3 a0 00 00 ret
08001410 <rtems_filesystem_prefix_separators>:
int rtems_filesystem_prefix_separators(
const char *pathname,
int pathnamelen
)
{
8001410: 37 9c ff f0 addi sp,sp,-16
8001414: 5b 8b 00 10 sw (sp+16),r11
8001418: 5b 8c 00 0c sw (sp+12),r12
800141c: 5b 8d 00 08 sw (sp+8),r13
8001420: 5b 9d 00 04 sw (sp+4),ra
8001424: b8 20 68 00 mv r13,r1
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) )
8001428: 40 21 00 00 lbu r1,(r1+0)
800142c: 7c 43 00 00 cmpnei r3,r2,0
int rtems_filesystem_prefix_separators(
const char *pathname,
int pathnamelen
)
{
8001430: b8 40 60 00 mv r12,r2
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) )
8001434: 7c 22 00 00 cmpnei r2,r1,0
8001438: 34 0b 00 00 mvi r11,0
800143c: a0 62 10 00 and r2,r3,r2
8001440: 5c 40 00 09 bne r2,r0,8001464 <rtems_filesystem_prefix_separators+0x54><== ALWAYS TAKEN
8001444: e0 00 00 0a bi 800146c <rtems_filesystem_prefix_separators+0x5c><== NOT EXECUTED
{
pathname++;
pathnamelen--;
stripped++;
8001448: 35 6b 00 01 addi r11,r11,1
}
return len;
}
int rtems_filesystem_prefix_separators(
800144c: b5 ab 18 00 add r3,r13,r11
{
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) )
8001450: 40 61 00 00 lbu r1,(r3+0)
8001454: fd 8b 20 00 cmpne r4,r12,r11
8001458: 7c 23 00 00 cmpnei r3,r1,0
800145c: a0 83 18 00 and r3,r4,r3
8001460: 44 60 00 03 be r3,r0,800146c <rtems_filesystem_prefix_separators+0x5c><== NEVER TAKEN
8001464: f8 00 04 78 calli 8002644 <rtems_filesystem_is_separator>
8001468: 5c 20 ff f8 bne r1,r0,8001448 <rtems_filesystem_prefix_separators+0x38>
pathname++;
pathnamelen--;
stripped++;
}
return stripped;
}
800146c: b9 60 08 00 mv r1,r11
8001470: 2b 9d 00 04 lw ra,(sp+4)
8001474: 2b 8b 00 10 lw r11,(sp+16)
8001478: 2b 8c 00 0c lw r12,(sp+12)
800147c: 2b 8d 00 08 lw r13,(sp+8)
8001480: 37 9c 00 10 addi sp,sp,16
8001484: c3 a0 00 00 ret
08008c3c <rtems_filesystem_unregister>:
int
rtems_filesystem_unregister(
const char *type
)
{
8008c3c: 37 9c ff ec addi sp,sp,-20
8008c40: 5b 8b 00 14 sw (sp+20),r11
8008c44: 5b 8c 00 10 sw (sp+16),r12
8008c48: 5b 8d 00 0c sw (sp+12),r13
8008c4c: 5b 8e 00 08 sw (sp+8),r14
8008c50: 5b 9d 00 04 sw (sp+4),ra
8008c54: b8 20 68 00 mv r13,r1
rtems_chain_node *node = NULL;
if ( type == NULL ) {
8008c58: 44 20 00 2f be r1,r0,8008d14 <rtems_filesystem_unregister+0xd8>
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8008c5c: 78 0e 08 01 mvhi r14,0x801
8008c60: 39 ce 47 34 ori r14,r14,0x4734
8008c64: 29 c1 00 00 lw r1,(r14+0)
8008c68: 34 02 00 00 mvi r2,0
8008c6c: 34 03 00 00 mvi r3,0
8008c70: fb ff e8 19 calli 8002cd4 <rtems_semaphore_obtain>
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
8008c74: 78 01 08 01 mvhi r1,0x801
8008c78: 38 21 41 24 ori r1,r1,0x4124
8008c7c: 28 2b 00 00 lw r11,(r1+0)
if ( type == NULL ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
rtems_libio_lock();
for (
8008c80: 78 0c 08 01 mvhi r12,0x801
8008c84: 39 8c 41 28 ori r12,r12,0x4128
8008c88: 5d 6c 00 04 bne r11,r12,8008c98 <rtems_filesystem_unregister+0x5c>
8008c8c: e0 00 00 15 bi 8008ce0 <rtems_filesystem_unregister+0xa4>
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
8008c90: 29 6b 00 00 lw r11,(r11+0)
if ( type == NULL ) {
rtems_set_errno_and_return_minus_one( EINVAL );
}
rtems_libio_lock();
for (
8008c94: 45 6c 00 13 be r11,r12,8008ce0 <rtems_filesystem_unregister+0xa4><== ALWAYS TAKEN
!rtems_chain_is_tail( &filesystem_chain, node );
node = rtems_chain_next( node )
) {
filesystem_node *fsn = (filesystem_node *) node;
if ( strcmp( fsn->entry.type, type ) == 0 ) {
8008c98: 29 61 00 08 lw r1,(r11+8)
8008c9c: b9 a0 10 00 mv r2,r13
8008ca0: f8 00 14 73 calli 800de6c <strcmp>
8008ca4: 5c 20 ff fb bne r1,r0,8008c90 <rtems_filesystem_unregister+0x54>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8008ca8: b9 60 08 00 mv r1,r11
8008cac: fb ff eb 0d calli 80038e0 <_Chain_Extract>
rtems_chain_extract( node );
free( fsn );
8008cb0: b9 60 08 00 mv r1,r11
8008cb4: fb ff e1 fd calli 80014a8 <free>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
8008cb8: 29 c1 00 00 lw r1,(r14+0)
8008cbc: fb ff e8 62 calli 8002e44 <rtems_semaphore_release>
rtems_libio_unlock();
return 0;
8008cc0: 34 01 00 00 mvi r1,0
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
8008cc4: 2b 9d 00 04 lw ra,(sp+4)
8008cc8: 2b 8b 00 14 lw r11,(sp+20)
8008ccc: 2b 8c 00 10 lw r12,(sp+16)
8008cd0: 2b 8d 00 0c lw r13,(sp+12)
8008cd4: 2b 8e 00 08 lw r14,(sp+8)
8008cd8: 37 9c 00 14 addi sp,sp,20
8008cdc: c3 a0 00 00 ret
8008ce0: 29 c1 00 00 lw r1,(r14+0)
8008ce4: fb ff e8 58 calli 8002e44 <rtems_semaphore_release>
return 0;
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
8008ce8: f8 00 10 37 calli 800cdc4 <__errno>
8008cec: 34 02 00 02 mvi r2,2
8008cf0: 58 22 00 00 sw (r1+0),r2
8008cf4: 34 01 ff ff mvi r1,-1
}
8008cf8: 2b 9d 00 04 lw ra,(sp+4)
8008cfc: 2b 8b 00 14 lw r11,(sp+20)
8008d00: 2b 8c 00 10 lw r12,(sp+16)
8008d04: 2b 8d 00 0c lw r13,(sp+12)
8008d08: 2b 8e 00 08 lw r14,(sp+8)
8008d0c: 37 9c 00 14 addi sp,sp,20
8008d10: c3 a0 00 00 ret
)
{
rtems_chain_node *node = NULL;
if ( type == NULL ) {
rtems_set_errno_and_return_minus_one( EINVAL );
8008d14: f8 00 10 2c calli 800cdc4 <__errno>
8008d18: 34 02 00 16 mvi r2,22
8008d1c: 58 22 00 00 sw (r1+0),r2
8008d20: 34 01 ff ff mvi r1,-1
8008d24: e3 ff ff f5 bi 8008cf8 <rtems_filesystem_unregister+0xbc>
08002124 <rtems_gxx_key_create>:
int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *))
{
8002124: 37 9c ff f0 addi sp,sp,-16
8002128: 5b 8b 00 10 sw (sp+16),r11
800212c: 5b 8c 00 0c sw (sp+12),r12
8002130: 5b 8d 00 08 sw (sp+8),r13
8002134: 5b 9d 00 04 sw (sp+4),ra
8002138: b8 20 68 00 mv r13,r1
* pointer to the buffer that will hold the value of the key itself.
* We have to to this, because the others functions on this interface
* deal with the value of the key, as used with the POSIX API.
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
800213c: 34 01 00 08 mvi r1,8
}
return 0;
}
int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *))
{
8002140: b8 40 60 00 mv r12,r2
* pointer to the buffer that will hold the value of the key itself.
* We have to to this, because the others functions on this interface
* deal with the value of the key, as used with the POSIX API.
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
8002144: f8 00 01 54 calli 8002694 <malloc>
8002148: b8 20 58 00 mv r11,r1
*key = new_key;
800214c: 59 a1 00 00 sw (r13+0),r1
"gxx_wrappers: create key=%x, dtor=%x, new_key=%x\n", key, dtor, new_key
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor );
8002150: b9 60 10 00 mv r2,r11
8002154: 34 01 00 00 mvi r1,0
8002158: b9 80 18 00 mv r3,r12
* deal with the value of the key, as used with the POSIX API.
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
*key = new_key;
new_key->val = NULL;
800215c: 59 60 00 00 sw (r11+0),r0
new_key->dtor = dtor;
8002160: 59 6c 00 04 sw (r11+4),r12
"gxx_wrappers: create key=%x, dtor=%x, new_key=%x\n", key, dtor, new_key
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor );
8002164: f8 00 07 ed calli 8004118 <rtems_task_variable_add>
if ( status == RTEMS_SUCCESSFUL )
return 0;
8002168: 34 02 00 00 mvi r2,0
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor );
if ( status == RTEMS_SUCCESSFUL )
800216c: 5c 20 00 08 bne r1,r0,800218c <rtems_gxx_key_create+0x68> <== NEVER TAKEN
return 0;
free( new_key );
return -1;
}
8002170: b8 40 08 00 mv r1,r2
8002174: 2b 9d 00 04 lw ra,(sp+4)
8002178: 2b 8b 00 10 lw r11,(sp+16)
800217c: 2b 8c 00 0c lw r12,(sp+12)
8002180: 2b 8d 00 08 lw r13,(sp+8)
8002184: 37 9c 00 10 addi sp,sp,16
8002188: c3 a0 00 00 ret
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor );
if ( status == RTEMS_SUCCESSFUL )
return 0;
free( new_key );
800218c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8002190: fb ff ff 5c calli 8001f00 <free> <== NOT EXECUTED
return -1;
8002194: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
8002198: e3 ff ff f6 bi 8002170 <rtems_gxx_key_create+0x4c> <== NOT EXECUTED
080021a8 <rtems_gxx_key_delete>:
int rtems_gxx_key_delete (__gthread_key_t key)
{
80021a8: 37 9c ff f8 addi sp,sp,-8
80021ac: 5b 8b 00 08 sw (sp+8),r11
80021b0: 5b 9d 00 04 sw (sp+4),ra
80021b4: b8 20 58 00 mv r11,r1
#ifdef DEBUG_GXX_WRAPPERS
printk( "gxx_wrappers: delete key=%x\n", key );
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_delete( RTEMS_SELF, (void **)key );
80021b8: b8 20 10 00 mv r2,r1
80021bc: 34 01 00 00 mvi r1,0
80021c0: f8 00 08 15 calli 8004214 <rtems_task_variable_delete>
if ( status == RTEMS_SUCCESSFUL ) {
80021c4: 5c 20 00 04 bne r1,r0,80021d4 <rtems_gxx_key_delete+0x2c> <== NEVER TAKEN
/* Hmm - hopefully all tasks using this key have gone away... */
if ( key ) free( *(void **)key );
80021c8: 45 61 00 03 be r11,r1,80021d4 <rtems_gxx_key_delete+0x2c> <== NEVER TAKEN
80021cc: 29 61 00 00 lw r1,(r11+0)
80021d0: fb ff ff 4c calli 8001f00 <free>
return 0;
}
key = NULL;
return 0;
}
80021d4: 34 01 00 00 mvi r1,0
80021d8: 2b 9d 00 04 lw ra,(sp+4)
80021dc: 2b 8b 00 08 lw r11,(sp+8)
80021e0: 37 9c 00 08 addi sp,sp,8
80021e4: c3 a0 00 00 ret
08002068 <rtems_gxx_once>:
/* uncomment this if you need to debug this interface */
/*#define DEBUG_GXX_WRAPPERS 1*/
int rtems_gxx_once(__gthread_once_t *once, void (*func) (void))
{
8002068: 37 9c ff ec addi sp,sp,-20
800206c: 5b 8b 00 10 sw (sp+16),r11
8002070: 5b 8c 00 0c sw (sp+12),r12
8002074: 5b 8d 00 08 sw (sp+8),r13
8002078: 5b 9d 00 04 sw (sp+4),ra
#ifdef DEBUG_GXX_WRAPPERS
printk( "gxx_wrappers: once=%x, func=%x\n", *once, func );
#endif
if ( *(volatile __gthread_once_t *)once == 0 ) {
800207c: 28 2c 00 00 lw r12,(r1+0)
/* uncomment this if you need to debug this interface */
/*#define DEBUG_GXX_WRAPPERS 1*/
int rtems_gxx_once(__gthread_once_t *once, void (*func) (void))
{
8002080: b8 20 58 00 mv r11,r1
8002084: b8 40 68 00 mv r13,r2
#ifdef DEBUG_GXX_WRAPPERS
printk( "gxx_wrappers: once=%x, func=%x\n", *once, func );
#endif
if ( *(volatile __gthread_once_t *)once == 0 ) {
8002088: 45 80 00 08 be r12,r0,80020a8 <rtems_gxx_once+0x40>
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
if ( o == 0 )
(*func)();
}
return 0;
}
800208c: 34 01 00 00 mvi r1,0
8002090: 2b 9d 00 04 lw ra,(sp+4)
8002094: 2b 8b 00 10 lw r11,(sp+16)
8002098: 2b 8c 00 0c lw r12,(sp+12)
800209c: 2b 8d 00 08 lw r13,(sp+8)
80020a0: 37 9c 00 14 addi sp,sp,20
80020a4: c3 a0 00 00 ret
if ( *(volatile __gthread_once_t *)once == 0 ) {
rtems_mode saveMode;
__gthread_once_t o;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
80020a8: 34 01 01 00 mvi r1,256
80020ac: 34 02 01 00 mvi r2,256
80020b0: 37 83 00 14 addi r3,sp,20
80020b4: f8 00 07 7b calli 8003ea0 <rtems_task_mode>
if ( (o = *(volatile __gthread_once_t *)once) == 0 ) {
80020b8: 29 61 00 00 lw r1,(r11+0)
80020bc: 5c 2c 00 0f bne r1,r12,80020f8 <rtems_gxx_once+0x90> <== NEVER TAKEN
*(volatile __gthread_once_t *)once = 1;
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
80020c0: 2b 81 00 14 lw r1,(sp+20)
rtems_mode saveMode;
__gthread_once_t o;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
if ( (o = *(volatile __gthread_once_t *)once) == 0 ) {
*(volatile __gthread_once_t *)once = 1;
80020c4: 34 04 00 01 mvi r4,1
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
80020c8: 34 02 01 00 mvi r2,256
80020cc: 37 83 00 14 addi r3,sp,20
rtems_mode saveMode;
__gthread_once_t o;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
if ( (o = *(volatile __gthread_once_t *)once) == 0 ) {
*(volatile __gthread_once_t *)once = 1;
80020d0: 59 64 00 00 sw (r11+0),r4
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
80020d4: f8 00 07 73 calli 8003ea0 <rtems_task_mode>
if ( o == 0 )
(*func)();
80020d8: d9 a0 00 00 call r13
}
return 0;
}
80020dc: 34 01 00 00 mvi r1,0
80020e0: 2b 9d 00 04 lw ra,(sp+4)
80020e4: 2b 8b 00 10 lw r11,(sp+16)
80020e8: 2b 8c 00 0c lw r12,(sp+12)
80020ec: 2b 8d 00 08 lw r13,(sp+8)
80020f0: 37 9c 00 14 addi sp,sp,20
80020f4: c3 a0 00 00 ret
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
if ( (o = *(volatile __gthread_once_t *)once) == 0 ) {
*(volatile __gthread_once_t *)once = 1;
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
80020f8: 2b 81 00 14 lw r1,(sp+20) <== NOT EXECUTED
80020fc: 34 02 01 00 mvi r2,256 <== NOT EXECUTED
8002100: 37 83 00 14 addi r3,sp,20 <== NOT EXECUTED
8002104: f8 00 07 67 calli 8003ea0 <rtems_task_mode> <== NOT EXECUTED
if ( o == 0 )
(*func)();
}
return 0;
}
8002108: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
800210c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8002110: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
8002114: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
8002118: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
800211c: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED
8002120: c3 a0 00 00 ret <== NOT EXECUTED
08002260 <rtems_gxx_setspecific>:
#endif
return p;
}
int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr)
{
8002260: 37 9c ff f4 addi sp,sp,-12
8002264: 5b 8b 00 0c sw (sp+12),r11
8002268: 5b 8c 00 08 sw (sp+8),r12
800226c: 5b 9d 00 04 sw (sp+4),ra
rtems_task_self()
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor );
8002270: 28 23 00 04 lw r3,(r1+4)
#endif
return p;
}
int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr)
{
8002274: b8 20 58 00 mv r11,r1
8002278: b8 40 60 00 mv r12,r2
rtems_task_self()
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor );
800227c: 34 01 00 00 mvi r1,0
8002280: b9 60 10 00 mv r2,r11
8002284: f8 00 07 a5 calli 8004118 <rtems_task_variable_add>
if ( status == RTEMS_SUCCESSFUL ) {
/* now let's set the proper value */
key->val = (void *)ptr;
return 0;
}
return -1;
8002288: 34 03 ff ff mvi r3,-1
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor );
if ( status == RTEMS_SUCCESSFUL ) {
800228c: 5c 20 00 03 bne r1,r0,8002298 <rtems_gxx_setspecific+0x38> <== NEVER TAKEN
/* now let's set the proper value */
key->val = (void *)ptr;
8002290: 59 6c 00 00 sw (r11+0),r12
return 0;
8002294: 34 03 00 00 mvi r3,0
}
return -1;
}
8002298: b8 60 08 00 mv r1,r3
800229c: 2b 9d 00 04 lw ra,(sp+4)
80022a0: 2b 8b 00 0c lw r11,(sp+12)
80022a4: 2b 8c 00 08 lw r12,(sp+8)
80022a8: 37 9c 00 0c addi sp,sp,12
80022ac: c3 a0 00 00 ret
080070ec <rtems_heap_allocate_aligned_with_boundary>:
void *rtems_heap_allocate_aligned_with_boundary(
size_t size,
uintptr_t alignment,
uintptr_t boundary
)
{
80070ec: 37 9c ff f0 addi sp,sp,-16
80070f0: 5b 8b 00 10 sw (sp+16),r11
80070f4: 5b 8c 00 0c sw (sp+12),r12
80070f8: 5b 8d 00 08 sw (sp+8),r13
80070fc: 5b 9d 00 04 sw (sp+4),ra
if (
8007100: 78 04 08 02 mvhi r4,0x802
8007104: 38 84 73 30 ori r4,r4,0x7330
8007108: 28 86 00 00 lw r6,(r4+0)
800710c: 34 05 00 03 mvi r5,3
void *rtems_heap_allocate_aligned_with_boundary(
size_t size,
uintptr_t alignment,
uintptr_t boundary
)
{
8007110: b8 20 68 00 mv r13,r1
8007114: b8 40 60 00 mv r12,r2
8007118: b8 60 58 00 mv r11,r3
if (
800711c: 44 c5 00 11 be r6,r5,8007160 <rtems_heap_allocate_aligned_with_boundary+0x74><== ALWAYS TAKEN
&& !malloc_is_system_state_OK()
) {
return NULL;
}
malloc_deferred_frees_process();
8007120: fb ff fa b5 calli 8005bf4 <malloc_deferred_frees_process>
/* FIXME: Statistics, boundary checks */
return _Protected_heap_Allocate_aligned_with_boundary(
8007124: 78 05 08 02 mvhi r5,0x802
8007128: 38 a5 60 1c ori r5,r5,0x601c
800712c: 28 a1 00 00 lw r1,(r5+0)
8007130: b9 a0 10 00 mv r2,r13
8007134: b9 80 18 00 mv r3,r12
8007138: b9 60 20 00 mv r4,r11
800713c: f8 00 0e d0 calli 800ac7c <_Protected_heap_Allocate_aligned_with_boundary>
8007140: b8 20 28 00 mv r5,r1
RTEMS_Malloc_Heap,
size,
alignment,
boundary
);
}
8007144: b8 a0 08 00 mv r1,r5
8007148: 2b 9d 00 04 lw ra,(sp+4)
800714c: 2b 8b 00 10 lw r11,(sp+16)
8007150: 2b 8c 00 0c lw r12,(sp+12)
8007154: 2b 8d 00 08 lw r13,(sp+8)
8007158: 37 9c 00 10 addi sp,sp,16
800715c: c3 a0 00 00 ret
uintptr_t boundary
)
{
if (
_System_state_Is_up( _System_state_Get() )
&& !malloc_is_system_state_OK()
8007160: fb ff fa 93 calli 8005bac <malloc_is_system_state_OK>
) {
return NULL;
8007164: 34 05 00 00 mvi r5,0
uintptr_t boundary
)
{
if (
_System_state_Is_up( _System_state_Get() )
&& !malloc_is_system_state_OK()
8007168: 5c 20 ff ee bne r1,r0,8007120 <rtems_heap_allocate_aligned_with_boundary+0x34>
800716c: e3 ff ff f6 bi 8007144 <rtems_heap_allocate_aligned_with_boundary+0x58>
0800495c <rtems_io_register_driver>:
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
800495c: 37 9c ff f8 addi sp,sp,-8
8004960: 5b 8b 00 08 sw (sp+8),r11
8004964: 5b 9d 00 04 sw (sp+4),ra
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
8004968: 78 04 08 01 mvhi r4,0x801
800496c: 38 84 ad f0 ori r4,r4,0xadf0
8004970: 28 85 00 08 lw r5,(r4+8)
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
8004974: 78 04 08 01 mvhi r4,0x801
8004978: 38 84 b2 60 ori r4,r4,0xb260
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
800497c: b8 20 58 00 mv r11,r1
rtems_device_major_number major_limit = _IO_Number_of_drivers;
8004980: 28 86 00 00 lw r6,(r4+0)
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
8004984: 34 01 00 12 mvi r1,18
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
8004988: 5c a0 00 33 bne r5,r0,8004a54 <rtems_io_register_driver+0xf8>
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
return RTEMS_INVALID_ADDRESS;
800498c: 34 01 00 09 mvi r1,9
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
8004990: 44 65 00 31 be r3,r5,8004a54 <rtems_io_register_driver+0xf8>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
8004994: 58 66 00 00 sw (r3+0),r6
if ( driver_table == NULL )
8004998: 44 40 00 2f be r2,r0,8004a54 <rtems_io_register_driver+0xf8>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
800499c: 28 45 00 00 lw r5,(r2+0)
80049a0: 44 a0 00 42 be r5,r0,8004aa8 <rtems_io_register_driver+0x14c>
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
80049a4: 34 01 00 0a mvi r1,10
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
80049a8: 51 66 00 2b bgeu r11,r6,8004a54 <rtems_io_register_driver+0xf8>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80049ac: 78 01 08 01 mvhi r1,0x801
80049b0: 38 21 a9 20 ori r1,r1,0xa920
80049b4: 28 25 00 00 lw r5,(r1+0)
80049b8: 34 a5 00 01 addi r5,r5,1
80049bc: 58 25 00 00 sw (r1+0),r5
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
80049c0: 5d 60 00 29 bne r11,r0,8004a64 <rtems_io_register_driver+0x108>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
80049c4: 28 85 00 00 lw r5,(r4+0)
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
80049c8: 44 ab 00 3e be r5,r11,8004ac0 <rtems_io_register_driver+0x164><== NEVER TAKEN
80049cc: 78 06 08 01 mvhi r6,0x801
80049d0: 38 c6 b2 64 ori r6,r6,0xb264
80049d4: 28 c1 00 00 lw r1,(r6+0)
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
80049d8: 28 24 00 00 lw r4,(r1+0)
80049dc: 44 80 00 36 be r4,r0,8004ab4 <rtems_io_register_driver+0x158>
rtems_device_major_number n = _IO_Number_of_drivers;
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
80049e0: 35 6b 00 01 addi r11,r11,1
80049e4: 34 21 00 18 addi r1,r1,24
80049e8: 54 ab ff fc bgu r5,r11,80049d8 <rtems_io_register_driver+0x7c>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
80049ec: 58 6b 00 00 sw (r3+0),r11
if ( m != n )
80049f0: 44 ab 00 35 be r5,r11,8004ac4 <rtems_io_register_driver+0x168>
80049f4: b5 6b 08 00 add r1,r11,r11
80049f8: b4 2b 08 00 add r1,r1,r11
80049fc: b4 21 08 00 add r1,r1,r1
8004a00: b4 21 08 00 add r1,r1,r1
8004a04: b4 21 08 00 add r1,r1,r1
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
8004a08: 28 c3 00 00 lw r3,(r6+0)
8004a0c: 28 44 00 00 lw r4,(r2+0)
8004a10: b4 61 08 00 add r1,r3,r1
8004a14: 58 24 00 00 sw (r1+0),r4
8004a18: 28 43 00 04 lw r3,(r2+4)
8004a1c: 58 23 00 04 sw (r1+4),r3
8004a20: 28 43 00 08 lw r3,(r2+8)
8004a24: 58 23 00 08 sw (r1+8),r3
8004a28: 28 43 00 0c lw r3,(r2+12)
8004a2c: 58 23 00 0c sw (r1+12),r3
8004a30: 28 43 00 10 lw r3,(r2+16)
8004a34: 58 23 00 10 sw (r1+16),r3
8004a38: 28 42 00 14 lw r2,(r2+20)
8004a3c: 58 22 00 14 sw (r1+20),r2
_Thread_Enable_dispatch();
8004a40: f8 00 08 84 calli 8006c50 <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
8004a44: b9 60 08 00 mv r1,r11
8004a48: 34 02 00 00 mvi r2,0
8004a4c: 34 03 00 00 mvi r3,0
8004a50: f8 00 28 66 calli 800ebe8 <rtems_io_initialize>
}
8004a54: 2b 9d 00 04 lw ra,(sp+4)
8004a58: 2b 8b 00 08 lw r11,(sp+8)
8004a5c: 37 9c 00 08 addi sp,sp,8
8004a60: c3 a0 00 00 ret
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
8004a64: b5 6b 08 00 add r1,r11,r11
8004a68: 78 06 08 01 mvhi r6,0x801
8004a6c: b4 2b 08 00 add r1,r1,r11
8004a70: 38 c6 b2 64 ori r6,r6,0xb264
8004a74: b4 21 08 00 add r1,r1,r1
8004a78: 28 c5 00 00 lw r5,(r6+0)
8004a7c: b4 21 08 00 add r1,r1,r1
8004a80: b4 21 08 00 add r1,r1,r1
8004a84: b4 a1 28 00 add r5,r5,r1
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
8004a88: 28 a4 00 00 lw r4,(r5+0)
8004a8c: 44 80 00 11 be r4,r0,8004ad0 <rtems_io_register_driver+0x174>
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
8004a90: f8 00 08 70 calli 8006c50 <_Thread_Enable_dispatch>
return RTEMS_RESOURCE_IN_USE;
8004a94: 34 01 00 0c mvi r1,12
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
8004a98: 2b 9d 00 04 lw ra,(sp+4)
8004a9c: 2b 8b 00 08 lw r11,(sp+8)
8004aa0: 37 9c 00 08 addi sp,sp,8
8004aa4: c3 a0 00 00 ret
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
8004aa8: 28 47 00 04 lw r7,(r2+4)
8004aac: 5c e5 ff be bne r7,r5,80049a4 <rtems_io_register_driver+0x48>
8004ab0: e3 ff ff e9 bi 8004a54 <rtems_io_register_driver+0xf8>
8004ab4: 28 27 00 04 lw r7,(r1+4)
8004ab8: 5c e4 ff ca bne r7,r4,80049e0 <rtems_io_register_driver+0x84>
8004abc: e3 ff ff cc bi 80049ec <rtems_io_register_driver+0x90>
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
8004ac0: 58 60 00 00 sw (r3+0),r0
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
8004ac4: f8 00 08 63 calli 8006c50 <_Thread_Enable_dispatch>
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
8004ac8: 34 01 00 05 mvi r1,5
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
return sc;
8004acc: e3 ff ff e2 bi 8004a54 <rtems_io_register_driver+0xf8>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
8004ad0: 28 a5 00 04 lw r5,(r5+4)
8004ad4: 5c a4 ff ef bne r5,r4,8004a90 <rtems_io_register_driver+0x134>
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
8004ad8: 58 6b 00 00 sw (r3+0),r11
8004adc: e3 ff ff cb bi 8004a08 <rtems_io_register_driver+0xac>
08004ae0 <rtems_io_unregister_driver>:
*/
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
8004ae0: 37 9c ff fc addi sp,sp,-4
8004ae4: 5b 9d 00 04 sw (sp+4),ra
if ( rtems_interrupt_is_in_progress() )
8004ae8: 78 02 08 01 mvhi r2,0x801
8004aec: 38 42 ad f0 ori r2,r2,0xadf0
8004af0: 28 43 00 08 lw r3,(r2+8)
return RTEMS_CALLED_FROM_ISR;
8004af4: 34 02 00 12 mvi r2,18
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
if ( rtems_interrupt_is_in_progress() )
8004af8: 5c 60 00 19 bne r3,r0,8004b5c <rtems_io_unregister_driver+0x7c><== NEVER TAKEN
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
8004afc: 78 02 08 01 mvhi r2,0x801
8004b00: 38 42 b2 60 ori r2,r2,0xb260
8004b04: 28 43 00 00 lw r3,(r2+0)
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
8004b08: 34 02 00 0d mvi r2,13
)
{
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
8004b0c: 50 23 00 14 bgeu r1,r3,8004b5c <rtems_io_unregister_driver+0x7c><== NEVER TAKEN
8004b10: 78 02 08 01 mvhi r2,0x801
8004b14: 38 42 a9 20 ori r2,r2,0xa920
8004b18: 28 43 00 00 lw r3,(r2+0)
8004b1c: 34 63 00 01 addi r3,r3,1
8004b20: 58 43 00 00 sw (r2+0),r3
_Thread_Disable_dispatch();
memset(
8004b24: 78 02 08 01 mvhi r2,0x801
&_IO_Driver_address_table[major],
8004b28: b4 21 18 00 add r3,r1,r1
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
8004b2c: 38 42 b2 64 ori r2,r2,0xb264
&_IO_Driver_address_table[major],
8004b30: b4 61 08 00 add r1,r3,r1
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
8004b34: 28 44 00 00 lw r4,(r2+0)
&_IO_Driver_address_table[major],
8004b38: b4 21 08 00 add r1,r1,r1
8004b3c: b4 21 08 00 add r1,r1,r1
8004b40: b4 21 08 00 add r1,r1,r1
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
8004b44: 34 02 00 00 mvi r2,0
8004b48: 34 03 00 18 mvi r3,24
8004b4c: b4 81 08 00 add r1,r4,r1
8004b50: f8 00 37 b8 calli 8012a30 <memset>
&_IO_Driver_address_table[major],
0,
sizeof( rtems_driver_address_table )
);
_Thread_Enable_dispatch();
8004b54: f8 00 08 3f calli 8006c50 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8004b58: 34 02 00 00 mvi r2,0
}
return RTEMS_UNSATISFIED;
}
8004b5c: b8 40 08 00 mv r1,r2
8004b60: 2b 9d 00 04 lw ra,(sp+4)
8004b64: 37 9c 00 04 addi sp,sp,4
8004b68: c3 a0 00 00 ret
0800636c <rtems_iterate_over_all_threads>:
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
{
800636c: 37 9c ff e4 addi sp,sp,-28
8006370: 5b 8b 00 1c sw (sp+28),r11
8006374: 5b 8c 00 18 sw (sp+24),r12
8006378: 5b 8d 00 14 sw (sp+20),r13
800637c: 5b 8e 00 10 sw (sp+16),r14
8006380: 5b 8f 00 0c sw (sp+12),r15
8006384: 5b 90 00 08 sw (sp+8),r16
8006388: 5b 9d 00 04 sw (sp+4),ra
800638c: b8 20 78 00 mv r15,r1
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
8006390: 44 20 00 19 be r1,r0,80063f4 <rtems_iterate_over_all_threads+0x88><== NEVER TAKEN
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
8006394: 78 01 08 02 mvhi r1,0x802
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
8006398: 78 0e 08 02 mvhi r14,0x802
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
800639c: 38 21 a6 34 ori r1,r1,0xa634
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
80063a0: 39 ce a6 38 ori r14,r14,0xa638
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
80063a4: 34 30 00 10 addi r16,r1,16
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
80063a8: 29 c1 00 00 lw r1,(r14+0)
80063ac: 28 2d 00 04 lw r13,(r1+4)
if ( !information )
80063b0: 45 a0 00 0f be r13,r0,80063ec <rtems_iterate_over_all_threads+0x80>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
80063b4: 2d a3 00 10 lhu r3,(r13+16)
80063b8: 44 60 00 0d be r3,r0,80063ec <rtems_iterate_over_all_threads+0x80>
80063bc: 34 0c 00 04 mvi r12,4
80063c0: 34 0b 00 01 mvi r11,1
the_thread = (Thread_Control *)information->local_table[ i ];
80063c4: 29 a2 00 1c lw r2,(r13+28)
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
80063c8: 35 6b 00 01 addi r11,r11,1
the_thread = (Thread_Control *)information->local_table[ i ];
80063cc: b4 4c 10 00 add r2,r2,r12
80063d0: 28 42 00 00 lw r2,(r2+0)
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
80063d4: 35 8c 00 04 addi r12,r12,4
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
continue;
(*routine)(the_thread);
80063d8: b8 40 08 00 mv r1,r2
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
80063dc: 44 40 00 03 be r2,r0,80063e8 <rtems_iterate_over_all_threads+0x7c>
continue;
(*routine)(the_thread);
80063e0: d9 e0 00 00 call r15
80063e4: 2d a3 00 10 lhu r3,(r13+16)
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
80063e8: 50 6b ff f7 bgeu r3,r11,80063c4 <rtems_iterate_over_all_threads+0x58>
80063ec: 35 ce 00 04 addi r14,r14,4
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
80063f0: 5d d0 ff ee bne r14,r16,80063a8 <rtems_iterate_over_all_threads+0x3c>
(*routine)(the_thread);
}
}
}
80063f4: 2b 9d 00 04 lw ra,(sp+4)
80063f8: 2b 8b 00 1c lw r11,(sp+28)
80063fc: 2b 8c 00 18 lw r12,(sp+24)
8006400: 2b 8d 00 14 lw r13,(sp+20)
8006404: 2b 8e 00 10 lw r14,(sp+16)
8006408: 2b 8f 00 0c lw r15,(sp+12)
800640c: 2b 90 00 08 lw r16,(sp+8)
8006410: 37 9c 00 1c addi sp,sp,28
8006414: c3 a0 00 00 ret
080087f4 <rtems_libio_free>:
*/
void rtems_libio_free(
rtems_libio_t *iop
)
{
80087f4: 37 9c ff f4 addi sp,sp,-12
80087f8: 5b 8b 00 0c sw (sp+12),r11
80087fc: 5b 8c 00 08 sw (sp+8),r12
8008800: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8008804: 78 0c 08 01 mvhi r12,0x801
8008808: 39 8c 47 34 ori r12,r12,0x4734
800880c: b8 20 58 00 mv r11,r1
8008810: 29 81 00 00 lw r1,(r12+0)
8008814: 34 02 00 00 mvi r2,0
8008818: 34 03 00 00 mvi r3,0
800881c: fb ff e9 2e calli 8002cd4 <rtems_semaphore_obtain>
rtems_libio_lock();
if (iop->sem)
8008820: 29 61 00 30 lw r1,(r11+48)
8008824: 44 20 00 02 be r1,r0,800882c <rtems_libio_free+0x38> <== NEVER TAKEN
rtems_semaphore_delete(iop->sem);
8008828: f8 00 04 4b calli 8009954 <rtems_semaphore_delete>
iop->flags &= ~LIBIO_FLAGS_OPEN;
iop->data1 = rtems_libio_iop_freelist;
800882c: 78 02 08 01 mvhi r2,0x801
rtems_libio_lock();
if (iop->sem)
rtems_semaphore_delete(iop->sem);
iop->flags &= ~LIBIO_FLAGS_OPEN;
8008830: 29 65 00 18 lw r5,(r11+24)
iop->data1 = rtems_libio_iop_freelist;
8008834: 38 42 47 30 ori r2,r2,0x4730
8008838: 28 44 00 00 lw r4,(r2+0)
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
800883c: 29 81 00 00 lw r1,(r12+0)
rtems_libio_lock();
if (iop->sem)
rtems_semaphore_delete(iop->sem);
iop->flags &= ~LIBIO_FLAGS_OPEN;
8008840: 34 03 fe ff mvi r3,-257
8008844: a0 a3 18 00 and r3,r5,r3
8008848: 59 63 00 18 sw (r11+24),r3
iop->data1 = rtems_libio_iop_freelist;
800884c: 59 64 00 38 sw (r11+56),r4
rtems_libio_iop_freelist = iop;
8008850: 58 4b 00 00 sw (r2+0),r11
8008854: fb ff e9 7c calli 8002e44 <rtems_semaphore_release>
rtems_libio_unlock();
}
8008858: 2b 9d 00 04 lw ra,(sp+4)
800885c: 2b 8b 00 0c lw r11,(sp+12)
8008860: 2b 8c 00 08 lw r12,(sp+8)
8008864: 37 9c 00 0c addi sp,sp,12
8008868: c3 a0 00 00 ret
08001610 <rtems_libio_init>:
*
* Called by BSP startup code to initialize the libio subsystem.
*/
void rtems_libio_init( void )
{
8001610: 37 9c ff f8 addi sp,sp,-8
8001614: 5b 8b 00 08 sw (sp+8),r11
8001618: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code rc;
uint32_t i;
rtems_libio_t *iop;
if (rtems_libio_number_iops > 0)
800161c: 78 01 08 01 mvhi r1,0x801
8001620: 38 21 40 10 ori r1,r1,0x4010
8001624: 28 2b 00 00 lw r11,(r1+0)
8001628: 45 60 00 1d be r11,r0,800169c <rtems_libio_init+0x8c> <== NEVER TAKEN
{
rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
800162c: 34 02 00 40 mvi r2,64
8001630: b9 60 08 00 mv r1,r11
8001634: fb ff ff 05 calli 8001248 <calloc>
8001638: 78 02 08 01 mvhi r2,0x801
800163c: 38 42 47 2c ori r2,r2,0x472c
8001640: 58 41 00 00 sw (r2+0),r1
8001644: b8 20 18 00 mv r3,r1
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
8001648: 44 20 00 2a be r1,r0,80016f0 <rtems_libio_init+0xe0>
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
800164c: 78 02 08 01 mvhi r2,0x801
8001650: 38 42 47 30 ori r2,r2,0x4730
8001654: 58 41 00 00 sw (r2+0),r1
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
8001658: 34 02 00 01 mvi r2,1
800165c: 50 4b 00 0f bgeu r2,r11,8001698 <rtems_libio_init+0x88> <== NEVER TAKEN
* rtems_libio_init
*
* Called by BSP startup code to initialize the libio subsystem.
*/
void rtems_libio_init( void )
8001660: 34 22 00 40 addi r2,r1,64
8001664: 34 03 00 01 mvi r3,1
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
iop->data1 = iop + 1;
8001668: 58 42 ff f8 sw (r2+-8),r2
800166c: 34 63 00 01 addi r3,r3,1
8001670: 34 42 00 40 addi r2,r2,64
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
8001674: 5c 6b ff fd bne r3,r11,8001668 <rtems_libio_init+0x58>
* rtems_libio_init
*
* Called by BSP startup code to initialize the libio subsystem.
*/
void rtems_libio_init( void )
8001678: 34 63 ff ff addi r3,r3,-1
800167c: b4 63 18 00 add r3,r3,r3
8001680: b4 63 18 00 add r3,r3,r3
8001684: b4 63 18 00 add r3,r3,r3
8001688: b4 63 18 00 add r3,r3,r3
800168c: b4 63 18 00 add r3,r3,r3
8001690: b4 63 18 00 add r3,r3,r3
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
8001694: b4 23 18 00 add r3,r1,r3
iop->data1 = iop + 1;
iop->data1 = NULL;
8001698: 58 60 00 38 sw (r3+56),r0
/*
* Create the binary semaphore used to provide mutual exclusion
* on the IOP Table.
*/
rc = rtems_semaphore_create(
800169c: 78 02 08 01 mvhi r2,0x801
80016a0: 38 42 34 2c ori r2,r2,0x342c
80016a4: 28 41 00 00 lw r1,(r2+0)
80016a8: 78 05 08 01 mvhi r5,0x801
80016ac: 34 03 00 54 mvi r3,84
80016b0: 34 02 00 01 mvi r2,1
80016b4: 34 04 00 00 mvi r4,0
80016b8: 38 a5 47 34 ori r5,r5,0x4734
80016bc: f8 00 05 02 calli 8002ac4 <rtems_semaphore_create>
80016c0: b8 20 18 00 mv r3,r1
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&rtems_libio_semaphore
);
if ( rc != RTEMS_SUCCESSFUL )
80016c4: 5c 20 00 0a bne r1,r0,80016ec <rtems_libio_init+0xdc> <== NEVER TAKEN
/*
* Initialize the base file system infrastructure.
*/
if (rtems_fs_init_helper)
80016c8: 78 02 08 01 mvhi r2,0x801
80016cc: 38 42 40 0c ori r2,r2,0x400c
80016d0: 28 41 00 00 lw r1,(r2+0)
80016d4: 44 23 00 02 be r1,r3,80016dc <rtems_libio_init+0xcc> <== NEVER TAKEN
(* rtems_fs_init_helper)();
80016d8: d8 20 00 00 call r1
}
80016dc: 2b 9d 00 04 lw ra,(sp+4)
80016e0: 2b 8b 00 08 lw r11,(sp+8)
80016e4: 37 9c 00 08 addi sp,sp,8
80016e8: c3 a0 00 00 ret
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&rtems_libio_semaphore
);
if ( rc != RTEMS_SUCCESSFUL )
rtems_fatal_error_occurred( rc );
80016ec: f8 00 07 58 calli 800344c <rtems_fatal_error_occurred> <== NOT EXECUTED
if (rtems_libio_number_iops > 0)
{
rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
80016f0: 34 01 00 1a mvi r1,26
80016f4: f8 00 07 56 calli 800344c <rtems_fatal_error_occurred>
08008914 <rtems_libio_is_file_open>:
*/
int rtems_libio_is_file_open(
void *node_access
)
{
8008914: 37 9c ff f0 addi sp,sp,-16
8008918: 5b 8b 00 10 sw (sp+16),r11
800891c: 5b 8c 00 0c sw (sp+12),r12
8008920: 5b 8d 00 08 sw (sp+8),r13
8008924: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8008928: 78 0c 08 01 mvhi r12,0x801
800892c: 39 8c 47 34 ori r12,r12,0x4734
8008930: b8 20 58 00 mv r11,r1
8008934: 29 81 00 00 lw r1,(r12+0)
8008938: 34 02 00 00 mvi r2,0
800893c: 34 03 00 00 mvi r3,0
8008940: fb ff e8 e5 calli 8002cd4 <rtems_semaphore_obtain>
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
8008944: 78 01 08 01 mvhi r1,0x801
8008948: 38 21 40 10 ori r1,r1,0x4010
800894c: 28 25 00 00 lw r5,(r1+0)
8008950: 78 01 08 01 mvhi r1,0x801
8008954: 38 21 47 2c ori r1,r1,0x472c
8008958: 28 22 00 00 lw r2,(r1+0)
int rtems_libio_is_file_open(
void *node_access
)
{
rtems_libio_t *iop;
int result=0;
800895c: 34 0d 00 00 mvi r13,0
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
8008960: 44 a0 00 0c be r5,r0,8008990 <rtems_libio_is_file_open+0x7c><== NEVER TAKEN
8008964: 34 03 00 00 mvi r3,0
if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) {
8008968: 28 44 00 18 lw r4,(r2+24)
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
800896c: 34 63 00 01 addi r3,r3,1
if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) {
8008970: 20 84 01 00 andi r4,r4,0x100
8008974: 44 80 00 03 be r4,r0,8008980 <rtems_libio_is_file_open+0x6c>
/*
* Check if this node is under the file system that we
* are trying to dismount.
*/
if ( iop->pathinfo.node_access == node_access ) {
8008978: 28 41 00 1c lw r1,(r2+28)
800897c: 44 2b 00 0e be r1,r11,80089b4 <rtems_libio_is_file_open+0xa0>
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
8008980: 50 65 00 03 bgeu r3,r5,800898c <rtems_libio_is_file_open+0x78>
8008984: 34 42 00 40 addi r2,r2,64
8008988: e3 ff ff f8 bi 8008968 <rtems_libio_is_file_open+0x54>
int rtems_libio_is_file_open(
void *node_access
)
{
rtems_libio_t *iop;
int result=0;
800898c: 34 0d 00 00 mvi r13,0
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
8008990: 29 81 00 00 lw r1,(r12+0)
8008994: fb ff e9 2c calli 8002e44 <rtems_semaphore_release>
}
rtems_libio_unlock();
return result;
}
8008998: b9 a0 08 00 mv r1,r13
800899c: 2b 9d 00 04 lw ra,(sp+4)
80089a0: 2b 8b 00 10 lw r11,(sp+16)
80089a4: 2b 8c 00 0c lw r12,(sp+12)
80089a8: 2b 8d 00 08 lw r13,(sp+8)
80089ac: 37 9c 00 10 addi sp,sp,16
80089b0: c3 a0 00 00 ret
* Check if this node is under the file system that we
* are trying to dismount.
*/
if ( iop->pathinfo.node_access == node_access ) {
result = 1;
80089b4: 34 0d 00 01 mvi r13,1
80089b8: e3 ff ff f6 bi 8008990 <rtems_libio_is_file_open+0x7c>
0800886c <rtems_libio_is_open_files_in_fs>:
*/
int rtems_libio_is_open_files_in_fs(
rtems_filesystem_mount_table_entry_t * fs_mt_entry
)
{
800886c: 37 9c ff f0 addi sp,sp,-16
8008870: 5b 8b 00 10 sw (sp+16),r11
8008874: 5b 8c 00 0c sw (sp+12),r12
8008878: 5b 8d 00 08 sw (sp+8),r13
800887c: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8008880: 78 0c 08 01 mvhi r12,0x801
8008884: 39 8c 47 34 ori r12,r12,0x4734
8008888: b8 20 58 00 mv r11,r1
800888c: 29 81 00 00 lw r1,(r12+0)
8008890: 34 02 00 00 mvi r2,0
8008894: 34 03 00 00 mvi r3,0
8008898: fb ff e9 0f calli 8002cd4 <rtems_semaphore_obtain>
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
800889c: 78 01 08 01 mvhi r1,0x801
80088a0: 38 21 40 10 ori r1,r1,0x4010
80088a4: 28 25 00 00 lw r5,(r1+0)
80088a8: 78 01 08 01 mvhi r1,0x801
80088ac: 38 21 47 2c ori r1,r1,0x472c
80088b0: 28 22 00 00 lw r2,(r1+0)
int rtems_libio_is_open_files_in_fs(
rtems_filesystem_mount_table_entry_t * fs_mt_entry
)
{
rtems_libio_t *iop;
int result = 0;
80088b4: 34 0d 00 00 mvi r13,0
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
80088b8: 44 a0 00 0c be r5,r0,80088e8 <rtems_libio_is_open_files_in_fs+0x7c><== NEVER TAKEN
80088bc: 34 03 00 00 mvi r3,0
if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) {
80088c0: 28 44 00 18 lw r4,(r2+24)
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
80088c4: 34 63 00 01 addi r3,r3,1
if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) {
80088c8: 20 84 01 00 andi r4,r4,0x100
80088cc: 44 80 00 03 be r4,r0,80088d8 <rtems_libio_is_open_files_in_fs+0x6c>
/*
* Check if this node is under the file system that we
* are trying to dismount.
*/
if ( iop->pathinfo.mt_entry == fs_mt_entry ) {
80088d0: 28 41 00 2c lw r1,(r2+44)
80088d4: 44 2b 00 0e be r1,r11,800890c <rtems_libio_is_open_files_in_fs+0xa0>
/*
* Look for any active file descriptor entry.
*/
for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){
80088d8: 50 65 00 03 bgeu r3,r5,80088e4 <rtems_libio_is_open_files_in_fs+0x78>
80088dc: 34 42 00 40 addi r2,r2,64
80088e0: e3 ff ff f8 bi 80088c0 <rtems_libio_is_open_files_in_fs+0x54>
int rtems_libio_is_open_files_in_fs(
rtems_filesystem_mount_table_entry_t * fs_mt_entry
)
{
rtems_libio_t *iop;
int result = 0;
80088e4: 34 0d 00 00 mvi r13,0
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
80088e8: 29 81 00 00 lw r1,(r12+0)
80088ec: fb ff e9 56 calli 8002e44 <rtems_semaphore_release>
}
rtems_libio_unlock();
return result;
}
80088f0: b9 a0 08 00 mv r1,r13
80088f4: 2b 9d 00 04 lw ra,(sp+4)
80088f8: 2b 8b 00 10 lw r11,(sp+16)
80088fc: 2b 8c 00 0c lw r12,(sp+12)
8008900: 2b 8d 00 08 lw r13,(sp+8)
8008904: 37 9c 00 10 addi sp,sp,16
8008908: c3 a0 00 00 ret
* Check if this node is under the file system that we
* are trying to dismount.
*/
if ( iop->pathinfo.mt_entry == fs_mt_entry ) {
result = 1;
800890c: 34 0d 00 01 mvi r13,1
8008910: e3 ff ff f6 bi 80088e8 <rtems_libio_is_open_files_in_fs+0x7c>
08002d38 <rtems_libio_set_private_env>:
rtems_status_code rtems_libio_set_private_env(void)
{
8002d38: 37 9c ff b8 addi sp,sp,-72
8002d3c: 5b 8b 00 20 sw (sp+32),r11
8002d40: 5b 8c 00 1c sw (sp+28),r12
8002d44: 5b 8d 00 18 sw (sp+24),r13
8002d48: 5b 8e 00 14 sw (sp+20),r14
8002d4c: 5b 8f 00 10 sw (sp+16),r15
8002d50: 5b 90 00 0c sw (sp+12),r16
8002d54: 5b 91 00 08 sw (sp+8),r17
8002d58: 5b 9d 00 04 sw (sp+4),ra
rtems_filesystem_location_info_t root_loc;
rtems_filesystem_location_info_t current_loc;
rtems_user_env_t *new_env = NULL;
int rv = 0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
8002d5c: 78 0b 08 01 mvhi r11,0x801
}
rtems_status_code rtems_libio_set_private_env(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_id task_id = rtems_task_self();
8002d60: f8 00 03 73 calli 8003b2c <rtems_task_self>
rtems_filesystem_location_info_t root_loc;
rtems_filesystem_location_info_t current_loc;
rtems_user_env_t *new_env = NULL;
int rv = 0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
8002d64: 39 6b 38 9c ori r11,r11,0x389c
8002d68: 37 8d 00 38 addi r13,sp,56
8002d6c: 34 02 00 01 mvi r2,1
}
rtems_status_code rtems_libio_set_private_env(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_id task_id = rtems_task_self();
8002d70: b8 20 78 00 mv r15,r1
rtems_filesystem_location_info_t root_loc;
rtems_filesystem_location_info_t current_loc;
rtems_user_env_t *new_env = NULL;
int rv = 0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
8002d74: 34 03 00 00 mvi r3,0
8002d78: b9 60 08 00 mv r1,r11
8002d7c: b9 a0 20 00 mv r4,r13
8002d80: 34 05 00 00 mvi r5,0
8002d84: fb ff fa 6c calli 8001734 <rtems_filesystem_evaluate_path>
8002d88: b8 20 60 00 mv r12,r1
error_1:
rtems_filesystem_freenode(&root_loc);
error_0:
return RTEMS_NO_MEMORY;
8002d8c: 34 02 00 1a mvi r2,26
rtems_filesystem_location_info_t current_loc;
rtems_user_env_t *new_env = NULL;
int rv = 0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
if (rv != 0)
8002d90: 44 20 00 0c be r1,r0,8002dc0 <rtems_libio_set_private_env+0x88><== ALWAYS TAKEN
error_1:
rtems_filesystem_freenode(&root_loc);
error_0:
return RTEMS_NO_MEMORY;
}
8002d94: b8 40 08 00 mv r1,r2
8002d98: 2b 9d 00 04 lw ra,(sp+4)
8002d9c: 2b 8b 00 20 lw r11,(sp+32)
8002da0: 2b 8c 00 1c lw r12,(sp+28)
8002da4: 2b 8d 00 18 lw r13,(sp+24)
8002da8: 2b 8e 00 14 lw r14,(sp+20)
8002dac: 2b 8f 00 10 lw r15,(sp+16)
8002db0: 2b 90 00 0c lw r16,(sp+12)
8002db4: 2b 91 00 08 lw r17,(sp+8)
8002db8: 37 9c 00 48 addi sp,sp,72
8002dbc: c3 a0 00 00 ret
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
if (rv != 0)
goto error_0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, ¤t_loc, 0);
8002dc0: 37 90 00 24 addi r16,sp,36
8002dc4: b9 60 08 00 mv r1,r11
8002dc8: 34 02 00 01 mvi r2,1
8002dcc: 34 03 00 00 mvi r3,0
8002dd0: ba 00 20 00 mv r4,r16
8002dd4: 34 05 00 00 mvi r5,0
8002dd8: fb ff fa 57 calli 8001734 <rtems_filesystem_evaluate_path>
if (rv != 0)
8002ddc: 5c 2c 00 53 bne r1,r12,8002f28 <rtems_libio_set_private_env+0x1f0><== NEVER TAKEN
* Bharath: I'm not sure if the check can be reduced to
* if( rtems_current_user_env->task_id != task_id ) {
*/
if (
rtems_current_user_env == &rtems_global_user_env
8002de0: 78 0e 08 01 mvhi r14,0x801
8002de4: 39 ce 51 08 ori r14,r14,0x5108
8002de8: 29 cb 00 00 lw r11,(r14+0)
/*
* Bharath: I'm not sure if the check can be reduced to
* if( rtems_current_user_env->task_id != task_id ) {
*/
if (
8002dec: 78 0c 08 01 mvhi r12,0x801
8002df0: 39 8c 57 50 ori r12,r12,0x5750
8002df4: 45 6c 00 03 be r11,r12,8002e00 <rtems_libio_set_private_env+0xc8>
rtems_current_user_env == &rtems_global_user_env
|| rtems_current_user_env->task_id != task_id
8002df8: 29 61 00 00 lw r1,(r11+0)
8002dfc: 44 2f 00 0c be r1,r15,8002e2c <rtems_libio_set_private_env+0xf4>
) {
new_env = malloc(sizeof(rtems_user_env_t));
8002e00: 34 01 00 48 mvi r1,72
8002e04: fb ff fc 86 calli 800201c <malloc>
8002e08: b8 20 58 00 mv r11,r1
if (new_env == NULL)
8002e0c: 44 20 00 45 be r1,r0,8002f20 <rtems_libio_set_private_env+0x1e8>
#ifdef HAVE_USERENV_REFCNT
new_env->refcnt = 1;
#endif
sc = rtems_task_variable_add(
8002e10: 78 03 08 00 mvhi r3,0x800
8002e14: 34 01 00 00 mvi r1,0
8002e18: b9 c0 10 00 mv r2,r14
8002e1c: 38 63 2c f4 ori r3,r3,0x2cf4
8002e20: f8 00 03 75 calli 8003bf4 <rtems_task_variable_add>
RTEMS_SELF,
(void*)&rtems_current_user_env,
(void(*)(void *))free_user_env
);
if (sc != RTEMS_SUCCESSFUL)
8002e24: 5c 20 00 3d bne r1,r0,8002f18 <rtems_libio_set_private_env+0x1e0>
goto error_3;
rtems_current_user_env = new_env;
8002e28: 59 cb 00 00 sw (r14+0),r11
}
/* Inherit the global values */
*rtems_current_user_env = rtems_global_user_env;
8002e2c: 29 81 00 00 lw r1,(r12+0)
* be freed when deleting the environment.
*/
rtems_filesystem_root = root_loc;
rtems_filesystem_current = current_loc;
return RTEMS_SUCCESSFUL;
8002e30: 34 02 00 00 mvi r2,0
rtems_current_user_env = new_env;
}
/* Inherit the global values */
*rtems_current_user_env = rtems_global_user_env;
8002e34: 59 61 00 00 sw (r11+0),r1
8002e38: 29 81 00 04 lw r1,(r12+4)
8002e3c: 59 61 00 04 sw (r11+4),r1
8002e40: 29 81 00 08 lw r1,(r12+8)
8002e44: 59 61 00 08 sw (r11+8),r1
8002e48: 29 81 00 0c lw r1,(r12+12)
8002e4c: 59 61 00 0c sw (r11+12),r1
8002e50: 29 81 00 10 lw r1,(r12+16)
8002e54: 59 61 00 10 sw (r11+16),r1
8002e58: 29 81 00 14 lw r1,(r12+20)
8002e5c: 59 61 00 14 sw (r11+20),r1
8002e60: 29 81 00 18 lw r1,(r12+24)
8002e64: 59 61 00 18 sw (r11+24),r1
8002e68: 29 81 00 1c lw r1,(r12+28)
8002e6c: 59 61 00 1c sw (r11+28),r1
8002e70: 29 81 00 20 lw r1,(r12+32)
8002e74: 59 61 00 20 sw (r11+32),r1
8002e78: 29 81 00 24 lw r1,(r12+36)
8002e7c: 59 61 00 24 sw (r11+36),r1
8002e80: 29 81 00 28 lw r1,(r12+40)
8002e84: 59 61 00 28 sw (r11+40),r1
8002e88: 29 81 00 2c lw r1,(r12+44)
8002e8c: 59 61 00 2c sw (r11+44),r1
8002e90: 29 81 00 30 lw r1,(r12+48)
8002e94: 59 61 00 30 sw (r11+48),r1
8002e98: 29 81 00 34 lw r1,(r12+52)
8002e9c: 59 61 00 34 sw (r11+52),r1
8002ea0: 29 81 00 38 lw r1,(r12+56)
8002ea4: 59 61 00 38 sw (r11+56),r1
8002ea8: 29 81 00 3c lw r1,(r12+60)
8002eac: 59 61 00 3c sw (r11+60),r1
8002eb0: 29 81 00 40 lw r1,(r12+64)
8002eb4: 59 61 00 40 sw (r11+64),r1
8002eb8: 29 81 00 44 lw r1,(r12+68)
rtems_current_user_env->task_id = task_id;
8002ebc: 59 6f 00 00 sw (r11+0),r15
rtems_current_user_env = new_env;
}
/* Inherit the global values */
*rtems_current_user_env = rtems_global_user_env;
8002ec0: 59 61 00 44 sw (r11+68),r1
* Clone the pathlocs. In contrast to most other code we must _not_ free the
* original locs because what we are trying to do here is forking off clones.
* The reason is a pathloc can be allocated by the file system and needs to
* be freed when deleting the environment.
*/
rtems_filesystem_root = root_loc;
8002ec4: 2b 81 00 38 lw r1,(sp+56)
8002ec8: 59 61 00 18 sw (r11+24),r1
8002ecc: 2b 81 00 3c lw r1,(sp+60)
8002ed0: 59 61 00 1c sw (r11+28),r1
8002ed4: 2b 81 00 40 lw r1,(sp+64)
8002ed8: 59 61 00 20 sw (r11+32),r1
8002edc: 2b 81 00 44 lw r1,(sp+68)
8002ee0: 59 61 00 24 sw (r11+36),r1
8002ee4: 2b 81 00 48 lw r1,(sp+72)
8002ee8: 59 61 00 28 sw (r11+40),r1
rtems_filesystem_current = current_loc;
8002eec: 2b 81 00 24 lw r1,(sp+36)
8002ef0: 59 61 00 04 sw (r11+4),r1
8002ef4: 2b 81 00 28 lw r1,(sp+40)
8002ef8: 59 61 00 08 sw (r11+8),r1
8002efc: 2b 81 00 2c lw r1,(sp+44)
8002f00: 59 61 00 0c sw (r11+12),r1
8002f04: 2b 81 00 30 lw r1,(sp+48)
8002f08: 59 61 00 10 sw (r11+16),r1
8002f0c: 2b 81 00 34 lw r1,(sp+52)
8002f10: 59 61 00 14 sw (r11+20),r1
return RTEMS_SUCCESSFUL;
8002f14: e3 ff ff a0 bi 8002d94 <rtems_libio_set_private_env+0x5c>
error_3:
free(new_env);
8002f18: b9 60 08 00 mv r1,r11
8002f1c: fb ff fa 5c calli 800188c <free>
error_2:
rtems_filesystem_freenode(¤t_loc);
8002f20: ba 00 08 00 mv r1,r16
8002f24: fb ff fa 52 calli 800186c <rtems_filesystem_freenode>
error_1:
rtems_filesystem_freenode(&root_loc);
8002f28: b9 a0 08 00 mv r1,r13
8002f2c: fb ff fa 50 calli 800186c <rtems_filesystem_freenode>
error_0:
return RTEMS_NO_MEMORY;
8002f30: 34 02 00 1a mvi r2,26
8002f34: e3 ff ff 98 bi 8002d94 <rtems_libio_set_private_env+0x5c>
08002f38 <rtems_libio_share_private_env>:
* b) mutex access to rtems_filesystem_current, rtems_filesytem_root
* while changing any of those (chdir(), chroot()).
*/
rtems_status_code rtems_libio_share_private_env(rtems_id task_id)
{
8002f38: 37 9c ff e8 addi sp,sp,-24
8002f3c: 5b 8b 00 14 sw (sp+20),r11
8002f40: 5b 8c 00 10 sw (sp+16),r12
8002f44: 5b 8d 00 0c sw (sp+12),r13
8002f48: 5b 8e 00 08 sw (sp+8),r14
8002f4c: 5b 9d 00 04 sw (sp+4),ra
8002f50: b8 20 68 00 mv r13,r1
rtems_id current_task_id;
/*
* get current task id
*/
current_task_id = rtems_task_self();
8002f54: f8 00 02 f6 calli 8003b2c <rtems_task_self>
8002f58: b8 20 70 00 mv r14,r1
* If this was an attempt to share the task with self,
* if somebody wanted to do it... Lets tell them, its shared
*/
if( task_id == current_task_id )
return RTEMS_SUCCESSFUL;
8002f5c: 34 0b 00 00 mvi r11,0
/*
* If this was an attempt to share the task with self,
* if somebody wanted to do it... Lets tell them, its shared
*/
if( task_id == current_task_id )
8002f60: 45 a1 00 0e be r13,r1,8002f98 <rtems_libio_share_private_env+0x60><== NEVER TAKEN
return RTEMS_SUCCESSFUL;
/*
* Try to get the requested user environment
*/
sc = rtems_task_variable_get(
8002f64: 78 0c 08 01 mvhi r12,0x801
8002f68: 39 8c 51 08 ori r12,r12,0x5108
8002f6c: b9 a0 08 00 mv r1,r13
8002f70: b9 80 10 00 mv r2,r12
8002f74: 37 83 00 18 addi r3,sp,24
8002f78: f8 00 03 5e calli 8003cf0 <rtems_task_variable_get>
8002f7c: b8 20 58 00 mv r11,r1
(void*)&shared_user_env );
/*
* If it was not successful, return the error code
*/
if (sc != RTEMS_SUCCESSFUL)
8002f80: 5c 20 00 06 bne r1,r0,8002f98 <rtems_libio_share_private_env+0x60>
* If we have a current environment in place, we need to
* free it, since we will be sharing the variable with the
* shared_user_env
*/
if (rtems_current_user_env->task_id==current_task_id) {
8002f84: 29 81 00 00 lw r1,(r12+0)
8002f88: 28 22 00 00 lw r2,(r1+0)
8002f8c: 44 4e 00 0b be r2,r14,8002fb8 <rtems_libio_share_private_env+0x80>
rtems_user_env_t *tmp = rtems_current_user_env;
free_user_env( tmp );
}
/* the current_user_env is the same pointer that remote env */
rtems_current_user_env = shared_user_env;
8002f90: 2b 81 00 18 lw r1,(sp+24)
8002f94: 59 81 00 00 sw (r12+0),r1
#ifdef HAVE_USERENV_REFCNT
rtems_current_user_env->refcnt++;
#endif
return RTEMS_SUCCESSFUL;
}
8002f98: b9 60 08 00 mv r1,r11
8002f9c: 2b 9d 00 04 lw ra,(sp+4)
8002fa0: 2b 8b 00 14 lw r11,(sp+20)
8002fa4: 2b 8c 00 10 lw r12,(sp+16)
8002fa8: 2b 8d 00 0c lw r13,(sp+12)
8002fac: 2b 8e 00 08 lw r14,(sp+8)
8002fb0: 37 9c 00 18 addi sp,sp,24
8002fb4: c3 a0 00 00 ret
* shared_user_env
*/
if (rtems_current_user_env->task_id==current_task_id) {
rtems_user_env_t *tmp = rtems_current_user_env;
free_user_env( tmp );
8002fb8: fb ff ff 4f calli 8002cf4 <free_user_env>
8002fbc: e3 ff ff f5 bi 8002f90 <rtems_libio_share_private_env+0x58>
080086b4 <rtems_libio_to_fcntl_flags>:
uint32_t flags
)
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
80086b4: 20 24 00 06 andi r4,r1,0x6
80086b8: 34 03 00 06 mvi r3,6
fcntl_flags |= O_RDWR;
80086bc: 34 02 00 02 mvi r2,2
uint32_t flags
)
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
80086c0: 44 83 00 04 be r4,r3,80086d0 <rtems_libio_to_fcntl_flags+0x1c>
fcntl_flags |= O_RDWR;
} else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) {
80086c4: 20 23 00 02 andi r3,r1,0x2
fcntl_flags |= O_RDONLY;
80086c8: 34 02 00 00 mvi r2,0
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
fcntl_flags |= O_RDWR;
} else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) {
80086cc: 44 60 00 0c be r3,r0,80086fc <rtems_libio_to_fcntl_flags+0x48><== NEVER TAKEN
fcntl_flags |= O_RDONLY;
} else if ( (flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) {
fcntl_flags |= O_WRONLY;
}
if ( (flags & LIBIO_FLAGS_NO_DELAY) == LIBIO_FLAGS_NO_DELAY ) {
80086d0: 20 23 00 01 andi r3,r1,0x1
80086d4: 44 60 00 02 be r3,r0,80086dc <rtems_libio_to_fcntl_flags+0x28>
fcntl_flags |= O_NONBLOCK;
80086d8: 38 42 40 00 ori r2,r2,0x4000
}
if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) {
80086dc: 20 23 02 00 andi r3,r1,0x200
80086e0: 44 60 00 02 be r3,r0,80086e8 <rtems_libio_to_fcntl_flags+0x34>
fcntl_flags |= O_APPEND;
80086e4: 38 42 00 08 ori r2,r2,0x8
}
if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) {
80086e8: 20 21 04 00 andi r1,r1,0x400
80086ec: 44 20 00 02 be r1,r0,80086f4 <rtems_libio_to_fcntl_flags+0x40>
fcntl_flags |= O_CREAT;
80086f0: 38 42 02 00 ori r2,r2,0x200
}
return fcntl_flags;
}
80086f4: b8 40 08 00 mv r1,r2
80086f8: c3 a0 00 00 ret
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
fcntl_flags |= O_RDWR;
} else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) {
fcntl_flags |= O_RDONLY;
} else if ( (flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) {
80086fc: 20 22 00 04 andi r2,r1,0x4 <== NOT EXECUTED
)
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
fcntl_flags |= O_RDWR;
8008700: 7c 42 00 00 cmpnei r2,r2,0 <== NOT EXECUTED
8008704: e3 ff ff f3 bi 80086d0 <rtems_libio_to_fcntl_flags+0x1c> <== NOT EXECUTED
08006124 <rtems_malloc_statistics_at_free>:
* size and thus we skip updating the statistics.
*/
static void rtems_malloc_statistics_at_free(
void *pointer
)
{
8006124: 37 9c ff f8 addi sp,sp,-8
8006128: 5b 9d 00 04 sw (sp+4),ra
uintptr_t size;
if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) {
800612c: 78 03 08 02 mvhi r3,0x802
8006130: 38 63 60 1c ori r3,r3,0x601c
* size and thus we skip updating the statistics.
*/
static void rtems_malloc_statistics_at_free(
void *pointer
)
{
8006134: b8 20 10 00 mv r2,r1
uintptr_t size;
if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) {
8006138: 28 61 00 00 lw r1,(r3+0)
800613c: 37 83 00 08 addi r3,sp,8
8006140: f8 00 13 18 calli 800ada0 <_Protected_heap_Get_block_size>
8006144: 44 20 00 0b be r1,r0,8006170 <rtems_malloc_statistics_at_free+0x4c><== NEVER TAKEN
MSBUMP(lifetime_freed, size);
8006148: 78 01 08 02 mvhi r1,0x802
800614c: 38 21 70 58 ori r1,r1,0x7058
8006150: 2b 83 00 08 lw r3,(sp+8)
8006154: 28 22 00 2c lw r2,(r1+44)
8006158: 28 24 00 28 lw r4,(r1+40)
800615c: b4 62 10 00 add r2,r3,r2
8006160: f4 62 18 00 cmpgu r3,r3,r2
8006164: 58 22 00 2c sw (r1+44),r2
8006168: b4 64 10 00 add r2,r3,r4
800616c: 58 22 00 28 sw (r1+40),r2
}
}
8006170: 2b 9d 00 04 lw ra,(sp+4)
8006174: 37 9c 00 08 addi sp,sp,8
8006178: c3 a0 00 00 ret
0800617c <rtems_malloc_statistics_at_malloc>:
}
static void rtems_malloc_statistics_at_malloc(
void *pointer
)
{
800617c: 37 9c ff f8 addi sp,sp,-8
8006180: 5b 9d 00 04 sw (sp+4),ra
uintptr_t actual_size = 0;
8006184: 5b 80 00 08 sw (sp+8),r0
}
static void rtems_malloc_statistics_at_malloc(
void *pointer
)
{
8006188: b8 20 10 00 mv r2,r1
uintptr_t actual_size = 0;
uint32_t current_depth;
rtems_malloc_statistics_t *s = &rtems_malloc_statistics;
if ( !pointer )
800618c: 44 20 00 15 be r1,r0,80061e0 <rtems_malloc_statistics_at_malloc+0x64><== NEVER TAKEN
return;
_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size);
8006190: 78 03 08 02 mvhi r3,0x802
8006194: 38 63 60 1c ori r3,r3,0x601c
8006198: 28 61 00 00 lw r1,(r3+0)
800619c: 37 83 00 08 addi r3,sp,8
80061a0: f8 00 13 00 calli 800ada0 <_Protected_heap_Get_block_size>
MSBUMP(lifetime_allocated, actual_size);
80061a4: 78 01 08 02 mvhi r1,0x802
80061a8: 38 21 70 58 ori r1,r1,0x7058
80061ac: 2b 83 00 08 lw r3,(sp+8)
80061b0: 28 22 00 24 lw r2,(r1+36)
80061b4: 28 26 00 20 lw r6,(r1+32)
current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed);
80061b8: 28 25 00 2c lw r5,(r1+44)
if ( !pointer )
return;
_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size);
MSBUMP(lifetime_allocated, actual_size);
80061bc: b4 62 10 00 add r2,r3,r2
80061c0: f4 62 18 00 cmpgu r3,r3,r2
current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed);
if (current_depth > s->max_depth)
80061c4: 28 24 00 18 lw r4,(r1+24)
if ( !pointer )
return;
_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size);
MSBUMP(lifetime_allocated, actual_size);
80061c8: b4 66 18 00 add r3,r3,r6
80061cc: 58 22 00 24 sw (r1+36),r2
80061d0: 58 23 00 20 sw (r1+32),r3
current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed);
80061d4: c8 45 10 00 sub r2,r2,r5
if (current_depth > s->max_depth)
80061d8: 50 82 00 02 bgeu r4,r2,80061e0 <rtems_malloc_statistics_at_malloc+0x64>
s->max_depth = current_depth;
80061dc: 58 22 00 18 sw (r1+24),r2
}
80061e0: 2b 9d 00 04 lw ra,(sp+4)
80061e4: 37 9c 00 08 addi sp,sp,8
80061e8: c3 a0 00 00 ret
0800d308 <rtems_memalign>:
int rtems_memalign(
void **pointer,
size_t alignment,
size_t size
)
{
800d308: 37 9c ff ec addi sp,sp,-20
800d30c: 5b 8b 00 14 sw (sp+20),r11
800d310: 5b 8c 00 10 sw (sp+16),r12
800d314: 5b 8d 00 0c sw (sp+12),r13
800d318: 5b 8e 00 08 sw (sp+8),r14
800d31c: 5b 9d 00 04 sw (sp+4),ra
/*
* Parameter error checks
*/
if ( !pointer )
return EINVAL;
800d320: 34 0c 00 16 mvi r12,22
int rtems_memalign(
void **pointer,
size_t alignment,
size_t size
)
{
800d324: b8 20 58 00 mv r11,r1
800d328: b8 40 68 00 mv r13,r2
800d32c: b8 60 70 00 mv r14,r3
void *return_this;
/*
* Parameter error checks
*/
if ( !pointer )
800d330: 44 20 00 1b be r1,r0,800d39c <rtems_memalign+0x94>
*pointer = NULL;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
800d334: 78 01 08 01 mvhi r1,0x801
800d338: 38 21 aa 98 ori r1,r1,0xaa98
800d33c: 28 22 00 00 lw r2,(r1+0)
* Parameter error checks
*/
if ( !pointer )
return EINVAL;
*pointer = NULL;
800d340: 59 60 00 00 sw (r11+0),r0
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
800d344: 34 01 00 03 mvi r1,3
800d348: 44 41 00 1d be r2,r1,800d3bc <rtems_memalign+0xb4> <== ALWAYS TAKEN
return EINVAL;
/*
* If some free's have been deferred, then do them now.
*/
malloc_deferred_frees_process();
800d34c: fb ff d5 b0 calli 8002a0c <malloc_deferred_frees_process>
Heap_Control *heap,
uintptr_t size,
uintptr_t alignment
)
{
return
800d350: 78 01 08 01 mvhi r1,0x801
800d354: 38 21 a0 1c ori r1,r1,0xa01c
800d358: 28 21 00 00 lw r1,(r1+0)
800d35c: b9 a0 18 00 mv r3,r13
800d360: b9 c0 10 00 mv r2,r14
800d364: 34 04 00 00 mvi r4,0
800d368: fb ff e3 9e calli 80061e0 <_Protected_heap_Allocate_aligned_with_boundary>
800d36c: b8 20 68 00 mv r13,r1
RTEMS_Malloc_Heap,
size,
alignment
);
if ( !return_this )
return ENOMEM;
800d370: 34 0c 00 0c mvi r12,12
return_this = _Protected_heap_Allocate_aligned(
RTEMS_Malloc_Heap,
size,
alignment
);
if ( !return_this )
800d374: 44 20 00 0a be r1,r0,800d39c <rtems_memalign+0x94>
return ENOMEM;
/*
* If configured, update the more involved statistics
*/
if ( rtems_malloc_statistics_helpers )
800d378: 78 02 08 01 mvhi r2,0x801
800d37c: 38 42 a6 80 ori r2,r2,0xa680
800d380: 28 41 00 00 lw r1,(r2+0)
800d384: 44 20 00 04 be r1,r0,800d394 <rtems_memalign+0x8c>
(*rtems_malloc_statistics_helpers->at_malloc)(pointer);
800d388: 28 22 00 04 lw r2,(r1+4)
800d38c: b9 60 08 00 mv r1,r11
800d390: d8 40 00 00 call r2
*pointer = return_this;
800d394: 59 6d 00 00 sw (r11+0),r13
return 0;
800d398: 34 0c 00 00 mvi r12,0
}
800d39c: b9 80 08 00 mv r1,r12
800d3a0: 2b 9d 00 04 lw ra,(sp+4)
800d3a4: 2b 8b 00 14 lw r11,(sp+20)
800d3a8: 2b 8c 00 10 lw r12,(sp+16)
800d3ac: 2b 8d 00 0c lw r13,(sp+12)
800d3b0: 2b 8e 00 08 lw r14,(sp+8)
800d3b4: 37 9c 00 14 addi sp,sp,20
800d3b8: c3 a0 00 00 ret
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
!malloc_is_system_state_OK() )
800d3bc: fb ff d5 82 calli 80029c4 <malloc_is_system_state_OK>
*pointer = NULL;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
800d3c0: 5c 20 ff e3 bne r1,r0,800d34c <rtems_memalign+0x44> <== ALWAYS TAKEN
800d3c4: e3 ff ff f6 bi 800d39c <rtems_memalign+0x94> <== NOT EXECUTED
0800b478 <rtems_mkdir>:
return (retval);
}
int
rtems_mkdir(const char *path, mode_t mode)
{
800b478: 37 9c ff 84 addi sp,sp,-124
800b47c: 5b 8b 00 34 sw (sp+52),r11
800b480: 5b 8c 00 30 sw (sp+48),r12
800b484: 5b 8d 00 2c sw (sp+44),r13
800b488: 5b 8e 00 28 sw (sp+40),r14
800b48c: 5b 8f 00 24 sw (sp+36),r15
800b490: 5b 90 00 20 sw (sp+32),r16
800b494: 5b 91 00 1c sw (sp+28),r17
800b498: 5b 92 00 18 sw (sp+24),r18
800b49c: 5b 93 00 14 sw (sp+20),r19
800b4a0: 5b 94 00 10 sw (sp+16),r20
800b4a4: 5b 95 00 0c sw (sp+12),r21
800b4a8: 5b 96 00 08 sw (sp+8),r22
800b4ac: 5b 9d 00 04 sw (sp+4),ra
800b4b0: b8 40 88 00 mv r17,r2
int success = 0;
char *dup_path = strdup(path);
800b4b4: f8 00 12 f3 calli 8010080 <strdup>
800b4b8: b8 20 68 00 mv r13,r1
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
}
return success != 0 ? 0 : -1;
800b4bc: 34 01 ff ff mvi r1,-1
rtems_mkdir(const char *path, mode_t mode)
{
int success = 0;
char *dup_path = strdup(path);
if (dup_path != NULL) {
800b4c0: 45 a0 00 31 be r13,r0,800b584 <rtems_mkdir+0x10c> <== NEVER TAKEN
char *p;
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
800b4c4: 41 a3 00 00 lbu r3,(r13+0)
800b4c8: 34 01 00 2f mvi r1,47
800b4cc: b9 a0 58 00 mv r11,r13
800b4d0: 44 61 00 4d be r3,r1,800b604 <rtems_mkdir+0x18c>
800b4d4: 34 0e 00 00 mvi r14,0
800b4d8: 34 04 00 01 mvi r4,1
retval = 0;
break;
}
}
if (!last)
*p = '/';
800b4dc: 34 10 00 2f mvi r16,47
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
if (errno == EEXIST || errno == EISDIR) {
800b4e0: 34 13 00 11 mvi r19,17
if (stat(path, &sb) < 0) {
800b4e4: 37 94 00 38 addi r20,sp,56
retval = 0;
break;
} else if (!S_ISDIR(sb.st_mode)) {
800b4e8: 34 15 40 00 mvi r21,16384
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
if (errno == EEXIST || errno == EISDIR) {
800b4ec: 34 16 00 15 mvi r22,21
*
* We change the user's umask and then restore it,
* instead of doing chmod's.
*/
oumask = umask(0);
numask = oumask & ~(S_IWUSR | S_IXUSR);
800b4f0: 34 12 ff 3f mvi r18,-193
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
last = 1;
else if (p[0] != '/')
800b4f4: 34 0f 00 2f mvi r15,47
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
800b4f8: 44 60 00 05 be r3,r0,800b50c <rtems_mkdir+0x94> <== NEVER TAKEN
last = 1;
else if (p[0] != '/')
800b4fc: 44 6f 00 3e be r3,r15,800b5f4 <rtems_mkdir+0x17c>
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
800b500: 35 6b 00 01 addi r11,r11,1
800b504: 41 63 00 00 lbu r3,(r11+0)
if (p[0] == '\0')
800b508: 5c 60 ff fd bne r3,r0,800b4fc <rtems_mkdir+0x84>
last = 1;
else if (p[0] != '/')
continue;
*p = '\0';
800b50c: 31 60 00 00 sb (r11+0),r0
800b510: 34 0c 00 01 mvi r12,1
if (!last && p[1] == '\0')
last = 1;
if (first) {
800b514: 5c 80 00 32 bne r4,r0,800b5dc <rtems_mkdir+0x164>
(void)umask(numask);
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
800b518: 34 02 01 ff mvi r2,511
oumask = umask(0);
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
first = 0;
}
if (last)
800b51c: 5d 80 00 2c bne r12,r0,800b5cc <rtems_mkdir+0x154>
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
800b520: b9 a0 08 00 mv r1,r13
800b524: fb ff df 74 calli 80032f4 <mkdir>
800b528: 4c 20 00 11 bge r1,r0,800b56c <rtems_mkdir+0xf4>
if (errno == EEXIST || errno == EISDIR) {
800b52c: f8 00 0e 57 calli 800ee88 <__errno>
800b530: 28 21 00 00 lw r1,(r1+0)
800b534: 44 33 00 04 be r1,r19,800b544 <rtems_mkdir+0xcc>
800b538: f8 00 0e 54 calli 800ee88 <__errno>
800b53c: 28 21 00 00 lw r1,(r1+0)
800b540: 5c 36 00 45 bne r1,r22,800b654 <rtems_mkdir+0x1dc> <== ALWAYS TAKEN
if (stat(path, &sb) < 0) {
800b544: b9 a0 08 00 mv r1,r13
800b548: ba 80 10 00 mv r2,r20
800b54c: f8 00 00 44 calli 800b65c <stat>
800b550: 48 01 00 41 bg r0,r1,800b654 <rtems_mkdir+0x1dc> <== NEVER TAKEN
retval = 0;
break;
} else if (!S_ISDIR(sb.st_mode)) {
800b554: 2b 81 00 44 lw r1,(sp+68)
800b558: 20 21 f0 00 andi r1,r1,0xf000
800b55c: 5c 35 00 2d bne r1,r21,800b610 <rtems_mkdir+0x198>
else
errno = ENOTDIR;
retval = 0;
break;
}
if (last)
800b560: 45 80 00 18 be r12,r0,800b5c0 <rtems_mkdir+0x148>
retval = 2;
800b564: 34 0b 00 02 mvi r11,2
800b568: e0 00 00 03 bi 800b574 <rtems_mkdir+0xfc>
} else {
retval = 0;
break;
}
}
if (!last)
800b56c: 45 80 00 15 be r12,r0,800b5c0 <rtems_mkdir+0x148>
800b570: 34 0b 00 01 mvi r11,1
int success = 0;
char *dup_path = strdup(path);
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
800b574: b9 a0 08 00 mv r1,r13
800b578: fb ff dd 31 calli 8002a3c <free>
}
return success != 0 ? 0 : -1;
800b57c: 34 01 00 00 mvi r1,0
800b580: 45 60 00 33 be r11,r0,800b64c <rtems_mkdir+0x1d4> <== NEVER TAKEN
}
800b584: 2b 9d 00 04 lw ra,(sp+4)
800b588: 2b 8b 00 34 lw r11,(sp+52)
800b58c: 2b 8c 00 30 lw r12,(sp+48)
800b590: 2b 8d 00 2c lw r13,(sp+44)
800b594: 2b 8e 00 28 lw r14,(sp+40)
800b598: 2b 8f 00 24 lw r15,(sp+36)
800b59c: 2b 90 00 20 lw r16,(sp+32)
800b5a0: 2b 91 00 1c lw r17,(sp+28)
800b5a4: 2b 92 00 18 lw r18,(sp+24)
800b5a8: 2b 93 00 14 lw r19,(sp+20)
800b5ac: 2b 94 00 10 lw r20,(sp+16)
800b5b0: 2b 95 00 0c lw r21,(sp+12)
800b5b4: 2b 96 00 08 lw r22,(sp+8)
800b5b8: 37 9c 00 7c addi sp,sp,124
800b5bc: c3 a0 00 00 ret
retval = 0;
break;
}
}
if (!last)
*p = '/';
800b5c0: 31 70 00 00 sb (r11+0),r16
800b5c4: 34 04 00 00 mvi r4,0
800b5c8: e3 ff ff ce bi 800b500 <rtems_mkdir+0x88>
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
first = 0;
}
if (last)
(void)umask(oumask);
800b5cc: b9 c0 08 00 mv r1,r14
800b5d0: f8 00 00 5b calli 800b73c <umask>
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
800b5d4: ba 20 10 00 mv r2,r17
800b5d8: e3 ff ff d2 bi 800b520 <rtems_mkdir+0xa8>
* mkdir [-m mode] dir
*
* We change the user's umask and then restore it,
* instead of doing chmod's.
*/
oumask = umask(0);
800b5dc: 34 01 00 00 mvi r1,0
800b5e0: f8 00 00 57 calli 800b73c <umask>
800b5e4: b8 20 70 00 mv r14,r1
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
800b5e8: a0 32 08 00 and r1,r1,r18
800b5ec: f8 00 00 54 calli 800b73c <umask>
800b5f0: e3 ff ff ca bi 800b518 <rtems_mkdir+0xa0>
if (p[0] == '\0')
last = 1;
else if (p[0] != '/')
continue;
*p = '\0';
if (!last && p[1] == '\0')
800b5f4: 41 6c 00 01 lbu r12,(r11+1)
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
last = 1;
else if (p[0] != '/')
continue;
*p = '\0';
800b5f8: 31 60 00 00 sb (r11+0),r0
if (!last && p[1] == '\0')
800b5fc: 65 8c 00 00 cmpei r12,r12,0
800b600: e3 ff ff c5 bi 800b514 <rtems_mkdir+0x9c>
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
800b604: 41 a3 00 01 lbu r3,(r13+1)
800b608: 35 ab 00 01 addi r11,r13,1
800b60c: e3 ff ff b2 bi 800b4d4 <rtems_mkdir+0x5c>
if (errno == EEXIST || errno == EISDIR) {
if (stat(path, &sb) < 0) {
retval = 0;
break;
} else if (!S_ISDIR(sb.st_mode)) {
if (last)
800b610: 45 80 00 08 be r12,r0,800b630 <rtems_mkdir+0x1b8>
errno = EEXIST;
800b614: f8 00 0e 1d calli 800ee88 <__errno>
800b618: 34 02 00 11 mvi r2,17
800b61c: 58 22 00 00 sw (r1+0),r2
int success = 0;
char *dup_path = strdup(path);
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
800b620: b9 a0 08 00 mv r1,r13
800b624: fb ff dd 06 calli 8002a3c <free>
}
return success != 0 ? 0 : -1;
800b628: 34 01 ff ff mvi r1,-1
800b62c: e3 ff ff d6 bi 800b584 <rtems_mkdir+0x10c>
break;
} else if (!S_ISDIR(sb.st_mode)) {
if (last)
errno = EEXIST;
else
errno = ENOTDIR;
800b630: f8 00 0e 16 calli 800ee88 <__errno>
800b634: 34 02 00 14 mvi r2,20
800b638: 58 22 00 00 sw (r1+0),r2
}
if (!last)
*p = '/';
}
if (!first && !last)
(void)umask(oumask);
800b63c: b9 c0 08 00 mv r1,r14
800b640: f8 00 00 3f calli 800b73c <umask>
int success = 0;
char *dup_path = strdup(path);
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
800b644: b9 a0 08 00 mv r1,r13
800b648: fb ff dc fd calli 8002a3c <free>
}
return success != 0 ? 0 : -1;
800b64c: 34 01 ff ff mvi r1,-1
800b650: e3 ff ff cd bi 800b584 <rtems_mkdir+0x10c>
}
}
if (!last)
*p = '/';
}
if (!first && !last)
800b654: 45 80 ff fa be r12,r0,800b63c <rtems_mkdir+0x1c4> <== NEVER TAKEN
800b658: e3 ff ff fb bi 800b644 <rtems_mkdir+0x1cc>
08004de0 <rtems_object_get_class_information>:
rtems_status_code rtems_object_get_class_information(
int the_api,
int the_class,
rtems_object_api_class_information *info
)
{
8004de0: 37 9c ff f8 addi sp,sp,-8
8004de4: 5b 8b 00 08 sw (sp+8),r11
8004de8: 5b 9d 00 04 sw (sp+4),ra
8004dec: b8 60 58 00 mv r11,r3
/*
* Validate parameters and look up information structure.
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
8004df0: 34 03 00 09 mvi r3,9
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
8004df4: 45 60 00 1e be r11,r0,8004e6c <rtems_object_get_class_information+0x8c>
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
8004df8: 20 42 ff ff andi r2,r2,0xffff
8004dfc: f8 00 07 c4 calli 8006d0c <_Objects_Get_information>
8004e00: b8 20 10 00 mv r2,r1
if ( !obj_info )
return RTEMS_INVALID_NUMBER;
8004e04: 34 03 00 0a mvi r3,10
*/
if ( !info )
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
if ( !obj_info )
8004e08: 44 20 00 19 be r1,r0,8004e6c <rtems_object_get_class_information+0x8c>
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
8004e0c: 28 24 00 08 lw r4,(r1+8)
info->maximum_id = obj_info->maximum_id;
8004e10: 28 23 00 0c lw r3,(r1+12)
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
8004e14: 2c 46 00 10 lhu r6,(r2+16)
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
8004e18: 40 21 00 12 lbu r1,(r1+18)
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
8004e1c: 59 64 00 00 sw (r11+0),r4
info->maximum_id = obj_info->maximum_id;
8004e20: 59 63 00 04 sw (r11+4),r3
info->auto_extend = obj_info->auto_extend;
8004e24: 31 61 00 0c sb (r11+12),r1
info->maximum = obj_info->maximum;
8004e28: 59 66 00 08 sw (r11+8),r6
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
8004e2c: 34 04 00 00 mvi r4,0
8004e30: 44 c0 00 0d be r6,r0,8004e64 <rtems_object_get_class_information+0x84><== NEVER TAKEN
8004e34: 28 43 00 1c lw r3,(r2+28)
8004e38: 34 01 00 01 mvi r1,1
8004e3c: 34 02 00 01 mvi r2,1
if ( !obj_info->local_table[i] )
8004e40: b4 21 08 00 add r1,r1,r1
8004e44: b4 21 08 00 add r1,r1,r1
8004e48: b4 61 08 00 add r1,r3,r1
8004e4c: 28 25 00 00 lw r5,(r1+0)
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
8004e50: 34 42 00 01 addi r2,r2,1
8004e54: b8 40 08 00 mv r1,r2
if ( !obj_info->local_table[i] )
unallocated++;
8004e58: 64 a5 00 00 cmpei r5,r5,0
8004e5c: b4 85 20 00 add r4,r4,r5
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
8004e60: 50 c2 ff f8 bgeu r6,r2,8004e40 <rtems_object_get_class_information+0x60>
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
8004e64: 59 64 00 10 sw (r11+16),r4
return RTEMS_SUCCESSFUL;
8004e68: 34 03 00 00 mvi r3,0
}
8004e6c: b8 60 08 00 mv r1,r3
8004e70: 2b 9d 00 04 lw ra,(sp+4)
8004e74: 2b 8b 00 08 lw r11,(sp+8)
8004e78: 37 9c 00 08 addi sp,sp,8
8004e7c: c3 a0 00 00 ret
080113bc <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
80113bc: 37 9c ff d8 addi sp,sp,-40
80113c0: 5b 8b 00 18 sw (sp+24),r11
80113c4: 5b 8c 00 14 sw (sp+20),r12
80113c8: 5b 8d 00 10 sw (sp+16),r13
80113cc: 5b 8e 00 0c sw (sp+12),r14
80113d0: 5b 8f 00 08 sw (sp+8),r15
80113d4: 5b 9d 00 04 sw (sp+4),ra
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
80113d8: 34 07 00 03 mvi r7,3
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
80113dc: b8 20 60 00 mv r12,r1
80113e0: b8 40 58 00 mv r11,r2
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
80113e4: 44 20 00 3e be r1,r0,80114dc <rtems_partition_create+0x120>
return RTEMS_INVALID_NAME;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
80113e8: 34 07 00 09 mvi r7,9
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !starting_address )
80113ec: 44 40 00 3c be r2,r0,80114dc <rtems_partition_create+0x120>
return RTEMS_INVALID_ADDRESS;
if ( !id )
80113f0: 44 c0 00 3b be r6,r0,80114dc <rtems_partition_create+0x120><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
80113f4: 64 82 00 00 cmpei r2,r4,0
80113f8: 64 61 00 00 cmpei r1,r3,0
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
80113fc: 34 07 00 08 mvi r7,8
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
8011400: b8 41 08 00 or r1,r2,r1
8011404: 5c 20 00 36 bne r1,r0,80114dc <rtems_partition_create+0x120>
8011408: 54 83 00 35 bgu r4,r3,80114dc <rtems_partition_create+0x120>
*/
RTEMS_INLINE_ROUTINE bool _Partition_Is_buffer_size_aligned (
uint32_t buffer_size
)
{
return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0);
801140c: 20 81 00 07 andi r1,r4,0x7
8011410: 5c 20 00 33 bne r1,r0,80114dc <rtems_partition_create+0x120>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
8011414: 21 6f 00 07 andi r15,r11,0x7
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
8011418: 34 07 00 09 mvi r7,9
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
801141c: 5d e1 00 30 bne r15,r1,80114dc <rtems_partition_create+0x120>
8011420: 78 01 08 04 mvhi r1,0x804
8011424: 38 21 0c b0 ori r1,r1,0xcb0
8011428: 28 22 00 00 lw r2,(r1+0)
801142c: 34 42 00 01 addi r2,r2,1
8011430: 58 22 00 00 sw (r1+0),r2
* This function allocates a partition control block from
* the inactive chain of free partition control blocks.
*/
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
{
return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
8011434: 78 0e 08 04 mvhi r14,0x804
8011438: 39 ce 0b 08 ori r14,r14,0xb08
801143c: b9 c0 08 00 mv r1,r14
8011440: 5b 83 00 28 sw (sp+40),r3
8011444: 5b 84 00 20 sw (sp+32),r4
8011448: 5b 85 00 24 sw (sp+36),r5
801144c: 5b 86 00 1c sw (sp+28),r6
8011450: f8 00 16 f8 calli 8017030 <_Objects_Allocate>
8011454: b8 20 68 00 mv r13,r1
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
8011458: 2b 83 00 28 lw r3,(sp+40)
801145c: 2b 84 00 20 lw r4,(sp+32)
8011460: 2b 85 00 24 lw r5,(sp+36)
8011464: 2b 86 00 1c lw r6,(sp+28)
8011468: 44 2f 00 26 be r1,r15,8011500 <rtems_partition_create+0x144>
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
801146c: 58 25 00 1c sw (r1+28),r5
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
8011470: 58 23 00 14 sw (r1+20),r3
the_partition->buffer_size = buffer_size;
8011474: 58 24 00 18 sw (r1+24),r4
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
8011478: 58 2b 00 10 sw (r1+16),r11
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
801147c: 58 20 00 20 sw (r1+32),r0
_Chain_Initialize( &the_partition->Memory, starting_address,
length / buffer_size, buffer_size );
8011480: b8 80 10 00 mv r2,r4
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
8011484: 34 2f 00 24 addi r15,r1,36
length / buffer_size, buffer_size );
8011488: b8 60 08 00 mv r1,r3
801148c: 5b 86 00 1c sw (sp+28),r6
8011490: 5b 84 00 20 sw (sp+32),r4
8011494: f8 00 7f 08 calli 80310b4 <__udivsi3>
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
8011498: 2b 84 00 20 lw r4,(sp+32)
length / buffer_size, buffer_size );
801149c: b8 20 18 00 mv r3,r1
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
80114a0: b9 60 10 00 mv r2,r11
80114a4: b9 e0 08 00 mv r1,r15
80114a8: f8 00 0f 9c calli 8015318 <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
80114ac: 29 a2 00 08 lw r2,(r13+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80114b0: 29 c3 00 1c lw r3,(r14+28)
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
80114b4: 20 41 ff ff andi r1,r2,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80114b8: b4 21 08 00 add r1,r1,r1
80114bc: b4 21 08 00 add r1,r1,r1
80114c0: b4 61 08 00 add r1,r3,r1
80114c4: 58 2d 00 00 sw (r1+0),r13
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
80114c8: 59 ac 00 0c sw (r13+12),r12
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
80114cc: 2b 86 00 1c lw r6,(sp+28)
80114d0: 58 c2 00 00 sw (r6+0),r2
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
80114d4: f8 00 1c 48 calli 80185f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80114d8: 34 07 00 00 mvi r7,0
}
80114dc: b8 e0 08 00 mv r1,r7
80114e0: 2b 9d 00 04 lw ra,(sp+4)
80114e4: 2b 8b 00 18 lw r11,(sp+24)
80114e8: 2b 8c 00 14 lw r12,(sp+20)
80114ec: 2b 8d 00 10 lw r13,(sp+16)
80114f0: 2b 8e 00 0c lw r14,(sp+12)
80114f4: 2b 8f 00 08 lw r15,(sp+8)
80114f8: 37 9c 00 28 addi sp,sp,40
80114fc: c3 a0 00 00 ret
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
8011500: f8 00 1c 3d calli 80185f4 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
8011504: 34 07 00 05 mvi r7,5
8011508: e3 ff ff f5 bi 80114dc <rtems_partition_create+0x120>
08000900 <rtems_print_buffer>:
void rtems_print_buffer(
const unsigned char *buffer,
int length
)
{
8000900: 37 9c ff 50 addi sp,sp,-176
8000904: 5b 8b 00 38 sw (sp+56),r11
8000908: 5b 8c 00 34 sw (sp+52),r12
800090c: 5b 8d 00 30 sw (sp+48),r13
8000910: 5b 8e 00 2c sw (sp+44),r14
8000914: 5b 8f 00 28 sw (sp+40),r15
8000918: 5b 90 00 24 sw (sp+36),r16
800091c: 5b 91 00 20 sw (sp+32),r17
8000920: 5b 92 00 1c sw (sp+28),r18
8000924: 5b 93 00 18 sw (sp+24),r19
8000928: 5b 94 00 14 sw (sp+20),r20
800092c: 5b 95 00 10 sw (sp+16),r21
8000930: 5b 96 00 0c sw (sp+12),r22
8000934: 5b 97 00 08 sw (sp+8),r23
8000938: 5b 9d 00 04 sw (sp+4),ra
800093c: b8 40 a8 00 mv r21,r2
8000940: b8 20 b0 00 mv r22,r1
int i, mod, max;
if ( !length ) return;
8000944: 44 40 00 41 be r2,r0,8000a48 <rtems_print_buffer+0x148>
mod = length % 16;
8000948: b8 40 08 00 mv r1,r2
800094c: 34 02 00 1f mvi r2,31
8000950: f8 00 6a d6 calli 801b4a8 <__ashrsi3>
8000954: 9a a1 98 00 xor r19,r21,r1
8000958: ca 61 98 00 sub r19,r19,r1
800095c: 22 73 00 0f andi r19,r19,0xf
8000960: 9a 61 98 00 xor r19,r19,r1
8000964: ca 61 98 00 sub r19,r19,r1
max = length - mod;
8000968: ca b3 a8 00 sub r21,r21,r19
for ( i=0 ; i<max ; i+=16 )
800096c: 4c 15 00 36 bge r0,r21,8000a44 <rtems_print_buffer+0x144>
8000970: 78 0f 08 01 mvhi r15,0x801
8000974: 78 0d 08 01 mvhi r13,0x801
8000978: 78 0e 08 01 mvhi r14,0x801
800097c: 34 12 00 00 mvi r18,0
8000980: 37 8b 00 3c addi r11,sp,60
8000984: 39 ef c7 60 ori r15,r15,0xc760
8000988: 39 ad e1 e0 ori r13,r13,0xe1e0
800098c: 39 ce c7 68 ori r14,r14,0xc768
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
8000990: 34 11 00 10 mvi r17,16
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
8000994: 34 14 00 7c mvi r20,124
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|\n" );
8000998: 34 17 00 0a mvi r23,10
static inline void Dump_Line(
const unsigned char *buffer,
int length
);
void rtems_print_buffer(
800099c: b6 d2 80 00 add r16,r22,r18
{
int i;
char line_buffer[120];
line_buffer[0] = '\0';
80009a0: 33 80 00 3c sb (sp+60),r0
for( i=0 ; i<length ; i++ )
80009a4: 34 0c 00 00 mvi r12,0
static inline void Dump_Line(
const unsigned char *buffer,
int length
);
void rtems_print_buffer(
80009a8: b6 0c 10 00 add r2,r16,r12
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
80009ac: 40 44 00 00 lbu r4,(r2+0)
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
80009b0: 35 8c 00 01 addi r12,r12,1
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
80009b4: b9 60 08 00 mv r1,r11
80009b8: b9 e0 10 00 mv r2,r15
80009bc: b9 60 18 00 mv r3,r11
80009c0: f8 00 34 d3 calli 800dd0c <sprintf>
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
80009c4: 5d 91 ff f9 bne r12,r17,80009a8 <rtems_print_buffer+0xa8>
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
80009c8: b9 60 08 00 mv r1,r11
80009cc: f8 00 35 fb calli 800e1b8 <strlen>
80009d0: b5 61 10 00 add r2,r11,r1
80009d4: 30 54 00 00 sb (r2+0),r20
80009d8: 30 40 00 01 sb (r2+1),r0
for( i=0 ; i<length ; i++ )
80009dc: 34 0c 00 00 mvi r12,0
static inline void Dump_Line(
const unsigned char *buffer,
int length
);
void rtems_print_buffer(
80009e0: b6 0c 10 00 add r2,r16,r12
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
80009e4: 40 45 00 00 lbu r5,(r2+0)
80009e8: 29 a3 00 00 lw r3,(r13+0)
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
80009ec: b9 60 08 00 mv r1,r11
80009f0: b9 c0 10 00 mv r2,r14
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
80009f4: b4 65 18 00 add r3,r3,r5
80009f8: 40 66 00 01 lbu r6,(r3+1)
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
80009fc: 35 8c 00 01 addi r12,r12,1
sprintf( line_buffer, "%s%c", line_buffer,
8000a00: b9 60 18 00 mv r3,r11
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
8000a04: 20 c6 00 97 andi r6,r6,0x97
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
8000a08: 34 04 00 2e mvi r4,46
8000a0c: 44 c0 00 02 be r6,r0,8000a14 <rtems_print_buffer+0x114>
8000a10: b8 a0 20 00 mv r4,r5
8000a14: f8 00 34 be calli 800dd0c <sprintf>
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
8000a18: 5d 91 ff f2 bne r12,r17,80009e0 <rtems_print_buffer+0xe0>
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|\n" );
8000a1c: b9 60 08 00 mv r1,r11
8000a20: f8 00 35 e6 calli 800e1b8 <strlen>
8000a24: b5 61 10 00 add r2,r11,r1
mod = length % 16;
max = length - mod;
for ( i=0 ; i<max ; i+=16 )
8000a28: 36 52 00 10 addi r18,r18,16
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|\n" );
8000a2c: 30 54 00 00 sb (r2+0),r20
8000a30: 30 57 00 01 sb (r2+1),r23
8000a34: 30 40 00 02 sb (r2+2),r0
printk( line_buffer );
8000a38: b9 60 08 00 mv r1,r11
8000a3c: f8 00 07 84 calli 800284c <printk>
mod = length % 16;
max = length - mod;
for ( i=0 ; i<max ; i+=16 )
8000a40: 4a b2 ff d7 bg r21,r18,800099c <rtems_print_buffer+0x9c>
Dump_Line( &buffer[ i ], 16 );
if ( mod )
8000a44: 5e 60 00 11 bne r19,r0,8000a88 <rtems_print_buffer+0x188>
Dump_Line( &buffer[ max ], mod );
}
8000a48: 2b 9d 00 04 lw ra,(sp+4)
8000a4c: 2b 8b 00 38 lw r11,(sp+56)
8000a50: 2b 8c 00 34 lw r12,(sp+52)
8000a54: 2b 8d 00 30 lw r13,(sp+48)
8000a58: 2b 8e 00 2c lw r14,(sp+44)
8000a5c: 2b 8f 00 28 lw r15,(sp+40)
8000a60: 2b 90 00 24 lw r16,(sp+36)
8000a64: 2b 91 00 20 lw r17,(sp+32)
8000a68: 2b 92 00 1c lw r18,(sp+28)
8000a6c: 2b 93 00 18 lw r19,(sp+24)
8000a70: 2b 94 00 14 lw r20,(sp+20)
8000a74: 2b 95 00 10 lw r21,(sp+16)
8000a78: 2b 96 00 0c lw r22,(sp+12)
8000a7c: 2b 97 00 08 lw r23,(sp+8)
8000a80: 37 9c 00 b0 addi sp,sp,176
8000a84: c3 a0 00 00 ret
{
int i;
char line_buffer[120];
line_buffer[0] = '\0';
8000a88: 33 80 00 3c sb (sp+60),r0
for ( i=0 ; i<max ; i+=16 )
Dump_Line( &buffer[ i ], 16 );
if ( mod )
Dump_Line( &buffer[ max ], mod );
8000a8c: b6 d5 a8 00 add r21,r22,r21
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
8000a90: 4a 60 00 2a bg r19,r0,8000b38 <rtems_print_buffer+0x238>
8000a94: 34 0c 00 00 mvi r12,0
8000a98: 37 8b 00 3c addi r11,sp,60
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
8000a9c: 34 0d 00 20 mvi r13,32
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
8000aa0: 34 0e 00 0f mvi r14,15
strcat( line_buffer, " " );
8000aa4: b9 60 08 00 mv r1,r11
8000aa8: f8 00 35 c4 calli 800e1b8 <strlen>
8000aac: b5 61 08 00 add r1,r11,r1
8000ab0: 30 2d 00 00 sb (r1+0),r13
8000ab4: 30 2d 00 01 sb (r1+1),r13
8000ab8: 30 2d 00 02 sb (r1+2),r13
8000abc: 30 20 00 03 sb (r1+3),r0
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
8000ac0: 35 8c 00 01 addi r12,r12,1
8000ac4: 4d cc ff f8 bge r14,r12,8000aa4 <rtems_print_buffer+0x1a4>
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
8000ac8: b9 60 08 00 mv r1,r11
8000acc: f8 00 35 bb calli 800e1b8 <strlen>
8000ad0: b5 61 08 00 add r1,r11,r1
8000ad4: 34 02 00 7c mvi r2,124
8000ad8: 30 22 00 00 sb (r1+0),r2
8000adc: 30 20 00 01 sb (r1+1),r0
for( i=0 ; i<length ; i++ )
8000ae0: 4a 60 00 2b bg r19,r0,8000b8c <rtems_print_buffer+0x28c>
8000ae4: 34 13 00 00 mvi r19,0
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
8000ae8: 34 0d 00 20 mvi r13,32
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
8000aec: 34 0c 00 0f mvi r12,15
strcat( line_buffer, " " );
8000af0: b9 60 08 00 mv r1,r11
8000af4: f8 00 35 b1 calli 800e1b8 <strlen>
8000af8: b5 61 08 00 add r1,r11,r1
8000afc: 30 2d 00 00 sb (r1+0),r13
8000b00: 30 20 00 01 sb (r1+1),r0
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
8000b04: 36 73 00 01 addi r19,r19,1
8000b08: 4d 93 ff fa bge r12,r19,8000af0 <rtems_print_buffer+0x1f0>
strcat( line_buffer, " " );
strcat( line_buffer, "|\n" );
8000b0c: b9 60 08 00 mv r1,r11
8000b10: f8 00 35 aa calli 800e1b8 <strlen>
8000b14: b5 61 08 00 add r1,r11,r1
8000b18: 34 02 00 7c mvi r2,124
8000b1c: 30 22 00 00 sb (r1+0),r2
8000b20: 34 02 00 0a mvi r2,10
8000b24: 30 22 00 01 sb (r1+1),r2
8000b28: 30 20 00 02 sb (r1+2),r0
printk( line_buffer );
8000b2c: b9 60 08 00 mv r1,r11
8000b30: f8 00 07 47 calli 800284c <printk>
8000b34: e3 ff ff c5 bi 8000a48 <rtems_print_buffer+0x148>
8000b38: 78 0f 08 01 mvhi r15,0x801
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
8000b3c: 34 0c 00 00 mvi r12,0
8000b40: 37 8b 00 3c addi r11,sp,60
8000b44: 39 ef c7 60 ori r15,r15,0xc760
static inline void Dump_Line(
const unsigned char *buffer,
int length
);
void rtems_print_buffer(
8000b48: b6 ac 08 00 add r1,r21,r12
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
8000b4c: 40 24 00 00 lbu r4,(r1+0)
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
8000b50: 35 8c 00 01 addi r12,r12,1
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
8000b54: b9 60 08 00 mv r1,r11
8000b58: b9 e0 10 00 mv r2,r15
8000b5c: b9 60 18 00 mv r3,r11
8000b60: f8 00 34 6b calli 800dd0c <sprintf>
int i;
char line_buffer[120];
line_buffer[0] = '\0';
for( i=0 ; i<length ; i++ )
8000b64: 4a 6c ff f9 bg r19,r12,8000b48 <rtems_print_buffer+0x248>
sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] );
for( ; i<16 ; i++ )
8000b68: 34 01 00 0f mvi r1,15
8000b6c: ba 60 60 00 mv r12,r19
8000b70: 4c 33 ff cb bge r1,r19,8000a9c <rtems_print_buffer+0x19c> <== ALWAYS TAKEN
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
8000b74: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8000b78: f8 00 35 90 calli 800e1b8 <strlen> <== NOT EXECUTED
8000b7c: b5 61 08 00 add r1,r11,r1 <== NOT EXECUTED
8000b80: 34 02 00 7c mvi r2,124 <== NOT EXECUTED
8000b84: 30 22 00 00 sb (r1+0),r2 <== NOT EXECUTED
8000b88: 30 20 00 01 sb (r1+1),r0 <== NOT EXECUTED
8000b8c: 78 0d 08 01 mvhi r13,0x801
8000b90: 78 0e 08 01 mvhi r14,0x801
for( i=0 ; i<length ; i++ )
8000b94: 34 0c 00 00 mvi r12,0
8000b98: 39 ad e1 e0 ori r13,r13,0xe1e0
8000b9c: 39 ce c7 68 ori r14,r14,0xc768
static inline void Dump_Line(
const unsigned char *buffer,
int length
);
void rtems_print_buffer(
8000ba0: b6 ac 08 00 add r1,r21,r12
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
8000ba4: 40 25 00 00 lbu r5,(r1+0)
8000ba8: 29 a3 00 00 lw r3,(r13+0)
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
8000bac: b9 60 08 00 mv r1,r11
8000bb0: b9 c0 10 00 mv r2,r14
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
8000bb4: b4 65 18 00 add r3,r3,r5
8000bb8: 40 66 00 01 lbu r6,(r3+1)
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
8000bbc: 35 8c 00 01 addi r12,r12,1
sprintf( line_buffer, "%s%c", line_buffer,
8000bc0: b9 60 18 00 mv r3,r11
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
8000bc4: 20 c6 00 97 andi r6,r6,0x97
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
sprintf( line_buffer, "%s%c", line_buffer,
8000bc8: 34 04 00 2e mvi r4,46
8000bcc: 44 c0 00 02 be r6,r0,8000bd4 <rtems_print_buffer+0x2d4>
8000bd0: b8 a0 20 00 mv r4,r5
8000bd4: f8 00 34 4e calli 800dd0c <sprintf>
for( ; i<16 ; i++ )
strcat( line_buffer, " " );
strcat( line_buffer, "|" );
for( i=0 ; i<length ; i++ )
8000bd8: 4a 6c ff f2 bg r19,r12,8000ba0 <rtems_print_buffer+0x2a0>
sprintf( line_buffer, "%s%c", line_buffer,
isprint( buffer[ i ] ) ? buffer[ i ] : '.' );
for( ; i<16 ; i++ )
8000bdc: 34 01 00 0f mvi r1,15
8000be0: 4c 33 ff c2 bge r1,r19,8000ae8 <rtems_print_buffer+0x1e8> <== ALWAYS TAKEN
8000be4: e3 ff ff ca bi 8000b0c <rtems_print_buffer+0x20c> <== NOT EXECUTED
080042e8 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
80042e8: 37 9c ff e0 addi sp,sp,-32
80042ec: 5b 8b 00 18 sw (sp+24),r11
80042f0: 5b 8c 00 14 sw (sp+20),r12
80042f4: 5b 8d 00 10 sw (sp+16),r13
80042f8: 5b 8e 00 0c sw (sp+12),r14
80042fc: 5b 8f 00 08 sw (sp+8),r15
8004300: 5b 9d 00 04 sw (sp+4),ra
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
8004304: 78 03 08 02 mvhi r3,0x802
8004308: b8 20 68 00 mv r13,r1
800430c: b8 60 08 00 mv r1,r3
8004310: b8 40 70 00 mv r14,r2
8004314: 38 21 18 90 ori r1,r1,0x1890
8004318: b9 a0 10 00 mv r2,r13
800431c: 37 83 00 20 addi r3,sp,32
8004320: f8 00 0a 8d calli 8006d54 <_Objects_Get>
8004324: b8 20 58 00 mv r11,r1
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
8004328: 2b 81 00 20 lw r1,(sp+32)
800432c: 44 20 00 0a be r1,r0,8004354 <rtems_rate_monotonic_period+0x6c>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8004330: 34 01 00 04 mvi r1,4
}
8004334: 2b 9d 00 04 lw ra,(sp+4)
8004338: 2b 8b 00 18 lw r11,(sp+24)
800433c: 2b 8c 00 14 lw r12,(sp+20)
8004340: 2b 8d 00 10 lw r13,(sp+16)
8004344: 2b 8e 00 0c lw r14,(sp+12)
8004348: 2b 8f 00 08 lw r15,(sp+8)
800434c: 37 9c 00 20 addi sp,sp,32
8004350: c3 a0 00 00 ret
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
8004354: 78 0c 08 02 mvhi r12,0x802
8004358: 39 8c 1e 88 ori r12,r12,0x1e88
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
800435c: 29 62 00 40 lw r2,(r11+64)
8004360: 29 81 00 0c lw r1,(r12+12)
8004364: 44 41 00 0b be r2,r1,8004390 <rtems_rate_monotonic_period+0xa8>
_Thread_Enable_dispatch();
8004368: f8 00 0d f5 calli 8007b3c <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
800436c: 34 01 00 17 mvi r1,23
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8004370: 2b 9d 00 04 lw ra,(sp+4)
8004374: 2b 8b 00 18 lw r11,(sp+24)
8004378: 2b 8c 00 14 lw r12,(sp+20)
800437c: 2b 8d 00 10 lw r13,(sp+16)
8004380: 2b 8e 00 0c lw r14,(sp+12)
8004384: 2b 8f 00 08 lw r15,(sp+8)
8004388: 37 9c 00 20 addi sp,sp,32
800438c: c3 a0 00 00 ret
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
8004390: 5d c0 00 0f bne r14,r0,80043cc <rtems_rate_monotonic_period+0xe4>
switch ( the_period->state ) {
8004394: 29 62 00 38 lw r2,(r11+56)
8004398: 34 03 00 04 mvi r3,4
800439c: 34 01 00 00 mvi r1,0
80043a0: 54 43 00 07 bgu r2,r3,80043bc <rtems_rate_monotonic_period+0xd4><== NEVER TAKEN
80043a4: 78 01 08 01 mvhi r1,0x801
80043a8: b4 42 10 00 add r2,r2,r2
80043ac: 38 21 ef 80 ori r1,r1,0xef80
80043b0: b4 42 10 00 add r2,r2,r2
80043b4: b4 22 10 00 add r2,r1,r2
80043b8: 28 41 00 00 lw r1,(r2+0)
);
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
80043bc: 5b 81 00 1c sw (sp+28),r1
80043c0: f8 00 0d df calli 8007b3c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80043c4: 2b 81 00 1c lw r1,(sp+28)
80043c8: e3 ff ff db bi 8004334 <rtems_rate_monotonic_period+0x4c>
}
_Thread_Enable_dispatch();
return( return_value );
}
_ISR_Disable( level );
80043cc: 90 00 78 00 rcsr r15,IE
80043d0: 34 01 ff fe mvi r1,-2
80043d4: a1 e1 08 00 and r1,r15,r1
80043d8: d0 01 00 00 wcsr IE,r1
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
80043dc: 29 62 00 38 lw r2,(r11+56)
80043e0: 44 40 00 15 be r2,r0,8004434 <rtems_rate_monotonic_period+0x14c>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
80043e4: 34 01 00 02 mvi r1,2
80043e8: 44 41 00 26 be r2,r1,8004480 <rtems_rate_monotonic_period+0x198>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
80043ec: 34 01 00 04 mvi r1,4
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
80043f0: 5c 41 ff d1 bne r2,r1,8004334 <rtems_rate_monotonic_period+0x4c><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
80043f4: b9 60 08 00 mv r1,r11
80043f8: fb ff ff 72 calli 80041c0 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
80043fc: d0 0f 00 00 wcsr IE,r15
the_period->state = RATE_MONOTONIC_ACTIVE;
8004400: 34 03 00 02 mvi r3,2
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8004404: 78 01 08 02 mvhi r1,0x802
8004408: 38 21 1a 98 ori r1,r1,0x1a98
800440c: 35 62 00 10 addi r2,r11,16
8004410: 59 63 00 38 sw (r11+56),r3
the_period->next_length = length;
8004414: 59 6e 00 3c sw (r11+60),r14
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004418: 59 6e 00 1c sw (r11+28),r14
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800441c: f8 00 13 41 calli 8009120 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
8004420: 34 01 00 06 mvi r1,6
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
8004424: 5b 81 00 1c sw (sp+28),r1
8004428: f8 00 0d c5 calli 8007b3c <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
800442c: 2b 81 00 1c lw r1,(sp+28)
8004430: e3 ff ff c1 bi 8004334 <rtems_rate_monotonic_period+0x4c>
return( return_value );
}
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
_ISR_Enable( level );
8004434: d0 0f 00 00 wcsr IE,r15
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
8004438: b9 60 08 00 mv r1,r11
800443c: fb ff ff 36 calli 8004114 <_Rate_monotonic_Initiate_statistics>
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
8004440: 78 03 08 00 mvhi r3,0x800
8004444: 38 63 48 78 ori r3,r3,0x4878
the_period->state = RATE_MONOTONIC_ACTIVE;
8004448: 34 04 00 02 mvi r4,2
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800444c: 78 01 08 02 mvhi r1,0x802
8004450: 38 21 1a 98 ori r1,r1,0x1a98
8004454: 35 62 00 10 addi r2,r11,16
8004458: 59 64 00 38 sw (r11+56),r4
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
800445c: 59 60 00 18 sw (r11+24),r0
the_watchdog->routine = routine;
8004460: 59 63 00 2c sw (r11+44),r3
the_watchdog->id = id;
8004464: 59 6d 00 30 sw (r11+48),r13
the_watchdog->user_data = user_data;
8004468: 59 60 00 34 sw (r11+52),r0
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
800446c: 59 6e 00 3c sw (r11+60),r14
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004470: 59 6e 00 1c sw (r11+28),r14
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8004474: f8 00 13 2b calli 8009120 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
8004478: 34 01 00 00 mvi r1,0
800447c: e3 ff ff d0 bi 80043bc <rtems_rate_monotonic_period+0xd4>
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
8004480: b9 60 08 00 mv r1,r11
8004484: fb ff ff 4f calli 80041c0 <_Rate_monotonic_Update_statistics>
/*
* This tells the _Rate_monotonic_Timeout that this task is
* in the process of blocking on the period and that we
* may be changing the length of the next period.
*/
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
8004488: 34 01 00 01 mvi r1,1
800448c: 59 61 00 38 sw (r11+56),r1
the_period->next_length = length;
8004490: 59 6e 00 3c sw (r11+60),r14
_ISR_Enable( level );
8004494: d0 0f 00 00 wcsr IE,r15
_Thread_Executing->Wait.id = the_period->Object.id;
8004498: 29 83 00 0c lw r3,(r12+12)
800449c: 29 64 00 08 lw r4,(r11+8)
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
80044a0: 34 02 40 00 mvi r2,16384
80044a4: b8 60 08 00 mv r1,r3
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
the_period->next_length = length;
_ISR_Enable( level );
_Thread_Executing->Wait.id = the_period->Object.id;
80044a8: 58 64 00 20 sw (r3+32),r4
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
80044ac: f8 00 10 3e calli 80085a4 <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
80044b0: 90 00 08 00 rcsr r1,IE
80044b4: 34 02 ff fe mvi r2,-2
80044b8: a0 22 10 00 and r2,r1,r2
80044bc: d0 02 00 00 wcsr IE,r2
local_state = the_period->state;
the_period->state = RATE_MONOTONIC_ACTIVE;
80044c0: 34 03 00 02 mvi r3,2
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
80044c4: 29 62 00 38 lw r2,(r11+56)
the_period->state = RATE_MONOTONIC_ACTIVE;
80044c8: 59 63 00 38 sw (r11+56),r3
_ISR_Enable( level );
80044cc: d0 01 00 00 wcsr IE,r1
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
80044d0: 34 01 00 03 mvi r1,3
80044d4: 44 41 00 04 be r2,r1,80044e4 <rtems_rate_monotonic_period+0x1fc><== NEVER TAKEN
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
80044d8: f8 00 0d 99 calli 8007b3c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80044dc: 34 01 00 00 mvi r1,0
80044e0: e3 ff ff 95 bi 8004334 <rtems_rate_monotonic_period+0x4c>
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
80044e4: 29 81 00 0c lw r1,(r12+12) <== NOT EXECUTED
80044e8: 34 02 40 00 mvi r2,16384 <== NOT EXECUTED
80044ec: f8 00 0c b9 calli 80077d0 <_Thread_Clear_state> <== NOT EXECUTED
80044f0: e3 ff ff fa bi 80044d8 <rtems_rate_monotonic_period+0x1f0> <== NOT EXECUTED
080044f4 <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
80044f4: 37 9c ff 5c addi sp,sp,-164
80044f8: 5b 8b 00 44 sw (sp+68),r11
80044fc: 5b 8c 00 40 sw (sp+64),r12
8004500: 5b 8d 00 3c sw (sp+60),r13
8004504: 5b 8e 00 38 sw (sp+56),r14
8004508: 5b 8f 00 34 sw (sp+52),r15
800450c: 5b 90 00 30 sw (sp+48),r16
8004510: 5b 91 00 2c sw (sp+44),r17
8004514: 5b 92 00 28 sw (sp+40),r18
8004518: 5b 93 00 24 sw (sp+36),r19
800451c: 5b 94 00 20 sw (sp+32),r20
8004520: 5b 95 00 1c sw (sp+28),r21
8004524: 5b 96 00 18 sw (sp+24),r22
8004528: 5b 97 00 14 sw (sp+20),r23
800452c: 5b 98 00 10 sw (sp+16),r24
8004530: 5b 99 00 0c sw (sp+12),r25
8004534: 5b 9b 00 08 sw (sp+8),fp
8004538: 5b 9d 00 04 sw (sp+4),ra
800453c: b8 40 68 00 mv r13,r2
8004540: b8 20 78 00 mv r15,r1
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
8004544: 44 40 00 2f be r2,r0,8004600 <rtems_rate_monotonic_report_statistics_with_plugin+0x10c><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
8004548: 78 02 08 01 mvhi r2,0x801
800454c: 38 42 ef 94 ori r2,r2,0xef94
8004550: d9 a0 00 00 call r13
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
8004554: 78 02 08 01 mvhi r2,0x801
8004558: 38 42 ef b4 ori r2,r2,0xefb4
800455c: b9 e0 08 00 mv r1,r15
8004560: d9 a0 00 00 call r13
(*print)( context, "--- Wall times are in seconds ---\n" );
8004564: 78 02 08 01 mvhi r2,0x801
8004568: 38 42 ef d8 ori r2,r2,0xefd8
800456c: b9 e0 08 00 mv r1,r15
8004570: d9 a0 00 00 call r13
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
8004574: 78 02 08 01 mvhi r2,0x801
8004578: 38 42 ef fc ori r2,r2,0xeffc
800457c: b9 e0 08 00 mv r1,r15
8004580: d9 a0 00 00 call r13
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
8004584: 78 02 08 01 mvhi r2,0x801
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
8004588: 78 0c 08 02 mvhi r12,0x802
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
800458c: b9 e0 08 00 mv r1,r15
8004590: 38 42 f0 48 ori r2,r2,0xf048
/*
* 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 ;
8004594: 39 8c 18 90 ori r12,r12,0x1890
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
8004598: d9 a0 00 00 call r13
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
800459c: 29 81 00 0c lw r1,(r12+12)
80045a0: 29 8b 00 08 lw r11,(r12+8)
80045a4: 55 61 00 17 bgu r11,r1,8004600 <rtems_rate_monotonic_report_statistics_with_plugin+0x10c><== NEVER TAKEN
rtems_object_get_name( the_status.owner, sizeof(name), name );
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
80045a8: 78 12 08 01 mvhi r18,0x801
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
(*print)( context,
80045ac: 78 15 08 01 mvhi r21,0x801
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
(*print)( context,
80045b0: 78 14 08 01 mvhi r20,0x801
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
80045b4: 78 11 08 01 mvhi r17,0x801
80045b8: 37 90 00 48 addi r16,sp,72
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
80045bc: 37 98 00 80 addi r24,sp,128
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
80045c0: 37 93 00 a0 addi r19,sp,160
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
80045c4: 3a 52 f0 94 ori r18,r18,0xf094
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
80045c8: 37 97 00 60 addi r23,sp,96
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
80045cc: 37 96 00 98 addi r22,sp,152
(*print)( context,
80045d0: 3a b5 f0 ac ori r21,r21,0xf0ac
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
80045d4: 37 9b 00 78 addi fp,sp,120
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
(*print)( context,
80045d8: 3a 94 f0 cc ori r20,r20,0xf0cc
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
80045dc: 3a 31 e5 d0 ori r17,r17,0xe5d0
* 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 );
80045e0: b9 60 08 00 mv r1,r11
80045e4: ba 00 10 00 mv r2,r16
80045e8: f8 00 1e 63 calli 800bf74 <rtems_rate_monotonic_get_statistics>
80045ec: b8 20 70 00 mv r14,r1
if ( status != RTEMS_SUCCESSFUL )
80045f0: 44 20 00 17 be r1,r0,800464c <rtems_rate_monotonic_report_statistics_with_plugin+0x158>
/*
* 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 ;
80045f4: 29 85 00 0c lw r5,(r12+12)
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
80045f8: 35 6b 00 01 addi r11,r11,1
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80045fc: 50 ab ff f9 bgeu r5,r11,80045e0 <rtems_rate_monotonic_report_statistics_with_plugin+0xec>
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
8004600: 2b 9d 00 04 lw ra,(sp+4)
8004604: 2b 8b 00 44 lw r11,(sp+68)
8004608: 2b 8c 00 40 lw r12,(sp+64)
800460c: 2b 8d 00 3c lw r13,(sp+60)
8004610: 2b 8e 00 38 lw r14,(sp+56)
8004614: 2b 8f 00 34 lw r15,(sp+52)
8004618: 2b 90 00 30 lw r16,(sp+48)
800461c: 2b 91 00 2c lw r17,(sp+44)
8004620: 2b 92 00 28 lw r18,(sp+40)
8004624: 2b 93 00 24 lw r19,(sp+36)
8004628: 2b 94 00 20 lw r20,(sp+32)
800462c: 2b 95 00 1c lw r21,(sp+28)
8004630: 2b 96 00 18 lw r22,(sp+24)
8004634: 2b 97 00 14 lw r23,(sp+20)
8004638: 2b 98 00 10 lw r24,(sp+16)
800463c: 2b 99 00 0c lw r25,(sp+12)
8004640: 2b 9b 00 08 lw fp,(sp+8)
8004644: 37 9c 00 a4 addi sp,sp,164
8004648: c3 a0 00 00 ret
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
800464c: bb 00 10 00 mv r2,r24
8004650: b9 60 08 00 mv r1,r11
8004654: f8 00 1e 88 calli 800c074 <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
8004658: 2b 81 00 80 lw r1,(sp+128)
800465c: ba 60 18 00 mv r3,r19
8004660: 34 02 00 05 mvi r2,5
8004664: f8 00 00 ba calli 800494c <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
8004668: 2b 85 00 48 lw r5,(sp+72)
800466c: 2b 86 00 4c lw r6,(sp+76)
8004670: ba 40 10 00 mv r2,r18
8004674: b9 60 18 00 mv r3,r11
8004678: b9 e0 08 00 mv r1,r15
800467c: ba 60 20 00 mv r4,r19
8004680: d9 a0 00 00 call r13
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
8004684: 2b 85 00 48 lw r5,(sp+72)
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
8004688: ba c0 18 00 mv r3,r22
800468c: ba e0 08 00 mv r1,r23
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
8004690: ba 20 10 00 mv r2,r17
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
8004694: 5c ae 00 04 bne r5,r14,80046a4 <rtems_rate_monotonic_report_statistics_with_plugin+0x1b0>
(*print)( context, "\n" );
8004698: b9 e0 08 00 mv r1,r15
800469c: d9 a0 00 00 call r13
continue;
80046a0: e3 ff ff d5 bi 80045f4 <rtems_rate_monotonic_report_statistics_with_plugin+0x100>
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
80046a4: b8 a0 10 00 mv r2,r5
80046a8: f8 00 10 b7 calli 8008984 <_Timespec_Divide_by_integer>
(*print)( context,
80046ac: 2b 81 00 54 lw r1,(sp+84)
80046b0: 34 02 03 e8 mvi r2,1000
80046b4: f8 00 62 ac calli 801d164 <__divsi3>
80046b8: b8 20 c8 00 mv r25,r1
80046bc: 2b 81 00 5c lw r1,(sp+92)
80046c0: 34 02 03 e8 mvi r2,1000
80046c4: f8 00 62 a8 calli 801d164 <__divsi3>
80046c8: b8 20 70 00 mv r14,r1
80046cc: 2b 81 00 9c lw r1,(sp+156)
80046d0: 34 02 03 e8 mvi r2,1000
80046d4: f8 00 62 a4 calli 801d164 <__divsi3>
80046d8: 2b 85 00 58 lw r5,(sp+88)
80046dc: 2b 87 00 98 lw r7,(sp+152)
80046e0: 2b 83 00 50 lw r3,(sp+80)
80046e4: b8 20 40 00 mv r8,r1
80046e8: bb 20 20 00 mv r4,r25
80046ec: b9 c0 30 00 mv r6,r14
80046f0: ba a0 10 00 mv r2,r21
80046f4: b9 e0 08 00 mv r1,r15
80046f8: d9 a0 00 00 call r13
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
80046fc: 2b 82 00 48 lw r2,(sp+72)
8004700: ba c0 18 00 mv r3,r22
8004704: bb 60 08 00 mv r1,fp
8004708: f8 00 10 9f calli 8008984 <_Timespec_Divide_by_integer>
(*print)( context,
800470c: 2b 81 00 6c lw r1,(sp+108)
8004710: 34 02 03 e8 mvi r2,1000
8004714: f8 00 62 94 calli 801d164 <__divsi3>
8004718: b8 20 c8 00 mv r25,r1
800471c: 2b 81 00 74 lw r1,(sp+116)
8004720: 34 02 03 e8 mvi r2,1000
8004724: f8 00 62 90 calli 801d164 <__divsi3>
8004728: b8 20 70 00 mv r14,r1
800472c: 2b 81 00 9c lw r1,(sp+156)
8004730: 34 02 03 e8 mvi r2,1000
8004734: f8 00 62 8c calli 801d164 <__divsi3>
8004738: 2b 83 00 68 lw r3,(sp+104)
800473c: 2b 85 00 70 lw r5,(sp+112)
8004740: 2b 87 00 98 lw r7,(sp+152)
8004744: b8 20 40 00 mv r8,r1
8004748: ba 80 10 00 mv r2,r20
800474c: b9 e0 08 00 mv r1,r15
8004750: bb 20 20 00 mv r4,r25
8004754: b9 c0 30 00 mv r6,r14
8004758: d9 a0 00 00 call r13
800475c: e3 ff ff a6 bi 80045f4 <rtems_rate_monotonic_report_statistics_with_plugin+0x100>
08004784 <rtems_rate_monotonic_reset_all_statistics>:
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
8004784: 37 9c ff f4 addi sp,sp,-12
8004788: 5b 8b 00 0c sw (sp+12),r11
800478c: 5b 8c 00 08 sw (sp+8),r12
8004790: 5b 9d 00 04 sw (sp+4),ra
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8004794: 78 01 08 02 mvhi r1,0x802
8004798: 38 21 19 b8 ori r1,r1,0x19b8
800479c: 28 22 00 00 lw r2,(r1+0)
80047a0: 34 42 00 01 addi r2,r2,1
80047a4: 58 22 00 00 sw (r1+0),r2
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80047a8: 78 0c 08 02 mvhi r12,0x802
80047ac: 39 8c 18 90 ori r12,r12,0x1890
80047b0: 29 8b 00 08 lw r11,(r12+8)
80047b4: 29 81 00 0c lw r1,(r12+12)
80047b8: 55 61 00 06 bgu r11,r1,80047d0 <rtems_rate_monotonic_reset_all_statistics+0x4c><== NEVER TAKEN
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
80047bc: b9 60 08 00 mv r1,r11
80047c0: f8 00 00 0a calli 80047e8 <rtems_rate_monotonic_reset_statistics>
/*
* 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 ;
80047c4: 29 81 00 0c lw r1,(r12+12)
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
80047c8: 35 6b 00 01 addi r11,r11,1
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80047cc: 50 2b ff fc bgeu r1,r11,80047bc <rtems_rate_monotonic_reset_all_statistics+0x38>
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
80047d0: f8 00 0c db calli 8007b3c <_Thread_Enable_dispatch>
}
80047d4: 2b 9d 00 04 lw ra,(sp+4)
80047d8: 2b 8b 00 0c lw r11,(sp+12)
80047dc: 2b 8c 00 08 lw r12,(sp+8)
80047e0: 37 9c 00 0c addi sp,sp,12
80047e4: c3 a0 00 00 ret
08012fa4 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
8012fa4: 37 9c ff f4 addi sp,sp,-12
8012fa8: 5b 8b 00 08 sw (sp+8),r11
8012fac: 5b 9d 00 04 sw (sp+4),ra
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
8012fb0: 34 03 00 0a mvi r3,10
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
8012fb4: b8 40 58 00 mv r11,r2
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
8012fb8: 5c 40 00 06 bne r2,r0,8012fd0 <rtems_signal_send+0x2c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8012fbc: b8 60 08 00 mv r1,r3
8012fc0: 2b 9d 00 04 lw ra,(sp+4)
8012fc4: 2b 8b 00 08 lw r11,(sp+8)
8012fc8: 37 9c 00 0c addi sp,sp,12
8012fcc: c3 a0 00 00 ret
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
8012fd0: 37 82 00 0c addi r2,sp,12
8012fd4: f8 00 15 95 calli 8018628 <_Thread_Get>
switch ( location ) {
8012fd8: 2b 83 00 0c lw r3,(sp+12)
8012fdc: 44 60 00 07 be r3,r0,8012ff8 <rtems_signal_send+0x54>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8012fe0: 34 03 00 04 mvi r3,4
}
8012fe4: b8 60 08 00 mv r1,r3
8012fe8: 2b 9d 00 04 lw ra,(sp+4)
8012fec: 2b 8b 00 08 lw r11,(sp+8)
8012ff0: 37 9c 00 0c addi sp,sp,12
8012ff4: c3 a0 00 00 ret
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
8012ff8: 28 22 01 1c lw r2,(r1+284)
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
8012ffc: 28 44 00 0c lw r4,(r2+12)
8013000: 44 83 00 23 be r4,r3,801308c <rtems_signal_send+0xe8>
if ( asr->is_enabled ) {
8013004: 40 43 00 08 lbu r3,(r2+8)
8013008: 44 60 00 12 be r3,r0,8013050 <rtems_signal_send+0xac>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
801300c: 90 00 18 00 rcsr r3,IE
8013010: 34 04 ff fe mvi r4,-2
8013014: a0 64 20 00 and r4,r3,r4
8013018: d0 04 00 00 wcsr IE,r4
*signal_set |= signals;
801301c: 28 44 00 14 lw r4,(r2+20)
8013020: b8 8b 58 00 or r11,r4,r11
8013024: 58 4b 00 14 sw (r2+20),r11
_ISR_Enable( _level );
8013028: d0 03 00 00 wcsr IE,r3
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
801302c: 78 02 08 04 mvhi r2,0x804
8013030: 38 42 11 88 ori r2,r2,0x1188
8013034: 28 43 00 08 lw r3,(r2+8)
8013038: 44 60 00 0e be r3,r0,8013070 <rtems_signal_send+0xcc>
801303c: 28 43 00 0c lw r3,(r2+12)
8013040: 5c 23 00 0c bne r1,r3,8013070 <rtems_signal_send+0xcc> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
8013044: 34 01 00 01 mvi r1,1
8013048: 30 41 00 18 sb (r2+24),r1
801304c: e0 00 00 09 bi 8013070 <rtems_signal_send+0xcc>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
8013050: 90 00 08 00 rcsr r1,IE
8013054: 34 03 ff fe mvi r3,-2
8013058: a0 23 18 00 and r3,r1,r3
801305c: d0 03 00 00 wcsr IE,r3
*signal_set |= signals;
8013060: 28 43 00 18 lw r3,(r2+24)
8013064: b8 6b 58 00 or r11,r3,r11
8013068: 58 4b 00 18 sw (r2+24),r11
_ISR_Enable( _level );
801306c: d0 01 00 00 wcsr IE,r1
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
8013070: f8 00 15 61 calli 80185f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8013074: 34 03 00 00 mvi r3,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8013078: b8 60 08 00 mv r1,r3
801307c: 2b 9d 00 04 lw ra,(sp+4)
8013080: 2b 8b 00 08 lw r11,(sp+8)
8013084: 37 9c 00 0c addi sp,sp,12
8013088: c3 a0 00 00 ret
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
801308c: f8 00 15 5a calli 80185f4 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
8013090: 34 03 00 0b mvi r3,11
8013094: e3 ff ff ca bi 8012fbc <rtems_signal_send+0x18>
080013e4 <rtems_stack_checker_begin_extension>:
Thread_Control *the_thread
)
{
Stack_check_Control *the_pattern;
if ( the_thread->Object.id == 0 ) /* skip system tasks */
80013e4: 28 22 00 08 lw r2,(r1+8)
80013e8: 44 40 00 0c be r2,r0,8001418 <rtems_stack_checker_begin_extension+0x34><== NEVER TAKEN
return;
the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack);
*the_pattern = Stack_check_Pattern;
80013ec: 78 02 08 01 mvhi r2,0x801
80013f0: 38 42 87 50 ori r2,r2,0x8750
80013f4: 28 43 00 00 lw r3,(r2+0)
80013f8: 28 21 00 bc lw r1,(r1+188)
80013fc: 58 23 00 08 sw (r1+8),r3
8001400: 28 43 00 04 lw r3,(r2+4)
8001404: 58 23 00 0c sw (r1+12),r3
8001408: 28 43 00 08 lw r3,(r2+8)
800140c: 58 23 00 10 sw (r1+16),r3
8001410: 28 42 00 0c lw r2,(r2+12)
8001414: 58 22 00 14 sw (r1+20),r2
8001418: c3 a0 00 00 ret
080013a8 <rtems_stack_checker_create_extension>:
*/
bool rtems_stack_checker_create_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *the_thread
)
{
80013a8: 37 9c ff f8 addi sp,sp,-8
80013ac: 5b 8b 00 08 sw (sp+8),r11
80013b0: 5b 9d 00 04 sw (sp+4),ra
80013b4: b8 40 58 00 mv r11,r2
Stack_check_Initialize();
80013b8: fb ff ff ce calli 80012f0 <Stack_check_Initialize>
if (the_thread)
80013bc: 45 60 00 05 be r11,r0,80013d0 <rtems_stack_checker_create_extension+0x28><== NEVER TAKEN
Stack_check_Dope_stack(&the_thread->Start.Initial_stack);
80013c0: 29 61 00 bc lw r1,(r11+188)
80013c4: 29 63 00 b8 lw r3,(r11+184)
80013c8: 34 02 00 a5 mvi r2,165
80013cc: f8 00 3d f4 calli 8010b9c <memset>
return true;
}
80013d0: 34 01 00 01 mvi r1,1
80013d4: 2b 9d 00 04 lw ra,(sp+4)
80013d8: 2b 8b 00 08 lw r11,(sp+8)
80013dc: 37 9c 00 08 addi sp,sp,8
80013e0: c3 a0 00 00 ret
08001558 <rtems_stack_checker_is_blown>:
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
{
8001558: 37 9c ff f0 addi sp,sp,-16
800155c: 5b 9b 00 08 sw (sp+8),fp
8001560: 34 1b 00 10 mvi fp,16
8001564: b7 7c d8 00 add fp,fp,sp
8001568: 5b 8b 00 10 sw (sp+16),r11
800156c: 5b 8c 00 0c sw (sp+12),r12
8001570: 5b 9d 00 04 sw (sp+4),ra
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
8001574: 78 0b 08 01 mvhi r11,0x801
8001578: 39 6b 8d dc ori r11,r11,0x8ddc
800157c: 29 62 00 0c lw r2,(r11+12)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
return false;
8001580: 34 0c 00 00 mvi r12,0
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
8001584: 28 41 00 bc lw r1,(r2+188)
8001588: 54 3b 00 04 bgu r1,fp,8001598 <rtems_stack_checker_is_blown+0x40><== NEVER TAKEN
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
800158c: 28 4c 00 b8 lw r12,(r2+184)
}
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
8001590: b4 2c 60 00 add r12,r1,r12
8001594: f1 9b 60 00 cmpgeu r12,r12,fp
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
8001598: 78 02 08 01 mvhi r2,0x801
800159c: 38 42 86 c4 ori r2,r2,0x86c4
80015a0: 28 43 00 00 lw r3,(r2+0)
*/
bool rtems_stack_checker_is_blown( void )
{
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
bool sp_ok;
bool pattern_ok = true;
80015a4: 34 02 00 01 mvi r2,1
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
80015a8: 44 60 00 07 be r3,r0,80015c4 <rtems_stack_checker_is_blown+0x6c><== NEVER TAKEN
pattern_ok = (!memcmp(
80015ac: 78 02 08 01 mvhi r2,0x801
80015b0: 38 42 87 50 ori r2,r2,0x8750
80015b4: 34 21 00 08 addi r1,r1,8
80015b8: 34 03 00 10 mvi r3,16
80015bc: f8 00 3d 16 calli 8010a14 <memcmp>
80015c0: 64 22 00 00 cmpei r2,r1,0
/*
* Let's report as much as we can.
*/
if ( !sp_ok || !pattern_ok ) {
80015c4: 45 80 00 09 be r12,r0,80015e8 <rtems_stack_checker_is_blown+0x90><== NEVER TAKEN
80015c8: 44 40 00 08 be r2,r0,80015e8 <rtems_stack_checker_is_blown+0x90><== NEVER TAKEN
/*
* The Stack Pointer and the Pattern Area are OK so return false.
*/
return false;
}
80015cc: 34 01 00 00 mvi r1,0
80015d0: 2b 9d 00 04 lw ra,(sp+4)
80015d4: 2b 8b 00 10 lw r11,(sp+16)
80015d8: 2b 8c 00 0c lw r12,(sp+12)
80015dc: 2b 9b 00 08 lw fp,(sp+8)
80015e0: 37 9c 00 10 addi sp,sp,16
80015e4: c3 a0 00 00 ret
/*
* Let's report as much as we can.
*/
if ( !sp_ok || !pattern_ok ) {
Stack_check_report_blown_task( _Thread_Executing, pattern_ok );
80015e8: 29 61 00 0c lw r1,(r11+12) <== NOT EXECUTED
80015ec: fb ff ff 8c calli 800141c <Stack_check_report_blown_task> <== NOT EXECUTED
080015f0 <rtems_stack_checker_report_usage_with_plugin>:
void rtems_stack_checker_report_usage_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
80015f0: 37 9c ff ec addi sp,sp,-20
80015f4: 5b 8b 00 14 sw (sp+20),r11
80015f8: 5b 8c 00 10 sw (sp+16),r12
80015fc: 5b 8d 00 0c sw (sp+12),r13
8001600: 5b 8e 00 08 sw (sp+8),r14
8001604: 5b 9d 00 04 sw (sp+4),ra
8001608: b8 40 58 00 mv r11,r2
800160c: b8 20 70 00 mv r14,r1
if ( !print )
8001610: 44 40 00 15 be r2,r0,8001664 <rtems_stack_checker_report_usage_with_plugin+0x74><== NEVER TAKEN
return;
print_context = context;
8001614: 78 0d 08 01 mvhi r13,0x801
print_handler = print;
8001618: 78 0c 08 01 mvhi r12,0x801
)
{
if ( !print )
return;
print_context = context;
800161c: 39 ad 86 bc ori r13,r13,0x86bc
print_handler = print;
8001620: 39 8c 86 c0 ori r12,r12,0x86c0
(*print)( context, "Stack usage by thread\n");
8001624: 78 02 08 01 mvhi r2,0x801
8001628: 38 42 68 8c ori r2,r2,0x688c
)
{
if ( !print )
return;
print_context = context;
800162c: 59 a1 00 00 sw (r13+0),r1
print_handler = print;
8001630: 59 8b 00 00 sw (r12+0),r11
(*print)( context, "Stack usage by thread\n");
8001634: d9 60 00 00 call r11
(*print)( context,
8001638: 78 02 08 01 mvhi r2,0x801
800163c: 38 42 68 a4 ori r2,r2,0x68a4
8001640: b9 c0 08 00 mv r1,r14
8001644: d9 60 00 00 call r11
" ID NAME LOW HIGH CURRENT AVAILABLE USED\n"
);
/* iterate over all threads and dump the usage */
rtems_iterate_over_all_threads( Stack_check_Dump_threads_usage );
8001648: 78 01 08 00 mvhi r1,0x800
800164c: 38 21 11 1c ori r1,r1,0x111c
8001650: f8 00 18 37 calli 800772c <rtems_iterate_over_all_threads>
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
/* dump interrupt stack info if any */
Stack_check_Dump_threads_usage((Thread_Control *) -1);
8001654: 34 01 ff ff mvi r1,-1
8001658: fb ff fe b1 calli 800111c <Stack_check_Dump_threads_usage>
#endif
print_context = NULL;
800165c: 59 a0 00 00 sw (r13+0),r0
print_handler = NULL;
8001660: 59 80 00 00 sw (r12+0),r0
}
8001664: 2b 9d 00 04 lw ra,(sp+4)
8001668: 2b 8b 00 14 lw r11,(sp+20)
800166c: 2b 8c 00 10 lw r12,(sp+16)
8001670: 2b 8d 00 0c lw r13,(sp+12)
8001674: 2b 8e 00 08 lw r14,(sp+8)
8001678: 37 9c 00 14 addi sp,sp,20
800167c: c3 a0 00 00 ret
080014d8 <rtems_stack_checker_switch_extension>:
*/
void rtems_stack_checker_switch_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *heir __attribute__((unused))
)
{
80014d8: 37 9c ff f4 addi sp,sp,-12
80014dc: 5b 9b 00 08 sw (sp+8),fp
80014e0: 34 1b 00 0c mvi fp,12
80014e4: b7 7c d8 00 add fp,fp,sp
80014e8: 5b 8b 00 0c sw (sp+12),r11
80014ec: 5b 9d 00 04 sw (sp+4),ra
Stack_Control *the_stack = &running->Start.Initial_stack;
void *pattern;
bool sp_ok;
bool pattern_ok = true;
pattern = Stack_check_Get_pattern_area(the_stack);
80014f0: 28 22 00 bc lw r2,(r1+188)
*/
void rtems_stack_checker_switch_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *heir __attribute__((unused))
)
{
80014f4: b8 20 58 00 mv r11,r1
Stack_Control *the_stack = &running->Start.Initial_stack;
void *pattern;
bool sp_ok;
bool pattern_ok = true;
pattern = Stack_check_Get_pattern_area(the_stack);
80014f8: 34 41 00 08 addi r1,r2,8
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
80014fc: 54 5b 00 04 bgu r2,fp,800150c <rtems_stack_checker_switch_extension+0x34><== NEVER TAKEN
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
8001500: 29 63 00 b8 lw r3,(r11+184)
8001504: b4 43 10 00 add r2,r2,r3
8001508: 50 5b 00 08 bgeu r2,fp,8001528 <rtems_stack_checker_switch_extension+0x50>
/*
* Check for an out of bounds stack pointer or an overwrite
*/
sp_ok = Stack_check_Frame_pointer_in_range( the_stack );
pattern_ok = (!memcmp( pattern,
800150c: 78 02 08 01 mvhi r2,0x801
8001510: 38 42 87 50 ori r2,r2,0x8750
8001514: 34 03 00 10 mvi r3,16
8001518: f8 00 3d 3f calli 8010a14 <memcmp>
800151c: 64 22 00 00 cmpei r2,r1,0
(void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES));
if ( !sp_ok || !pattern_ok ) {
Stack_check_report_blown_task( running, pattern_ok );
8001520: b9 60 08 00 mv r1,r11
8001524: fb ff ff be calli 800141c <Stack_check_report_blown_task>
/*
* Check for an out of bounds stack pointer or an overwrite
*/
sp_ok = Stack_check_Frame_pointer_in_range( the_stack );
pattern_ok = (!memcmp( pattern,
8001528: 78 02 08 01 mvhi r2,0x801
800152c: 38 42 87 50 ori r2,r2,0x8750
8001530: 34 03 00 10 mvi r3,16
8001534: f8 00 3d 38 calli 8010a14 <memcmp>
(void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES));
if ( !sp_ok || !pattern_ok ) {
8001538: 5c 20 00 06 bne r1,r0,8001550 <rtems_stack_checker_switch_extension+0x78>
Stack_check_report_blown_task( running, pattern_ok );
}
}
800153c: 2b 9d 00 04 lw ra,(sp+4)
8001540: 2b 8b 00 0c lw r11,(sp+12)
8001544: 2b 9b 00 08 lw fp,(sp+8)
8001548: 37 9c 00 0c addi sp,sp,12
800154c: c3 a0 00 00 ret
sp_ok = Stack_check_Frame_pointer_in_range( the_stack );
pattern_ok = (!memcmp( pattern,
(void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES));
if ( !sp_ok || !pattern_ok ) {
8001550: 34 02 00 00 mvi r2,0
8001554: e3 ff ff f3 bi 8001520 <rtems_stack_checker_switch_extension+0x48>
080093d8 <rtems_string_to_double>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80093d8: 37 9c ff e4 addi sp,sp,-28
80093dc: 5b 8b 00 18 sw (sp+24),r11
80093e0: 5b 8c 00 14 sw (sp+20),r12
80093e4: 5b 8d 00 10 sw (sp+16),r13
80093e8: 5b 8e 00 0c sw (sp+12),r14
80093ec: 5b 8f 00 08 sw (sp+8),r15
80093f0: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
80093f4: 34 04 00 09 mvi r4,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80093f8: b8 40 58 00 mv r11,r2
80093fc: b8 20 60 00 mv r12,r1
8009400: b8 60 68 00 mv r13,r3
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009404: 44 40 00 1a be r2,r0,800946c <rtems_string_to_double+0x94>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009408: f8 00 11 bf calli 800db04 <__errno>
800940c: 58 20 00 00 sw (r1+0),r0
*n = 0;
8009410: 59 60 00 00 sw (r11+0),r0
8009414: 59 60 00 04 sw (r11+4),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
8009418: b9 80 08 00 mv r1,r12
800941c: 37 82 00 1c addi r2,sp,28
8009420: f8 00 1c c7 calli 801073c <strtod>
8009424: b8 20 78 00 mv r15,r1
8009428: b8 40 70 00 mv r14,r2
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
800942c: 45 a0 00 1f be r13,r0,80094a8 <rtems_string_to_double+0xd0>
*endptr = end;
8009430: 2b 85 00 1c lw r5,(sp+28)
8009434: 59 a5 00 00 sw (r13+0),r5
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
8009438: 34 04 00 0b mvi r4,11
/* If the user wants the end pointer back, then return it. */
if ( endptr )
*endptr = end;
/* nothing was converted */
if ( end == s )
800943c: 45 85 00 0c be r12,r5,800946c <rtems_string_to_double+0x94>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009440: 78 01 08 02 mvhi r1,0x802
8009444: 38 21 0f dc ori r1,r1,0xfdc
8009448: 28 23 00 00 lw r3,(r1+0)
800944c: b9 c0 10 00 mv r2,r14
8009450: b9 e0 08 00 mv r1,r15
8009454: 34 04 ff ff mvi r4,-1
8009458: f8 00 4a 58 calli 801bdb8 <__gedf2>
800945c: 48 20 00 0d bg r1,r0,8009490 <rtems_string_to_double+0xb8>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
8009460: 59 6f 00 00 sw (r11+0),r15
8009464: 59 6e 00 04 sw (r11+4),r14
#endif
return RTEMS_SUCCESSFUL;
8009468: 34 04 00 00 mvi r4,0
}
800946c: b8 80 08 00 mv r1,r4
8009470: 2b 9d 00 04 lw ra,(sp+4)
8009474: 2b 8b 00 18 lw r11,(sp+24)
8009478: 2b 8c 00 14 lw r12,(sp+20)
800947c: 2b 8d 00 10 lw r13,(sp+16)
8009480: 2b 8e 00 0c lw r14,(sp+12)
8009484: 2b 8f 00 08 lw r15,(sp+8)
8009488: 37 9c 00 1c addi sp,sp,28
800948c: c3 a0 00 00 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009490: f8 00 11 9d calli 800db04 <__errno>
8009494: 28 22 00 00 lw r2,(r1+0)
8009498: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
800949c: 34 04 00 0a mvi r4,10
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
80094a0: 5c 41 ff f0 bne r2,r1,8009460 <rtems_string_to_double+0x88><== NEVER TAKEN
80094a4: e3 ff ff f2 bi 800946c <rtems_string_to_double+0x94>
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
80094a8: 2b 85 00 1c lw r5,(sp+28)
80094ac: e3 ff ff e3 bi 8009438 <rtems_string_to_double+0x60>
080094b0 <rtems_string_to_float>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80094b0: 37 9c ff e8 addi sp,sp,-24
80094b4: 5b 8b 00 14 sw (sp+20),r11
80094b8: 5b 8c 00 10 sw (sp+16),r12
80094bc: 5b 8d 00 0c sw (sp+12),r13
80094c0: 5b 8e 00 08 sw (sp+8),r14
80094c4: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
80094c8: 34 04 00 09 mvi r4,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80094cc: b8 40 58 00 mv r11,r2
80094d0: b8 20 60 00 mv r12,r1
80094d4: b8 60 68 00 mv r13,r3
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
80094d8: 44 40 00 15 be r2,r0,800952c <rtems_string_to_float+0x7c>
return RTEMS_INVALID_ADDRESS;
errno = 0;
80094dc: f8 00 11 8a calli 800db04 <__errno>
80094e0: 58 20 00 00 sw (r1+0),r0
*n = 0;
80094e4: 59 60 00 00 sw (r11+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
80094e8: b9 80 08 00 mv r1,r12
80094ec: 37 82 00 18 addi r2,sp,24
80094f0: f8 00 1c 9f calli 801076c <strtof>
80094f4: b8 20 70 00 mv r14,r1
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
80094f8: 45 a0 00 1b be r13,r0,8009564 <rtems_string_to_float+0xb4>
*endptr = end;
80094fc: 2b 82 00 18 lw r2,(sp+24)
8009500: 59 a2 00 00 sw (r13+0),r2
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
8009504: 34 04 00 0b mvi r4,11
/* If the user wants the end pointer back, then return it. */
if ( endptr )
*endptr = end;
/* nothing was converted */
if ( end == s )
8009508: 45 82 00 09 be r12,r2,800952c <rtems_string_to_float+0x7c>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
800950c: 78 01 08 02 mvhi r1,0x802
8009510: 38 21 0f e0 ori r1,r1,0xfe0
8009514: 28 22 00 00 lw r2,(r1+0)
8009518: b9 c0 08 00 mv r1,r14
800951c: f8 00 44 2d calli 801a5d0 <__gesf2>
8009520: 48 20 00 0b bg r1,r0,800954c <rtems_string_to_float+0x9c>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
8009524: 59 6e 00 00 sw (r11+0),r14
#endif
return RTEMS_SUCCESSFUL;
8009528: 34 04 00 00 mvi r4,0
}
800952c: b8 80 08 00 mv r1,r4
8009530: 2b 9d 00 04 lw ra,(sp+4)
8009534: 2b 8b 00 14 lw r11,(sp+20)
8009538: 2b 8c 00 10 lw r12,(sp+16)
800953c: 2b 8d 00 0c lw r13,(sp+12)
8009540: 2b 8e 00 08 lw r14,(sp+8)
8009544: 37 9c 00 18 addi sp,sp,24
8009548: c3 a0 00 00 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
800954c: f8 00 11 6e calli 800db04 <__errno>
8009550: 28 22 00 00 lw r2,(r1+0)
8009554: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
8009558: 34 04 00 0a mvi r4,10
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
800955c: 5c 41 ff f2 bne r2,r1,8009524 <rtems_string_to_float+0x74> <== NEVER TAKEN
8009560: e3 ff ff f3 bi 800952c <rtems_string_to_float+0x7c>
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009564: 2b 82 00 18 lw r2,(sp+24)
8009568: e3 ff ff e7 bi 8009504 <rtems_string_to_float+0x54>
08009628 <rtems_string_to_long_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009628: 37 9c ff e4 addi sp,sp,-28
800962c: 5b 8b 00 14 sw (sp+20),r11
8009630: 5b 8c 00 10 sw (sp+16),r12
8009634: 5b 8d 00 0c sw (sp+12),r13
8009638: 5b 8e 00 08 sw (sp+8),r14
800963c: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
8009640: 34 05 00 09 mvi r5,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009644: b8 40 58 00 mv r11,r2
8009648: b8 20 68 00 mv r13,r1
800964c: b8 60 70 00 mv r14,r3
8009650: b8 80 60 00 mv r12,r4
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009654: 44 40 00 18 be r2,r0,80096b4 <rtems_string_to_long_long+0x8c>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009658: f8 00 11 2b calli 800db04 <__errno>
800965c: 58 20 00 00 sw (r1+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
8009660: b9 80 18 00 mv r3,r12
if ( !n )
return RTEMS_INVALID_ADDRESS;
errno = 0;
*n = 0;
8009664: 59 60 00 00 sw (r11+0),r0
8009668: 59 60 00 04 sw (r11+4),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
800966c: b9 a0 08 00 mv r1,r13
8009670: 37 82 00 1c addi r2,sp,28
8009674: f8 00 1c ff calli 8010a70 <strtoll>
8009678: b8 20 60 00 mv r12,r1
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
800967c: 45 c0 00 22 be r14,r0,8009704 <rtems_string_to_long_long+0xdc>
*endptr = end;
8009680: 2b 84 00 1c lw r4,(sp+28)
8009684: 59 c4 00 00 sw (r14+0),r4
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
8009688: 34 05 00 0b mvi r5,11
/* If the user wants the end pointer back, then return it. */
if ( endptr )
*endptr = end;
/* nothing was converted */
if ( end == s )
800968c: 45 a4 00 0a be r13,r4,80096b4 <rtems_string_to_long_long+0x8c>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009690: 78 03 08 02 mvhi r3,0x802
8009694: 38 63 08 50 ori r3,r3,0x850
8009698: 28 61 00 00 lw r1,(r3+0)
800969c: 45 81 00 17 be r12,r1,80096f8 <rtems_string_to_long_long+0xd0>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MIN
/* there was an underflow */
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
80096a0: 78 01 80 00 mvhi r1,0x8000
80096a4: 45 81 00 0c be r12,r1,80096d4 <rtems_string_to_long_long+0xac>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
80096a8: 59 6c 00 00 sw (r11+0),r12
80096ac: 59 62 00 04 sw (r11+4),r2
#endif
return RTEMS_SUCCESSFUL;
80096b0: 34 05 00 00 mvi r5,0
}
80096b4: b8 a0 08 00 mv r1,r5
80096b8: 2b 9d 00 04 lw ra,(sp+4)
80096bc: 2b 8b 00 14 lw r11,(sp+20)
80096c0: 2b 8c 00 10 lw r12,(sp+16)
80096c4: 2b 8d 00 0c lw r13,(sp+12)
80096c8: 2b 8e 00 08 lw r14,(sp+8)
80096cc: 37 9c 00 1c addi sp,sp,28
80096d0: c3 a0 00 00 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MIN
/* there was an underflow */
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
80096d4: 5c 40 ff f5 bne r2,r0,80096a8 <rtems_string_to_long_long+0x80><== NEVER TAKEN
80096d8: 5b 82 00 18 sw (sp+24),r2
80096dc: f8 00 11 0a calli 800db04 <__errno>
80096e0: 28 23 00 00 lw r3,(r1+0)
80096e4: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
80096e8: 34 05 00 0a mvi r5,10
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MIN
/* there was an underflow */
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
80096ec: 2b 82 00 18 lw r2,(sp+24)
80096f0: 5c 61 ff ee bne r3,r1,80096a8 <rtems_string_to_long_long+0x80>
80096f4: e3 ff ff f0 bi 80096b4 <rtems_string_to_long_long+0x8c>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
80096f8: 34 01 ff ff mvi r1,-1
80096fc: 5c 41 ff e9 bne r2,r1,80096a0 <rtems_string_to_long_long+0x78><== NEVER TAKEN
8009700: e3 ff ff f6 bi 80096d8 <rtems_string_to_long_long+0xb0>
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009704: 2b 84 00 1c lw r4,(sp+28)
8009708: e3 ff ff e0 bi 8009688 <rtems_string_to_long_long+0x60>
080097d0 <rtems_string_to_pointer>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80097d0: 37 9c ff e8 addi sp,sp,-24
80097d4: 5b 8b 00 14 sw (sp+20),r11
80097d8: 5b 8c 00 10 sw (sp+16),r12
80097dc: 5b 8d 00 0c sw (sp+12),r13
80097e0: 5b 8e 00 08 sw (sp+8),r14
80097e4: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
80097e8: 34 04 00 09 mvi r4,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80097ec: b8 40 58 00 mv r11,r2
80097f0: b8 20 68 00 mv r13,r1
80097f4: b8 60 70 00 mv r14,r3
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
80097f8: 44 40 00 12 be r2,r0,8009840 <rtems_string_to_pointer+0x70>
return RTEMS_INVALID_ADDRESS;
errno = 0;
80097fc: f8 00 10 c2 calli 800db04 <__errno>
8009800: 58 20 00 00 sw (r1+0),r0
*n = 0;
8009804: 59 60 00 00 sw (r11+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
8009808: b9 a0 08 00 mv r1,r13
800980c: 37 82 00 18 addi r2,sp,24
8009810: 34 03 00 10 mvi r3,16
8009814: f8 00 1e 02 calli 801101c <strtoul>
8009818: b8 20 60 00 mv r12,r1
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
800981c: 45 c0 00 17 be r14,r0,8009878 <rtems_string_to_pointer+0xa8>
*endptr = end;
8009820: 2b 82 00 18 lw r2,(sp+24)
8009824: 59 c2 00 00 sw (r14+0),r2
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
8009828: 34 04 00 0b mvi r4,11
/* If the user wants the end pointer back, then return it. */
if ( endptr )
*endptr = end;
/* nothing was converted */
if ( end == s )
800982c: 45 a2 00 05 be r13,r2,8009840 <rtems_string_to_pointer+0x70>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009830: 34 01 ff ff mvi r1,-1
8009834: 45 81 00 0b be r12,r1,8009860 <rtems_string_to_pointer+0x90><== NEVER TAKEN
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
return RTEMS_INVALID_NUMBER;
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
8009838: 59 6c 00 00 sw (r11+0),r12
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
800983c: 34 04 00 00 mvi r4,0
}
8009840: b8 80 08 00 mv r1,r4
8009844: 2b 9d 00 04 lw ra,(sp+4)
8009848: 2b 8b 00 14 lw r11,(sp+20)
800984c: 2b 8c 00 10 lw r12,(sp+16)
8009850: 2b 8d 00 0c lw r13,(sp+12)
8009854: 2b 8e 00 08 lw r14,(sp+8)
8009858: 37 9c 00 18 addi sp,sp,24
800985c: c3 a0 00 00 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009860: f8 00 10 a9 calli 800db04 <__errno> <== NOT EXECUTED
8009864: 28 22 00 00 lw r2,(r1+0) <== NOT EXECUTED
8009868: 34 01 00 22 mvi r1,34 <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
800986c: 34 04 00 0a mvi r4,10 <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009870: 5c 41 ff f2 bne r2,r1,8009838 <rtems_string_to_pointer+0x68><== NOT EXECUTED
8009874: e3 ff ff f3 bi 8009840 <rtems_string_to_pointer+0x70> <== NOT EXECUTED
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009878: 2b 82 00 18 lw r2,(sp+24)
800987c: e3 ff ff eb bi 8009828 <rtems_string_to_pointer+0x58>
08009910 <rtems_string_to_unsigned_int>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009910: 37 9c ff e8 addi sp,sp,-24
8009914: 5b 8b 00 14 sw (sp+20),r11
8009918: 5b 8c 00 10 sw (sp+16),r12
800991c: 5b 8d 00 0c sw (sp+12),r13
8009920: 5b 8e 00 08 sw (sp+8),r14
8009924: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
8009928: 34 05 00 09 mvi r5,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
800992c: b8 40 58 00 mv r11,r2
8009930: b8 20 68 00 mv r13,r1
8009934: b8 60 70 00 mv r14,r3
8009938: b8 80 60 00 mv r12,r4
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
800993c: 44 40 00 12 be r2,r0,8009984 <rtems_string_to_unsigned_int+0x74>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009940: f8 00 10 71 calli 800db04 <__errno>
8009944: 58 20 00 00 sw (r1+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
8009948: b9 80 18 00 mv r3,r12
if ( !n )
return RTEMS_INVALID_ADDRESS;
errno = 0;
*n = 0;
800994c: 59 60 00 00 sw (r11+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
8009950: b9 a0 08 00 mv r1,r13
8009954: 37 82 00 18 addi r2,sp,24
8009958: f8 00 1d b1 calli 801101c <strtoul>
800995c: b8 20 60 00 mv r12,r1
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009960: 45 c0 00 17 be r14,r0,80099bc <rtems_string_to_unsigned_int+0xac>
*endptr = end;
8009964: 2b 82 00 18 lw r2,(sp+24)
8009968: 59 c2 00 00 sw (r14+0),r2
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
800996c: 34 05 00 0b mvi r5,11
/* If the user wants the end pointer back, then return it. */
if ( endptr )
*endptr = end;
/* nothing was converted */
if ( end == s )
8009970: 45 a2 00 05 be r13,r2,8009984 <rtems_string_to_unsigned_int+0x74>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009974: 34 01 ff ff mvi r1,-1
8009978: 45 81 00 0b be r12,r1,80099a4 <rtems_string_to_unsigned_int+0x94>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
800997c: 59 6c 00 00 sw (r11+0),r12
#endif
return RTEMS_SUCCESSFUL;
8009980: 34 05 00 00 mvi r5,0
}
8009984: b8 a0 08 00 mv r1,r5
8009988: 2b 9d 00 04 lw ra,(sp+4)
800998c: 2b 8b 00 14 lw r11,(sp+20)
8009990: 2b 8c 00 10 lw r12,(sp+16)
8009994: 2b 8d 00 0c lw r13,(sp+12)
8009998: 2b 8e 00 08 lw r14,(sp+8)
800999c: 37 9c 00 18 addi sp,sp,24
80099a0: c3 a0 00 00 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
80099a4: f8 00 10 58 calli 800db04 <__errno>
80099a8: 28 22 00 00 lw r2,(r1+0)
80099ac: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
80099b0: 34 05 00 0a mvi r5,10
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
80099b4: 5c 41 ff f2 bne r2,r1,800997c <rtems_string_to_unsigned_int+0x6c><== NEVER TAKEN
80099b8: e3 ff ff f3 bi 8009984 <rtems_string_to_unsigned_int+0x74>
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
80099bc: 2b 82 00 18 lw r2,(sp+24)
80099c0: e3 ff ff eb bi 800996c <rtems_string_to_unsigned_int+0x5c>
08009a8c <rtems_string_to_unsigned_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009a8c: 37 9c ff e8 addi sp,sp,-24
8009a90: 5b 8b 00 14 sw (sp+20),r11
8009a94: 5b 8c 00 10 sw (sp+16),r12
8009a98: 5b 8d 00 0c sw (sp+12),r13
8009a9c: 5b 8e 00 08 sw (sp+8),r14
8009aa0: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
8009aa4: 34 05 00 09 mvi r5,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009aa8: b8 40 58 00 mv r11,r2
8009aac: b8 20 68 00 mv r13,r1
8009ab0: b8 60 70 00 mv r14,r3
8009ab4: b8 80 60 00 mv r12,r4
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009ab8: 44 40 00 12 be r2,r0,8009b00 <rtems_string_to_unsigned_long+0x74>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009abc: f8 00 10 12 calli 800db04 <__errno>
8009ac0: 58 20 00 00 sw (r1+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
8009ac4: b9 80 18 00 mv r3,r12
if ( !n )
return RTEMS_INVALID_ADDRESS;
errno = 0;
*n = 0;
8009ac8: 59 60 00 00 sw (r11+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
8009acc: b9 a0 08 00 mv r1,r13
8009ad0: 37 82 00 18 addi r2,sp,24
8009ad4: f8 00 1d 52 calli 801101c <strtoul>
8009ad8: b8 20 60 00 mv r12,r1
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009adc: 45 c0 00 17 be r14,r0,8009b38 <rtems_string_to_unsigned_long+0xac>
*endptr = end;
8009ae0: 2b 82 00 18 lw r2,(sp+24)
8009ae4: 59 c2 00 00 sw (r14+0),r2
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
8009ae8: 34 05 00 0b mvi r5,11
/* If the user wants the end pointer back, then return it. */
if ( endptr )
*endptr = end;
/* nothing was converted */
if ( end == s )
8009aec: 45 a2 00 05 be r13,r2,8009b00 <rtems_string_to_unsigned_long+0x74>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009af0: 34 01 ff ff mvi r1,-1
8009af4: 45 81 00 0b be r12,r1,8009b20 <rtems_string_to_unsigned_long+0x94>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
8009af8: 59 6c 00 00 sw (r11+0),r12
#endif
return RTEMS_SUCCESSFUL;
8009afc: 34 05 00 00 mvi r5,0
}
8009b00: b8 a0 08 00 mv r1,r5
8009b04: 2b 9d 00 04 lw ra,(sp+4)
8009b08: 2b 8b 00 14 lw r11,(sp+20)
8009b0c: 2b 8c 00 10 lw r12,(sp+16)
8009b10: 2b 8d 00 0c lw r13,(sp+12)
8009b14: 2b 8e 00 08 lw r14,(sp+8)
8009b18: 37 9c 00 18 addi sp,sp,24
8009b1c: c3 a0 00 00 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009b20: f8 00 0f f9 calli 800db04 <__errno>
8009b24: 28 22 00 00 lw r2,(r1+0)
8009b28: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
8009b2c: 34 05 00 0a mvi r5,10
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009b30: 5c 41 ff f2 bne r2,r1,8009af8 <rtems_string_to_unsigned_long+0x6c><== NEVER TAKEN
8009b34: e3 ff ff f3 bi 8009b00 <rtems_string_to_unsigned_long+0x74>
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009b38: 2b 82 00 18 lw r2,(sp+24)
8009b3c: e3 ff ff eb bi 8009ae8 <rtems_string_to_unsigned_long+0x5c>
080099c4 <rtems_string_to_unsigned_long_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80099c4: 37 9c ff e4 addi sp,sp,-28
80099c8: 5b 8b 00 14 sw (sp+20),r11
80099cc: 5b 8c 00 10 sw (sp+16),r12
80099d0: 5b 8d 00 0c sw (sp+12),r13
80099d4: 5b 8e 00 08 sw (sp+8),r14
80099d8: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
80099dc: 34 05 00 09 mvi r5,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80099e0: b8 40 58 00 mv r11,r2
80099e4: b8 20 68 00 mv r13,r1
80099e8: b8 60 70 00 mv r14,r3
80099ec: b8 80 60 00 mv r12,r4
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
80099f0: 44 40 00 14 be r2,r0,8009a40 <rtems_string_to_unsigned_long_long+0x7c>
return RTEMS_INVALID_ADDRESS;
errno = 0;
80099f4: f8 00 10 44 calli 800db04 <__errno>
80099f8: 58 20 00 00 sw (r1+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
80099fc: b9 80 18 00 mv r3,r12
if ( !n )
return RTEMS_INVALID_ADDRESS;
errno = 0;
*n = 0;
8009a00: 59 60 00 00 sw (r11+0),r0
8009a04: 59 60 00 04 sw (r11+4),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
#elif defined(STRING_TO_POINTER)
result = STRING_TO_METHOD( s, &end, 16 );
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
8009a08: b9 a0 08 00 mv r1,r13
8009a0c: 37 82 00 1c addi r2,sp,28
8009a10: f8 00 1d 91 calli 8011054 <strtoull>
8009a14: b8 20 60 00 mv r12,r1
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009a18: 45 c0 00 1b be r14,r0,8009a84 <rtems_string_to_unsigned_long_long+0xc0>
*endptr = end;
8009a1c: 2b 84 00 1c lw r4,(sp+28)
8009a20: 59 c4 00 00 sw (r14+0),r4
/* nothing was converted */
if ( end == s )
return RTEMS_NOT_DEFINED;
8009a24: 34 05 00 0b mvi r5,11
/* If the user wants the end pointer back, then return it. */
if ( endptr )
*endptr = end;
/* nothing was converted */
if ( end == s )
8009a28: 45 a4 00 06 be r13,r4,8009a40 <rtems_string_to_unsigned_long_long+0x7c>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009a2c: 34 01 ff ff mvi r1,-1
8009a30: 45 81 00 0c be r12,r1,8009a60 <rtems_string_to_unsigned_long_long+0x9c>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
8009a34: 59 6c 00 00 sw (r11+0),r12
8009a38: 59 62 00 04 sw (r11+4),r2
#endif
return RTEMS_SUCCESSFUL;
8009a3c: 34 05 00 00 mvi r5,0
}
8009a40: b8 a0 08 00 mv r1,r5
8009a44: 2b 9d 00 04 lw ra,(sp+4)
8009a48: 2b 8b 00 14 lw r11,(sp+20)
8009a4c: 2b 8c 00 10 lw r12,(sp+16)
8009a50: 2b 8d 00 0c lw r13,(sp+12)
8009a54: 2b 8e 00 08 lw r14,(sp+8)
8009a58: 37 9c 00 1c addi sp,sp,28
8009a5c: c3 a0 00 00 ret
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009a60: 5c 4c ff f5 bne r2,r12,8009a34 <rtems_string_to_unsigned_long_long+0x70><== NEVER TAKEN
8009a64: 5b 82 00 18 sw (sp+24),r2
8009a68: f8 00 10 27 calli 800db04 <__errno>
8009a6c: 28 23 00 00 lw r3,(r1+0)
8009a70: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
8009a74: 34 05 00 0a mvi r5,10
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009a78: 2b 82 00 18 lw r2,(sp+24)
8009a7c: 5c 61 ff ee bne r3,r1,8009a34 <rtems_string_to_unsigned_long_long+0x70><== NEVER TAKEN
8009a80: e3 ff ff f0 bi 8009a40 <rtems_string_to_unsigned_long_long+0x7c>
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009a84: 2b 84 00 1c lw r4,(sp+28)
8009a88: e3 ff ff e7 bi 8009a24 <rtems_string_to_unsigned_long_long+0x60>
08000fb8 <rtems_tarfs_load>:
int rtems_tarfs_load(
char *mountpoint,
uint8_t *tar_image,
size_t tar_size
)
{
8000fb8: 37 9c fe 2c addi sp,sp,-468
8000fbc: 5b 8b 00 44 sw (sp+68),r11
8000fc0: 5b 8c 00 40 sw (sp+64),r12
8000fc4: 5b 8d 00 3c sw (sp+60),r13
8000fc8: 5b 8e 00 38 sw (sp+56),r14
8000fcc: 5b 8f 00 34 sw (sp+52),r15
8000fd0: 5b 90 00 30 sw (sp+48),r16
8000fd4: 5b 91 00 2c sw (sp+44),r17
8000fd8: 5b 92 00 28 sw (sp+40),r18
8000fdc: 5b 93 00 24 sw (sp+36),r19
8000fe0: 5b 94 00 20 sw (sp+32),r20
8000fe4: 5b 95 00 1c sw (sp+28),r21
8000fe8: 5b 96 00 18 sw (sp+24),r22
8000fec: 5b 97 00 14 sw (sp+20),r23
8000ff0: 5b 98 00 10 sw (sp+16),r24
8000ff4: 5b 99 00 0c sw (sp+12),r25
8000ff8: 5b 9b 00 08 sw (sp+8),fp
8000ffc: 5b 9d 00 04 sw (sp+4),ra
8001000: b8 20 c8 00 mv r25,r1
8001004: b8 60 90 00 mv r18,r3
8001008: b8 40 88 00 mv r17,r2
int offset;
unsigned long nblocks;
IMFS_jnode_t *node;
int status;
status = rtems_filesystem_evaluate_path(
800100c: f8 00 45 76 calli 80125e4 <strlen>
8001010: b8 20 10 00 mv r2,r1
8001014: 34 03 00 00 mvi r3,0
8001018: bb 20 08 00 mv r1,r25
800101c: 37 84 01 c0 addi r4,sp,448
8001020: 34 05 00 00 mvi r5,0
8001024: f8 00 03 56 calli 8001d7c <rtems_filesystem_evaluate_path>
8001028: b8 20 b8 00 mv r23,r1
strlen(mountpoint),
0,
&root_loc,
0
);
if (status != 0)
800102c: 5c 20 00 4b bne r1,r0,8001158 <rtems_tarfs_load+0x1a0>
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
8001030: 2b 81 01 cc lw r1,(sp+460)
8001034: 78 03 08 02 mvhi r3,0x802
8001038: 38 63 16 4c ori r3,r3,0x164c
800103c: 34 0b 00 00 mvi r11,0
8001040: 5c 23 00 42 bne r1,r3,8001148 <rtems_tarfs_load+0x190>
/*
* Read a header.
*/
hdr_ptr = (char *) &tar_image[offset];
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
8001044: 78 10 08 02 mvhi r16,0x802
8001048: 3a 10 16 94 ori r16,r16,0x1694
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
800104c: 37 8e 01 48 addi r14,sp,328
* Generate an IMFS node depending on the file type.
* - For directories, just create directories as usual. IMFS
* will take care of the rest.
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
8001050: 34 14 00 35 mvi r20,53
* IMFS_create_node was ONLY passed a NULL when we created the
* root node. We added a new IMFS_create_root_node() so this
* path no longer existed. The result was simpler code which
* should not have this path.
*/
else if (linkflag == REGTYPE) {
8001054: 34 18 00 30 mvi r24,48
* - For directories, just create directories as usual. IMFS
* will take care of the rest.
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
strcpy(full_filename, mountpoint);
8001058: 37 95 00 48 addi r21,sp,72
if (full_filename[strlen(full_filename)-1] != '/')
800105c: 34 1b 00 2f mvi fp,47
/*
* Create an IMFS node structure pointing to tar image memory.
*/
offset = 0;
while (1) {
if (offset + 512 > tar_size)
8001060: 35 6c 02 00 addi r12,r11,512
8001064: 55 92 00 3e bgu r12,r18,800115c <rtems_tarfs_load+0x1a4> <== NEVER TAKEN
break;
/*
* Read a header.
*/
hdr_ptr = (char *) &tar_image[offset];
8001068: b6 2b 58 00 add r11,r17,r11
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
800106c: 35 61 01 01 addi r1,r11,257
8001070: ba 00 10 00 mv r2,r16
8001074: 34 03 00 05 mvi r3,5
8001078: f8 00 45 8a calli 80126a0 <strncmp>
800107c: 5c 20 00 38 bne r1,r0,800115c <rtems_tarfs_load+0x1a4>
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
8001080: 34 03 00 63 mvi r3,99
8001084: b9 60 10 00 mv r2,r11
8001088: b9 c0 08 00 mv r1,r14
800108c: f8 00 45 d2 calli 80127d4 <strncpy>
filename[MAX_NAME_FIELD_SIZE] = '\0';
linkflag = hdr_ptr[156];
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
8001090: 34 02 00 08 mvi r2,8
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
filename[MAX_NAME_FIELD_SIZE] = '\0';
8001094: 33 80 01 ab sb (sp+427),r0
linkflag = hdr_ptr[156];
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
8001098: 35 61 00 64 addi r1,r11,100
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
filename[MAX_NAME_FIELD_SIZE] = '\0';
linkflag = hdr_ptr[156];
800109c: 41 6d 00 9c lbu r13,(r11+156)
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
80010a0: f8 00 1b 12 calli 8007ce8 <_rtems_octal2ulong>
file_size = _rtems_octal2ulong(&hdr_ptr[124], 12);
80010a4: 34 02 00 0c mvi r2,12
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
filename[MAX_NAME_FIELD_SIZE] = '\0';
linkflag = hdr_ptr[156];
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
80010a8: b8 20 b0 00 mv r22,r1
file_size = _rtems_octal2ulong(&hdr_ptr[124], 12);
80010ac: 35 61 00 7c addi r1,r11,124
80010b0: f8 00 1b 0e calli 8007ce8 <_rtems_octal2ulong>
80010b4: b8 20 98 00 mv r19,r1
hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8);
80010b8: 34 02 00 08 mvi r2,8
80010bc: 35 61 00 94 addi r1,r11,148
80010c0: f8 00 1b 0a calli 8007ce8 <_rtems_octal2ulong>
80010c4: b8 20 78 00 mv r15,r1
if (_rtems_tar_header_checksum(hdr_ptr) != hdr_chksum)
80010c8: b9 60 08 00 mv r1,r11
80010cc: f8 00 1c 5b calli 8008238 <_rtems_tar_header_checksum>
80010d0: 5c 2f 00 23 bne r1,r15,800115c <rtems_tarfs_load+0x1a4> <== NEVER TAKEN
* Generate an IMFS node depending on the file type.
* - For directories, just create directories as usual. IMFS
* will take care of the rest.
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
80010d4: 45 b4 00 36 be r13,r20,80011ac <rtems_tarfs_load+0x1f4>
* IMFS_create_node was ONLY passed a NULL when we created the
* root node. We added a new IMFS_create_root_node() so this
* path no longer existed. The result was simpler code which
* should not have this path.
*/
else if (linkflag == REGTYPE) {
80010d8: 45 b8 00 03 be r13,r24,80010e4 <rtems_tarfs_load+0x12c>
0
);
if (status != 0)
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
80010dc: b9 80 58 00 mv r11,r12
80010e0: e3 ff ff e0 bi 8001060 <rtems_tarfs_load+0xa8>
* should not have this path.
*/
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
80010e4: 2b 84 01 c0 lw r4,(sp+448)
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
80010e8: b9 c0 08 00 mv r1,r14
80010ec: 37 82 01 ac addi r2,sp,428
* should not have this path.
*/
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
80010f0: 5b 84 01 ac sw (sp+428),r4
80010f4: 2b 84 01 c4 lw r4,(sp+452)
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
80010f8: 37 83 01 d4 addi r3,sp,468
* should not have this path.
*/
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
80010fc: 5b 84 01 b0 sw (sp+432),r4
8001100: 2b 84 01 c8 lw r4,(sp+456)
8001104: 5b 84 01 b4 sw (sp+436),r4
8001108: 2b 84 01 cc lw r4,(sp+460)
800110c: 5b 84 01 b8 sw (sp+440),r4
8001110: 2b 84 01 d0 lw r4,(sp+464)
8001114: 5b 84 01 bc sw (sp+444),r4
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
8001118: f8 00 1e e3 calli 8008ca4 <IMFS_evaluate_for_make>
800111c: 44 20 00 38 be r1,r0,80011fc <rtems_tarfs_load+0x244> <== ALWAYS TAKEN
);
node->info.linearfile.size = file_size;
node->info.linearfile.direct = &tar_image[offset];
}
nblocks = (((file_size) + 511) & ~511) / 512;
8001120: 34 03 fe 00 mvi r3,-512 <== NOT EXECUTED
8001124: 36 61 01 ff addi r1,r19,511 <== NOT EXECUTED
8001128: 34 02 00 09 mvi r2,9 <== NOT EXECUTED
800112c: a0 23 08 00 and r1,r1,r3 <== NOT EXECUTED
8001130: f8 00 73 cd calli 801e064 <__lshrsi3> <== NOT EXECUTED
offset += 512 * nblocks;
8001134: 34 02 00 09 mvi r2,9 <== NOT EXECUTED
8001138: f8 00 73 7d calli 801df2c <__ashlsi3> <== NOT EXECUTED
800113c: b4 2c 60 00 add r12,r1,r12 <== NOT EXECUTED
0
);
if (status != 0)
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
8001140: b9 80 58 00 mv r11,r12
8001144: e3 ff ff c7 bi 8001060 <rtems_tarfs_load+0xa8>
8001148: 78 02 08 02 mvhi r2,0x802
800114c: 38 42 1e b4 ori r2,r2,0x1eb4
8001150: ba e0 58 00 mv r11,r23
8001154: 44 22 ff bc be r1,r2,8001044 <rtems_tarfs_load+0x8c> <== NEVER TAKEN
return -1;
8001158: 34 17 ff ff mvi r23,-1
nblocks = (((file_size) + 511) & ~511) / 512;
offset += 512 * nblocks;
}
}
return status;
}
800115c: ba e0 08 00 mv r1,r23
8001160: 2b 9d 00 04 lw ra,(sp+4)
8001164: 2b 8b 00 44 lw r11,(sp+68)
8001168: 2b 8c 00 40 lw r12,(sp+64)
800116c: 2b 8d 00 3c lw r13,(sp+60)
8001170: 2b 8e 00 38 lw r14,(sp+56)
8001174: 2b 8f 00 34 lw r15,(sp+52)
8001178: 2b 90 00 30 lw r16,(sp+48)
800117c: 2b 91 00 2c lw r17,(sp+44)
8001180: 2b 92 00 28 lw r18,(sp+40)
8001184: 2b 93 00 24 lw r19,(sp+36)
8001188: 2b 94 00 20 lw r20,(sp+32)
800118c: 2b 95 00 1c lw r21,(sp+28)
8001190: 2b 96 00 18 lw r22,(sp+24)
8001194: 2b 97 00 14 lw r23,(sp+20)
8001198: 2b 98 00 10 lw r24,(sp+16)
800119c: 2b 99 00 0c lw r25,(sp+12)
80011a0: 2b 9b 00 08 lw fp,(sp+8)
80011a4: 37 9c 01 d4 addi sp,sp,468
80011a8: c3 a0 00 00 ret
* - For directories, just create directories as usual. IMFS
* will take care of the rest.
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
strcpy(full_filename, mountpoint);
80011ac: bb 20 10 00 mv r2,r25
80011b0: ba a0 08 00 mv r1,r21
80011b4: f8 00 43 d8 calli 8012114 <strcpy>
if (full_filename[strlen(full_filename)-1] != '/')
80011b8: ba a0 08 00 mv r1,r21
80011bc: f8 00 45 0a calli 80125e4 <strlen>
80011c0: 37 82 00 47 addi r2,sp,71
80011c4: b4 41 18 00 add r3,r2,r1
80011c8: 40 63 00 00 lbu r3,(r3+0)
80011cc: 44 7b 00 04 be r3,fp,80011dc <rtems_tarfs_load+0x224> <== ALWAYS TAKEN
strcat(full_filename, "/");
80011d0: b6 a1 08 00 add r1,r21,r1 <== NOT EXECUTED
80011d4: 30 3b 00 00 sb (r1+0),fp <== NOT EXECUTED
80011d8: 30 20 00 01 sb (r1+1),r0 <== NOT EXECUTED
strcat(full_filename, filename);
80011dc: b9 c0 10 00 mv r2,r14
80011e0: ba a0 08 00 mv r1,r21
80011e4: f8 00 43 75 calli 8011fb8 <strcat>
mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO);
80011e8: ba a0 08 00 mv r1,r21
80011ec: 34 02 01 ff mvi r2,511
80011f0: f8 00 05 bb calli 80028dc <mkdir>
0
);
if (status != 0)
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
80011f4: b9 80 58 00 mv r11,r12
80011f8: e3 ff ff 9a bi 8001060 <rtems_tarfs_load+0xa8>
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
node = IMFS_create_node(
80011fc: 2b 83 01 d4 lw r3,(sp+468)
&loc,
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
8001200: 22 c4 01 ff andi r4,r22,0x1ff
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
node = IMFS_create_node(
8001204: 38 84 80 00 ori r4,r4,0x8000
8001208: 34 05 00 00 mvi r5,0
800120c: 34 02 00 06 mvi r2,6
8001210: 37 81 01 ac addi r1,sp,428
8001214: f8 00 1c b2 calli 80084dc <IMFS_create_node>
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
NULL
);
node->info.linearfile.size = file_size;
node->info.linearfile.direct = &tar_image[offset];
8001218: b6 2c 10 00 add r2,r17,r12
800121c: 58 22 00 58 sw (r1+88),r2
}
nblocks = (((file_size) + 511) & ~511) / 512;
8001220: 34 03 fe 00 mvi r3,-512
&loc,
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
NULL
);
node->info.linearfile.size = file_size;
8001224: 58 20 00 50 sw (r1+80),r0
8001228: 58 33 00 54 sw (r1+84),r19
node->info.linearfile.direct = &tar_image[offset];
}
nblocks = (((file_size) + 511) & ~511) / 512;
800122c: 36 61 01 ff addi r1,r19,511
8001230: 34 02 00 09 mvi r2,9
8001234: a0 23 08 00 and r1,r1,r3
8001238: f8 00 73 8b calli 801e064 <__lshrsi3>
offset += 512 * nblocks;
800123c: 34 02 00 09 mvi r2,9
8001240: f8 00 73 3b calli 801df2c <__ashlsi3>
8001244: b4 2c 60 00 add r12,r1,r12
8001248: e3 ff ff be bi 8001140 <rtems_tarfs_load+0x188>
0800c744 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
800c744: 37 9c ff dc addi sp,sp,-36
800c748: 5b 8b 00 24 sw (sp+36),r11
800c74c: 5b 8c 00 20 sw (sp+32),r12
800c750: 5b 8d 00 1c sw (sp+28),r13
800c754: 5b 8e 00 18 sw (sp+24),r14
800c758: 5b 8f 00 14 sw (sp+20),r15
800c75c: 5b 90 00 10 sw (sp+16),r16
800c760: 5b 91 00 0c sw (sp+12),r17
800c764: 5b 92 00 08 sw (sp+8),r18
800c768: 5b 9d 00 04 sw (sp+4),ra
800c76c: b8 40 70 00 mv r14,r2
800c770: b8 60 88 00 mv r17,r3
800c774: b8 20 80 00 mv r16,r1
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
800c778: 34 02 00 09 mvi r2,9
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
800c77c: 44 60 00 46 be r3,r0,800c894 <rtems_task_mode+0x150>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
800c780: 78 0f 08 01 mvhi r15,0x801
800c784: 39 ef 4d 78 ori r15,r15,0x4d78
800c788: 29 eb 00 0c lw r11,(r15+12)
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
800c78c: 41 6d 00 74 lbu r13,(r11+116)
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
800c790: 29 61 00 7c lw r1,(r11+124)
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
800c794: 29 6c 01 1c lw r12,(r11+284)
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
800c798: 65 ad 00 00 cmpei r13,r13,0
800c79c: b5 ad 20 00 add r4,r13,r13
800c7a0: b4 84 20 00 add r4,r4,r4
800c7a4: b4 84 20 00 add r4,r4,r4
800c7a8: b4 84 20 00 add r4,r4,r4
800c7ac: b4 84 20 00 add r4,r4,r4
800c7b0: b4 84 20 00 add r4,r4,r4
800c7b4: b4 84 20 00 add r4,r4,r4
800c7b8: b4 84 68 00 add r13,r4,r4
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
800c7bc: 5c 20 00 42 bne r1,r0,800c8c4 <rtems_task_mode+0x180>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
800c7c0: 41 92 00 08 lbu r18,(r12+8)
old_mode |= _ISR_Get_level();
800c7c4: fb ff ea 6a calli 800716c <_CPU_ISR_Get_level>
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
800c7c8: 66 52 00 00 cmpei r18,r18,0
800c7cc: c8 12 90 00 sub r18,r0,r18
800c7d0: 22 52 04 00 andi r18,r18,0x400
800c7d4: ba 41 08 00 or r1,r18,r1
old_mode |= _ISR_Get_level();
800c7d8: b8 2d 68 00 or r13,r1,r13
*previous_mode_set = old_mode;
800c7dc: 5a 2d 00 00 sw (r17+0),r13
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
800c7e0: 21 c1 01 00 andi r1,r14,0x100
800c7e4: 44 20 00 04 be r1,r0,800c7f4 <rtems_task_mode+0xb0>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_preempt (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT;
800c7e8: 22 01 01 00 andi r1,r16,0x100
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
800c7ec: 64 21 00 00 cmpei r1,r1,0
800c7f0: 31 61 00 74 sb (r11+116),r1
if ( mask & RTEMS_TIMESLICE_MASK ) {
800c7f4: 21 c1 02 00 andi r1,r14,0x200
800c7f8: 44 20 00 09 be r1,r0,800c81c <rtems_task_mode+0xd8>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_timeslice (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE;
800c7fc: 22 01 02 00 andi r1,r16,0x200
if ( _Modes_Is_timeslice(mode_set) ) {
800c800: 44 20 00 3e be r1,r0,800c8f8 <rtems_task_mode+0x1b4>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
800c804: 78 01 08 01 mvhi r1,0x801
800c808: 38 21 48 40 ori r1,r1,0x4840
800c80c: 28 22 00 00 lw r2,(r1+0)
if ( mask & RTEMS_PREEMPT_MASK )
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
800c810: 34 01 00 01 mvi r1,1
800c814: 59 61 00 7c sw (r11+124),r1
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
800c818: 59 62 00 78 sw (r11+120),r2
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
800c81c: 21 c1 00 01 andi r1,r14,0x1
800c820: 44 20 00 04 be r1,r0,800c830 <rtems_task_mode+0xec>
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
800c824: 22 01 00 01 andi r1,r16,0x1
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
800c828: 64 21 00 00 cmpei r1,r1,0
800c82c: d0 01 00 00 wcsr IE,r1
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
800c830: 21 ce 04 00 andi r14,r14,0x400
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
800c834: 34 04 00 00 mvi r4,0
if ( mask & RTEMS_ASR_MASK ) {
800c838: 45 c0 00 11 be r14,r0,800c87c <rtems_task_mode+0x138>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_asr_disabled (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR;
800c83c: 22 10 04 00 andi r16,r16,0x400
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
800c840: 41 81 00 08 lbu r1,(r12+8)
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
800c844: 66 10 00 00 cmpei r16,r16,0
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
800c848: 44 30 00 0d be r1,r16,800c87c <rtems_task_mode+0x138>
asr->is_enabled = is_asr_enabled;
800c84c: 31 90 00 08 sb (r12+8),r16
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
800c850: 90 00 08 00 rcsr r1,IE
800c854: 34 02 ff fe mvi r2,-2
800c858: a0 22 10 00 and r2,r1,r2
800c85c: d0 02 00 00 wcsr IE,r2
_signals = information->signals_pending;
800c860: 29 83 00 18 lw r3,(r12+24)
information->signals_pending = information->signals_posted;
800c864: 29 82 00 14 lw r2,(r12+20)
information->signals_posted = _signals;
800c868: 59 83 00 14 sw (r12+20),r3
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
_signals = information->signals_pending;
information->signals_pending = information->signals_posted;
800c86c: 59 82 00 18 sw (r12+24),r2
information->signals_posted = _signals;
_ISR_Enable( _level );
800c870: d0 01 00 00 wcsr IE,r1
_ASR_Swap_signals( asr );
if ( _ASR_Are_signals_pending( asr ) ) {
800c874: 29 84 00 14 lw r4,(r12+20)
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
800c878: 7c 84 00 00 cmpnei r4,r4,0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
800c87c: 78 01 08 01 mvhi r1,0x801
800c880: 38 21 4a 20 ori r1,r1,0x4a20
800c884: 28 23 00 00 lw r3,(r1+0)
800c888: 34 01 00 03 mvi r1,3
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
800c88c: 34 02 00 00 mvi r2,0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
800c890: 44 61 00 0f be r3,r1,800c8cc <rtems_task_mode+0x188> <== ALWAYS TAKEN
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
}
800c894: b8 40 08 00 mv r1,r2
800c898: 2b 9d 00 04 lw ra,(sp+4)
800c89c: 2b 8b 00 24 lw r11,(sp+36)
800c8a0: 2b 8c 00 20 lw r12,(sp+32)
800c8a4: 2b 8d 00 1c lw r13,(sp+28)
800c8a8: 2b 8e 00 18 lw r14,(sp+24)
800c8ac: 2b 8f 00 14 lw r15,(sp+20)
800c8b0: 2b 90 00 10 lw r16,(sp+16)
800c8b4: 2b 91 00 0c lw r17,(sp+12)
800c8b8: 2b 92 00 08 lw r18,(sp+8)
800c8bc: 37 9c 00 24 addi sp,sp,36
800c8c0: c3 a0 00 00 ret
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
800c8c4: 39 ad 02 00 ori r13,r13,0x200
800c8c8: e3 ff ff be bi 800c7c0 <rtems_task_mode+0x7c>
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
800c8cc: 29 e1 00 0c lw r1,(r15+12)
if ( are_signals_pending ||
800c8d0: 5c 80 00 05 bne r4,r0,800c8e4 <rtems_task_mode+0x1a0>
800c8d4: 29 e3 00 10 lw r3,(r15+16)
800c8d8: 44 23 ff ef be r1,r3,800c894 <rtems_task_mode+0x150>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
800c8dc: 40 21 00 74 lbu r1,(r1+116)
800c8e0: 44 20 ff ed be r1,r0,800c894 <rtems_task_mode+0x150> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
800c8e4: 34 01 00 01 mvi r1,1
800c8e8: 31 e1 00 18 sb (r15+24),r1
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
800c8ec: fb ff e3 8a calli 8005714 <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
800c8f0: 34 02 00 00 mvi r2,0
800c8f4: e3 ff ff e8 bi 800c894 <rtems_task_mode+0x150>
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
800c8f8: 59 60 00 7c sw (r11+124),r0
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
800c8fc: 21 c1 00 01 andi r1,r14,0x1
800c900: 44 20 ff cc be r1,r0,800c830 <rtems_task_mode+0xec>
800c904: e3 ff ff c8 bi 800c824 <rtems_task_mode+0xe0>
08008bd4 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
8008bd4: 37 9c ff f0 addi sp,sp,-16
8008bd8: 5b 8b 00 0c sw (sp+12),r11
8008bdc: 5b 8c 00 08 sw (sp+8),r12
8008be0: 5b 9d 00 04 sw (sp+4),ra
8008be4: b8 40 58 00 mv r11,r2
8008be8: b8 60 60 00 mv r12,r3
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
8008bec: 44 40 00 06 be r2,r0,8008c04 <rtems_task_set_priority+0x30>
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
8008bf0: 78 02 08 01 mvhi r2,0x801
8008bf4: 38 42 b0 c0 ori r2,r2,0xb0c0
8008bf8: 40 42 00 00 lbu r2,(r2+0)
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
8008bfc: 34 04 00 13 mvi r4,19
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
8008c00: 55 62 00 08 bgu r11,r2,8008c20 <rtems_task_set_priority+0x4c>
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
8008c04: 34 04 00 09 mvi r4,9
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
8008c08: 45 80 00 06 be r12,r0,8008c20 <rtems_task_set_priority+0x4c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
8008c0c: 37 82 00 10 addi r2,sp,16
8008c10: f8 00 0a bd calli 800b704 <_Thread_Get>
switch ( location ) {
8008c14: 2b 82 00 10 lw r2,(sp+16)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8008c18: 34 04 00 04 mvi r4,4
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
8008c1c: 44 40 00 07 be r2,r0,8008c38 <rtems_task_set_priority+0x64>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8008c20: b8 80 08 00 mv r1,r4
8008c24: 2b 9d 00 04 lw ra,(sp+4)
8008c28: 2b 8b 00 0c lw r11,(sp+12)
8008c2c: 2b 8c 00 08 lw r12,(sp+8)
8008c30: 37 9c 00 10 addi sp,sp,16
8008c34: c3 a0 00 00 ret
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
8008c38: 28 23 00 14 lw r3,(r1+20)
8008c3c: 59 83 00 00 sw (r12+0),r3
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
8008c40: 45 62 00 09 be r11,r2,8008c64 <rtems_task_set_priority+0x90>
the_thread->real_priority = new_priority;
if ( the_thread->resource_count == 0 ||
8008c44: 28 22 00 1c lw r2,(r1+28)
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
the_thread->real_priority = new_priority;
8008c48: 58 2b 00 18 sw (r1+24),r11
if ( the_thread->resource_count == 0 ||
8008c4c: 44 40 00 03 be r2,r0,8008c58 <rtems_task_set_priority+0x84>
8008c50: 28 22 00 14 lw r2,(r1+20)
8008c54: 51 62 00 04 bgeu r11,r2,8008c64 <rtems_task_set_priority+0x90><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
8008c58: b9 60 10 00 mv r2,r11
8008c5c: 34 03 00 00 mvi r3,0
8008c60: f8 00 09 1f calli 800b0dc <_Thread_Change_priority>
}
_Thread_Enable_dispatch();
8008c64: f8 00 0a 9b calli 800b6d0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8008c68: 34 04 00 00 mvi r4,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8008c6c: b8 80 08 00 mv r1,r4
8008c70: 2b 9d 00 04 lw ra,(sp+4)
8008c74: 2b 8b 00 0c lw r11,(sp+12)
8008c78: 2b 8c 00 08 lw r12,(sp+8)
8008c7c: 37 9c 00 10 addi sp,sp,16
8008c80: c3 a0 00 00 ret
08003248 <rtems_task_start>:
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
8003248: 37 9c ff ec addi sp,sp,-20
800324c: 5b 8b 00 10 sw (sp+16),r11
8003250: 5b 8c 00 0c sw (sp+12),r12
8003254: 5b 8d 00 08 sw (sp+8),r13
8003258: 5b 9d 00 04 sw (sp+4),ra
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
800325c: 34 04 00 09 mvi r4,9
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
8003260: b8 40 58 00 mv r11,r2
8003264: b8 60 68 00 mv r13,r3
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
8003268: 44 40 00 06 be r2,r0,8003280 <rtems_task_start+0x38> <== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
800326c: 37 82 00 14 addi r2,sp,20
8003270: f8 00 09 a4 calli 8005900 <_Thread_Get>
switch ( location ) {
8003274: 2b 8c 00 14 lw r12,(sp+20)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8003278: 34 04 00 04 mvi r4,4
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
800327c: 45 80 00 08 be r12,r0,800329c <rtems_task_start+0x54>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8003280: b8 80 08 00 mv r1,r4
8003284: 2b 9d 00 04 lw ra,(sp+4)
8003288: 2b 8b 00 10 lw r11,(sp+16)
800328c: 2b 8c 00 0c lw r12,(sp+12)
8003290: 2b 8d 00 08 lw r13,(sp+8)
8003294: 37 9c 00 14 addi sp,sp,20
8003298: c3 a0 00 00 ret
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
800329c: 34 02 00 00 mvi r2,0
80032a0: b9 60 18 00 mv r3,r11
80032a4: 34 04 00 00 mvi r4,0
80032a8: b9 a0 28 00 mv r5,r13
80032ac: f8 00 0c b7 calli 8006588 <_Thread_Start>
80032b0: 5c 2c 00 0a bne r1,r12,80032d8 <rtems_task_start+0x90>
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
80032b4: f8 00 09 86 calli 80058cc <_Thread_Enable_dispatch>
return RTEMS_INCORRECT_STATE;
80032b8: 34 04 00 0e mvi r4,14
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80032bc: b8 80 08 00 mv r1,r4
80032c0: 2b 9d 00 04 lw ra,(sp+4)
80032c4: 2b 8b 00 10 lw r11,(sp+16)
80032c8: 2b 8c 00 0c lw r12,(sp+12)
80032cc: 2b 8d 00 08 lw r13,(sp+8)
80032d0: 37 9c 00 14 addi sp,sp,20
80032d4: c3 a0 00 00 ret
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
80032d8: f8 00 09 7d calli 80058cc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80032dc: 34 04 00 00 mvi r4,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80032e0: b8 80 08 00 mv r1,r4
80032e4: 2b 9d 00 04 lw ra,(sp+4)
80032e8: 2b 8b 00 10 lw r11,(sp+16)
80032ec: 2b 8c 00 0c lw r12,(sp+12)
80032f0: 2b 8d 00 08 lw r13,(sp+8)
80032f4: 37 9c 00 14 addi sp,sp,20
80032f8: c3 a0 00 00 ret
08004118 <rtems_task_variable_add>:
rtems_status_code rtems_task_variable_add(
rtems_id tid,
void **ptr,
void (*dtor)(void *)
)
{
8004118: 37 9c ff ec addi sp,sp,-20
800411c: 5b 8b 00 10 sw (sp+16),r11
8004120: 5b 8c 00 0c sw (sp+12),r12
8004124: 5b 8d 00 08 sw (sp+8),r13
8004128: 5b 9d 00 04 sw (sp+4),ra
800412c: b8 40 58 00 mv r11,r2
8004130: b8 60 68 00 mv r13,r3
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
8004134: 34 02 00 09 mvi r2,9
{
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
8004138: 45 60 00 07 be r11,r0,8004154 <rtems_task_variable_add+0x3c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
800413c: 37 82 00 14 addi r2,sp,20
8004140: f8 00 09 a4 calli 80067d0 <_Thread_Get>
8004144: b8 20 60 00 mv r12,r1
switch (location) {
8004148: 2b 81 00 14 lw r1,(sp+20)
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
800414c: 34 02 00 04 mvi r2,4
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
switch (location) {
8004150: 44 20 00 08 be r1,r0,8004170 <rtems_task_variable_add+0x58>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8004154: b8 40 08 00 mv r1,r2
8004158: 2b 9d 00 04 lw ra,(sp+4)
800415c: 2b 8b 00 10 lw r11,(sp+16)
8004160: 2b 8c 00 0c lw r12,(sp+12)
8004164: 2b 8d 00 08 lw r13,(sp+8)
8004168: 37 9c 00 14 addi sp,sp,20
800416c: c3 a0 00 00 ret
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
8004170: 29 84 01 28 lw r4,(r12+296)
while (tvp) {
8004174: 44 81 00 08 be r4,r1,8004194 <rtems_task_variable_add+0x7c>
if (tvp->ptr == ptr) {
8004178: 28 81 00 04 lw r1,(r4+4)
800417c: 5c 2b 00 04 bne r1,r11,800418c <rtems_task_variable_add+0x74>
8004180: e0 00 00 18 bi 80041e0 <rtems_task_variable_add+0xc8>
8004184: 28 82 00 04 lw r2,(r4+4)
8004188: 44 4b 00 16 be r2,r11,80041e0 <rtems_task_variable_add+0xc8><== NEVER TAKEN
tvp->dtor = dtor;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
800418c: 28 84 00 00 lw r4,(r4+0)
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
8004190: 5c 80 ff fd bne r4,r0,8004184 <rtems_task_variable_add+0x6c>
/*
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
8004194: 34 01 00 14 mvi r1,20
8004198: f8 00 0f 06 calli 8007db0 <_Workspace_Allocate>
if (new == NULL) {
800419c: 44 20 00 1b be r1,r0,8004208 <rtems_task_variable_add+0xf0>
}
new->gval = *ptr;
new->ptr = ptr;
new->dtor = dtor;
new->next = (struct rtems_task_variable_tt *)the_thread->task_variables;
80041a0: 29 82 01 28 lw r2,(r12+296)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
return RTEMS_NO_MEMORY;
}
new->gval = *ptr;
80041a4: 29 63 00 00 lw r3,(r11+0)
new->ptr = ptr;
80041a8: 58 2b 00 04 sw (r1+4),r11
new->dtor = dtor;
80041ac: 58 2d 00 10 sw (r1+16),r13
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
return RTEMS_NO_MEMORY;
}
new->gval = *ptr;
80041b0: 58 23 00 08 sw (r1+8),r3
new->ptr = ptr;
new->dtor = dtor;
new->next = (struct rtems_task_variable_tt *)the_thread->task_variables;
80041b4: 58 22 00 00 sw (r1+0),r2
the_thread->task_variables = new;
80041b8: 59 81 01 28 sw (r12+296),r1
_Thread_Enable_dispatch();
80041bc: f8 00 09 78 calli 800679c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80041c0: 34 02 00 00 mvi r2,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80041c4: b8 40 08 00 mv r1,r2
80041c8: 2b 9d 00 04 lw ra,(sp+4)
80041cc: 2b 8b 00 10 lw r11,(sp+16)
80041d0: 2b 8c 00 0c lw r12,(sp+12)
80041d4: 2b 8d 00 08 lw r13,(sp+8)
80041d8: 37 9c 00 14 addi sp,sp,20
80041dc: c3 a0 00 00 ret
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
tvp->dtor = dtor;
80041e0: 58 8d 00 10 sw (r4+16),r13
_Thread_Enable_dispatch();
80041e4: f8 00 09 6e calli 800679c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80041e8: 34 02 00 00 mvi r2,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80041ec: b8 40 08 00 mv r1,r2
80041f0: 2b 9d 00 04 lw ra,(sp+4)
80041f4: 2b 8b 00 10 lw r11,(sp+16)
80041f8: 2b 8c 00 0c lw r12,(sp+12)
80041fc: 2b 8d 00 08 lw r13,(sp+8)
8004200: 37 9c 00 14 addi sp,sp,20
8004204: c3 a0 00 00 ret
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
8004208: f8 00 09 65 calli 800679c <_Thread_Enable_dispatch>
return RTEMS_NO_MEMORY;
800420c: 34 02 00 1a mvi r2,26
8004210: e3 ff ff d1 bi 8004154 <rtems_task_variable_add+0x3c>
08004214 <rtems_task_variable_delete>:
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
8004214: 37 9c ff f4 addi sp,sp,-12
8004218: 5b 8b 00 08 sw (sp+8),r11
800421c: 5b 9d 00 04 sw (sp+4),ra
8004220: b8 40 58 00 mv r11,r2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
8004224: 34 02 00 09 mvi r2,9
{
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
8004228: 45 60 00 06 be r11,r0,8004240 <rtems_task_variable_delete+0x2c>
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
800422c: 37 82 00 0c addi r2,sp,12
8004230: f8 00 09 68 calli 80067d0 <_Thread_Get>
switch (location) {
8004234: 2b 82 00 0c lw r2,(sp+12)
8004238: 44 40 00 07 be r2,r0,8004254 <rtems_task_variable_delete+0x40>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
800423c: 34 02 00 04 mvi r2,4
}
8004240: b8 40 08 00 mv r1,r2
8004244: 2b 9d 00 04 lw ra,(sp+4)
8004248: 2b 8b 00 08 lw r11,(sp+8)
800424c: 37 9c 00 0c addi sp,sp,12
8004250: c3 a0 00 00 ret
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
8004254: 28 24 01 28 lw r4,(r1+296)
while (tvp) {
8004258: 44 82 00 09 be r4,r2,800427c <rtems_task_variable_delete+0x68>
if (tvp->ptr == ptr) {
800425c: 28 82 00 04 lw r2,(r4+4)
8004260: 5c 4b 00 05 bne r2,r11,8004274 <rtems_task_variable_delete+0x60>
8004264: e0 00 00 18 bi 80042c4 <rtems_task_variable_delete+0xb0>
8004268: 28 62 00 04 lw r2,(r3+4)
800426c: 44 4b 00 0b be r2,r11,8004298 <rtems_task_variable_delete+0x84>
8004270: b8 60 20 00 mv r4,r3
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
8004274: 28 83 00 00 lw r3,(r4+0)
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
8004278: 5c 60 ff fc bne r3,r0,8004268 <rtems_task_variable_delete+0x54><== ALWAYS TAKEN
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
800427c: f8 00 09 48 calli 800679c <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
8004280: 34 02 00 09 mvi r2,9
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8004284: b8 40 08 00 mv r1,r2
8004288: 2b 9d 00 04 lw ra,(sp+4)
800428c: 2b 8b 00 08 lw r11,(sp+8)
8004290: 37 9c 00 0c addi sp,sp,12
8004294: c3 a0 00 00 ret
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
8004298: 28 62 00 00 lw r2,(r3+0)
800429c: 58 82 00 00 sw (r4+0),r2
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
80042a0: b8 60 10 00 mv r2,r3
80042a4: f8 00 00 39 calli 8004388 <_RTEMS_Tasks_Invoke_task_variable_dtor>
_Thread_Enable_dispatch();
80042a8: f8 00 09 3d calli 800679c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80042ac: 34 02 00 00 mvi r2,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80042b0: b8 40 08 00 mv r1,r2
80042b4: 2b 9d 00 04 lw ra,(sp+4)
80042b8: 2b 8b 00 08 lw r11,(sp+8)
80042bc: 37 9c 00 0c addi sp,sp,12
80042c0: c3 a0 00 00 ret
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
80042c4: 28 82 00 00 lw r2,(r4+0)
80042c8: b8 80 18 00 mv r3,r4
80042cc: 58 22 01 28 sw (r1+296),r2
80042d0: e3 ff ff f4 bi 80042a0 <rtems_task_variable_delete+0x8c>
080042d4 <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
80042d4: 37 9c ff f0 addi sp,sp,-16
80042d8: 5b 8b 00 0c sw (sp+12),r11
80042dc: 5b 8c 00 08 sw (sp+8),r12
80042e0: 5b 9d 00 04 sw (sp+4),ra
80042e4: b8 40 58 00 mv r11,r2
80042e8: b8 60 60 00 mv r12,r3
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
80042ec: 34 02 00 09 mvi r2,9
{
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
80042f0: 45 60 00 07 be r11,r0,800430c <rtems_task_variable_get+0x38>
return RTEMS_INVALID_ADDRESS;
if ( !result )
80042f4: 44 60 00 06 be r3,r0,800430c <rtems_task_variable_get+0x38>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
80042f8: 37 82 00 10 addi r2,sp,16
80042fc: f8 00 09 35 calli 80067d0 <_Thread_Get>
switch (location) {
8004300: 2b 82 00 10 lw r2,(sp+16)
8004304: 44 40 00 08 be r2,r0,8004324 <rtems_task_variable_get+0x50>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8004308: 34 02 00 04 mvi r2,4
}
800430c: b8 40 08 00 mv r1,r2
8004310: 2b 9d 00 04 lw ra,(sp+4)
8004314: 2b 8b 00 0c lw r11,(sp+12)
8004318: 2b 8c 00 08 lw r12,(sp+8)
800431c: 37 9c 00 10 addi sp,sp,16
8004320: c3 a0 00 00 ret
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
8004324: 28 21 01 28 lw r1,(r1+296)
while (tvp) {
8004328: 5c 22 00 04 bne r1,r2,8004338 <rtems_task_variable_get+0x64>
800432c: e0 00 00 0f bi 8004368 <rtems_task_variable_get+0x94>
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
8004330: 28 21 00 00 lw r1,(r1+0)
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
8004334: 44 20 00 0d be r1,r0,8004368 <rtems_task_variable_get+0x94><== NEVER TAKEN
if (tvp->ptr == ptr) {
8004338: 28 22 00 04 lw r2,(r1+4)
800433c: 5c 4b ff fd bne r2,r11,8004330 <rtems_task_variable_get+0x5c>
/*
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
8004340: 28 21 00 0c lw r1,(r1+12)
8004344: 59 81 00 00 sw (r12+0),r1
_Thread_Enable_dispatch();
8004348: f8 00 09 15 calli 800679c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
800434c: 34 02 00 00 mvi r2,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8004350: b8 40 08 00 mv r1,r2
8004354: 2b 9d 00 04 lw ra,(sp+4)
8004358: 2b 8b 00 0c lw r11,(sp+12)
800435c: 2b 8c 00 08 lw r12,(sp+8)
8004360: 37 9c 00 10 addi sp,sp,16
8004364: c3 a0 00 00 ret
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
8004368: f8 00 09 0d calli 800679c <_Thread_Enable_dispatch>
return RTEMS_INVALID_ADDRESS;
800436c: 34 02 00 09 mvi r2,9
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8004370: b8 40 08 00 mv r1,r2
8004374: 2b 9d 00 04 lw ra,(sp+4)
8004378: 2b 8b 00 0c lw r11,(sp+12)
800437c: 2b 8c 00 08 lw r12,(sp+8)
8004380: 37 9c 00 10 addi sp,sp,16
8004384: c3 a0 00 00 ret
08004af8 <rtems_termios_baud_to_index>:
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
8004af8: 34 02 00 09 mvi r2,9
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004afc: 44 22 00 0b be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
8004b00: 48 22 00 0c bg r1,r2,8004b30 <rtems_termios_baud_to_index+0x38>
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
8004b04: 34 02 00 04 mvi r2,4
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b08: 44 22 00 08 be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
8004b0c: 48 22 00 22 bg r1,r2,8004b94 <rtems_termios_baud_to_index+0x9c>
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
8004b10: 34 02 00 01 mvi r2,1
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b14: 44 22 00 05 be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
8004b18: 48 22 00 2a bg r1,r2,8004bc0 <rtems_termios_baud_to_index+0xc8>
case B0: baud_index = 0; break;
8004b1c: 34 02 00 00 mvi r2,0
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b20: 44 20 00 02 be r1,r0,8004b28 <rtems_termios_baud_to_index+0x30>
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
8004b24: 34 02 ff ff mvi r2,-1
}
return baud_index;
}
8004b28: b8 40 08 00 mv r1,r2
8004b2c: c3 a0 00 00 ret
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
8004b30: 34 02 00 0e mvi r2,14
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b34: 44 22 ff fd be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
8004b38: 48 22 00 0c bg r1,r2,8004b68 <rtems_termios_baud_to_index+0x70>
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
8004b3c: 34 02 00 0b mvi r2,11
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b40: 44 22 ff fa be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
8004b44: 34 03 00 0b mvi r3,11
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
8004b48: 34 02 00 0a mvi r2,10
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b4c: 48 61 ff f7 bg r3,r1,8004b28 <rtems_termios_baud_to_index+0x30>
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
8004b50: 34 02 00 0c mvi r2,12
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b54: 44 22 ff f5 be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
8004b58: 34 02 00 0d mvi r2,13
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b5c: 44 22 ff f3 be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30><== ALWAYS TAKEN
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
8004b60: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
8004b64: e3 ff ff f1 bi 8004b28 <rtems_termios_baud_to_index+0x30> <== NOT EXECUTED
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b68: 34 03 10 02 mvi r3,4098
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
8004b6c: 34 02 00 11 mvi r2,17
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b70: 44 23 ff ee be r1,r3,8004b28 <rtems_termios_baud_to_index+0x30>
8004b74: 48 23 00 18 bg r1,r3,8004bd4 <rtems_termios_baud_to_index+0xdc>
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
8004b78: 34 02 00 0f mvi r2,15
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b7c: 44 22 ff eb be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
8004b80: 34 03 10 01 mvi r3,4097
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
8004b84: 34 02 00 10 mvi r2,16
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b88: 44 23 ff e8 be r1,r3,8004b28 <rtems_termios_baud_to_index+0x30><== ALWAYS TAKEN
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
8004b8c: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
8004b90: e3 ff ff e6 bi 8004b28 <rtems_termios_baud_to_index+0x30> <== NOT EXECUTED
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
8004b94: 34 02 00 06 mvi r2,6
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004b98: 44 22 ff e4 be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
8004b9c: 34 03 00 06 mvi r3,6
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
8004ba0: 34 02 00 05 mvi r2,5
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004ba4: 48 61 ff e1 bg r3,r1,8004b28 <rtems_termios_baud_to_index+0x30>
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
8004ba8: 34 02 00 07 mvi r2,7
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004bac: 44 22 ff df be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
8004bb0: 34 02 00 08 mvi r2,8
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004bb4: 44 22 ff dd be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30><== ALWAYS TAKEN
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
8004bb8: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
8004bbc: e3 ff ff db bi 8004b28 <rtems_termios_baud_to_index+0x30> <== NOT EXECUTED
int baud_index;
switch (termios_baud) {
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
8004bc0: 34 02 00 02 mvi r2,2
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004bc4: 44 22 ff d9 be r1,r2,8004b28 <rtems_termios_baud_to_index+0x30>
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
8004bc8: 34 02 00 03 mvi r2,3
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004bcc: 5c 22 ff d6 bne r1,r2,8004b24 <rtems_termios_baud_to_index+0x2c><== NEVER TAKEN
8004bd0: e3 ff ff d6 bi 8004b28 <rtems_termios_baud_to_index+0x30>
8004bd4: 34 03 10 03 mvi r3,4099
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
8004bd8: 34 02 00 12 mvi r2,18
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004bdc: 44 23 ff d3 be r1,r3,8004b28 <rtems_termios_baud_to_index+0x30>
8004be0: 34 03 10 04 mvi r3,4100
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
8004be4: 34 02 00 13 mvi r2,19
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004be8: 5c 23 ff cf bne r1,r3,8004b24 <rtems_termios_baud_to_index+0x2c><== NEVER TAKEN
8004bec: e3 ff ff cf bi 8004b28 <rtems_termios_baud_to_index+0x30>
080051fc <rtems_termios_close>:
}
}
rtems_status_code
rtems_termios_close (void *arg)
{
80051fc: 37 9c ff ec addi sp,sp,-20
8005200: 5b 8b 00 14 sw (sp+20),r11
8005204: 5b 8c 00 10 sw (sp+16),r12
8005208: 5b 8d 00 0c sw (sp+12),r13
800520c: 5b 8e 00 08 sw (sp+8),r14
8005210: 5b 9d 00 04 sw (sp+4),ra
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
rtems_status_code sc;
sc = rtems_semaphore_obtain(
8005214: 78 0c 08 02 mvhi r12,0x802
8005218: 39 8c 4a e0 ori r12,r12,0x4ae0
rtems_status_code
rtems_termios_close (void *arg)
{
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
800521c: 28 24 00 00 lw r4,(r1+0)
}
}
rtems_status_code
rtems_termios_close (void *arg)
{
8005220: b8 20 70 00 mv r14,r1
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
rtems_status_code sc;
sc = rtems_semaphore_obtain(
8005224: 29 81 00 00 lw r1,(r12+0)
8005228: 34 02 00 00 mvi r2,0
800522c: 34 03 00 00 mvi r3,0
rtems_status_code
rtems_termios_close (void *arg)
{
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8005230: 28 8b 00 38 lw r11,(r4+56)
rtems_status_code sc;
sc = rtems_semaphore_obtain(
8005234: f8 00 09 ae calli 80078ec <rtems_semaphore_obtain>
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
8005238: 5c 20 00 65 bne r1,r0,80053cc <rtems_termios_close+0x1d0> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
if (--tty->refcount == 0) {
800523c: 29 64 00 08 lw r4,(r11+8)
8005240: 34 84 ff ff addi r4,r4,-1
8005244: 59 64 00 08 sw (r11+8),r4
8005248: 5c 81 00 31 bne r4,r1,800530c <rtems_termios_close+0x110> <== NEVER TAKEN
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
800524c: 29 62 00 cc lw r2,(r11+204)
8005250: 78 05 08 02 mvhi r5,0x802
8005254: 38 a5 49 14 ori r5,r5,0x4914
8005258: b4 42 10 00 add r2,r2,r2
800525c: b4 42 10 00 add r2,r2,r2
8005260: b4 42 10 00 add r2,r2,r2
8005264: b4 42 10 00 add r2,r2,r2
8005268: b4 42 10 00 add r2,r2,r2
800526c: b4 a2 10 00 add r2,r5,r2
8005270: 28 4d 00 04 lw r13,(r2+4)
8005274: 45 a4 00 41 be r13,r4,8005378 <rtems_termios_close+0x17c>
/*
* call discipline-specific close
*/
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
8005278: b9 60 08 00 mv r1,r11
800527c: d9 a0 00 00 call r13
}
drainOutput (tty);
rtems_semaphore_release (tty->osem);
}
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
8005280: 29 62 00 b4 lw r2,(r11+180)
8005284: 34 01 00 02 mvi r1,2
8005288: 44 41 00 48 be r2,r1,80053a8 <rtems_termios_close+0x1ac> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT );
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
if (tty->device.lastClose)
800528c: 29 64 00 9c lw r4,(r11+156)
8005290: 44 80 00 05 be r4,r0,80052a4 <rtems_termios_close+0xa8> <== ALWAYS TAKEN
(*tty->device.lastClose)(tty->major, tty->minor, arg);
8005294: 29 61 00 0c lw r1,(r11+12) <== NOT EXECUTED
8005298: 29 62 00 10 lw r2,(r11+16) <== NOT EXECUTED
800529c: b9 c0 18 00 mv r3,r14 <== NOT EXECUTED
80052a0: d8 80 00 00 call r4 <== NOT EXECUTED
if (tty->forw == NULL) {
80052a4: 29 61 00 00 lw r1,(r11+0)
80052a8: 44 20 00 2c be r1,r0,8005358 <rtems_termios_close+0x15c> <== ALWAYS TAKEN
rtems_termios_ttyTail = tty->back;
if ( rtems_termios_ttyTail != NULL ) {
rtems_termios_ttyTail->forw = NULL;
}
} else {
tty->forw->back = tty->back;
80052ac: 29 62 00 04 lw r2,(r11+4)
80052b0: 58 22 00 04 sw (r1+4),r2 <== NOT EXECUTED
80052b4: 29 62 00 04 lw r2,(r11+4) <== NOT EXECUTED
}
if (tty->back == NULL) {
80052b8: 44 40 00 22 be r2,r0,8005340 <rtems_termios_close+0x144> <== NOT EXECUTED
rtems_termios_ttyHead = tty->forw;
if ( rtems_termios_ttyHead != NULL ) {
rtems_termios_ttyHead->back = NULL;
}
} else {
tty->back->forw = tty->forw;
80052bc: 58 41 00 00 sw (r2+0),r1 <== NOT EXECUTED
}
rtems_semaphore_delete (tty->isem);
80052c0: 29 61 00 14 lw r1,(r11+20)
80052c4: f8 00 09 53 calli 8007810 <rtems_semaphore_delete>
rtems_semaphore_delete (tty->osem);
80052c8: 29 61 00 18 lw r1,(r11+24)
80052cc: f8 00 09 51 calli 8007810 <rtems_semaphore_delete>
rtems_semaphore_delete (tty->rawOutBuf.Semaphore);
80052d0: 29 61 00 8c lw r1,(r11+140)
80052d4: f8 00 09 4f calli 8007810 <rtems_semaphore_delete>
if ((tty->device.pollRead == NULL) ||
80052d8: 29 61 00 a0 lw r1,(r11+160)
80052dc: 44 20 00 16 be r1,r0,8005334 <rtems_termios_close+0x138>
80052e0: 29 62 00 b4 lw r2,(r11+180)
80052e4: 34 01 00 02 mvi r1,2
80052e8: 44 41 00 13 be r2,r1,8005334 <rtems_termios_close+0x138>
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
rtems_semaphore_delete (tty->rawInBuf.Semaphore);
free (tty->rawInBuf.theBuf);
80052ec: 29 61 00 58 lw r1,(r11+88)
80052f0: fb ff f8 5b calli 800345c <free>
free (tty->rawOutBuf.theBuf);
80052f4: 29 61 00 7c lw r1,(r11+124)
80052f8: fb ff f8 59 calli 800345c <free>
free (tty->cbuf);
80052fc: 29 61 00 1c lw r1,(r11+28)
8005300: fb ff f8 57 calli 800345c <free>
free (tty);
8005304: b9 60 08 00 mv r1,r11
8005308: fb ff f8 55 calli 800345c <free>
}
rtems_semaphore_release (rtems_termios_ttyMutex);
800530c: 29 81 00 00 lw r1,(r12+0)
8005310: f8 00 09 d3 calli 8007a5c <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
}
8005314: 34 01 00 00 mvi r1,0
8005318: 2b 9d 00 04 lw ra,(sp+4)
800531c: 2b 8b 00 14 lw r11,(sp+20)
8005320: 2b 8c 00 10 lw r12,(sp+16)
8005324: 2b 8d 00 0c lw r13,(sp+12)
8005328: 2b 8e 00 08 lw r14,(sp+8)
800532c: 37 9c 00 14 addi sp,sp,20
8005330: c3 a0 00 00 ret
rtems_semaphore_delete (tty->isem);
rtems_semaphore_delete (tty->osem);
rtems_semaphore_delete (tty->rawOutBuf.Semaphore);
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
rtems_semaphore_delete (tty->rawInBuf.Semaphore);
8005334: 29 61 00 68 lw r1,(r11+104)
8005338: f8 00 09 36 calli 8007810 <rtems_semaphore_delete>
800533c: e3 ff ff ec bi 80052ec <rtems_termios_close+0xf0>
} else {
tty->forw->back = tty->back;
}
if (tty->back == NULL) {
rtems_termios_ttyHead = tty->forw;
8005340: 78 02 08 02 mvhi r2,0x802
8005344: 38 42 4a e8 ori r2,r2,0x4ae8
8005348: 58 41 00 00 sw (r2+0),r1
if ( rtems_termios_ttyHead != NULL ) {
800534c: 44 20 ff dd be r1,r0,80052c0 <rtems_termios_close+0xc4> <== ALWAYS TAKEN
rtems_termios_ttyHead->back = NULL;
8005350: 58 20 00 04 sw (r1+4),r0 <== NOT EXECUTED
8005354: e3 ff ff db bi 80052c0 <rtems_termios_close+0xc4> <== NOT EXECUTED
rtems_fatal_error_occurred (sc);
}
if (tty->device.lastClose)
(*tty->device.lastClose)(tty->major, tty->minor, arg);
if (tty->forw == NULL) {
rtems_termios_ttyTail = tty->back;
8005358: 29 62 00 04 lw r2,(r11+4)
800535c: 78 03 08 02 mvhi r3,0x802
8005360: 38 63 4a e4 ori r3,r3,0x4ae4
8005364: 58 62 00 00 sw (r3+0),r2
if ( rtems_termios_ttyTail != NULL ) {
8005368: 44 41 ff f6 be r2,r1,8005340 <rtems_termios_close+0x144> <== ALWAYS TAKEN
rtems_termios_ttyTail->forw = NULL;
800536c: 58 40 00 00 sw (r2+0),r0
8005370: 29 61 00 00 lw r1,(r11+0) <== NOT EXECUTED
8005374: e3 ff ff d2 bi 80052bc <rtems_termios_close+0xc0> <== NOT EXECUTED
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
} else {
/*
* default: just flush output buffer
*/
sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8005378: 29 61 00 18 lw r1,(r11+24)
800537c: 34 02 00 00 mvi r2,0
8005380: 34 03 00 00 mvi r3,0
8005384: f8 00 09 5a calli 80078ec <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL) {
8005388: 5d a1 00 11 bne r13,r1,80053cc <rtems_termios_close+0x1d0> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
}
drainOutput (tty);
800538c: b9 60 08 00 mv r1,r11
8005390: fb ff fe 4e calli 8004cc8 <drainOutput>
rtems_semaphore_release (tty->osem);
8005394: 29 61 00 18 lw r1,(r11+24)
8005398: f8 00 09 b1 calli 8007a5c <rtems_semaphore_release>
}
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
800539c: 29 62 00 b4 lw r2,(r11+180)
80053a0: 34 01 00 02 mvi r1,2
80053a4: 5c 41 ff ba bne r2,r1,800528c <rtems_termios_close+0x90>
/*
* send "terminate" to I/O tasks
*/
sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT );
80053a8: 29 61 00 c4 lw r1,(r11+196)
80053ac: 34 02 00 01 mvi r2,1
80053b0: f8 00 07 e4 calli 8007340 <rtems_event_send>
80053b4: b8 20 68 00 mv r13,r1
if (sc != RTEMS_SUCCESSFUL)
80053b8: 5c 20 00 05 bne r1,r0,80053cc <rtems_termios_close+0x1d0> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT );
80053bc: 29 61 00 c8 lw r1,(r11+200)
80053c0: 34 02 00 01 mvi r2,1
80053c4: f8 00 07 df calli 8007340 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
80053c8: 44 2d ff b1 be r1,r13,800528c <rtems_termios_close+0x90> <== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
80053cc: f8 00 0b 47 calli 80080e8 <rtems_fatal_error_occurred>
08006c34 <rtems_termios_dequeue_characters>:
* for each transmitted character.
* It returns number of characters left to transmit
*/
int
rtems_termios_dequeue_characters (void *ttyp, int len)
{
8006c34: 37 9c ff f8 addi sp,sp,-8
8006c38: 5b 8b 00 08 sw (sp+8),r11
8006c3c: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code sc;
/*
* sum up character count already sent
*/
tty->t_dqlen += len;
8006c40: 28 25 00 90 lw r5,(r1+144)
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
8006c44: 28 24 00 b4 lw r4,(r1+180)
rtems_status_code sc;
/*
* sum up character count already sent
*/
tty->t_dqlen += len;
8006c48: b4 a2 10 00 add r2,r5,r2
8006c4c: 58 22 00 90 sw (r1+144),r2
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
8006c50: 34 02 00 02 mvi r2,2
8006c54: 44 82 00 16 be r4,r2,8006cac <rtems_termios_dequeue_characters+0x78>
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
return 0; /* nothing to output in IRQ... */
}
if (tty->t_line == PPPDISC ) {
8006c58: 28 23 00 cc lw r3,(r1+204)
8006c5c: 34 02 00 05 mvi r2,5
8006c60: 44 62 00 08 be r3,r2,8006c80 <rtems_termios_dequeue_characters+0x4c>
rtems_termios_linesw[tty->t_line].l_start(tty);
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
8006c64: fb ff ff 39 calli 8006948 <rtems_termios_refill_transmitter>
8006c68: b8 20 58 00 mv r11,r1
}
8006c6c: b9 60 08 00 mv r1,r11
8006c70: 2b 9d 00 04 lw ra,(sp+4)
8006c74: 2b 8b 00 08 lw r11,(sp+8)
8006c78: 37 9c 00 08 addi sp,sp,8
8006c7c: c3 a0 00 00 ret
if (tty->t_line == PPPDISC ) {
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
8006c80: 78 02 08 02 mvhi r2,0x802
8006c84: 38 42 49 14 ori r2,r2,0x4914
8006c88: 28 42 00 b4 lw r2,(r2+180)
rtems_termios_linesw[tty->t_line].l_start(tty);
}
return 0; /* nothing to output in IRQ... */
8006c8c: 34 0b 00 00 mvi r11,0
if (tty->t_line == PPPDISC ) {
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
8006c90: 44 40 ff f7 be r2,r0,8006c6c <rtems_termios_dequeue_characters+0x38><== NEVER TAKEN
rtems_termios_linesw[tty->t_line].l_start(tty);
8006c94: d8 40 00 00 call r2
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
}
8006c98: b9 60 08 00 mv r1,r11
8006c9c: 2b 9d 00 04 lw ra,(sp+4)
8006ca0: 2b 8b 00 08 lw r11,(sp+8)
8006ca4: 37 9c 00 08 addi sp,sp,8
8006ca8: c3 a0 00 00 ret
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
/*
* send wake up to transmitter task
*/
sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT);
8006cac: 28 21 00 c8 lw r1,(r1+200)
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
return 0; /* nothing to output in IRQ... */
8006cb0: 34 0b 00 00 mvi r11,0
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
/*
* send wake up to transmitter task
*/
sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT);
8006cb4: f8 00 01 a3 calli 8007340 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
8006cb8: 44 20 ff ed be r1,r0,8006c6c <rtems_termios_dequeue_characters+0x38><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
8006cbc: f8 00 05 0b calli 80080e8 <rtems_fatal_error_occurred> <== NOT EXECUTED
08006558 <rtems_termios_enqueue_raw_characters>:
* 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)
{
8006558: 37 9c ff bc addi sp,sp,-68
800655c: 5b 8b 00 44 sw (sp+68),r11
8006560: 5b 8c 00 40 sw (sp+64),r12
8006564: 5b 8d 00 3c sw (sp+60),r13
8006568: 5b 8e 00 38 sw (sp+56),r14
800656c: 5b 8f 00 34 sw (sp+52),r15
8006570: 5b 90 00 30 sw (sp+48),r16
8006574: 5b 91 00 2c sw (sp+44),r17
8006578: 5b 92 00 28 sw (sp+40),r18
800657c: 5b 93 00 24 sw (sp+36),r19
8006580: 5b 94 00 20 sw (sp+32),r20
8006584: 5b 95 00 1c sw (sp+28),r21
8006588: 5b 96 00 18 sw (sp+24),r22
800658c: 5b 97 00 14 sw (sp+20),r23
8006590: 5b 98 00 10 sw (sp+16),r24
8006594: 5b 99 00 0c sw (sp+12),r25
8006598: 5b 9b 00 08 sw (sp+8),fp
800659c: 5b 9d 00 04 sw (sp+4),ra
80065a0: b8 20 58 00 mv r11,r1
char c;
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
80065a4: 28 21 00 cc lw r1,(r1+204)
80065a8: 78 0e 08 02 mvhi r14,0x802
80065ac: 39 ce 49 14 ori r14,r14,0x4914
80065b0: b4 21 08 00 add r1,r1,r1
80065b4: b4 21 08 00 add r1,r1,r1
80065b8: b4 21 08 00 add r1,r1,r1
80065bc: b4 21 08 00 add r1,r1,r1
80065c0: b4 21 08 00 add r1,r1,r1
80065c4: b5 c1 08 00 add r1,r14,r1
80065c8: 28 24 00 10 lw r4,(r1+16)
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len)
{
80065cc: b8 40 68 00 mv r13,r2
80065d0: b8 60 78 00 mv r15,r3
char c;
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
80065d4: 44 80 00 30 be r4,r0,8006694 <rtems_termios_enqueue_raw_characters+0x13c>
while (len--) {
80065d8: 44 60 00 11 be r3,r0,800661c <rtems_termios_enqueue_raw_characters+0xc4><== NEVER TAKEN
80065dc: 34 0c 00 00 mvi r12,0
80065e0: e0 00 00 09 bi 8006604 <rtems_termios_enqueue_raw_characters+0xac>
80065e4: 29 64 00 cc lw r4,(r11+204)
80065e8: b4 84 20 00 add r4,r4,r4
80065ec: b4 84 20 00 add r4,r4,r4
80065f0: b4 84 20 00 add r4,r4,r4
80065f4: b4 84 20 00 add r4,r4,r4
80065f8: b4 84 20 00 add r4,r4,r4
80065fc: b5 c4 20 00 add r4,r14,r4
8006600: 28 84 00 10 lw r4,(r4+16)
* NOTE: This routine runs in the context of the
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len)
8006604: b5 ac 08 00 add r1,r13,r12
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
c = *buf++;
rtems_termios_linesw[tty->t_line].l_rint(c,tty);
8006608: 40 21 00 00 lbu r1,(r1+0)
800660c: 35 8c 00 01 addi r12,r12,1
8006610: b9 60 10 00 mv r2,r11
8006614: d8 80 00 00 call r4
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
8006618: 5d 8f ff f3 bne r12,r15,80065e4 <rtems_termios_enqueue_raw_characters+0x8c>
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
800661c: 29 61 00 e4 lw r1,(r11+228)
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
}
return 0;
8006620: 34 10 00 00 mvi r16,0
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
8006624: 5c 20 00 08 bne r1,r0,8006644 <rtems_termios_enqueue_raw_characters+0xec><== NEVER TAKEN
8006628: 29 63 00 dc lw r3,(r11+220)
800662c: 44 70 00 06 be r3,r16,8006644 <rtems_termios_enqueue_raw_characters+0xec><== NEVER TAKEN
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
8006630: 29 62 00 e0 lw r2,(r11+224)
8006634: 35 61 00 30 addi r1,r11,48
8006638: d8 60 00 00 call r3
tty->tty_rcvwakeup = 1;
800663c: 34 01 00 01 mvi r1,1
8006640: 59 61 00 e4 sw (r11+228),r1
}
tty->rawInBufDropped += dropped;
rtems_semaphore_release (tty->rawInBuf.Semaphore);
return dropped;
}
8006644: ba 00 08 00 mv r1,r16
8006648: 2b 9d 00 04 lw ra,(sp+4)
800664c: 2b 8b 00 44 lw r11,(sp+68)
8006650: 2b 8c 00 40 lw r12,(sp+64)
8006654: 2b 8d 00 3c lw r13,(sp+60)
8006658: 2b 8e 00 38 lw r14,(sp+56)
800665c: 2b 8f 00 34 lw r15,(sp+52)
8006660: 2b 90 00 30 lw r16,(sp+48)
8006664: 2b 91 00 2c lw r17,(sp+44)
8006668: 2b 92 00 28 lw r18,(sp+40)
800666c: 2b 93 00 24 lw r19,(sp+36)
8006670: 2b 94 00 20 lw r20,(sp+32)
8006674: 2b 95 00 1c lw r21,(sp+28)
8006678: 2b 96 00 18 lw r22,(sp+24)
800667c: 2b 97 00 14 lw r23,(sp+20)
8006680: 2b 98 00 10 lw r24,(sp+16)
8006684: 2b 99 00 0c lw r25,(sp+12)
8006688: 2b 9b 00 08 lw fp,(sp+8)
800668c: 37 9c 00 44 addi sp,sp,68
8006690: c3 a0 00 00 ret
char c;
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
8006694: 34 12 00 00 mvi r18,0
8006698: 34 10 00 00 mvi r16,0
flow_rcv = true;
}
}
if (flow_rcv) {
/* restart output according to FL_ORCVXOF flag */
if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
800669c: 34 14 00 20 mvi r20,32
/* disable interrupts */
rtems_interrupt_disable(level);
80066a0: 34 13 ff fe mvi r19,-2
tty->flow_ctrl &= ~FL_OSTOP;
80066a4: 34 15 ff df mvi r21,-33
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
80066a8: 35 77 00 30 addi r23,r11,48
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
% tty->rawInBuf.Size) > tty->highwater) &&
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
80066ac: 34 16 04 00 mvi r22,1024
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
80066b0: 34 19 01 00 mvi r25,256
if ((tty->flow_ctrl & FL_OSTOP) ||
(tty->rawOutBufState == rob_idle)) {
/* if tx is stopped due to XOFF or out of data */
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
80066b4: 35 7b 00 4a addi fp,r11,74
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
/* VSTART received */
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
80066b8: 34 18 ff ef mvi r24,-17
tty->tty_rcvwakeup = 1;
}
return 0;
}
while (len--) {
80066bc: 45 e0 00 39 be r15,r0,80067a0 <rtems_termios_enqueue_raw_characters+0x248><== NEVER TAKEN
c = *buf++;
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
80066c0: 29 63 00 b8 lw r3,(r11+184)
}
return 0;
}
while (len--) {
c = *buf++;
80066c4: 41 ae 00 00 lbu r14,(r13+0)
80066c8: 35 ad 00 01 addi r13,r13,1
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
80066cc: 20 63 02 00 andi r3,r3,0x200
80066d0: 44 60 00 05 be r3,r0,80066e4 <rtems_termios_enqueue_raw_characters+0x18c>
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
80066d4: 41 63 00 4a lbu r3,(r11+74)
80066d8: 44 6e 00 53 be r3,r14,8006824 <rtems_termios_enqueue_raw_characters+0x2cc>
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
}
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
80066dc: 41 63 00 49 lbu r3,(r11+73)
80066e0: 44 6e 00 36 be r3,r14,80067b8 <rtems_termios_enqueue_raw_characters+0x260><== NEVER TAKEN
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
flow_rcv = true;
}
}
if (flow_rcv) {
80066e4: 5e 40 00 39 bne r18,r0,80067c8 <rtems_termios_enqueue_raw_characters+0x270><== NEVER TAKEN
}
/* reenable interrupts */
rtems_interrupt_enable(level);
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
80066e8: 29 63 00 60 lw r3,(r11+96)
80066ec: 29 62 00 64 lw r2,(r11+100)
80066f0: 34 61 00 01 addi r1,r3,1
80066f4: f8 00 64 25 calli 801f788 <__umodsi3>
80066f8: b8 20 60 00 mv r12,r1
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
80066fc: 90 00 88 00 rcsr r17,IE
8006700: a2 33 18 00 and r3,r17,r19
8006704: d0 03 00 00 wcsr IE,r3
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
8006708: 29 63 00 5c lw r3,(r11+92)
800670c: 29 64 00 64 lw r4,(r11+100)
% tty->rawInBuf.Size) > tty->highwater) &&
8006710: 29 62 00 64 lw r2,(r11+100)
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
8006714: c8 83 18 00 sub r3,r4,r3
% tty->rawInBuf.Size) > tty->highwater) &&
8006718: b4 61 08 00 add r1,r3,r1
800671c: f8 00 64 1b calli 801f788 <__umodsi3>
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
8006720: 29 63 00 c0 lw r3,(r11+192)
8006724: 50 61 00 0d bgeu r3,r1,8006758 <rtems_termios_enqueue_raw_characters+0x200><== ALWAYS TAKEN
% tty->rawInBuf.Size) > tty->highwater) &&
!(tty->flow_ctrl & FL_IREQXOF)) {
8006728: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED
800672c: 20 63 00 01 andi r3,r3,0x1 <== NOT EXECUTED
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
% tty->rawInBuf.Size) > tty->highwater) &&
8006730: 5c 60 00 0a bne r3,r0,8006758 <rtems_termios_enqueue_raw_characters+0x200><== NOT EXECUTED
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
8006734: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED
8006738: 38 63 00 01 ori r3,r3,0x1 <== NOT EXECUTED
800673c: 59 63 00 b8 sw (r11+184),r3 <== NOT EXECUTED
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
8006740: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED
8006744: 20 63 04 02 andi r3,r3,0x402 <== NOT EXECUTED
8006748: 44 76 00 44 be r3,r22,8006858 <rtems_termios_enqueue_raw_characters+0x300><== NOT EXECUTED
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
800674c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8006750: 20 21 01 04 andi r1,r1,0x104 <== NOT EXECUTED
8006754: 44 39 00 4f be r1,r25,8006890 <rtems_termios_enqueue_raw_characters+0x338><== NOT EXECUTED
}
}
}
/* reenable interrupts */
rtems_interrupt_enable(level);
8006758: d0 11 00 00 wcsr IE,r17
if (newTail == tty->rawInBuf.Head) {
800675c: 29 63 00 5c lw r3,(r11+92)
8006760: 44 6c 00 37 be r3,r12,800683c <rtems_termios_enqueue_raw_characters+0x2e4><== NEVER TAKEN
dropped++;
} else {
tty->rawInBuf.theBuf[newTail] = c;
8006764: 29 63 00 58 lw r3,(r11+88)
8006768: b4 6c 18 00 add r3,r3,r12
800676c: 30 6e 00 00 sb (r3+0),r14
tty->rawInBuf.Tail = newTail;
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
8006770: 29 63 00 e4 lw r3,(r11+228)
if (newTail == tty->rawInBuf.Head) {
dropped++;
} else {
tty->rawInBuf.theBuf[newTail] = c;
tty->rawInBuf.Tail = newTail;
8006774: 59 6c 00 60 sw (r11+96),r12
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
8006778: 5c 60 00 08 bne r3,r0,8006798 <rtems_termios_enqueue_raw_characters+0x240><== NEVER TAKEN
800677c: 29 64 00 dc lw r4,(r11+220)
8006780: 44 83 00 06 be r4,r3,8006798 <rtems_termios_enqueue_raw_characters+0x240><== ALWAYS TAKEN
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
8006784: 29 62 00 e0 lw r2,(r11+224) <== NOT EXECUTED
8006788: ba e0 08 00 mv r1,r23 <== NOT EXECUTED
800678c: d8 80 00 00 call r4 <== NOT EXECUTED
tty->tty_rcvwakeup = 1;
8006790: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006794: 59 63 00 e4 sw (r11+228),r3 <== NOT EXECUTED
8006798: 35 ef ff ff addi r15,r15,-1
tty->tty_rcvwakeup = 1;
}
return 0;
}
while (len--) {
800679c: 5d e0 ff c9 bne r15,r0,80066c0 <rtems_termios_enqueue_raw_characters+0x168><== NEVER TAKEN
}
}
}
}
tty->rawInBufDropped += dropped;
80067a0: 29 62 00 78 lw r2,(r11+120)
rtems_semaphore_release (tty->rawInBuf.Semaphore);
80067a4: 29 61 00 68 lw r1,(r11+104)
}
}
}
}
tty->rawInBufDropped += dropped;
80067a8: b4 50 10 00 add r2,r2,r16
80067ac: 59 62 00 78 sw (r11+120),r2
rtems_semaphore_release (tty->rawInBuf.Semaphore);
80067b0: f8 00 04 ab calli 8007a5c <rtems_semaphore_release>
return dropped;
80067b4: e3 ff ff a4 bi 8006644 <rtems_termios_enqueue_raw_characters+0xec>
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
/* VSTART received */
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
80067b8: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
80067bc: a0 38 08 00 and r1,r1,r24 <== NOT EXECUTED
80067c0: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
80067c4: 34 12 00 01 mvi r18,1
flow_rcv = true;
}
}
if (flow_rcv) {
/* restart output according to FL_ORCVXOF flag */
if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
80067c8: 29 63 00 b8 lw r3,(r11+184)
80067cc: 20 63 00 30 andi r3,r3,0x30
80067d0: 5c 74 ff f2 bne r3,r20,8006798 <rtems_termios_enqueue_raw_characters+0x240><== ALWAYS TAKEN
/* disable interrupts */
rtems_interrupt_disable(level);
80067d4: 90 00 60 00 rcsr r12,IE <== NOT EXECUTED
80067d8: a1 93 18 00 and r3,r12,r19 <== NOT EXECUTED
80067dc: d0 03 00 00 wcsr IE,r3 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
80067e0: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
80067e4: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED
if (flow_rcv) {
/* restart output according to FL_ORCVXOF flag */
if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
/* disable interrupts */
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
80067e8: a0 75 18 00 and r3,r3,r21 <== NOT EXECUTED
80067ec: 59 63 00 b8 sw (r11+184),r3 <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
80067f0: 5c 20 00 04 bne r1,r0,8006800 <rtems_termios_enqueue_raw_characters+0x2a8><== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
80067f4: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
80067f8: 35 ef ff ff addi r15,r15,-1 <== NOT EXECUTED
80067fc: e3 ff ff e8 bi 800679c <rtems_termios_enqueue_raw_characters+0x244><== NOT EXECUTED
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
8006800: 29 63 00 7c lw r3,(r11+124) <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
8006804: 29 62 00 84 lw r2,(r11+132) <== NOT EXECUTED
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
8006808: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
800680c: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8006810: b4 62 10 00 add r2,r3,r2 <== NOT EXECUTED
8006814: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006818: d8 80 00 00 call r4 <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
800681c: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED
8006820: e3 ff ff f6 bi 80067f8 <rtems_termios_enqueue_raw_characters+0x2a0><== NOT EXECUTED
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
if (c == tty->termios.c_cc[VSTART]) {
8006824: 41 64 00 49 lbu r4,(r11+73)
8006828: 44 83 00 08 be r4,r3,8006848 <rtems_termios_enqueue_raw_characters+0x2f0><== NEVER TAKEN
tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF;
}
else {
/* VSTOP received (other code than VSTART) */
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
800682c: 29 61 00 b8 lw r1,(r11+184)
8006830: 38 21 00 10 ori r1,r1,0x10
8006834: 59 61 00 b8 sw (r11+184),r1
8006838: e3 ff ff e3 bi 80067c4 <rtems_termios_enqueue_raw_characters+0x26c>
/* reenable interrupts */
rtems_interrupt_enable(level);
if (newTail == tty->rawInBuf.Head) {
dropped++;
800683c: 36 10 00 01 addi r16,r16,1 <== NOT EXECUTED
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
8006840: 35 ef ff ff addi r15,r15,-1 <== NOT EXECUTED
8006844: e3 ff ff d6 bi 800679c <rtems_termios_enqueue_raw_characters+0x244><== NOT EXECUTED
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
if (c == tty->termios.c_cc[VSTART]) {
/* received VSTOP and VSTART==VSTOP? */
/* then toggle "stop output" status */
tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF;
8006848: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
800684c: 18 21 00 10 xori r1,r1,0x10 <== NOT EXECUTED
8006850: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
8006854: e3 ff ff dc bi 80067c4 <rtems_termios_enqueue_raw_characters+0x26c><== NOT EXECUTED
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
== (FL_MDXOF ) ) {
if ((tty->flow_ctrl & FL_OSTOP) ||
8006858: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
800685c: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED
8006860: 5c 20 00 03 bne r1,r0,800686c <rtems_termios_enqueue_raw_characters+0x314><== NOT EXECUTED
8006864: 29 62 00 94 lw r2,(r11+148) <== NOT EXECUTED
8006868: 5c 41 ff bc bne r2,r1,8006758 <rtems_termios_enqueue_raw_characters+0x200><== 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;
800686c: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
(*tty->device.write)(tty->minor,
8006870: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8006874: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
== (FL_MDXOF ) ) {
if ((tty->flow_ctrl & FL_OSTOP) ||
(tty->rawOutBufState == rob_idle)) {
/* if tx is stopped due to XOFF or out of data */
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
8006878: 38 42 00 02 ori r2,r2,0x2 <== NOT EXECUTED
800687c: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED
(*tty->device.write)(tty->minor,
8006880: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006884: bb 60 10 00 mv r2,fp <== NOT EXECUTED
8006888: d8 80 00 00 call r4 <== NOT EXECUTED
800688c: e3 ff ff b3 bi 8006758 <rtems_termios_enqueue_raw_characters+0x200><== NOT EXECUTED
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
tty->flow_ctrl |= FL_IRTSOFF;
8006890: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
/* deactivate RTS line */
if (tty->device.stopRemoteTx != NULL) {
8006894: 29 62 00 ac lw r2,(r11+172) <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
tty->flow_ctrl |= FL_IRTSOFF;
8006898: 38 21 00 04 ori r1,r1,0x4 <== NOT EXECUTED
800689c: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* deactivate RTS line */
if (tty->device.stopRemoteTx != NULL) {
80068a0: 44 40 ff ae be r2,r0,8006758 <rtems_termios_enqueue_raw_characters+0x200><== NOT EXECUTED
tty->device.stopRemoteTx(tty->minor);
80068a4: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
80068a8: d8 40 00 00 call r2 <== NOT EXECUTED
80068ac: e3 ff ff ab bi 8006758 <rtems_termios_enqueue_raw_characters+0x200><== NOT EXECUTED
08004c34 <rtems_termios_initialize>:
struct rtems_termios_tty *rtems_termios_ttyTail;
rtems_id rtems_termios_ttyMutex;
void
rtems_termios_initialize (void)
{
8004c34: 37 9c ff f8 addi sp,sp,-8
8004c38: 5b 8b 00 08 sw (sp+8),r11
8004c3c: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code sc;
/*
* Create the mutex semaphore for the tty list
*/
if (!rtems_termios_ttyMutex) {
8004c40: 78 05 08 02 mvhi r5,0x802
8004c44: 38 a5 4a e0 ori r5,r5,0x4ae0
8004c48: 28 ab 00 00 lw r11,(r5+0)
8004c4c: 45 60 00 05 be r11,r0,8004c60 <rtems_termios_initialize+0x2c><== ALWAYS TAKEN
RTEMS_NO_PRIORITY,
&rtems_termios_ttyMutex);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
}
8004c50: 2b 9d 00 04 lw ra,(sp+4)
8004c54: 2b 8b 00 08 lw r11,(sp+8)
8004c58: 37 9c 00 08 addi sp,sp,8
8004c5c: c3 a0 00 00 ret
/*
* Create the mutex semaphore for the tty list
*/
if (!rtems_termios_ttyMutex) {
sc = rtems_semaphore_create (
8004c60: 78 02 08 02 mvhi r2,0x802
8004c64: 38 42 1a f4 ori r2,r2,0x1af4
8004c68: 28 41 00 00 lw r1,(r2+0)
8004c6c: 34 03 00 54 mvi r3,84
8004c70: 34 02 00 01 mvi r2,1
8004c74: 34 04 00 00 mvi r4,0
8004c78: f8 00 0a 62 calli 8007600 <rtems_semaphore_create>
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)
8004c7c: 44 2b ff f5 be r1,r11,8004c50 <rtems_termios_initialize+0x1c><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
8004c80: f8 00 0d 1a calli 80080e8 <rtems_fatal_error_occurred> <== NOT EXECUTED
080053fc <rtems_termios_ioctl>:
}
}
rtems_status_code
rtems_termios_ioctl (void *arg)
{
80053fc: 37 9c ff e8 addi sp,sp,-24
8005400: 5b 8b 00 18 sw (sp+24),r11
8005404: 5b 8c 00 14 sw (sp+20),r12
8005408: 5b 8d 00 10 sw (sp+16),r13
800540c: 5b 8e 00 0c sw (sp+12),r14
8005410: 5b 8f 00 08 sw (sp+8),r15
8005414: 5b 9d 00 04 sw (sp+4),ra
8005418: b8 20 60 00 mv r12,r1
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
800541c: 28 21 00 00 lw r1,(r1+0)
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
rtems_status_code sc;
args->ioctl_return = 0;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8005420: 34 02 00 00 mvi r2,0
8005424: 34 03 00 00 mvi r3,0
rtems_status_code
rtems_termios_ioctl (void *arg)
{
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8005428: 28 2b 00 38 lw r11,(r1+56)
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
rtems_status_code sc;
args->ioctl_return = 0;
800542c: 59 80 00 0c sw (r12+12),r0
rtems_status_code
rtems_termios_ioctl (void *arg)
{
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
8005430: 29 8e 00 08 lw r14,(r12+8)
rtems_status_code sc;
args->ioctl_return = 0;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8005434: 29 61 00 18 lw r1,(r11+24)
8005438: f8 00 09 2d calli 80078ec <rtems_semaphore_obtain>
800543c: b8 20 68 00 mv r13,r1
if (sc != RTEMS_SUCCESSFUL) {
8005440: 5c 20 00 21 bne r1,r0,80054c4 <rtems_termios_ioctl+0xc8> <== NEVER TAKEN
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
8005444: 29 81 00 04 lw r1,(r12+4)
8005448: 34 02 00 04 mvi r2,4
800544c: 44 22 00 18 be r1,r2,80054ac <rtems_termios_ioctl+0xb0>
8005450: 54 22 00 27 bgu r1,r2,80054ec <rtems_termios_ioctl+0xf0>
8005454: 34 02 00 02 mvi r2,2
8005458: 44 22 00 31 be r1,r2,800551c <rtems_termios_ioctl+0x120>
800545c: 54 22 00 e3 bgu r1,r2,80057e8 <rtems_termios_ioctl+0x3ec>
8005460: 34 02 00 01 mvi r2,1
8005464: 44 22 00 cd be r1,r2,8005798 <rtems_termios_ioctl+0x39c> <== ALWAYS TAKEN
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
8005468: 29 61 00 cc lw r1,(r11+204)
800546c: 78 02 08 02 mvhi r2,0x802
8005470: 38 42 49 14 ori r2,r2,0x4914
8005474: b4 21 08 00 add r1,r1,r1
8005478: b4 21 08 00 add r1,r1,r1
800547c: b4 21 08 00 add r1,r1,r1
8005480: b4 21 08 00 add r1,r1,r1
8005484: b4 21 08 00 add r1,r1,r1
8005488: b4 41 08 00 add r1,r2,r1
800548c: 28 23 00 18 lw r3,(r1+24)
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
}
else {
sc = RTEMS_INVALID_NUMBER;
8005490: 34 0d 00 0a mvi r13,10
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
8005494: 44 60 00 0a be r3,r0,80054bc <rtems_termios_ioctl+0xc0> <== NEVER TAKEN
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
8005498: b9 60 08 00 mv r1,r11
800549c: b9 80 10 00 mv r2,r12
80054a0: d8 60 00 00 call r3
80054a4: b8 20 68 00 mv r13,r1
80054a8: e0 00 00 05 bi 80054bc <rtems_termios_ioctl+0xc0>
case RTEMS_IO_SNDWAKEUP:
tty->tty_snd = *wakeup;
break;
case RTEMS_IO_RCVWAKEUP:
tty->tty_rcv = *wakeup;
80054ac: 29 c1 00 00 lw r1,(r14+0)
80054b0: 59 61 00 dc sw (r11+220),r1
80054b4: 29 c1 00 04 lw r1,(r14+4)
80054b8: 59 61 00 e0 sw (r11+224),r1
*(int *)args->buffer = tty->ccount - tty->cindex + rawnc;
}
break;
}
rtems_semaphore_release (tty->osem);
80054bc: 29 61 00 18 lw r1,(r11+24)
80054c0: f8 00 09 67 calli 8007a5c <rtems_semaphore_release>
args->ioctl_return = sc;
return sc;
}
80054c4: b9 a0 08 00 mv r1,r13
}
break;
}
rtems_semaphore_release (tty->osem);
args->ioctl_return = sc;
80054c8: 59 8d 00 0c sw (r12+12),r13
return sc;
}
80054cc: 2b 9d 00 04 lw ra,(sp+4)
80054d0: 2b 8b 00 18 lw r11,(sp+24)
80054d4: 2b 8c 00 14 lw r12,(sp+20)
80054d8: 2b 8d 00 10 lw r13,(sp+16)
80054dc: 2b 8e 00 0c lw r14,(sp+12)
80054e0: 2b 8f 00 08 lw r15,(sp+8)
80054e4: 37 9c 00 18 addi sp,sp,24
80054e8: c3 a0 00 00 ret
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL) {
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
80054ec: 78 03 08 02 mvhi r3,0x802
80054f0: 38 63 1b 10 ori r3,r3,0x1b10
80054f4: 28 62 00 00 lw r2,(r3+0)
80054f8: 44 22 00 71 be r1,r2,80056bc <rtems_termios_ioctl+0x2c0> <== NEVER TAKEN
80054fc: 54 22 00 7d bgu r1,r2,80056f0 <rtems_termios_ioctl+0x2f4>
8005500: 34 02 00 05 mvi r2,5
8005504: 5c 22 ff d9 bne r1,r2,8005468 <rtems_termios_ioctl+0x6c>
case RTEMS_IO_TCDRAIN:
drainOutput (tty);
break;
case RTEMS_IO_SNDWAKEUP:
tty->tty_snd = *wakeup;
8005508: 29 c1 00 00 lw r1,(r14+0)
800550c: 59 61 00 d4 sw (r11+212),r1
8005510: 29 c1 00 04 lw r1,(r14+4)
8005514: 59 61 00 d8 sw (r11+216),r1
break;
8005518: e3 ff ff e9 bi 80054bc <rtems_termios_ioctl+0xc0>
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
break;
case RTEMS_IO_SET_ATTRIBUTES:
tty->termios = *(struct termios *)args->buffer;
800551c: 29 81 00 08 lw r1,(r12+8)
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
8005520: 29 63 00 b8 lw r3,(r11+184)
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
break;
case RTEMS_IO_SET_ATTRIBUTES:
tty->termios = *(struct termios *)args->buffer;
8005524: 28 22 00 00 lw r2,(r1+0)
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
8005528: 20 63 02 00 andi r3,r3,0x200
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
break;
case RTEMS_IO_SET_ATTRIBUTES:
tty->termios = *(struct termios *)args->buffer;
800552c: 59 62 00 30 sw (r11+48),r2
8005530: 28 24 00 04 lw r4,(r1+4)
8005534: 59 64 00 34 sw (r11+52),r4
8005538: 28 24 00 08 lw r4,(r1+8)
800553c: 59 64 00 38 sw (r11+56),r4
8005540: 28 24 00 0c lw r4,(r1+12)
8005544: 59 64 00 3c sw (r11+60),r4
8005548: 28 24 00 10 lw r4,(r1+16)
800554c: 59 64 00 40 sw (r11+64),r4
8005550: 28 24 00 14 lw r4,(r1+20)
8005554: 59 64 00 44 sw (r11+68),r4
8005558: 28 24 00 18 lw r4,(r1+24)
800555c: 59 64 00 48 sw (r11+72),r4
8005560: 28 24 00 1c lw r4,(r1+28)
8005564: 59 64 00 4c sw (r11+76),r4
8005568: 28 21 00 20 lw r1,(r1+32)
800556c: 59 61 00 50 sw (r11+80),r1
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
8005570: 44 60 00 15 be r3,r0,80055c4 <rtems_termios_ioctl+0x1c8>
!(tty->termios.c_iflag & IXON)) {
8005574: 20 42 04 00 andi r2,r2,0x400
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
8005578: 5c 40 00 13 bne r2,r0,80055c4 <rtems_termios_ioctl+0x1c8> <== ALWAYS TAKEN
!(tty->termios.c_iflag & IXON)) {
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF);
800557c: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
8005580: 34 01 fd ef mvi r1,-529 <== NOT EXECUTED
8005584: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
8005588: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* has output been stopped due to received XOFF? */
if (tty->flow_ctrl & FL_OSTOP) {
800558c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8005590: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED
8005594: 44 20 00 0c be r1,r0,80055c4 <rtems_termios_ioctl+0x1c8> <== NOT EXECUTED
/* disable interrupts */
rtems_interrupt_disable(level);
8005598: 90 00 70 00 rcsr r14,IE <== NOT EXECUTED
800559c: 34 01 ff fe mvi r1,-2 <== NOT EXECUTED
80055a0: a1 c1 08 00 and r1,r14,r1 <== NOT EXECUTED
80055a4: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
80055a8: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
80055ac: 34 01 ff df mvi r1,-33 <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
80055b0: 29 63 00 94 lw r3,(r11+148) <== NOT EXECUTED
/* has output been stopped due to received XOFF? */
if (tty->flow_ctrl & FL_OSTOP) {
/* disable interrupts */
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
80055b4: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
80055b8: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
80055bc: 5c 60 00 90 bne r3,r0,80057fc <rtems_termios_ioctl+0x400> <== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
80055c0: d0 0e 00 00 wcsr IE,r14 <== NOT EXECUTED
}
}
/* check for incoming XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXOF) && !(tty->termios.c_iflag & IXOFF)) {
80055c4: 29 61 00 b8 lw r1,(r11+184)
80055c8: 20 21 04 00 andi r1,r1,0x400
80055cc: 44 20 00 0c be r1,r0,80055fc <rtems_termios_ioctl+0x200> <== ALWAYS TAKEN
80055d0: 29 61 00 30 lw r1,(r11+48) <== NOT EXECUTED
80055d4: 20 21 10 00 andi r1,r1,0x1000 <== NOT EXECUTED
80055d8: 5c 20 00 09 bne r1,r0,80055fc <rtems_termios_ioctl+0x200> <== NOT EXECUTED
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXOF);
80055dc: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
80055e0: 34 01 fb ff mvi r1,-1025 <== NOT EXECUTED
80055e4: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
80055e8: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* FIXME: what happens, if we had sent XOFF but not yet XON? */
tty->flow_ctrl &= ~(FL_ISNTXOF);
80055ec: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
80055f0: 34 01 ff fd mvi r1,-3 <== NOT EXECUTED
80055f4: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
80055f8: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
}
/* check for incoming RTS/CTS flow control switched off */
if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) {
80055fc: 29 61 00 b8 lw r1,(r11+184)
8005600: 20 21 01 00 andi r1,r1,0x100
8005604: 44 20 00 7c be r1,r0,80057f4 <rtems_termios_ioctl+0x3f8> <== ALWAYS TAKEN
8005608: 29 62 00 38 lw r2,(r11+56) <== NOT EXECUTED
800560c: 48 02 00 12 bg r0,r2,8005654 <rtems_termios_ioctl+0x258> <== NOT EXECUTED
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDRTS);
8005610: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED
8005614: 34 01 fe ff mvi r1,-257 <== NOT EXECUTED
8005618: a0 61 08 00 and r1,r3,r1 <== NOT EXECUTED
800561c: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* restart remote Tx, if it was stopped */
if ((tty->flow_ctrl & FL_IRTSOFF) && (tty->device.startRemoteTx != NULL)) {
8005620: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8005624: 20 21 00 04 andi r1,r1,0x4 <== NOT EXECUTED
8005628: 44 20 00 06 be r1,r0,8005640 <rtems_termios_ioctl+0x244> <== NOT EXECUTED
800562c: 29 63 00 b0 lw r3,(r11+176) <== NOT EXECUTED
8005630: 44 60 00 04 be r3,r0,8005640 <rtems_termios_ioctl+0x244> <== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
8005634: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8005638: d8 60 00 00 call r3 <== NOT EXECUTED
800563c: 29 62 00 38 lw r2,(r11+56) <== NOT EXECUTED
}
tty->flow_ctrl &= ~(FL_IRTSOFF);
8005640: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED
8005644: 34 01 ff fb mvi r1,-5 <== NOT EXECUTED
8005648: a0 61 08 00 and r1,r3,r1 <== NOT EXECUTED
800564c: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/*
* check for flow control options to be switched on
*/
/* check for incoming RTS/CTS flow control switched on */
if (tty->termios.c_cflag & CRTSCTS) {
8005650: 4c 40 00 04 bge r2,r0,8005660 <rtems_termios_ioctl+0x264> <== ALWAYS TAKEN
tty->flow_ctrl |= FL_MDRTS;
8005654: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8005658: 38 21 01 00 ori r1,r1,0x100 <== NOT EXECUTED
800565c: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
}
/* check for incoming XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXOFF) {
8005660: 29 61 00 30 lw r1,(r11+48)
8005664: 20 22 10 00 andi r2,r1,0x1000
8005668: 44 40 00 04 be r2,r0,8005678 <rtems_termios_ioctl+0x27c>
tty->flow_ctrl |= FL_MDXOF;
800566c: 29 62 00 b8 lw r2,(r11+184)
8005670: 38 42 04 00 ori r2,r2,0x400
8005674: 59 62 00 b8 sw (r11+184),r2
}
/* check for outgoing XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXON) {
8005678: 20 21 04 00 andi r1,r1,0x400
800567c: 44 20 00 04 be r1,r0,800568c <rtems_termios_ioctl+0x290>
tty->flow_ctrl |= FL_MDXON;
8005680: 29 61 00 b8 lw r1,(r11+184)
8005684: 38 21 02 00 ori r1,r1,0x200
8005688: 59 61 00 b8 sw (r11+184),r1
tty->termios = *(struct termios *)args->buffer;
/* check for and process change in flow control options */
termios_set_flowctrl(tty);
if (tty->termios.c_lflag & ICANON) {
800568c: 29 6e 00 3c lw r14,(r11+60)
8005690: 21 ce 00 02 andi r14,r14,0x2
8005694: 45 c0 00 63 be r14,r0,8005820 <rtems_termios_ioctl+0x424>
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
else
tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks;
} else {
if (tty->termios.c_cc[VMIN]) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
8005698: 59 60 00 6c sw (r11+108),r0
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
800569c: 59 60 00 70 sw (r11+112),r0
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
80056a0: 59 60 00 74 sw (r11+116),r0
} else {
tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT;
}
}
}
if (tty->device.setAttributes)
80056a4: 29 63 00 a8 lw r3,(r11+168)
80056a8: 44 60 ff 85 be r3,r0,80054bc <rtems_termios_ioctl+0xc0> <== NEVER TAKEN
(*tty->device.setAttributes)(tty->minor, &tty->termios);
80056ac: 29 61 00 10 lw r1,(r11+16)
80056b0: 35 62 00 30 addi r2,r11,48
80056b4: d8 60 00 00 call r3
80056b8: e3 ff ff 81 bi 80054bc <rtems_termios_ioctl+0xc0>
case TIOCGETD:
*(int*)(args->buffer)=tty->t_line;
break;
#endif
case FIONREAD: {
int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head;
80056bc: 29 62 00 60 lw r2,(r11+96) <== NOT EXECUTED
80056c0: 29 61 00 5c lw r1,(r11+92) <== NOT EXECUTED
80056c4: c8 41 08 00 sub r1,r2,r1 <== NOT EXECUTED
if ( rawnc < 0 )
80056c8: 4c 20 00 03 bge r1,r0,80056d4 <rtems_termios_ioctl+0x2d8> <== NOT EXECUTED
rawnc += tty->rawInBuf.Size;
80056cc: 29 62 00 64 lw r2,(r11+100) <== NOT EXECUTED
80056d0: b4 22 08 00 add r1,r1,r2 <== NOT EXECUTED
/* Half guess that this is the right operation */
*(int *)args->buffer = tty->ccount - tty->cindex + rawnc;
80056d4: 29 64 00 20 lw r4,(r11+32) <== NOT EXECUTED
80056d8: 29 62 00 24 lw r2,(r11+36) <== NOT EXECUTED
80056dc: 29 83 00 08 lw r3,(r12+8) <== NOT EXECUTED
80056e0: c8 82 10 00 sub r2,r4,r2 <== NOT EXECUTED
80056e4: b4 41 08 00 add r1,r2,r1 <== NOT EXECUTED
80056e8: 58 61 00 00 sw (r3+0),r1 <== NOT EXECUTED
}
break;
80056ec: e3 ff ff 74 bi 80054bc <rtems_termios_ioctl+0xc0> <== 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) {
80056f0: 78 03 08 02 mvhi r3,0x802
80056f4: 38 63 1b 14 ori r3,r3,0x1b14
80056f8: 28 62 00 00 lw r2,(r3+0)
80056fc: 44 22 00 23 be r1,r2,8005788 <rtems_termios_ioctl+0x38c>
8005700: 78 03 08 02 mvhi r3,0x802
8005704: 38 63 1b 18 ori r3,r3,0x1b18
8005708: 28 62 00 00 lw r2,(r3+0)
800570c: 5c 22 ff 57 bne r1,r2,8005468 <rtems_termios_ioctl+0x6c> <== NEVER TAKEN
#if 1 /* FIXME */
case TIOCSETD:
/*
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
8005710: 29 62 00 cc lw r2,(r11+204)
8005714: 78 0e 08 02 mvhi r14,0x802
8005718: 39 ce 49 14 ori r14,r14,0x4914
800571c: b4 42 10 00 add r2,r2,r2
8005720: b4 42 10 00 add r2,r2,r2
8005724: b4 42 10 00 add r2,r2,r2
8005728: b4 42 10 00 add r2,r2,r2
800572c: b4 42 10 00 add r2,r2,r2
8005730: b5 c2 10 00 add r2,r14,r2
8005734: 28 42 00 04 lw r2,(r2+4)
8005738: 44 40 00 04 be r2,r0,8005748 <rtems_termios_ioctl+0x34c>
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
800573c: b9 60 08 00 mv r1,r11
8005740: d8 40 00 00 call r2
8005744: b8 20 68 00 mv r13,r1
}
tty->t_line=*(int*)(args->buffer);
8005748: 29 81 00 08 lw r1,(r12+8)
800574c: 28 22 00 00 lw r2,(r1+0)
tty->t_sc = NULL; /* ensure that no more valid data */
8005750: 59 60 00 d0 sw (r11+208),r0
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
8005754: b4 42 08 00 add r1,r2,r2
8005758: b4 21 08 00 add r1,r1,r1
800575c: b4 21 08 00 add r1,r1,r1
8005760: b4 21 08 00 add r1,r1,r1
8005764: b4 21 08 00 add r1,r1,r1
8005768: b5 c1 08 00 add r1,r14,r1
800576c: 28 23 00 00 lw r3,(r1+0)
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
}
tty->t_line=*(int*)(args->buffer);
8005770: 59 62 00 cc sw (r11+204),r2
tty->t_sc = NULL; /* ensure that no more valid data */
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
8005774: 44 60 ff 52 be r3,r0,80054bc <rtems_termios_ioctl+0xc0> <== NEVER TAKEN
sc = rtems_termios_linesw[tty->t_line].l_open(tty);
8005778: b9 60 08 00 mv r1,r11
800577c: d8 60 00 00 call r3
8005780: b8 20 68 00 mv r13,r1
8005784: e3 ff ff 4e bi 80054bc <rtems_termios_ioctl+0xc0>
}
break;
case TIOCGETD:
*(int*)(args->buffer)=tty->t_line;
8005788: 29 81 00 08 lw r1,(r12+8)
800578c: 29 62 00 cc lw r2,(r11+204)
8005790: 58 22 00 00 sw (r1+0),r2
break;
8005794: e3 ff ff 4a bi 80054bc <rtems_termios_ioctl+0xc0>
sc = RTEMS_INVALID_NUMBER;
}
break;
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
8005798: 29 62 00 30 lw r2,(r11+48)
800579c: 29 81 00 08 lw r1,(r12+8)
80057a0: 58 22 00 00 sw (r1+0),r2
80057a4: 29 62 00 34 lw r2,(r11+52)
80057a8: 58 22 00 04 sw (r1+4),r2
80057ac: 29 62 00 38 lw r2,(r11+56)
80057b0: 58 22 00 08 sw (r1+8),r2
80057b4: 29 62 00 3c lw r2,(r11+60)
80057b8: 58 22 00 0c sw (r1+12),r2
80057bc: 29 62 00 40 lw r2,(r11+64)
80057c0: 58 22 00 10 sw (r1+16),r2
80057c4: 29 62 00 44 lw r2,(r11+68)
80057c8: 58 22 00 14 sw (r1+20),r2
80057cc: 29 62 00 48 lw r2,(r11+72)
80057d0: 58 22 00 18 sw (r1+24),r2
80057d4: 29 62 00 4c lw r2,(r11+76)
80057d8: 58 22 00 1c sw (r1+28),r2
80057dc: 29 62 00 50 lw r2,(r11+80)
80057e0: 58 22 00 20 sw (r1+32),r2
break;
80057e4: e3 ff ff 36 bi 80054bc <rtems_termios_ioctl+0xc0>
if (tty->device.setAttributes)
(*tty->device.setAttributes)(tty->minor, &tty->termios);
break;
case RTEMS_IO_TCDRAIN:
drainOutput (tty);
80057e8: b9 60 08 00 mv r1,r11
80057ec: fb ff fd 37 calli 8004cc8 <drainOutput>
break;
80057f0: e3 ff ff 33 bi 80054bc <rtems_termios_ioctl+0xc0>
/* FIXME: what happens, if we had sent XOFF but not yet XON? */
tty->flow_ctrl &= ~(FL_ISNTXOF);
}
/* check for incoming RTS/CTS flow control switched off */
if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) {
80057f4: 29 62 00 38 lw r2,(r11+56)
80057f8: e3 ff ff 96 bi 8005650 <rtems_termios_ioctl+0x254>
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
80057fc: 29 63 00 7c lw r3,(r11+124) <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
8005800: 29 62 00 84 lw r2,(r11+132) <== NOT EXECUTED
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
8005804: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8005808: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
800580c: b4 62 10 00 add r2,r3,r2 <== NOT EXECUTED
8005810: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8005814: d8 80 00 00 call r4 <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
8005818: d0 0e 00 00 wcsr IE,r14 <== NOT EXECUTED
800581c: e3 ff ff 6a bi 80055c4 <rtems_termios_ioctl+0x1c8> <== NOT EXECUTED
if (tty->termios.c_lflag & ICANON) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
8005820: 41 6f 00 46 lbu r15,(r11+70)
rtems_clock_get_ticks_per_second() / 10;
8005824: f8 00 06 28 calli 80070c4 <rtems_clock_get_ticks_per_second>
if (tty->termios.c_lflag & ICANON) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
8005828: b9 e0 10 00 mv r2,r15
800582c: f8 00 67 62 calli 801f5b4 <__mulsi3>
rtems_clock_get_ticks_per_second() / 10;
8005830: 34 02 00 0a mvi r2,10
8005834: f8 00 67 c5 calli 801f748 <__udivsi3>
if (tty->termios.c_cc[VTIME]) {
8005838: 41 62 00 46 lbu r2,(r11+70)
if (tty->termios.c_lflag & ICANON) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
800583c: 59 61 00 54 sw (r11+84),r1
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
8005840: 44 4e 00 07 be r2,r14,800585c <rtems_termios_ioctl+0x460>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
if (tty->termios.c_cc[VMIN])
8005844: 41 62 00 47 lbu r2,(r11+71)
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
8005848: 59 60 00 6c sw (r11+108),r0
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
800584c: 59 61 00 70 sw (r11+112),r1
if (tty->termios.c_cc[VMIN])
8005850: 5c 40 ff 94 bne r2,r0,80056a0 <rtems_termios_ioctl+0x2a4>
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
else
tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks;
8005854: 59 61 00 74 sw (r11+116),r1
8005858: e3 ff ff 93 bi 80056a4 <rtems_termios_ioctl+0x2a8>
} else {
if (tty->termios.c_cc[VMIN]) {
800585c: 41 61 00 47 lbu r1,(r11+71)
8005860: 5c 22 ff 8e bne r1,r2,8005698 <rtems_termios_ioctl+0x29c> <== NEVER TAKEN
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT;
8005864: 34 01 00 01 mvi r1,1
8005868: 59 61 00 6c sw (r11+108),r1
800586c: e3 ff ff 8e bi 80056a4 <rtems_termios_ioctl+0x2a8>
08004d60 <rtems_termios_open>:
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
8004d60: 37 9c ff cc addi sp,sp,-52
8004d64: 5b 8b 00 34 sw (sp+52),r11
8004d68: 5b 8c 00 30 sw (sp+48),r12
8004d6c: 5b 8d 00 2c sw (sp+44),r13
8004d70: 5b 8e 00 28 sw (sp+40),r14
8004d74: 5b 8f 00 24 sw (sp+36),r15
8004d78: 5b 90 00 20 sw (sp+32),r16
8004d7c: 5b 91 00 1c sw (sp+28),r17
8004d80: 5b 92 00 18 sw (sp+24),r18
8004d84: 5b 93 00 14 sw (sp+20),r19
8004d88: 5b 94 00 10 sw (sp+16),r20
8004d8c: 5b 95 00 0c sw (sp+12),r21
8004d90: 5b 96 00 08 sw (sp+8),r22
8004d94: 5b 9d 00 04 sw (sp+4),ra
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
8004d98: 78 0d 08 02 mvhi r13,0x802
8004d9c: 39 ad 4a e0 ori r13,r13,0x4ae0
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
8004da0: b8 20 60 00 mv r12,r1
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
8004da4: 29 a1 00 00 lw r1,(r13+0)
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
8004da8: b8 40 78 00 mv r15,r2
8004dac: b8 60 98 00 mv r19,r3
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
8004db0: 34 02 00 00 mvi r2,0
8004db4: 34 03 00 00 mvi r3,0
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
8004db8: b8 80 a0 00 mv r20,r4
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
8004dbc: f8 00 0a cc calli 80078ec <rtems_semaphore_obtain>
8004dc0: b8 20 70 00 mv r14,r1
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
8004dc4: 5c 20 00 1e bne r1,r0,8004e3c <rtems_termios_open+0xdc> <== NEVER TAKEN
return sc;
for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) {
8004dc8: 78 10 08 02 mvhi r16,0x802
8004dcc: 3a 10 4a e8 ori r16,r16,0x4ae8
8004dd0: 2a 12 00 00 lw r18,(r16+0)
8004dd4: 46 41 00 38 be r18,r1,8004eb4 <rtems_termios_open+0x154> <== ALWAYS TAKEN
8004dd8: ba 40 58 00 mv r11,r18 <== NOT EXECUTED
8004ddc: e0 00 00 03 bi 8004de8 <rtems_termios_open+0x88> <== NOT EXECUTED
8004de0: 29 6b 00 00 lw r11,(r11+0) <== NOT EXECUTED
8004de4: 45 60 00 34 be r11,r0,8004eb4 <rtems_termios_open+0x154> <== NOT EXECUTED
if ((tty->major == major) && (tty->minor == minor))
8004de8: 29 65 00 0c lw r5,(r11+12) <== NOT EXECUTED
8004dec: 5c ac ff fd bne r5,r12,8004de0 <rtems_termios_open+0x80> <== NOT EXECUTED
8004df0: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8004df4: 5c 2f ff fb bne r1,r15,8004de0 <rtems_termios_open+0x80> <== NOT EXECUTED
*/
if (c++ == 'z')
c = 'a';
}
args->iop->data1 = tty;
8004df8: 2a 61 00 00 lw r1,(r19+0)
if (!tty->refcount++) {
8004dfc: 29 62 00 08 lw r2,(r11+8)
*/
if (c++ == 'z')
c = 'a';
}
args->iop->data1 = tty;
8004e00: 58 2b 00 38 sw (r1+56),r11
if (!tty->refcount++) {
8004e04: 34 41 00 01 addi r1,r2,1
8004e08: 59 61 00 08 sw (r11+8),r1
8004e0c: 5c 40 00 0a bne r2,r0,8004e34 <rtems_termios_open+0xd4> <== NEVER TAKEN
if (tty->device.firstOpen)
8004e10: 29 64 00 98 lw r4,(r11+152)
8004e14: 44 82 00 05 be r4,r2,8004e28 <rtems_termios_open+0xc8> <== ALWAYS TAKEN
(*tty->device.firstOpen)(major, minor, arg);
8004e18: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8004e1c: b9 e0 10 00 mv r2,r15 <== NOT EXECUTED
8004e20: ba 60 18 00 mv r3,r19 <== NOT EXECUTED
8004e24: d8 80 00 00 call r4 <== NOT EXECUTED
/*
* start I/O tasks, if needed
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
8004e28: 29 62 00 b4 lw r2,(r11+180)
8004e2c: 34 01 00 02 mvi r1,2
8004e30: 44 41 00 13 be r2,r1,8004e7c <rtems_termios_open+0x11c>
tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
}
rtems_semaphore_release (rtems_termios_ttyMutex);
8004e34: 29 a1 00 00 lw r1,(r13+0)
8004e38: f8 00 0b 09 calli 8007a5c <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
}
8004e3c: b9 c0 08 00 mv r1,r14
8004e40: 2b 9d 00 04 lw ra,(sp+4)
8004e44: 2b 8b 00 34 lw r11,(sp+52)
8004e48: 2b 8c 00 30 lw r12,(sp+48)
8004e4c: 2b 8d 00 2c lw r13,(sp+44)
8004e50: 2b 8e 00 28 lw r14,(sp+40)
8004e54: 2b 8f 00 24 lw r15,(sp+36)
8004e58: 2b 90 00 20 lw r16,(sp+32)
8004e5c: 2b 91 00 1c lw r17,(sp+28)
8004e60: 2b 92 00 18 lw r18,(sp+24)
8004e64: 2b 93 00 14 lw r19,(sp+20)
8004e68: 2b 94 00 10 lw r20,(sp+16)
8004e6c: 2b 95 00 0c lw r21,(sp+12)
8004e70: 2b 96 00 08 lw r22,(sp+8)
8004e74: 37 9c 00 34 addi sp,sp,52
8004e78: c3 a0 00 00 ret
/*
* start I/O tasks, if needed
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
sc = rtems_task_start(
8004e7c: 29 61 00 c4 lw r1,(r11+196)
8004e80: 78 02 08 00 mvhi r2,0x800
8004e84: 38 42 68 b0 ori r2,r2,0x68b0
8004e88: b9 60 18 00 mv r3,r11
8004e8c: f8 00 0b d7 calli 8007de8 <rtems_task_start>
8004e90: b8 20 60 00 mv r12,r1
tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
8004e94: 5c 20 00 bd bne r1,r0,8005188 <rtems_termios_open+0x428> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_start(
8004e98: 29 61 00 c8 lw r1,(r11+200)
8004e9c: 78 02 08 00 mvhi r2,0x800
8004ea0: 38 42 6b b0 ori r2,r2,0x6bb0
8004ea4: b9 60 18 00 mv r3,r11
8004ea8: f8 00 0b d0 calli 8007de8 <rtems_task_start>
tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
8004eac: 44 2c ff e2 be r1,r12,8004e34 <rtems_termios_open+0xd4> <== ALWAYS TAKEN
8004eb0: e0 00 00 b6 bi 8005188 <rtems_termios_open+0x428> <== NOT EXECUTED
static char c = 'a';
/*
* Create a new device
*/
tty = calloc (1, sizeof (struct rtems_termios_tty));
8004eb4: 34 01 00 01 mvi r1,1
8004eb8: 34 02 00 e8 mvi r2,232
8004ebc: fb ff f7 b9 calli 8002da0 <calloc>
8004ec0: b8 20 88 00 mv r17,r1
8004ec4: b8 20 58 00 mv r11,r1
if (tty == NULL) {
8004ec8: 44 20 00 a1 be r1,r0,800514c <rtems_termios_open+0x3ec> <== NEVER TAKEN
return RTEMS_NO_MEMORY;
}
/*
* allocate raw input buffer
*/
tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE;
8004ecc: 78 01 08 02 mvhi r1,0x802
8004ed0: 38 21 43 44 ori r1,r1,0x4344
8004ed4: 28 21 00 00 lw r1,(r1+0)
8004ed8: 5a 21 00 64 sw (r17+100),r1
tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size);
8004edc: 2a 21 00 64 lw r1,(r17+100)
8004ee0: fb ff fb 43 calli 8003bec <malloc>
8004ee4: 5a 21 00 58 sw (r17+88),r1
8004ee8: b8 20 a8 00 mv r21,r1
if (tty->rawInBuf.theBuf == NULL) {
8004eec: 44 20 00 96 be r1,r0,8005144 <rtems_termios_open+0x3e4> <== NEVER TAKEN
return RTEMS_NO_MEMORY;
}
/*
* allocate raw output buffer
*/
tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE;
8004ef0: 78 01 08 02 mvhi r1,0x802
8004ef4: 38 21 43 48 ori r1,r1,0x4348
8004ef8: 28 21 00 00 lw r1,(r1+0)
8004efc: 5a 21 00 88 sw (r17+136),r1
tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size);
8004f00: 2a 21 00 88 lw r1,(r17+136)
8004f04: fb ff fb 3a calli 8003bec <malloc>
8004f08: 5a 21 00 7c sw (r17+124),r1
8004f0c: b8 20 b0 00 mv r22,r1
if (tty->rawOutBuf.theBuf == NULL) {
8004f10: 44 20 00 8b be r1,r0,800513c <rtems_termios_open+0x3dc> <== NEVER TAKEN
return RTEMS_NO_MEMORY;
}
/*
* allocate cooked buffer
*/
tty->cbuf = malloc (CBUFSIZE);
8004f14: 78 01 08 02 mvhi r1,0x802
8004f18: 38 21 43 40 ori r1,r1,0x4340
8004f1c: 28 21 00 00 lw r1,(r1+0)
8004f20: fb ff fb 33 calli 8003bec <malloc>
8004f24: 5a 21 00 1c sw (r17+28),r1
if (tty->cbuf == NULL) {
8004f28: 44 20 00 83 be r1,r0,8005134 <rtems_termios_open+0x3d4> <== NEVER TAKEN
return RTEMS_NO_MEMORY;
}
/*
* Initialize wakeup callbacks
*/
tty->tty_snd.sw_pfn = NULL;
8004f2c: 5a 20 00 d4 sw (r17+212),r0
tty->tty_snd.sw_arg = NULL;
8004f30: 5a 20 00 d8 sw (r17+216),r0
tty->tty_rcv.sw_pfn = NULL;
8004f34: 5a 20 00 dc sw (r17+220),r0
tty->tty_rcv.sw_arg = NULL;
8004f38: 5a 20 00 e0 sw (r17+224),r0
tty->tty_rcvwakeup = 0;
8004f3c: 5a 20 00 e4 sw (r17+228),r0
/*
* link tty
*/
tty->forw = rtems_termios_ttyHead;
8004f40: 5a 32 00 00 sw (r17+0),r18
tty->back = NULL;
8004f44: 5a 20 00 04 sw (r17+4),r0
if (rtems_termios_ttyHead != NULL)
8004f48: 46 40 00 02 be r18,r0,8004f50 <rtems_termios_open+0x1f0> <== ALWAYS TAKEN
rtems_termios_ttyHead->back = tty;
8004f4c: 5a 51 00 04 sw (r18+4),r17 <== NOT EXECUTED
rtems_termios_ttyHead = tty;
if (rtems_termios_ttyTail == NULL)
8004f50: 78 01 08 02 mvhi r1,0x802
8004f54: 38 21 4a e4 ori r1,r1,0x4ae4
8004f58: 28 22 00 00 lw r2,(r1+0)
*/
tty->forw = rtems_termios_ttyHead;
tty->back = NULL;
if (rtems_termios_ttyHead != NULL)
rtems_termios_ttyHead->back = tty;
rtems_termios_ttyHead = tty;
8004f5c: 5a 11 00 00 sw (r16+0),r17
if (rtems_termios_ttyTail == NULL)
8004f60: 44 40 00 a5 be r2,r0,80051f4 <rtems_termios_open+0x494> <== ALWAYS TAKEN
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
rtems_build_name ('T', 'R', 'i', c),
8004f64: 78 10 08 02 mvhi r16,0x802
tty->major = major;
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
8004f68: 78 05 08 02 mvhi r5,0x802
8004f6c: 38 a5 1a f8 ori r5,r5,0x1af8
rtems_build_name ('T', 'R', 'i', c),
8004f70: 3a 10 43 4c ori r16,r16,0x434c
8004f74: 42 04 00 00 lbu r4,(r16+0)
tty->major = major;
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
8004f78: 28 a1 00 00 lw r1,(r5+0)
8004f7c: 34 02 00 01 mvi r2,1
8004f80: 34 03 00 54 mvi r3,84
8004f84: b8 81 08 00 or r1,r4,r1
8004f88: 36 25 00 14 addi r5,r17,20
8004f8c: 34 04 00 00 mvi r4,0
rtems_termios_ttyHead->back = tty;
rtems_termios_ttyHead = tty;
if (rtems_termios_ttyTail == NULL)
rtems_termios_ttyTail = tty;
tty->minor = minor;
8004f90: 5a 2f 00 10 sw (r17+16),r15
tty->major = major;
8004f94: 5a 2c 00 0c sw (r17+12),r12
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
8004f98: f8 00 09 9a calli 8007600 <rtems_semaphore_create>
8004f9c: b8 20 a8 00 mv r21,r1
rtems_build_name ('T', 'R', 'i', c),
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->isem);
if (sc != RTEMS_SUCCESSFUL)
8004fa0: 5c 20 00 7a bne r1,r0,8005188 <rtems_termios_open+0x428> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
8004fa4: 78 05 08 02 mvhi r5,0x802
8004fa8: 38 a5 1a fc ori r5,r5,0x1afc
rtems_build_name ('T', 'R', 'o', c),
8004fac: 42 04 00 00 lbu r4,(r16+0)
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->isem);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
8004fb0: 28 a1 00 00 lw r1,(r5+0)
8004fb4: 34 02 00 01 mvi r2,1
8004fb8: 34 03 00 54 mvi r3,84
8004fbc: b8 81 08 00 or r1,r4,r1
8004fc0: 36 25 00 18 addi r5,r17,24
8004fc4: 34 04 00 00 mvi r4,0
8004fc8: f8 00 09 8e calli 8007600 <rtems_semaphore_create>
8004fcc: b8 20 90 00 mv r18,r1
rtems_build_name ('T', 'R', 'o', c),
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->osem);
if (sc != RTEMS_SUCCESSFUL)
8004fd0: 5c 35 00 6e bne r1,r21,8005188 <rtems_termios_open+0x428> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
8004fd4: 78 05 08 02 mvhi r5,0x802
8004fd8: 38 a5 1b 00 ori r5,r5,0x1b00
rtems_build_name ('T', 'R', 'x', c),
8004fdc: 42 04 00 00 lbu r4,(r16+0)
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->osem);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
8004fe0: 28 a1 00 00 lw r1,(r5+0)
8004fe4: 34 02 00 00 mvi r2,0
8004fe8: 34 03 00 20 mvi r3,32
8004fec: b8 81 08 00 or r1,r4,r1
8004ff0: 36 25 00 8c addi r5,r17,140
8004ff4: 34 04 00 00 mvi r4,0
8004ff8: f8 00 09 82 calli 8007600 <rtems_semaphore_create>
8004ffc: b8 20 a8 00 mv r21,r1
rtems_build_name ('T', 'R', 'x', c),
0,
RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO,
RTEMS_NO_PRIORITY,
&tty->rawOutBuf.Semaphore);
if (sc != RTEMS_SUCCESSFUL)
8005000: 5c 32 00 62 bne r1,r18,8005188 <rtems_termios_open+0x428> <== NEVER TAKEN
tty->rawOutBufState = rob_idle;
/*
* Set callbacks
*/
tty->device = *callbacks;
8005004: 2a 82 00 18 lw r2,(r20+24)
8005008: 2a 88 00 00 lw r8,(r20+0)
800500c: 2a 87 00 04 lw r7,(r20+4)
8005010: 2a 86 00 08 lw r6,(r20+8)
8005014: 2a 85 00 0c lw r5,(r20+12)
8005018: 2a 84 00 10 lw r4,(r20+16)
800501c: 2a 83 00 14 lw r3,(r20+20)
8005020: 2a 81 00 1c lw r1,(r20+28)
8005024: 5a 22 00 b0 sw (r17+176),r2
RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO,
RTEMS_NO_PRIORITY,
&tty->rawOutBuf.Semaphore);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
tty->rawOutBufState = rob_idle;
8005028: 5a 20 00 94 sw (r17+148),r0
/*
* Set callbacks
*/
tty->device = *callbacks;
800502c: 5a 28 00 98 sw (r17+152),r8
8005030: 5a 27 00 9c sw (r17+156),r7
8005034: 5a 26 00 a0 sw (r17+160),r6
8005038: 5a 25 00 a4 sw (r17+164),r5
800503c: 5a 24 00 a8 sw (r17+168),r4
8005040: 5a 23 00 ac sw (r17+172),r3
8005044: 5a 21 00 b4 sw (r17+180),r1
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
8005048: 34 02 00 02 mvi r2,2
800504c: 44 22 00 50 be r1,r2,800518c <rtems_termios_open+0x42c>
&tty->rxTaskId);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
8005050: 2a 21 00 a0 lw r1,(r17+160)
8005054: 44 20 00 42 be r1,r0,800515c <rtems_termios_open+0x3fc>
8005058: 2a 22 00 b4 lw r2,(r17+180)
800505c: 34 01 00 02 mvi r1,2
8005060: 44 41 00 3f be r2,r1,800515c <rtems_termios_open+0x3fc>
}
/*
* Set default parameters
*/
tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL;
8005064: 34 05 25 02 mvi r5,9474
8005068: 5a 25 00 30 sw (r17+48),r5
tty->termios.c_oflag = OPOST | ONLCR | XTABS;
800506c: 34 05 18 05 mvi r5,6149
8005070: 5a 25 00 34 sw (r17+52),r5
tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
8005074: 34 05 08 bd mvi r5,2237
8005078: 5a 25 00 38 sw (r17+56),r5
tty->termios.c_lflag =
800507c: 34 a5 79 7e addi r5,r5,31102
8005080: 5a 25 00 3c sw (r17+60),r5
ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL;
tty->termios.c_cc[VINTR] = '\003';
8005084: 34 05 00 03 mvi r5,3
8005088: 32 25 00 41 sb (r17+65),r5
tty->termios.c_cc[VQUIT] = '\034';
800508c: 34 05 00 1c mvi r5,28
tty->termios.c_cc[VDISCARD] = '\017';
tty->termios.c_cc[VWERASE] = '\027';
tty->termios.c_cc[VLNEXT] = '\026';
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
8005090: 5a 20 00 b8 sw (r17+184),r0
tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
tty->termios.c_lflag =
ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL;
tty->termios.c_cc[VINTR] = '\003';
tty->termios.c_cc[VQUIT] = '\034';
8005094: 32 25 00 42 sb (r17+66),r5
tty->termios.c_cc[VERASE] = '\177';
8005098: 34 05 00 7f mvi r5,127
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
800509c: 2a 24 00 64 lw r4,(r17+100)
tty->termios.c_lflag =
ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL;
tty->termios.c_cc[VINTR] = '\003';
tty->termios.c_cc[VQUIT] = '\034';
tty->termios.c_cc[VERASE] = '\177';
80050a0: 32 25 00 43 sb (r17+67),r5
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
80050a4: 2a 21 00 64 lw r1,(r17+100)
ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL;
tty->termios.c_cc[VINTR] = '\003';
tty->termios.c_cc[VQUIT] = '\034';
tty->termios.c_cc[VERASE] = '\177';
tty->termios.c_cc[VKILL] = '\025';
80050a8: 34 05 00 15 mvi r5,21
80050ac: 32 25 00 44 sb (r17+68),r5
tty->termios.c_cc[VEOF] = '\004';
80050b0: 34 05 00 04 mvi r5,4
80050b4: 32 25 00 45 sb (r17+69),r5
tty->termios.c_cc[VEOL] = '\000';
tty->termios.c_cc[VEOL2] = '\000';
tty->termios.c_cc[VSTART] = '\021';
80050b8: 34 05 00 11 mvi r5,17
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
80050bc: b4 21 18 00 add r3,r1,r1
tty->termios.c_cc[VERASE] = '\177';
tty->termios.c_cc[VKILL] = '\025';
tty->termios.c_cc[VEOF] = '\004';
tty->termios.c_cc[VEOL] = '\000';
tty->termios.c_cc[VEOL2] = '\000';
tty->termios.c_cc[VSTART] = '\021';
80050c0: 32 25 00 49 sb (r17+73),r5
tty->termios.c_cc[VSTOP] = '\023';
80050c4: 34 05 00 13 mvi r5,19
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
80050c8: b4 61 08 00 add r1,r3,r1
tty->termios.c_cc[VKILL] = '\025';
tty->termios.c_cc[VEOF] = '\004';
tty->termios.c_cc[VEOL] = '\000';
tty->termios.c_cc[VEOL2] = '\000';
tty->termios.c_cc[VSTART] = '\021';
tty->termios.c_cc[VSTOP] = '\023';
80050cc: 32 25 00 4a sb (r17+74),r5
tty->termios.c_cc[VSUSP] = '\032';
80050d0: 34 05 00 1a mvi r5,26
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
/*
* Bump name characer
*/
if (c++ == 'z')
80050d4: 42 02 00 00 lbu r2,(r16+0)
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
80050d8: 00 21 00 01 srui r1,r1,1
tty->termios.c_cc[VEOF] = '\004';
tty->termios.c_cc[VEOL] = '\000';
tty->termios.c_cc[VEOL2] = '\000';
tty->termios.c_cc[VSTART] = '\021';
tty->termios.c_cc[VSTOP] = '\023';
tty->termios.c_cc[VSUSP] = '\032';
80050dc: 32 25 00 4b sb (r17+75),r5
tty->termios.c_cc[VREPRINT] = '\022';
80050e0: 34 05 00 12 mvi r5,18
80050e4: 32 25 00 4d sb (r17+77),r5
tty->termios.c_cc[VDISCARD] = '\017';
80050e8: 34 05 00 0f mvi r5,15
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
80050ec: 00 21 00 01 srui r1,r1,1
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
80050f0: 00 84 00 01 srui r4,r4,1
tty->termios.c_cc[VEOL2] = '\000';
tty->termios.c_cc[VSTART] = '\021';
tty->termios.c_cc[VSTOP] = '\023';
tty->termios.c_cc[VSUSP] = '\032';
tty->termios.c_cc[VREPRINT] = '\022';
tty->termios.c_cc[VDISCARD] = '\017';
80050f4: 32 25 00 4e sb (r17+78),r5
tty->termios.c_cc[VWERASE] = '\027';
80050f8: 34 05 00 17 mvi r5,23
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
/*
* Bump name characer
*/
if (c++ == 'z')
80050fc: 34 43 00 01 addi r3,r2,1
tty->termios.c_cc[VSTART] = '\021';
tty->termios.c_cc[VSTOP] = '\023';
tty->termios.c_cc[VSUSP] = '\032';
tty->termios.c_cc[VREPRINT] = '\022';
tty->termios.c_cc[VDISCARD] = '\017';
tty->termios.c_cc[VWERASE] = '\027';
8005100: 32 25 00 4f sb (r17+79),r5
tty->termios.c_cc[VLNEXT] = '\026';
8005104: 34 05 00 16 mvi r5,22
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
8005108: 5a 21 00 c0 sw (r17+192),r1
tty->termios.c_cc[VINTR] = '\003';
tty->termios.c_cc[VQUIT] = '\034';
tty->termios.c_cc[VERASE] = '\177';
tty->termios.c_cc[VKILL] = '\025';
tty->termios.c_cc[VEOF] = '\004';
tty->termios.c_cc[VEOL] = '\000';
800510c: 32 20 00 4c sb (r17+76),r0
tty->termios.c_cc[VEOL2] = '\000';
8005110: 32 20 00 51 sb (r17+81),r0
tty->termios.c_cc[VSTOP] = '\023';
tty->termios.c_cc[VSUSP] = '\032';
tty->termios.c_cc[VREPRINT] = '\022';
tty->termios.c_cc[VDISCARD] = '\017';
tty->termios.c_cc[VWERASE] = '\027';
tty->termios.c_cc[VLNEXT] = '\026';
8005114: 32 25 00 50 sb (r17+80),r5
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
8005118: 5a 24 00 bc sw (r17+188),r4
tty->highwater = tty->rawInBuf.Size * 3/4;
/*
* Bump name characer
*/
if (c++ == 'z')
800511c: 32 03 00 00 sb (r16+0),r3
8005120: 34 01 00 7a mvi r1,122
8005124: 5c 41 ff 35 bne r2,r1,8004df8 <rtems_termios_open+0x98>
c = 'a';
8005128: 34 01 00 61 mvi r1,97
800512c: 32 01 00 00 sb (r16+0),r1
8005130: e3 ff ff 32 bi 8004df8 <rtems_termios_open+0x98>
/*
* allocate cooked buffer
*/
tty->cbuf = malloc (CBUFSIZE);
if (tty->cbuf == NULL) {
free((void *)(tty->rawOutBuf.theBuf));
8005134: ba c0 08 00 mv r1,r22 <== NOT EXECUTED
8005138: fb ff f8 c9 calli 800345c <free> <== NOT EXECUTED
free((void *)(tty->rawInBuf.theBuf));
800513c: ba a0 08 00 mv r1,r21
8005140: fb ff f8 c7 calli 800345c <free>
free(tty);
8005144: ba 20 08 00 mv r1,r17
8005148: fb ff f8 c5 calli 800345c <free>
rtems_semaphore_release (rtems_termios_ttyMutex);
800514c: 29 a1 00 00 lw r1,(r13+0)
return RTEMS_NO_MEMORY;
8005150: 34 0e 00 1a mvi r14,26
tty->cbuf = malloc (CBUFSIZE);
if (tty->cbuf == NULL) {
free((void *)(tty->rawOutBuf.theBuf));
free((void *)(tty->rawInBuf.theBuf));
free(tty);
rtems_semaphore_release (rtems_termios_ttyMutex);
8005154: f8 00 0a 42 calli 8007a5c <rtems_semaphore_release>
return RTEMS_NO_MEMORY;
8005158: e3 ff ff 39 bi 8004e3c <rtems_termios_open+0xdc>
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
800515c: 78 05 08 02 mvhi r5,0x802
8005160: 38 a5 1b 0c ori r5,r5,0x1b0c
rtems_build_name ('T', 'R', 'r', c),
8005164: 42 04 00 00 lbu r4,(r16+0)
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
8005168: 28 a1 00 00 lw r1,(r5+0)
800516c: 34 02 00 00 mvi r2,0
8005170: 34 03 00 24 mvi r3,36
8005174: b8 81 08 00 or r1,r4,r1
8005178: 36 25 00 68 addi r5,r17,104
800517c: 34 04 00 00 mvi r4,0
8005180: f8 00 09 20 calli 8007600 <rtems_semaphore_create>
rtems_build_name ('T', 'R', 'r', c),
0,
RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->rawInBuf.Semaphore);
if (sc != RTEMS_SUCCESSFUL)
8005184: 44 20 ff b8 be r1,r0,8005064 <rtems_termios_open+0x304> <== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_start(
tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
8005188: f8 00 0b d8 calli 80080e8 <rtems_fatal_error_occurred> <== NOT EXECUTED
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
sc = rtems_task_create (
800518c: 78 05 08 02 mvhi r5,0x802
8005190: 38 a5 1b 04 ori r5,r5,0x1b04
rtems_build_name ('T', 'x', 'T', c),
8005194: 42 04 00 00 lbu r4,(r16+0)
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
sc = rtems_task_create (
8005198: 28 a1 00 00 lw r1,(r5+0)
800519c: 34 02 00 0a mvi r2,10
80051a0: 34 03 04 00 mvi r3,1024
80051a4: b8 81 08 00 or r1,r4,r1
80051a8: 34 05 00 00 mvi r5,0
80051ac: 34 04 05 00 mvi r4,1280
80051b0: 36 26 00 c8 addi r6,r17,200
80051b4: f8 00 0a 63 calli 8007b40 <rtems_task_create>
80051b8: b8 20 90 00 mv r18,r1
TERMIOS_TXTASK_STACKSIZE,
RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE |
RTEMS_NO_ASR,
RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
&tty->txTaskId);
if (sc != RTEMS_SUCCESSFUL)
80051bc: 5c 35 ff f3 bne r1,r21,8005188 <rtems_termios_open+0x428> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_create (
80051c0: 78 05 08 02 mvhi r5,0x802
80051c4: 38 a5 1b 08 ori r5,r5,0x1b08
rtems_build_name ('R', 'x', 'T', c),
80051c8: 42 04 00 00 lbu r4,(r16+0)
RTEMS_NO_ASR,
RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
&tty->txTaskId);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_task_create (
80051cc: 28 a1 00 00 lw r1,(r5+0)
80051d0: 34 02 00 09 mvi r2,9
80051d4: 34 03 04 00 mvi r3,1024
80051d8: b8 81 08 00 or r1,r4,r1
80051dc: 34 05 00 00 mvi r5,0
80051e0: 34 04 05 00 mvi r4,1280
80051e4: 36 26 00 c4 addi r6,r17,196
80051e8: f8 00 0a 56 calli 8007b40 <rtems_task_create>
TERMIOS_RXTASK_STACKSIZE,
RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE |
RTEMS_NO_ASR,
RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
&tty->rxTaskId);
if (sc != RTEMS_SUCCESSFUL)
80051ec: 44 32 ff 99 be r1,r18,8005050 <rtems_termios_open+0x2f0> <== ALWAYS TAKEN
80051f0: e3 ff ff e6 bi 8005188 <rtems_termios_open+0x428> <== NOT EXECUTED
tty->back = NULL;
if (rtems_termios_ttyHead != NULL)
rtems_termios_ttyHead->back = tty;
rtems_termios_ttyHead = tty;
if (rtems_termios_ttyTail == NULL)
rtems_termios_ttyTail = tty;
80051f4: 58 31 00 00 sw (r1+0),r17
80051f8: e3 ff ff 5b bi 8004f64 <rtems_termios_open+0x204>
08005870 <rtems_termios_puts>:
* Send characters to device-specific code
*/
void
rtems_termios_puts (
const void *_buf, int len, struct rtems_termios_tty *tty)
{
8005870: 37 9c ff d8 addi sp,sp,-40
8005874: 5b 8b 00 24 sw (sp+36),r11
8005878: 5b 8c 00 20 sw (sp+32),r12
800587c: 5b 8d 00 1c sw (sp+28),r13
8005880: 5b 8e 00 18 sw (sp+24),r14
8005884: 5b 8f 00 14 sw (sp+20),r15
8005888: 5b 90 00 10 sw (sp+16),r16
800588c: 5b 91 00 0c sw (sp+12),r17
8005890: 5b 92 00 08 sw (sp+8),r18
8005894: 5b 9d 00 04 sw (sp+4),ra
const unsigned char *buf = _buf;
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
8005898: 28 64 00 b4 lw r4,(r3+180)
* Send characters to device-specific code
*/
void
rtems_termios_puts (
const void *_buf, int len, struct rtems_termios_tty *tty)
{
800589c: b8 60 58 00 mv r11,r3
80058a0: b8 40 88 00 mv r17,r2
80058a4: b8 20 18 00 mv r3,r1
const unsigned char *buf = _buf;
80058a8: b8 20 80 00 mv r16,r1
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
80058ac: 44 80 00 39 be r4,r0,8005990 <rtems_termios_puts+0x120>
(*tty->device.write)(tty->minor, (void *)buf, len);
return;
}
newHead = tty->rawOutBuf.Head;
80058b0: 29 6f 00 80 lw r15,(r11+128)
while (len) {
80058b4: 44 40 00 3c be r2,r0,80059a4 <rtems_termios_puts+0x134> <== NEVER TAKEN
*
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
rtems_interrupt_disable (level);
80058b8: 34 0d ff fe mvi r13,-2
while (newHead == tty->rawOutBuf.Tail) {
tty->rawOutBufState = rob_wait;
80058bc: 34 0e 00 02 mvi r14,2
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
} else {
/* remember that output has been stopped due to flow ctrl*/
tty->flow_ctrl |= FL_OSTOP;
}
tty->rawOutBufState = rob_busy;
80058c0: 34 12 00 01 mvi r18,1
* len -= ncopy
*
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
80058c4: 29 62 00 88 lw r2,(r11+136)
80058c8: 35 e1 00 01 addi r1,r15,1
80058cc: f8 00 67 af calli 801f788 <__umodsi3>
80058d0: b8 20 78 00 mv r15,r1
rtems_interrupt_disable (level);
80058d4: 90 00 20 00 rcsr r4,IE
80058d8: a0 8d 08 00 and r1,r4,r13
80058dc: d0 01 00 00 wcsr IE,r1
while (newHead == tty->rawOutBuf.Tail) {
80058e0: 29 6c 00 84 lw r12,(r11+132)
80058e4: 5d 8f 00 0d bne r12,r15,8005918 <rtems_termios_puts+0xa8>
tty->rawOutBufState = rob_wait;
80058e8: 59 6e 00 94 sw (r11+148),r14
rtems_interrupt_enable (level);
80058ec: d0 04 00 00 wcsr IE,r4
sc = rtems_semaphore_obtain(
80058f0: 29 61 00 8c lw r1,(r11+140)
80058f4: 34 02 00 00 mvi r2,0
80058f8: 34 03 00 00 mvi r3,0
80058fc: f8 00 07 fc calli 80078ec <rtems_semaphore_obtain>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
8005900: 5c 20 00 34 bne r1,r0,80059d0 <rtems_termios_puts+0x160> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
8005904: 90 00 20 00 rcsr r4,IE
8005908: a0 8d 28 00 and r5,r4,r13
800590c: d0 05 00 00 wcsr IE,r5
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
rtems_interrupt_disable (level);
while (newHead == tty->rawOutBuf.Tail) {
8005910: 29 65 00 84 lw r5,(r11+132)
8005914: 44 ac ff f5 be r5,r12,80058e8 <rtems_termios_puts+0x78> <== NEVER TAKEN
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
8005918: 29 61 00 80 lw r1,(r11+128)
800591c: 29 63 00 7c lw r3,(r11+124)
8005920: 42 02 00 00 lbu r2,(r16+0)
8005924: b4 61 08 00 add r1,r3,r1
8005928: 30 22 00 00 sb (r1+0),r2
tty->rawOutBuf.Head = newHead;
if (tty->rawOutBufState == rob_idle) {
800592c: 29 61 00 94 lw r1,(r11+148)
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
tty->rawOutBuf.Head = newHead;
8005930: 59 6f 00 80 sw (r11+128),r15
if (tty->rawOutBufState == rob_idle) {
8005934: 5c 20 00 08 bne r1,r0,8005954 <rtems_termios_puts+0xe4>
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
8005938: 29 62 00 b8 lw r2,(r11+184)
800593c: 20 42 00 10 andi r2,r2,0x10
8005940: 44 41 00 0a be r2,r1,8005968 <rtems_termios_puts+0xf8> <== ALWAYS TAKEN
(*tty->device.write)(tty->minor,
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
} else {
/* remember that output has been stopped due to flow ctrl*/
tty->flow_ctrl |= FL_OSTOP;
8005944: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8005948: 38 21 00 20 ori r1,r1,0x20 <== NOT EXECUTED
800594c: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
}
tty->rawOutBufState = rob_busy;
8005950: 59 72 00 94 sw (r11+148),r18
}
rtems_interrupt_enable (level);
8005954: d0 04 00 00 wcsr IE,r4
len--;
8005958: 36 31 ff ff addi r17,r17,-1
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
(*tty->device.write)(tty->minor, (void *)buf, len);
return;
}
newHead = tty->rawOutBuf.Head;
while (len) {
800595c: 46 20 00 12 be r17,r0,80059a4 <rtems_termios_puts+0x134>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
8005960: 36 10 00 01 addi r16,r16,1
8005964: e3 ff ff d8 bi 80058c4 <rtems_termios_puts+0x54>
tty->rawOutBuf.Head = newHead;
if (tty->rawOutBufState == rob_idle) {
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
(*tty->device.write)(tty->minor,
8005968: 29 63 00 7c lw r3,(r11+124)
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
800596c: 29 62 00 84 lw r2,(r11+132)
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
tty->rawOutBuf.Head = newHead;
if (tty->rawOutBufState == rob_idle) {
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
(*tty->device.write)(tty->minor,
8005970: 29 65 00 a4 lw r5,(r11+164)
8005974: 29 61 00 10 lw r1,(r11+16)
8005978: b4 62 10 00 add r2,r3,r2
800597c: 5b 84 00 28 sw (sp+40),r4
8005980: 34 03 00 01 mvi r3,1
8005984: d8 a0 00 00 call r5
8005988: 2b 84 00 28 lw r4,(sp+40)
800598c: e3 ff ff f1 bi 8005950 <rtems_termios_puts+0xe0>
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
(*tty->device.write)(tty->minor, (void *)buf, len);
8005990: 29 64 00 a4 lw r4,(r11+164)
8005994: 29 61 00 10 lw r1,(r11+16)
8005998: b8 60 10 00 mv r2,r3
800599c: ba 20 18 00 mv r3,r17
80059a0: d8 80 00 00 call r4
tty->rawOutBufState = rob_busy;
}
rtems_interrupt_enable (level);
len--;
}
}
80059a4: 2b 9d 00 04 lw ra,(sp+4)
80059a8: 2b 8b 00 24 lw r11,(sp+36)
80059ac: 2b 8c 00 20 lw r12,(sp+32)
80059b0: 2b 8d 00 1c lw r13,(sp+28)
80059b4: 2b 8e 00 18 lw r14,(sp+24)
80059b8: 2b 8f 00 14 lw r15,(sp+20)
80059bc: 2b 90 00 10 lw r16,(sp+16)
80059c0: 2b 91 00 0c lw r17,(sp+12)
80059c4: 2b 92 00 08 lw r18,(sp+8)
80059c8: 37 9c 00 28 addi sp,sp,40
80059cc: c3 a0 00 00 ret
tty->rawOutBufState = rob_wait;
rtems_interrupt_enable (level);
sc = rtems_semaphore_obtain(
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
80059d0: f8 00 09 c6 calli 80080e8 <rtems_fatal_error_occurred> <== NOT EXECUTED
08006190 <rtems_termios_read>:
return RTEMS_SUCCESSFUL;
}
rtems_status_code
rtems_termios_read (void *arg)
{
8006190: 37 9c ff cc addi sp,sp,-52
8006194: 5b 8b 00 34 sw (sp+52),r11
8006198: 5b 8c 00 30 sw (sp+48),r12
800619c: 5b 8d 00 2c sw (sp+44),r13
80061a0: 5b 8e 00 28 sw (sp+40),r14
80061a4: 5b 8f 00 24 sw (sp+36),r15
80061a8: 5b 90 00 20 sw (sp+32),r16
80061ac: 5b 91 00 1c sw (sp+28),r17
80061b0: 5b 92 00 18 sw (sp+24),r18
80061b4: 5b 93 00 14 sw (sp+20),r19
80061b8: 5b 94 00 10 sw (sp+16),r20
80061bc: 5b 95 00 0c sw (sp+12),r21
80061c0: 5b 96 00 08 sw (sp+8),r22
80061c4: 5b 9d 00 04 sw (sp+4),ra
80061c8: b8 20 88 00 mv r17,r1
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
80061cc: 28 21 00 00 lw r1,(r1+0)
uint32_t count = args->count;
char *buffer = args->buffer;
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
80061d0: 34 02 00 00 mvi r2,0
80061d4: 34 03 00 00 mvi r3,0
rtems_status_code
rtems_termios_read (void *arg)
{
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
80061d8: 28 2b 00 38 lw r11,(r1+56)
uint32_t count = args->count;
80061dc: 2a 2f 00 14 lw r15,(r17+20)
char *buffer = args->buffer;
80061e0: 2a 30 00 10 lw r16,(r17+16)
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
80061e4: 29 61 00 14 lw r1,(r11+20)
80061e8: f8 00 05 c1 calli 80078ec <rtems_semaphore_obtain>
80061ec: b8 20 90 00 mv r18,r1
if (sc != RTEMS_SUCCESSFUL)
80061f0: 5c 20 00 13 bne r1,r0,800623c <rtems_termios_read+0xac> <== NEVER TAKEN
return sc;
if (rtems_termios_linesw[tty->t_line].l_read != NULL) {
80061f4: 29 63 00 cc lw r3,(r11+204)
80061f8: 78 01 08 02 mvhi r1,0x802
80061fc: 38 21 49 14 ori r1,r1,0x4914
8006200: b4 63 18 00 add r3,r3,r3
8006204: b4 63 18 00 add r3,r3,r3
8006208: b4 63 18 00 add r3,r3,r3
800620c: b4 63 18 00 add r3,r3,r3
8006210: b4 63 18 00 add r3,r3,r3
8006214: b4 23 18 00 add r3,r1,r3
8006218: 28 63 00 08 lw r3,(r3+8)
800621c: 44 72 00 18 be r3,r18,800627c <rtems_termios_read+0xec>
sc = rtems_termios_linesw[tty->t_line].l_read(tty,args);
8006220: b9 60 08 00 mv r1,r11
8006224: ba 20 10 00 mv r2,r17
8006228: d8 60 00 00 call r3
800622c: b8 20 90 00 mv r18,r1
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
8006230: 29 61 00 14 lw r1,(r11+20)
if (sc != RTEMS_SUCCESSFUL)
return sc;
if (rtems_termios_linesw[tty->t_line].l_read != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_read(tty,args);
tty->tty_rcvwakeup = 0;
8006234: 59 60 00 e4 sw (r11+228),r0
rtems_semaphore_release (tty->isem);
8006238: f8 00 06 09 calli 8007a5c <rtems_semaphore_release>
}
args->bytes_moved = args->count - count;
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
return sc;
}
800623c: ba 40 08 00 mv r1,r18
8006240: 2b 9d 00 04 lw ra,(sp+4)
8006244: 2b 8b 00 34 lw r11,(sp+52)
8006248: 2b 8c 00 30 lw r12,(sp+48)
800624c: 2b 8d 00 2c lw r13,(sp+44)
8006250: 2b 8e 00 28 lw r14,(sp+40)
8006254: 2b 8f 00 24 lw r15,(sp+36)
8006258: 2b 90 00 20 lw r16,(sp+32)
800625c: 2b 91 00 1c lw r17,(sp+28)
8006260: 2b 92 00 18 lw r18,(sp+24)
8006264: 2b 93 00 14 lw r19,(sp+20)
8006268: 2b 94 00 10 lw r20,(sp+16)
800626c: 2b 95 00 0c lw r21,(sp+12)
8006270: 2b 96 00 08 lw r22,(sp+8)
8006274: 37 9c 00 34 addi sp,sp,52
8006278: c3 a0 00 00 ret
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
return sc;
}
if (tty->cindex == tty->ccount) {
800627c: 29 62 00 24 lw r2,(r11+36)
8006280: 29 61 00 20 lw r1,(r11+32)
8006284: 44 41 00 15 be r2,r1,80062d8 <rtems_termios_read+0x148> <== ALWAYS TAKEN
sc = fillBufferQueue (tty);
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
8006288: 45 e0 00 0d be r15,r0,80062bc <rtems_termios_read+0x12c> <== NEVER TAKEN
800628c: 29 63 00 24 lw r3,(r11+36)
8006290: 29 61 00 20 lw r1,(r11+32)
8006294: 4c 61 00 0a bge r3,r1,80062bc <rtems_termios_read+0x12c>
*buffer++ = tty->cbuf[tty->cindex++];
8006298: 29 62 00 1c lw r2,(r11+28)
count--;
800629c: 35 ef ff ff addi r15,r15,-1
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
*buffer++ = tty->cbuf[tty->cindex++];
80062a0: b4 43 10 00 add r2,r2,r3
80062a4: 40 41 00 00 lbu r1,(r2+0)
80062a8: 34 63 00 01 addi r3,r3,1
80062ac: 32 01 00 00 sb (r16+0),r1
80062b0: 59 63 00 24 sw (r11+36),r3
80062b4: 36 10 00 01 addi r16,r16,1
sc = fillBufferQueue (tty);
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
80062b8: 5d e0 ff f6 bne r15,r0,8006290 <rtems_termios_read+0x100>
*buffer++ = tty->cbuf[tty->cindex++];
count--;
}
args->bytes_moved = args->count - count;
80062bc: 2a 22 00 14 lw r2,(r17+20)
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
80062c0: 29 61 00 14 lw r1,(r11+20)
}
while (count && (tty->cindex < tty->ccount)) {
*buffer++ = tty->cbuf[tty->cindex++];
count--;
}
args->bytes_moved = args->count - count;
80062c4: c8 4f 78 00 sub r15,r2,r15
80062c8: 5a 2f 00 1c sw (r17+28),r15
tty->tty_rcvwakeup = 0;
80062cc: 59 60 00 e4 sw (r11+228),r0
rtems_semaphore_release (tty->isem);
80062d0: f8 00 05 e3 calli 8007a5c <rtems_semaphore_release>
return sc;
80062d4: e3 ff ff da bi 800623c <rtems_termios_read+0xac>
return sc;
}
if (tty->cindex == tty->ccount) {
tty->cindex = tty->ccount = 0;
tty->read_start_column = tty->column;
80062d8: 29 61 00 28 lw r1,(r11+40)
if (tty->device.pollRead != NULL &&
80062dc: 29 62 00 a0 lw r2,(r11+160)
rtems_semaphore_release (tty->isem);
return sc;
}
if (tty->cindex == tty->ccount) {
tty->cindex = tty->ccount = 0;
80062e0: 59 60 00 20 sw (r11+32),r0
80062e4: 59 60 00 24 sw (r11+36),r0
tty->read_start_column = tty->column;
80062e8: 59 61 00 2c sw (r11+44),r1
if (tty->device.pollRead != NULL &&
80062ec: 44 40 00 03 be r2,r0,80062f8 <rtems_termios_read+0x168>
80062f0: 29 61 00 b4 lw r1,(r11+180)
80062f4: 44 20 00 5d be r1,r0,8006468 <rtems_termios_read+0x2d8>
* Fill the input buffer from the raw input queue
*/
static rtems_status_code
fillBufferQueue (struct rtems_termios_tty *tty)
{
rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
80062f8: 29 6e 00 74 lw r14,(r11+116)
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
(tty->ccount < (CBUFSIZE-1))) {
80062fc: 78 0c 08 02 mvhi r12,0x802
static rtems_status_code
fillBufferQueue (struct rtems_termios_tty *tty)
{
rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
rtems_status_code sc;
int wait = (int)1;
8006300: 34 0d 00 01 mvi r13,1
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
(tty->ccount < (CBUFSIZE-1))) {
8006304: 39 8c 43 40 ori r12,r12,0x4340
c = tty->rawInBuf.theBuf[newHead];
tty->rawInBuf.Head = newHead;
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
% tty->rawInBuf.Size)
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
8006308: 34 14 ff fe mvi r20,-2
/* if tx stopped and XON should be sent... */
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
800630c: 34 13 02 02 mvi r19,514
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
tty->flow_ctrl &= ~FL_IRTSOFF;
8006310: 34 15 ff fb mvi r21,-5
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
== (FL_MDXON | FL_ISNTXOF))
&& ((tty->rawOutBufState == rob_idle)
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
8006314: 35 76 00 49 addi r22,r11,73
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8006318: 29 63 00 5c lw r3,(r11+92)
800631c: 29 61 00 60 lw r1,(r11+96)
8006320: 44 61 00 05 be r3,r1,8006334 <rtems_termios_read+0x1a4>
(tty->ccount < (CBUFSIZE-1))) {
8006324: 29 81 00 00 lw r1,(r12+0)
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8006328: 29 62 00 20 lw r2,(r11+32)
(tty->ccount < (CBUFSIZE-1))) {
800632c: 34 21 ff ff addi r1,r1,-1
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8006330: 48 22 00 08 bg r1,r2,8006350 <rtems_termios_read+0x1c0> <== ALWAYS TAKEN
}
/*
* Wait for characters
*/
if ( wait ) {
8006334: 45 a0 ff d5 be r13,r0,8006288 <rtems_termios_read+0xf8>
sc = rtems_semaphore_obtain(
8006338: 29 61 00 68 lw r1,(r11+104)
800633c: 29 62 00 6c lw r2,(r11+108)
8006340: b9 c0 18 00 mv r3,r14
8006344: f8 00 05 6a calli 80078ec <rtems_semaphore_obtain>
tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout);
if (sc != RTEMS_SUCCESSFUL)
8006348: 44 20 ff f4 be r1,r0,8006318 <rtems_termios_read+0x188> <== ALWAYS TAKEN
800634c: e3 ff ff cf bi 8006288 <rtems_termios_read+0xf8> <== 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;
8006350: 29 63 00 5c lw r3,(r11+92)
8006354: 29 62 00 64 lw r2,(r11+100)
8006358: 34 61 00 01 addi r1,r3,1
800635c: f8 00 65 0b calli 801f788 <__umodsi3>
c = tty->rawInBuf.theBuf[newHead];
8006360: 29 64 00 58 lw r4,(r11+88)
8006364: b4 81 20 00 add r4,r4,r1
8006368: 40 8e 00 00 lbu r14,(r4+0)
tty->rawInBuf.Head = newHead;
800636c: 59 61 00 5c sw (r11+92),r1
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
8006370: 29 64 00 60 lw r4,(r11+96)
8006374: 29 65 00 64 lw r5,(r11+100)
% tty->rawInBuf.Size)
8006378: 29 62 00 64 lw r2,(r11+100)
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
c = tty->rawInBuf.theBuf[newHead];
tty->rawInBuf.Head = newHead;
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
800637c: b4 a4 20 00 add r4,r5,r4
% tty->rawInBuf.Size)
8006380: c8 81 08 00 sub r1,r4,r1
8006384: f8 00 65 01 calli 801f788 <__umodsi3>
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
c = tty->rawInBuf.theBuf[newHead];
tty->rawInBuf.Head = newHead;
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
8006388: 29 63 00 bc lw r3,(r11+188)
800638c: 50 23 00 11 bgeu r1,r3,80063d0 <rtems_termios_read+0x240> <== NEVER TAKEN
% tty->rawInBuf.Size)
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
8006390: 29 63 00 b8 lw r3,(r11+184)
8006394: a0 74 18 00 and r3,r3,r20
8006398: 59 63 00 b8 sw (r11+184),r3
/* if tx stopped and XON should be sent... */
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
800639c: 29 63 00 b8 lw r3,(r11+184)
80063a0: 20 63 02 02 andi r3,r3,0x202
80063a4: 44 73 00 26 be r3,r19,800643c <rtems_termios_read+0x2ac> <== NEVER TAKEN
&& ((tty->rawOutBufState == rob_idle)
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
80063a8: 29 63 00 b8 lw r3,(r11+184)
80063ac: 20 63 01 00 andi r3,r3,0x100
80063b0: 44 60 00 08 be r3,r0,80063d0 <rtems_termios_read+0x240> <== ALWAYS TAKEN
tty->flow_ctrl &= ~FL_IRTSOFF;
80063b4: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
/* activate RTS line */
if (tty->device.startRemoteTx != NULL) {
80063b8: 29 63 00 b0 lw r3,(r11+176) <== NOT EXECUTED
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
tty->flow_ctrl &= ~FL_IRTSOFF;
80063bc: a0 35 08 00 and r1,r1,r21 <== NOT EXECUTED
80063c0: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* activate RTS line */
if (tty->device.startRemoteTx != NULL) {
80063c4: 44 60 00 03 be r3,r0,80063d0 <rtems_termios_read+0x240> <== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
80063c8: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
80063cc: d8 60 00 00 call r3 <== NOT EXECUTED
}
}
}
/* continue processing new character */
if (tty->termios.c_lflag & ICANON) {
80063d0: 29 63 00 3c lw r3,(r11+60)
80063d4: 20 63 00 02 andi r3,r3,0x2
80063d8: 44 60 00 10 be r3,r0,8006418 <rtems_termios_read+0x288> <== NEVER TAKEN
if (siproc (c, tty))
80063dc: b9 c0 08 00 mv r1,r14
80063e0: b9 60 10 00 mv r2,r11
80063e4: fb ff ff 05 calli 8005ff8 <siproc>
wait = 0;
80063e8: 64 23 00 00 cmpei r3,r1,0
80063ec: c8 03 18 00 sub r3,r0,r3
80063f0: a1 a3 68 00 and r13,r13,r3
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
80063f4: 29 65 00 5c lw r5,(r11+92)
80063f8: 29 64 00 60 lw r4,(r11+96)
} else {
siproc (c, tty);
if (tty->ccount >= tty->termios.c_cc[VMIN])
wait = 0;
}
timeout = tty->rawInBufSemaphoreTimeout;
80063fc: 29 6e 00 70 lw r14,(r11+112)
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8006400: 44 a4 ff cd be r5,r4,8006334 <rtems_termios_read+0x1a4>
(tty->ccount < (CBUFSIZE-1))) {
8006404: 29 84 00 00 lw r4,(r12+0)
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8006408: 29 63 00 20 lw r3,(r11+32)
(tty->ccount < (CBUFSIZE-1))) {
800640c: 34 84 ff ff addi r4,r4,-1
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8006410: 48 83 ff d0 bg r4,r3,8006350 <rtems_termios_read+0x1c0> <== ALWAYS TAKEN
8006414: e3 ff ff c8 bi 8006334 <rtems_termios_read+0x1a4> <== NOT EXECUTED
/* continue processing new character */
if (tty->termios.c_lflag & ICANON) {
if (siproc (c, tty))
wait = 0;
} else {
siproc (c, tty);
8006418: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
800641c: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8006420: fb ff fe f6 calli 8005ff8 <siproc> <== NOT EXECUTED
if (tty->ccount >= tty->termios.c_cc[VMIN])
8006424: 41 63 00 47 lbu r3,(r11+71) <== NOT EXECUTED
8006428: 29 61 00 20 lw r1,(r11+32) <== NOT EXECUTED
wait = 0;
800642c: e8 61 18 00 cmpg r3,r3,r1 <== NOT EXECUTED
8006430: c8 03 18 00 sub r3,r0,r3 <== NOT EXECUTED
8006434: a1 a3 68 00 and r13,r13,r3 <== NOT EXECUTED
8006438: e3 ff ff ef bi 80063f4 <rtems_termios_read+0x264> <== NOT EXECUTED
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
/* if tx stopped and XON should be sent... */
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
== (FL_MDXON | FL_ISNTXOF))
&& ((tty->rawOutBufState == rob_idle)
800643c: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED
8006440: 44 20 00 04 be r1,r0,8006450 <rtems_termios_read+0x2c0> <== NOT EXECUTED
|| (tty->flow_ctrl & FL_OSTOP))) {
8006444: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8006448: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED
800644c: 44 20 ff d7 be r1,r0,80063a8 <rtems_termios_read+0x218> <== NOT EXECUTED
/* XON should be sent now... */
(*tty->device.write)(
8006450: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8006454: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8006458: ba c0 10 00 mv r2,r22 <== NOT EXECUTED
800645c: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006460: d8 80 00 00 call r4 <== NOT EXECUTED
8006464: e3 ff ff db bi 80063d0 <rtems_termios_read+0x240> <== NOT EXECUTED
static rtems_status_code
fillBufferPoll (struct rtems_termios_tty *tty)
{
int n;
if (tty->termios.c_lflag & ICANON) {
8006468: 29 61 00 3c lw r1,(r11+60)
800646c: 20 21 00 02 andi r1,r1,0x2
8006470: 44 20 00 14 be r1,r0,80064c0 <rtems_termios_read+0x330>
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
8006474: 29 61 00 10 lw r1,(r11+16)
8006478: d8 40 00 00 call r2
800647c: b8 20 18 00 mv r3,r1
if (n < 0) {
rtems_task_wake_after (1);
} else {
if (siproc (n, tty))
8006480: b9 60 10 00 mv r2,r11
8006484: 20 21 00 ff andi r1,r1,0xff
int n;
if (tty->termios.c_lflag & ICANON) {
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
if (n < 0) {
8006488: 4c 60 00 21 bge r3,r0,800650c <rtems_termios_read+0x37c>
rtems_task_wake_after (1);
800648c: 34 01 00 01 mvi r1,1
8006490: f8 00 06 83 calli 8007e9c <rtems_task_wake_after>
static rtems_status_code
fillBufferPoll (struct rtems_termios_tty *tty)
{
int n;
if (tty->termios.c_lflag & ICANON) {
8006494: 29 62 00 a0 lw r2,(r11+160)
8006498: e3 ff ff f7 bi 8006474 <rtems_termios_read+0x2e4>
break;
}
}
rtems_task_wake_after (1);
} else {
siproc (n, tty);
800649c: b9 60 10 00 mv r2,r11
80064a0: 20 21 00 ff andi r1,r1,0xff
80064a4: fb ff fe d5 calli 8005ff8 <siproc>
if (tty->ccount >= tty->termios.c_cc[VMIN])
80064a8: 41 62 00 47 lbu r2,(r11+71)
80064ac: 29 61 00 20 lw r1,(r11+32)
80064b0: 4c 22 ff 76 bge r1,r2,8006288 <rtems_termios_read+0xf8> <== NEVER TAKEN
break;
if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME])
80064b4: 44 40 00 05 be r2,r0,80064c8 <rtems_termios_read+0x338> <== NEVER TAKEN
80064b8: 41 61 00 46 lbu r1,(r11+70)
80064bc: 44 20 00 03 be r1,r0,80064c8 <rtems_termios_read+0x338> <== NEVER TAKEN
}
}
} else {
rtems_interval then, now;
then = rtems_clock_get_ticks_since_boot();
80064c0: f8 00 03 0d calli 80070f4 <rtems_clock_get_ticks_since_boot>
80064c4: b8 20 60 00 mv r12,r1
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
80064c8: 29 62 00 a0 lw r2,(r11+160)
80064cc: 29 61 00 10 lw r1,(r11+16)
80064d0: d8 40 00 00 call r2
if (n < 0) {
80064d4: 4c 20 ff f2 bge r1,r0,800649c <rtems_termios_read+0x30c>
if (tty->termios.c_cc[VMIN]) {
80064d8: 41 62 00 47 lbu r2,(r11+71)
80064dc: 44 40 00 10 be r2,r0,800651c <rtems_termios_read+0x38c> <== NEVER TAKEN
if (tty->termios.c_cc[VTIME] && tty->ccount) {
80064e0: 41 61 00 46 lbu r1,(r11+70)
80064e4: 44 20 00 03 be r1,r0,80064f0 <rtems_termios_read+0x360> <== NEVER TAKEN
80064e8: 29 61 00 20 lw r1,(r11+32)
80064ec: 5c 20 00 0e bne r1,r0,8006524 <rtems_termios_read+0x394>
now = rtems_clock_get_ticks_since_boot();
if ((now - then) > tty->vtimeTicks) {
break;
}
}
rtems_task_wake_after (1);
80064f0: 34 01 00 01 mvi r1,1
80064f4: f8 00 06 6a calli 8007e9c <rtems_task_wake_after>
} else {
rtems_interval then, now;
then = rtems_clock_get_ticks_since_boot();
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
80064f8: 29 62 00 a0 lw r2,(r11+160)
80064fc: 29 61 00 10 lw r1,(r11+16)
8006500: d8 40 00 00 call r2
if (n < 0) {
8006504: 4c 20 ff e6 bge r1,r0,800649c <rtems_termios_read+0x30c>
8006508: e3 ff ff f4 bi 80064d8 <rtems_termios_read+0x348>
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
if (n < 0) {
rtems_task_wake_after (1);
} else {
if (siproc (n, tty))
800650c: fb ff fe bb calli 8005ff8 <siproc>
8006510: 5c 20 ff 5e bne r1,r0,8006288 <rtems_termios_read+0xf8>
static rtems_status_code
fillBufferPoll (struct rtems_termios_tty *tty)
{
int n;
if (tty->termios.c_lflag & ICANON) {
8006514: 29 62 00 a0 lw r2,(r11+160)
8006518: e3 ff ff d7 bi 8006474 <rtems_termios_read+0x2e4>
if ((now - then) > tty->vtimeTicks) {
break;
}
}
} else {
if (!tty->termios.c_cc[VTIME])
800651c: 41 61 00 46 lbu r1,(r11+70) <== NOT EXECUTED
8006520: 44 22 ff 5a be r1,r2,8006288 <rtems_termios_read+0xf8> <== NOT EXECUTED
break;
now = rtems_clock_get_ticks_since_boot();
8006524: f8 00 02 f4 calli 80070f4 <rtems_clock_get_ticks_since_boot>
if ((now - then) > tty->vtimeTicks) {
8006528: 29 62 00 54 lw r2,(r11+84)
800652c: c8 2c 08 00 sub r1,r1,r12
8006530: 54 22 ff 56 bgu r1,r2,8006288 <rtems_termios_read+0xf8>
8006534: e3 ff ff ef bi 80064f0 <rtems_termios_read+0x360>
08006948 <rtems_termios_refill_transmitter>:
* 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)
{
8006948: 37 9c ff f0 addi sp,sp,-16
800694c: 5b 8b 00 10 sw (sp+16),r11
8006950: 5b 8c 00 0c sw (sp+12),r12
8006954: 5b 8d 00 08 sw (sp+8),r13
8006958: 5b 9d 00 04 sw (sp+4),ra
int nToSend;
rtems_interrupt_level level;
int len;
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
800695c: 28 22 00 b8 lw r2,(r1+184)
* in task-driven mode, this function is called in Tx task context
* in interrupt-driven mode, this function is called in TxIRQ context
*/
int
rtems_termios_refill_transmitter (struct rtems_termios_tty *tty)
{
8006960: b8 20 58 00 mv r11,r1
int nToSend;
rtems_interrupt_level level;
int len;
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
8006964: 34 01 04 01 mvi r1,1025
8006968: 20 42 04 03 andi r2,r2,0x403
800696c: 44 41 00 50 be r2,r1,8006aac <rtems_termios_refill_transmitter+0x164><== NEVER TAKEN
tty->flow_ctrl |= FL_ISNTXOF;
rtems_interrupt_enable(level);
nToSend = 1;
} else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) {
8006970: 29 62 00 b8 lw r2,(r11+184)
8006974: 34 01 00 02 mvi r1,2
8006978: 20 42 00 03 andi r2,r2,0x3
800697c: 44 41 00 64 be r2,r1,8006b0c <rtems_termios_refill_transmitter+0x1c4><== NEVER TAKEN
tty->flow_ctrl &= ~FL_ISNTXOF;
rtems_interrupt_enable(level);
nToSend = 1;
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
8006980: 29 63 00 80 lw r3,(r11+128)
8006984: 29 62 00 84 lw r2,(r11+132)
8006988: 44 62 00 1c be r3,r2,80069f8 <rtems_termios_refill_transmitter+0xb0>
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
return 0;
}
rtems_interrupt_disable(level);
800698c: 90 00 10 00 rcsr r2,IE
8006990: 34 01 ff fe mvi r1,-2
8006994: a0 41 08 00 and r1,r2,r1
8006998: d0 01 00 00 wcsr IE,r1
len = tty->t_dqlen;
800699c: 29 63 00 90 lw r3,(r11+144)
tty->t_dqlen = 0;
80069a0: 59 60 00 90 sw (r11+144),r0
rtems_interrupt_enable(level);
80069a4: d0 02 00 00 wcsr IE,r2
newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size;
80069a8: 29 61 00 84 lw r1,(r11+132)
80069ac: 29 62 00 88 lw r2,(r11+136)
80069b0: b4 61 08 00 add r1,r3,r1
80069b4: f8 00 63 75 calli 801f788 <__umodsi3>
tty->rawOutBuf.Tail = newTail;
if (tty->rawOutBufState == rob_wait) {
80069b8: 29 62 00 94 lw r2,(r11+148)
rtems_interrupt_disable(level);
len = tty->t_dqlen;
tty->t_dqlen = 0;
rtems_interrupt_enable(level);
newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size;
80069bc: b8 20 60 00 mv r12,r1
tty->rawOutBuf.Tail = newTail;
80069c0: 59 61 00 84 sw (r11+132),r1
if (tty->rawOutBufState == rob_wait) {
80069c4: 34 01 00 02 mvi r1,2
80069c8: 44 41 00 36 be r2,r1,8006aa0 <rtems_termios_refill_transmitter+0x158>
* wake up any pending writer task
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
if (newTail == tty->rawOutBuf.Head) {
80069cc: 29 61 00 80 lw r1,(r11+128)
80069d0: 44 2c 00 14 be r1,r12,8006a20 <rtems_termios_refill_transmitter+0xd8>
if ( tty->tty_snd.sw_pfn != NULL) {
(*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
}
}
/* check, whether output should stop due to received XOFF */
else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF))
80069d4: 29 62 00 b8 lw r2,(r11+184)
80069d8: 34 01 02 10 mvi r1,528
80069dc: 20 42 02 10 andi r2,r2,0x210
80069e0: 44 41 00 64 be r2,r1,8006b70 <rtems_termios_refill_transmitter+0x228><== NEVER TAKEN
nToSend = 0;
} else {
/*
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
80069e4: 29 61 00 80 lw r1,(r11+128)
80069e8: 50 2c 00 1d bgeu r1,r12,8006a5c <rtems_termios_refill_transmitter+0x114>
nToSend = tty->rawOutBuf.Size - newTail;
80069ec: 29 6d 00 88 lw r13,(r11+136)
80069f0: c9 ac 68 00 sub r13,r13,r12
80069f4: e0 00 00 1c bi 8006a64 <rtems_termios_refill_transmitter+0x11c>
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
/*
* buffer was empty
*/
if (tty->rawOutBufState == rob_wait) {
80069f8: 29 62 00 94 lw r2,(r11+148)
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
return 0;
80069fc: 34 0d 00 00 mvi r13,0
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
/*
* buffer was empty
*/
if (tty->rawOutBufState == rob_wait) {
8006a00: 44 41 00 69 be r2,r1,8006ba4 <rtems_termios_refill_transmitter+0x25c><== NEVER TAKEN
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
}
return nToSend;
}
8006a04: b9 a0 08 00 mv r1,r13
8006a08: 2b 9d 00 04 lw ra,(sp+4)
8006a0c: 2b 8b 00 10 lw r11,(sp+16)
8006a10: 2b 8c 00 0c lw r12,(sp+12)
8006a14: 2b 8d 00 08 lw r13,(sp+8)
8006a18: 37 9c 00 10 addi sp,sp,16
8006a1c: c3 a0 00 00 ret
nToSend = 0;
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
8006a20: 29 63 00 d4 lw r3,(r11+212)
if (newTail == tty->rawOutBuf.Head) {
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
8006a24: 59 60 00 94 sw (r11+148),r0
nToSend = 0;
8006a28: 34 0d 00 00 mvi r13,0
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
8006a2c: 44 60 00 04 be r3,r0,8006a3c <rtems_termios_refill_transmitter+0xf4><== ALWAYS TAKEN
(*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
8006a30: 29 62 00 d8 lw r2,(r11+216) <== NOT EXECUTED
8006a34: 35 61 00 30 addi r1,r11,48 <== NOT EXECUTED
8006a38: d8 60 00 00 call r3 <== NOT EXECUTED
}
tty->rawOutBufState = rob_busy; /*apm*/
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
8006a3c: 59 6c 00 84 sw (r11+132),r12
}
return nToSend;
}
8006a40: b9 a0 08 00 mv r1,r13
8006a44: 2b 9d 00 04 lw ra,(sp+4)
8006a48: 2b 8b 00 10 lw r11,(sp+16)
8006a4c: 2b 8c 00 0c lw r12,(sp+12)
8006a50: 2b 8d 00 08 lw r13,(sp+8)
8006a54: 37 9c 00 10 addi sp,sp,16
8006a58: c3 a0 00 00 ret
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
nToSend = tty->rawOutBuf.Size - newTail;
else
nToSend = tty->rawOutBuf.Head - newTail;
8006a5c: 29 6d 00 80 lw r13,(r11+128)
8006a60: c9 ac 68 00 sub r13,r13,r12
/* when flow control XON or XOF, don't send blocks of data */
/* to allow fast reaction on incoming flow ctrl and low latency*/
/* for outgoing flow control */
if (tty->flow_ctrl & (FL_MDXON | FL_MDXOF)) {
8006a64: 29 61 00 b8 lw r1,(r11+184)
8006a68: b9 a0 18 00 mv r3,r13
8006a6c: 20 21 06 00 andi r1,r1,0x600
8006a70: 44 20 00 03 be r1,r0,8006a7c <rtems_termios_refill_transmitter+0x134>
8006a74: 34 03 00 01 mvi r3,1
nToSend = 1;
8006a78: 34 0d 00 01 mvi r13,1
}
tty->rawOutBufState = rob_busy; /*apm*/
(*tty->device.write)(
8006a7c: 29 62 00 7c lw r2,(r11+124)
8006a80: 29 65 00 a4 lw r5,(r11+164)
8006a84: 29 61 00 10 lw r1,(r11+16)
/* to allow fast reaction on incoming flow ctrl and low latency*/
/* for outgoing flow control */
if (tty->flow_ctrl & (FL_MDXON | FL_MDXOF)) {
nToSend = 1;
}
tty->rawOutBufState = rob_busy; /*apm*/
8006a88: 34 04 00 01 mvi r4,1
8006a8c: 59 64 00 94 sw (r11+148),r4
(*tty->device.write)(
8006a90: b4 4c 10 00 add r2,r2,r12
8006a94: d8 a0 00 00 call r5
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
8006a98: 59 6c 00 84 sw (r11+132),r12
8006a9c: e3 ff ff e9 bi 8006a40 <rtems_termios_refill_transmitter+0xf8>
tty->rawOutBuf.Tail = newTail;
if (tty->rawOutBufState == rob_wait) {
/*
* wake up any pending writer task
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
8006aa0: 29 61 00 8c lw r1,(r11+140)
8006aa4: f8 00 03 ee calli 8007a5c <rtems_semaphore_release>
8006aa8: e3 ff ff c9 bi 80069cc <rtems_termios_refill_transmitter+0x84>
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
== (FL_MDXOF | FL_IREQXOF)) {
/* XOFF should be sent now... */
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1);
8006aac: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8006ab0: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8006ab4: 35 62 00 4a addi r2,r11,74 <== NOT EXECUTED
8006ab8: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006abc: d8 80 00 00 call r4 <== NOT EXECUTED
rtems_interrupt_disable(level);
8006ac0: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED
8006ac4: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED
8006ac8: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED
8006acc: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
tty->t_dqlen--;
8006ad0: 29 63 00 90 lw r3,(r11+144) <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
8006ad4: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
== (FL_MDXOF | FL_IREQXOF)) {
/* XOFF should be sent now... */
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1);
rtems_interrupt_disable(level);
tty->t_dqlen--;
8006ad8: 34 63 ff ff addi r3,r3,-1 <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
8006adc: 38 42 00 02 ori r2,r2,0x2 <== NOT EXECUTED
== (FL_MDXOF | FL_IREQXOF)) {
/* XOFF should be sent now... */
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1);
rtems_interrupt_disable(level);
tty->t_dqlen--;
8006ae0: 59 63 00 90 sw (r11+144),r3 <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
8006ae4: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED
rtems_interrupt_enable(level);
8006ae8: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
nToSend = 1;
8006aec: 34 0d 00 01 mvi r13,1 <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
}
return nToSend;
}
8006af0: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8006af4: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8006af8: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
8006afc: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
8006b00: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
8006b04: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED
8006b08: c3 a0 00 00 ret <== NOT EXECUTED
* FIXME: this .write call will generate another
* dequeue callback. This will advance the "Tail" in the data
* buffer, although the corresponding data is not yet out!
* Therefore the dequeue "length" should be reduced by 1
*/
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
8006b0c: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8006b10: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8006b14: 35 62 00 49 addi r2,r11,73 <== NOT EXECUTED
8006b18: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006b1c: d8 80 00 00 call r4 <== NOT EXECUTED
rtems_interrupt_disable(level);
8006b20: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED
8006b24: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED
8006b28: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED
8006b2c: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
tty->t_dqlen--;
8006b30: 29 63 00 90 lw r3,(r11+144) <== NOT EXECUTED
tty->flow_ctrl &= ~FL_ISNTXOF;
8006b34: 29 64 00 b8 lw r4,(r11+184) <== NOT EXECUTED
8006b38: 34 02 ff fd mvi r2,-3 <== NOT EXECUTED
* Therefore the dequeue "length" should be reduced by 1
*/
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
rtems_interrupt_disable(level);
tty->t_dqlen--;
8006b3c: 34 63 ff ff addi r3,r3,-1 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_ISNTXOF;
8006b40: a0 82 10 00 and r2,r4,r2 <== NOT EXECUTED
* Therefore the dequeue "length" should be reduced by 1
*/
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
rtems_interrupt_disable(level);
tty->t_dqlen--;
8006b44: 59 63 00 90 sw (r11+144),r3 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_ISNTXOF;
8006b48: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED
rtems_interrupt_enable(level);
8006b4c: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
nToSend = 1;
8006b50: 34 0d 00 01 mvi r13,1 <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
}
return nToSend;
}
8006b54: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8006b58: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8006b5c: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
8006b60: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
8006b64: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
8006b68: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED
8006b6c: c3 a0 00 00 ret <== NOT EXECUTED
/* check, whether output should stop due to received XOFF */
else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF))
== (FL_MDXON | FL_ORCVXOF)) {
/* Buffer not empty, but output stops due to XOFF */
/* set flag, that output has been stopped */
rtems_interrupt_disable(level);
8006b70: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED
8006b74: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED
8006b78: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED
8006b7c: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
tty->flow_ctrl |= FL_OSTOP;
8006b80: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
tty->rawOutBufState = rob_busy; /*apm*/
8006b84: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006b88: 59 63 00 94 sw (r11+148),r3 <== NOT EXECUTED
else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF))
== (FL_MDXON | FL_ORCVXOF)) {
/* Buffer not empty, but output stops due to XOFF */
/* set flag, that output has been stopped */
rtems_interrupt_disable(level);
tty->flow_ctrl |= FL_OSTOP;
8006b8c: 38 42 00 20 ori r2,r2,0x20 <== NOT EXECUTED
8006b90: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED
tty->rawOutBufState = rob_busy; /*apm*/
rtems_interrupt_enable(level);
8006b94: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
nToSend = 0;
8006b98: 34 0d 00 00 mvi r13,0 <== NOT EXECUTED
}
tty->rawOutBufState = rob_busy; /*apm*/
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
8006b9c: 59 6c 00 84 sw (r11+132),r12 <== NOT EXECUTED
8006ba0: e3 ff ff a8 bi 8006a40 <rtems_termios_refill_transmitter+0xf8><== NOT EXECUTED
*/
if (tty->rawOutBufState == rob_wait) {
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
8006ba4: 29 61 00 8c lw r1,(r11+140) <== NOT EXECUTED
8006ba8: f8 00 03 ad calli 8007a5c <rtems_semaphore_release> <== NOT EXECUTED
8006bac: e3 ff ff 96 bi 8006a04 <rtems_termios_refill_transmitter+0xbc><== NOT EXECUTED
080068b0 <rtems_termios_rxdaemon>:
/*
* this task actually processes any receive events
*/
static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument)
{
80068b0: 37 9c ff e4 addi sp,sp,-28
80068b4: 5b 8b 00 14 sw (sp+20),r11
80068b8: 5b 8c 00 10 sw (sp+16),r12
80068bc: 5b 8d 00 0c sw (sp+12),r13
80068c0: 5b 8e 00 08 sw (sp+8),r14
80068c4: 5b 9d 00 04 sw (sp+4),ra
/*
* do something
*/
c = tty->device.pollRead(tty->minor);
if (c != EOF) {
80068c8: 34 0c ff ff mvi r12,-1
/*
* this task actually processes any receive events
*/
static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument)
{
80068cc: b8 20 58 00 mv r11,r1
80068d0: 37 8d 00 18 addi r13,sp,24
80068d4: 37 8e 00 1f addi r14,sp,31
80068d8: e0 00 00 06 bi 80068f0 <rtems_termios_rxdaemon+0x40>
}
/*
* do something
*/
c = tty->device.pollRead(tty->minor);
80068dc: 29 63 00 a0 lw r3,(r11+160)
80068e0: 29 61 00 10 lw r1,(r11+16)
80068e4: d8 60 00 00 call r3
80068e8: b8 20 28 00 mv r5,r1
if (c != EOF) {
80068ec: 5c 2c 00 11 bne r1,r12,8006930 <rtems_termios_rxdaemon+0x80>
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
80068f0: b9 a0 20 00 mv r4,r13
80068f4: 34 02 00 02 mvi r2,2
80068f8: 34 03 00 00 mvi r3,0
80068fc: 34 01 00 03 mvi r1,3
8006900: f8 00 02 1a calli 8007168 <rtems_event_receive>
(TERMIOS_RX_PROC_EVENT | TERMIOS_RX_TERMINATE_EVENT),
RTEMS_EVENT_ANY | RTEMS_WAIT,
RTEMS_NO_TIMEOUT,
&the_event
);
if ((the_event & TERMIOS_RX_TERMINATE_EVENT) != 0) {
8006904: 2b 81 00 18 lw r1,(sp+24)
8006908: 20 21 00 01 andi r1,r1,0x1
800690c: 44 20 ff f4 be r1,r0,80068dc <rtems_termios_rxdaemon+0x2c> <== ALWAYS TAKEN
tty->rxTaskId = 0;
8006910: 59 60 00 c4 sw (r11+196),r0
rtems_task_delete(RTEMS_SELF);
8006914: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8006918: f8 00 04 df calli 8007c94 <rtems_task_delete> <== NOT EXECUTED
}
/*
* do something
*/
c = tty->device.pollRead(tty->minor);
800691c: 29 63 00 a0 lw r3,(r11+160) <== NOT EXECUTED
8006920: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8006924: d8 60 00 00 call r3 <== NOT EXECUTED
8006928: b8 20 28 00 mv r5,r1 <== NOT EXECUTED
if (c != EOF) {
800692c: 44 2c ff f1 be r1,r12,80068f0 <rtems_termios_rxdaemon+0x40><== NOT EXECUTED
/*
* pollRead did call enqueue on its own
*/
c_buf = c;
rtems_termios_enqueue_raw_characters ( tty,&c_buf,1);
8006930: b9 60 08 00 mv r1,r11
8006934: b9 c0 10 00 mv r2,r14
8006938: 34 03 00 01 mvi r3,1
c = tty->device.pollRead(tty->minor);
if (c != EOF) {
/*
* pollRead did call enqueue on its own
*/
c_buf = c;
800693c: 33 85 00 1f sb (sp+31),r5
rtems_termios_enqueue_raw_characters ( tty,&c_buf,1);
8006940: fb ff ff 06 calli 8006558 <rtems_termios_enqueue_raw_characters>
8006944: e3 ff ff eb bi 80068f0 <rtems_termios_rxdaemon+0x40>
08006bb0 <rtems_termios_txdaemon>:
/*
* this task actually processes any transmit events
*/
static rtems_task rtems_termios_txdaemon(rtems_task_argument argument)
{
8006bb0: 37 9c ff f0 addi sp,sp,-16
8006bb4: 5b 8b 00 0c sw (sp+12),r11
8006bb8: 5b 8c 00 08 sw (sp+8),r12
8006bbc: 5b 9d 00 04 sw (sp+4),ra
8006bc0: 78 0c 08 02 mvhi r12,0x802
8006bc4: b8 20 58 00 mv r11,r1
8006bc8: 39 8c 49 14 ori r12,r12,0x4914
8006bcc: e0 00 00 0e bi 8006c04 <rtems_termios_txdaemon+0x54>
}
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
8006bd0: 29 62 00 cc lw r2,(r11+204)
rtems_termios_linesw[tty->t_line].l_start(tty);
8006bd4: b9 60 08 00 mv r1,r11
}
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
8006bd8: b4 42 10 00 add r2,r2,r2
8006bdc: b4 42 10 00 add r2,r2,r2
8006be0: b4 42 10 00 add r2,r2,r2
8006be4: b4 42 10 00 add r2,r2,r2
8006be8: b4 42 10 00 add r2,r2,r2
8006bec: b5 82 10 00 add r2,r12,r2
8006bf0: 28 42 00 14 lw r2,(r2+20)
8006bf4: 44 40 00 02 be r2,r0,8006bfc <rtems_termios_txdaemon+0x4c> <== ALWAYS TAKEN
rtems_termios_linesw[tty->t_line].l_start(tty);
8006bf8: d8 40 00 00 call r2 <== NOT EXECUTED
}
/*
* try to push further characters to device
*/
rtems_termios_refill_transmitter(tty);
8006bfc: b9 60 08 00 mv r1,r11
8006c00: fb ff ff 52 calli 8006948 <rtems_termios_refill_transmitter>
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
8006c04: 34 02 00 02 mvi r2,2
8006c08: 34 03 00 00 mvi r3,0
8006c0c: 37 84 00 10 addi r4,sp,16
8006c10: 34 01 00 03 mvi r1,3
8006c14: f8 00 01 55 calli 8007168 <rtems_event_receive>
(TERMIOS_TX_START_EVENT | TERMIOS_TX_TERMINATE_EVENT),
RTEMS_EVENT_ANY | RTEMS_WAIT,
RTEMS_NO_TIMEOUT,
&the_event
);
if ((the_event & TERMIOS_TX_TERMINATE_EVENT) != 0) {
8006c18: 2b 81 00 10 lw r1,(sp+16)
8006c1c: 20 21 00 01 andi r1,r1,0x1
8006c20: 44 20 ff ec be r1,r0,8006bd0 <rtems_termios_txdaemon+0x20> <== ALWAYS TAKEN
tty->txTaskId = 0;
8006c24: 59 60 00 c8 sw (r11+200),r0 <== NOT EXECUTED
rtems_task_delete(RTEMS_SELF);
8006c28: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8006c2c: f8 00 04 1a calli 8007c94 <rtems_task_delete> <== NOT EXECUTED
8006c30: e3 ff ff e8 bi 8006bd0 <rtems_termios_txdaemon+0x20> <== NOT EXECUTED
08006080 <rtems_termios_write>:
rtems_termios_puts (&c, 1, tty);
}
rtems_status_code
rtems_termios_write (void *arg)
{
8006080: 37 9c ff e4 addi sp,sp,-28
8006084: 5b 8b 00 1c sw (sp+28),r11
8006088: 5b 8c 00 18 sw (sp+24),r12
800608c: 5b 8d 00 14 sw (sp+20),r13
8006090: 5b 8e 00 10 sw (sp+16),r14
8006094: 5b 8f 00 0c sw (sp+12),r15
8006098: 5b 90 00 08 sw (sp+8),r16
800609c: 5b 9d 00 04 sw (sp+4),ra
80060a0: b8 20 68 00 mv r13,r1
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
80060a4: 28 21 00 00 lw r1,(r1+0)
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
80060a8: 34 02 00 00 mvi r2,0
80060ac: 34 03 00 00 mvi r3,0
rtems_status_code
rtems_termios_write (void *arg)
{
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
80060b0: 28 2b 00 38 lw r11,(r1+56)
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
80060b4: 29 61 00 18 lw r1,(r11+24)
80060b8: f8 00 06 0d calli 80078ec <rtems_semaphore_obtain>
80060bc: b8 20 70 00 mv r14,r1
if (sc != RTEMS_SUCCESSFUL)
80060c0: 5c 20 00 12 bne r1,r0,8006108 <rtems_termios_write+0x88> <== NEVER TAKEN
return sc;
if (rtems_termios_linesw[tty->t_line].l_write != NULL) {
80060c4: 29 64 00 cc lw r4,(r11+204)
80060c8: 78 01 08 02 mvhi r1,0x802
80060cc: 38 21 49 14 ori r1,r1,0x4914
80060d0: b4 84 20 00 add r4,r4,r4
80060d4: b4 84 20 00 add r4,r4,r4
80060d8: b4 84 20 00 add r4,r4,r4
80060dc: b4 84 20 00 add r4,r4,r4
80060e0: b4 84 20 00 add r4,r4,r4
80060e4: b4 24 20 00 add r4,r1,r4
80060e8: 28 83 00 0c lw r3,(r4+12)
80060ec: 44 6e 00 11 be r3,r14,8006130 <rtems_termios_write+0xb0>
sc = rtems_termios_linesw[tty->t_line].l_write(tty,args);
80060f0: b9 60 08 00 mv r1,r11
80060f4: b9 a0 10 00 mv r2,r13
80060f8: d8 60 00 00 call r3
80060fc: b8 20 70 00 mv r14,r1
rtems_semaphore_release (tty->osem);
8006100: 29 61 00 18 lw r1,(r11+24)
8006104: f8 00 06 56 calli 8007a5c <rtems_semaphore_release>
rtems_termios_puts (args->buffer, args->count, tty);
args->bytes_moved = args->count;
}
rtems_semaphore_release (tty->osem);
return sc;
}
8006108: b9 c0 08 00 mv r1,r14
800610c: 2b 9d 00 04 lw ra,(sp+4)
8006110: 2b 8b 00 1c lw r11,(sp+28)
8006114: 2b 8c 00 18 lw r12,(sp+24)
8006118: 2b 8d 00 14 lw r13,(sp+20)
800611c: 2b 8e 00 10 lw r14,(sp+16)
8006120: 2b 8f 00 0c lw r15,(sp+12)
8006124: 2b 90 00 08 lw r16,(sp+8)
8006128: 37 9c 00 1c addi sp,sp,28
800612c: c3 a0 00 00 ret
if (rtems_termios_linesw[tty->t_line].l_write != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_write(tty,args);
rtems_semaphore_release (tty->osem);
return sc;
}
if (tty->termios.c_oflag & OPOST) {
8006130: 29 61 00 34 lw r1,(r11+52)
8006134: 20 21 00 01 andi r1,r1,0x1
8006138: 44 20 00 11 be r1,r0,800617c <rtems_termios_write+0xfc> <== NEVER TAKEN
uint32_t count = args->count;
800613c: 29 af 00 14 lw r15,(r13+20)
char *buffer = args->buffer;
8006140: 29 b0 00 10 lw r16,(r13+16)
while (count--)
8006144: 34 01 00 00 mvi r1,0
8006148: 45 e0 00 09 be r15,r0,800616c <rtems_termios_write+0xec> <== NEVER TAKEN
800614c: 34 0c 00 00 mvi r12,0
}
rtems_termios_puts (&c, 1, tty);
}
rtems_status_code
rtems_termios_write (void *arg)
8006150: b6 0c 08 00 add r1,r16,r12
}
if (tty->termios.c_oflag & OPOST) {
uint32_t count = args->count;
char *buffer = args->buffer;
while (count--)
oproc (*buffer++, tty);
8006154: 40 21 00 00 lbu r1,(r1+0)
8006158: 35 8c 00 01 addi r12,r12,1
800615c: b9 60 10 00 mv r2,r11
8006160: fb ff fe 1d calli 80059d4 <oproc>
return sc;
}
if (tty->termios.c_oflag & OPOST) {
uint32_t count = args->count;
char *buffer = args->buffer;
while (count--)
8006164: 5d 8f ff fb bne r12,r15,8006150 <rtems_termios_write+0xd0>
oproc (*buffer++, tty);
args->bytes_moved = args->count;
} else {
rtems_termios_puts (args->buffer, args->count, tty);
args->bytes_moved = args->count;
8006168: 29 a1 00 14 lw r1,(r13+20)
800616c: 59 a1 00 1c sw (r13+28),r1
}
rtems_semaphore_release (tty->osem);
8006170: 29 61 00 18 lw r1,(r11+24)
8006174: f8 00 06 3a calli 8007a5c <rtems_semaphore_release>
return sc;
8006178: e3 ff ff e4 bi 8006108 <rtems_termios_write+0x88>
char *buffer = args->buffer;
while (count--)
oproc (*buffer++, tty);
args->bytes_moved = args->count;
} else {
rtems_termios_puts (args->buffer, args->count, tty);
800617c: 29 a1 00 10 lw r1,(r13+16) <== NOT EXECUTED
8006180: 29 a2 00 14 lw r2,(r13+20) <== NOT EXECUTED
8006184: b9 60 18 00 mv r3,r11 <== NOT EXECUTED
8006188: fb ff fd ba calli 8005870 <rtems_termios_puts> <== NOT EXECUTED
800618c: e3 ff ff f7 bi 8006168 <rtems_termios_write+0xe8> <== NOT EXECUTED
08013bf4 <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
8013bf4: 37 9c ff f8 addi sp,sp,-8
8013bf8: 5b 9d 00 04 sw (sp+4),ra
8013bfc: b8 20 10 00 mv r2,r1
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
8013c00: 78 01 08 04 mvhi r1,0x804
8013c04: 38 21 15 bc ori r1,r1,0x15bc
8013c08: 37 83 00 08 addi r3,sp,8
8013c0c: f8 00 0e a3 calli 8017698 <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
8013c10: 2b 82 00 08 lw r2,(sp+8)
8013c14: 44 40 00 05 be r2,r0,8013c28 <rtems_timer_cancel+0x34>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8013c18: 34 01 00 04 mvi r1,4
}
8013c1c: 2b 9d 00 04 lw ra,(sp+4)
8013c20: 37 9c 00 08 addi sp,sp,8
8013c24: c3 a0 00 00 ret
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
8013c28: 28 23 00 38 lw r3,(r1+56)
8013c2c: 34 02 00 04 mvi r2,4
8013c30: 44 62 00 03 be r3,r2,8013c3c <rtems_timer_cancel+0x48> <== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
8013c34: 34 21 00 10 addi r1,r1,16
8013c38: f8 00 18 81 calli 8019e3c <_Watchdog_Remove>
_Thread_Enable_dispatch();
8013c3c: f8 00 12 6e calli 80185f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8013c40: 34 01 00 00 mvi r1,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8013c44: 2b 9d 00 04 lw ra,(sp+4)
8013c48: 37 9c 00 08 addi sp,sp,8
8013c4c: c3 a0 00 00 ret
08014270 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
8014270: 37 9c ff dc addi sp,sp,-36
8014274: 5b 8b 00 20 sw (sp+32),r11
8014278: 5b 8c 00 1c sw (sp+28),r12
801427c: 5b 8d 00 18 sw (sp+24),r13
8014280: 5b 8e 00 14 sw (sp+20),r14
8014284: 5b 8f 00 10 sw (sp+16),r15
8014288: 5b 90 00 0c sw (sp+12),r16
801428c: 5b 91 00 08 sw (sp+8),r17
8014290: 5b 9d 00 04 sw (sp+4),ra
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
8014294: 78 05 08 04 mvhi r5,0x804
8014298: 38 a5 15 fc ori r5,r5,0x15fc
801429c: 28 ac 00 00 lw r12,(r5+0)
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
80142a0: b8 20 80 00 mv r16,r1
80142a4: b8 40 70 00 mv r14,r2
80142a8: b8 60 78 00 mv r15,r3
80142ac: b8 80 88 00 mv r17,r4
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
80142b0: 34 0b 00 0e mvi r11,14
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
80142b4: 45 80 00 0c be r12,r0,80142e4 <rtems_timer_server_fire_when+0x74>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
80142b8: 78 05 08 04 mvhi r5,0x804
80142bc: 38 a5 0c c0 ori r5,r5,0xcc0
80142c0: 40 a5 00 00 lbu r5,(r5+0)
return RTEMS_NOT_DEFINED;
80142c4: 34 0b 00 0b mvi r11,11
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
80142c8: 44 a0 00 07 be r5,r0,80142e4 <rtems_timer_server_fire_when+0x74><== NEVER TAKEN
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
80142cc: 34 0b 00 09 mvi r11,9
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
80142d0: 44 60 00 05 be r3,r0,80142e4 <rtems_timer_server_fire_when+0x74>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
80142d4: b8 40 08 00 mv r1,r2
80142d8: fb ff f0 af calli 8010594 <_TOD_Validate>
return RTEMS_INVALID_CLOCK;
80142dc: 34 0b 00 14 mvi r11,20
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
80142e0: 5c 20 00 0c bne r1,r0,8014310 <rtems_timer_server_fire_when+0xa0>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80142e4: b9 60 08 00 mv r1,r11
80142e8: 2b 9d 00 04 lw ra,(sp+4)
80142ec: 2b 8b 00 20 lw r11,(sp+32)
80142f0: 2b 8c 00 1c lw r12,(sp+28)
80142f4: 2b 8d 00 18 lw r13,(sp+24)
80142f8: 2b 8e 00 14 lw r14,(sp+20)
80142fc: 2b 8f 00 10 lw r15,(sp+16)
8014300: 2b 90 00 0c lw r16,(sp+12)
8014304: 2b 91 00 08 lw r17,(sp+8)
8014308: 37 9c 00 24 addi sp,sp,36
801430c: c3 a0 00 00 ret
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
8014310: b9 c0 08 00 mv r1,r14
if ( seconds <= _TOD_Seconds_since_epoch() )
8014314: 78 0d 08 04 mvhi r13,0x804
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
8014318: fb ff f0 46 calli 8010430 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
801431c: 39 ad 0d 58 ori r13,r13,0xd58
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
8014320: b8 20 70 00 mv r14,r1
if ( seconds <= _TOD_Seconds_since_epoch() )
8014324: 29 a1 00 00 lw r1,(r13+0)
8014328: 50 2e ff ef bgeu r1,r14,80142e4 <rtems_timer_server_fire_when+0x74>
801432c: 78 01 08 04 mvhi r1,0x804
8014330: 38 21 15 bc ori r1,r1,0x15bc
8014334: ba 00 10 00 mv r2,r16
8014338: 37 83 00 24 addi r3,sp,36
801433c: f8 00 0c d7 calli 8017698 <_Objects_Get>
8014340: b8 20 58 00 mv r11,r1
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
8014344: 2b 81 00 24 lw r1,(sp+36)
8014348: 44 20 00 03 be r1,r0,8014354 <rtems_timer_server_fire_when+0xe4>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
801434c: 34 0b 00 04 mvi r11,4
8014350: e3 ff ff e5 bi 80142e4 <rtems_timer_server_fire_when+0x74>
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
8014354: 35 61 00 10 addi r1,r11,16
8014358: f8 00 16 b9 calli 8019e3c <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
801435c: 29 a1 00 00 lw r1,(r13+0)
(*timer_server->schedule_operation)( timer_server, the_timer );
8014360: 29 83 00 04 lw r3,(r12+4)
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
8014364: 34 04 00 03 mvi r4,3
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
8014368: c9 c1 70 00 sub r14,r14,r1
(*timer_server->schedule_operation)( timer_server, the_timer );
801436c: b9 60 10 00 mv r2,r11
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
8014370: 59 64 00 38 sw (r11+56),r4
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
8014374: 59 6f 00 2c sw (r11+44),r15
the_watchdog->id = id;
8014378: 59 70 00 30 sw (r11+48),r16
the_watchdog->user_data = user_data;
801437c: 59 71 00 34 sw (r11+52),r17
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
8014380: 59 6e 00 1c sw (r11+28),r14
(*timer_server->schedule_operation)( timer_server, the_timer );
8014384: b9 80 08 00 mv r1,r12
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8014388: 59 60 00 18 sw (r11+24),r0
801438c: d8 60 00 00 call r3
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
8014390: 34 0b 00 00 mvi r11,0
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
(*timer_server->schedule_operation)( timer_server, the_timer );
_Thread_Enable_dispatch();
8014394: f8 00 10 98 calli 80185f4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8014398: e3 ff ff d3 bi 80142e4 <rtems_timer_server_fire_when+0x74>
080070a4 <rtems_verror>:
static int rtems_verror(
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
80070a4: 37 9c ff e4 addi sp,sp,-28
80070a8: 5b 8b 00 1c sw (sp+28),r11
80070ac: 5b 8c 00 18 sw (sp+24),r12
80070b0: 5b 8d 00 14 sw (sp+20),r13
80070b4: 5b 8e 00 10 sw (sp+16),r14
80070b8: 5b 8f 00 0c sw (sp+12),r15
80070bc: 5b 90 00 08 sw (sp+8),r16
80070c0: 5b 9d 00 04 sw (sp+4),ra
80070c4: b8 20 68 00 mv r13,r1
int local_errno = 0;
int chars_written = 0;
rtems_status_code status;
if (error_flag & RTEMS_ERROR_PANIC) {
80070c8: 78 01 20 00 mvhi r1,0x2000
80070cc: a1 a1 08 00 and r1,r13,r1
static int rtems_verror(
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
80070d0: b8 40 80 00 mv r16,r2
80070d4: b8 60 78 00 mv r15,r3
int local_errno = 0;
int chars_written = 0;
rtems_status_code status;
if (error_flag & RTEMS_ERROR_PANIC) {
80070d8: 44 20 00 10 be r1,r0,8007118 <rtems_verror+0x74>
if (rtems_panic_in_progress++)
80070dc: 78 04 08 02 mvhi r4,0x802
80070e0: 38 84 a8 a4 ori r4,r4,0xa8a4
80070e4: 28 81 00 00 lw r1,(r4+0)
80070e8: 34 25 00 01 addi r5,r1,1
80070ec: 58 85 00 00 sw (r4+0),r5
80070f0: 44 20 00 07 be r1,r0,800710c <rtems_verror+0x68> <== ALWAYS TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80070f4: 78 01 08 02 mvhi r1,0x802 <== NOT EXECUTED
80070f8: 38 21 aa 20 ori r1,r1,0xaa20 <== NOT EXECUTED
80070fc: 28 22 00 00 lw r2,(r1+0) <== NOT EXECUTED
8007100: 34 42 00 01 addi r2,r2,1 <== NOT EXECUTED
8007104: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
RTEMS_COMPILER_MEMORY_BARRIER();
8007108: 28 85 00 00 lw r5,(r4+0) <== NOT EXECUTED
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
800710c: 34 01 00 02 mvi r1,2
return 0;
8007110: 34 0c 00 00 mvi r12,0
if (error_flag & RTEMS_ERROR_PANIC) {
if (rtems_panic_in_progress++)
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
8007114: 48 a1 00 2b bg r5,r1,80071c0 <rtems_verror+0x11c> <== NEVER TAKEN
return 0;
}
(void) fflush(stdout); /* in case stdout/stderr same */
8007118: 78 0b 08 02 mvhi r11,0x802
800711c: 39 6b a2 38 ori r11,r11,0xa238
8007120: 29 61 00 00 lw r1,(r11+0)
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
int local_errno = 0;
8007124: 34 0e 00 00 mvi r14,0
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
return 0;
}
(void) fflush(stdout); /* in case stdout/stderr same */
8007128: 28 21 00 08 lw r1,(r1+8)
800712c: f8 00 34 3b calli 8014218 <fflush>
status = error_flag & ~RTEMS_ERROR_MASK;
8007130: 78 03 08 02 mvhi r3,0x802
8007134: 38 63 75 c4 ori r3,r3,0x75c4
8007138: 28 62 00 00 lw r2,(r3+0)
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
800713c: 78 01 40 00 mvhi r1,0x4000
8007140: a1 a1 08 00 and r1,r13,r1
return 0;
}
(void) fflush(stdout); /* in case stdout/stderr same */
status = error_flag & ~RTEMS_ERROR_MASK;
8007144: a1 a2 68 00 and r13,r13,r2
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
8007148: 5c 20 00 34 bne r1,r0,8007218 <rtems_verror+0x174>
#if defined(RTEMS_MULTIPROCESSING)
if (_System_state_Is_multiprocessing)
fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
800714c: 29 61 00 00 lw r1,(r11+0)
8007150: ba 00 10 00 mv r2,r16
8007154: b9 e0 18 00 mv r3,r15
8007158: 28 21 00 0c lw r1,(r1+12)
800715c: f8 00 4a e4 calli 8019cec <vfprintf>
8007160: b8 20 60 00 mv r12,r1
if (status)
8007164: 5d a0 00 21 bne r13,r0,80071e8 <rtems_verror+0x144>
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
if (local_errno) {
8007168: 45 c0 00 0d be r14,r0,800719c <rtems_verror+0xf8>
if ((local_errno > 0) && *strerror(local_errno))
800716c: 4c 0e 00 05 bge r0,r14,8007180 <rtems_verror+0xdc>
8007170: b9 c0 08 00 mv r1,r14
8007174: f8 00 39 01 calli 8015578 <strerror>
8007178: 40 21 00 00 lbu r1,(r1+0)
800717c: 5c 20 00 2a bne r1,r0,8007224 <rtems_verror+0x180> <== ALWAYS TAKEN
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
else
chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
8007180: 29 61 00 00 lw r1,(r11+0)
8007184: 78 02 08 02 mvhi r2,0x802
8007188: 38 42 72 a0 ori r2,r2,0x72a0
800718c: 28 21 00 0c lw r1,(r1+12)
8007190: b9 c0 18 00 mv r3,r14
8007194: f8 00 35 59 calli 80146f8 <fprintf>
8007198: b5 81 60 00 add r12,r12,r1
}
chars_written += fprintf(stderr, "\n");
800719c: 29 61 00 00 lw r1,(r11+0)
80071a0: 78 02 08 02 mvhi r2,0x802
80071a4: 38 42 69 e8 ori r2,r2,0x69e8
80071a8: 28 21 00 0c lw r1,(r1+12)
80071ac: f8 00 35 53 calli 80146f8 <fprintf>
(void) fflush(stderr);
80071b0: 29 62 00 00 lw r2,(r11+0)
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
else
chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
}
chars_written += fprintf(stderr, "\n");
80071b4: b4 2c 60 00 add r12,r1,r12
(void) fflush(stderr);
80071b8: 28 41 00 0c lw r1,(r2+12)
80071bc: f8 00 34 17 calli 8014218 <fflush>
return chars_written;
}
80071c0: b9 80 08 00 mv r1,r12
80071c4: 2b 9d 00 04 lw ra,(sp+4)
80071c8: 2b 8b 00 1c lw r11,(sp+28)
80071cc: 2b 8c 00 18 lw r12,(sp+24)
80071d0: 2b 8d 00 14 lw r13,(sp+20)
80071d4: 2b 8e 00 10 lw r14,(sp+16)
80071d8: 2b 8f 00 0c lw r15,(sp+12)
80071dc: 2b 90 00 08 lw r16,(sp+8)
80071e0: 37 9c 00 1c addi sp,sp,28
80071e4: c3 a0 00 00 ret
chars_written += vfprintf(stderr, printf_format, arglist);
if (status)
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
80071e8: 29 62 00 00 lw r2,(r11+0)
80071ec: b9 a0 08 00 mv r1,r13
80071f0: 28 4d 00 0c lw r13,(r2+12)
80071f4: fb ff ff a3 calli 8007080 <rtems_status_text>
80071f8: 78 02 08 02 mvhi r2,0x802
80071fc: b8 20 18 00 mv r3,r1
8007200: 38 42 72 80 ori r2,r2,0x7280
8007204: b9 a0 08 00 mv r1,r13
8007208: f8 00 35 3c calli 80146f8 <fprintf>
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
if (status)
chars_written +=
800720c: b5 81 60 00 add r12,r12,r1
fprintf(stderr, " (status: %s)", rtems_status_text(status));
if (local_errno) {
8007210: 45 c0 ff e3 be r14,r0,800719c <rtems_verror+0xf8>
8007214: e3 ff ff d6 bi 800716c <rtems_verror+0xc8>
(void) fflush(stdout); /* in case stdout/stderr same */
status = error_flag & ~RTEMS_ERROR_MASK;
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
local_errno = errno;
8007218: f8 00 32 ff calli 8013e14 <__errno>
800721c: 28 2e 00 00 lw r14,(r1+0)
8007220: e3 ff ff cb bi 800714c <rtems_verror+0xa8>
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
if (local_errno) {
if ((local_errno > 0) && *strerror(local_errno))
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
8007224: 29 62 00 00 lw r2,(r11+0)
8007228: b9 c0 08 00 mv r1,r14
800722c: 28 4d 00 0c lw r13,(r2+12)
8007230: f8 00 38 d2 calli 8015578 <strerror>
8007234: 78 02 08 02 mvhi r2,0x802
8007238: b8 20 18 00 mv r3,r1
800723c: 38 42 72 90 ori r2,r2,0x7290
8007240: b9 a0 08 00 mv r1,r13
8007244: f8 00 35 2d calli 80146f8 <fprintf>
8007248: b5 81 60 00 add r12,r12,r1
800724c: e3 ff ff d4 bi 800719c <rtems_verror+0xf8>
08001cbc <scanInt>:
/*
* Extract an integer value from the database
*/
static int
scanInt(FILE *fp, int *val)
{
8001cbc: 37 9c ff d4 addi sp,sp,-44
8001cc0: 5b 8b 00 2c sw (sp+44),r11
8001cc4: 5b 8c 00 28 sw (sp+40),r12
8001cc8: 5b 8d 00 24 sw (sp+36),r13
8001ccc: 5b 8e 00 20 sw (sp+32),r14
8001cd0: 5b 8f 00 1c sw (sp+28),r15
8001cd4: 5b 90 00 18 sw (sp+24),r16
8001cd8: 5b 91 00 14 sw (sp+20),r17
8001cdc: 5b 92 00 10 sw (sp+16),r18
8001ce0: 5b 93 00 0c sw (sp+12),r19
8001ce4: 5b 94 00 08 sw (sp+8),r20
8001ce8: 5b 9d 00 04 sw (sp+4),ra
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
8001cec: 78 03 08 01 mvhi r3,0x801
8001cf0: 38 63 51 dc ori r3,r3,0x51dc
8001cf4: 28 70 00 00 lw r16,(r3+0)
int sign = 0;
int d;
for (;;) {
c = getc(fp);
8001cf8: 78 13 08 01 mvhi r19,0x801
limit++;
continue;
}
sign = 1;
}
if (!isdigit(c))
8001cfc: 78 0e 08 01 mvhi r14,0x801
/*
* Extract an integer value from the database
*/
static int
scanInt(FILE *fp, int *val)
{
8001d00: b8 20 58 00 mv r11,r1
8001d04: b8 40 a0 00 mv r20,r2
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
int sign = 0;
8001d08: 34 0f 00 00 mvi r15,0
*/
static int
scanInt(FILE *fp, int *val)
{
int c;
unsigned int i = 0;
8001d0c: 34 0d 00 00 mvi r13,0
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
8001d10: 3a 73 61 c0 ori r19,r19,0x61c0
if (c == ':')
8001d14: 34 11 00 3a mvi r17,58
limit++;
continue;
}
sign = 1;
}
if (!isdigit(c))
8001d18: 39 ce 61 b8 ori r14,r14,0x61b8
for (;;) {
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
8001d1c: 34 12 00 2d mvi r18,45
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
8001d20: 29 63 00 04 lw r3,(r11+4)
8001d24: 34 63 ff ff addi r3,r3,-1
8001d28: 59 63 00 04 sw (r11+4),r3
8001d2c: 4c 60 00 1a bge r3,r0,8001d94 <scanInt+0xd8> <== ALWAYS TAKEN
8001d30: 2a 61 00 00 lw r1,(r19+0) <== NOT EXECUTED
8001d34: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8001d38: f8 00 37 02 calli 800f940 <__srget_r> <== NOT EXECUTED
8001d3c: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
if (c == ':')
8001d40: 45 91 00 1a be r12,r17,8001da8 <scanInt+0xec> <== NOT EXECUTED
break;
if (sign == 0) {
8001d44: 5d e0 00 03 bne r15,r0,8001d50 <scanInt+0x94>
if (c == '-') {
sign = -1;
limit++;
continue;
}
sign = 1;
8001d48: 34 0f 00 01 mvi r15,1
for (;;) {
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
8001d4c: 45 92 00 32 be r12,r18,8001e14 <scanInt+0x158> <== NEVER TAKEN
limit++;
continue;
}
sign = 1;
}
if (!isdigit(c))
8001d50: 29 c1 00 00 lw r1,(r14+0)
8001d54: b4 2c 08 00 add r1,r1,r12
8001d58: 40 21 00 01 lbu r1,(r1+1)
8001d5c: 20 21 00 04 andi r1,r1,0x4
8001d60: 44 20 00 1f be r1,r0,8001ddc <scanInt+0x120>
return 0;
d = c - '0';
if ((i > (limit / 10))
8001d64: ba 00 08 00 mv r1,r16
8001d68: 34 02 00 0a mvi r2,10
8001d6c: f8 00 48 ab calli 8014018 <__udivsi3>
8001d70: 55 a1 00 1b bgu r13,r1,8001ddc <scanInt+0x120>
}
sign = 1;
}
if (!isdigit(c))
return 0;
d = c - '0';
8001d74: 35 8c ff d0 addi r12,r12,-48
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
8001d78: 45 a1 00 14 be r13,r1,8001dc8 <scanInt+0x10c>
return 0;
i = i * 10 + d;
8001d7c: b5 ad 68 00 add r13,r13,r13
8001d80: b5 ad 18 00 add r3,r13,r13
8001d84: b4 63 18 00 add r3,r3,r3
8001d88: b5 a3 68 00 add r13,r13,r3
8001d8c: b5 8d 68 00 add r13,r12,r13
8001d90: e3 ff ff e4 bi 8001d20 <scanInt+0x64>
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
8001d94: 29 63 00 00 lw r3,(r11+0)
8001d98: 40 6c 00 00 lbu r12,(r3+0)
8001d9c: 34 61 00 01 addi r1,r3,1
8001da0: 59 61 00 00 sw (r11+0),r1
if (c == ':')
8001da4: 5d 91 ff e8 bne r12,r17,8001d44 <scanInt+0x88>
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
i = i * 10 + d;
}
if (sign == 0)
return 0;
8001da8: 34 01 00 00 mvi r1,0
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
i = i * 10 + d;
}
if (sign == 0)
8001dac: 45 e0 00 0d be r15,r0,8001de0 <scanInt+0x124> <== NEVER TAKEN
return 0;
*val = i * sign;
8001db0: b9 e0 08 00 mv r1,r15
8001db4: b9 a0 10 00 mv r2,r13
8001db8: f8 00 48 33 calli 8013e84 <__mulsi3>
8001dbc: 5a 81 00 00 sw (r20+0),r1
return 1;
8001dc0: 34 01 00 01 mvi r1,1
8001dc4: e0 00 00 07 bi 8001de0 <scanInt+0x124>
}
if (!isdigit(c))
return 0;
d = c - '0';
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
8001dc8: ba 00 08 00 mv r1,r16
8001dcc: 34 02 00 0a mvi r2,10
8001dd0: f8 00 48 a2 calli 8014058 <__umodsi3>
8001dd4: 55 81 00 02 bgu r12,r1,8001ddc <scanInt+0x120> <== ALWAYS TAKEN
8001dd8: e3 ff ff e9 bi 8001d7c <scanInt+0xc0> <== NOT EXECUTED
return 0;
8001ddc: 34 01 00 00 mvi r1,0
}
if (sign == 0)
return 0;
*val = i * sign;
return 1;
}
8001de0: 2b 9d 00 04 lw ra,(sp+4)
8001de4: 2b 8b 00 2c lw r11,(sp+44)
8001de8: 2b 8c 00 28 lw r12,(sp+40)
8001dec: 2b 8d 00 24 lw r13,(sp+36)
8001df0: 2b 8e 00 20 lw r14,(sp+32)
8001df4: 2b 8f 00 1c lw r15,(sp+28)
8001df8: 2b 90 00 18 lw r16,(sp+24)
8001dfc: 2b 91 00 14 lw r17,(sp+20)
8001e00: 2b 92 00 10 lw r18,(sp+16)
8001e04: 2b 93 00 0c lw r19,(sp+12)
8001e08: 2b 94 00 08 lw r20,(sp+8)
8001e0c: 37 9c 00 2c addi sp,sp,44
8001e10: c3 a0 00 00 ret
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
sign = -1;
limit++;
8001e14: 36 10 00 01 addi r16,r16,1
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
sign = -1;
8001e18: 34 0f ff ff mvi r15,-1
limit++;
continue;
8001e1c: e3 ff ff c1 bi 8001d20 <scanInt+0x64>
08001e20 <scanString>:
/*
* Extract a string value from the database
*/
static int
scanString(FILE *fp, char **name, char **bufp, size_t *nleft, int nlFlag)
{
8001e20: 37 9c ff d8 addi sp,sp,-40
8001e24: 5b 8b 00 28 sw (sp+40),r11
8001e28: 5b 8c 00 24 sw (sp+36),r12
8001e2c: 5b 8d 00 20 sw (sp+32),r13
8001e30: 5b 8e 00 1c sw (sp+28),r14
8001e34: 5b 8f 00 18 sw (sp+24),r15
8001e38: 5b 90 00 14 sw (sp+20),r16
8001e3c: 5b 91 00 10 sw (sp+16),r17
8001e40: 5b 92 00 0c sw (sp+12),r18
8001e44: 5b 93 00 08 sw (sp+8),r19
8001e48: 5b 9d 00 04 sw (sp+4),ra
8001e4c: b8 60 58 00 mv r11,r3
int c;
*name = *bufp;
8001e50: 28 63 00 00 lw r3,(r3+0)
for (;;) {
c = getc(fp);
8001e54: 78 12 08 01 mvhi r18,0x801
/*
* Extract a string value from the database
*/
static int
scanString(FILE *fp, char **name, char **bufp, size_t *nleft, int nlFlag)
{
8001e58: b8 20 60 00 mv r12,r1
8001e5c: b8 80 68 00 mv r13,r4
8001e60: b8 a0 98 00 mv r19,r5
int c;
*name = *bufp;
8001e64: 58 43 00 00 sw (r2+0),r3
for (;;) {
c = getc(fp);
8001e68: 3a 52 61 c0 ori r18,r18,0x61c0
if (c == ':') {
8001e6c: 34 0e 00 3a mvi r14,58
if (nlFlag)
return 0;
break;
}
if (c == '\n') {
8001e70: 34 0f 00 0a mvi r15,10
if (!nlFlag)
return 0;
break;
}
if (c == EOF)
8001e74: 34 10 ff ff mvi r16,-1
return 0;
if (*nleft < 2)
8001e78: 34 11 00 01 mvi r17,1
{
int c;
*name = *bufp;
for (;;) {
c = getc(fp);
8001e7c: 29 81 00 04 lw r1,(r12+4)
8001e80: 34 21 ff ff addi r1,r1,-1
8001e84: 59 81 00 04 sw (r12+4),r1
8001e88: 4c 20 00 12 bge r1,r0,8001ed0 <scanString+0xb0>
8001e8c: 2a 41 00 00 lw r1,(r18+0)
8001e90: b9 80 10 00 mv r2,r12
8001e94: f8 00 36 ab calli 800f940 <__srget_r>
if (c == ':') {
8001e98: 44 2e 00 13 be r1,r14,8001ee4 <scanString+0xc4> <== NEVER TAKEN
if (nlFlag)
return 0;
break;
}
if (c == '\n') {
8001e9c: 44 2f 00 2b be r1,r15,8001f48 <scanString+0x128>
if (!nlFlag)
return 0;
break;
}
if (c == EOF)
8001ea0: 44 30 00 1d be r1,r16,8001f14 <scanString+0xf4>
return 0;
if (*nleft < 2)
8001ea4: 29 a2 00 00 lw r2,(r13+0)
8001ea8: 52 22 00 1b bgeu r17,r2,8001f14 <scanString+0xf4>
return 0;
**bufp = c;
8001eac: 29 62 00 00 lw r2,(r11+0)
8001eb0: 30 41 00 00 sb (r2+0),r1
++(*bufp);
8001eb4: 29 62 00 00 lw r2,(r11+0)
--(*nleft);
8001eb8: 29 a1 00 00 lw r1,(r13+0)
if (c == EOF)
return 0;
if (*nleft < 2)
return 0;
**bufp = c;
++(*bufp);
8001ebc: 34 42 00 01 addi r2,r2,1
8001ec0: 59 62 00 00 sw (r11+0),r2
--(*nleft);
8001ec4: 34 21 ff ff addi r1,r1,-1
8001ec8: 59 a1 00 00 sw (r13+0),r1
}
8001ecc: e3 ff ff ec bi 8001e7c <scanString+0x5c>
{
int c;
*name = *bufp;
for (;;) {
c = getc(fp);
8001ed0: 29 81 00 00 lw r1,(r12+0)
8001ed4: 34 22 00 01 addi r2,r1,1
8001ed8: 40 21 00 00 lbu r1,(r1+0)
8001edc: 59 82 00 00 sw (r12+0),r2
if (c == ':') {
8001ee0: 5c 2e ff ef bne r1,r14,8001e9c <scanString+0x7c>
if (nlFlag)
return 0;
8001ee4: 34 01 00 00 mvi r1,0
*name = *bufp;
for (;;) {
c = getc(fp);
if (c == ':') {
if (nlFlag)
8001ee8: 5e 60 00 0c bne r19,r0,8001f18 <scanString+0xf8>
return 0;
**bufp = c;
++(*bufp);
--(*nleft);
}
**bufp = '\0';
8001eec: 29 62 00 00 lw r2,(r11+0)
++(*bufp);
--(*nleft);
return 1;
8001ef0: 34 01 00 01 mvi r1,1
return 0;
**bufp = c;
++(*bufp);
--(*nleft);
}
**bufp = '\0';
8001ef4: 30 40 00 00 sb (r2+0),r0
++(*bufp);
8001ef8: 29 63 00 00 lw r3,(r11+0)
--(*nleft);
8001efc: 29 a2 00 00 lw r2,(r13+0)
**bufp = c;
++(*bufp);
--(*nleft);
}
**bufp = '\0';
++(*bufp);
8001f00: 34 63 00 01 addi r3,r3,1
8001f04: 59 63 00 00 sw (r11+0),r3
--(*nleft);
8001f08: 34 42 ff ff addi r2,r2,-1
8001f0c: 59 a2 00 00 sw (r13+0),r2
return 1;
8001f10: e0 00 00 02 bi 8001f18 <scanString+0xf8>
break;
}
if (c == EOF)
return 0;
if (*nleft < 2)
return 0;
8001f14: 34 01 00 00 mvi r1,0
}
**bufp = '\0';
++(*bufp);
--(*nleft);
return 1;
}
8001f18: 2b 9d 00 04 lw ra,(sp+4)
8001f1c: 2b 8b 00 28 lw r11,(sp+40)
8001f20: 2b 8c 00 24 lw r12,(sp+36)
8001f24: 2b 8d 00 20 lw r13,(sp+32)
8001f28: 2b 8e 00 1c lw r14,(sp+28)
8001f2c: 2b 8f 00 18 lw r15,(sp+24)
8001f30: 2b 90 00 14 lw r16,(sp+20)
8001f34: 2b 91 00 10 lw r17,(sp+16)
8001f38: 2b 92 00 0c lw r18,(sp+12)
8001f3c: 2b 93 00 08 lw r19,(sp+8)
8001f40: 37 9c 00 28 addi sp,sp,40
8001f44: c3 a0 00 00 ret
return 0;
break;
}
if (c == '\n') {
if (!nlFlag)
return 0;
8001f48: 34 01 00 00 mvi r1,0
if (nlFlag)
return 0;
break;
}
if (c == '\n') {
if (!nlFlag)
8001f4c: 5e 60 ff e8 bne r19,r0,8001eec <scanString+0xcc>
8001f50: e3 ff ff f2 bi 8001f18 <scanString+0xf8>
08001f54 <scangr>:
FILE *fp,
struct group *grp,
char *buffer,
size_t bufsize
)
{
8001f54: 37 9c ff d8 addi sp,sp,-40
8001f58: 5b 8b 00 18 sw (sp+24),r11
8001f5c: 5b 8c 00 14 sw (sp+20),r12
8001f60: 5b 8d 00 10 sw (sp+16),r13
8001f64: 5b 8e 00 0c sw (sp+12),r14
8001f68: 5b 8f 00 08 sw (sp+8),r15
8001f6c: 5b 9d 00 04 sw (sp+4),ra
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
8001f70: 37 8c 00 20 addi r12,sp,32
8001f74: 37 8b 00 1c addi r11,sp,28
FILE *fp,
struct group *grp,
char *buffer,
size_t bufsize
)
{
8001f78: 5b 83 00 20 sw (sp+32),r3
8001f7c: 5b 84 00 1c sw (sp+28),r4
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
8001f80: b9 80 18 00 mv r3,r12
8001f84: b9 60 20 00 mv r4,r11
8001f88: 34 05 00 00 mvi r5,0
FILE *fp,
struct group *grp,
char *buffer,
size_t bufsize
)
{
8001f8c: b8 20 70 00 mv r14,r1
8001f90: b8 40 78 00 mv r15,r2
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
8001f94: fb ff ff a3 calli 8001e20 <scanString>
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
|| !scanInt(fp, &grgid)
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
return 0;
8001f98: 34 0d 00 00 mvi r13,0
{
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
8001f9c: 5c 20 00 0a bne r1,r0,8001fc4 <scangr+0x70>
grp->gr_mem[memcount++] = cp + 1;
}
}
grp->gr_mem[memcount] = NULL;
return 1;
}
8001fa0: b9 a0 08 00 mv r1,r13
8001fa4: 2b 9d 00 04 lw ra,(sp+4)
8001fa8: 2b 8b 00 18 lw r11,(sp+24)
8001fac: 2b 8c 00 14 lw r12,(sp+20)
8001fb0: 2b 8d 00 10 lw r13,(sp+16)
8001fb4: 2b 8e 00 0c lw r14,(sp+12)
8001fb8: 2b 8f 00 08 lw r15,(sp+8)
8001fbc: 37 9c 00 28 addi sp,sp,40
8001fc0: c3 a0 00 00 ret
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
8001fc4: b9 c0 08 00 mv r1,r14
8001fc8: 35 e2 00 04 addi r2,r15,4
8001fcc: b9 80 18 00 mv r3,r12
8001fd0: b9 60 20 00 mv r4,r11
8001fd4: 34 05 00 00 mvi r5,0
8001fd8: fb ff ff 92 calli 8001e20 <scanString>
8001fdc: 44 20 ff f1 be r1,r0,8001fa0 <scangr+0x4c> <== NEVER TAKEN
|| !scanInt(fp, &grgid)
8001fe0: b9 c0 08 00 mv r1,r14
8001fe4: 37 82 00 28 addi r2,sp,40
8001fe8: fb ff ff 35 calli 8001cbc <scanInt>
8001fec: 44 20 ff ed be r1,r0,8001fa0 <scangr+0x4c> <== NEVER TAKEN
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
8001ff0: b9 c0 08 00 mv r1,r14
8001ff4: 37 82 00 24 addi r2,sp,36
8001ff8: b9 80 18 00 mv r3,r12
8001ffc: b9 60 20 00 mv r4,r11
8002000: 34 05 00 01 mvi r5,1
8002004: fb ff ff 87 calli 8001e20 <scanString>
8002008: 44 20 ff e6 be r1,r0,8001fa0 <scangr+0x4c> <== NEVER TAKEN
return 0;
grp->gr_gid = grgid;
800200c: 2b 81 00 28 lw r1,(sp+40)
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8002010: 2b 85 00 24 lw r5,(sp+36)
8002014: 34 03 00 17 mvi r3,23
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
|| !scanInt(fp, &grgid)
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
return 0;
grp->gr_gid = grgid;
8002018: 0d e1 00 08 sh (r15+8),r1
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
800201c: 40 a1 00 00 lbu r1,(r5+0)
8002020: 44 20 00 0c be r1,r0,8002050 <scangr+0xfc> <== NEVER TAKEN
8002024: b8 a0 10 00 mv r2,r5
8002028: 34 03 00 01 mvi r3,1
800202c: 34 42 00 01 addi r2,r2,1
if(*cp == ',')
memcount++;
8002030: 64 24 00 2c cmpei r4,r1,44
grp->gr_gid = grgid;
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8002034: 40 41 00 00 lbu r1,(r2+0)
if(*cp == ',')
memcount++;
8002038: b4 64 18 00 add r3,r3,r4
grp->gr_gid = grgid;
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
800203c: 5c 20 ff fc bne r1,r0,800202c <scangr+0xd8>
8002040: 34 63 00 01 addi r3,r3,1
8002044: b4 63 18 00 add r3,r3,r3
8002048: b4 63 18 00 add r3,r3,r3
800204c: 34 63 00 0f addi r3,r3,15
}
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
8002050: 2b 81 00 1c lw r1,(sp+28)
return 0;
8002054: 34 0d 00 00 mvi r13,0
}
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
8002058: 54 61 ff d2 bgu r3,r1,8001fa0 <scangr+0x4c> <== NEVER TAKEN
return 0;
grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15);
800205c: 2b 84 00 20 lw r4,(sp+32)
8002060: 34 01 ff f0 mvi r1,-16
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8002064: 34 03 00 04 mvi r3,4
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
return 0;
grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15);
8002068: 34 84 00 0f addi r4,r4,15
800206c: a0 81 20 00 and r4,r4,r1
8002070: 59 e4 00 0c sw (r15+12),r4
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
8002074: 58 85 00 00 sw (r4+0),r5
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8002078: 2b 81 00 24 lw r1,(sp+36)
800207c: 40 22 00 00 lbu r2,(r1+0)
8002080: 44 40 00 0b be r2,r0,80020ac <scangr+0x158> <== NEVER TAKEN
}
/*
* Extract a single group record from the database
*/
static int scangr(
8002084: 34 21 00 01 addi r1,r1,1
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8002088: 34 03 00 01 mvi r3,1
if(*cp == ',') {
800208c: 34 04 00 2c mvi r4,44
8002090: 44 44 00 0b be r2,r4,80020bc <scangr+0x168>
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8002094: 40 22 00 00 lbu r2,(r1+0)
8002098: 34 21 00 01 addi r1,r1,1
800209c: 5c 40 ff fd bne r2,r0,8002090 <scangr+0x13c>
80020a0: 29 e4 00 0c lw r4,(r15+12)
80020a4: b4 63 18 00 add r3,r3,r3
80020a8: b4 63 18 00 add r3,r3,r3
if(*cp == ',') {
*cp = '\0';
grp->gr_mem[memcount++] = cp + 1;
}
}
grp->gr_mem[memcount] = NULL;
80020ac: b4 83 18 00 add r3,r4,r3
80020b0: 58 60 00 00 sw (r3+0),r0
return 1;
80020b4: 34 0d 00 01 mvi r13,1
80020b8: e3 ff ff ba bi 8001fa0 <scangr+0x4c>
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
if(*cp == ',') {
*cp = '\0';
80020bc: 30 20 ff ff sb (r1+-1),r0
grp->gr_mem[memcount++] = cp + 1;
80020c0: 29 e5 00 0c lw r5,(r15+12)
80020c4: b4 63 10 00 add r2,r3,r3
80020c8: b4 42 10 00 add r2,r2,r2
80020cc: b4 a2 10 00 add r2,r5,r2
80020d0: 58 41 00 00 sw (r2+0),r1
80020d4: 34 63 00 01 addi r3,r3,1
80020d8: e3 ff ff ef bi 8002094 <scangr+0x140>
080020dc <scanpw>:
FILE *fp,
struct passwd *pwd,
char *buffer,
size_t bufsize
)
{
80020dc: 37 9c ff d8 addi sp,sp,-40
80020e0: 5b 8b 00 18 sw (sp+24),r11
80020e4: 5b 8c 00 14 sw (sp+20),r12
80020e8: 5b 8d 00 10 sw (sp+16),r13
80020ec: 5b 8e 00 0c sw (sp+12),r14
80020f0: 5b 8f 00 08 sw (sp+8),r15
80020f4: 5b 9d 00 04 sw (sp+4),ra
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
80020f8: 37 8c 00 20 addi r12,sp,32
80020fc: 37 8b 00 1c addi r11,sp,28
FILE *fp,
struct passwd *pwd,
char *buffer,
size_t bufsize
)
{
8002100: 5b 83 00 20 sw (sp+32),r3
8002104: 5b 84 00 1c sw (sp+28),r4
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
8002108: b9 80 18 00 mv r3,r12
800210c: b9 60 20 00 mv r4,r11
8002110: 34 05 00 00 mvi r5,0
FILE *fp,
struct passwd *pwd,
char *buffer,
size_t bufsize
)
{
8002114: b8 20 68 00 mv r13,r1
8002118: b8 40 70 00 mv r14,r2
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
800211c: fb ff ff 41 calli 8001e20 <scanString>
|| !scanInt(fp, &pwgid)
|| !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
return 0;
8002120: 34 0f 00 00 mvi r15,0
size_t bufsize
)
{
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
8002124: 5c 20 00 0a bne r1,r0,800214c <scanpw+0x70>
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
return 0;
pwd->pw_uid = pwuid;
pwd->pw_gid = pwgid;
return 1;
}
8002128: b9 e0 08 00 mv r1,r15
800212c: 2b 9d 00 04 lw ra,(sp+4)
8002130: 2b 8b 00 18 lw r11,(sp+24)
8002134: 2b 8c 00 14 lw r12,(sp+20)
8002138: 2b 8d 00 10 lw r13,(sp+16)
800213c: 2b 8e 00 0c lw r14,(sp+12)
8002140: 2b 8f 00 08 lw r15,(sp+8)
8002144: 37 9c 00 28 addi sp,sp,40
8002148: c3 a0 00 00 ret
)
{
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0)
800214c: b9 a0 08 00 mv r1,r13
8002150: 35 c2 00 04 addi r2,r14,4
8002154: b9 80 18 00 mv r3,r12
8002158: b9 60 20 00 mv r4,r11
800215c: 34 05 00 00 mvi r5,0
8002160: fb ff ff 30 calli 8001e20 <scanString>
8002164: 44 20 ff f1 be r1,r0,8002128 <scanpw+0x4c> <== NEVER TAKEN
|| !scanInt(fp, &pwuid)
8002168: b9 a0 08 00 mv r1,r13
800216c: 37 82 00 28 addi r2,sp,40
8002170: fb ff fe d3 calli 8001cbc <scanInt>
8002174: 44 20 ff ed be r1,r0,8002128 <scanpw+0x4c>
|| !scanInt(fp, &pwgid)
8002178: b9 a0 08 00 mv r1,r13
800217c: 37 82 00 24 addi r2,sp,36
8002180: fb ff fe cf calli 8001cbc <scanInt>
8002184: 44 20 ff e9 be r1,r0,8002128 <scanpw+0x4c>
|| !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
8002188: b9 a0 08 00 mv r1,r13
800218c: 35 c2 00 0c addi r2,r14,12
8002190: b9 80 18 00 mv r3,r12
8002194: b9 60 20 00 mv r4,r11
8002198: 34 05 00 00 mvi r5,0
800219c: fb ff ff 21 calli 8001e20 <scanString>
80021a0: 44 20 ff e2 be r1,r0,8002128 <scanpw+0x4c> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
80021a4: b9 a0 08 00 mv r1,r13
80021a8: 35 c2 00 10 addi r2,r14,16
80021ac: b9 80 18 00 mv r3,r12
80021b0: b9 60 20 00 mv r4,r11
80021b4: 34 05 00 00 mvi r5,0
80021b8: fb ff ff 1a calli 8001e20 <scanString>
80021bc: 44 20 ff db be r1,r0,8002128 <scanpw+0x4c> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
80021c0: b9 a0 08 00 mv r1,r13
80021c4: 35 c2 00 14 addi r2,r14,20
80021c8: b9 80 18 00 mv r3,r12
80021cc: b9 60 20 00 mv r4,r11
80021d0: 34 05 00 00 mvi r5,0
80021d4: fb ff ff 13 calli 8001e20 <scanString>
80021d8: 44 20 ff d4 be r1,r0,8002128 <scanpw+0x4c> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
80021dc: b9 a0 08 00 mv r1,r13
80021e0: 35 c2 00 18 addi r2,r14,24
80021e4: b9 80 18 00 mv r3,r12
80021e8: b9 60 20 00 mv r4,r11
80021ec: 34 05 00 01 mvi r5,1
80021f0: fb ff ff 0c calli 8001e20 <scanString>
80021f4: 44 20 ff cd be r1,r0,8002128 <scanpw+0x4c>
return 0;
pwd->pw_uid = pwuid;
80021f8: 2b 81 00 28 lw r1,(sp+40)
pwd->pw_gid = pwgid;
return 1;
80021fc: 34 0f 00 01 mvi r15,1
|| !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
return 0;
pwd->pw_uid = pwuid;
8002200: 0d c1 00 08 sh (r14+8),r1
pwd->pw_gid = pwgid;
8002204: 2b 81 00 24 lw r1,(sp+36)
8002208: 0d c1 00 0a sh (r14+10),r1
return 1;
800220c: e3 ff ff c7 bi 8002128 <scanpw+0x4c>
08003d1c <sched_get_priority_max>:
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
8003d1c: 37 9c ff fc addi sp,sp,-4
8003d20: 5b 9d 00 04 sw (sp+4),ra
switch ( policy ) {
8003d24: 48 01 00 05 bg r0,r1,8003d38 <sched_get_priority_max+0x1c>
8003d28: 34 02 00 02 mvi r2,2
8003d2c: 4c 41 00 08 bge r2,r1,8003d4c <sched_get_priority_max+0x30>
8003d30: 34 02 00 04 mvi r2,4
8003d34: 44 22 00 06 be r1,r2,8003d4c <sched_get_priority_max+0x30> <== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8003d38: f8 00 27 cc calli 800dc68 <__errno>
8003d3c: 34 02 00 16 mvi r2,22
8003d40: 58 22 00 00 sw (r1+0),r2
8003d44: 34 01 ff ff mvi r1,-1
8003d48: e0 00 00 05 bi 8003d5c <sched_get_priority_max+0x40>
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
8003d4c: 78 01 08 01 mvhi r1,0x801
8003d50: 38 21 f0 e4 ori r1,r1,0xf0e4
8003d54: 40 21 00 00 lbu r1,(r1+0)
8003d58: 34 21 ff ff addi r1,r1,-1
}
8003d5c: 2b 9d 00 04 lw ra,(sp+4)
8003d60: 37 9c 00 04 addi sp,sp,4
8003d64: c3 a0 00 00 ret
08003d68 <sched_get_priority_min>:
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
8003d68: 37 9c ff fc addi sp,sp,-4
8003d6c: 5b 9d 00 04 sw (sp+4),ra
switch ( policy ) {
8003d70: 48 01 00 05 bg r0,r1,8003d84 <sched_get_priority_min+0x1c>
8003d74: 34 02 00 02 mvi r2,2
8003d78: 4c 41 00 08 bge r2,r1,8003d98 <sched_get_priority_min+0x30><== ALWAYS TAKEN
8003d7c: 34 02 00 04 mvi r2,4 <== NOT EXECUTED
8003d80: 44 22 00 06 be r1,r2,8003d98 <sched_get_priority_min+0x30> <== NOT EXECUTED
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8003d84: f8 00 27 b9 calli 800dc68 <__errno>
8003d88: 34 02 00 16 mvi r2,22
8003d8c: 58 22 00 00 sw (r1+0),r2
8003d90: 34 01 ff ff mvi r1,-1
8003d94: e0 00 00 02 bi 8003d9c <sched_get_priority_min+0x34>
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
8003d98: 34 01 00 01 mvi r1,1
}
8003d9c: 2b 9d 00 04 lw ra,(sp+4)
8003da0: 37 9c 00 04 addi sp,sp,4
8003da4: c3 a0 00 00 ret
08003da8 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
8003da8: 37 9c ff f4 addi sp,sp,-12
8003dac: 5b 8b 00 08 sw (sp+8),r11
8003db0: 5b 9d 00 04 sw (sp+4),ra
8003db4: b8 20 58 00 mv r11,r1
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
8003db8: 5c 20 00 0b bne r1,r0,8003de4 <sched_rr_get_interval+0x3c> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ESRCH );
if ( !interval )
8003dbc: 44 40 00 13 be r2,r0,8003e08 <sched_rr_get_interval+0x60>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
8003dc0: 78 01 08 01 mvhi r1,0x801
8003dc4: 38 21 f7 f0 ori r1,r1,0xf7f0
8003dc8: 28 21 00 00 lw r1,(r1+0)
8003dcc: f8 00 0e 6c calli 800777c <_Timespec_From_ticks>
return 0;
8003dd0: 34 01 00 00 mvi r1,0
}
8003dd4: 2b 9d 00 04 lw ra,(sp+4)
8003dd8: 2b 8b 00 08 lw r11,(sp+8)
8003ddc: 37 9c 00 0c addi sp,sp,12
8003de0: c3 a0 00 00 ret
{
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
8003de4: 5b 82 00 0c sw (sp+12),r2
8003de8: fb ff f8 21 calli 8001e6c <getpid>
8003dec: 2b 82 00 0c lw r2,(sp+12)
8003df0: 44 2b ff f3 be r1,r11,8003dbc <sched_rr_get_interval+0x14>
rtems_set_errno_and_return_minus_one( ESRCH );
8003df4: f8 00 27 9d calli 800dc68 <__errno>
8003df8: 34 02 00 03 mvi r2,3
8003dfc: 58 22 00 00 sw (r1+0),r2
8003e00: 34 01 ff ff mvi r1,-1
8003e04: e3 ff ff f4 bi 8003dd4 <sched_rr_get_interval+0x2c>
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
8003e08: f8 00 27 98 calli 800dc68 <__errno>
8003e0c: 34 02 00 16 mvi r2,22
8003e10: 58 22 00 00 sw (r1+0),r2
8003e14: 34 01 ff ff mvi r1,-1
8003e18: e3 ff ff ef bi 8003dd4 <sched_rr_get_interval+0x2c>
08006190 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
8006190: 37 9c ff c0 addi sp,sp,-64
8006194: 5b 8b 00 18 sw (sp+24),r11
8006198: 5b 8c 00 14 sw (sp+20),r12
800619c: 5b 8d 00 10 sw (sp+16),r13
80061a0: 5b 8e 00 0c sw (sp+12),r14
80061a4: 5b 8f 00 08 sw (sp+8),r15
80061a8: 5b 9d 00 04 sw (sp+4),ra
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80061ac: 78 09 08 02 mvhi r9,0x802
80061b0: 39 29 4a 50 ori r9,r9,0x4a50
80061b4: 29 2a 00 00 lw r10,(r9+0)
80061b8: b8 20 70 00 mv r14,r1
80061bc: 5b 82 00 28 sw (sp+40),r2
80061c0: 35 41 00 01 addi r1,r10,1
80061c4: 5b 83 00 2c sw (sp+44),r3
80061c8: 5b 84 00 30 sw (sp+48),r4
80061cc: 5b 85 00 34 sw (sp+52),r5
80061d0: 5b 86 00 38 sw (sp+56),r6
80061d4: 5b 87 00 3c sw (sp+60),r7
80061d8: 5b 88 00 40 sw (sp+64),r8
80061dc: b8 40 60 00 mv r12,r2
80061e0: 59 21 00 00 sw (r9+0),r1
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
80061e4: 20 4d 02 00 andi r13,r2,0x200
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
80061e8: 34 0f 00 00 mvi r15,0
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
80061ec: 5d a0 00 2d bne r13,r0,80062a0 <sem_open+0x110>
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
va_end(arg);
}
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
80061f0: b9 c0 08 00 mv r1,r14
80061f4: 37 82 00 24 addi r2,sp,36
80061f8: f8 00 1b fa calli 800d1e0 <_POSIX_Semaphore_Name_to_id>
80061fc: b8 20 58 00 mv r11,r1
* and we can just return a pointer to the id. Otherwise we may
* need to check to see if this is a "semaphore does not exist"
* or some other miscellaneous error on the name.
*/
if ( status ) {
8006200: 44 20 00 10 be r1,r0,8006240 <sem_open+0xb0>
/*
* Unless provided a valid name that did not already exist
* and we are willing to create then it is an error.
*/
if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
8006204: 34 01 00 02 mvi r1,2
8006208: 5d 61 00 02 bne r11,r1,8006210 <sem_open+0x80> <== NEVER TAKEN
800620c: 5d a0 00 27 bne r13,r0,80062a8 <sem_open+0x118>
_Thread_Enable_dispatch();
8006210: f8 00 0b 15 calli 8008e64 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
8006214: f8 00 2b cd calli 8011148 <__errno>
8006218: 58 2b 00 00 sw (r1+0),r11
800621c: 34 01 ff ff mvi r1,-1
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
#endif
return id;
}
8006220: 2b 9d 00 04 lw ra,(sp+4)
8006224: 2b 8b 00 18 lw r11,(sp+24)
8006228: 2b 8c 00 14 lw r12,(sp+20)
800622c: 2b 8d 00 10 lw r13,(sp+16)
8006230: 2b 8e 00 0c lw r14,(sp+12)
8006234: 2b 8f 00 08 lw r15,(sp+8)
8006238: 37 9c 00 40 addi sp,sp,64
800623c: c3 a0 00 00 ret
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
8006240: 21 8c 0a 00 andi r12,r12,0xa00
8006244: 34 01 0a 00 mvi r1,2560
8006248: 45 81 00 22 be r12,r1,80062d0 <sem_open+0x140>
800624c: 2b 82 00 24 lw r2,(sp+36)
8006250: 78 01 08 02 mvhi r1,0x802
8006254: 37 83 00 1c addi r3,sp,28
8006258: 38 21 4c a8 ori r1,r1,0x4ca8
800625c: f8 00 07 9c calli 80080cc <_Objects_Get>
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
the_semaphore->open_count += 1;
8006260: 28 22 00 18 lw r2,(r1+24)
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
8006264: 5b 81 00 20 sw (sp+32),r1
the_semaphore->open_count += 1;
8006268: 34 42 00 01 addi r2,r2,1
800626c: 58 22 00 18 sw (r1+24),r2
_Thread_Enable_dispatch();
8006270: f8 00 0a fd calli 8008e64 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
8006274: f8 00 0a fc calli 8008e64 <_Thread_Enable_dispatch>
return_id:
#if defined(RTEMS_USE_16_BIT_OBJECT)
the_semaphore->Semaphore_id = the_semaphore->Object.id;
id = &the_semaphore->Semaphore_id;
#else
id = (sem_t *)&the_semaphore->Object.id;
8006278: 2b 81 00 20 lw r1,(sp+32)
800627c: 34 21 00 08 addi r1,r1,8
#endif
return id;
}
8006280: 2b 9d 00 04 lw ra,(sp+4)
8006284: 2b 8b 00 18 lw r11,(sp+24)
8006288: 2b 8c 00 14 lw r12,(sp+20)
800628c: 2b 8d 00 10 lw r13,(sp+16)
8006290: 2b 8e 00 0c lw r14,(sp+12)
8006294: 2b 8f 00 08 lw r15,(sp+8)
8006298: 37 9c 00 40 addi sp,sp,64
800629c: c3 a0 00 00 ret
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
80062a0: 2b 8f 00 30 lw r15,(sp+48)
80062a4: e3 ff ff d3 bi 80061f0 <sem_open+0x60>
/*
* At this point, the semaphore does not exist and everything has been
* checked. We should go ahead and create a semaphore.
*/
status =_POSIX_Semaphore_Create_support(
80062a8: 34 02 00 00 mvi r2,0
80062ac: b9 e0 18 00 mv r3,r15
80062b0: 37 84 00 20 addi r4,sp,32
80062b4: b9 c0 08 00 mv r1,r14
80062b8: f8 00 1b 5c calli 800d028 <_POSIX_Semaphore_Create_support>
80062bc: b8 20 58 00 mv r11,r1
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
80062c0: f8 00 0a e9 calli 8008e64 <_Thread_Enable_dispatch>
if ( status == -1 )
return SEM_FAILED;
80062c4: 34 01 ff ff mvi r1,-1
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
if ( status == -1 )
80062c8: 5d 61 ff ec bne r11,r1,8006278 <sem_open+0xe8>
80062cc: e3 ff ff ed bi 8006280 <sem_open+0xf0>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
_Thread_Enable_dispatch();
80062d0: f8 00 0a e5 calli 8008e64 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
80062d4: f8 00 2b 9d calli 8011148 <__errno>
80062d8: 34 02 00 11 mvi r2,17
80062dc: 58 22 00 00 sw (r1+0),r2
80062e0: 34 01 ff ff mvi r1,-1
80062e4: e3 ff ff e7 bi 8006280 <sem_open+0xf0>
0800634c <sem_timedwait>:
int sem_timedwait(
sem_t *sem,
const struct timespec *abstime
)
{
800634c: 37 9c ff f4 addi sp,sp,-12
8006350: 5b 8b 00 08 sw (sp+8),r11
8006354: 5b 9d 00 04 sw (sp+4),ra
8006358: b8 20 58 00 mv r11,r1
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
800635c: b8 40 08 00 mv r1,r2
8006360: 37 82 00 0c addi r2,sp,12
8006364: f8 00 17 f1 calli 800c328 <_POSIX_Absolute_timeout_to_ticks>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
8006368: 34 02 00 03 mvi r2,3
800636c: 44 22 00 09 be r1,r2,8006390 <sem_timedwait+0x44> <== ALWAYS TAKEN
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
8006370: 2b 83 00 0c lw r3,(sp+12) <== NOT EXECUTED
8006374: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8006378: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
800637c: f8 00 1b bf calli 800d278 <_POSIX_Semaphore_Wait_support> <== NOT EXECUTED
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
8006380: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8006384: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
8006388: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
800638c: c3 a0 00 00 ret <== NOT EXECUTED
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks );
8006390: 2b 83 00 0c lw r3,(sp+12)
8006394: b9 60 08 00 mv r1,r11
8006398: 34 02 00 01 mvi r2,1
800639c: f8 00 1b b7 calli 800d278 <_POSIX_Semaphore_Wait_support>
lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
rtems_set_errno_and_return_minus_one( ETIMEDOUT );
}
return lock_status;
}
80063a0: 2b 9d 00 04 lw ra,(sp+4)
80063a4: 2b 8b 00 08 lw r11,(sp+8)
80063a8: 37 9c 00 0c addi sp,sp,12
80063ac: c3 a0 00 00 ret
08003c74 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
8003c74: 37 9c ff f0 addi sp,sp,-16
8003c78: 5b 8b 00 10 sw (sp+16),r11
8003c7c: 5b 8c 00 0c sw (sp+12),r12
8003c80: 5b 8d 00 08 sw (sp+8),r13
8003c84: 5b 9d 00 04 sw (sp+4),ra
8003c88: b8 20 58 00 mv r11,r1
8003c8c: b8 40 60 00 mv r12,r2
ISR_Level level;
if ( oact )
8003c90: 44 60 00 0e be r3,r0,8003cc8 <sigaction+0x54>
*oact = _POSIX_signals_Vectors[ sig ];
8003c94: b4 21 08 00 add r1,r1,r1
8003c98: b4 2b 08 00 add r1,r1,r11
8003c9c: 78 02 08 02 mvhi r2,0x802
8003ca0: b4 21 08 00 add r1,r1,r1
8003ca4: 38 42 0d d8 ori r2,r2,0xdd8
8003ca8: b4 21 08 00 add r1,r1,r1
8003cac: b4 41 08 00 add r1,r2,r1
8003cb0: 28 22 00 00 lw r2,(r1+0)
8003cb4: 58 62 00 00 sw (r3+0),r2
8003cb8: 28 22 00 04 lw r2,(r1+4)
8003cbc: 58 62 00 04 sw (r3+4),r2
8003cc0: 28 21 00 08 lw r1,(r1+8)
8003cc4: 58 61 00 08 sw (r3+8),r1
if ( !sig )
8003cc8: 45 60 00 04 be r11,r0,8003cd8 <sigaction+0x64>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
8003ccc: 35 61 ff ff addi r1,r11,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
8003cd0: 34 02 00 1f mvi r2,31
8003cd4: 50 41 00 06 bgeu r2,r1,8003cec <sigaction+0x78>
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
rtems_set_errno_and_return_minus_one( EINVAL );
8003cd8: f8 00 29 5b calli 800e244 <__errno>
8003cdc: 34 02 00 16 mvi r2,22
8003ce0: 58 22 00 00 sw (r1+0),r2
8003ce4: 34 01 ff ff mvi r1,-1
8003ce8: e0 00 00 1c bi 8003d58 <sigaction+0xe4>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
8003cec: 34 01 00 09 mvi r1,9
8003cf0: 45 61 ff fa be r11,r1,8003cd8 <sigaction+0x64>
* now (signals not posted when SIG_IGN).
* + If we are now ignoring a signal that was previously pending,
* we clear the pending signal indicator.
*/
return 0;
8003cf4: 34 01 00 00 mvi r1,0
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
8003cf8: 45 80 00 18 be r12,r0,8003d58 <sigaction+0xe4> <== NEVER TAKEN
/*
* Unless the user is installing the default signal actions, then
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
8003cfc: 90 00 68 00 rcsr r13,IE
8003d00: 34 01 ff fe mvi r1,-2
8003d04: a1 a1 08 00 and r1,r13,r1
8003d08: d0 01 00 00 wcsr IE,r1
if ( act->sa_handler == SIG_DFL ) {
8003d0c: 29 81 00 08 lw r1,(r12+8)
8003d10: 44 20 00 18 be r1,r0,8003d70 <sigaction+0xfc>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
8003d14: b9 60 08 00 mv r1,r11
8003d18: f8 00 19 6c calli 800a2c8 <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
8003d1c: b5 6b 08 00 add r1,r11,r11
8003d20: b4 2b 58 00 add r11,r1,r11
8003d24: 29 82 00 00 lw r2,(r12+0)
8003d28: 78 01 08 02 mvhi r1,0x802
8003d2c: b5 6b 58 00 add r11,r11,r11
8003d30: 38 21 0d d8 ori r1,r1,0xdd8
8003d34: b5 6b 58 00 add r11,r11,r11
8003d38: b4 2b 58 00 add r11,r1,r11
8003d3c: 59 62 00 00 sw (r11+0),r2
8003d40: 29 81 00 04 lw r1,(r12+4)
8003d44: 59 61 00 04 sw (r11+4),r1
8003d48: 29 81 00 08 lw r1,(r12+8)
8003d4c: 59 61 00 08 sw (r11+8),r1
}
_ISR_Enable( level );
8003d50: d0 0d 00 00 wcsr IE,r13
* now (signals not posted when SIG_IGN).
* + If we are now ignoring a signal that was previously pending,
* we clear the pending signal indicator.
*/
return 0;
8003d54: 34 01 00 00 mvi r1,0
}
8003d58: 2b 9d 00 04 lw ra,(sp+4)
8003d5c: 2b 8b 00 10 lw r11,(sp+16)
8003d60: 2b 8c 00 0c lw r12,(sp+12)
8003d64: 2b 8d 00 08 lw r13,(sp+8)
8003d68: 37 9c 00 10 addi sp,sp,16
8003d6c: c3 a0 00 00 ret
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
8003d70: b5 6b 08 00 add r1,r11,r11
8003d74: b4 2b 58 00 add r11,r1,r11
8003d78: b5 6b 58 00 add r11,r11,r11
8003d7c: 78 02 08 01 mvhi r2,0x801
8003d80: b5 6b 58 00 add r11,r11,r11
8003d84: 38 42 f1 50 ori r2,r2,0xf150
8003d88: b4 4b 10 00 add r2,r2,r11
8003d8c: 28 44 00 00 lw r4,(r2+0)
8003d90: 28 43 00 04 lw r3,(r2+4)
8003d94: 78 01 08 02 mvhi r1,0x802
8003d98: 28 42 00 08 lw r2,(r2+8)
8003d9c: 38 21 0d d8 ori r1,r1,0xdd8
8003da0: b4 2b 58 00 add r11,r1,r11
8003da4: 59 64 00 00 sw (r11+0),r4
8003da8: 59 63 00 04 sw (r11+4),r3
8003dac: 59 62 00 08 sw (r11+8),r2
8003db0: e3 ff ff e8 bi 8003d50 <sigaction+0xdc>
0800421c <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
800421c: 37 9c ff d8 addi sp,sp,-40
8004220: 5b 8b 00 1c sw (sp+28),r11
8004224: 5b 8c 00 18 sw (sp+24),r12
8004228: 5b 8d 00 14 sw (sp+20),r13
800422c: 5b 8e 00 10 sw (sp+16),r14
8004230: 5b 8f 00 0c sw (sp+12),r15
8004234: 5b 90 00 08 sw (sp+8),r16
8004238: 5b 9d 00 04 sw (sp+4),ra
800423c: b8 20 68 00 mv r13,r1
8004240: b8 40 58 00 mv r11,r2
8004244: b8 60 60 00 mv r12,r3
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
8004248: 44 20 00 70 be r1,r0,8004408 <sigtimedwait+0x1ec>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
800424c: 44 60 00 5c be r3,r0,80043bc <sigtimedwait+0x1a0>
if ( !_Timespec_Is_valid( timeout ) )
8004250: b8 60 08 00 mv r1,r3
8004254: f8 00 0e 85 calli 8007c68 <_Timespec_Is_valid>
8004258: 44 20 00 6c be r1,r0,8004408 <sigtimedwait+0x1ec>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
800425c: b9 80 08 00 mv r1,r12
8004260: f8 00 0e a4 calli 8007cf0 <_Timespec_To_ticks>
if ( !interval )
8004264: 44 20 00 69 be r1,r0,8004408 <sigtimedwait+0x1ec> <== NEVER TAKEN
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
8004268: 45 60 00 57 be r11,r0,80043c4 <sigtimedwait+0x1a8> <== NEVER TAKEN
the_thread = _Thread_Executing;
800426c: 78 0c 08 02 mvhi r12,0x802
8004270: 39 8c 1d 88 ori r12,r12,0x1d88
8004274: 29 83 00 0c lw r3,(r12+12)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8004278: 28 6f 01 20 lw r15,(r3+288)
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
800427c: 90 00 80 00 rcsr r16,IE
8004280: 34 02 ff fe mvi r2,-2
8004284: a2 02 10 00 and r2,r16,r2
8004288: d0 02 00 00 wcsr IE,r2
if ( *set & api->signals_pending ) {
800428c: 29 a5 00 00 lw r5,(r13+0)
8004290: 29 e4 00 d4 lw r4,(r15+212)
8004294: a0 a4 10 00 and r2,r5,r4
8004298: 5c 40 00 4d bne r2,r0,80043cc <sigtimedwait+0x1b0>
return the_info->si_signo;
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
800429c: 78 04 08 02 mvhi r4,0x802
80042a0: 38 84 1f cc ori r4,r4,0x1fcc
80042a4: 28 84 00 00 lw r4,(r4+0)
80042a8: a0 a4 28 00 and r5,r5,r4
80042ac: 5c a2 00 35 bne r5,r2,8004380 <sigtimedwait+0x164>
80042b0: 78 02 08 02 mvhi r2,0x802
80042b4: 38 42 18 b8 ori r2,r2,0x18b8
80042b8: 28 44 00 00 lw r4,(r2+0)
the_info->si_code = SI_USER;
the_info->si_value.sival_int = 0;
return signo;
}
the_info->si_signo = -1;
80042bc: 34 05 ff ff mvi r5,-1
80042c0: 59 65 00 00 sw (r11+0),r5
80042c4: 34 84 00 01 addi r4,r4,1
80042c8: 58 44 00 00 sw (r2+0),r4
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
the_thread->Wait.return_code = EINTR;
80042cc: 34 02 00 04 mvi r2,4
80042d0: 58 62 00 34 sw (r3+52),r2
the_thread->Wait.option = *set;
80042d4: 29 a4 00 00 lw r4,(r13+0)
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
80042d8: 78 02 08 02 mvhi r2,0x802
80042dc: 38 42 1f 64 ori r2,r2,0x1f64
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
80042e0: 58 64 00 30 sw (r3+48),r4
the_thread->Wait.return_argument = the_info;
80042e4: 58 6b 00 28 sw (r3+40),r11
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
80042e8: 58 62 00 44 sw (r3+68),r2
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
80042ec: 34 03 00 01 mvi r3,1
80042f0: 58 43 00 30 sw (r2+48),r3
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
the_thread->Wait.return_argument = the_info;
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
80042f4: d0 10 00 00 wcsr IE,r16
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
80042f8: 78 03 08 00 mvhi r3,0x800
80042fc: b8 20 10 00 mv r2,r1
8004300: 78 01 08 02 mvhi r1,0x802
8004304: 38 63 78 88 ori r3,r3,0x7888
8004308: 38 21 1f 64 ori r1,r1,0x1f64
800430c: f8 00 0c 52 calli 8007454 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
8004310: f8 00 0b 17 calli 8006f6c <_Thread_Enable_dispatch>
/*
* When the thread is set free by a signal, it is need to eliminate
* the signal.
*/
_POSIX_signals_Clear_signals( api, the_info->si_signo, the_info, false, false );
8004314: 29 62 00 00 lw r2,(r11+0)
8004318: b9 e0 08 00 mv r1,r15
800431c: b9 60 18 00 mv r3,r11
8004320: 34 04 00 00 mvi r4,0
8004324: 34 05 00 00 mvi r5,0
8004328: f8 00 1a 4a calli 800ac50 <_POSIX_signals_Clear_signals>
/* Set errno only if return code is not EINTR or
* if EINTR was caused by a signal being caught, which
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
800432c: 29 81 00 0c lw r1,(r12+12)
8004330: 28 22 00 34 lw r2,(r1+52)
8004334: 34 01 00 04 mvi r1,4
8004338: 5c 41 00 39 bne r2,r1,800441c <sigtimedwait+0x200>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
800433c: 29 6e 00 00 lw r14,(r11+0)
8004340: 34 01 00 01 mvi r1,1
8004344: 35 c2 ff ff addi r2,r14,-1
8004348: f8 00 66 9e calli 801ddc0 <__ashlsi3>
800434c: 29 a2 00 00 lw r2,(r13+0)
8004350: a0 22 08 00 and r1,r1,r2
8004354: 44 20 00 32 be r1,r0,800441c <sigtimedwait+0x200>
errno = _Thread_Executing->Wait.return_code;
return -1;
}
return the_info->si_signo;
}
8004358: b9 c0 08 00 mv r1,r14
800435c: 2b 9d 00 04 lw ra,(sp+4)
8004360: 2b 8b 00 1c lw r11,(sp+28)
8004364: 2b 8c 00 18 lw r12,(sp+24)
8004368: 2b 8d 00 14 lw r13,(sp+20)
800436c: 2b 8e 00 10 lw r14,(sp+16)
8004370: 2b 8f 00 0c lw r15,(sp+12)
8004374: 2b 90 00 08 lw r16,(sp+8)
8004378: 37 9c 00 28 addi sp,sp,40
800437c: c3 a0 00 00 ret
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
8004380: b8 80 08 00 mv r1,r4
8004384: fb ff ff 86 calli 800419c <_POSIX_signals_Get_lowest>
8004388: b8 20 70 00 mv r14,r1
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
800438c: b9 c0 10 00 mv r2,r14
8004390: b9 e0 08 00 mv r1,r15
8004394: b9 60 18 00 mv r3,r11
8004398: 34 04 00 01 mvi r4,1
800439c: 34 05 00 00 mvi r5,0
80043a0: f8 00 1a 2c calli 800ac50 <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
80043a4: d0 10 00 00 wcsr IE,r16
the_info->si_signo = signo;
the_info->si_code = SI_USER;
80043a8: 34 01 00 01 mvi r1,1
if ( *set & _POSIX_signals_Pending ) {
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
_ISR_Enable( level );
the_info->si_signo = signo;
80043ac: 59 6e 00 00 sw (r11+0),r14
the_info->si_code = SI_USER;
80043b0: 59 61 00 04 sw (r11+4),r1
the_info->si_value.sival_int = 0;
80043b4: 59 60 00 08 sw (r11+8),r0
return signo;
80043b8: e3 ff ff e8 bi 8004358 <sigtimedwait+0x13c>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
80043bc: 34 01 00 00 mvi r1,0
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
80043c0: 5d 60 ff ab bne r11,r0,800426c <sigtimedwait+0x50>
80043c4: 37 8b 00 20 addi r11,sp,32
80043c8: e3 ff ff a9 bi 800426c <sigtimedwait+0x50>
/* API signals pending? */
_ISR_Disable( level );
if ( *set & api->signals_pending ) {
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
80043cc: b8 80 08 00 mv r1,r4
80043d0: fb ff ff 73 calli 800419c <_POSIX_signals_Get_lowest>
80043d4: b8 20 10 00 mv r2,r1
80043d8: 59 61 00 00 sw (r11+0),r1
_POSIX_signals_Clear_signals(
80043dc: b9 60 18 00 mv r3,r11
80043e0: b9 e0 08 00 mv r1,r15
80043e4: 34 04 00 00 mvi r4,0
80043e8: 34 05 00 00 mvi r5,0
80043ec: f8 00 1a 19 calli 800ac50 <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
80043f0: d0 10 00 00 wcsr IE,r16
the_info->si_code = SI_USER;
80043f4: 34 01 00 01 mvi r1,1
80043f8: 59 61 00 04 sw (r11+4),r1
the_info->si_value.sival_int = 0;
80043fc: 59 60 00 08 sw (r11+8),r0
return the_info->si_signo;
8004400: 29 6e 00 00 lw r14,(r11+0)
8004404: e3 ff ff d5 bi 8004358 <sigtimedwait+0x13c>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
if ( !interval )
rtems_set_errno_and_return_minus_one( EINVAL );
8004408: f8 00 29 49 calli 800e92c <__errno>
800440c: 34 02 00 16 mvi r2,22
8004410: 58 22 00 00 sw (r1+0),r2
8004414: 34 0e ff ff mvi r14,-1
8004418: e3 ff ff d0 bi 8004358 <sigtimedwait+0x13c>
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
errno = _Thread_Executing->Wait.return_code;
800441c: f8 00 29 44 calli 800e92c <__errno>
8004420: 29 82 00 0c lw r2,(r12+12)
return -1;
8004424: 34 0e ff ff mvi r14,-1
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
errno = _Thread_Executing->Wait.return_code;
8004428: 28 42 00 34 lw r2,(r2+52)
800442c: 58 22 00 00 sw (r1+0),r2
return -1;
8004430: e3 ff ff ca bi 8004358 <sigtimedwait+0x13c>
080064dc <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
80064dc: 37 9c ff f8 addi sp,sp,-8
80064e0: 5b 8b 00 08 sw (sp+8),r11
80064e4: 5b 9d 00 04 sw (sp+4),ra
int status;
status = sigtimedwait( set, NULL, NULL );
80064e8: 34 03 00 00 mvi r3,0
int sigwait(
const sigset_t *set,
int *sig
)
{
80064ec: b8 40 58 00 mv r11,r2
int status;
status = sigtimedwait( set, NULL, NULL );
80064f0: 34 02 00 00 mvi r2,0
80064f4: fb ff ff 6d calli 80062a8 <sigtimedwait>
if ( status != -1 ) {
80064f8: 34 02 ff ff mvi r2,-1
80064fc: 44 22 00 09 be r1,r2,8006520 <sigwait+0x44>
if ( sig )
*sig = status;
return 0;
8006500: 34 03 00 00 mvi r3,0
int status;
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
8006504: 45 60 00 02 be r11,r0,800650c <sigwait+0x30> <== NEVER TAKEN
*sig = status;
8006508: 59 61 00 00 sw (r11+0),r1
return 0;
}
return errno;
}
800650c: b8 60 08 00 mv r1,r3
8006510: 2b 9d 00 04 lw ra,(sp+4)
8006514: 2b 8b 00 08 lw r11,(sp+8)
8006518: 37 9c 00 08 addi sp,sp,8
800651c: c3 a0 00 00 ret
if ( sig )
*sig = status;
return 0;
}
return errno;
8006520: f8 00 28 1e calli 8010598 <__errno>
8006524: 28 23 00 00 lw r3,(r1+0)
}
8006528: b8 60 08 00 mv r1,r3
800652c: 2b 9d 00 04 lw ra,(sp+4)
8006530: 2b 8b 00 08 lw r11,(sp+8)
8006534: 37 9c 00 08 addi sp,sp,8
8006538: c3 a0 00 00 ret
08005ff8 <siproc>:
/*
* Process input character, with semaphore.
*/
static int
siproc (unsigned char c, struct rtems_termios_tty *tty)
{
8005ff8: 37 9c ff f4 addi sp,sp,-12
8005ffc: 5b 8b 00 0c sw (sp+12),r11
8006000: 5b 8c 00 08 sw (sp+8),r12
8006004: 5b 9d 00 04 sw (sp+4),ra
int i;
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
8006008: 28 43 00 3c lw r3,(r2+60)
/*
* Process input character, with semaphore.
*/
static int
siproc (unsigned char c, struct rtems_termios_tty *tty)
{
800600c: b8 20 60 00 mv r12,r1
8006010: b8 40 58 00 mv r11,r2
int i;
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
8006014: 20 61 0e 78 andi r1,r3,0xe78
8006018: 5c 20 00 0a bne r1,r0,8006040 <siproc+0x48> <== ALWAYS TAKEN
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
i = iproc (c, tty);
rtems_semaphore_release (tty->osem);
}
else {
i = iproc (c, tty);
800601c: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8006020: fb ff ff 80 calli 8005e20 <iproc> <== NOT EXECUTED
8006024: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
}
return i;
}
8006028: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
800602c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8006030: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED
8006034: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED
8006038: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED
800603c: c3 a0 00 00 ret <== NOT EXECUTED
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8006040: 28 41 00 18 lw r1,(r2+24)
8006044: 34 03 00 00 mvi r3,0
8006048: 34 02 00 00 mvi r2,0
800604c: f8 00 06 28 calli 80078ec <rtems_semaphore_obtain>
i = iproc (c, tty);
8006050: b9 60 10 00 mv r2,r11
8006054: b9 80 08 00 mv r1,r12
8006058: fb ff ff 72 calli 8005e20 <iproc>
800605c: b8 20 60 00 mv r12,r1
rtems_semaphore_release (tty->osem);
8006060: 29 61 00 18 lw r1,(r11+24)
8006064: f8 00 06 7e calli 8007a5c <rtems_semaphore_release>
}
else {
i = iproc (c, tty);
}
return i;
}
8006068: b9 80 08 00 mv r1,r12
800606c: 2b 9d 00 04 lw ra,(sp+4)
8006070: 2b 8b 00 0c lw r11,(sp+12)
8006074: 2b 8c 00 08 lw r12,(sp+8)
8006078: 37 9c 00 0c addi sp,sp,12
800607c: c3 a0 00 00 ret
08005534 <statvfs>:
#include <sys/statvfs.h>
int
statvfs (const char *path, struct statvfs *sb)
{
8005534: 37 9c ff dc addi sp,sp,-36
8005538: 5b 8b 00 10 sw (sp+16),r11
800553c: 5b 8c 00 0c sw (sp+12),r12
8005540: 5b 8d 00 08 sw (sp+8),r13
8005544: 5b 9d 00 04 sw (sp+4),ra
8005548: b8 20 60 00 mv r12,r1
800554c: b8 40 58 00 mv r11,r2
* The root node of the mounted filesytem.
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
8005550: 37 8d 00 14 addi r13,sp,20
8005554: f8 00 33 f9 calli 8012538 <strlen>
8005558: b8 20 10 00 mv r2,r1
800555c: 34 03 00 00 mvi r3,0
8005560: b9 80 08 00 mv r1,r12
8005564: b9 a0 20 00 mv r4,r13
8005568: 34 05 00 01 mvi r5,1
800556c: fb ff f9 ba calli 8003c54 <rtems_filesystem_evaluate_path>
return -1;
8005570: 34 0c ff ff mvi r12,-1
* The root node of the mounted filesytem.
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
8005574: 5c 20 00 18 bne r1,r0,80055d4 <statvfs+0xa0> <== NEVER TAKEN
return -1;
mt_entry = loc.mt_entry;
8005578: 2b 81 00 24 lw r1,(sp+36)
fs_mount_root = &mt_entry->mt_fs_root;
memset (sb, 0, sizeof (struct statvfs));
800557c: 59 60 00 00 sw (r11+0),r0
8005580: 59 60 00 04 sw (r11+4),r0
8005584: 59 60 00 08 sw (r11+8),r0
8005588: 59 60 00 0c sw (r11+12),r0
800558c: 59 60 00 10 sw (r11+16),r0
8005590: 59 60 00 14 sw (r11+20),r0
8005594: 59 60 00 18 sw (r11+24),r0
8005598: 59 60 00 1c sw (r11+28),r0
800559c: 59 60 00 20 sw (r11+32),r0
80055a0: 59 60 00 24 sw (r11+36),r0
80055a4: 59 60 00 28 sw (r11+40),r0
80055a8: 59 60 00 2c sw (r11+44),r0
80055ac: 59 60 00 30 sw (r11+48),r0
80055b0: 59 60 00 34 sw (r11+52),r0
result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb );
80055b4: 28 23 00 28 lw r3,(r1+40)
80055b8: b9 60 10 00 mv r2,r11
80055bc: 34 21 00 1c addi r1,r1,28
80055c0: 28 63 00 44 lw r3,(r3+68)
80055c4: d8 60 00 00 call r3
80055c8: b8 20 60 00 mv r12,r1
rtems_filesystem_freenode( &loc );
80055cc: b9 a0 08 00 mv r1,r13
80055d0: fb ff f9 ef calli 8003d8c <rtems_filesystem_freenode>
return result;
}
80055d4: b9 80 08 00 mv r1,r12
80055d8: 2b 9d 00 04 lw ra,(sp+4)
80055dc: 2b 8b 00 10 lw r11,(sp+16)
80055e0: 2b 8c 00 0c lw r12,(sp+12)
80055e4: 2b 8d 00 08 lw r13,(sp+8)
80055e8: 37 9c 00 24 addi sp,sp,36
80055ec: c3 a0 00 00 ret
08003da0 <sync_per_thread>:
fdatasync(fn);
}
/* iterate over all FILE *'s for this thread */
static void sync_per_thread(Thread_Control *t)
{
8003da0: 37 9c ff f4 addi sp,sp,-12
8003da4: 5b 8b 00 0c sw (sp+12),r11
8003da8: 5b 8c 00 08 sw (sp+8),r12
8003dac: 5b 9d 00 04 sw (sp+4),ra
/*
* The sync_wrapper() function will operate on the current thread's
* reent structure so we will temporarily use that.
*/
this_reent = t->libc_reent;
8003db0: 28 23 01 18 lw r3,(r1+280)
if ( this_reent ) {
8003db4: 44 60 00 0c be r3,r0,8003de4 <sync_per_thread+0x44> <== NEVER TAKEN
current_reent = _Thread_Executing->libc_reent;
8003db8: 78 0b 08 01 mvhi r11,0x801
8003dbc: 39 6b 6d 38 ori r11,r11,0x6d38
8003dc0: 29 64 00 0c lw r4,(r11+12)
_Thread_Executing->libc_reent = this_reent;
_fwalk (t->libc_reent, sync_wrapper);
8003dc4: 78 02 08 00 mvhi r2,0x800
8003dc8: 38 42 3d f8 ori r2,r2,0x3df8
* The sync_wrapper() function will operate on the current thread's
* reent structure so we will temporarily use that.
*/
this_reent = t->libc_reent;
if ( this_reent ) {
current_reent = _Thread_Executing->libc_reent;
8003dcc: 28 8c 01 18 lw r12,(r4+280)
_Thread_Executing->libc_reent = this_reent;
8003dd0: 58 83 01 18 sw (r4+280),r3
_fwalk (t->libc_reent, sync_wrapper);
8003dd4: 28 21 01 18 lw r1,(r1+280)
8003dd8: f8 00 2c f0 calli 800f198 <_fwalk>
_Thread_Executing->libc_reent = current_reent;
8003ddc: 29 61 00 0c lw r1,(r11+12)
8003de0: 58 2c 01 18 sw (r1+280),r12
}
}
8003de4: 2b 9d 00 04 lw ra,(sp+4)
8003de8: 2b 8b 00 0c lw r11,(sp+12)
8003dec: 2b 8c 00 08 lw r12,(sp+8)
8003df0: 37 9c 00 0c addi sp,sp,12
8003df4: c3 a0 00 00 ret
08004a74 <tcsetattr>:
int tcsetattr(
int fd,
int opt,
struct termios *tp
)
{
8004a74: 37 9c ff f4 addi sp,sp,-12
8004a78: 5b 8b 00 0c sw (sp+12),r11
8004a7c: 5b 8c 00 08 sw (sp+8),r12
8004a80: 5b 9d 00 04 sw (sp+4),ra
8004a84: b8 20 60 00 mv r12,r1
8004a88: b8 60 58 00 mv r11,r3
switch (opt) {
8004a8c: 44 40 00 12 be r2,r0,8004ad4 <tcsetattr+0x60>
8004a90: 34 03 00 01 mvi r3,1
8004a94: 44 43 00 0a be r2,r3,8004abc <tcsetattr+0x48>
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
8004a98: f8 00 33 a9 calli 801193c <__errno>
8004a9c: 34 02 00 86 mvi r2,134
8004aa0: 58 22 00 00 sw (r1+0),r2
8004aa4: 34 01 ff ff mvi r1,-1
* Fall through to....
*/
case TCSANOW:
return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
}
}
8004aa8: 2b 9d 00 04 lw ra,(sp+4)
8004aac: 2b 8b 00 0c lw r11,(sp+12)
8004ab0: 2b 8c 00 08 lw r12,(sp+8)
8004ab4: 37 9c 00 0c addi sp,sp,12
8004ab8: c3 a0 00 00 ret
switch (opt) {
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
case TCSADRAIN:
if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0)
8004abc: 34 02 00 03 mvi r2,3
8004ac0: 34 03 00 00 mvi r3,0
8004ac4: f8 00 23 51 calli 800d808 <ioctl>
8004ac8: b8 20 10 00 mv r2,r1
return -1;
8004acc: 34 01 ff ff mvi r1,-1
switch (opt) {
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
case TCSADRAIN:
if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0)
8004ad0: 48 02 ff f6 bg r0,r2,8004aa8 <tcsetattr+0x34> <== NEVER TAKEN
return -1;
/*
* Fall through to....
*/
case TCSANOW:
return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
8004ad4: b9 80 08 00 mv r1,r12
8004ad8: 34 02 00 02 mvi r2,2
8004adc: b9 60 18 00 mv r3,r11
8004ae0: f8 00 23 4a calli 800d808 <ioctl>
}
}
8004ae4: 2b 9d 00 04 lw ra,(sp+4)
8004ae8: 2b 8b 00 0c lw r11,(sp+12)
8004aec: 2b 8c 00 08 lw r12,(sp+8)
8004af0: 37 9c 00 0c addi sp,sp,12
8004af4: c3 a0 00 00 ret
0800312c <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
800312c: 37 9c ff f0 addi sp,sp,-16
8003130: 5b 8b 00 10 sw (sp+16),r11
8003134: 5b 8c 00 0c sw (sp+12),r12
8003138: 5b 8d 00 08 sw (sp+8),r13
800313c: 5b 9d 00 04 sw (sp+4),ra
8003140: b8 40 58 00 mv r11,r2
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
8003144: 34 02 00 01 mvi r2,1
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
8003148: b8 60 68 00 mv r13,r3
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
800314c: 5c 22 00 06 bne r1,r2,8003164 <timer_create+0x38>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
8003150: 44 60 00 05 be r3,r0,8003164 <timer_create+0x38>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
8003154: 45 60 00 14 be r11,r0,80031a4 <timer_create+0x78>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
8003158: 29 62 00 00 lw r2,(r11+0)
800315c: 34 42 ff ff addi r2,r2,-1
8003160: 50 22 00 0b bgeu r1,r2,800318c <timer_create+0x60> <== ALWAYS TAKEN
if ( !evp->sigev_signo )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
rtems_set_errno_and_return_minus_one( EINVAL );
8003164: f8 00 2b 43 calli 800de70 <__errno>
8003168: 34 02 00 16 mvi r2,22
800316c: 58 22 00 00 sw (r1+0),r2
8003170: 34 01 ff ff mvi r1,-1
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
8003174: 2b 9d 00 04 lw ra,(sp+4)
8003178: 2b 8b 00 10 lw r11,(sp+16)
800317c: 2b 8c 00 0c lw r12,(sp+12)
8003180: 2b 8d 00 08 lw r13,(sp+8)
8003184: 37 9c 00 10 addi sp,sp,16
8003188: c3 a0 00 00 ret
( evp->sigev_notify != SIGEV_SIGNAL ) ) {
/* The value of the field sigev_notify is not valid */
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !evp->sigev_signo )
800318c: 29 61 00 04 lw r1,(r11+4)
8003190: 44 20 ff f5 be r1,r0,8003164 <timer_create+0x38> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
8003194: 34 21 ff ff addi r1,r1,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
8003198: 34 02 00 1f mvi r2,31
800319c: 50 41 00 02 bgeu r2,r1,80031a4 <timer_create+0x78> <== ALWAYS TAKEN
80031a0: e3 ff ff f1 bi 8003164 <timer_create+0x38> <== NOT EXECUTED
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80031a4: 78 01 08 01 mvhi r1,0x801
80031a8: 38 21 f8 b8 ori r1,r1,0xf8b8
80031ac: 28 22 00 00 lw r2,(r1+0)
80031b0: 34 42 00 01 addi r2,r2,1
80031b4: 58 22 00 00 sw (r1+0),r2
* the inactive chain of free timer control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Timer_Control *_POSIX_Timer_Allocate( void )
{
return (POSIX_Timer_Control *) _Objects_Allocate( &_POSIX_Timer_Information );
80031b8: 78 0c 08 01 mvhi r12,0x801
80031bc: 39 8c fb 50 ori r12,r12,0xfb50
80031c0: b9 80 08 00 mv r1,r12
80031c4: f8 00 07 63 calli 8004f50 <_Objects_Allocate>
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
80031c8: 44 20 00 29 be r1,r0,800326c <timer_create+0x140>
}
/* 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;
80031cc: 78 02 08 01 mvhi r2,0x801
rtems_set_errno_and_return_minus_one( EAGAIN );
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
80031d0: 34 03 00 02 mvi r3,2
80031d4: 30 23 00 3c sb (r1+60),r3
ptimer->thread_id = _Thread_Executing->Object.id;
80031d8: 38 42 fd 88 ori r2,r2,0xfd88
80031dc: 28 42 00 0c lw r2,(r2+12)
80031e0: 28 42 00 08 lw r2,(r2+8)
80031e4: 58 22 00 38 sw (r1+56),r2
if ( evp != NULL ) {
80031e8: 45 60 00 07 be r11,r0,8003204 <timer_create+0xd8>
ptimer->inf.sigev_notify = evp->sigev_notify;
80031ec: 29 64 00 00 lw r4,(r11+0)
ptimer->inf.sigev_signo = evp->sigev_signo;
80031f0: 29 63 00 04 lw r3,(r11+4)
ptimer->inf.sigev_value = evp->sigev_value;
80031f4: 29 62 00 08 lw r2,(r11+8)
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
ptimer->thread_id = _Thread_Executing->Object.id;
if ( evp != NULL ) {
ptimer->inf.sigev_notify = evp->sigev_notify;
80031f8: 58 24 00 40 sw (r1+64),r4
ptimer->inf.sigev_signo = evp->sigev_signo;
80031fc: 58 23 00 44 sw (r1+68),r3
ptimer->inf.sigev_value = evp->sigev_value;
8003200: 58 22 00 48 sw (r1+72),r2
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8003204: 28 23 00 08 lw r3,(r1+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8003208: 29 84 00 1c lw r4,(r12+28)
}
ptimer->overrun = 0;
800320c: 58 20 00 68 sw (r1+104),r0
Objects_Information *information,
Objects_Control *the_object,
uint32_t name
)
{
_Objects_Set_local_object(
8003210: 20 62 ff ff andi r2,r3,0xffff
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8003214: b4 42 10 00 add r2,r2,r2
8003218: b4 42 10 00 add r2,r2,r2
ptimer->timer_data.it_value.tv_sec = 0;
800321c: 58 20 00 5c sw (r1+92),r0
ptimer->timer_data.it_value.tv_nsec = 0;
8003220: 58 20 00 60 sw (r1+96),r0
ptimer->timer_data.it_interval.tv_sec = 0;
8003224: 58 20 00 54 sw (r1+84),r0
ptimer->timer_data.it_interval.tv_nsec = 0;
8003228: 58 20 00 58 sw (r1+88),r0
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
800322c: 58 20 00 18 sw (r1+24),r0
the_watchdog->routine = routine;
8003230: 58 20 00 2c sw (r1+44),r0
the_watchdog->id = id;
8003234: 58 20 00 30 sw (r1+48),r0
the_watchdog->user_data = user_data;
8003238: 58 20 00 34 sw (r1+52),r0
800323c: b4 82 10 00 add r2,r4,r2
8003240: 58 41 00 00 sw (r2+0),r1
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
8003244: 58 20 00 0c sw (r1+12),r0
_Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL );
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
8003248: 59 a3 00 00 sw (r13+0),r3
_Thread_Enable_dispatch();
800324c: f8 00 0b b2 calli 8006114 <_Thread_Enable_dispatch>
return 0;
8003250: 34 01 00 00 mvi r1,0
}
8003254: 2b 9d 00 04 lw ra,(sp+4)
8003258: 2b 8b 00 10 lw r11,(sp+16)
800325c: 2b 8c 00 0c lw r12,(sp+12)
8003260: 2b 8d 00 08 lw r13,(sp+8)
8003264: 37 9c 00 10 addi sp,sp,16
8003268: c3 a0 00 00 ret
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
_Thread_Enable_dispatch();
800326c: f8 00 0b aa calli 8006114 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
8003270: f8 00 2b 00 calli 800de70 <__errno>
8003274: 34 02 00 0b mvi r2,11
8003278: 58 22 00 00 sw (r1+0),r2
800327c: 34 01 ff ff mvi r1,-1
8003280: e3 ff ff f5 bi 8003254 <timer_create+0x128>
08003284 <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
8003284: 37 9c ff cc addi sp,sp,-52
8003288: 5b 8b 00 18 sw (sp+24),r11
800328c: 5b 8c 00 14 sw (sp+20),r12
8003290: 5b 8d 00 10 sw (sp+16),r13
8003294: 5b 8e 00 0c sw (sp+12),r14
8003298: 5b 8f 00 08 sw (sp+8),r15
800329c: 5b 9d 00 04 sw (sp+4),ra
80032a0: b8 60 60 00 mv r12,r3
80032a4: b8 20 70 00 mv r14,r1
80032a8: b8 40 58 00 mv r11,r2
80032ac: b8 80 68 00 mv r13,r4
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
80032b0: 44 60 00 1e be r3,r0,8003328 <timer_settime+0xa4> <== NEVER TAKEN
/*
* First, it verifies if the structure "value" is correct
* if the number of nanoseconds is not correct return EINVAL
*/
if ( !_Timespec_Is_valid( &(value->it_value) ) ) {
80032b4: 34 61 00 08 addi r1,r3,8
80032b8: f8 00 0f 18 calli 8006f18 <_Timespec_Is_valid>
80032bc: 44 20 00 1b be r1,r0,8003328 <timer_settime+0xa4>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
80032c0: b9 80 08 00 mv r1,r12
80032c4: f8 00 0f 15 calli 8006f18 <_Timespec_Is_valid>
80032c8: 44 20 00 18 be r1,r0,8003328 <timer_settime+0xa4> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
80032cc: 7d 62 00 00 cmpnei r2,r11,0
80032d0: 7d 61 00 04 cmpnei r1,r11,4
80032d4: a0 41 08 00 and r1,r2,r1
80032d8: 5c 20 00 14 bne r1,r0,8003328 <timer_settime+0xa4>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
80032dc: 29 81 00 0c lw r1,(r12+12)
80032e0: 29 84 00 00 lw r4,(r12+0)
80032e4: 29 83 00 04 lw r3,(r12+4)
80032e8: 29 82 00 08 lw r2,(r12+8)
80032ec: 5b 81 00 28 sw (sp+40),r1
80032f0: 5b 84 00 1c sw (sp+28),r4
80032f4: 5b 83 00 20 sw (sp+32),r3
80032f8: 5b 82 00 24 sw (sp+36),r2
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
80032fc: 34 01 00 04 mvi r1,4
8003300: 45 61 00 46 be r11,r1,8003418 <timer_settime+0x194>
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
8003304: 78 03 08 01 mvhi r3,0x801
8003308: b8 60 08 00 mv r1,r3
800330c: 38 21 fb 50 ori r1,r1,0xfb50
8003310: b9 c0 10 00 mv r2,r14
8003314: 37 83 00 34 addi r3,sp,52
8003318: f8 00 08 54 calli 8005468 <_Objects_Get>
800331c: b8 20 58 00 mv r11,r1
* something with the structure of times of the timer: to stop, start
* or start it again
*/
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
8003320: 2b 81 00 34 lw r1,(sp+52)
8003324: 44 20 00 0d be r1,r0,8003358 <timer_settime+0xd4>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
8003328: f8 00 2a d2 calli 800de70 <__errno>
800332c: 34 02 00 16 mvi r2,22
8003330: 58 22 00 00 sw (r1+0),r2
8003334: 34 01 ff ff mvi r1,-1
}
8003338: 2b 9d 00 04 lw ra,(sp+4)
800333c: 2b 8b 00 18 lw r11,(sp+24)
8003340: 2b 8c 00 14 lw r12,(sp+20)
8003344: 2b 8d 00 10 lw r13,(sp+16)
8003348: 2b 8e 00 0c lw r14,(sp+12)
800334c: 2b 8f 00 08 lw r15,(sp+8)
8003350: 37 9c 00 34 addi sp,sp,52
8003354: c3 a0 00 00 ret
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
case OBJECTS_LOCAL:
/* First, it verifies if the timer must be stopped */
if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
8003358: 2b 82 00 24 lw r2,(sp+36)
800335c: 5c 41 00 03 bne r2,r1,8003368 <timer_settime+0xe4>
8003360: 2b 8e 00 28 lw r14,(sp+40)
8003364: 45 c2 00 3a be r14,r2,800344c <timer_settime+0x1c8>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
8003368: b9 80 08 00 mv r1,r12
800336c: f8 00 0f 0d calli 8006fa0 <_Timespec_To_ticks>
8003370: 59 61 00 64 sw (r11+100),r1
initial_period = _Timespec_To_ticks( &normalize.it_value );
8003374: 37 81 00 24 addi r1,sp,36
8003378: f8 00 0f 0a calli 8006fa0 <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
800337c: 29 63 00 08 lw r3,(r11+8)
8003380: 78 04 08 00 mvhi r4,0x800
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
initial_period = _Timespec_To_ticks( &normalize.it_value );
8003384: b8 20 10 00 mv r2,r1
activated = _POSIX_Timer_Insert_helper(
8003388: 38 84 34 c8 ori r4,r4,0x34c8
800338c: 35 61 00 10 addi r1,r11,16
8003390: b9 60 28 00 mv r5,r11
8003394: f8 00 1b ad calli 800a248 <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
8003398: 44 20 00 16 be r1,r0,80033f0 <timer_settime+0x16c>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
800339c: 45 a0 00 09 be r13,r0,80033c0 <timer_settime+0x13c>
*ovalue = ptimer->timer_data;
80033a0: 29 61 00 54 lw r1,(r11+84)
80033a4: 59 a1 00 00 sw (r13+0),r1
80033a8: 29 61 00 58 lw r1,(r11+88)
80033ac: 59 a1 00 04 sw (r13+4),r1
80033b0: 29 61 00 5c lw r1,(r11+92)
80033b4: 59 a1 00 08 sw (r13+8),r1
80033b8: 29 61 00 60 lw r1,(r11+96)
80033bc: 59 a1 00 0c sw (r13+12),r1
ptimer->timer_data = normalize;
80033c0: 2b 82 00 1c lw r2,(sp+28)
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
_TOD_Get( &ptimer->time );
80033c4: 35 61 00 6c addi r1,r11,108
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
*ovalue = ptimer->timer_data;
ptimer->timer_data = normalize;
80033c8: 59 62 00 54 sw (r11+84),r2
80033cc: 2b 82 00 20 lw r2,(sp+32)
80033d0: 59 62 00 58 sw (r11+88),r2
80033d4: 2b 82 00 24 lw r2,(sp+36)
80033d8: 59 62 00 5c sw (r11+92),r2
80033dc: 2b 82 00 28 lw r2,(sp+40)
80033e0: 59 62 00 60 sw (r11+96),r2
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
80033e4: 34 02 00 03 mvi r2,3
80033e8: 31 62 00 3c sb (r11+60),r2
_TOD_Get( &ptimer->time );
80033ec: f8 00 05 04 calli 80047fc <_TOD_Get>
_Thread_Enable_dispatch();
80033f0: f8 00 0b 49 calli 8006114 <_Thread_Enable_dispatch>
return 0;
80033f4: 34 01 00 00 mvi r1,0
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
80033f8: 2b 9d 00 04 lw ra,(sp+4)
80033fc: 2b 8b 00 18 lw r11,(sp+24)
8003400: 2b 8c 00 14 lw r12,(sp+20)
8003404: 2b 8d 00 10 lw r13,(sp+16)
8003408: 2b 8e 00 0c lw r14,(sp+12)
800340c: 2b 8f 00 08 lw r15,(sp+8)
8003410: 37 9c 00 34 addi sp,sp,52
8003414: c3 a0 00 00 ret
normalize = *value;
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
struct timespec now;
_TOD_Get( &now );
8003418: 37 8b 00 2c addi r11,sp,44
800341c: b9 60 08 00 mv r1,r11
8003420: f8 00 04 f7 calli 80047fc <_TOD_Get>
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
8003424: 37 8f 00 24 addi r15,sp,36
8003428: b9 60 08 00 mv r1,r11
800342c: b9 e0 10 00 mv r2,r15
8003430: f8 00 0e af calli 8006eec <_Timespec_Greater_than>
8003434: 5c 20 ff bd bne r1,r0,8003328 <timer_settime+0xa4>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
8003438: b9 e0 10 00 mv r2,r15
800343c: b9 60 08 00 mv r1,r11
8003440: b9 e0 18 00 mv r3,r15
8003444: f8 00 0e c1 calli 8006f48 <_Timespec_Subtract>
8003448: e3 ff ff af bi 8003304 <timer_settime+0x80>
case OBJECTS_LOCAL:
/* First, it verifies if the timer must be stopped */
if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) {
/* Stop the timer */
(void) _Watchdog_Remove( &ptimer->Timer );
800344c: 35 61 00 10 addi r1,r11,16
8003450: f8 00 10 5a calli 80075b8 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
8003454: 45 ae 00 09 be r13,r14,8003478 <timer_settime+0x1f4>
*ovalue = ptimer->timer_data;
8003458: 29 61 00 54 lw r1,(r11+84)
800345c: 59 a1 00 00 sw (r13+0),r1
8003460: 29 61 00 58 lw r1,(r11+88)
8003464: 59 a1 00 04 sw (r13+4),r1
8003468: 29 61 00 5c lw r1,(r11+92)
800346c: 59 a1 00 08 sw (r13+8),r1
8003470: 29 61 00 60 lw r1,(r11+96)
8003474: 59 a1 00 0c sw (r13+12),r1
/* The new data are set */
ptimer->timer_data = normalize;
8003478: 2b 81 00 1c lw r1,(sp+28)
800347c: 59 61 00 54 sw (r11+84),r1
8003480: 2b 81 00 20 lw r1,(sp+32)
8003484: 59 61 00 58 sw (r11+88),r1
8003488: 2b 81 00 24 lw r1,(sp+36)
800348c: 59 61 00 5c sw (r11+92),r1
8003490: 2b 81 00 28 lw r1,(sp+40)
8003494: 59 61 00 60 sw (r11+96),r1
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
8003498: 34 01 00 04 mvi r1,4
800349c: 31 61 00 3c sb (r11+60),r1
/* Returns with success */
_Thread_Enable_dispatch();
80034a0: f8 00 0b 1d calli 8006114 <_Thread_Enable_dispatch>
return 0;
80034a4: 34 01 00 00 mvi r1,0
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
}
80034a8: 2b 9d 00 04 lw ra,(sp+4)
80034ac: 2b 8b 00 18 lw r11,(sp+24)
80034b0: 2b 8c 00 14 lw r12,(sp+20)
80034b4: 2b 8d 00 10 lw r13,(sp+16)
80034b8: 2b 8e 00 0c lw r14,(sp+12)
80034bc: 2b 8f 00 08 lw r15,(sp+8)
80034c0: 37 9c 00 34 addi sp,sp,52
80034c4: c3 a0 00 00 ret
08003054 <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
8003054: 37 9c ff e4 addi sp,sp,-28
8003058: 5b 8b 00 14 sw (sp+20),r11
800305c: 5b 8c 00 10 sw (sp+16),r12
8003060: 5b 8d 00 0c sw (sp+12),r13
8003064: 5b 8e 00 08 sw (sp+8),r14
8003068: 5b 9d 00 04 sw (sp+4),ra
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
800306c: 78 0b 08 01 mvhi r11,0x801
8003070: 39 6b 81 60 ori r11,r11,0x8160
8003074: 29 62 00 1c lw r2,(r11+28)
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
8003078: b8 20 60 00 mv r12,r1
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
800307c: 44 40 00 55 be r2,r0,80031d0 <ualarm+0x17c>
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
8003080: b9 60 08 00 mv r1,r11
8003084: f8 00 0f be calli 8006f7c <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
8003088: 34 21 ff fe addi r1,r1,-2
800308c: 34 02 00 01 mvi r2,1
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
8003090: 34 0d 00 00 mvi r13,0
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
8003094: 54 22 00 24 bgu r1,r2,8003124 <ualarm+0xd0> <== NEVER TAKEN
* boot. Since alarm() is dealing in seconds, we must account for
* this.
*/
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
8003098: 29 64 00 14 lw r4,(r11+20)
800309c: 29 61 00 0c lw r1,(r11+12)
80030a0: 29 63 00 18 lw r3,(r11+24)
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
80030a4: 37 82 00 18 addi r2,sp,24
* boot. Since alarm() is dealing in seconds, we must account for
* this.
*/
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
80030a8: b4 81 08 00 add r1,r4,r1
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
80030ac: c8 23 08 00 sub r1,r1,r3
80030b0: f8 00 0d b3 calli 800677c <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
80030b4: 2b 85 00 18 lw r5,(sp+24)
remaining += tp.tv_nsec / 1000;
80030b8: 2b 81 00 1c lw r1,(sp+28)
80030bc: 34 02 03 e8 mvi r2,1000
ticks = the_timer->initial;
ticks -= (the_timer->stop_time - the_timer->start_time);
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
80030c0: b4 a5 18 00 add r3,r5,r5
80030c4: b4 63 18 00 add r3,r3,r3
80030c8: b4 63 18 00 add r3,r3,r3
80030cc: b4 63 20 00 add r4,r3,r3
80030d0: b4 84 20 00 add r4,r4,r4
80030d4: b4 84 20 00 add r4,r4,r4
80030d8: b4 84 20 00 add r4,r4,r4
80030dc: b4 84 20 00 add r4,r4,r4
80030e0: c8 83 20 00 sub r4,r4,r3
80030e4: b4 84 18 00 add r3,r4,r4
80030e8: b4 63 18 00 add r3,r3,r3
80030ec: b4 63 18 00 add r3,r3,r3
80030f0: b4 63 18 00 add r3,r3,r3
80030f4: b4 63 18 00 add r3,r3,r3
80030f8: b4 63 18 00 add r3,r3,r3
80030fc: c8 64 18 00 sub r3,r3,r4
8003100: b4 65 68 00 add r13,r3,r5
8003104: b5 ad 68 00 add r13,r13,r13
8003108: b5 ad 68 00 add r13,r13,r13
800310c: b5 ad 68 00 add r13,r13,r13
8003110: b5 ad 68 00 add r13,r13,r13
8003114: b5 ad 68 00 add r13,r13,r13
8003118: b5 ad 68 00 add r13,r13,r13
remaining += tp.tv_nsec / 1000;
800311c: f8 00 44 7d calli 8014310 <__divsi3>
8003120: b4 2d 68 00 add r13,r1,r13
/*
* If useconds is non-zero, then the caller wants to schedule
* the alarm repeatedly at that interval. If the interval is
* less than a single clock tick, then fudge it to a clock tick.
*/
if ( useconds ) {
8003124: 45 80 00 23 be r12,r0,80031b0 <ualarm+0x15c>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
8003128: 78 01 08 01 mvhi r1,0x801
800312c: 38 21 56 0c ori r1,r1,0x560c
8003130: 28 22 00 00 lw r2,(r1+0)
8003134: b9 80 08 00 mv r1,r12
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
ticks = _Timespec_To_ticks( &tp );
8003138: 37 8e 00 18 addi r14,sp,24
* less than a single clock tick, then fudge it to a clock tick.
*/
if ( useconds ) {
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
800313c: f8 00 44 ce calli 8014474 <__udivsi3>
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
8003140: 78 03 08 01 mvhi r3,0x801
8003144: 38 63 56 0c ori r3,r3,0x560c
8003148: 28 62 00 00 lw r2,(r3+0)
* less than a single clock tick, then fudge it to a clock tick.
*/
if ( useconds ) {
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
800314c: 5b 81 00 18 sw (sp+24),r1
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
8003150: b9 80 08 00 mv r1,r12
8003154: f8 00 44 d8 calli 80144b4 <__umodsi3>
8003158: b4 21 10 00 add r2,r1,r1
800315c: b4 42 10 00 add r2,r2,r2
8003160: b4 42 10 00 add r2,r2,r2
8003164: b4 42 18 00 add r3,r2,r2
8003168: b4 63 18 00 add r3,r3,r3
800316c: b4 43 10 00 add r2,r2,r3
8003170: b4 42 18 00 add r3,r2,r2
8003174: b4 63 18 00 add r3,r3,r3
8003178: b4 43 10 00 add r2,r2,r3
800317c: b4 42 18 00 add r3,r2,r2
8003180: b4 63 18 00 add r3,r3,r3
8003184: b4 43 18 00 add r3,r2,r3
ticks = _Timespec_To_ticks( &tp );
8003188: b9 c0 08 00 mv r1,r14
*/
if ( useconds ) {
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
800318c: 5b 83 00 1c sw (sp+28),r3
ticks = _Timespec_To_ticks( &tp );
8003190: f8 00 0d b7 calli 800686c <_Timespec_To_ticks>
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
8003194: b9 c0 08 00 mv r1,r14
8003198: f8 00 0d b5 calli 800686c <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
800319c: 59 61 00 0c sw (r11+12),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
80031a0: 78 01 08 01 mvhi r1,0x801
80031a4: b9 60 10 00 mv r2,r11
80031a8: 38 21 79 a8 ori r1,r1,0x79a8
80031ac: f8 00 0f 0b calli 8006dd8 <_Watchdog_Insert>
}
return remaining;
}
80031b0: b9 a0 08 00 mv r1,r13
80031b4: 2b 9d 00 04 lw ra,(sp+4)
80031b8: 2b 8b 00 14 lw r11,(sp+20)
80031bc: 2b 8c 00 10 lw r12,(sp+16)
80031c0: 2b 8d 00 0c lw r13,(sp+12)
80031c4: 2b 8e 00 08 lw r14,(sp+8)
80031c8: 37 9c 00 1c addi sp,sp,28
80031cc: c3 a0 00 00 ret
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
80031d0: 78 01 08 00 mvhi r1,0x800
80031d4: 38 21 30 0c ori r1,r1,0x300c
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
80031d8: 59 60 00 08 sw (r11+8),r0
the_watchdog->routine = routine;
80031dc: 59 61 00 1c sw (r11+28),r1
the_watchdog->id = id;
80031e0: 59 60 00 20 sw (r11+32),r0
the_watchdog->user_data = user_data;
80031e4: 59 60 00 24 sw (r11+36),r0
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
80031e8: 34 0d 00 00 mvi r13,0
80031ec: e3 ff ff ce bi 8003124 <ualarm+0xd0>
08002f80 <uname>:
*/
int uname(
struct utsname *name
)
{
8002f80: 37 9c ff f8 addi sp,sp,-8
8002f84: 5b 8b 00 08 sw (sp+8),r11
8002f88: 5b 9d 00 04 sw (sp+4),ra
8002f8c: b8 20 58 00 mv r11,r1
release = 5.3
version = Generic_101318-12
machine = sun4m
*/
if ( !name )
8002f90: 44 20 00 23 be r1,r0,800301c <uname+0x9c> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EFAULT );
strncpy( name->sysname, "RTEMS", sizeof(name->sysname) );
8002f94: 78 02 08 01 mvhi r2,0x801
8002f98: 38 42 db 74 ori r2,r2,0xdb74
8002f9c: 34 03 00 20 mvi r3,32
8002fa0: f8 00 30 1c calli 800f010 <strncpy>
snprintf( name->nodename, sizeof(name->nodename), "Node %" PRId16, _Objects_Local_node );
8002fa4: 78 03 08 01 mvhi r3,0x801
8002fa8: 34 04 00 01 mvi r4,1
8002fac: 34 02 00 20 mvi r2,32
8002fb0: 38 63 db 7c ori r3,r3,0xdb7c
8002fb4: 35 61 00 20 addi r1,r11,32
8002fb8: f8 00 2e b2 calli 800ea80 <snprintf>
strncpy( name->release, RTEMS_VERSION, sizeof(name->release) );
8002fbc: 78 02 08 01 mvhi r2,0x801
8002fc0: 38 42 db 84 ori r2,r2,0xdb84
8002fc4: 34 03 00 20 mvi r3,32
8002fc8: 35 61 00 40 addi r1,r11,64
8002fcc: f8 00 30 11 calli 800f010 <strncpy>
strncpy( name->version, "", sizeof(name->version) );
8002fd0: 78 02 08 01 mvhi r2,0x801
8002fd4: 38 42 d5 40 ori r2,r2,0xd540
8002fd8: 34 03 00 20 mvi r3,32
8002fdc: 35 61 00 60 addi r1,r11,96
8002fe0: f8 00 30 0c calli 800f010 <strncpy>
snprintf( name->machine, sizeof(name->machine), "%s/%s", CPU_NAME, CPU_MODEL_NAME );
8002fe4: 78 03 08 01 mvhi r3,0x801
8002fe8: 78 04 08 01 mvhi r4,0x801
8002fec: 78 05 08 01 mvhi r5,0x801
8002ff0: 35 61 00 80 addi r1,r11,128
8002ff4: 34 02 00 20 mvi r2,32
8002ff8: 38 63 db 90 ori r3,r3,0xdb90
8002ffc: 38 84 db 98 ori r4,r4,0xdb98
8003000: 38 a5 db a0 ori r5,r5,0xdba0
8003004: f8 00 2e 9f calli 800ea80 <snprintf>
return 0;
8003008: 34 01 00 00 mvi r1,0
}
800300c: 2b 9d 00 04 lw ra,(sp+4)
8003010: 2b 8b 00 08 lw r11,(sp+8)
8003014: 37 9c 00 08 addi sp,sp,8
8003018: c3 a0 00 00 ret
version = Generic_101318-12
machine = sun4m
*/
if ( !name )
rtems_set_errno_and_return_minus_one( EFAULT );
800301c: f8 00 2b 13 calli 800dc68 <__errno>
8003020: 34 02 00 0e mvi r2,14
8003024: 58 22 00 00 sw (r1+0),r2
8003028: 34 01 ff ff mvi r1,-1
800302c: e3 ff ff f8 bi 800300c <uname+0x8c>
08003a88 <unlink>:
#include <rtems/seterr.h>
int unlink(
const char *path
)
{
8003a88: 37 9c ff bc addi sp,sp,-68
8003a8c: 5b 8b 00 18 sw (sp+24),r11
8003a90: 5b 8c 00 14 sw (sp+20),r12
8003a94: 5b 8d 00 10 sw (sp+16),r13
8003a98: 5b 8e 00 0c sw (sp+12),r14
8003a9c: 5b 8f 00 08 sw (sp+8),r15
8003aa0: 5b 9d 00 04 sw (sp+4),ra
8003aa4: b8 20 68 00 mv r13,r1
/*
* Get the node to be unlinked. Find the parent path first.
*/
parentpathlen = rtems_filesystem_dirname ( path );
8003aa8: fb ff fa f8 calli 8002688 <rtems_filesystem_dirname>
if ( parentpathlen == 0 )
8003aac: 5c 20 00 40 bne r1,r0,8003bac <unlink+0x124>
rtems_filesystem_get_start_loc( path, &i, &parentloc );
8003ab0: 37 8c 00 30 addi r12,sp,48
8003ab4: b9 a0 08 00 mv r1,r13
8003ab8: 37 82 00 44 addi r2,sp,68
8003abc: b9 80 18 00 mv r3,r12
8003ac0: fb ff ff ba calli 80039a8 <rtems_filesystem_get_start_loc>
8003ac4: 34 0b 00 00 mvi r11,0
const char *name;
rtems_filesystem_location_info_t parentloc;
rtems_filesystem_location_info_t loc;
int i;
int result;
bool free_parentloc = false;
8003ac8: 34 0f 00 00 mvi r15,0
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
8003acc: 2b 82 00 30 lw r2,(sp+48)
name = path + parentpathlen;
8003ad0: b5 ab 58 00 add r11,r13,r11
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8003ad4: b9 60 08 00 mv r1,r11
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
8003ad8: 5b 82 00 1c sw (sp+28),r2
8003adc: 2b 82 00 34 lw r2,(sp+52)
8003ae0: 5b 82 00 20 sw (sp+32),r2
8003ae4: 2b 82 00 38 lw r2,(sp+56)
8003ae8: 5b 82 00 24 sw (sp+36),r2
8003aec: 2b 82 00 3c lw r2,(sp+60)
8003af0: 5b 82 00 28 sw (sp+40),r2
8003af4: 2b 82 00 40 lw r2,(sp+64)
8003af8: 5b 82 00 2c sw (sp+44),r2
name = path + parentpathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8003afc: f8 00 3d 37 calli 8012fd8 <strlen>
8003b00: b8 20 10 00 mv r2,r1
8003b04: b9 60 08 00 mv r1,r11
8003b08: fb ff fa f5 calli 80026dc <rtems_filesystem_prefix_separators>
8003b0c: b5 61 68 00 add r13,r11,r1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
8003b10: b9 a0 08 00 mv r1,r13
8003b14: f8 00 3d 31 calli 8012fd8 <strlen>
8003b18: 37 8b 00 1c addi r11,sp,28
8003b1c: b8 20 10 00 mv r2,r1
8003b20: 34 03 00 00 mvi r3,0
8003b24: b9 a0 08 00 mv r1,r13
8003b28: b9 60 20 00 mv r4,r11
8003b2c: 34 05 00 00 mvi r5,0
8003b30: fb ff fa 98 calli 8002590 <rtems_filesystem_evaluate_relative_path>
0, &loc, false );
if ( result != 0 ) {
8003b34: 5c 20 00 19 bne r1,r0,8003b98 <unlink+0x110>
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return -1;
}
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
8003b38: 2b 82 00 28 lw r2,(sp+40)
8003b3c: b9 60 08 00 mv r1,r11
8003b40: 28 42 00 10 lw r2,(r2+16)
8003b44: d8 40 00 00 call r2
8003b48: 34 02 00 01 mvi r2,1
8003b4c: 44 22 00 24 be r1,r2,8003bdc <unlink+0x154>
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
rtems_set_errno_and_return_minus_one( EISDIR );
}
result = (*loc.ops->unlink_h)( &parentloc, &loc );
8003b50: 2b 83 00 28 lw r3,(sp+40)
8003b54: b9 80 08 00 mv r1,r12
8003b58: b9 60 10 00 mv r2,r11
8003b5c: 28 63 00 0c lw r3,(r3+12)
8003b60: d8 60 00 00 call r3
8003b64: b8 20 70 00 mv r14,r1
rtems_filesystem_freenode( &loc );
8003b68: b9 60 08 00 mv r1,r11
8003b6c: fb ff fa fa calli 8002754 <rtems_filesystem_freenode>
if ( free_parentloc )
8003b70: 5d e0 00 0c bne r15,r0,8003ba0 <unlink+0x118>
rtems_filesystem_freenode( &parentloc );
return result;
}
8003b74: b9 c0 08 00 mv r1,r14
8003b78: 2b 9d 00 04 lw ra,(sp+4)
8003b7c: 2b 8b 00 18 lw r11,(sp+24)
8003b80: 2b 8c 00 14 lw r12,(sp+20)
8003b84: 2b 8d 00 10 lw r13,(sp+16)
8003b88: 2b 8e 00 0c lw r14,(sp+12)
8003b8c: 2b 8f 00 08 lw r15,(sp+8)
8003b90: 37 9c 00 44 addi sp,sp,68
8003b94: c3 a0 00 00 ret
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return -1;
8003b98: 34 0e ff ff mvi r14,-1
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
8003b9c: 45 e0 ff f6 be r15,r0,8003b74 <unlink+0xec> <== NEVER TAKEN
result = (*loc.ops->unlink_h)( &parentloc, &loc );
rtems_filesystem_freenode( &loc );
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
8003ba0: b9 80 08 00 mv r1,r12
8003ba4: fb ff fa ec calli 8002754 <rtems_filesystem_freenode>
8003ba8: e3 ff ff f3 bi 8003b74 <unlink+0xec>
parentpathlen = rtems_filesystem_dirname ( path );
if ( parentpathlen == 0 )
rtems_filesystem_get_start_loc( path, &i, &parentloc );
else {
result = rtems_filesystem_evaluate_path( path, parentpathlen,
8003bac: b8 20 58 00 mv r11,r1
8003bb0: 37 8c 00 30 addi r12,sp,48
8003bb4: b9 a0 08 00 mv r1,r13
8003bb8: b9 60 10 00 mv r2,r11
8003bbc: 34 03 00 02 mvi r3,2
8003bc0: b9 80 20 00 mv r4,r12
8003bc4: 34 05 00 00 mvi r5,0
8003bc8: fb ff fa 95 calli 800261c <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
return -1;
8003bcc: 34 0e ff ff mvi r14,-1
else {
result = rtems_filesystem_evaluate_path( path, parentpathlen,
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
8003bd0: 5c 20 ff e9 bne r1,r0,8003b74 <unlink+0xec> <== NEVER TAKEN
return -1;
free_parentloc = true;
8003bd4: 34 0f 00 01 mvi r15,1
8003bd8: e3 ff ff bd bi 8003acc <unlink+0x44>
rtems_filesystem_freenode( &parentloc );
return -1;
}
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
rtems_filesystem_freenode( &loc );
8003bdc: b9 60 08 00 mv r1,r11
8003be0: fb ff fa dd calli 8002754 <rtems_filesystem_freenode>
if ( free_parentloc )
8003be4: 45 e0 00 03 be r15,r0,8003bf0 <unlink+0x168>
rtems_filesystem_freenode( &parentloc );
8003be8: b9 80 08 00 mv r1,r12
8003bec: fb ff fa da calli 8002754 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EISDIR );
8003bf0: f8 00 38 99 calli 8011e54 <__errno>
8003bf4: 34 02 00 15 mvi r2,21
8003bf8: 58 22 00 00 sw (r1+0),r2
8003bfc: 34 0e ff ff mvi r14,-1
8003c00: e3 ff ff dd bi 8003b74 <unlink+0xec>
08003bb8 <unmount>:
*/
int unmount(
const char *path
)
{
8003bb8: 37 9c ff dc addi sp,sp,-36
8003bbc: 5b 8b 00 10 sw (sp+16),r11
8003bc0: 5b 8c 00 0c sw (sp+12),r12
8003bc4: 5b 8d 00 08 sw (sp+8),r13
8003bc8: 5b 9d 00 04 sw (sp+4),ra
8003bcc: b8 20 58 00 mv r11,r1
* The root node of the mounted filesytem.
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
8003bd0: 37 8c 00 14 addi r12,sp,20
8003bd4: f8 00 2d c7 calli 800f2f0 <strlen>
8003bd8: b8 20 10 00 mv r2,r1
8003bdc: 34 03 00 00 mvi r3,0
8003be0: b9 60 08 00 mv r1,r11
8003be4: b9 80 20 00 mv r4,r12
8003be8: 34 05 00 01 mvi r5,1
8003bec: fb ff f9 aa calli 8002294 <rtems_filesystem_evaluate_path>
8003bf0: 5c 20 00 23 bne r1,r0,8003c7c <unmount+0xc4>
return -1;
mt_entry = loc.mt_entry;
8003bf4: 2b 8b 00 24 lw r11,(sp+36)
/*
* Verify this is the root node for the file system to be unmounted.
*/
if ( fs_root_loc->node_access != loc.node_access ){
8003bf8: 2b 81 00 14 lw r1,(sp+20)
8003bfc: 29 62 00 1c lw r2,(r11+28)
8003c00: 5c 41 00 27 bne r2,r1,8003c9c <unmount+0xe4>
/*
* Free the loc node and just use the nodes from the mt_entry .
*/
rtems_filesystem_freenode( &loc );
8003c04: b9 80 08 00 mv r1,r12
8003c08: fb ff f9 f1 calli 80023cc <rtems_filesystem_freenode>
* that made the current node thread based instead
* of system based? I thought it was but it doesn't
* look like it in this version.
*/
if ( rtems_filesystem_current.mt_entry == mt_entry )
8003c0c: 78 01 08 01 mvhi r1,0x801
8003c10: 38 21 71 a4 ori r1,r1,0x71a4
8003c14: 28 21 00 00 lw r1,(r1+0)
8003c18: 28 21 00 14 lw r1,(r1+20)
8003c1c: 44 2b 00 2d be r1,r11,8003cd0 <unmount+0x118>
/*
* Verify there are no file systems below the path specified
*/
if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point,
8003c20: 29 62 00 2c lw r2,(r11+44)
8003c24: 78 01 08 00 mvhi r1,0x800
8003c28: 38 21 3b ac ori r1,r1,0x3bac
8003c2c: fb ff fc 99 calli 8002e90 <rtems_filesystem_mount_iterate>
8003c30: 5c 20 00 28 bne r1,r0,8003cd0 <unmount+0x118>
* Run the file descriptor table to determine if there are any file
* descriptors that are currently active and reference nodes in the
* file system that we are trying to unmount
*/
if ( rtems_libio_is_open_files_in_fs( mt_entry ) == 1 )
8003c34: b9 60 08 00 mv r1,r11
8003c38: fb ff fb 05 calli 800284c <rtems_libio_is_open_files_in_fs>
8003c3c: 34 02 00 01 mvi r2,1
8003c40: 44 22 00 24 be r1,r2,8003cd0 <unmount+0x118>
* Allow the file system being unmounted on to do its cleanup.
* If it fails it will set the errno to the approprate value
* and the fileystem will not be modified.
*/
if (( fs_mount_loc->ops->unmount_h )( mt_entry ) != 0 )
8003c44: 29 62 00 14 lw r2,(r11+20)
8003c48: b9 60 08 00 mv r1,r11
return -1;
8003c4c: 34 0c ff ff mvi r12,-1
* Allow the file system being unmounted on to do its cleanup.
* If it fails it will set the errno to the approprate value
* and the fileystem will not be modified.
*/
if (( fs_mount_loc->ops->unmount_h )( mt_entry ) != 0 )
8003c50: 28 42 00 28 lw r2,(r2+40)
8003c54: d8 40 00 00 call r2
8003c58: b8 20 68 00 mv r13,r1
8003c5c: 44 20 00 28 be r1,r0,8003cfc <unmount+0x144> <== ALWAYS TAKEN
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
8003c60: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003c64: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8003c68: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED
8003c6c: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED
8003c70: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED
8003c74: 37 9c 00 24 addi sp,sp,36 <== NOT EXECUTED
8003c78: c3 a0 00 00 ret <== NOT EXECUTED
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
return -1;
8003c7c: 34 0c ff ff mvi r12,-1
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
8003c80: b9 80 08 00 mv r1,r12
8003c84: 2b 9d 00 04 lw ra,(sp+4)
8003c88: 2b 8b 00 10 lw r11,(sp+16)
8003c8c: 2b 8c 00 0c lw r12,(sp+12)
8003c90: 2b 8d 00 08 lw r13,(sp+8)
8003c94: 37 9c 00 24 addi sp,sp,36
8003c98: c3 a0 00 00 ret
/*
* Verify this is the root node for the file system to be unmounted.
*/
if ( fs_root_loc->node_access != loc.node_access ){
rtems_filesystem_freenode( &loc );
8003c9c: b9 80 08 00 mv r1,r12
8003ca0: fb ff f9 cb calli 80023cc <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EACCES );
8003ca4: f8 00 27 f6 calli 800dc7c <__errno>
8003ca8: 34 02 00 0d mvi r2,13
8003cac: 34 0c ff ff mvi r12,-1
8003cb0: 58 22 00 00 sw (r1+0),r2
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
8003cb4: b9 80 08 00 mv r1,r12
8003cb8: 2b 9d 00 04 lw ra,(sp+4)
8003cbc: 2b 8b 00 10 lw r11,(sp+16)
8003cc0: 2b 8c 00 0c lw r12,(sp+12)
8003cc4: 2b 8d 00 08 lw r13,(sp+8)
8003cc8: 37 9c 00 24 addi sp,sp,36
8003ccc: c3 a0 00 00 ret
* descriptors that are currently active and reference nodes in the
* file system that we are trying to unmount
*/
if ( rtems_libio_is_open_files_in_fs( mt_entry ) == 1 )
rtems_set_errno_and_return_minus_one( EBUSY );
8003cd0: f8 00 27 eb calli 800dc7c <__errno>
8003cd4: 34 02 00 10 mvi r2,16
8003cd8: 34 0c ff ff mvi r12,-1
8003cdc: 58 22 00 00 sw (r1+0),r2
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
8003ce0: b9 80 08 00 mv r1,r12
8003ce4: 2b 9d 00 04 lw ra,(sp+4)
8003ce8: 2b 8b 00 10 lw r11,(sp+16)
8003cec: 2b 8c 00 0c lw r12,(sp+12)
8003cf0: 2b 8d 00 08 lw r13,(sp+8)
8003cf4: 37 9c 00 24 addi sp,sp,36
8003cf8: c3 a0 00 00 ret
* NOTE: Fatal error is called in a case which should never happen
* This was response was questionable but the best we could
* come up with.
*/
if ((fs_root_loc->ops->fsunmount_me_h )( mt_entry ) != 0){
8003cfc: 29 62 00 28 lw r2,(r11+40)
8003d00: b9 60 08 00 mv r1,r11
8003d04: 28 42 00 2c lw r2,(r2+44)
8003d08: d8 40 00 00 call r2
8003d0c: 5c 2d 00 17 bne r1,r13,8003d68 <unmount+0x1b0> <== NEVER TAKEN
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8003d10: 78 0c 08 01 mvhi r12,0x801
8003d14: 39 8c 78 50 ori r12,r12,0x7850
8003d18: 29 81 00 00 lw r1,(r12+0)
8003d1c: 34 02 00 00 mvi r2,0
8003d20: 34 03 00 00 mvi r3,0
8003d24: f8 00 01 c1 calli 8004428 <rtems_semaphore_obtain>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8003d28: b9 60 08 00 mv r1,r11
8003d2c: f8 00 04 0a calli 8004d54 <_Chain_Extract>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
8003d30: 29 81 00 00 lw r1,(r12+0)
*/
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
8003d34: 34 0c 00 00 mvi r12,0
8003d38: f8 00 02 18 calli 8004598 <rtems_semaphore_release>
/*
* Free the memory node that was allocated in mount
* Free the memory associated with the extracted mount table entry.
*/
rtems_filesystem_freenode( fs_mount_loc );
8003d3c: 35 61 00 08 addi r1,r11,8
8003d40: fb ff f9 a3 calli 80023cc <rtems_filesystem_freenode>
free( mt_entry );
8003d44: b9 60 08 00 mv r1,r11
8003d48: fb ff f9 a9 calli 80023ec <free>
return 0;
}
8003d4c: b9 80 08 00 mv r1,r12
8003d50: 2b 9d 00 04 lw ra,(sp+4)
8003d54: 2b 8b 00 10 lw r11,(sp+16)
8003d58: 2b 8c 00 0c lw r12,(sp+12)
8003d5c: 2b 8d 00 08 lw r13,(sp+8)
8003d60: 37 9c 00 24 addi sp,sp,36
8003d64: c3 a0 00 00 ret
* This was response was questionable but the best we could
* come up with.
*/
if ((fs_root_loc->ops->fsunmount_me_h )( mt_entry ) != 0){
if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 )
8003d68: 29 62 00 14 lw r2,(r11+20) <== NOT EXECUTED
8003d6c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003d70: 28 42 00 20 lw r2,(r2+32) <== NOT EXECUTED
8003d74: d8 40 00 00 call r2 <== NOT EXECUTED
8003d78: 44 20 ff ba be r1,r0,8003c60 <unmount+0xa8> <== NOT EXECUTED
rtems_fatal_error_occurred( 0 );
8003d7c: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8003d80: f8 00 02 ed calli 8004934 <rtems_fatal_error_occurred> <== NOT EXECUTED
08002664 <vprintk>:
*/
void vprintk(
const char *fmt,
va_list ap
)
{
8002664: 37 9c ff a4 addi sp,sp,-92
8002668: 5b 8b 00 44 sw (sp+68),r11
800266c: 5b 8c 00 40 sw (sp+64),r12
8002670: 5b 8d 00 3c sw (sp+60),r13
8002674: 5b 8e 00 38 sw (sp+56),r14
8002678: 5b 8f 00 34 sw (sp+52),r15
800267c: 5b 90 00 30 sw (sp+48),r16
8002680: 5b 91 00 2c sw (sp+44),r17
8002684: 5b 92 00 28 sw (sp+40),r18
8002688: 5b 93 00 24 sw (sp+36),r19
800268c: 5b 94 00 20 sw (sp+32),r20
8002690: 5b 95 00 1c sw (sp+28),r21
8002694: 5b 96 00 18 sw (sp+24),r22
8002698: 5b 97 00 14 sw (sp+20),r23
800269c: 5b 98 00 10 sw (sp+16),r24
80026a0: 5b 99 00 0c sw (sp+12),r25
80026a4: 5b 9b 00 08 sw (sp+8),fp
80026a8: 5b 9d 00 04 sw (sp+4),ra
80026ac: b8 20 60 00 mv r12,r1
for (; *fmt != '\0'; fmt++) {
80026b0: 40 21 00 00 lbu r1,(r1+0)
*/
void vprintk(
const char *fmt,
va_list ap
)
{
80026b4: b8 40 b8 00 mv r23,r2
for (; *fmt != '\0'; fmt++) {
80026b8: 44 20 00 12 be r1,r0,8002700 <vprintk+0x9c> <== NEVER TAKEN
char *s, *str;
str = va_arg(ap, char *);
if ( str == NULL ) {
str = "";
80026bc: 78 02 08 01 mvhi r2,0x801
bool sign = false;
char lead = ' ';
char c;
if (*fmt != '%') {
BSP_output_char(*fmt);
80026c0: 78 0d 08 01 mvhi r13,0x801
80026c4: 78 13 08 01 mvhi r19,0x801
char *s, *str;
str = va_arg(ap, char *);
if ( str == NULL ) {
str = "";
80026c8: 38 42 33 3c ori r2,r2,0x333c
bool minus = false;
bool sign = false;
char lead = ' ';
char c;
if (*fmt != '%') {
80026cc: 34 18 00 25 mvi r24,37
BSP_output_char(*fmt);
80026d0: 39 ad 41 0c ori r13,r13,0x410c
}
if (*fmt == '-' ) {
minus = true;
fmt++;
}
while (*fmt >= '0' && *fmt <= '9' ) {
80026d4: 34 15 00 09 mvi r21,9
width *= 10;
width += ((unsigned) *fmt - '0');
fmt++;
}
if ((c = *fmt) == 'l') {
80026d8: 34 1b 00 6c mvi fp,108
lflag = true;
c = *++fmt;
}
if ( c == 'c' ) {
80026dc: 34 19 00 63 mvi r25,99
80026e0: 3a 73 34 6c ori r19,r19,0x346c
char *s, *str;
str = va_arg(ap, char *);
if ( str == NULL ) {
str = "";
80026e4: 5b 82 00 48 sw (sp+72),r2
bool minus = false;
bool sign = false;
char lead = ' ';
char c;
if (*fmt != '%') {
80026e8: 44 38 00 19 be r1,r24,800274c <vprintk+0xe8>
BSP_output_char(*fmt);
80026ec: 29 a2 00 00 lw r2,(r13+0)
80026f0: d8 40 00 00 call r2
void vprintk(
const char *fmt,
va_list ap
)
{
for (; *fmt != '\0'; fmt++) {
80026f4: 35 8c 00 01 addi r12,r12,1
80026f8: 41 81 00 00 lbu r1,(r12+0)
80026fc: 5c 20 ff fb bne r1,r0,80026e8 <vprintk+0x84>
sign,
width,
lead
);
}
}
8002700: 2b 9d 00 04 lw ra,(sp+4)
8002704: 2b 8b 00 44 lw r11,(sp+68)
8002708: 2b 8c 00 40 lw r12,(sp+64)
800270c: 2b 8d 00 3c lw r13,(sp+60)
8002710: 2b 8e 00 38 lw r14,(sp+56)
8002714: 2b 8f 00 34 lw r15,(sp+52)
8002718: 2b 90 00 30 lw r16,(sp+48)
800271c: 2b 91 00 2c lw r17,(sp+44)
8002720: 2b 92 00 28 lw r18,(sp+40)
8002724: 2b 93 00 24 lw r19,(sp+36)
8002728: 2b 94 00 20 lw r20,(sp+32)
800272c: 2b 95 00 1c lw r21,(sp+28)
8002730: 2b 96 00 18 lw r22,(sp+24)
8002734: 2b 97 00 14 lw r23,(sp+20)
8002738: 2b 98 00 10 lw r24,(sp+16)
800273c: 2b 99 00 0c lw r25,(sp+12)
8002740: 2b 9b 00 08 lw fp,(sp+8)
8002744: 37 9c 00 5c addi sp,sp,92
8002748: c3 a0 00 00 ret
if (*fmt != '%') {
BSP_output_char(*fmt);
continue;
}
fmt++;
800274c: 35 8c 00 01 addi r12,r12,1
if (*fmt == '0' ) {
8002750: 41 83 00 00 lbu r3,(r12+0)
8002754: 34 01 00 30 mvi r1,48
unsigned base = 0;
unsigned width = 0;
bool lflag = false;
bool minus = false;
bool sign = false;
char lead = ' ';
8002758: 34 16 00 20 mvi r22,32
if (*fmt != '%') {
BSP_output_char(*fmt);
continue;
}
fmt++;
if (*fmt == '0' ) {
800275c: 44 61 00 69 be r3,r1,8002900 <vprintk+0x29c>
lead = '0';
fmt++;
}
if (*fmt == '-' ) {
8002760: 34 02 00 2d mvi r2,45
{
for (; *fmt != '\0'; fmt++) {
unsigned base = 0;
unsigned width = 0;
bool lflag = false;
bool minus = false;
8002764: 34 11 00 00 mvi r17,0
fmt++;
if (*fmt == '0' ) {
lead = '0';
fmt++;
}
if (*fmt == '-' ) {
8002768: 44 62 00 62 be r3,r2,80028f0 <vprintk+0x28c>
minus = true;
fmt++;
}
while (*fmt >= '0' && *fmt <= '9' ) {
800276c: 34 61 ff d0 addi r1,r3,-48
8002770: 20 21 00 ff andi r1,r1,0xff
8002774: 34 0b 00 00 mvi r11,0
8002778: 54 35 00 0c bgu r1,r21,80027a8 <vprintk+0x144>
width *= 10;
800277c: b5 6b 58 00 add r11,r11,r11
8002780: b5 6b 20 00 add r4,r11,r11
8002784: b4 84 20 00 add r4,r4,r4
8002788: b5 64 58 00 add r11,r11,r4
width += ((unsigned) *fmt - '0');
fmt++;
800278c: 35 8c 00 01 addi r12,r12,1
minus = true;
fmt++;
}
while (*fmt >= '0' && *fmt <= '9' ) {
width *= 10;
width += ((unsigned) *fmt - '0');
8002790: b5 63 58 00 add r11,r11,r3
}
if (*fmt == '-' ) {
minus = true;
fmt++;
}
while (*fmt >= '0' && *fmt <= '9' ) {
8002794: 41 83 00 00 lbu r3,(r12+0)
width *= 10;
width += ((unsigned) *fmt - '0');
8002798: 35 6b ff d0 addi r11,r11,-48
}
if (*fmt == '-' ) {
minus = true;
fmt++;
}
while (*fmt >= '0' && *fmt <= '9' ) {
800279c: 34 64 ff d0 addi r4,r3,-48
80027a0: 20 84 00 ff andi r4,r4,0xff
80027a4: 52 a4 ff f6 bgeu r21,r4,800277c <vprintk+0x118>
width *= 10;
width += ((unsigned) *fmt - '0');
fmt++;
}
if ((c = *fmt) == 'l') {
80027a8: 44 7b 00 4a be r3,fp,80028d0 <vprintk+0x26c>
lflag = true;
c = *++fmt;
}
if ( c == 'c' ) {
80027ac: 44 79 00 4c be r3,r25,80028dc <vprintk+0x278>
/* need a cast here since va_arg() only takes fully promoted types */
char chr = (char) va_arg(ap, int);
BSP_output_char(chr);
continue;
}
if ( c == 's' ) {
80027b0: 34 01 00 73 mvi r1,115
80027b4: 44 61 00 57 be r3,r1,8002910 <vprintk+0x2ac>
continue;
}
/* must be a numeric format or something unsupported */
if ( c == 'o' || c == 'O' ) {
80027b8: 64 65 00 4f cmpei r5,r3,79
80027bc: 64 64 00 6f cmpei r4,r3,111
base = 8; sign = false;
80027c0: 34 01 00 00 mvi r1,0
continue;
}
/* must be a numeric format or something unsupported */
if ( c == 'o' || c == 'O' ) {
80027c4: b8 a4 20 00 or r4,r5,r4
base = 8; sign = false;
80027c8: 34 11 00 08 mvi r17,8
continue;
}
/* must be a numeric format or something unsupported */
if ( c == 'o' || c == 'O' ) {
80027cc: 5c 80 00 0b bne r4,r0,80027f8 <vprintk+0x194>
base = 8; sign = false;
} else if ( c == 'i' || c == 'I' ||
80027d0: 64 66 00 49 cmpei r6,r3,73
80027d4: 64 65 00 69 cmpei r5,r3,105
c == 'd' || c == 'D' ) {
base = 10; sign = true;
80027d8: 34 01 00 01 mvi r1,1
}
/* must be a numeric format or something unsupported */
if ( c == 'o' || c == 'O' ) {
base = 8; sign = false;
} else if ( c == 'i' || c == 'I' ||
80027dc: b8 c5 28 00 or r5,r6,r5
c == 'd' || c == 'D' ) {
base = 10; sign = true;
80027e0: 34 11 00 0a mvi r17,10
}
/* must be a numeric format or something unsupported */
if ( c == 'o' || c == 'O' ) {
base = 8; sign = false;
} else if ( c == 'i' || c == 'I' ||
80027e4: 5c a4 00 05 bne r5,r4,80027f8 <vprintk+0x194>
c == 'd' || c == 'D' ) {
80027e8: 64 66 00 44 cmpei r6,r3,68
80027ec: 64 64 00 64 cmpei r4,r3,100
80027f0: b8 c4 20 00 or r4,r6,r4
80027f4: 44 85 00 72 be r4,r5,80029bc <vprintk+0x358>
} else {
BSP_output_char(c);
continue;
}
printNum(
80027f8: 2a f0 00 00 lw r16,(r23+0)
lflag ? va_arg(ap, long) : (long) va_arg(ap, int),
80027fc: 36 f7 00 04 addi r23,r23,4
unsigned long unsigned_num;
unsigned long n;
unsigned count;
char toPrint[20];
if ( sign && (num < 0) ) {
8002800: 44 20 00 08 be r1,r0,8002820 <vprintk+0x1bc>
8002804: 4e 00 00 07 bge r16,r0,8002820 <vprintk+0x1bc>
BSP_output_char('-');
8002808: 29 a2 00 00 lw r2,(r13+0)
800280c: 34 01 00 2d mvi r1,45
unsigned_num = (unsigned long) -num;
8002810: c8 10 80 00 sub r16,r0,r16
unsigned long n;
unsigned count;
char toPrint[20];
if ( sign && (num < 0) ) {
BSP_output_char('-');
8002814: d8 40 00 00 call r2
unsigned_num = (unsigned long) -num;
if (maxwidth) maxwidth--;
8002818: 7d 61 00 00 cmpnei r1,r11,0
800281c: c9 61 58 00 sub r11,r11,r1
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
while ((n = unsigned_num / base) > 0) {
8002820: ba 00 08 00 mv r1,r16
8002824: ba 20 10 00 mv r2,r17
8002828: f8 00 3e f4 calli 80123f8 <__udivsi3>
800282c: b8 20 70 00 mv r14,r1
8002830: 22 34 00 ff andi r20,r17,0xff
if (maxwidth) maxwidth--;
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
8002834: 34 0f 00 00 mvi r15,0
8002838: 37 92 00 4c addi r18,sp,76
while ((n = unsigned_num / base) > 0) {
800283c: 5c 20 00 04 bne r1,r0,800284c <vprintk+0x1e8>
8002840: e0 00 00 72 bi 8002a08 <vprintk+0x3a4>
8002844: b9 c0 80 00 mv r16,r14
8002848: b8 20 70 00 mv r14,r1
toPrint[count++] = (char) (unsigned_num - (n * base));
800284c: b9 c0 10 00 mv r2,r14
8002850: ba 80 08 00 mv r1,r20
8002854: f8 00 3e 84 calli 8012264 <__mulsi3>
* console is not yet initialized or in ISR's.
*
* Arguments:
* as in printf: fmt - format string, ... - unnamed arguments.
*/
void vprintk(
8002858: b6 4f 18 00 add r3,r18,r15
unsigned_num = (unsigned long) num;
}
count = 0;
while ((n = unsigned_num / base) > 0) {
toPrint[count++] = (char) (unsigned_num - (n * base));
800285c: ca 01 80 00 sub r16,r16,r1
8002860: 30 70 00 00 sb (r3+0),r16
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
while ((n = unsigned_num / base) > 0) {
8002864: b9 c0 08 00 mv r1,r14
8002868: ba 20 10 00 mv r2,r17
800286c: f8 00 3e e3 calli 80123f8 <__udivsi3>
toPrint[count++] = (char) (unsigned_num - (n * base));
8002870: 35 ef 00 01 addi r15,r15,1
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
while ((n = unsigned_num / base) > 0) {
8002874: 5c 20 ff f4 bne r1,r0,8002844 <vprintk+0x1e0>
8002878: 35 f0 00 01 addi r16,r15,1
toPrint[count++] = (char) (unsigned_num - (n * base));
unsigned_num = n;
}
toPrint[count++] = (char) unsigned_num;
800287c: b6 4f 78 00 add r15,r18,r15
8002880: 31 ee 00 00 sb (r15+0),r14
for (n=maxwidth ; n > count; n-- )
8002884: 52 0b 00 06 bgeu r16,r11,800289c <vprintk+0x238>
BSP_output_char(lead);
8002888: 29 a2 00 00 lw r2,(r13+0)
toPrint[count++] = (char) (unsigned_num - (n * base));
unsigned_num = n;
}
toPrint[count++] = (char) unsigned_num;
for (n=maxwidth ; n > count; n-- )
800288c: 35 6b ff ff addi r11,r11,-1
BSP_output_char(lead);
8002890: ba c0 08 00 mv r1,r22
8002894: d8 40 00 00 call r2
toPrint[count++] = (char) (unsigned_num - (n * base));
unsigned_num = n;
}
toPrint[count++] = (char) unsigned_num;
for (n=maxwidth ; n > count; n-- )
8002898: 55 70 ff fc bgu r11,r16,8002888 <vprintk+0x224>
BSP_output_char(lead);
for (n = 0; n < count; n++) {
800289c: 46 00 ff 96 be r16,r0,80026f4 <vprintk+0x90> <== NEVER TAKEN
BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
80028a0: 36 0e ff ff addi r14,r16,-1
* console is not yet initialized or in ISR's.
*
* Arguments:
* as in printf: fmt - format string, ... - unnamed arguments.
*/
void vprintk(
80028a4: b6 4e 70 00 add r14,r18,r14
80028a8: 34 0b 00 00 mvi r11,0
for (n=maxwidth ; n > count; n-- )
BSP_output_char(lead);
for (n = 0; n < count; n++) {
BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
80028ac: 41 c1 00 00 lbu r1,(r14+0)
80028b0: 29 a3 00 00 lw r3,(r13+0)
toPrint[count++] = (char) unsigned_num;
for (n=maxwidth ; n > count; n-- )
BSP_output_char(lead);
for (n = 0; n < count; n++) {
80028b4: 35 6b 00 01 addi r11,r11,1
BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
80028b8: b6 61 08 00 add r1,r19,r1
80028bc: 40 21 00 00 lbu r1,(r1+0)
toPrint[count++] = (char) unsigned_num;
for (n=maxwidth ; n > count; n-- )
BSP_output_char(lead);
for (n = 0; n < count; n++) {
80028c0: 35 ce ff ff addi r14,r14,-1
BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]);
80028c4: d8 60 00 00 call r3
toPrint[count++] = (char) unsigned_num;
for (n=maxwidth ; n > count; n-- )
BSP_output_char(lead);
for (n = 0; n < count; n++) {
80028c8: 56 0b ff f9 bgu r16,r11,80028ac <vprintk+0x248>
80028cc: e3 ff ff 8a bi 80026f4 <vprintk+0x90>
fmt++;
}
if ((c = *fmt) == 'l') {
lflag = true;
c = *++fmt;
80028d0: 35 8c 00 01 addi r12,r12,1
80028d4: 41 83 00 00 lbu r3,(r12+0)
}
if ( c == 'c' ) {
80028d8: 5c 79 ff b6 bne r3,r25,80027b0 <vprintk+0x14c> <== ALWAYS TAKEN
/* need a cast here since va_arg() only takes fully promoted types */
char chr = (char) va_arg(ap, int);
BSP_output_char(chr);
80028dc: 42 e1 00 03 lbu r1,(r23+3)
80028e0: 29 a2 00 00 lw r2,(r13+0)
lflag = true;
c = *++fmt;
}
if ( c == 'c' ) {
/* need a cast here since va_arg() only takes fully promoted types */
char chr = (char) va_arg(ap, int);
80028e4: 36 f7 00 04 addi r23,r23,4
BSP_output_char(chr);
80028e8: d8 40 00 00 call r2
continue;
80028ec: e3 ff ff 82 bi 80026f4 <vprintk+0x90>
lead = '0';
fmt++;
}
if (*fmt == '-' ) {
minus = true;
fmt++;
80028f0: 35 8c 00 01 addi r12,r12,1
80028f4: 41 83 00 00 lbu r3,(r12+0)
if (*fmt == '0' ) {
lead = '0';
fmt++;
}
if (*fmt == '-' ) {
minus = true;
80028f8: 34 11 00 01 mvi r17,1
80028fc: e3 ff ff 9c bi 800276c <vprintk+0x108>
continue;
}
fmt++;
if (*fmt == '0' ) {
lead = '0';
fmt++;
8002900: 35 8c 00 01 addi r12,r12,1
8002904: 41 83 00 00 lbu r3,(r12+0)
BSP_output_char(*fmt);
continue;
}
fmt++;
if (*fmt == '0' ) {
lead = '0';
8002908: 34 16 00 30 mvi r22,48
800290c: e3 ff ff 95 bi 8002760 <vprintk+0xfc>
}
if ( c == 's' ) {
unsigned i, len;
char *s, *str;
str = va_arg(ap, char *);
8002910: 2a ef 00 00 lw r15,(r23+0)
8002914: 36 f2 00 04 addi r18,r23,4
if ( str == NULL ) {
8002918: 45 e0 00 3a be r15,r0,8002a00 <vprintk+0x39c>
str = "";
}
/* calculate length of string */
for ( len=0, s=str ; *s ; len++, s++ )
800291c: 41 e1 00 00 lbu r1,(r15+0)
8002920: 34 0e 00 00 mvi r14,0
8002924: 44 20 00 05 be r1,r0,8002938 <vprintk+0x2d4>
8002928: 35 ce 00 01 addi r14,r14,1
* console is not yet initialized or in ISR's.
*
* Arguments:
* as in printf: fmt - format string, ... - unnamed arguments.
*/
void vprintk(
800292c: b5 ee 08 00 add r1,r15,r14
if ( str == NULL ) {
str = "";
}
/* calculate length of string */
for ( len=0, s=str ; *s ; len++, s++ )
8002930: 40 21 00 00 lbu r1,(r1+0)
8002934: 5c 20 ff fd bne r1,r0,8002928 <vprintk+0x2c4>
;
/* leading spaces */
if ( !minus )
8002938: 5e 20 00 08 bne r17,r0,8002958 <vprintk+0x2f4>
for ( i=len ; i<width ; i++ )
800293c: 51 cb 00 07 bgeu r14,r11,8002958 <vprintk+0x2f4>
8002940: b9 c0 80 00 mv r16,r14
BSP_output_char(' ');
8002944: 29 a2 00 00 lw r2,(r13+0)
for ( len=0, s=str ; *s ; len++, s++ )
;
/* leading spaces */
if ( !minus )
for ( i=len ; i<width ; i++ )
8002948: 36 10 00 01 addi r16,r16,1
BSP_output_char(' ');
800294c: 34 01 00 20 mvi r1,32
8002950: d8 40 00 00 call r2
for ( len=0, s=str ; *s ; len++, s++ )
;
/* leading spaces */
if ( !minus )
for ( i=len ; i<width ; i++ )
8002954: 55 70 ff fc bgu r11,r16,8002944 <vprintk+0x2e0>
BSP_output_char(' ');
/* no width option */
if (width == 0) {
8002958: 5d 60 00 03 bne r11,r0,8002964 <vprintk+0x300>
width = len;
}
/* output the string */
for ( i=0 ; i<width && *str ; str++ )
800295c: 45 cb 00 0e be r14,r11,8002994 <vprintk+0x330>
8002960: b9 c0 58 00 mv r11,r14
8002964: 41 e1 00 00 lbu r1,(r15+0)
8002968: 44 20 00 0b be r1,r0,8002994 <vprintk+0x330> <== NEVER TAKEN
BSP_output_char(*str);
800296c: 29 a2 00 00 lw r2,(r13+0)
if (width == 0) {
width = len;
}
/* output the string */
for ( i=0 ; i<width && *str ; str++ )
8002970: 35 ef 00 01 addi r15,r15,1
BSP_output_char(*str);
8002974: d8 40 00 00 call r2
8002978: e0 00 00 03 bi 8002984 <vprintk+0x320>
800297c: 29 a2 00 00 lw r2,(r13+0)
8002980: d8 40 00 00 call r2
if (width == 0) {
width = len;
}
/* output the string */
for ( i=0 ; i<width && *str ; str++ )
8002984: 41 e2 00 00 lbu r2,(r15+0)
8002988: 35 ef 00 01 addi r15,r15,1
BSP_output_char(*str);
800298c: b8 40 08 00 mv r1,r2
if (width == 0) {
width = len;
}
/* output the string */
for ( i=0 ; i<width && *str ; str++ )
8002990: 5c 40 ff fb bne r2,r0,800297c <vprintk+0x318>
}
if ( c == 's' ) {
unsigned i, len;
char *s, *str;
str = va_arg(ap, char *);
8002994: ba 40 b8 00 mv r23,r18
/* output the string */
for ( i=0 ; i<width && *str ; str++ )
BSP_output_char(*str);
/* trailing spaces */
if ( minus )
8002998: 46 20 ff 57 be r17,r0,80026f4 <vprintk+0x90>
for ( i=len ; i<width ; i++ )
800299c: 51 cb ff 56 bgeu r14,r11,80026f4 <vprintk+0x90>
BSP_output_char(' ');
80029a0: 29 a2 00 00 lw r2,(r13+0)
for ( i=0 ; i<width && *str ; str++ )
BSP_output_char(*str);
/* trailing spaces */
if ( minus )
for ( i=len ; i<width ; i++ )
80029a4: 35 ce 00 01 addi r14,r14,1
BSP_output_char(' ');
80029a8: 34 01 00 20 mvi r1,32
80029ac: d8 40 00 00 call r2
for ( i=0 ; i<width && *str ; str++ )
BSP_output_char(*str);
/* trailing spaces */
if ( minus )
for ( i=len ; i<width ; i++ )
80029b0: 55 6e ff fc bgu r11,r14,80029a0 <vprintk+0x33c>
}
if ( c == 's' ) {
unsigned i, len;
char *s, *str;
str = va_arg(ap, char *);
80029b4: ba 40 b8 00 mv r23,r18
80029b8: e3 ff ff 4f bi 80026f4 <vprintk+0x90>
if ( c == 'o' || c == 'O' ) {
base = 8; sign = false;
} else if ( c == 'i' || c == 'I' ||
c == 'd' || c == 'D' ) {
base = 10; sign = true;
} else if ( c == 'u' || c == 'U' ) {
80029bc: 64 66 00 55 cmpei r6,r3,85
80029c0: 64 65 00 75 cmpei r5,r3,117
base = 10; sign = false;
80029c4: 34 01 00 00 mvi r1,0
if ( c == 'o' || c == 'O' ) {
base = 8; sign = false;
} else if ( c == 'i' || c == 'I' ||
c == 'd' || c == 'D' ) {
base = 10; sign = true;
} else if ( c == 'u' || c == 'U' ) {
80029c8: b8 c5 28 00 or r5,r6,r5
80029cc: 5c a4 ff 8b bne r5,r4,80027f8 <vprintk+0x194>
base = 10; sign = false;
} else if ( c == 'x' || c == 'X' ) {
80029d0: 64 66 00 58 cmpei r6,r3,88
80029d4: 64 64 00 78 cmpei r4,r3,120
base = 16; sign = false;
80029d8: b8 a0 08 00 mv r1,r5
} else if ( c == 'i' || c == 'I' ||
c == 'd' || c == 'D' ) {
base = 10; sign = true;
} else if ( c == 'u' || c == 'U' ) {
base = 10; sign = false;
} else if ( c == 'x' || c == 'X' ) {
80029dc: b8 c4 20 00 or r4,r6,r4
base = 16; sign = false;
80029e0: 34 11 00 10 mvi r17,16
} else if ( c == 'i' || c == 'I' ||
c == 'd' || c == 'D' ) {
base = 10; sign = true;
} else if ( c == 'u' || c == 'U' ) {
base = 10; sign = false;
} else if ( c == 'x' || c == 'X' ) {
80029e4: 5c 85 ff 85 bne r4,r5,80027f8 <vprintk+0x194>
base = 16; sign = false;
} else if ( c == 'p' ) {
80029e8: 34 02 00 70 mvi r2,112
80029ec: 44 62 ff 83 be r3,r2,80027f8 <vprintk+0x194>
base = 16; sign = false; lflag = true;
} else {
BSP_output_char(c);
80029f0: 29 a2 00 00 lw r2,(r13+0)
80029f4: b8 60 08 00 mv r1,r3
80029f8: d8 40 00 00 call r2
continue;
80029fc: e3 ff ff 3e bi 80026f4 <vprintk+0x90>
char *s, *str;
str = va_arg(ap, char *);
if ( str == NULL ) {
str = "";
8002a00: 2b 8f 00 48 lw r15,(sp+72)
8002a04: e3 ff ff c6 bi 800291c <vprintk+0x2b8>
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
while ((n = unsigned_num / base) > 0) {
8002a08: ba 00 70 00 mv r14,r16
if (maxwidth) maxwidth--;
} else {
unsigned_num = (unsigned long) num;
}
count = 0;
8002a0c: 34 0f 00 00 mvi r15,0
while ((n = unsigned_num / base) > 0) {
8002a10: 34 10 00 01 mvi r16,1
8002a14: 37 92 00 4c addi r18,sp,76
8002a18: e3 ff ff 99 bi 800287c <vprintk+0x218>
08012b54 <write>:
ssize_t write(
int fd,
const void *buffer,
size_t count
)
{
8012b54: 37 9c ff f4 addi sp,sp,-12
8012b58: 5b 8b 00 0c sw (sp+12),r11
8012b5c: 5b 8c 00 08 sw (sp+8),r12
8012b60: 5b 9d 00 04 sw (sp+4),ra
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
8012b64: 78 04 08 01 mvhi r4,0x801
8012b68: 38 84 40 10 ori r4,r4,0x4010
8012b6c: 28 84 00 00 lw r4,(r4+0)
8012b70: 54 81 00 06 bgu r4,r1,8012b88 <write+0x34>
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
8012b74: fb ff e8 94 calli 800cdc4 <__errno>
8012b78: 34 02 00 09 mvi r2,9
8012b7c: 58 22 00 00 sw (r1+0),r2
8012b80: 34 0c ff ff mvi r12,-1
8012b84: e0 00 00 23 bi 8012c10 <write+0xbc>
{
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
8012b88: b4 21 08 00 add r1,r1,r1
8012b8c: 78 04 08 01 mvhi r4,0x801
8012b90: b4 21 08 00 add r1,r1,r1
8012b94: 38 84 47 2c ori r4,r4,0x472c
8012b98: b4 21 08 00 add r1,r1,r1
8012b9c: 28 8b 00 00 lw r11,(r4+0)
8012ba0: b4 21 08 00 add r1,r1,r1
8012ba4: b4 21 08 00 add r1,r1,r1
8012ba8: b4 21 08 00 add r1,r1,r1
8012bac: b5 61 58 00 add r11,r11,r1
rtems_libio_check_is_open( iop );
8012bb0: 29 61 00 18 lw r1,(r11+24)
8012bb4: 20 24 01 00 andi r4,r1,0x100
8012bb8: 44 80 ff ef be r4,r0,8012b74 <write+0x20>
rtems_libio_check_buffer( buffer );
8012bbc: 44 40 00 1b be r2,r0,8012c28 <write+0xd4> <== NEVER TAKEN
rtems_libio_check_count( count );
8012bc0: 34 0c 00 00 mvi r12,0
8012bc4: 44 60 00 13 be r3,r0,8012c10 <write+0xbc>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
8012bc8: 20 21 00 04 andi r1,r1,0x4
8012bcc: 44 20 00 17 be r1,r0,8012c28 <write+0xd4>
/*
* Now process the write() request.
*/
rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count );
8012bd0: 29 64 00 24 lw r4,(r11+36)
8012bd4: b9 60 08 00 mv r1,r11
8012bd8: 28 84 00 0c lw r4,(r4+12)
8012bdc: d8 80 00 00 call r4
8012be0: b8 20 60 00 mv r12,r1
if ( rc > 0 )
8012be4: 4c 01 00 0b bge r0,r1,8012c10 <write+0xbc>
iop->offset += rc;
8012be8: 34 02 00 1f mvi r2,31
8012bec: fb ff fd 50 calli 801212c <__ashrsi3>
8012bf0: 29 62 00 14 lw r2,(r11+20)
8012bf4: 29 64 00 10 lw r4,(r11+16)
8012bf8: b5 82 10 00 add r2,r12,r2
8012bfc: f5 82 18 00 cmpgu r3,r12,r2
8012c00: b4 24 08 00 add r1,r1,r4
8012c04: b4 61 08 00 add r1,r3,r1
8012c08: 59 61 00 10 sw (r11+16),r1
8012c0c: 59 62 00 14 sw (r11+20),r2
return rc;
}
8012c10: b9 80 08 00 mv r1,r12
8012c14: 2b 9d 00 04 lw ra,(sp+4)
8012c18: 2b 8b 00 0c lw r11,(sp+12)
8012c1c: 2b 8c 00 08 lw r12,(sp+8)
8012c20: 37 9c 00 0c addi sp,sp,12
8012c24: c3 a0 00 00 ret
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
8012c28: fb ff e8 67 calli 800cdc4 <__errno>
8012c2c: 34 02 00 16 mvi r2,22
8012c30: 58 22 00 00 sw (r1+0),r2
8012c34: 34 0c ff ff mvi r12,-1
8012c38: e3 ff ff f6 bi 8012c10 <write+0xbc>
08004114 <writev>:
ssize_t writev(
int fd,
const struct iovec *iov,
int iovcnt
)
{
8004114: 37 9c ff e4 addi sp,sp,-28
8004118: 5b 8b 00 1c sw (sp+28),r11
800411c: 5b 8c 00 18 sw (sp+24),r12
8004120: 5b 8d 00 14 sw (sp+20),r13
8004124: 5b 8e 00 10 sw (sp+16),r14
8004128: 5b 8f 00 0c sw (sp+12),r15
800412c: 5b 90 00 08 sw (sp+8),r16
8004130: 5b 9d 00 04 sw (sp+4),ra
int bytes;
rtems_libio_t *iop;
ssize_t old;
bool all_zeros;
rtems_libio_check_fd( fd );
8004134: 78 04 08 01 mvhi r4,0x801
8004138: 38 84 60 10 ori r4,r4,0x6010
800413c: 28 84 00 00 lw r4,(r4+0)
ssize_t writev(
int fd,
const struct iovec *iov,
int iovcnt
)
{
8004140: b8 60 60 00 mv r12,r3
int bytes;
rtems_libio_t *iop;
ssize_t old;
bool all_zeros;
rtems_libio_check_fd( fd );
8004144: 54 81 00 0f bgu r4,r1,8004180 <writev+0x6c>
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
8004148: f8 00 27 97 calli 800dfa4 <__errno>
800414c: 34 02 00 09 mvi r2,9
8004150: 58 22 00 00 sw (r1+0),r2
8004154: 34 0e ff ff mvi r14,-1
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
8004158: b9 c0 08 00 mv r1,r14
800415c: 2b 9d 00 04 lw ra,(sp+4)
8004160: 2b 8b 00 1c lw r11,(sp+28)
8004164: 2b 8c 00 18 lw r12,(sp+24)
8004168: 2b 8d 00 14 lw r13,(sp+20)
800416c: 2b 8e 00 10 lw r14,(sp+16)
8004170: 2b 8f 00 0c lw r15,(sp+12)
8004174: 2b 90 00 08 lw r16,(sp+8)
8004178: 37 9c 00 1c addi sp,sp,28
800417c: c3 a0 00 00 ret
rtems_libio_t *iop;
ssize_t old;
bool all_zeros;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
8004180: b4 21 08 00 add r1,r1,r1
8004184: 78 03 08 01 mvhi r3,0x801
8004188: b4 21 08 00 add r1,r1,r1
800418c: 38 63 67 2c ori r3,r3,0x672c
8004190: b4 21 08 00 add r1,r1,r1
8004194: 28 6f 00 00 lw r15,(r3+0)
8004198: b4 21 08 00 add r1,r1,r1
800419c: b4 21 08 00 add r1,r1,r1
80041a0: b4 21 08 00 add r1,r1,r1
80041a4: b5 e1 78 00 add r15,r15,r1
rtems_libio_check_is_open( iop );
80041a8: 29 e1 00 18 lw r1,(r15+24)
80041ac: 20 23 01 00 andi r3,r1,0x100
80041b0: 44 60 ff e6 be r3,r0,8004148 <writev+0x34>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
80041b4: 20 21 00 04 andi r1,r1,0x4
80041b8: 44 20 00 03 be r1,r0,80041c4 <writev+0xb0> <== NEVER TAKEN
/*
* Argument validation on IO vector
*/
if ( !iov )
80041bc: 44 40 00 02 be r2,r0,80041c4 <writev+0xb0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
80041c0: 49 80 00 06 bg r12,r0,80041d8 <writev+0xc4>
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old || total > SSIZE_MAX )
rtems_set_errno_and_return_minus_one( EINVAL );
80041c4: f8 00 27 78 calli 800dfa4 <__errno>
80041c8: 34 02 00 16 mvi r2,22
80041cc: 58 22 00 00 sw (r1+0),r2
80041d0: 34 0e ff ff mvi r14,-1
80041d4: e3 ff ff e1 bi 8004158 <writev+0x44>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
80041d8: 34 01 04 00 mvi r1,1024
80041dc: 4c 2c 00 02 bge r1,r12,80041e4 <writev+0xd0> <== ALWAYS TAKEN
80041e0: e3 ff ff f9 bi 80041c4 <writev+0xb0> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EINVAL );
80041e4: b8 40 58 00 mv r11,r2
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
80041e8: b8 40 20 00 mv r4,r2
80041ec: 34 08 00 01 mvi r8,1
80041f0: 34 06 00 00 mvi r6,0
80041f4: 34 07 00 00 mvi r7,0
/*
* iov[v].iov_len cannot be less than 0 because size_t is unsigned.
* So we only check for zero.
*/
if ( iov[v].iov_base == 0 )
80041f8: 28 82 00 00 lw r2,(r4+0)
* this loop does that check as well and sets "all-zero" appropriately.
* The variable "all_zero" is used as an early exit point before
* entering the write loop.
*/
all_zeros = true;
for ( old=0, total=0, v=0 ; v < iovcnt ; v++ ) {
80041fc: 34 c6 00 01 addi r6,r6,1
/*
* iov[v].iov_len cannot be less than 0 because size_t is unsigned.
* So we only check for zero.
*/
if ( iov[v].iov_base == 0 )
8004200: 44 40 ff f1 be r2,r0,80041c4 <writev+0xb0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
8004204: 28 82 00 04 lw r2,(r4+4)
* this loop does that check as well and sets "all-zero" appropriately.
* The variable "all_zero" is used as an early exit point before
* entering the write loop.
*/
all_zeros = true;
for ( old=0, total=0, v=0 ; v < iovcnt ; v++ ) {
8004208: 34 84 00 08 addi r4,r4,8
if ( iov[v].iov_len )
all_zeros = false;
/* check for wrap */
old = total;
total += iov[v].iov_len;
800420c: b4 e2 28 00 add r5,r7,r2
if ( total < old || total > SSIZE_MAX )
8004210: e8 e5 38 00 cmpg r7,r7,r5
*/
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
8004214: 64 42 00 00 cmpei r2,r2,0
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old || total > SSIZE_MAX )
8004218: 68 a3 7f ff cmpgi r3,r5,32767
*/
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
800421c: c8 02 10 00 sub r2,r0,r2
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old || total > SSIZE_MAX )
8004220: b8 67 38 00 or r7,r3,r7
*/
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
8004224: a1 02 40 00 and r8,r8,r2
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old || total > SSIZE_MAX )
8004228: 5c e0 ff e7 bne r7,r0,80041c4 <writev+0xb0>
* this loop does that check as well and sets "all-zero" appropriately.
* The variable "all_zero" is used as an early exit point before
* entering the write loop.
*/
all_zeros = true;
for ( old=0, total=0, v=0 ; v < iovcnt ; v++ ) {
800422c: 49 86 00 0a bg r12,r6,8004254 <writev+0x140>
/*
* A writev with all zeros is supposed to have no effect per OpenGroup.
*/
if ( all_zeros == true ) {
return 0;
8004230: 34 0e 00 00 mvi r14,0
}
/*
* A writev with all zeros is supposed to have no effect per OpenGroup.
*/
if ( all_zeros == true ) {
8004234: 5d 00 ff c9 bne r8,r0,8004158 <writev+0x44>
8004238: 34 0d 00 00 mvi r13,0
/*
* Now process the writev().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
/* all zero lengths has no effect */
if ( iov[v].iov_len == 0 )
800423c: 29 63 00 04 lw r3,(r11+4)
}
/*
* Now process the writev().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8004240: 35 ad 00 01 addi r13,r13,1
/* all zero lengths has no effect */
if ( iov[v].iov_len == 0 )
8004244: 5c 60 00 06 bne r3,r0,800425c <writev+0x148> <== ALWAYS TAKEN
}
/*
* Now process the writev().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8004248: 35 6b 00 08 addi r11,r11,8
800424c: 49 8d ff fc bg r12,r13,800423c <writev+0x128>
8004250: e3 ff ff c2 bi 8004158 <writev+0x44>
if ( iov[v].iov_len )
all_zeros = false;
/* check for wrap */
old = total;
total += iov[v].iov_len;
8004254: b8 a0 38 00 mv r7,r5
8004258: e3 ff ff e8 bi 80041f8 <writev+0xe4>
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
/* all zero lengths has no effect */
if ( iov[v].iov_len == 0 )
continue;
bytes = (*iop->pathinfo.handlers->write_h)(
800425c: 29 e1 00 24 lw r1,(r15+36)
8004260: 29 62 00 00 lw r2,(r11+0)
8004264: 28 24 00 0c lw r4,(r1+12)
8004268: b9 e0 08 00 mv r1,r15
800426c: d8 80 00 00 call r4
8004270: b8 20 80 00 mv r16,r1
if ( bytes < 0 )
return -1;
if ( bytes > 0 ) {
iop->offset += bytes;
8004274: 34 02 00 1f mvi r2,31
iop,
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
8004278: 48 01 00 0f bg r0,r1,80042b4 <writev+0x1a0> <== NEVER TAKEN
return -1;
if ( bytes > 0 ) {
800427c: 44 20 00 0b be r1,r0,80042a8 <writev+0x194> <== NEVER TAKEN
iop->offset += bytes;
8004280: f8 00 3c d2 calli 80135c8 <__ashrsi3>
8004284: 29 e2 00 14 lw r2,(r15+20)
8004288: 29 e4 00 10 lw r4,(r15+16)
total += bytes;
800428c: b5 d0 70 00 add r14,r14,r16
if ( bytes < 0 )
return -1;
if ( bytes > 0 ) {
iop->offset += bytes;
8004290: b6 02 10 00 add r2,r16,r2
8004294: f6 02 18 00 cmpgu r3,r16,r2
8004298: b4 24 08 00 add r1,r1,r4
800429c: b4 61 08 00 add r1,r3,r1
80042a0: 59 e1 00 10 sw (r15+16),r1
80042a4: 59 e2 00 14 sw (r15+20),r2
total += bytes;
}
if (bytes != iov[ v ].iov_len)
80042a8: 29 61 00 04 lw r1,(r11+4)
80042ac: 46 01 ff e7 be r16,r1,8004248 <writev+0x134> <== ALWAYS TAKEN
80042b0: e3 ff ff aa bi 8004158 <writev+0x44>
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
return -1;
80042b4: 34 0e ff ff mvi r14,-1
80042b8: e3 ff ff a8 bi 8004158 <writev+0x44>