RTEMS 4.11Annotated Report
Sun Nov 28 16:27:02 2010
0800b634 <IMFS_Set_handlers>:
#define MAXSYMLINK 5
int IMFS_Set_handlers(
rtems_filesystem_location_info_t *loc
)
{
800b634: 37 9c ff f0 addi sp,sp,-16
800b638: 5b 8b 00 10 sw (sp+16),r11
800b63c: 5b 8c 00 0c sw (sp+12),r12
800b640: 5b 8d 00 08 sw (sp+8),r13
800b644: 5b 9d 00 04 sw (sp+4),ra
800b648: b8 20 58 00 mv r11,r1
IMFS_jnode_t *node = loc->node_access;
IMFS_fs_info_t *fs_info;
fs_info = loc->mt_entry->fs_info;
800b64c: 28 21 00 10 lw r1,(r1+16)
switch( node->type ) {
800b650: 34 02 00 06 mvi r2,6
)
{
IMFS_jnode_t *node = loc->node_access;
IMFS_fs_info_t *fs_info;
fs_info = loc->mt_entry->fs_info;
800b654: 28 2c 00 34 lw r12,(r1+52)
switch( node->type ) {
800b658: 29 61 00 00 lw r1,(r11+0)
800b65c: 28 21 00 4c lw r1,(r1+76)
800b660: 34 21 ff ff addi r1,r1,-1
800b664: 54 22 00 14 bgu r1,r2,800b6b4 <IMFS_Set_handlers+0x80> <== NEVER TAKEN
800b668: 78 0d 08 01 mvhi r13,0x801
800b66c: 34 02 00 02 mvi r2,2
800b670: f8 00 2d ed calli 8016e24 <__ashlsi3>
800b674: 39 ad 82 54 ori r13,r13,0x8254
800b678: b5 a1 08 00 add r1,r13,r1
800b67c: 28 21 00 00 lw r1,(r1+0)
800b680: c0 20 00 00 b r1
case IMFS_DIRECTORY:
loc->handlers = fs_info->directory_handlers;
800b684: 29 81 00 0c lw r1,(r12+12)
800b688: e0 00 00 0a bi 800b6b0 <IMFS_Set_handlers+0x7c>
break;
case IMFS_DEVICE:
loc->handlers = &IMFS_device_handlers;
800b68c: 78 01 08 01 mvhi r1,0x801
800b690: 38 21 82 80 ori r1,r1,0x8280
800b694: e0 00 00 07 bi 800b6b0 <IMFS_Set_handlers+0x7c>
break;
case IMFS_SYM_LINK:
case IMFS_HARD_LINK:
loc->handlers = &IMFS_link_handlers;
800b698: 78 01 08 01 mvhi r1,0x801
800b69c: 38 21 82 f0 ori r1,r1,0x82f0
800b6a0: e0 00 00 04 bi 800b6b0 <IMFS_Set_handlers+0x7c>
break;
case IMFS_LINEAR_FILE:
loc->handlers = fs_info->memfile_handlers;
break;
case IMFS_MEMORY_FILE:
loc->handlers = fs_info->memfile_handlers;
800b6a4: 29 81 00 08 lw r1,(r12+8)
800b6a8: e0 00 00 02 bi 800b6b0 <IMFS_Set_handlers+0x7c>
break;
case IMFS_FIFO:
loc->handlers = fs_info->fifo_handlers;
800b6ac: 29 81 00 10 lw r1,(r12+16)
800b6b0: 59 61 00 08 sw (r11+8),r1
break;
}
return 0;
}
800b6b4: 34 01 00 00 mvi r1,0
800b6b8: 2b 9d 00 04 lw ra,(sp+4)
800b6bc: 2b 8b 00 10 lw r11,(sp+16)
800b6c0: 2b 8c 00 0c lw r12,(sp+12)
800b6c4: 2b 8d 00 08 lw r13,(sp+8)
800b6c8: 37 9c 00 10 addi sp,sp,16
800b6cc: c3 a0 00 00 ret
0800b498 <IMFS_create_node>:
IMFS_jnode_types_t type,
const char *name,
mode_t mode,
const IMFS_types_union *info
)
{
800b498: 37 9c ff e8 addi sp,sp,-24
800b49c: 5b 8b 00 18 sw (sp+24),r11
800b4a0: 5b 8c 00 14 sw (sp+20),r12
800b4a4: 5b 8d 00 10 sw (sp+16),r13
800b4a8: 5b 8e 00 0c sw (sp+12),r14
800b4ac: 5b 8f 00 08 sw (sp+8),r15
800b4b0: 5b 9d 00 04 sw (sp+4),ra
/*
* MUST have a parent node to call this routine.
*/
if ( parent_loc == NULL )
return NULL;
800b4b4: 34 0b 00 00 mvi r11,0
IMFS_jnode_types_t type,
const char *name,
mode_t mode,
const IMFS_types_union *info
)
{
800b4b8: b8 40 60 00 mv r12,r2
800b4bc: b8 a0 68 00 mv r13,r5
800b4c0: b8 60 10 00 mv r2,r3
IMFS_fs_info_t *fs_info;
/*
* MUST have a parent node to call this routine.
*/
if ( parent_loc == NULL )
800b4c4: 44 20 00 43 be r1,r0,800b5d0 <IMFS_create_node+0x138> <== NEVER TAKEN
return NULL;
parent = parent_loc->node_access;
800b4c8: 28 2f 00 00 lw r15,(r1+0)
fs_info = parent_loc->mt_entry->fs_info;
800b4cc: 28 21 00 10 lw r1,(r1+16)
800b4d0: 28 2e 00 34 lw r14,(r1+52)
/*
* Reject creation of FIFOs if support is disabled.
*/
if ( type == IMFS_FIFO &&
800b4d4: 34 01 00 07 mvi r1,7
800b4d8: 5d 81 00 05 bne r12,r1,800b4ec <IMFS_create_node+0x54>
800b4dc: 29 c1 00 10 lw r1,(r14+16)
800b4e0: 78 05 08 01 mvhi r5,0x801
800b4e4: 38 a5 81 ec ori r5,r5,0x81ec
800b4e8: 44 25 00 3a be r1,r5,800b5d0 <IMFS_create_node+0x138>
return NULL;
/*
* Allocate filesystem node and fill in basic information
*/
node = IMFS_allocate_node( type, name, mode & ~rtems_filesystem_umask );
800b4ec: 78 05 08 01 mvhi r5,0x801
800b4f0: 38 a5 91 08 ori r5,r5,0x9108
800b4f4: 28 a1 00 00 lw r1,(r5+0)
800b4f8: 28 23 00 2c lw r3,(r1+44)
800b4fc: b9 80 08 00 mv r1,r12
800b500: a4 60 18 00 not r3,r3
800b504: a0 83 18 00 and r3,r4,r3
800b508: fb ff ff bb calli 800b3f4 <IMFS_allocate_node>
800b50c: b8 20 58 00 mv r11,r1
if ( !node )
800b510: 44 20 00 30 be r1,r0,800b5d0 <IMFS_create_node+0x138>
return NULL;
/*
* Set the type specific information
*/
if ( type == IMFS_DIRECTORY ) {
800b514: 34 01 00 01 mvi r1,1
800b518: 5d 81 00 07 bne r12,r1,800b534 <IMFS_create_node+0x9c>
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 );
800b51c: 35 61 00 54 addi r1,r11,84
head->next = tail;
800b520: 59 61 00 50 sw (r11+80),r1
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
800b524: 35 61 00 50 addi r1,r11,80
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
800b528: 59 60 00 54 sw (r11+84),r0
tail->previous = head;
800b52c: 59 61 00 58 sw (r11+88),r1
800b530: e0 00 00 20 bi 800b5b0 <IMFS_create_node+0x118>
rtems_chain_initialize_empty(&node->info.directory.Entries);
} else if ( type == IMFS_HARD_LINK ) {
800b534: 34 01 00 03 mvi r1,3
800b538: 45 81 00 03 be r12,r1,800b544 <IMFS_create_node+0xac>
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
800b53c: 34 01 00 04 mvi r1,4
800b540: 5d 81 00 04 bne r12,r1,800b550 <IMFS_create_node+0xb8>
node->info.sym_link.name = info->sym_link.name;
800b544: 29 a1 00 00 lw r1,(r13+0)
800b548: 59 61 00 50 sw (r11+80),r1
800b54c: e0 00 00 19 bi 800b5b0 <IMFS_create_node+0x118>
} else if ( type == IMFS_DEVICE ) {
800b550: 34 01 00 02 mvi r1,2
800b554: 5d 81 00 06 bne r12,r1,800b56c <IMFS_create_node+0xd4>
node->info.device.major = info->device.major;
800b558: 29 a1 00 00 lw r1,(r13+0)
800b55c: 59 61 00 50 sw (r11+80),r1
node->info.device.minor = info->device.minor;
800b560: 29 a1 00 04 lw r1,(r13+4)
800b564: 59 61 00 54 sw (r11+84),r1
800b568: e0 00 00 12 bi 800b5b0 <IMFS_create_node+0x118>
} else if ( type == IMFS_LINEAR_FILE ) {
800b56c: 34 01 00 06 mvi r1,6
800b570: 5d 81 00 05 bne r12,r1,800b584 <IMFS_create_node+0xec>
node->info.linearfile.size = 0;
800b574: 59 60 00 50 sw (r11+80),r0
800b578: 59 60 00 54 sw (r11+84),r0
node->info.linearfile.direct = 0;
800b57c: 59 60 00 58 sw (r11+88),r0
800b580: e0 00 00 0c bi 800b5b0 <IMFS_create_node+0x118>
} else if ( type == IMFS_MEMORY_FILE ) {
800b584: 34 01 00 05 mvi r1,5
800b588: 5d 81 00 07 bne r12,r1,800b5a4 <IMFS_create_node+0x10c>
node->info.file.size = 0;
800b58c: 59 60 00 50 sw (r11+80),r0
800b590: 59 60 00 54 sw (r11+84),r0
node->info.file.indirect = 0;
800b594: 59 60 00 58 sw (r11+88),r0
node->info.file.doubly_indirect = 0;
800b598: 59 60 00 5c sw (r11+92),r0
node->info.file.triply_indirect = 0;
800b59c: 59 60 00 60 sw (r11+96),r0
800b5a0: e0 00 00 04 bi 800b5b0 <IMFS_create_node+0x118>
} else if ( type == IMFS_FIFO ) {
800b5a4: 34 01 00 07 mvi r1,7
800b5a8: 5d 81 00 02 bne r12,r1,800b5b0 <IMFS_create_node+0x118> <== NEVER TAKEN
node->info.fifo.pipe = NULL;
800b5ac: 59 60 00 50 sw (r11+80),r0
/*
* This node MUST have a parent, so put it in that directory list.
*/
node->Parent = parent;
node->st_ino = ++fs_info->ino_count;
800b5b0: 29 c1 00 04 lw r1,(r14+4)
}
/*
* This node MUST have a parent, so put it in that directory list.
*/
node->Parent = parent;
800b5b4: 59 6f 00 08 sw (r11+8),r15
800b5b8: b9 60 10 00 mv r2,r11
node->st_ino = ++fs_info->ino_count;
800b5bc: 34 21 00 01 addi r1,r1,1
800b5c0: 59 c1 00 04 sw (r14+4),r1
800b5c4: 59 61 00 38 sw (r11+56),r1
800b5c8: 35 e1 00 50 addi r1,r15,80
800b5cc: fb ff e5 57 calli 8004b28 <_Chain_Append>
rtems_chain_append( &parent->info.directory.Entries, &node->Node );
return node;
}
800b5d0: b9 60 08 00 mv r1,r11
800b5d4: 2b 9d 00 04 lw ra,(sp+4)
800b5d8: 2b 8b 00 18 lw r11,(sp+24)
800b5dc: 2b 8c 00 14 lw r12,(sp+20)
800b5e0: 2b 8d 00 10 lw r13,(sp+16)
800b5e4: 2b 8e 00 0c lw r14,(sp+12)
800b5e8: 2b 8f 00 08 lw r15,(sp+8)
800b5ec: 37 9c 00 18 addi sp,sp,24
800b5f0: c3 a0 00 00 ret
0800b7c4 <IMFS_eval_path>:
const char *pathname, /* IN */
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
800b7c4: 37 9c ff 84 addi sp,sp,-124
800b7c8: 5b 8b 00 40 sw (sp+64),r11
800b7cc: 5b 8c 00 3c sw (sp+60),r12
800b7d0: 5b 8d 00 38 sw (sp+56),r13
800b7d4: 5b 8e 00 34 sw (sp+52),r14
800b7d8: 5b 8f 00 30 sw (sp+48),r15
800b7dc: 5b 90 00 2c sw (sp+44),r16
800b7e0: 5b 91 00 28 sw (sp+40),r17
800b7e4: 5b 92 00 24 sw (sp+36),r18
800b7e8: 5b 93 00 20 sw (sp+32),r19
800b7ec: 5b 94 00 1c sw (sp+28),r20
800b7f0: 5b 95 00 18 sw (sp+24),r21
800b7f4: 5b 96 00 14 sw (sp+20),r22
800b7f8: 5b 97 00 10 sw (sp+16),r23
800b7fc: 5b 98 00 0c sw (sp+12),r24
800b800: 5b 99 00 08 sw (sp+8),r25
800b804: 5b 9d 00 04 sw (sp+4),ra
800b808: b8 20 90 00 mv r18,r1
char token[ IMFS_NAME_MAX + 1 ];
rtems_filesystem_location_info_t newloc;
IMFS_jnode_t *node;
int result;
if ( !rtems_libio_is_valid_perms( flags ) ) {
800b80c: 34 01 ff f8 mvi r1,-8
800b810: a0 61 08 00 and r1,r3,r1
const char *pathname, /* IN */
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
800b814: b8 40 78 00 mv r15,r2
800b818: b8 60 88 00 mv r17,r3
800b81c: 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 ) ) {
800b820: 44 20 00 04 be r1,r0,800b830 <IMFS_eval_path+0x6c> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EIO );
800b824: f8 00 17 13 calli 8011470 <__errno> <== NOT EXECUTED
800b828: 34 02 00 05 mvi r2,5 <== NOT EXECUTED
800b82c: e0 00 00 91 bi 800ba70 <IMFS_eval_path+0x2ac> <== NOT EXECUTED
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
800b830: 78 13 08 01 mvhi r19,0x801
/*
* This was filled in by the caller and is valid in the
* mount table.
*/
node = pathloc->node_access;
800b834: 28 8c 00 00 lw r12,(r4+0)
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
int i = 0;
int len;
IMFS_token_types type = IMFS_CURRENT_DIR;
800b838: 34 0e 00 01 mvi r14,1
size_t pathnamelen, /* IN */
int flags, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN/OUT */
)
{
int i = 0;
800b83c: 34 10 00 00 mvi r16,0
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
800b840: 37 96 00 44 addi r22,sp,68
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
800b844: 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 ) {
800b848: 34 19 00 03 mvi r25,3
* It would be a design error if we evaluated the link and
* was broken.
*/
IMFS_assert( node );
} else if ( node->type == IMFS_SYM_LINK ) {
800b84c: 34 14 00 04 mvi r20,4
/*
* In contrast to a hard link, it is possible to have a broken
* symbolic link.
*/
node = pathloc->node_access;
if ( result == -1 )
800b850: 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 ) {
800b854: 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 )
800b858: 3a 73 91 08 ori r19,r19,0x9108
/*
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
800b85c: e0 00 00 5a bi 800b9c4 <IMFS_eval_path+0x200>
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
800b860: b6 50 08 00 add r1,r18,r16
800b864: b9 e0 10 00 mv r2,r15
800b868: ba c0 18 00 mv r3,r22
800b86c: 37 84 00 7c addi r4,sp,124
800b870: f8 00 02 11 calli 800c0b4 <IMFS_get_token>
800b874: b8 20 70 00 mv r14,r1
pathnamelen -= len;
i += len;
if ( !pathloc->node_access )
800b878: 29 61 00 00 lw r1,(r11+0)
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
pathnamelen -= len;
800b87c: 2b 8d 00 7c lw r13,(sp+124)
i += len;
if ( !pathloc->node_access )
800b880: 44 20 00 49 be r1,r0,800b9a4 <IMFS_eval_path+0x1e0> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( ENOENT );
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
800b884: 45 c0 00 07 be r14,r0,800b8a0 <IMFS_eval_path+0xdc>
if ( node->type == IMFS_DIRECTORY )
800b888: 29 81 00 4c lw r1,(r12+76)
800b88c: 5c 35 00 05 bne r1,r21,800b8a0 <IMFS_eval_path+0xdc>
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
800b890: b9 60 08 00 mv r1,r11
800b894: 34 02 00 01 mvi r2,1
800b898: fb ff ff 8e calli 800b6d0 <IMFS_evaluate_permission>
800b89c: 44 20 00 73 be r1,r0,800ba68 <IMFS_eval_path+0x2a4>
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
type = IMFS_get_token( &pathname[i], pathnamelen, token, &len );
pathnamelen -= len;
800b8a0: c9 ed 78 00 sub r15,r15,r13
i += len;
800b8a4: b6 0d 80 00 add r16,r16,r13
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
800b8a8: 29 6c 00 00 lw r12,(r11+0)
switch( type ) {
800b8ac: 45 d9 00 14 be r14,r25,800b8fc <IMFS_eval_path+0x138>
800b8b0: 45 d4 00 42 be r14,r20,800b9b8 <IMFS_eval_path+0x1f4>
800b8b4: 5d d7 00 44 bne r14,r23,800b9c4 <IMFS_eval_path+0x200>
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
800b8b8: 2a 61 00 00 lw r1,(r19+0)
800b8bc: 28 21 00 18 lw r1,(r1+24)
800b8c0: 45 81 00 41 be r12,r1,800b9c4 <IMFS_eval_path+0x200>
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
pathloc->mt_entry->mt_fs_root.node_access) {
800b8c4: 29 64 00 10 lw r4,(r11+16)
/*
* Am I at the root of this mounted filesystem?
*/
if (pathloc->node_access ==
800b8c8: 28 81 00 1c lw r1,(r4+28)
800b8cc: 5d 81 00 07 bne r12,r1,800b8e8 <IMFS_eval_path+0x124>
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break; /* Throw out the .. in this case */
} else {
newloc = pathloc->mt_entry->mt_point_node;
800b8d0: 28 85 00 08 lw r5,(r4+8)
800b8d4: 28 82 00 0c lw r2,(r4+12)
800b8d8: 28 81 00 10 lw r1,(r4+16)
800b8dc: 28 83 00 14 lw r3,(r4+20)
800b8e0: 28 84 00 18 lw r4,(r4+24)
800b8e4: e0 00 00 46 bi 800b9fc <IMFS_eval_path+0x238>
pathnamelen+len,
flags,pathloc);
}
} else {
if ( !node->Parent )
800b8e8: 29 8c 00 08 lw r12,(r12+8)
800b8ec: 5d 80 00 31 bne r12,r0,800b9b0 <IMFS_eval_path+0x1ec>
rtems_set_errno_and_return_minus_one( ENOENT );
800b8f0: f8 00 16 e0 calli 8011470 <__errno>
800b8f4: 58 2e 00 00 sw (r1+0),r14
800b8f8: e0 00 00 5f bi 800ba74 <IMFS_eval_path+0x2b0>
case IMFS_NAME:
/*
* If we are at a link follow it.
*/
if ( node->type == IMFS_HARD_LINK ) {
800b8fc: 29 81 00 4c lw r1,(r12+76)
800b900: 5c 2e 00 06 bne r1,r14,800b918 <IMFS_eval_path+0x154>
IMFS_evaluate_hard_link( pathloc, 0 );
800b904: b9 60 08 00 mv r1,r11
800b908: 34 02 00 00 mvi r2,0
800b90c: fb ff ff 97 calli 800b768 <IMFS_evaluate_hard_link>
node = pathloc->node_access;
800b910: 29 6c 00 00 lw r12,(r11+0)
800b914: e0 00 00 08 bi 800b934 <IMFS_eval_path+0x170>
* It would be a design error if we evaluated the link and
* was broken.
*/
IMFS_assert( node );
} else if ( node->type == IMFS_SYM_LINK ) {
800b918: 5c 34 00 07 bne r1,r20,800b934 <IMFS_eval_path+0x170>
result = IMFS_evaluate_sym_link( pathloc, 0 );
800b91c: b9 60 08 00 mv r1,r11
800b920: 34 02 00 00 mvi r2,0
800b924: f8 00 00 68 calli 800bac4 <IMFS_evaluate_sym_link>
800b928: 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;
800b92c: 29 6c 00 00 lw r12,(r11+0)
if ( result == -1 )
800b930: 44 38 00 52 be r1,r24,800ba78 <IMFS_eval_path+0x2b4> <== NEVER TAKEN
}
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
800b934: 29 81 00 4c lw r1,(r12+76)
800b938: 44 35 00 04 be r1,r21,800b948 <IMFS_eval_path+0x184>
rtems_set_errno_and_return_minus_one( ENOTDIR );
800b93c: f8 00 16 cd calli 8011470 <__errno>
800b940: 34 02 00 14 mvi r2,20
800b944: e0 00 00 4b bi 800ba70 <IMFS_eval_path+0x2ac>
/*
* 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 ) {
800b948: 29 8d 00 5c lw r13,(r12+92)
800b94c: 45 a0 00 11 be r13,r0,800b990 <IMFS_eval_path+0x1cc>
newloc = node->info.directory.mt_fs->mt_fs_root;
800b950: 29 a4 00 1c lw r4,(r13+28)
800b954: 29 a2 00 20 lw r2,(r13+32)
800b958: 29 a1 00 24 lw r1,(r13+36)
800b95c: 29 a3 00 28 lw r3,(r13+40)
800b960: 29 a5 00 2c lw r5,(r13+44)
800b964: 5b 84 00 68 sw (sp+104),r4
800b968: 5b 82 00 6c sw (sp+108),r2
800b96c: 5b 81 00 70 sw (sp+112),r1
800b970: 5b 83 00 74 sw (sp+116),r3
800b974: 5b 85 00 78 sw (sp+120),r5
*pathloc = newloc;
800b978: 59 64 00 00 sw (r11+0),r4
800b97c: 59 62 00 04 sw (r11+4),r2
800b980: 59 61 00 08 sw (r11+8),r1
800b984: 59 63 00 0c sw (r11+12),r3
800b988: 59 65 00 10 sw (r11+16),r5
800b98c: e0 00 00 26 bi 800ba24 <IMFS_eval_path+0x260>
}
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
800b990: b9 80 08 00 mv r1,r12
800b994: ba c0 10 00 mv r2,r22
800b998: f8 00 01 a1 calli 800c01c <IMFS_find_match_in_dir>
800b99c: b8 20 60 00 mv r12,r1
if ( !node )
800b9a0: 5c 2d 00 04 bne r1,r13,800b9b0 <IMFS_eval_path+0x1ec>
rtems_set_errno_and_return_minus_one( ENOENT );
800b9a4: f8 00 16 b3 calli 8011470 <__errno>
800b9a8: 34 02 00 02 mvi r2,2
800b9ac: e0 00 00 31 bi 800ba70 <IMFS_eval_path+0x2ac>
/*
* Set the node access to the point we have found.
*/
pathloc->node_access = node;
800b9b0: 59 6c 00 00 sw (r11+0),r12
800b9b4: e0 00 00 04 bi 800b9c4 <IMFS_eval_path+0x200>
case IMFS_NO_MORE_PATH:
case IMFS_CURRENT_DIR:
break;
case IMFS_INVALID_TOKEN:
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
800b9b8: f8 00 16 ae calli 8011470 <__errno>
800b9bc: 34 02 00 5b mvi r2,91
800b9c0: e0 00 00 2c bi 800ba70 <IMFS_eval_path+0x2ac>
/*
* Evaluate all tokens until we are done or an error occurs.
*/
while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {
800b9c4: 7d c1 00 04 cmpnei r1,r14,4
800b9c8: 7d ce 00 00 cmpnei r14,r14,0
800b9cc: a0 2e 70 00 and r14,r1,r14
800b9d0: 5d c0 ff a4 bne r14,r0,800b860 <IMFS_eval_path+0x9c>
* 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 ) {
800b9d4: 29 82 00 4c lw r2,(r12+76)
800b9d8: 34 01 00 01 mvi r1,1
800b9dc: 5c 41 00 1c bne r2,r1,800ba4c <IMFS_eval_path+0x288>
if ( node->info.directory.mt_fs != NULL ) {
800b9e0: 29 84 00 5c lw r4,(r12+92)
800b9e4: 44 80 00 1a be r4,r0,800ba4c <IMFS_eval_path+0x288>
newloc = node->info.directory.mt_fs->mt_fs_root;
800b9e8: 28 85 00 1c lw r5,(r4+28)
800b9ec: 28 82 00 20 lw r2,(r4+32)
800b9f0: 28 81 00 24 lw r1,(r4+36)
800b9f4: 28 83 00 28 lw r3,(r4+40)
800b9f8: 28 84 00 2c lw r4,(r4+44)
800b9fc: 5b 85 00 68 sw (sp+104),r5
800ba00: 5b 82 00 6c sw (sp+108),r2
800ba04: 5b 81 00 70 sw (sp+112),r1
800ba08: 5b 83 00 74 sw (sp+116),r3
800ba0c: 5b 84 00 78 sw (sp+120),r4
*pathloc = newloc;
800ba10: 59 65 00 00 sw (r11+0),r5
800ba14: 59 62 00 04 sw (r11+4),r2
800ba18: 59 61 00 08 sw (r11+8),r1
800ba1c: 59 63 00 0c sw (r11+12),r3
800ba20: 59 64 00 10 sw (r11+16),r4
return (*pathloc->ops->evalpath_h)( &pathname[i-len],
800ba24: 2b 82 00 7c lw r2,(sp+124)
800ba28: 28 65 00 00 lw r5,(r3+0)
800ba2c: b9 60 20 00 mv r4,r11
800ba30: ca 02 08 00 sub r1,r16,r2
800ba34: b6 41 08 00 add r1,r18,r1
800ba38: b5 e2 10 00 add r2,r15,r2
800ba3c: ba 20 18 00 mv r3,r17
800ba40: d8 a0 00 00 call r5
800ba44: b8 20 68 00 mv r13,r1
800ba48: e0 00 00 0c bi 800ba78 <IMFS_eval_path+0x2b4>
flags, pathloc );
} else {
result = IMFS_Set_handlers( pathloc );
}
} else {
result = IMFS_Set_handlers( pathloc );
800ba4c: b9 60 08 00 mv r1,r11
800ba50: fb ff fe f9 calli 800b634 <IMFS_Set_handlers>
800ba54: b8 20 68 00 mv r13,r1
/*
* Verify we have the correct permissions for this node.
*/
if ( !IMFS_evaluate_permission( pathloc, flags ) )
800ba58: ba 20 10 00 mv r2,r17
800ba5c: b9 60 08 00 mv r1,r11
800ba60: fb ff ff 1c calli 800b6d0 <IMFS_evaluate_permission>
800ba64: 5c 20 00 05 bne r1,r0,800ba78 <IMFS_eval_path+0x2b4>
rtems_set_errno_and_return_minus_one( EACCES );
800ba68: f8 00 16 82 calli 8011470 <__errno>
800ba6c: 34 02 00 0d mvi r2,13
800ba70: 58 22 00 00 sw (r1+0),r2
800ba74: 34 0d ff ff mvi r13,-1
return result;
}
800ba78: b9 a0 08 00 mv r1,r13
800ba7c: 2b 9d 00 04 lw ra,(sp+4)
800ba80: 2b 8b 00 40 lw r11,(sp+64)
800ba84: 2b 8c 00 3c lw r12,(sp+60)
800ba88: 2b 8d 00 38 lw r13,(sp+56)
800ba8c: 2b 8e 00 34 lw r14,(sp+52)
800ba90: 2b 8f 00 30 lw r15,(sp+48)
800ba94: 2b 90 00 2c lw r16,(sp+44)
800ba98: 2b 91 00 28 lw r17,(sp+40)
800ba9c: 2b 92 00 24 lw r18,(sp+36)
800baa0: 2b 93 00 20 lw r19,(sp+32)
800baa4: 2b 94 00 1c lw r20,(sp+28)
800baa8: 2b 95 00 18 lw r21,(sp+24)
800baac: 2b 96 00 14 lw r22,(sp+20)
800bab0: 2b 97 00 10 lw r23,(sp+16)
800bab4: 2b 98 00 0c lw r24,(sp+12)
800bab8: 2b 99 00 08 lw r25,(sp+8)
800babc: 37 9c 00 7c addi sp,sp,124
800bac0: c3 a0 00 00 ret
0800bc60 <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 */
)
{
800bc60: 37 9c ff 84 addi sp,sp,-124
800bc64: 5b 8b 00 40 sw (sp+64),r11
800bc68: 5b 8c 00 3c sw (sp+60),r12
800bc6c: 5b 8d 00 38 sw (sp+56),r13
800bc70: 5b 8e 00 34 sw (sp+52),r14
800bc74: 5b 8f 00 30 sw (sp+48),r15
800bc78: 5b 90 00 2c sw (sp+44),r16
800bc7c: 5b 91 00 28 sw (sp+40),r17
800bc80: 5b 92 00 24 sw (sp+36),r18
800bc84: 5b 93 00 20 sw (sp+32),r19
800bc88: 5b 94 00 1c sw (sp+28),r20
800bc8c: 5b 95 00 18 sw (sp+24),r21
800bc90: 5b 96 00 14 sw (sp+20),r22
800bc94: 5b 97 00 10 sw (sp+16),r23
800bc98: 5b 98 00 0c sw (sp+12),r24
800bc9c: 5b 99 00 08 sw (sp+8),r25
800bca0: 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 )
800bca4: 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 */
)
{
800bca8: b8 20 78 00 mv r15,r1
800bcac: b8 40 58 00 mv r11,r2
800bcb0: b8 60 88 00 mv r17,r3
/*
* This was filled in by the caller and is valid in the
* mount table.
*/
node = pathloc->node_access;
800bcb4: 28 4c 00 00 lw r12,(r2+0)
/*
* Get the path length.
*/
pathlen = strlen( path );
800bcb8: f8 00 1a 4f calli 80125f4 <strlen>
800bcbc: b8 20 90 00 mv r18,r1
const char *path, /* IN */
rtems_filesystem_location_info_t *pathloc, /* IN/OUT */
const char **name /* OUT */
)
{
int i = 0;
800bcc0: 34 0e 00 00 mvi r14,0
* Evaluate all tokens until we are done or an error occurs.
*/
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
800bcc4: 37 98 00 44 addi r24,sp,68
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
800bcc8: 34 17 00 01 mvi r23,1
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
switch( type ) {
800bccc: 34 16 00 02 mvi r22,2
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
800bcd0: 3a 10 91 08 ori r16,r16,0x9108
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
switch( type ) {
800bcd4: 34 15 00 03 mvi r21,3
result = IMFS_evaluate_link( pathloc, 0 );
if ( result == -1 )
return -1;
} else if ( node->type == IMFS_SYM_LINK ) {
800bcd8: 34 14 00 04 mvi r20,4
result = IMFS_evaluate_link( pathloc, 0 );
if ( result == -1 )
800bcdc: 34 13 ff ff mvi r19,-1
* Evaluate all tokens until we are done or an error occurs.
*/
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
800bce0: ba 40 10 00 mv r2,r18
800bce4: b5 ee 08 00 add r1,r15,r14
800bce8: bb 00 18 00 mv r3,r24
800bcec: 37 84 00 7c addi r4,sp,124
800bcf0: f8 00 00 f1 calli 800c0b4 <IMFS_get_token>
800bcf4: b8 20 68 00 mv r13,r1
pathlen -= len;
800bcf8: 2b 99 00 7c lw r25,(sp+124)
i += len;
if ( !pathloc->node_access )
800bcfc: 29 61 00 00 lw r1,(r11+0)
*/
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
pathlen -= len;
800bd00: ca 59 90 00 sub r18,r18,r25
i += len;
if ( !pathloc->node_access )
800bd04: 44 20 00 68 be r1,r0,800bea4 <IMFS_evaluate_for_make+0x244><== NEVER TAKEN
/*
* I cannot move out of this directory without execute permission.
*/
if ( type != IMFS_NO_MORE_PATH )
800bd08: 45 a0 00 07 be r13,r0,800bd24 <IMFS_evaluate_for_make+0xc4>
if ( node->type == IMFS_DIRECTORY )
800bd0c: 29 81 00 4c lw r1,(r12+76)
800bd10: 5c 37 00 05 bne r1,r23,800bd24 <IMFS_evaluate_for_make+0xc4>
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
800bd14: b9 60 08 00 mv r1,r11
800bd18: 34 02 00 01 mvi r2,1
800bd1c: fb ff fe 6d calli 800b6d0 <IMFS_evaluate_permission>
800bd20: 44 20 00 74 be r1,r0,800bef0 <IMFS_evaluate_for_make+0x290>
while( !done ) {
type = IMFS_get_token( &path[i], pathlen, token, &len );
pathlen -= len;
i += len;
800bd24: b5 d9 70 00 add r14,r14,r25
if ( type != IMFS_NO_MORE_PATH )
if ( node->type == IMFS_DIRECTORY )
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )
rtems_set_errno_and_return_minus_one( EACCES );
node = pathloc->node_access;
800bd28: 29 6c 00 00 lw r12,(r11+0)
switch( type ) {
800bd2c: 45 b6 00 07 be r13,r22,800bd48 <IMFS_evaluate_for_make+0xe8>
800bd30: 55 b6 00 03 bgu r13,r22,800bd3c <IMFS_evaluate_for_make+0xdc>
800bd34: 5d a0 ff eb bne r13,r0,800bce0 <IMFS_evaluate_for_make+0x80>
800bd38: e0 00 00 4c bi 800be68 <IMFS_evaluate_for_make+0x208>
800bd3c: 45 b5 00 1e be r13,r21,800bdb4 <IMFS_evaluate_for_make+0x154>
800bd40: 5d b4 ff e8 bne r13,r20,800bce0 <IMFS_evaluate_for_make+0x80><== NEVER TAKEN
800bd44: e0 00 00 4c bi 800be74 <IMFS_evaluate_for_make+0x214>
case IMFS_UP_DIR:
/*
* Am I at the root of all filesystems? (chroot'ed?)
*/
if ( pathloc->node_access == rtems_filesystem_root.node_access )
800bd48: 2a 01 00 00 lw r1,(r16+0)
800bd4c: 28 21 00 18 lw r1,(r1+24)
800bd50: 45 81 ff e4 be r12,r1,800bce0 <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){
800bd54: 29 64 00 10 lw r4,(r11+16)
800bd58: 28 81 00 1c lw r1,(r4+28)
800bd5c: 5d 81 00 11 bne r12,r1,800bda0 <IMFS_evaluate_for_make+0x140>
if ( pathloc->node_access == rtems_filesystem_root.node_access ) {
break;
} else {
newloc = pathloc->mt_entry->mt_point_node;
800bd60: 28 85 00 08 lw r5,(r4+8)
800bd64: 28 83 00 0c lw r3,(r4+12)
800bd68: 28 81 00 10 lw r1,(r4+16)
800bd6c: 28 82 00 14 lw r2,(r4+20)
800bd70: 28 84 00 18 lw r4,(r4+24)
800bd74: 5b 85 00 68 sw (sp+104),r5
800bd78: 5b 83 00 6c sw (sp+108),r3
800bd7c: 5b 81 00 70 sw (sp+112),r1
800bd80: 5b 82 00 74 sw (sp+116),r2
800bd84: 5b 84 00 78 sw (sp+120),r4
*pathloc = newloc;
800bd88: 59 65 00 00 sw (r11+0),r5
800bd8c: 59 63 00 04 sw (r11+4),r3
800bd90: 59 61 00 08 sw (r11+8),r1
800bd94: 59 62 00 0c sw (r11+12),r2
800bd98: 59 64 00 10 sw (r11+16),r4
800bd9c: e0 00 00 23 bi 800be28 <IMFS_evaluate_for_make+0x1c8>
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
}
} else {
if ( !node->Parent )
800bda0: 29 8c 00 08 lw r12,(r12+8)
800bda4: 5d 80 00 2f bne r12,r0,800be60 <IMFS_evaluate_for_make+0x200>
rtems_set_errno_and_return_minus_one( ENOENT );
800bda8: f8 00 15 b2 calli 8011470 <__errno>
800bdac: 58 2d 00 00 sw (r1+0),r13
800bdb0: e0 00 00 53 bi 800befc <IMFS_evaluate_for_make+0x29c>
pathloc->node_access = node;
break;
case IMFS_NAME:
if ( node->type == IMFS_HARD_LINK ) {
800bdb4: 29 81 00 4c lw r1,(r12+76)
800bdb8: 44 35 00 02 be r1,r21,800bdc0 <IMFS_evaluate_for_make+0x160>
result = IMFS_evaluate_link( pathloc, 0 );
if ( result == -1 )
return -1;
} else if ( node->type == IMFS_SYM_LINK ) {
800bdbc: 5c 34 00 06 bne r1,r20,800bdd4 <IMFS_evaluate_for_make+0x174>
result = IMFS_evaluate_link( pathloc, 0 );
800bdc0: b9 60 08 00 mv r1,r11
800bdc4: 34 02 00 00 mvi r2,0
800bdc8: fb ff ff 69 calli 800bb6c <IMFS_evaluate_link>
800bdcc: b8 20 60 00 mv r12,r1
if ( result == -1 )
800bdd0: 44 33 00 4c be r1,r19,800bf00 <IMFS_evaluate_for_make+0x2a0><== NEVER TAKEN
return -1;
}
node = pathloc->node_access;
800bdd4: 29 64 00 00 lw r4,(r11+0)
if ( !node )
800bdd8: 44 80 00 3f be r4,r0,800bed4 <IMFS_evaluate_for_make+0x274><== NEVER TAKEN
/*
* Only a directory can be decended into.
*/
if ( node->type != IMFS_DIRECTORY )
800bddc: 28 81 00 4c lw r1,(r4+76)
800bde0: 5c 37 00 3d bne r1,r23,800bed4 <IMFS_evaluate_for_make+0x274>
/*
* 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 ) {
800bde4: 28 8d 00 5c lw r13,(r4+92)
800bde8: 45 a0 00 19 be r13,r0,800be4c <IMFS_evaluate_for_make+0x1ec>
newloc = node->info.directory.mt_fs->mt_fs_root;
800bdec: 29 a4 00 1c lw r4,(r13+28)
800bdf0: 29 a3 00 20 lw r3,(r13+32)
800bdf4: 29 a1 00 24 lw r1,(r13+36)
800bdf8: 29 a2 00 28 lw r2,(r13+40)
800bdfc: 29 a5 00 2c lw r5,(r13+44)
800be00: 5b 84 00 68 sw (sp+104),r4
800be04: 5b 83 00 6c sw (sp+108),r3
800be08: 5b 81 00 70 sw (sp+112),r1
800be0c: 5b 82 00 74 sw (sp+116),r2
800be10: 5b 85 00 78 sw (sp+120),r5
*pathloc = newloc;
800be14: 59 64 00 00 sw (r11+0),r4
800be18: 59 63 00 04 sw (r11+4),r3
800be1c: 59 61 00 08 sw (r11+8),r1
800be20: 59 62 00 0c sw (r11+12),r2
800be24: 59 65 00 10 sw (r11+16),r5
return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );
800be28: 2b 81 00 7c lw r1,(sp+124)
800be2c: 28 44 00 04 lw r4,(r2+4)
800be30: ba 20 18 00 mv r3,r17
800be34: c9 c1 70 00 sub r14,r14,r1
800be38: b5 ee 08 00 add r1,r15,r14
800be3c: b9 60 10 00 mv r2,r11
800be40: d8 80 00 00 call r4
800be44: b8 20 60 00 mv r12,r1
800be48: e0 00 00 2e bi 800bf00 <IMFS_evaluate_for_make+0x2a0>
/*
* Otherwise find the token name in the present location.
*/
node = IMFS_find_match_in_dir( node, token );
800be4c: b8 80 08 00 mv r1,r4
800be50: bb 00 10 00 mv r2,r24
800be54: f8 00 00 72 calli 800c01c <IMFS_find_match_in_dir>
800be58: b8 20 60 00 mv r12,r1
/*
* If there is no node we have found the name of the node we
* wish to create.
*/
if ( ! node )
800be5c: 44 2d 00 09 be r1,r13,800be80 <IMFS_evaluate_for_make+0x220>
done = true;
else
pathloc->node_access = node;
800be60: 59 6c 00 00 sw (r11+0),r12
800be64: e3 ff ff 9f bi 800bce0 <IMFS_evaluate_for_make+0x80>
break;
case IMFS_NO_MORE_PATH:
rtems_set_errno_and_return_minus_one( EEXIST );
800be68: f8 00 15 82 calli 8011470 <__errno>
800be6c: 34 02 00 11 mvi r2,17
800be70: e0 00 00 22 bi 800bef8 <IMFS_evaluate_for_make+0x298>
break;
case IMFS_INVALID_TOKEN:
rtems_set_errno_and_return_minus_one( ENAMETOOLONG );
800be74: f8 00 15 7f calli 8011470 <__errno>
800be78: 34 02 00 5b mvi r2,91
800be7c: e0 00 00 1f bi 800bef8 <IMFS_evaluate_for_make+0x298>
case IMFS_CURRENT_DIR:
break;
}
}
*name = &path[ i - len ];
800be80: 2b 81 00 7c lw r1,(sp+124)
800be84: c9 c1 08 00 sub r1,r14,r1
800be88: b5 e1 08 00 add r1,r15,r1
800be8c: 5a 21 00 00 sw (r17+0),r1
* pathloc is returned with a pointer to the parent of the new node.
* name is returned with a pointer to the first character in the
* new node name. The parent node is verified to be a directory.
*/
int IMFS_evaluate_for_make(
800be90: b5 ee 70 00 add r14,r15,r14
/*
* We have evaluated the path as far as we can.
* Verify there is not any invalid stuff at the end of the name.
*/
for( ; path[i] != '\0'; i++) {
800be94: e0 00 00 07 bi 800beb0 <IMFS_evaluate_for_make+0x250>
if ( !IMFS_is_separator( path[ i ] ) )
800be98: fb ff de 77 calli 8003874 <rtems_filesystem_is_separator>
800be9c: 35 ce 00 01 addi r14,r14,1
800bea0: 5c 20 00 04 bne r1,r0,800beb0 <IMFS_evaluate_for_make+0x250>
rtems_set_errno_and_return_minus_one( ENOENT );
800bea4: f8 00 15 73 calli 8011470 <__errno>
800bea8: 34 02 00 02 mvi r2,2
800beac: e0 00 00 13 bi 800bef8 <IMFS_evaluate_for_make+0x298>
/*
* We have evaluated the path as far as we can.
* Verify there is not any invalid stuff at the end of the name.
*/
for( ; path[i] != '\0'; i++) {
800beb0: 41 c1 00 00 lbu r1,(r14+0)
800beb4: 5c 20 ff f9 bne r1,r0,800be98 <IMFS_evaluate_for_make+0x238>
/*
* Verify we can execute and write to this directory.
*/
result = IMFS_Set_handlers( pathloc );
800beb8: b9 60 08 00 mv r1,r11
800bebc: fb ff fd de calli 800b634 <IMFS_Set_handlers>
800bec0: b8 20 60 00 mv r12,r1
/*
* The returned node must be a directory
*/
node = pathloc->node_access;
if ( node->type != IMFS_DIRECTORY )
800bec4: 29 61 00 00 lw r1,(r11+0)
800bec8: 28 22 00 4c lw r2,(r1+76)
800becc: 34 01 00 01 mvi r1,1
800bed0: 44 41 00 04 be r2,r1,800bee0 <IMFS_evaluate_for_make+0x280><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ENOTDIR );
800bed4: f8 00 15 67 calli 8011470 <__errno>
800bed8: 34 02 00 14 mvi r2,20
800bedc: e0 00 00 07 bi 800bef8 <IMFS_evaluate_for_make+0x298>
/*
* We must have Write and execute permission on the returned node.
*/
if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) )
800bee0: b9 60 08 00 mv r1,r11
800bee4: 34 02 00 03 mvi r2,3
800bee8: fb ff fd fa calli 800b6d0 <IMFS_evaluate_permission>
800beec: 5c 20 00 05 bne r1,r0,800bf00 <IMFS_evaluate_for_make+0x2a0>
rtems_set_errno_and_return_minus_one( EACCES );
800bef0: f8 00 15 60 calli 8011470 <__errno>
800bef4: 34 02 00 0d mvi r2,13
800bef8: 58 22 00 00 sw (r1+0),r2
800befc: 34 0c ff ff mvi r12,-1
return result;
}
800bf00: b9 80 08 00 mv r1,r12
800bf04: 2b 9d 00 04 lw ra,(sp+4)
800bf08: 2b 8b 00 40 lw r11,(sp+64)
800bf0c: 2b 8c 00 3c lw r12,(sp+60)
800bf10: 2b 8d 00 38 lw r13,(sp+56)
800bf14: 2b 8e 00 34 lw r14,(sp+52)
800bf18: 2b 8f 00 30 lw r15,(sp+48)
800bf1c: 2b 90 00 2c lw r16,(sp+44)
800bf20: 2b 91 00 28 lw r17,(sp+40)
800bf24: 2b 92 00 24 lw r18,(sp+36)
800bf28: 2b 93 00 20 lw r19,(sp+32)
800bf2c: 2b 94 00 1c lw r20,(sp+28)
800bf30: 2b 95 00 18 lw r21,(sp+24)
800bf34: 2b 96 00 14 lw r22,(sp+20)
800bf38: 2b 97 00 10 lw r23,(sp+16)
800bf3c: 2b 98 00 0c lw r24,(sp+12)
800bf40: 2b 99 00 08 lw r25,(sp+8)
800bf44: 37 9c 00 7c addi sp,sp,124
800bf48: c3 a0 00 00 ret
0800b6d0 <IMFS_evaluate_permission>:
*/
int IMFS_evaluate_permission(
rtems_filesystem_location_info_t *node,
int flags
)
{
800b6d0: 37 9c ff f0 addi sp,sp,-16
800b6d4: 5b 8b 00 10 sw (sp+16),r11
800b6d8: 5b 8c 00 0c sw (sp+12),r12
800b6dc: 5b 8d 00 08 sw (sp+8),r13
800b6e0: 5b 9d 00 04 sw (sp+4),ra
800b6e4: 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 ) )
800b6e8: 34 02 ff f8 mvi r2,-8
800b6ec: a1 82 10 00 and r2,r12,r2
800b6f0: 44 40 00 06 be r2,r0,800b708 <IMFS_evaluate_permission+0x38><== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
800b6f4: f8 00 17 5f calli 8011470 <__errno> <== NOT EXECUTED
800b6f8: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
800b6fc: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
800b700: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
800b704: e0 00 00 13 bi 800b750 <IMFS_evaluate_permission+0x80> <== NOT EXECUTED
jnode = node->node_access;
800b708: 28 2b 00 00 lw r11,(r1+0)
#if defined(RTEMS_POSIX_API)
st_uid = geteuid();
800b70c: f8 00 03 a6 calli 800c5a4 <geteuid>
800b710: b8 20 68 00 mv r13,r1
st_gid = getegid();
800b714: f8 00 03 9f calli 800c590 <getegid>
800b718: b8 20 10 00 mv r2,r1
* Check if I am owner or a group member or someone else.
*/
flags_to_test = flags;
if ( st_uid == jnode->st_uid )
800b71c: 2d 61 00 3c lhu r1,(r11+60)
800b720: 5c 2d 00 04 bne r1,r13,800b730 <IMFS_evaluate_permission+0x60>
flags_to_test <<= 6;
800b724: b9 80 08 00 mv r1,r12
800b728: 34 02 00 06 mvi r2,6
800b72c: e0 00 00 05 bi 800b740 <IMFS_evaluate_permission+0x70>
else if ( st_gid == jnode->st_gid )
800b730: 2d 63 00 3e lhu r3,(r11+62)
800b734: b9 80 08 00 mv r1,r12
800b738: 5c 62 00 03 bne r3,r2,800b744 <IMFS_evaluate_permission+0x74><== NEVER TAKEN
flags_to_test <<= 3;
800b73c: 34 02 00 03 mvi r2,3
800b740: f8 00 2d b9 calli 8016e24 <__ashlsi3>
/*
* If all of the flags are set we have permission
* to do this.
*/
if ( ( flags_to_test & jnode->st_mode) == flags_to_test )
800b744: 29 62 00 30 lw r2,(r11+48)
800b748: a0 22 10 00 and r2,r1,r2
gid_t st_gid;
IMFS_jnode_t *jnode;
int flags_to_test;
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
800b74c: e4 41 08 00 cmpe r1,r2,r1
*/
if ( ( flags_to_test & jnode->st_mode) == flags_to_test )
return 1;
return 0;
}
800b750: 2b 9d 00 04 lw ra,(sp+4)
800b754: 2b 8b 00 10 lw r11,(sp+16)
800b758: 2b 8c 00 0c lw r12,(sp+12)
800b75c: 2b 8d 00 08 lw r13,(sp+8)
800b760: 37 9c 00 10 addi sp,sp,16
800b764: c3 a0 00 00 ret
08001f84 <IMFS_fifo_lseek>:
rtems_off64_t IMFS_fifo_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
8001f84: 37 9c ff f8 addi sp,sp,-8
8001f88: 5b 8b 00 08 sw (sp+8),r11
8001f8c: 5b 9d 00 04 sw (sp+4),ra
8001f90: b8 20 28 00 mv r5,r1
off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop);
8001f94: 28 21 00 1c lw r1,(r1+28)
8001f98: b8 60 10 00 mv r2,r3
8001f9c: b8 80 18 00 mv r3,r4
8001fa0: 28 21 00 50 lw r1,(r1+80)
8001fa4: b8 a0 20 00 mv r4,r5
8001fa8: f8 00 22 c8 calli 800aac8 <pipe_lseek>
8001fac: b8 20 58 00 mv r11,r1
IMFS_FIFO_RETURN(err);
8001fb0: 4c 20 00 07 bge r1,r0,8001fcc <IMFS_fifo_lseek+0x48> <== NEVER TAKEN
8001fb4: f8 00 33 49 calli 800ecd8 <__errno>
8001fb8: c8 0b 58 00 sub r11,r0,r11
8001fbc: 58 2b 00 00 sw (r1+0),r11
8001fc0: 34 01 ff ff mvi r1,-1
8001fc4: 34 0b ff ff mvi r11,-1
8001fc8: e0 00 00 03 bi 8001fd4 <IMFS_fifo_lseek+0x50>
8001fcc: 34 02 00 1f mvi r2,31 <== NOT EXECUTED
8001fd0: f8 00 76 8d calli 801fa04 <__ashrsi3> <== NOT EXECUTED
}
8001fd4: b9 60 10 00 mv r2,r11
8001fd8: 2b 9d 00 04 lw ra,(sp+4)
8001fdc: 2b 8b 00 08 lw r11,(sp+8)
8001fe0: 37 9c 00 08 addi sp,sp,8
8001fe4: c3 a0 00 00 ret
08002074 <IMFS_fifo_write>:
ssize_t IMFS_fifo_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
8002074: 37 9c ff ec addi sp,sp,-20
8002078: 5b 8b 00 0c sw (sp+12),r11
800207c: 5b 8c 00 08 sw (sp+8),r12
8002080: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *jnode = iop->pathinfo.node_access;
8002084: 28 2c 00 1c lw r12,(r1+28)
ssize_t IMFS_fifo_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
8002088: b8 20 20 00 mv r4,r1
IMFS_jnode_t *jnode = iop->pathinfo.node_access;
int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop);
800208c: 29 81 00 50 lw r1,(r12+80)
8002090: f8 00 21 f1 calli 800a854 <pipe_write>
8002094: b8 20 58 00 mv r11,r1
if (err > 0) {
8002098: 4c 01 00 08 bge r0,r1,80020b8 <IMFS_fifo_write+0x44>
IMFS_mtime_ctime_update(jnode);
800209c: 37 81 00 10 addi r1,sp,16
80020a0: 34 02 00 00 mvi r2,0
80020a4: f8 00 04 de calli 800341c <gettimeofday>
80020a8: 2b 81 00 10 lw r1,(sp+16)
80020ac: 59 81 00 44 sw (r12+68),r1
80020b0: 59 81 00 48 sw (r12+72),r1
80020b4: e0 00 00 06 bi 80020cc <IMFS_fifo_write+0x58>
}
IMFS_FIFO_RETURN(err);
80020b8: 44 20 00 05 be r1,r0,80020cc <IMFS_fifo_write+0x58> <== NEVER TAKEN
80020bc: c8 0b 58 00 sub r11,r0,r11
80020c0: f8 00 33 06 calli 800ecd8 <__errno>
80020c4: 58 2b 00 00 sw (r1+0),r11
80020c8: 34 0b ff ff mvi r11,-1
}
80020cc: b9 60 08 00 mv r1,r11
80020d0: 2b 9d 00 04 lw ra,(sp+4)
80020d4: 2b 8b 00 0c lw r11,(sp+12)
80020d8: 2b 8c 00 08 lw r12,(sp+8)
80020dc: 37 9c 00 14 addi sp,sp,20
80020e0: c3 a0 00 00 ret
0800c01c <IMFS_find_match_in_dir>:
IMFS_jnode_t *IMFS_find_match_in_dir(
IMFS_jnode_t *directory,
char *name
)
{
800c01c: 37 9c ff f0 addi sp,sp,-16
800c020: 5b 8b 00 10 sw (sp+16),r11
800c024: 5b 8c 00 0c sw (sp+12),r12
800c028: 5b 8d 00 08 sw (sp+8),r13
800c02c: 5b 9d 00 04 sw (sp+4),ra
800c030: b8 20 58 00 mv r11,r1
800c034: b8 40 68 00 mv r13,r2
/*
* Check for "." and ".."
*/
if ( !strcmp( name, dotname ) )
800c038: b8 40 08 00 mv r1,r2
800c03c: 78 02 08 01 mvhi r2,0x801
800c040: 38 42 82 70 ori r2,r2,0x8270
800c044: f8 00 18 f5 calli 8012418 <strcmp>
800c048: 44 20 00 14 be r1,r0,800c098 <IMFS_find_match_in_dir+0x7c> <== NEVER TAKEN
return directory;
if ( !strcmp( name, dotdotname ) )
800c04c: 78 02 08 01 mvhi r2,0x801
800c050: b9 a0 08 00 mv r1,r13
800c054: 38 42 82 74 ori r2,r2,0x8274
800c058: f8 00 18 f0 calli 8012418 <strcmp>
800c05c: 5c 20 00 03 bne r1,r0,800c068 <IMFS_find_match_in_dir+0x4c><== ALWAYS TAKEN
return directory->Parent;
800c060: 29 6b 00 08 lw r11,(r11+8)
800c064: e0 00 00 0d bi 800c098 <IMFS_find_match_in_dir+0x7c> <== NOT EXECUTED
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
}
800c068: 29 6c 00 50 lw r12,(r11+80)
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
800c06c: 35 6b 00 54 addi r11,r11,84
if ( !strcmp( name, dotdotname ) )
return directory->Parent;
the_chain = &directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
800c070: e0 00 00 06 bi 800c088 <IMFS_find_match_in_dir+0x6c>
!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 ) )
800c074: b9 a0 08 00 mv r1,r13
800c078: 35 82 00 0c addi r2,r12,12
800c07c: f8 00 18 e7 calli 8012418 <strcmp>
800c080: 44 20 00 05 be r1,r0,800c094 <IMFS_find_match_in_dir+0x78>
the_chain = &directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
800c084: 29 8c 00 00 lw r12,(r12+0)
if ( !strcmp( name, dotdotname ) )
return directory->Parent;
the_chain = &directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
800c088: 5d 8b ff fb bne r12,r11,800c074 <IMFS_find_match_in_dir+0x58>
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
800c08c: 34 0b 00 00 mvi r11,0
800c090: e0 00 00 02 bi 800c098 <IMFS_find_match_in_dir+0x7c>
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;
800c094: b9 80 58 00 mv r11,r12
if ( !strcmp( name, the_jnode->name ) )
return the_jnode;
}
return 0;
}
800c098: b9 60 08 00 mv r1,r11
800c09c: 2b 9d 00 04 lw ra,(sp+4)
800c0a0: 2b 8b 00 10 lw r11,(sp+16)
800c0a4: 2b 8c 00 0c lw r12,(sp+12)
800c0a8: 2b 8d 00 08 lw r13,(sp+8)
800c0ac: 37 9c 00 10 addi sp,sp,16
800c0b0: c3 a0 00 00 ret
0800bf4c <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
)
{
800bf4c: 37 9c ff d8 addi sp,sp,-40
800bf50: 5b 8b 00 14 sw (sp+20),r11
800bf54: 5b 8c 00 10 sw (sp+16),r12
800bf58: 5b 8d 00 0c sw (sp+12),r13
800bf5c: 5b 8e 00 08 sw (sp+8),r14
800bf60: 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;
800bf64: 28 2b 00 1c lw r11,(r1+28)
loc = temp_mt_entry->mt_fs_root;
800bf68: 28 25 00 20 lw r5,(r1+32)
800bf6c: 28 24 00 24 lw r4,(r1+36)
800bf70: 28 23 00 28 lw r3,(r1+40)
800bf74: 28 22 00 2c lw r2,(r1+44)
800bf78: 5b 8b 00 18 sw (sp+24),r11
800bf7c: 5b 85 00 1c sw (sp+28),r5
800bf80: 5b 84 00 20 sw (sp+32),r4
800bf84: 5b 83 00 24 sw (sp+36),r3
800bf88: 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;
800bf8c: 58 20 00 1c sw (r1+28),r0
do {
next = jnode->Parent;
loc.node_access = (void *)jnode;
IMFS_Set_handlers( &loc );
800bf90: 37 8c 00 18 addi r12,sp,24
if ( jnode->type != IMFS_DIRECTORY ) {
800bf94: 34 0d 00 01 mvi r13,1
temp_mt_entry->mt_fs_root.node_access = NULL;
do {
next = jnode->Parent;
loc.node_access = (void *)jnode;
IMFS_Set_handlers( &loc );
800bf98: b9 80 08 00 mv r1,r12
*/
temp_mt_entry->mt_fs_root.node_access = NULL;
do {
next = jnode->Parent;
800bf9c: 29 6e 00 08 lw r14,(r11+8)
loc.node_access = (void *)jnode;
800bfa0: 5b 8b 00 18 sw (sp+24),r11
IMFS_Set_handlers( &loc );
800bfa4: fb ff fd a4 calli 800b634 <IMFS_Set_handlers>
if ( jnode->type != IMFS_DIRECTORY ) {
800bfa8: 29 61 00 4c lw r1,(r11+76)
800bfac: 5c 2d 00 04 bne r1,r13,800bfbc <IMFS_fsunmount+0x70>
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
800bfb0: 29 62 00 50 lw r2,(r11+80)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800bfb4: 35 61 00 54 addi r1,r11,84
800bfb8: 5c 41 00 06 bne r2,r1,800bfd0 <IMFS_fsunmount+0x84>
result = IMFS_unlink( NULL, &loc );
800bfbc: 34 01 00 00 mvi r1,0
800bfc0: b9 80 10 00 mv r2,r12
800bfc4: fb ff d8 38 calli 80020a4 <IMFS_unlink>
if (result != 0)
800bfc8: 5c 20 00 0b bne r1,r0,800bff4 <IMFS_fsunmount+0xa8> <== NEVER TAKEN
return -1;
jnode = next;
800bfcc: b9 c0 58 00 mv r11,r14
}
if ( jnode != NULL ) {
800bfd0: 45 60 00 0b be r11,r0,800bffc <IMFS_fsunmount+0xb0>
if ( jnode->type == IMFS_DIRECTORY ) {
800bfd4: 29 61 00 4c lw r1,(r11+76)
800bfd8: 5c 2d ff f0 bne r1,r13,800bf98 <IMFS_fsunmount+0x4c> <== NEVER TAKEN
}
}
} while (jnode != NULL);
return 0;
}
800bfdc: 29 61 00 50 lw r1,(r11+80)
800bfe0: 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 ) )
800bfe4: 44 22 ff ed be r1,r2,800bf98 <IMFS_fsunmount+0x4c>
jnode = jnode_get_first_child( jnode );
800bfe8: b8 20 58 00 mv r11,r1
}
}
} while (jnode != NULL);
800bfec: 5c 20 ff eb bne r1,r0,800bf98 <IMFS_fsunmount+0x4c> <== ALWAYS TAKEN
800bff0: e0 00 00 03 bi 800bffc <IMFS_fsunmount+0xb0>
return -1;
jnode = next;
} else if ( jnode_has_no_children( jnode ) ) {
result = IMFS_unlink( NULL, &loc );
if (result != 0)
return -1;
800bff4: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
800bff8: e0 00 00 02 bi 800c000 <IMFS_fsunmount+0xb4> <== NOT EXECUTED
jnode = jnode_get_first_child( jnode );
}
}
} while (jnode != NULL);
return 0;
800bffc: 34 01 00 00 mvi r1,0
}
800c000: 2b 9d 00 04 lw ra,(sp+4)
800c004: 2b 8b 00 14 lw r11,(sp+20)
800c008: 2b 8c 00 10 lw r12,(sp+16)
800c00c: 2b 8d 00 0c lw r13,(sp+12)
800c010: 2b 8e 00 08 lw r14,(sp+8)
800c014: 37 9c 00 28 addi sp,sp,40
800c018: c3 a0 00 00 ret
0800c0b4 <IMFS_get_token>:
const char *path,
int pathlen,
char *token,
int *token_len
)
{
800c0b4: 37 9c ff e0 addi sp,sp,-32
800c0b8: 5b 8b 00 20 sw (sp+32),r11
800c0bc: 5b 8c 00 1c sw (sp+28),r12
800c0c0: 5b 8d 00 18 sw (sp+24),r13
800c0c4: 5b 8e 00 14 sw (sp+20),r14
800c0c8: 5b 8f 00 10 sw (sp+16),r15
800c0cc: 5b 90 00 0c sw (sp+12),r16
800c0d0: 5b 91 00 08 sw (sp+8),r17
800c0d4: 5b 9d 00 04 sw (sp+4),ra
register int i = 0;
800c0d8: 34 0b 00 00 mvi r11,0
const char *path,
int pathlen,
char *token,
int *token_len
)
{
800c0dc: b8 20 78 00 mv r15,r1
800c0e0: b8 40 70 00 mv r14,r2
800c0e4: b8 60 68 00 mv r13,r3
800c0e8: b8 80 80 00 mv r16,r4
register char c;
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
800c0ec: 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 )
800c0f0: 34 11 00 20 mvi r17,32
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
800c0f4: e0 00 00 07 bi 800c110 <IMFS_get_token+0x5c>
#include <string.h>
#include "imfs.h"
#include <rtems/libio_.h>
IMFS_token_types IMFS_get_token(
800c0f8: b5 ab 08 00 add r1,r13,r11
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
token[i] = c;
800c0fc: 30 2c 00 00 sb (r1+0),r12
if ( i == IMFS_NAME_MAX )
800c100: 45 71 00 27 be r11,r17,800c19c <IMFS_get_token+0xe8>
return IMFS_INVALID_TOKEN;
if ( !IMFS_is_valid_name_char(c) )
type = IMFS_INVALID_TOKEN;
c = path [++i];
800c104: 35 6b 00 01 addi r11,r11,1
#include <string.h>
#include "imfs.h"
#include <rtems/libio_.h>
IMFS_token_types IMFS_get_token(
800c108: b5 eb 08 00 add r1,r15,r11
return IMFS_INVALID_TOKEN;
if ( !IMFS_is_valid_name_char(c) )
type = IMFS_INVALID_TOKEN;
c = path [++i];
800c10c: 40 2c 00 00 lbu r12,(r1+0)
/*
* Copy a name into token. (Remember NULL is a token.)
*/
c = path[i];
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
800c110: b9 80 08 00 mv r1,r12
800c114: fb ff dd d8 calli 8003874 <rtems_filesystem_is_separator>
800c118: 5c 20 00 03 bne r1,r0,800c124 <IMFS_get_token+0x70>
800c11c: e9 cb 10 00 cmpg r2,r14,r11
800c120: 5c 41 ff f6 bne r2,r1,800c0f8 <IMFS_get_token+0x44> <== ALWAYS TAKEN
/*
* Copy a seperator into token.
*/
if ( i == 0 ) {
800c124: 5d 60 00 08 bne r11,r0,800c144 <IMFS_get_token+0x90>
token[i] = c;
800c128: 31 ac 00 00 sb (r13+0),r12
if ( (token[i] != '\0') && pathlen ) {
800c12c: 7d ce 00 00 cmpnei r14,r14,0
800c130: 7d 8c 00 00 cmpnei r12,r12,0
800c134: a1 8e 60 00 and r12,r12,r14
800c138: 5d 8b 00 09 bne r12,r11,800c15c <IMFS_get_token+0xa8>
i++;
type = IMFS_CURRENT_DIR;
} else {
type = IMFS_NO_MORE_PATH;
800c13c: 34 0c 00 00 mvi r12,0
800c140: e0 00 00 09 bi 800c164 <IMFS_get_token+0xb0>
}
} else if (token[ i-1 ] != '\0') {
800c144: b5 ab 08 00 add r1,r13,r11
800c148: 40 22 ff ff lbu r2,(r1+-1)
char *token,
int *token_len
)
{
register int i = 0;
IMFS_token_types type = IMFS_NAME;
800c14c: 34 0c 00 03 mvi r12,3
i++;
type = IMFS_CURRENT_DIR;
} else {
type = IMFS_NO_MORE_PATH;
}
} else if (token[ i-1 ] != '\0') {
800c150: 44 40 00 05 be r2,r0,800c164 <IMFS_get_token+0xb0> <== NEVER TAKEN
token[i] = '\0';
800c154: 30 20 00 00 sb (r1+0),r0
800c158: e0 00 00 03 bi 800c164 <IMFS_get_token+0xb0>
if ( i == 0 ) {
token[i] = c;
if ( (token[i] != '\0') && pathlen ) {
i++;
type = IMFS_CURRENT_DIR;
800c15c: 34 0c 00 01 mvi r12,1
if ( i == 0 ) {
token[i] = c;
if ( (token[i] != '\0') && pathlen ) {
i++;
800c160: 34 0b 00 01 mvi r11,1
/*
* Set token_len to the number of characters copied.
*/
*token_len = i;
800c164: 5a 0b 00 00 sw (r16+0),r11
/*
* If we copied something that was not a seperator see if
* it was a special name.
*/
if ( type == IMFS_NAME ) {
800c168: 34 01 00 03 mvi r1,3
800c16c: 5d 81 00 11 bne r12,r1,800c1b0 <IMFS_get_token+0xfc>
if ( strcmp( token, "..") == 0 )
800c170: 78 02 08 01 mvhi r2,0x801
800c174: b9 a0 08 00 mv r1,r13
800c178: 38 42 82 78 ori r2,r2,0x8278
800c17c: f8 00 18 a7 calli 8012418 <strcmp>
800c180: 44 20 00 09 be r1,r0,800c1a4 <IMFS_get_token+0xf0>
type = IMFS_UP_DIR;
else if ( strcmp( token, "." ) == 0 )
800c184: 78 02 08 01 mvhi r2,0x801
800c188: b9 a0 08 00 mv r1,r13
800c18c: 38 42 82 7c ori r2,r2,0x827c
800c190: f8 00 18 a2 calli 8012418 <strcmp>
800c194: 44 20 00 06 be r1,r0,800c1ac <IMFS_get_token+0xf8>
800c198: e0 00 00 06 bi 800c1b0 <IMFS_get_token+0xfc>
while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) {
token[i] = c;
if ( i == IMFS_NAME_MAX )
return IMFS_INVALID_TOKEN;
800c19c: 34 0c 00 04 mvi r12,4
800c1a0: e0 00 00 04 bi 800c1b0 <IMFS_get_token+0xfc>
* it was a special name.
*/
if ( type == IMFS_NAME ) {
if ( strcmp( token, "..") == 0 )
type = IMFS_UP_DIR;
800c1a4: 34 0c 00 02 mvi r12,2
800c1a8: e0 00 00 02 bi 800c1b0 <IMFS_get_token+0xfc>
else if ( strcmp( token, "." ) == 0 )
type = IMFS_CURRENT_DIR;
800c1ac: 34 0c 00 01 mvi r12,1
}
return type;
}
800c1b0: b9 80 08 00 mv r1,r12
800c1b4: 2b 9d 00 04 lw ra,(sp+4)
800c1b8: 2b 8b 00 20 lw r11,(sp+32)
800c1bc: 2b 8c 00 1c lw r12,(sp+28)
800c1c0: 2b 8d 00 18 lw r13,(sp+24)
800c1c4: 2b 8e 00 14 lw r14,(sp+20)
800c1c8: 2b 8f 00 10 lw r15,(sp+16)
800c1cc: 2b 90 00 0c lw r16,(sp+12)
800c1d0: 2b 91 00 08 lw r17,(sp+8)
800c1d4: 37 9c 00 20 addi sp,sp,32
800c1d8: c3 a0 00 00 ret
08001c28 <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
)
{
8001c28: 37 9c ff e0 addi sp,sp,-32
8001c2c: 5b 8b 00 20 sw (sp+32),r11
8001c30: 5b 8c 00 1c sw (sp+28),r12
8001c34: 5b 8d 00 18 sw (sp+24),r13
8001c38: 5b 8e 00 14 sw (sp+20),r14
8001c3c: 5b 8f 00 10 sw (sp+16),r15
8001c40: 5b 90 00 0c sw (sp+12),r16
8001c44: 5b 91 00 08 sw (sp+8),r17
8001c48: 5b 9d 00 04 sw (sp+4),ra
8001c4c: b8 20 58 00 mv r11,r1
IMFS_jnode_t *jnode;
/*
* determine/check value for imfs_memfile_bytes_per_block
*/
IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block,
8001c50: 78 01 08 01 mvhi r1,0x801
8001c54: 38 21 90 14 ori r1,r1,0x9014
8001c58: 28 2c 00 00 lw r12,(r1+0)
const rtems_filesystem_operations_table *op_table,
const rtems_filesystem_file_handlers_r *memfile_handlers,
const rtems_filesystem_file_handlers_r *directory_handlers,
const rtems_filesystem_file_handlers_r *fifo_handlers
)
{
8001c5c: b8 40 88 00 mv r17,r2
8001c60: b8 60 80 00 mv r16,r3
8001c64: b8 80 70 00 mv r14,r4
8001c68: b8 a0 78 00 mv r15,r5
IMFS_jnode_t *jnode;
/*
* determine/check value for imfs_memfile_bytes_per_block
*/
IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block,
8001c6c: 34 0d 00 06 mvi r13,6
int bit_mask;
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
8001c70: 34 01 00 10 mvi r1,16
if (bit_mask == requested_bytes_per_block) {
8001c74: 44 2c 00 07 be r1,r12,8001c90 <IMFS_initialize_support+0x68>
is_valid = true;
break;
}
if(bit_mask > requested_bytes_per_block)
8001c78: 48 2c 00 05 bg r1,r12,8001c8c <IMFS_initialize_support+0x64>
int bit_mask;
/*
* check, whether requested bytes per block is valid
*/
for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
8001c7c: 34 02 00 01 mvi r2,1
8001c80: 35 ad ff ff addi r13,r13,-1
8001c84: f8 00 54 68 calli 8016e24 <__ashlsi3>
8001c88: 5d a0 ff fb bne r13,r0,8001c74 <IMFS_initialize_support+0x4c><== ALWAYS TAKEN
if(bit_mask > requested_bytes_per_block)
break;
}
*dest_bytes_per_block = ((is_valid)
? requested_bytes_per_block
: default_bytes_per_block);
8001c8c: 34 0c 00 80 mvi r12,128
break;
}
if(bit_mask > requested_bytes_per_block)
break;
}
*dest_bytes_per_block = ((is_valid)
8001c90: 78 01 08 01 mvhi r1,0x801
8001c94: 38 21 96 d8 ori r1,r1,0x96d8
8001c98: 58 2c 00 00 sw (r1+0),r12
/*
* Create the root node
*
* NOTE: UNIX root is 755 and owned by root/root (0/0).
*/
temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node();
8001c9c: f8 00 26 56 calli 800b5f4 <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;
8001ca0: 78 02 08 01 mvhi r2,0x801
/*
* Create the root node
*
* NOTE: UNIX root is 755 and owned by root/root (0/0).
*/
temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node();
8001ca4: 59 61 00 1c sw (r11+28),r1
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
temp_mt_entry->mt_fs_root.ops = op_table;
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
8001ca8: 38 42 82 24 ori r2,r2,0x8224
8001cac: 34 03 00 30 mvi r3,48
/*
* Create the root node
*
* NOTE: UNIX root is 755 and owned by root/root (0/0).
*/
temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node();
8001cb0: b8 20 60 00 mv r12,r1
temp_mt_entry->mt_fs_root.handlers = directory_handlers;
8001cb4: 59 6e 00 24 sw (r11+36),r14
temp_mt_entry->mt_fs_root.ops = op_table;
8001cb8: 59 71 00 28 sw (r11+40),r17
temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
8001cbc: 35 61 00 38 addi r1,r11,56
8001cc0: f8 00 40 a2 calli 8011f48 <memcpy>
/*
* Create custom file system data.
*/
fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
8001cc4: 34 02 00 14 mvi r2,20
8001cc8: 34 01 00 01 mvi r1,1
8001ccc: f8 00 01 ec calli 800247c <calloc>
8001cd0: b8 20 10 00 mv r2,r1
if ( !fs_info ) {
8001cd4: 5c 20 00 08 bne r1,r0,8001cf4 <IMFS_initialize_support+0xcc>
free(temp_mt_entry->mt_fs_root.node_access);
8001cd8: b9 80 08 00 mv r1,r12
8001cdc: f8 00 02 79 calli 80026c0 <free>
rtems_set_errno_and_return_minus_one(ENOMEM);
8001ce0: f8 00 3d e4 calli 8011470 <__errno>
8001ce4: 34 02 00 0c mvi r2,12
8001ce8: 58 22 00 00 sw (r1+0),r2
8001cec: 34 01 ff ff mvi r1,-1
8001cf0: e0 00 00 0f bi 8001d2c <IMFS_initialize_support+0x104>
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
8001cf4: 78 06 08 01 mvhi r6,0x801
8001cf8: 38 c6 96 dc ori r6,r6,0x96dc
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;
8001cfc: 59 61 00 34 sw (r11+52),r1
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
8001d00: 28 c1 00 00 lw r1,(r6+0)
fs_info->ino_count = 1;
fs_info->memfile_handlers = memfile_handlers;
8001d04: 58 50 00 08 sw (r2+8),r16
fs_info->directory_handlers = directory_handlers;
8001d08: 58 4e 00 0c sw (r2+12),r14
/*
* Set st_ino for the root to 1.
*/
fs_info->instance = imfs_instance++;
8001d0c: 58 41 00 00 sw (r2+0),r1
8001d10: 34 21 00 01 addi r1,r1,1
8001d14: 58 c1 00 00 sw (r6+0),r1
fs_info->ino_count = 1;
8001d18: 34 01 00 01 mvi r1,1
8001d1c: 58 41 00 04 sw (r2+4),r1
fs_info->memfile_handlers = memfile_handlers;
fs_info->directory_handlers = directory_handlers;
fs_info->fifo_handlers = fifo_handlers;
8001d20: 58 4f 00 10 sw (r2+16),r15
jnode = temp_mt_entry->mt_fs_root.node_access;
jnode->st_ino = fs_info->ino_count;
8001d24: 59 81 00 38 sw (r12+56),r1
return 0;
8001d28: 34 01 00 00 mvi r1,0
}
8001d2c: 2b 9d 00 04 lw ra,(sp+4)
8001d30: 2b 8b 00 20 lw r11,(sp+32)
8001d34: 2b 8c 00 1c lw r12,(sp+28)
8001d38: 2b 8d 00 18 lw r13,(sp+24)
8001d3c: 2b 8e 00 14 lw r14,(sp+20)
8001d40: 2b 8f 00 10 lw r15,(sp+16)
8001d44: 2b 90 00 0c lw r16,(sp+12)
8001d48: 2b 91 00 08 lw r17,(sp+8)
8001d4c: 37 9c 00 20 addi sp,sp,32
8001d50: c3 a0 00 00 ret
0800fd78 <IMFS_memfile_extend>:
*/
MEMFILE_STATIC int IMFS_memfile_extend(
IMFS_jnode_t *the_jnode,
off_t new_length
)
{
800fd78: 37 9c ff e0 addi sp,sp,-32
800fd7c: 5b 8b 00 20 sw (sp+32),r11
800fd80: 5b 8c 00 1c sw (sp+28),r12
800fd84: 5b 8d 00 18 sw (sp+24),r13
800fd88: 5b 8e 00 14 sw (sp+20),r14
800fd8c: 5b 8f 00 10 sw (sp+16),r15
800fd90: 5b 90 00 0c sw (sp+12),r16
800fd94: 5b 91 00 08 sw (sp+8),r17
800fd98: 5b 9d 00 04 sw (sp+4),ra
800fd9c: 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 )
800fda0: 78 01 08 01 mvhi r1,0x801
800fda4: 38 21 96 d8 ori r1,r1,0x96d8
800fda8: 28 2b 00 00 lw r11,(r1+0)
*/
MEMFILE_STATIC int IMFS_memfile_extend(
IMFS_jnode_t *the_jnode,
off_t new_length
)
{
800fdac: b8 40 68 00 mv r13,r2
IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE );
/*
* Verify new file size is supported
*/
if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE )
800fdb0: 34 02 00 02 mvi r2,2
800fdb4: b9 60 08 00 mv r1,r11
800fdb8: f8 00 1c 69 calli 8016f5c <__lshrsi3>
800fdbc: b8 20 70 00 mv r14,r1
800fdc0: b9 c0 10 00 mv r2,r14
800fdc4: 34 21 00 01 addi r1,r1,1
800fdc8: f8 00 1c 8c calli 8016ff8 <__mulsi3>
800fdcc: b9 c0 10 00 mv r2,r14
800fdd0: 34 21 00 01 addi r1,r1,1
800fdd4: f8 00 1c 89 calli 8016ff8 <__mulsi3>
800fdd8: 34 21 ff ff addi r1,r1,-1
800fddc: b9 60 10 00 mv r2,r11
800fde0: f8 00 1c 86 calli 8016ff8 <__mulsi3>
800fde4: 54 2d 00 04 bgu r1,r13,800fdf4 <IMFS_memfile_extend+0x7c>
rtems_set_errno_and_return_minus_one( EINVAL );
800fde8: f8 00 05 a2 calli 8011470 <__errno>
800fdec: 34 02 00 16 mvi r2,22
800fdf0: e0 00 00 26 bi 800fe88 <IMFS_memfile_extend+0x110>
/*
* Verify new file size is actually larger than current size
*/
if ( new_length <= the_jnode->info.file.size )
800fdf4: b9 a0 08 00 mv r1,r13
800fdf8: 34 02 00 1f mvi r2,31
800fdfc: f8 00 1c 31 calli 8016ec0 <__ashrsi3>
800fe00: 29 8f 00 50 lw r15,(r12+80)
800fe04: b8 20 70 00 mv r14,r1
800fe08: 29 90 00 54 lw r16,(r12+84)
800fe0c: 48 2f 00 04 bg r1,r15,800fe1c <IMFS_memfile_extend+0xa4> <== NEVER TAKEN
800fe10: 5c 2f 00 25 bne r1,r15,800fea4 <IMFS_memfile_extend+0x12c> <== NEVER TAKEN
800fe14: 55 b0 00 02 bgu r13,r16,800fe1c <IMFS_memfile_extend+0xa4>
800fe18: e0 00 00 23 bi 800fea4 <IMFS_memfile_extend+0x12c>
return 0;
/*
* Calculate the number of range of blocks to allocate
*/
new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK;
800fe1c: b9 60 10 00 mv r2,r11
800fe20: b9 a0 08 00 mv r1,r13
800fe24: f8 00 1c 81 calli 8017028 <__divsi3>
old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK;
800fe28: 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;
800fe2c: b8 20 88 00 mv r17,r1
old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK;
800fe30: b9 60 08 00 mv r1,r11
800fe34: f8 00 1c 23 calli 8016ec0 <__ashrsi3>
800fe38: b8 20 18 00 mv r3,r1
800fe3c: b9 60 20 00 mv r4,r11
800fe40: b9 e0 08 00 mv r1,r15
800fe44: ba 00 10 00 mv r2,r16
800fe48: f8 00 14 31 calli 8014f0c <__divdi3>
800fe4c: b8 40 78 00 mv r15,r2
/*
* Now allocate each of those blocks.
*/
for ( block=old_blocks ; block<=new_blocks ; block++ ) {
800fe50: b8 40 58 00 mv r11,r2
800fe54: e0 00 00 11 bi 800fe98 <IMFS_memfile_extend+0x120>
if ( IMFS_memfile_addblock( the_jnode, block ) ) {
800fe58: b9 80 08 00 mv r1,r12
800fe5c: b9 60 10 00 mv r2,r11
800fe60: fb ff ff 23 calli 800faec <IMFS_memfile_addblock>
800fe64: 44 20 00 0c be r1,r0,800fe94 <IMFS_memfile_extend+0x11c>
800fe68: e0 00 00 05 bi 800fe7c <IMFS_memfile_extend+0x104>
for ( ; block>=old_blocks ; block-- ) {
IMFS_memfile_remove_block( the_jnode, block );
800fe6c: b9 60 10 00 mv r2,r11
800fe70: b9 80 08 00 mv r1,r12
800fe74: fb ff ff b5 calli 800fd48 <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-- ) {
800fe78: 35 6b ff ff addi r11,r11,-1
800fe7c: 51 6f ff fc bgeu r11,r15,800fe6c <IMFS_memfile_extend+0xf4>
IMFS_memfile_remove_block( the_jnode, block );
}
rtems_set_errno_and_return_minus_one( ENOSPC );
800fe80: f8 00 05 7c calli 8011470 <__errno>
800fe84: 34 02 00 1c mvi r2,28
800fe88: 58 22 00 00 sw (r1+0),r2
800fe8c: 34 01 ff ff mvi r1,-1
800fe90: e0 00 00 06 bi 800fea8 <IMFS_memfile_extend+0x130>
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++ ) {
800fe94: 35 6b 00 01 addi r11,r11,1
800fe98: 52 2b ff f0 bgeu r17,r11,800fe58 <IMFS_memfile_extend+0xe0>
}
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
800fe9c: 59 8e 00 50 sw (r12+80),r14
800fea0: 59 8d 00 54 sw (r12+84),r13
/*
* Verify new file size is actually larger than current size
*/
if ( new_length <= the_jnode->info.file.size )
return 0;
800fea4: 34 01 00 00 mvi r1,0
/*
* Set the new length of the file.
*/
the_jnode->info.file.size = new_length;
return 0;
}
800fea8: 2b 9d 00 04 lw ra,(sp+4)
800feac: 2b 8b 00 20 lw r11,(sp+32)
800feb0: 2b 8c 00 1c lw r12,(sp+28)
800feb4: 2b 8d 00 18 lw r13,(sp+24)
800feb8: 2b 8e 00 14 lw r14,(sp+20)
800febc: 2b 8f 00 10 lw r15,(sp+16)
800fec0: 2b 90 00 0c lw r16,(sp+12)
800fec4: 2b 91 00 08 lw r17,(sp+8)
800fec8: 37 9c 00 20 addi sp,sp,32
800fecc: c3 a0 00 00 ret
0800f630 <IMFS_memfile_get_block_pointer>:
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
800f630: 37 9c ff e0 addi sp,sp,-32
800f634: 5b 8b 00 20 sw (sp+32),r11
800f638: 5b 8c 00 1c sw (sp+28),r12
800f63c: 5b 8d 00 18 sw (sp+24),r13
800f640: 5b 8e 00 14 sw (sp+20),r14
800f644: 5b 8f 00 10 sw (sp+16),r15
800f648: 5b 90 00 0c sw (sp+12),r16
800f64c: 5b 91 00 08 sw (sp+8),r17
800f650: 5b 9d 00 04 sw (sp+4),ra
800f654: b8 20 68 00 mv r13,r1
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
800f658: 78 01 08 01 mvhi r1,0x801
800f65c: 38 21 96 d8 ori r1,r1,0x96d8
800f660: 28 21 00 00 lw r1,(r1+0)
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
800f664: b8 40 70 00 mv r14,r2
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
800f668: 34 02 00 02 mvi r2,2
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
800f66c: b8 60 78 00 mv r15,r3
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
800f670: f8 00 1e 3b calli 8016f5c <__lshrsi3>
800f674: b8 20 60 00 mv r12,r1
800f678: 34 21 ff ff addi r1,r1,-1
800f67c: 55 c1 00 12 bgu r14,r1,800f6c4 <IMFS_memfile_get_block_pointer+0x94>
p = info->indirect;
800f680: 29 ac 00 58 lw r12,(r13+88)
if ( malloc_it ) {
800f684: 45 e0 00 0c be r15,r0,800f6b4 <IMFS_memfile_get_block_pointer+0x84>
if ( !p ) {
800f688: 5d 80 00 05 bne r12,r0,800f69c <IMFS_memfile_get_block_pointer+0x6c>
p = memfile_alloc_block();
800f68c: fb ff ff d9 calli 800f5f0 <memfile_alloc_block>
if ( !p )
return 0;
800f690: 34 0b 00 00 mvi r11,0
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
if ( !p )
800f694: 44 2c 00 81 be r1,r12,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
info->indirect = p;
800f698: 59 a1 00 58 sw (r13+88),r1
}
return &info->indirect[ my_block ];
800f69c: b9 c0 08 00 mv r1,r14
800f6a0: 34 02 00 02 mvi r2,2
800f6a4: f8 00 1d e0 calli 8016e24 <__ashlsi3>
800f6a8: 29 ab 00 58 lw r11,(r13+88)
800f6ac: b5 61 58 00 add r11,r11,r1
800f6b0: e0 00 00 7a bi 800f898 <IMFS_memfile_get_block_pointer+0x268>
}
if ( !p )
return 0;
800f6b4: 34 0b 00 00 mvi r11,0
return &info->indirect[ my_block ];
800f6b8: b9 c0 08 00 mv r1,r14
info->indirect = p;
}
return &info->indirect[ my_block ];
}
if ( !p )
800f6bc: 5d 8b 00 74 bne r12,r11,800f88c <IMFS_memfile_get_block_pointer+0x25c><== ALWAYS TAKEN
800f6c0: e0 00 00 76 bi 800f898 <IMFS_memfile_get_block_pointer+0x268><== NOT EXECUTED
/*
* Is the block number in the doubly indirect portion?
*/
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
800f6c4: 35 81 00 01 addi r1,r12,1
800f6c8: b9 80 10 00 mv r2,r12
800f6cc: f8 00 1e 4b calli 8016ff8 <__mulsi3>
800f6d0: b8 20 80 00 mv r16,r1
800f6d4: 34 21 ff ff addi r1,r1,-1
800f6d8: 55 c1 00 2b bgu r14,r1,800f784 <IMFS_memfile_get_block_pointer+0x154>
my_block -= FIRST_DOUBLY_INDIRECT;
800f6dc: c9 cc 70 00 sub r14,r14,r12
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
800f6e0: b9 80 10 00 mv r2,r12
800f6e4: b9 c0 08 00 mv r1,r14
800f6e8: f8 00 1e b9 calli 80171cc <__umodsi3>
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800f6ec: b9 80 10 00 mv r2,r12
*/
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
my_block -= FIRST_DOUBLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
800f6f0: b8 20 80 00 mv r16,r1
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800f6f4: b9 c0 08 00 mv r1,r14
800f6f8: f8 00 1e a5 calli 801718c <__udivsi3>
800f6fc: b8 20 70 00 mv r14,r1
p = info->doubly_indirect;
800f700: 29 ac 00 5c lw r12,(r13+92)
if ( malloc_it ) {
800f704: 45 e0 00 17 be r15,r0,800f760 <IMFS_memfile_get_block_pointer+0x130>
if ( !p ) {
800f708: 5d 80 00 06 bne r12,r0,800f720 <IMFS_memfile_get_block_pointer+0xf0>
p = memfile_alloc_block();
800f70c: fb ff ff b9 calli 800f5f0 <memfile_alloc_block>
800f710: b8 20 60 00 mv r12,r1
if ( !p )
return 0;
800f714: 34 0b 00 00 mvi r11,0
p = info->doubly_indirect;
if ( malloc_it ) {
if ( !p ) {
p = memfile_alloc_block();
if ( !p )
800f718: 44 20 00 60 be r1,r0,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
info->doubly_indirect = p;
800f71c: 59 a1 00 5c sw (r13+92),r1
}
p1 = (block_p *)p[ doubly ];
800f720: b9 c0 08 00 mv r1,r14
800f724: 34 02 00 02 mvi r2,2
800f728: f8 00 1d bf calli 8016e24 <__ashlsi3>
800f72c: b5 81 60 00 add r12,r12,r1
800f730: 29 8d 00 00 lw r13,(r12+0)
if ( !p1 ) {
800f734: 5d a0 00 06 bne r13,r0,800f74c <IMFS_memfile_get_block_pointer+0x11c>
p1 = memfile_alloc_block();
800f738: fb ff ff ae calli 800f5f0 <memfile_alloc_block>
800f73c: b8 20 68 00 mv r13,r1
if ( !p1 )
return 0;
800f740: 34 0b 00 00 mvi r11,0
}
p1 = (block_p *)p[ doubly ];
if ( !p1 ) {
p1 = memfile_alloc_block();
if ( !p1 )
800f744: 44 20 00 55 be r1,r0,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
p[ doubly ] = (block_p) p1;
800f748: 59 81 00 00 sw (r12+0),r1
}
return (block_p *)&p1[ singly ];
800f74c: ba 00 08 00 mv r1,r16
800f750: 34 02 00 02 mvi r2,2
800f754: f8 00 1d b4 calli 8016e24 <__ashlsi3>
800f758: b5 a1 58 00 add r11,r13,r1
800f75c: e0 00 00 4f bi 800f898 <IMFS_memfile_get_block_pointer+0x268>
}
if ( !p )
return 0;
800f760: 34 0b 00 00 mvi r11,0
}
return (block_p *)&p1[ singly ];
}
if ( !p )
800f764: 45 8b 00 4d be r12,r11,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
p = (block_p *)p[ doubly ];
800f768: 34 02 00 02 mvi r2,2
800f76c: f8 00 1d ae calli 8016e24 <__ashlsi3>
800f770: b5 81 08 00 add r1,r12,r1
800f774: 28 2c 00 00 lw r12,(r1+0)
if ( !p )
return 0;
return (block_p *)&p[ singly ];
800f778: ba 00 08 00 mv r1,r16
if ( !p )
return 0;
p = (block_p *)p[ doubly ];
if ( !p )
800f77c: 5d 80 00 44 bne r12,r0,800f88c <IMFS_memfile_get_block_pointer+0x25c><== ALWAYS TAKEN
800f780: e0 00 00 46 bi 800f898 <IMFS_memfile_get_block_pointer+0x268><== NOT EXECUTED
}
/*
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
800f784: 36 01 00 01 addi r1,r16,1
800f788: b9 80 10 00 mv r2,r12
800f78c: f8 00 1e 1b calli 8016ff8 <__mulsi3>
800f790: 34 21 ff ff addi r1,r1,-1
}
/*
* This means the requested block number is out of range.
*/
return 0;
800f794: 34 0b 00 00 mvi r11,0
}
/*
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
800f798: 55 c1 00 40 bgu r14,r1,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
my_block -= FIRST_TRIPLY_INDIRECT;
800f79c: c9 d0 70 00 sub r14,r14,r16
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
800f7a0: b9 80 10 00 mv r2,r12
800f7a4: b9 c0 08 00 mv r1,r14
800f7a8: f8 00 1e 89 calli 80171cc <__umodsi3>
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800f7ac: b9 80 10 00 mv r2,r12
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
my_block -= FIRST_TRIPLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
800f7b0: b8 20 88 00 mv r17,r1
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800f7b4: b9 c0 08 00 mv r1,r14
800f7b8: f8 00 1e 75 calli 801718c <__udivsi3>
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
800f7bc: b9 80 10 00 mv r2,r12
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
my_block -= FIRST_TRIPLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
800f7c0: b8 20 70 00 mv r14,r1
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
800f7c4: f8 00 1e 72 calli 801718c <__udivsi3>
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
800f7c8: b9 80 10 00 mv r2,r12
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
my_block -= FIRST_TRIPLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
800f7cc: b8 20 80 00 mv r16,r1
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
800f7d0: b9 c0 08 00 mv r1,r14
800f7d4: f8 00 1e 7e calli 80171cc <__umodsi3>
800f7d8: b8 20 70 00 mv r14,r1
p = info->triply_indirect;
800f7dc: 29 ac 00 60 lw r12,(r13+96)
if ( malloc_it ) {
800f7e0: 45 e0 00 1d be r15,r0,800f854 <IMFS_memfile_get_block_pointer+0x224>
if ( !p ) {
800f7e4: 5d 80 00 05 bne r12,r0,800f7f8 <IMFS_memfile_get_block_pointer+0x1c8>
p = memfile_alloc_block();
800f7e8: fb ff ff 82 calli 800f5f0 <memfile_alloc_block>
800f7ec: b8 20 60 00 mv r12,r1
if ( !p )
800f7f0: 44 20 00 2a be r1,r0,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
info->triply_indirect = p;
800f7f4: 59 a1 00 60 sw (r13+96),r1
}
p1 = (block_p *) p[ triply ];
800f7f8: ba 00 08 00 mv r1,r16
800f7fc: 34 02 00 02 mvi r2,2
800f800: f8 00 1d 89 calli 8016e24 <__ashlsi3>
800f804: b5 81 60 00 add r12,r12,r1
800f808: 29 8d 00 00 lw r13,(r12+0)
if ( !p1 ) {
800f80c: 5d a0 00 06 bne r13,r0,800f824 <IMFS_memfile_get_block_pointer+0x1f4>
p1 = memfile_alloc_block();
800f810: fb ff ff 78 calli 800f5f0 <memfile_alloc_block>
800f814: b8 20 68 00 mv r13,r1
if ( !p1 )
return 0;
800f818: 34 0b 00 00 mvi r11,0
}
p1 = (block_p *) p[ triply ];
if ( !p1 ) {
p1 = memfile_alloc_block();
if ( !p1 )
800f81c: 44 20 00 1f be r1,r0,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
p[ triply ] = (block_p) p1;
800f820: 59 81 00 00 sw (r12+0),r1
}
p2 = (block_p *)p1[ doubly ];
800f824: b9 c0 08 00 mv r1,r14
800f828: 34 02 00 02 mvi r2,2
800f82c: f8 00 1d 7e calli 8016e24 <__ashlsi3>
800f830: b5 a1 68 00 add r13,r13,r1
800f834: 29 ac 00 00 lw r12,(r13+0)
if ( !p2 ) {
800f838: 5d 80 00 14 bne r12,r0,800f888 <IMFS_memfile_get_block_pointer+0x258>
p2 = memfile_alloc_block();
800f83c: fb ff ff 6d calli 800f5f0 <memfile_alloc_block>
800f840: b8 20 60 00 mv r12,r1
if ( !p2 )
return 0;
800f844: 34 0b 00 00 mvi r11,0
}
p2 = (block_p *)p1[ doubly ];
if ( !p2 ) {
p2 = memfile_alloc_block();
if ( !p2 )
800f848: 44 20 00 14 be r1,r0,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
p1[ doubly ] = (block_p) p2;
800f84c: 59 a1 00 00 sw (r13+0),r1
800f850: e0 00 00 0e bi 800f888 <IMFS_memfile_get_block_pointer+0x258>
}
return (block_p *)&p2[ singly ];
}
if ( !p )
800f854: 45 8b 00 11 be r12,r11,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
p1 = (block_p *) p[ triply ];
800f858: ba 00 08 00 mv r1,r16
800f85c: 34 02 00 02 mvi r2,2
800f860: f8 00 1d 71 calli 8016e24 <__ashlsi3>
800f864: b5 81 08 00 add r1,r12,r1
800f868: 28 2c 00 00 lw r12,(r1+0)
if ( !p1 )
800f86c: 45 80 00 0b be r12,r0,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
p2 = (block_p *)p1[ doubly ];
800f870: b9 c0 08 00 mv r1,r14
800f874: 34 02 00 02 mvi r2,2
800f878: f8 00 1d 6b calli 8016e24 <__ashlsi3>
800f87c: b5 81 08 00 add r1,r12,r1
800f880: 28 2c 00 00 lw r12,(r1+0)
if ( !p2 )
800f884: 45 80 00 05 be r12,r0,800f898 <IMFS_memfile_get_block_pointer+0x268><== NEVER TAKEN
return 0;
return (block_p *)&p2[ singly ];
800f888: ba 20 08 00 mv r1,r17
800f88c: 34 02 00 02 mvi r2,2
800f890: f8 00 1d 65 calli 8016e24 <__ashlsi3>
800f894: b5 81 58 00 add r11,r12,r1
/*
* This means the requested block number is out of range.
*/
return 0;
}
800f898: b9 60 08 00 mv r1,r11
800f89c: 2b 9d 00 04 lw ra,(sp+4)
800f8a0: 2b 8b 00 20 lw r11,(sp+32)
800f8a4: 2b 8c 00 1c lw r12,(sp+28)
800f8a8: 2b 8d 00 18 lw r13,(sp+24)
800f8ac: 2b 8e 00 14 lw r14,(sp+20)
800f8b0: 2b 8f 00 10 lw r15,(sp+16)
800f8b4: 2b 90 00 0c lw r16,(sp+12)
800f8b8: 2b 91 00 08 lw r17,(sp+8)
800f8bc: 37 9c 00 20 addi sp,sp,32
800f8c0: c3 a0 00 00 ret
0800f8c4 <IMFS_memfile_read>:
IMFS_jnode_t *the_jnode,
off_t start,
unsigned char *destination,
unsigned int length
)
{
800f8c4: 37 9c ff d4 addi sp,sp,-44
800f8c8: 5b 8b 00 24 sw (sp+36),r11
800f8cc: 5b 8c 00 20 sw (sp+32),r12
800f8d0: 5b 8d 00 1c sw (sp+28),r13
800f8d4: 5b 8e 00 18 sw (sp+24),r14
800f8d8: 5b 8f 00 14 sw (sp+20),r15
800f8dc: 5b 90 00 10 sw (sp+16),r16
800f8e0: 5b 91 00 0c sw (sp+12),r17
800f8e4: 5b 92 00 08 sw (sp+8),r18
800f8e8: 5b 9d 00 04 sw (sp+4),ra
800f8ec: b8 40 70 00 mv r14,r2
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
800f8f0: 28 22 00 4c lw r2,(r1+76)
IMFS_jnode_t *the_jnode,
off_t start,
unsigned char *destination,
unsigned int length
)
{
800f8f4: b8 20 60 00 mv r12,r1
800f8f8: 28 2d 00 50 lw r13,(r1+80)
800f8fc: 28 2f 00 54 lw r15,(r1+84)
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
800f900: 34 01 00 06 mvi r1,6
IMFS_jnode_t *the_jnode,
off_t start,
unsigned char *destination,
unsigned int length
)
{
800f904: b8 60 80 00 mv r16,r3
800f908: b8 80 58 00 mv r11,r4
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
800f90c: 5c 41 00 15 bne r2,r1,800f960 <IMFS_memfile_read+0x9c>
unsigned char *file_ptr;
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
if (my_length > (the_jnode->info.linearfile.size - start))
800f910: 34 02 00 1f mvi r2,31
800f914: b9 c0 08 00 mv r1,r14
800f918: f8 00 1d 6a calli 8016ec0 <__ashrsi3>
800f91c: c9 ee 18 00 sub r3,r15,r14
800f920: f4 6f 10 00 cmpgu r2,r3,r15
800f924: c9 a1 08 00 sub r1,r13,r1
800f928: c8 22 68 00 sub r13,r1,r2
my_length = length;
if (the_jnode->type == IMFS_LINEAR_FILE) {
unsigned char *file_ptr;
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
800f92c: 29 91 00 58 lw r17,(r12+88)
if (my_length > (the_jnode->info.linearfile.size - start))
800f930: 48 0d 00 04 bg r0,r13,800f940 <IMFS_memfile_read+0x7c> <== NEVER TAKEN
800f934: 5c 0d 00 05 bne r0,r13,800f948 <IMFS_memfile_read+0x84> <== NEVER TAKEN
800f938: 55 63 00 02 bgu r11,r3,800f940 <IMFS_memfile_read+0x7c> <== ALWAYS TAKEN
800f93c: e0 00 00 03 bi 800f948 <IMFS_memfile_read+0x84> <== NOT EXECUTED
my_length = the_jnode->info.linearfile.size - start;
800f940: c9 ee 68 00 sub r13,r15,r14
800f944: e0 00 00 02 bi 800f94c <IMFS_memfile_read+0x88>
/*
* Linear files (as created from a tar file are easier to handle
* than block files).
*/
my_length = length;
800f948: b9 60 68 00 mv r13,r11 <== NOT EXECUTED
file_ptr = (unsigned char *)the_jnode->info.linearfile.direct;
if (my_length > (the_jnode->info.linearfile.size - start))
my_length = the_jnode->info.linearfile.size - start;
memcpy(dest, &file_ptr[start], my_length);
800f94c: ba 00 08 00 mv r1,r16
800f950: b6 2e 10 00 add r2,r17,r14
800f954: b9 a0 18 00 mv r3,r13
800f958: f8 00 09 7c calli 8011f48 <memcpy>
800f95c: e0 00 00 47 bi 800fa78 <IMFS_memfile_read+0x1b4>
/*
* 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;
800f960: b4 8e 08 00 add r1,r4,r14
if ( last_byte > the_jnode->info.file.size )
800f964: 48 0d 00 04 bg r0,r13,800f974 <IMFS_memfile_read+0xb0> <== NEVER TAKEN
800f968: 5d a0 00 04 bne r13,r0,800f978 <IMFS_memfile_read+0xb4> <== NEVER TAKEN
800f96c: 54 2f 00 02 bgu r1,r15,800f974 <IMFS_memfile_read+0xb0>
800f970: e0 00 00 02 bi 800f978 <IMFS_memfile_read+0xb4>
my_length = the_jnode->info.file.size - start;
800f974: c9 ee 58 00 sub r11,r15,r14
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
800f978: 78 01 08 01 mvhi r1,0x801
800f97c: 38 21 96 d8 ori r1,r1,0x96d8
800f980: 28 32 00 00 lw r18,(r1+0)
800f984: b9 c0 08 00 mv r1,r14
unsigned int last_byte;
unsigned int copied;
unsigned int start_offset;
unsigned char *dest;
dest = destination;
800f988: ba 00 78 00 mv r15,r16
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
800f98c: ba 40 10 00 mv r2,r18
800f990: f8 00 1d d6 calli 80170e8 <__modsi3>
800f994: b8 20 88 00 mv r17,r1
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
800f998: ba 40 10 00 mv r2,r18
800f99c: b9 c0 08 00 mv r1,r14
800f9a0: f8 00 1d a2 calli 8017028 <__divsi3>
800f9a4: b8 20 70 00 mv r14,r1
*/
last_byte = start + length;
if ( last_byte > the_jnode->info.file.size )
my_length = the_jnode->info.file.size - start;
copied = 0;
800f9a8: 34 0d 00 00 mvi r13,0
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
800f9ac: 46 20 00 12 be r17,r0,800f9f4 <IMFS_memfile_read+0x130>
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 );
800f9b0: b9 80 08 00 mv r1,r12
800f9b4: b9 c0 10 00 mv r2,r14
800f9b8: 34 03 00 00 mvi r3,0
800f9bc: fb ff ff 1d calli 800f630 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
800f9c0: 44 20 00 33 be r1,r0,800fa8c <IMFS_memfile_read+0x1c8> <== 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;
800f9c4: ca 51 90 00 sub r18,r18,r17
800f9c8: b9 60 68 00 mv r13,r11
800f9cc: 52 4b 00 02 bgeu r18,r11,800f9d4 <IMFS_memfile_read+0x110>
800f9d0: ba 40 68 00 mv r13,r18
if ( to_copy > my_length )
to_copy = my_length;
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
if ( !block_ptr )
return copied;
memcpy( dest, &(*block_ptr)[ start_offset ], to_copy );
800f9d4: 28 22 00 00 lw r2,(r1+0)
800f9d8: b9 a0 18 00 mv r3,r13
800f9dc: ba 00 08 00 mv r1,r16
800f9e0: b4 51 10 00 add r2,r2,r17
800f9e4: f8 00 09 59 calli 8011f48 <memcpy>
dest += to_copy;
800f9e8: b6 0d 78 00 add r15,r16,r13
block++;
800f9ec: 35 ce 00 01 addi r14,r14,1
my_length -= to_copy;
800f9f0: c9 6d 58 00 sub r11,r11,r13
}
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
800f9f4: 78 01 08 01 mvhi r1,0x801
800f9f8: 38 21 96 d8 ori r1,r1,0x96d8
800f9fc: 28 30 00 00 lw r16,(r1+0)
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800fa00: b8 20 88 00 mv r17,r1
800fa04: e0 00 00 0f bi 800fa40 <IMFS_memfile_read+0x17c>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
800fa08: b9 c0 10 00 mv r2,r14
800fa0c: b9 80 08 00 mv r1,r12
800fa10: 34 03 00 00 mvi r3,0
800fa14: fb ff ff 07 calli 800f630 <IMFS_memfile_get_block_pointer>
800fa18: b8 20 10 00 mv r2,r1
if ( !block_ptr )
800fa1c: 44 20 00 1c be r1,r0,800fa8c <IMFS_memfile_read+0x1c8> <== NEVER TAKEN
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], to_copy );
800fa20: 28 42 00 00 lw r2,(r2+0)
800fa24: b9 e0 08 00 mv r1,r15
800fa28: ba 00 18 00 mv r3,r16
800fa2c: f8 00 09 47 calli 8011f48 <memcpy>
dest += to_copy;
800fa30: b5 f0 78 00 add r15,r15,r16
block++;
800fa34: 35 ce 00 01 addi r14,r14,1
my_length -= to_copy;
800fa38: c9 70 58 00 sub r11,r11,r16
copied += to_copy;
800fa3c: b5 b0 68 00 add r13,r13,r16
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800fa40: 2a 21 00 00 lw r1,(r17+0)
800fa44: 51 61 ff f1 bgeu r11,r1,800fa08 <IMFS_memfile_read+0x144>
/*
* Phase 3: possibly the first part of one block
*/
IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK );
if ( my_length ) {
800fa48: 45 60 00 0c be r11,r0,800fa78 <IMFS_memfile_read+0x1b4>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
800fa4c: b9 c0 10 00 mv r2,r14
800fa50: b9 80 08 00 mv r1,r12
800fa54: 34 03 00 00 mvi r3,0
800fa58: fb ff fe f6 calli 800f630 <IMFS_memfile_get_block_pointer>
800fa5c: b8 20 10 00 mv r2,r1
if ( !block_ptr )
800fa60: 44 20 00 0b be r1,r0,800fa8c <IMFS_memfile_read+0x1c8> <== NEVER TAKEN
return copied;
memcpy( dest, &(*block_ptr)[ 0 ], my_length );
800fa64: 28 42 00 00 lw r2,(r2+0)
800fa68: b9 e0 08 00 mv r1,r15
800fa6c: b9 60 18 00 mv r3,r11
800fa70: f8 00 09 36 calli 8011f48 <memcpy>
copied += my_length;
800fa74: b5 6d 68 00 add r13,r11,r13
}
IMFS_update_atime( the_jnode );
800fa78: 37 81 00 28 addi r1,sp,40
800fa7c: 34 02 00 00 mvi r2,0
800fa80: fb ff cb 3e calli 8002778 <gettimeofday>
800fa84: 2b 81 00 28 lw r1,(sp+40)
800fa88: 59 81 00 40 sw (r12+64),r1
return copied;
}
800fa8c: b9 a0 08 00 mv r1,r13
800fa90: 2b 9d 00 04 lw ra,(sp+4)
800fa94: 2b 8b 00 24 lw r11,(sp+36)
800fa98: 2b 8c 00 20 lw r12,(sp+32)
800fa9c: 2b 8d 00 1c lw r13,(sp+28)
800faa0: 2b 8e 00 18 lw r14,(sp+24)
800faa4: 2b 8f 00 14 lw r15,(sp+20)
800faa8: 2b 90 00 10 lw r16,(sp+16)
800faac: 2b 91 00 0c lw r17,(sp+12)
800fab0: 2b 92 00 08 lw r18,(sp+8)
800fab4: 37 9c 00 2c addi sp,sp,44
800fab8: c3 a0 00 00 ret
0800fbdc <IMFS_memfile_remove>:
* is better to stick to simple, easy to understand algorithms.
*/
int IMFS_memfile_remove(
IMFS_jnode_t *the_jnode
)
{
800fbdc: 37 9c ff e0 addi sp,sp,-32
800fbe0: 5b 8b 00 20 sw (sp+32),r11
800fbe4: 5b 8c 00 1c sw (sp+28),r12
800fbe8: 5b 8d 00 18 sw (sp+24),r13
800fbec: 5b 8e 00 14 sw (sp+20),r14
800fbf0: 5b 8f 00 10 sw (sp+16),r15
800fbf4: 5b 90 00 0c sw (sp+12),r16
800fbf8: 5b 91 00 08 sw (sp+8),r17
800fbfc: 5b 9d 00 04 sw (sp+4),ra
800fc00: b8 20 58 00 mv r11,r1
/*
* Eventually this could be set smarter at each call to
* memfile_free_blocks_in_table to greatly speed this up.
*/
to_free = IMFS_MEMFILE_BLOCK_SLOTS;
800fc04: 78 01 08 01 mvhi r1,0x801
800fc08: 38 21 96 d8 ori r1,r1,0x96d8
800fc0c: 28 21 00 00 lw r1,(r1+0)
800fc10: 34 02 00 02 mvi r2,2
800fc14: f8 00 1c d2 calli 8016f5c <__lshrsi3>
800fc18: b8 20 60 00 mv r12,r1
* + doubly indirect
* + triply indirect
*/
info = &the_jnode->info.file;
if ( info->indirect ) {
800fc1c: 29 61 00 58 lw r1,(r11+88)
800fc20: 44 20 00 04 be r1,r0,800fc30 <IMFS_memfile_remove+0x54>
memfile_free_blocks_in_table( &info->indirect, to_free );
800fc24: 35 61 00 58 addi r1,r11,88
800fc28: b9 80 10 00 mv r2,r12
800fc2c: fb ff ff d0 calli 800fb6c <memfile_free_blocks_in_table>
}
if ( info->doubly_indirect ) {
800fc30: 29 61 00 5c lw r1,(r11+92)
800fc34: 44 20 00 15 be r1,r0,800fc88 <IMFS_memfile_remove+0xac>
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800fc38: 78 0d 08 01 mvhi r13,0x801
if ( info->indirect ) {
memfile_free_blocks_in_table( &info->indirect, to_free );
}
if ( info->doubly_indirect ) {
800fc3c: 34 0f 00 00 mvi r15,0
800fc40: 34 0e 00 00 mvi r14,0
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800fc44: 39 ad 96 d8 ori r13,r13,0x96d8
800fc48: e0 00 00 09 bi 800fc6c <IMFS_memfile_remove+0x90>
if ( info->doubly_indirect[i] ) {
800fc4c: 29 61 00 5c lw r1,(r11+92)
800fc50: b4 2f 08 00 add r1,r1,r15
800fc54: 28 22 00 00 lw r2,(r1+0)
800fc58: 44 40 00 03 be r2,r0,800fc64 <IMFS_memfile_remove+0x88> <== NEVER TAKEN
memfile_free_blocks_in_table(
800fc5c: b9 80 10 00 mv r2,r12
800fc60: fb ff ff c3 calli 800fb6c <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++ ) {
800fc64: 35 ce 00 01 addi r14,r14,1
800fc68: 35 ef 00 04 addi r15,r15,4
800fc6c: 29 a1 00 00 lw r1,(r13+0)
800fc70: 34 02 00 02 mvi r2,2
800fc74: f8 00 1c ba calli 8016f5c <__lshrsi3>
800fc78: 54 2e ff f5 bgu r1,r14,800fc4c <IMFS_memfile_remove+0x70>
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 );
800fc7c: 35 61 00 5c addi r1,r11,92
800fc80: b9 80 10 00 mv r2,r12
800fc84: fb ff ff ba calli 800fb6c <memfile_free_blocks_in_table>
}
if ( info->triply_indirect ) {
800fc88: 29 61 00 60 lw r1,(r11+96)
800fc8c: 44 20 00 24 be r1,r0,800fd1c <IMFS_memfile_remove+0x140>
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800fc90: 78 0e 08 01 mvhi r14,0x801
}
memfile_free_blocks_in_table( &info->doubly_indirect, to_free );
}
if ( info->triply_indirect ) {
800fc94: 34 0f 00 00 mvi r15,0
800fc98: 34 10 00 00 mvi r16,0
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800fc9c: 39 ce 96 d8 ori r14,r14,0x96d8
800fca0: e0 00 00 18 bi 800fd00 <IMFS_memfile_remove+0x124>
p = (block_p *) info->triply_indirect[i];
800fca4: 29 61 00 60 lw r1,(r11+96)
800fca8: b4 2f 08 00 add r1,r1,r15
800fcac: 28 2d 00 00 lw r13,(r1+0)
if ( !p ) /* ensure we have a valid pointer */
800fcb0: 45 a0 00 18 be r13,r0,800fd10 <IMFS_memfile_remove+0x134> <== NEVER TAKEN
800fcb4: 34 11 00 00 mvi r17,0
800fcb8: e0 00 00 08 bi 800fcd8 <IMFS_memfile_remove+0xfc>
break;
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
if ( p[j] ) {
800fcbc: 29 a1 00 00 lw r1,(r13+0)
800fcc0: 44 20 00 04 be r1,r0,800fcd0 <IMFS_memfile_remove+0xf4> <== NEVER TAKEN
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
800fcc4: b9 a0 08 00 mv r1,r13
800fcc8: b9 80 10 00 mv r2,r12
800fccc: fb ff ff a8 calli 800fb6c <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++ ) {
800fcd0: 36 31 00 01 addi r17,r17,1
800fcd4: 35 ad 00 04 addi r13,r13,4
800fcd8: 29 c1 00 00 lw r1,(r14+0)
800fcdc: 34 02 00 02 mvi r2,2
800fce0: f8 00 1c 9f calli 8016f5c <__lshrsi3>
800fce4: 54 31 ff f6 bgu r1,r17,800fcbc <IMFS_memfile_remove+0xe0>
if ( p[j] ) {
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
}
}
memfile_free_blocks_in_table(
800fce8: 29 61 00 60 lw r1,(r11+96)
800fcec: b9 80 10 00 mv r2,r12
memfile_free_blocks_in_table( &info->doubly_indirect, to_free );
}
if ( info->triply_indirect ) {
for ( i=0 ; i<IMFS_MEMFILE_BLOCK_SLOTS ; i++ ) {
800fcf0: 36 10 00 01 addi r16,r16,1
for ( j=0 ; j<IMFS_MEMFILE_BLOCK_SLOTS ; j++ ) {
if ( p[j] ) {
memfile_free_blocks_in_table( (block_p **)&p[j], to_free);
}
}
memfile_free_blocks_in_table(
800fcf4: b4 2f 08 00 add r1,r1,r15
800fcf8: fb ff ff 9d calli 800fb6c <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++ ) {
800fcfc: 35 ef 00 04 addi r15,r15,4
800fd00: 29 c1 00 00 lw r1,(r14+0)
800fd04: 34 02 00 02 mvi r2,2
800fd08: f8 00 1c 95 calli 8016f5c <__lshrsi3>
800fd0c: 54 30 ff e6 bgu r1,r16,800fca4 <IMFS_memfile_remove+0xc8>
}
}
memfile_free_blocks_in_table(
(block_p **)&info->triply_indirect[i], to_free );
}
memfile_free_blocks_in_table(
800fd10: 35 61 00 60 addi r1,r11,96
800fd14: b9 80 10 00 mv r2,r12
800fd18: fb ff ff 95 calli 800fb6c <memfile_free_blocks_in_table>
(block_p **)&info->triply_indirect, to_free );
}
return 0;
}
800fd1c: 34 01 00 00 mvi r1,0
800fd20: 2b 9d 00 04 lw ra,(sp+4)
800fd24: 2b 8b 00 20 lw r11,(sp+32)
800fd28: 2b 8c 00 1c lw r12,(sp+28)
800fd2c: 2b 8d 00 18 lw r13,(sp+24)
800fd30: 2b 8e 00 14 lw r14,(sp+20)
800fd34: 2b 8f 00 10 lw r15,(sp+16)
800fd38: 2b 90 00 0c lw r16,(sp+12)
800fd3c: 2b 91 00 08 lw r17,(sp+8)
800fd40: 37 9c 00 20 addi sp,sp,32
800fd44: c3 a0 00 00 ret
0800fed0 <IMFS_memfile_write>:
IMFS_jnode_t *the_jnode,
off_t start,
const unsigned char *source,
unsigned int length
)
{
800fed0: 37 9c ff d0 addi sp,sp,-48
800fed4: 5b 8b 00 28 sw (sp+40),r11
800fed8: 5b 8c 00 24 sw (sp+36),r12
800fedc: 5b 8d 00 20 sw (sp+32),r13
800fee0: 5b 8e 00 1c sw (sp+28),r14
800fee4: 5b 8f 00 18 sw (sp+24),r15
800fee8: 5b 90 00 14 sw (sp+20),r16
800feec: 5b 91 00 10 sw (sp+16),r17
800fef0: 5b 92 00 0c sw (sp+12),r18
800fef4: 5b 93 00 08 sw (sp+8),r19
800fef8: 5b 9d 00 04 sw (sp+4),ra
800fefc: b8 20 58 00 mv r11,r1
* If the last byte we are supposed to write is past the end of this
* in memory file, then extend the length.
*/
last_byte = start + my_length;
if ( last_byte > the_jnode->info.file.size ) {
800ff00: 28 21 00 50 lw r1,(r1+80)
IMFS_jnode_t *the_jnode,
off_t start,
const unsigned char *source,
unsigned int length
)
{
800ff04: b8 40 60 00 mv r12,r2
800ff08: b8 60 88 00 mv r17,r3
800ff0c: b8 80 80 00 mv r16,r4
/*
* If the last byte we are supposed to write is past the end of this
* in memory file, then extend the length.
*/
last_byte = start + my_length;
800ff10: b4 82 10 00 add r2,r4,r2
if ( last_byte > the_jnode->info.file.size ) {
800ff14: 48 01 00 05 bg r0,r1,800ff28 <IMFS_memfile_write+0x58> <== NEVER TAKEN
800ff18: 5c 20 00 0c bne r1,r0,800ff48 <IMFS_memfile_write+0x78> <== NEVER TAKEN
800ff1c: 29 61 00 54 lw r1,(r11+84)
800ff20: 54 41 00 02 bgu r2,r1,800ff28 <IMFS_memfile_write+0x58> <== ALWAYS TAKEN
800ff24: e0 00 00 09 bi 800ff48 <IMFS_memfile_write+0x78> <== NOT EXECUTED
status = IMFS_memfile_extend( the_jnode, last_byte );
800ff28: b9 60 08 00 mv r1,r11
800ff2c: fb ff ff 93 calli 800fd78 <IMFS_memfile_extend>
if ( status )
800ff30: 44 20 00 06 be r1,r0,800ff48 <IMFS_memfile_write+0x78>
rtems_set_errno_and_return_minus_one( ENOSPC );
800ff34: f8 00 05 4f calli 8011470 <__errno>
800ff38: 34 02 00 1c mvi r2,28
800ff3c: 58 22 00 00 sw (r1+0),r2
800ff40: 34 0c ff ff mvi r12,-1
800ff44: e0 00 00 45 bi 8010058 <IMFS_memfile_write+0x188>
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
800ff48: 78 01 08 01 mvhi r1,0x801
800ff4c: 38 21 96 d8 ori r1,r1,0x96d8
800ff50: 28 33 00 00 lw r19,(r1+0)
800ff54: b9 80 08 00 mv r1,r12
unsigned int last_byte;
unsigned int start_offset;
int copied;
const unsigned char *src;
src = source;
800ff58: ba 20 78 00 mv r15,r17
*/
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
800ff5c: ba 60 10 00 mv r2,r19
800ff60: f8 00 1c 62 calli 80170e8 <__modsi3>
800ff64: b8 20 90 00 mv r18,r1
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
800ff68: ba 60 10 00 mv r2,r19
800ff6c: b9 80 08 00 mv r1,r12
800ff70: f8 00 1c 2e calli 8017028 <__divsi3>
800ff74: b8 20 70 00 mv r14,r1
if ( start_offset ) {
800ff78: ba 00 68 00 mv r13,r16
status = IMFS_memfile_extend( the_jnode, last_byte );
if ( status )
rtems_set_errno_and_return_minus_one( ENOSPC );
}
copied = 0;
800ff7c: 34 0c 00 00 mvi r12,0
/*
* Phase 1: possibly the last part of one block
*/
start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK;
block = start / IMFS_MEMFILE_BYTES_PER_BLOCK;
if ( start_offset ) {
800ff80: 46 40 00 11 be r18,r0,800ffc4 <IMFS_memfile_write+0xf4>
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 );
800ff84: b9 60 08 00 mv r1,r11
800ff88: b9 c0 10 00 mv r2,r14
800ff8c: 34 03 00 00 mvi r3,0
800ff90: fb ff fd a8 calli 800f630 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
800ff94: 44 20 00 31 be r1,r0,8010058 <IMFS_memfile_write+0x188> <== 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;
800ff98: ca 72 60 00 sub r12,r19,r18
800ff9c: 52 0c 00 02 bgeu r16,r12,800ffa4 <IMFS_memfile_write+0xd4>
800ffa0: ba 00 60 00 mv r12,r16
block,
to_copy,
src
);
#endif
memcpy( &(*block_ptr)[ start_offset ], src, to_copy );
800ffa4: 28 21 00 00 lw r1,(r1+0)
800ffa8: ba 20 10 00 mv r2,r17
800ffac: b9 80 18 00 mv r3,r12
800ffb0: b4 32 08 00 add r1,r1,r18
800ffb4: f8 00 07 e5 calli 8011f48 <memcpy>
src += to_copy;
800ffb8: b6 2c 78 00 add r15,r17,r12
block++;
800ffbc: 35 ce 00 01 addi r14,r14,1
my_length -= to_copy;
800ffc0: ca 0c 68 00 sub r13,r16,r12
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
800ffc4: 78 01 08 01 mvhi r1,0x801
800ffc8: 38 21 96 d8 ori r1,r1,0x96d8
800ffcc: 28 30 00 00 lw r16,(r1+0)
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
800ffd0: b8 20 88 00 mv r17,r1
800ffd4: e0 00 00 0e bi 801000c <IMFS_memfile_write+0x13c>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
800ffd8: b9 60 08 00 mv r1,r11
800ffdc: b9 c0 10 00 mv r2,r14
800ffe0: 34 03 00 00 mvi r3,0
800ffe4: fb ff fd 93 calli 800f630 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
800ffe8: 44 20 00 1c be r1,r0,8010058 <IMFS_memfile_write+0x188> <== 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 );
800ffec: 28 21 00 00 lw r1,(r1+0)
800fff0: b9 e0 10 00 mv r2,r15
800fff4: ba 00 18 00 mv r3,r16
800fff8: f8 00 07 d4 calli 8011f48 <memcpy>
src += to_copy;
800fffc: b5 f0 78 00 add r15,r15,r16
block++;
8010000: 35 ce 00 01 addi r14,r14,1
my_length -= to_copy;
8010004: c9 b0 68 00 sub r13,r13,r16
* IMFS_memfile_write
*
* This routine writes the specified data buffer into the in memory
* file pointed to by the_jnode. The file is extended as needed.
*/
MEMFILE_STATIC ssize_t IMFS_memfile_write(
8010008: b5 90 60 00 add r12,r12,r16
/*
* Phase 2: all of zero of more blocks
*/
to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK;
while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) {
801000c: 2a 21 00 00 lw r1,(r17+0)
8010010: 51 a1 ff f2 bgeu r13,r1,800ffd8 <IMFS_memfile_write+0x108>
* 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 ) {
8010014: 45 a0 00 0b be r13,r0,8010040 <IMFS_memfile_write+0x170>
block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 );
8010018: b9 60 08 00 mv r1,r11
801001c: b9 c0 10 00 mv r2,r14
8010020: 34 03 00 00 mvi r3,0
8010024: fb ff fd 83 calli 800f630 <IMFS_memfile_get_block_pointer>
if ( !block_ptr )
8010028: 44 20 00 0c be r1,r0,8010058 <IMFS_memfile_write+0x188> <== 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 );
801002c: 28 21 00 00 lw r1,(r1+0)
8010030: b9 e0 10 00 mv r2,r15
8010034: b9 a0 18 00 mv r3,r13
8010038: f8 00 07 c4 calli 8011f48 <memcpy>
my_length = 0;
copied += to_copy;
801003c: b5 8d 60 00 add r12,r12,r13
}
IMFS_mtime_ctime_update( the_jnode );
8010040: 37 81 00 2c addi r1,sp,44
8010044: 34 02 00 00 mvi r2,0
8010048: fb ff c9 cc calli 8002778 <gettimeofday>
801004c: 2b 81 00 2c lw r1,(sp+44)
8010050: 59 61 00 44 sw (r11+68),r1
8010054: 59 61 00 48 sw (r11+72),r1
return copied;
}
8010058: b9 80 08 00 mv r1,r12
801005c: 2b 9d 00 04 lw ra,(sp+4)
8010060: 2b 8b 00 28 lw r11,(sp+40)
8010064: 2b 8c 00 24 lw r12,(sp+36)
8010068: 2b 8d 00 20 lw r13,(sp+32)
801006c: 2b 8e 00 1c lw r14,(sp+28)
8010070: 2b 8f 00 18 lw r15,(sp+24)
8010074: 2b 90 00 14 lw r16,(sp+20)
8010078: 2b 91 00 10 lw r17,(sp+16)
801007c: 2b 92 00 0c lw r18,(sp+12)
8010080: 2b 93 00 08 lw r19,(sp+8)
8010084: 37 9c 00 30 addi sp,sp,48
8010088: c3 a0 00 00 ret
08001f04 <IMFS_mount>:
#include <rtems/seterr.h>
int IMFS_mount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
8001f04: 37 9c ff fc addi sp,sp,-4
8001f08: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *node;
node = mt_entry->mt_point_node.node_access;
8001f0c: 28 22 00 08 lw r2,(r1+8)
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
8001f10: 34 03 00 01 mvi r3,1
8001f14: 28 44 00 4c lw r4,(r2+76)
8001f18: 44 83 00 06 be r4,r3,8001f30 <IMFS_mount+0x2c> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ENOTDIR );
8001f1c: f8 00 3d 55 calli 8011470 <__errno> <== NOT EXECUTED
8001f20: 34 02 00 14 mvi r2,20 <== NOT EXECUTED
8001f24: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
8001f28: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8001f2c: e0 00 00 03 bi 8001f38 <IMFS_mount+0x34> <== NOT EXECUTED
/*
* Set mt_fs pointer to point to the mount table entry for
* the mounted file system.
*/
node->info.directory.mt_fs = mt_entry;
8001f30: 58 41 00 5c sw (r2+92),r1
return 0;
8001f34: 34 01 00 00 mvi r1,0
}
8001f38: 2b 9d 00 04 lw ra,(sp+4)
8001f3c: 37 9c 00 04 addi sp,sp,4
8001f40: c3 a0 00 00 ret
08003860 <IMFS_print_jnode>:
* This routine prints the contents of the specified jnode.
*/
void IMFS_print_jnode(
IMFS_jnode_t *the_jnode
)
{
8003860: 37 9c ff f0 addi sp,sp,-16
8003864: 5b 8b 00 10 sw (sp+16),r11
8003868: 5b 8c 00 0c sw (sp+12),r12
800386c: 5b 8d 00 08 sw (sp+8),r13
8003870: 5b 9d 00 04 sw (sp+4),ra
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
8003874: 78 0c 08 02 mvhi r12,0x802
8003878: 39 8c 71 c0 ori r12,r12,0x71c0
800387c: 29 82 00 00 lw r2,(r12+0)
* This routine prints the contents of the specified jnode.
*/
void IMFS_print_jnode(
IMFS_jnode_t *the_jnode
)
{
8003880: b8 20 58 00 mv r11,r1
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
8003884: 34 21 00 0c addi r1,r1,12
8003888: 28 42 00 08 lw r2,(r2+8)
800388c: f8 00 38 11 calli 80118d0 <fputs>
switch( the_jnode->type ) {
8003890: 29 63 00 4c lw r3,(r11+76)
8003894: 34 02 00 06 mvi r2,6
8003898: 34 61 ff ff addi r1,r3,-1
800389c: 54 22 00 2d bgu r1,r2,8003950 <IMFS_print_jnode+0xf0> <== NEVER TAKEN
80038a0: 78 0d 08 02 mvhi r13,0x802
80038a4: 34 02 00 02 mvi r2,2
80038a8: f8 00 7d b0 calli 8022f68 <__ashlsi3>
80038ac: 39 ad 4e 8c ori r13,r13,0x4e8c
80038b0: b5 a1 08 00 add r1,r13,r1
80038b4: 28 21 00 00 lw r1,(r1+0)
80038b8: c0 20 00 00 b r1
case IMFS_DIRECTORY:
fprintf(stdout, "/" );
80038bc: 29 82 00 00 lw r2,(r12+0)
80038c0: 34 01 00 2f mvi r1,47
80038c4: 28 42 00 08 lw r2,(r2+8)
80038c8: f8 00 37 be calli 80117c0 <fputc>
break;
80038cc: e0 00 00 27 bi 8003968 <IMFS_print_jnode+0x108>
case IMFS_DEVICE:
fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")",
80038d0: 29 81 00 00 lw r1,(r12+0)
80038d4: 78 02 08 02 mvhi r2,0x802
80038d8: 38 42 4d a8 ori r2,r2,0x4da8
80038dc: 28 21 00 08 lw r1,(r1+8)
80038e0: 29 63 00 50 lw r3,(r11+80)
80038e4: 29 64 00 54 lw r4,(r11+84)
80038e8: e0 00 00 07 bi 8003904 <IMFS_print_jnode+0xa4>
the_jnode->info.device.major, the_jnode->info.device.minor );
break;
case IMFS_LINEAR_FILE:
fprintf(stdout, " (file %" PRId32 " %p)",
80038ec: 29 81 00 00 lw r1,(r12+0)
80038f0: 29 63 00 54 lw r3,(r11+84)
80038f4: 29 64 00 58 lw r4,(r11+88)
80038f8: 28 21 00 08 lw r1,(r1+8)
80038fc: 78 02 08 02 mvhi r2,0x802
8003900: 38 42 4d bc ori r2,r2,0x4dbc
8003904: f8 00 37 88 calli 8011724 <fprintf>
(uint32_t)the_jnode->info.linearfile.size,
the_jnode->info.linearfile.direct
);
break;
8003908: e0 00 00 18 bi 8003968 <IMFS_print_jnode+0x108>
the_jnode->info.file.indirect,
the_jnode->info.file.doubly_indirect,
the_jnode->info.file.triply_indirect
);
#else
fprintf(stdout, " (file %" PRId32 ")",
800390c: 29 81 00 00 lw r1,(r12+0)
8003910: 29 63 00 54 lw r3,(r11+84)
8003914: 78 02 08 02 mvhi r2,0x802
8003918: 28 21 00 08 lw r1,(r1+8)
800391c: 38 42 4d cc ori r2,r2,0x4dcc
8003920: f8 00 37 81 calli 8011724 <fprintf>
(uint32_t)the_jnode->info.file.size );
#endif
break;
8003924: e0 00 00 11 bi 8003968 <IMFS_print_jnode+0x108>
case IMFS_HARD_LINK:
fprintf(stdout, " links not printed\n" );
return;
case IMFS_SYM_LINK:
fprintf(stdout, " links not printed\n" );
8003928: 78 01 08 02 mvhi r1,0x802
800392c: 29 82 00 00 lw r2,(r12+0)
8003930: 38 21 4d d8 ori r1,r1,0x4dd8
8003934: e0 00 00 04 bi 8003944 <IMFS_print_jnode+0xe4>
return;
case IMFS_FIFO:
fprintf(stdout, " FIFO not printed\n" );
8003938: 29 82 00 00 lw r2,(r12+0)
800393c: 78 01 08 02 mvhi r1,0x802
8003940: 38 21 4d ec ori r1,r1,0x4dec
8003944: 28 42 00 08 lw r2,(r2+8)
8003948: f8 00 37 e2 calli 80118d0 <fputs>
return;
800394c: e0 00 00 0a bi 8003974 <IMFS_print_jnode+0x114>
default:
fprintf(stdout, " bad type %d\n", the_jnode->type );
8003950: 29 81 00 00 lw r1,(r12+0)
8003954: 78 02 08 02 mvhi r2,0x802 <== NOT EXECUTED
8003958: 38 42 4e 00 ori r2,r2,0x4e00 <== NOT EXECUTED
800395c: 28 21 00 08 lw r1,(r1+8) <== NOT EXECUTED
8003960: f8 00 37 71 calli 8011724 <fprintf> <== NOT EXECUTED
return;
8003964: e0 00 00 04 bi 8003974 <IMFS_print_jnode+0x114> <== NOT EXECUTED
}
puts("");
8003968: 78 01 08 02 mvhi r1,0x802
800396c: 38 21 49 70 ori r1,r1,0x4970
8003970: f8 00 3f 4f calli 80136ac <puts>
}
8003974: 2b 9d 00 04 lw ra,(sp+4)
8003978: 2b 8b 00 10 lw r11,(sp+16)
800397c: 2b 8c 00 0c lw r12,(sp+12)
8003980: 2b 8d 00 08 lw r13,(sp+8)
8003984: 37 9c 00 10 addi sp,sp,16
8003988: c3 a0 00 00 ret
08001f80 <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 */
)
{
8001f80: 37 9c ff ec addi sp,sp,-20
8001f84: 5b 8b 00 0c sw (sp+12),r11
8001f88: 5b 8c 00 08 sw (sp+8),r12
8001f8c: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *the_jnode;
IMFS_jnode_t *new_parent;
the_jnode = old_loc->node_access;
8001f90: 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 */
)
{
8001f94: 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 );
8001f98: b8 80 10 00 mv r2,r4
8001f9c: 35 61 00 0c addi r1,r11,12
8001fa0: 34 03 00 20 mvi r3,32
8001fa4: f8 00 41 c3 calli 80126b0 <strncpy>
if ( the_jnode->Parent != NULL )
8001fa8: 29 61 00 08 lw r1,(r11+8)
8001fac: 44 20 00 03 be r1,r0,8001fb8 <IMFS_rename+0x38> <== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8001fb0: b9 60 08 00 mv r1,r11
8001fb4: f8 00 0a e9 calli 8004b58 <_Chain_Extract>
rtems_chain_extract( (rtems_chain_node *) the_jnode );
new_parent = new_parent_loc->node_access;
8001fb8: 29 81 00 00 lw r1,(r12+0)
RTEMS_INLINE_ROUTINE void rtems_chain_append(
rtems_chain_control *the_chain,
rtems_chain_node *the_node
)
{
_Chain_Append( the_chain, the_node );
8001fbc: b9 60 10 00 mv r2,r11
the_jnode->Parent = new_parent;
8001fc0: 59 61 00 08 sw (r11+8),r1
8001fc4: 34 21 00 50 addi r1,r1,80
8001fc8: f8 00 0a d8 calli 8004b28 <_Chain_Append>
rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node );
/*
* Update the time.
*/
IMFS_update_ctime( the_jnode );
8001fcc: 37 81 00 10 addi r1,sp,16
8001fd0: 34 02 00 00 mvi r2,0
8001fd4: f8 00 01 e9 calli 8002778 <gettimeofday>
8001fd8: 2b 81 00 10 lw r1,(sp+16)
8001fdc: 59 61 00 48 sw (r11+72),r1
return 0;
}
8001fe0: 34 01 00 00 mvi r1,0
8001fe4: 2b 9d 00 04 lw ra,(sp+4)
8001fe8: 2b 8b 00 0c lw r11,(sp+12)
8001fec: 2b 8c 00 08 lw r12,(sp+8)
8001ff0: 37 9c 00 14 addi sp,sp,20
8001ff4: c3 a0 00 00 ret
0800c2d8 <IMFS_stat>:
int IMFS_stat(
rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
800c2d8: 37 9c ff ec addi sp,sp,-20
800c2dc: 5b 8b 00 14 sw (sp+20),r11
800c2e0: 5b 8c 00 10 sw (sp+16),r12
800c2e4: 5b 8d 00 0c sw (sp+12),r13
800c2e8: 5b 8e 00 08 sw (sp+8),r14
800c2ec: 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;
800c2f0: 28 2b 00 00 lw r11,(r1+0)
int IMFS_stat(
rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
800c2f4: b8 20 70 00 mv r14,r1
800c2f8: b8 40 60 00 mv r12,r2
IMFS_device_t *io;
the_jnode = loc->node_access;
switch ( the_jnode->type ) {
800c2fc: 29 61 00 4c lw r1,(r11+76)
800c300: 34 02 00 05 mvi r2,5
800c304: 34 21 ff fe addi r1,r1,-2
800c308: 54 22 00 12 bgu r1,r2,800c350 <IMFS_stat+0x78> <== NEVER TAKEN
800c30c: 78 0d 08 01 mvhi r13,0x801
800c310: 34 02 00 02 mvi r2,2
800c314: f8 00 2a c4 calli 8016e24 <__ashlsi3>
800c318: 39 ad 83 60 ori r13,r13,0x8360
800c31c: b5 a1 08 00 add r1,r13,r1
800c320: 28 21 00 00 lw r1,(r1+0)
800c324: c0 20 00 00 b r1
case IMFS_DEVICE:
io = &the_jnode->info.device;
buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor );
800c328: 29 61 00 54 lw r1,(r11+84)
rtems_device_minor_number _minor
)
{
union __rtems_dev_t temp;
temp.__overlay.major = _major;
800c32c: 29 62 00 50 lw r2,(r11+80)
800c330: 59 81 00 1c sw (r12+28),r1
800c334: 59 82 00 18 sw (r12+24),r2
break;
800c338: e0 00 00 0b bi 800c364 <IMFS_stat+0x8c>
case IMFS_LINEAR_FILE:
case IMFS_MEMORY_FILE:
buf->st_size = the_jnode->info.file.size;
800c33c: 29 61 00 54 lw r1,(r11+84)
800c340: 59 81 00 20 sw (r12+32),r1
break;
800c344: e0 00 00 08 bi 800c364 <IMFS_stat+0x8c>
case IMFS_SYM_LINK:
buf->st_size = 0;
break;
case IMFS_FIFO:
buf->st_size = 0;
800c348: 59 80 00 20 sw (r12+32),r0
break;
800c34c: e0 00 00 06 bi 800c364 <IMFS_stat+0x8c>
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
800c350: f8 00 14 48 calli 8011470 <__errno>
800c354: 34 02 00 86 mvi r2,134
800c358: 58 22 00 00 sw (r1+0),r2
800c35c: 34 01 ff ff mvi r1,-1
800c360: e0 00 00 18 bi 800c3c0 <IMFS_stat+0xe8>
/*
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
800c364: 29 c1 00 10 lw r1,(r14+16)
buf->st_dev =
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
800c368: 28 21 00 34 lw r1,(r1+52)
800c36c: 28 22 00 00 lw r2,(r1+0)
800c370: 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 =
800c374: 59 81 00 00 sw (r12+0),r1
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
buf->st_mode = the_jnode->st_mode;
800c378: 29 61 00 30 lw r1,(r11+48)
/*
* The device number of the IMFS is the major number and the minor is the
* instance.
*/
fs_info = loc->mt_entry->fs_info;
buf->st_dev =
800c37c: 59 82 00 04 sw (r12+4),r2
rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance );
buf->st_mode = the_jnode->st_mode;
800c380: 59 81 00 0c sw (r12+12),r1
buf->st_nlink = the_jnode->st_nlink;
800c384: 2d 61 00 34 lhu r1,(r11+52)
800c388: 0d 81 00 10 sh (r12+16),r1
buf->st_ino = the_jnode->st_ino;
800c38c: 29 61 00 38 lw r1,(r11+56)
800c390: 59 81 00 08 sw (r12+8),r1
buf->st_uid = the_jnode->st_uid;
800c394: 2d 61 00 3c lhu r1,(r11+60)
800c398: 0d 81 00 12 sh (r12+18),r1
buf->st_gid = the_jnode->st_gid;
800c39c: 2d 61 00 3e lhu r1,(r11+62)
800c3a0: 0d 81 00 14 sh (r12+20),r1
buf->st_atime = the_jnode->stat_atime;
800c3a4: 29 61 00 40 lw r1,(r11+64)
800c3a8: 59 81 00 24 sw (r12+36),r1
buf->st_mtime = the_jnode->stat_mtime;
800c3ac: 29 61 00 44 lw r1,(r11+68)
800c3b0: 59 81 00 2c sw (r12+44),r1
buf->st_ctime = the_jnode->stat_ctime;
800c3b4: 29 61 00 48 lw r1,(r11+72)
800c3b8: 59 81 00 34 sw (r12+52),r1
return 0;
800c3bc: 34 01 00 00 mvi r1,0
}
800c3c0: 2b 9d 00 04 lw ra,(sp+4)
800c3c4: 2b 8b 00 14 lw r11,(sp+20)
800c3c8: 2b 8c 00 10 lw r12,(sp+16)
800c3cc: 2b 8d 00 0c lw r13,(sp+12)
800c3d0: 2b 8e 00 08 lw r14,(sp+8)
800c3d4: 37 9c 00 14 addi sp,sp,20
800c3d8: c3 a0 00 00 ret
080020a4 <IMFS_unlink>:
int IMFS_unlink(
rtems_filesystem_location_info_t *parentloc, /* IN */
rtems_filesystem_location_info_t *loc /* IN */
)
{
80020a4: 37 9c ff d0 addi sp,sp,-48
80020a8: 5b 8b 00 14 sw (sp+20),r11
80020ac: 5b 8c 00 10 sw (sp+16),r12
80020b0: 5b 8d 00 0c sw (sp+12),r13
80020b4: 5b 8e 00 08 sw (sp+8),r14
80020b8: 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;
80020bc: 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 */
)
{
80020c0: b8 40 58 00 mv r11,r2
80020c4: 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 ) {
80020c8: 29 82 00 4c lw r2,(r12+76)
80020cc: 34 01 00 03 mvi r1,3
80020d0: 5c 41 00 28 bne r2,r1,8002170 <IMFS_unlink+0xcc>
if ( !node->info.hard_link.link_node )
80020d4: 29 81 00 50 lw r1,(r12+80)
80020d8: 5c 20 00 06 bne r1,r0,80020f0 <IMFS_unlink+0x4c> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
80020dc: f8 00 3c e5 calli 8011470 <__errno> <== NOT EXECUTED
80020e0: 34 02 00 16 mvi r2,22 <== NOT EXECUTED
80020e4: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
80020e8: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
80020ec: e0 00 00 27 bi 8002188 <IMFS_unlink+0xe4> <== NOT EXECUTED
the_link = *loc;
80020f0: 29 64 00 08 lw r4,(r11+8)
80020f4: 29 63 00 0c lw r3,(r11+12)
80020f8: 29 65 00 04 lw r5,(r11+4)
80020fc: 29 62 00 10 lw r2,(r11+16)
the_link.node_access = node->info.hard_link.link_node;
IMFS_Set_handlers( &the_link );
8002100: 37 8e 00 18 addi r14,sp,24
if ( !node->info.hard_link.link_node )
rtems_set_errno_and_return_minus_one( EINVAL );
the_link = *loc;
the_link.node_access = node->info.hard_link.link_node;
8002104: 5b 81 00 18 sw (sp+24),r1
IMFS_Set_handlers( &the_link );
8002108: 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;
800210c: 5b 84 00 20 sw (sp+32),r4
8002110: 5b 83 00 24 sw (sp+36),r3
8002114: 5b 85 00 1c sw (sp+28),r5
8002118: 5b 82 00 28 sw (sp+40),r2
the_link.node_access = node->info.hard_link.link_node;
IMFS_Set_handlers( &the_link );
800211c: f8 00 25 46 calli 800b634 <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)
8002120: 29 83 00 50 lw r3,(r12+80)
8002124: 34 01 00 01 mvi r1,1
8002128: 2c 64 00 34 lhu r4,(r3+52)
800212c: 5c 81 00 09 bne r4,r1,8002150 <IMFS_unlink+0xac>
{
result = (*the_link.handlers->rmnod_h)( parentloc, &the_link );
8002130: 2b 81 00 20 lw r1,(sp+32)
8002134: b9 c0 10 00 mv r2,r14
8002138: 28 23 00 34 lw r3,(r1+52)
800213c: b9 a0 08 00 mv r1,r13
8002140: d8 60 00 00 call r3
if ( result != 0 )
return -1;
8002144: 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 )
8002148: 44 20 00 0a be r1,r0,8002170 <IMFS_unlink+0xcc>
800214c: e0 00 00 0f bi 8002188 <IMFS_unlink+0xe4>
return -1;
}
else
{
node->info.hard_link.link_node->st_nlink --;
8002150: 34 84 ff ff addi r4,r4,-1
IMFS_update_ctime( node->info.hard_link.link_node );
8002154: 34 02 00 00 mvi r2,0
if ( result != 0 )
return -1;
}
else
{
node->info.hard_link.link_node->st_nlink --;
8002158: 0c 64 00 34 sh (r3+52),r4
IMFS_update_ctime( node->info.hard_link.link_node );
800215c: 37 81 00 2c addi r1,sp,44
8002160: f8 00 01 86 calli 8002778 <gettimeofday>
8002164: 29 81 00 50 lw r1,(r12+80)
8002168: 2b 82 00 2c lw r2,(sp+44)
800216c: 58 22 00 48 sw (r1+72),r2
/*
* Now actually free the node we were asked to free.
*/
result = (*loc->handlers->rmnod_h)( parentloc, loc );
8002170: 29 61 00 08 lw r1,(r11+8)
8002174: b9 60 10 00 mv r2,r11
8002178: 28 23 00 34 lw r3,(r1+52)
800217c: b9 a0 08 00 mv r1,r13
8002180: d8 60 00 00 call r3
8002184: b8 20 10 00 mv r2,r1
return result;
}
8002188: b8 40 08 00 mv r1,r2
800218c: 2b 9d 00 04 lw ra,(sp+4)
8002190: 2b 8b 00 14 lw r11,(sp+20)
8002194: 2b 8c 00 10 lw r12,(sp+16)
8002198: 2b 8d 00 0c lw r13,(sp+12)
800219c: 2b 8e 00 08 lw r14,(sp+8)
80021a0: 37 9c 00 30 addi sp,sp,48
80021a4: c3 a0 00 00 ret
080021a8 <IMFS_unmount>:
#include <rtems/seterr.h>
int IMFS_unmount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
80021a8: 37 9c ff fc addi sp,sp,-4
80021ac: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *node;
node = mt_entry->mt_point_node.node_access;
80021b0: 28 21 00 08 lw r1,(r1+8)
/*
* Is the node that we are mounting onto a directory node ?
*/
if ( node->type != IMFS_DIRECTORY )
80021b4: 34 02 00 01 mvi r2,1
80021b8: 28 23 00 4c lw r3,(r1+76)
80021bc: 44 62 00 04 be r3,r2,80021cc <IMFS_unmount+0x24> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( ENOTDIR );
80021c0: f8 00 3c ac calli 8011470 <__errno> <== NOT EXECUTED
80021c4: 34 02 00 14 mvi r2,20 <== NOT EXECUTED
80021c8: e0 00 00 05 bi 80021dc <IMFS_unmount+0x34> <== NOT EXECUTED
/*
* Did the node indicate that there was a directory mounted here?
*/
if ( node->info.directory.mt_fs == NULL )
80021cc: 28 22 00 5c lw r2,(r1+92)
80021d0: 5c 40 00 06 bne r2,r0,80021e8 <IMFS_unmount+0x40> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */
80021d4: f8 00 3c a7 calli 8011470 <__errno> <== NOT EXECUTED
80021d8: 34 02 00 16 mvi r2,22 <== NOT EXECUTED
80021dc: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
80021e0: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
80021e4: e0 00 00 03 bi 80021f0 <IMFS_unmount+0x48> <== NOT EXECUTED
/*
* Set the mt_fs pointer to indicate that there is no longer
* a file system mounted to this point.
*/
node->info.directory.mt_fs = NULL;
80021e8: 58 20 00 5c sw (r1+92),r0
return 0;
80021ec: 34 01 00 00 mvi r1,0
}
80021f0: 2b 9d 00 04 lw ra,(sp+4)
80021f4: 37 9c 00 04 addi sp,sp,4
80021f8: c3 a0 00 00 ret
08001074 <Stack_check_Dump_threads_usage>:
static rtems_printk_plugin_t print_handler;
void Stack_check_Dump_threads_usage(
Thread_Control *the_thread
)
{
8001074: 37 9c ff d4 addi sp,sp,-44
8001078: 5b 8b 00 24 sw (sp+36),r11
800107c: 5b 8c 00 20 sw (sp+32),r12
8001080: 5b 8d 00 1c sw (sp+28),r13
8001084: 5b 8e 00 18 sw (sp+24),r14
8001088: 5b 8f 00 14 sw (sp+20),r15
800108c: 5b 90 00 10 sw (sp+16),r16
8001090: 5b 91 00 0c sw (sp+12),r17
8001094: 5b 92 00 08 sw (sp+8),r18
8001098: 5b 9d 00 04 sw (sp+4),ra
800109c: b8 20 68 00 mv r13,r1
/*
* Obtain interrupt stack information
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
80010a0: 34 01 ff ff mvi r1,-1
80010a4: 5d a1 00 08 bne r13,r1,80010c4 <Stack_check_Dump_threads_usage+0x50>
if (!Stack_check_Interrupt_stack.area)
80010a8: 78 0c 08 01 mvhi r12,0x801
80010ac: 39 8c 77 60 ori r12,r12,0x7760
80010b0: 29 81 00 04 lw r1,(r12+4)
return;
stack = &Stack_check_Interrupt_stack;
the_thread = 0;
current = 0;
80010b4: 34 10 00 00 mvi r16,0
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
if (!Stack_check_Interrupt_stack.area)
return;
stack = &Stack_check_Interrupt_stack;
the_thread = 0;
80010b8: 34 0d 00 00 mvi r13,0
/*
* Obtain interrupt stack information
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (the_thread == (Thread_Control *) -1) {
if (!Stack_check_Interrupt_stack.area)
80010bc: 5c 20 00 04 bne r1,r0,80010cc <Stack_check_Dump_threads_usage+0x58><== ALWAYS TAKEN
80010c0: e0 00 00 54 bi 8001210 <Stack_check_Dump_threads_usage+0x19c><== NOT EXECUTED
current = 0;
} else
#endif
{
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
80010c4: 29 b0 01 08 lw r16,(r13+264)
the_thread = 0;
current = 0;
} else
#endif
{
stack = &the_thread->Start.Initial_stack;
80010c8: 35 ac 00 b8 addi r12,r13,184
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
}
low = Stack_check_usable_stack_start(stack);
size = Stack_check_usable_stack_size(stack);
80010cc: 29 8f 00 00 lw r15,(r12+0)
{
const uint32_t *base, *ebase;
uint32_t length;
base = s;
length = n/4;
80010d0: 34 02 00 02 mvi r2,2
{
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
}
low = Stack_check_usable_stack_start(stack);
80010d4: 29 8b 00 04 lw r11,(r12+4)
size = Stack_check_usable_stack_size(stack);
80010d8: 35 ef ff f0 addi r15,r15,-16
{
const uint32_t *base, *ebase;
uint32_t length;
base = s;
length = n/4;
80010dc: b9 e0 08 00 mv r1,r15
80010e0: f8 00 4e c5 calli 8014bf4 <__lshrsi3>
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
80010e4: 34 02 00 02 mvi r2,2
80010e8: f8 00 4e 75 calli 8014abc <__ashlsi3>
if (*base != U32_PATTERN)
80010ec: 78 03 08 01 mvhi r3,0x801
{
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
}
low = Stack_check_usable_stack_start(stack);
80010f0: 35 71 00 10 addi r17,r11,16
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
if (*base != U32_PATTERN)
80010f4: 38 63 5f b0 ori r3,r3,0x5fb0
/*
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
80010f8: 35 6b 00 20 addi r11,r11,32
for (ebase = base + length; base < ebase; base++)
80010fc: b5 61 08 00 add r1,r11,r1
if (*base != U32_PATTERN)
8001100: 28 62 00 00 lw r2,(r3+0)
8001104: e0 00 00 04 bi 8001114 <Stack_check_Dump_threads_usage+0xa0>
8001108: 29 63 00 00 lw r3,(r11+0)
800110c: 5c 62 00 05 bne r3,r2,8001120 <Stack_check_Dump_threads_usage+0xac>
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
8001110: 35 6b 00 04 addi r11,r11,4
8001114: 54 2b ff fd bgu r1,r11,8001108 <Stack_check_Dump_threads_usage+0x94><== ALWAYS TAKEN
high_water_mark = Stack_check_find_high_water_mark(low, size);
if ( high_water_mark )
used = Stack_check_Calculate_used( low, size, high_water_mark );
else
used = 0;
8001118: 34 0e 00 00 mvi r14,0 <== NOT EXECUTED
800111c: e0 00 00 05 bi 8001130 <Stack_check_Dump_threads_usage+0xbc><== NOT EXECUTED
8001120: 34 0e 00 00 mvi r14,0
low = Stack_check_usable_stack_start(stack);
size = Stack_check_usable_stack_size(stack);
high_water_mark = Stack_check_find_high_water_mark(low, size);
if ( high_water_mark )
8001124: 45 60 00 03 be r11,r0,8001130 <Stack_check_Dump_threads_usage+0xbc><== NEVER TAKEN
used = Stack_check_Calculate_used( low, size, high_water_mark );
8001128: b6 2f 70 00 add r14,r17,r15
800112c: c9 cb 70 00 sub r14,r14,r11
8001130: 78 04 08 01 mvhi r4,0x801
8001134: 78 02 08 01 mvhi r2,0x801
8001138: 38 84 76 c0 ori r4,r4,0x76c0
800113c: 38 42 76 bc ori r2,r2,0x76bc
else
used = 0;
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if ( the_thread )
8001140: 45 a0 00 0f be r13,r0,800117c <Stack_check_Dump_threads_usage+0x108>
#endif
{
(*print_handler)(
8001144: 29 ab 00 08 lw r11,(r13+8)
8001148: 28 52 00 00 lw r18,(r2+0)
800114c: 37 83 00 28 addi r3,sp,40
8001150: b9 60 08 00 mv r1,r11
8001154: 34 02 00 05 mvi r2,5
8001158: 28 91 00 00 lw r17,(r4+0)
800115c: f8 00 11 ee calli 8005914 <rtems_object_get_name>
8001160: 78 02 08 01 mvhi r2,0x801
8001164: b8 20 20 00 mv r4,r1
8001168: 38 42 5e 18 ori r2,r2,0x5e18
800116c: ba 40 08 00 mv r1,r18
8001170: b9 60 18 00 mv r3,r11
8001174: da 20 00 00 call r17
8001178: e0 00 00 07 bi 8001194 <Stack_check_Dump_threads_usage+0x120>
rtems_object_get_name( the_thread->Object.id, sizeof(name), name )
);
}
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
800117c: 28 41 00 00 lw r1,(r2+0)
8001180: 28 84 00 00 lw r4,(r4+0)
8001184: 78 02 08 01 mvhi r2,0x801
8001188: 38 42 5e 28 ori r2,r2,0x5e28
800118c: 34 03 ff ff mvi r3,-1
8001190: d8 80 00 00 call r4
(*print_handler)(
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
8001194: 29 84 00 00 lw r4,(r12+0)
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
8001198: 78 0b 08 01 mvhi r11,0x801
800119c: 78 0d 08 01 mvhi r13,0x801
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
80011a0: 29 83 00 04 lw r3,(r12+4)
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
80011a4: 39 6b 76 c0 ori r11,r11,0x76c0
80011a8: 39 ad 76 bc ori r13,r13,0x76bc
80011ac: 29 67 00 00 lw r7,(r11+0)
80011b0: 29 a1 00 00 lw r1,(r13+0)
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
80011b4: 34 84 ff ff addi r4,r4,-1
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
80011b8: 78 02 08 01 mvhi r2,0x801
80011bc: 38 42 5e 38 ori r2,r2,0x5e38
80011c0: b4 64 20 00 add r4,r3,r4
80011c4: ba 00 28 00 mv r5,r16
80011c8: b9 e0 30 00 mv r6,r15
80011cc: d8 e0 00 00 call r7
stack->area + stack->size - 1,
current,
size
);
if (Stack_check_Initialized == 0) {
80011d0: 78 01 08 01 mvhi r1,0x801
80011d4: 38 21 76 c4 ori r1,r1,0x76c4
80011d8: 28 21 00 00 lw r1,(r1+0)
80011dc: 5c 20 00 07 bne r1,r0,80011f8 <Stack_check_Dump_threads_usage+0x184><== ALWAYS TAKEN
(*print_handler)( print_context, "Unavailable\n" );
80011e0: 29 63 00 00 lw r3,(r11+0) <== NOT EXECUTED
80011e4: 29 a1 00 00 lw r1,(r13+0) <== NOT EXECUTED
80011e8: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
80011ec: 38 42 5e 58 ori r2,r2,0x5e58 <== NOT EXECUTED
80011f0: d8 60 00 00 call r3 <== NOT EXECUTED
80011f4: e0 00 00 07 bi 8001210 <Stack_check_Dump_threads_usage+0x19c><== NOT EXECUTED
} else {
(*print_handler)( print_context, "%8" PRId32 "\n", used );
80011f8: 29 64 00 00 lw r4,(r11+0)
80011fc: 29 a1 00 00 lw r1,(r13+0)
8001200: 78 02 08 01 mvhi r2,0x801
8001204: 38 42 5e 68 ori r2,r2,0x5e68
8001208: b9 c0 18 00 mv r3,r14
800120c: d8 80 00 00 call r4
}
}
8001210: 2b 9d 00 04 lw ra,(sp+4)
8001214: 2b 8b 00 24 lw r11,(sp+36)
8001218: 2b 8c 00 20 lw r12,(sp+32)
800121c: 2b 8d 00 1c lw r13,(sp+28)
8001220: 2b 8e 00 18 lw r14,(sp+24)
8001224: 2b 8f 00 14 lw r15,(sp+20)
8001228: 2b 90 00 10 lw r16,(sp+16)
800122c: 2b 91 00 0c lw r17,(sp+12)
8001230: 2b 92 00 08 lw r18,(sp+8)
8001234: 37 9c 00 2c addi sp,sp,44
8001238: c3 a0 00 00 ret
0800123c <Stack_check_Initialize>:
/*
* Stack_check_Initialize
*/
void Stack_check_Initialize( void )
{
800123c: 37 9c ff fc addi sp,sp,-4
8001240: 5b 9d 00 04 sw (sp+4),ra
static uint32_t pattern[ 4 ] = {
0xFEEDF00D, 0x0BAD0D06, /* FEED FOOD to BAD DOG */
0xDEADF00D, 0x600D0D06 /* DEAD FOOD but GOOD DOG */
};
if ( Stack_check_Initialized )
8001244: 78 01 08 01 mvhi r1,0x801
8001248: 38 21 76 c4 ori r1,r1,0x76c4
800124c: 28 23 00 00 lw r3,(r1+0)
8001250: 5c 60 00 24 bne r3,r0,80012e0 <Stack_check_Initialize+0xa4>
/*
* Dope the pattern and fill areas
*/
p = Stack_check_Pattern.pattern;
for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) {
p[i] = pattern[ i%4 ];
8001254: 78 04 08 01 mvhi r4,0x801
8001258: 38 84 5f b4 ori r4,r4,0x5fb4
800125c: 28 82 00 00 lw r2,(r4+0)
8001260: 78 01 08 01 mvhi r1,0x801
8001264: 78 04 08 01 mvhi r4,0x801
8001268: 38 21 77 50 ori r1,r1,0x7750
800126c: 38 84 5f b8 ori r4,r4,0x5fb8
8001270: 58 22 00 00 sw (r1+0),r2
8001274: 28 82 00 00 lw r2,(r4+0)
8001278: 78 04 08 01 mvhi r4,0x801
800127c: 38 84 5f bc ori r4,r4,0x5fbc
8001280: 58 22 00 04 sw (r1+4),r2
8001284: 28 82 00 00 lw r2,(r4+0)
8001288: 78 04 08 01 mvhi r4,0x801
800128c: 38 84 5f c0 ori r4,r4,0x5fc0
8001290: 58 22 00 08 sw (r1+8),r2
8001294: 28 82 00 00 lw r2,(r4+0)
8001298: 58 22 00 0c sw (r1+12),r2
/*
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
800129c: 78 02 08 01 mvhi r2,0x801
80012a0: 38 42 7d dc ori r2,r2,0x7ddc
80012a4: 28 41 00 00 lw r1,(r2+0)
80012a8: 44 23 00 0a be r1,r3,80012d0 <Stack_check_Initialize+0x94> <== NEVER TAKEN
80012ac: 28 43 00 04 lw r3,(r2+4)
80012b0: 44 60 00 08 be r3,r0,80012d0 <Stack_check_Initialize+0x94> <== NEVER TAKEN
Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low;
80012b4: 78 02 08 01 mvhi r2,0x801
80012b8: 38 42 77 60 ori r2,r2,0x7760
Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
80012bc: c8 61 18 00 sub r3,r3,r1
* If appropriate, setup the interrupt stack for high water testing
* also.
*/
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) {
Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low;
80012c0: 58 41 00 04 sw (r2+4),r1
Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
80012c4: 58 43 00 00 sw (r2+0),r3
(char *) _CPU_Interrupt_stack_low;
Stack_check_Dope_stack(&Stack_check_Interrupt_stack);
80012c8: 34 02 00 a5 mvi r2,165
80012cc: f8 00 3b a8 calli 801016c <memset>
}
#endif
Stack_check_Initialized = 1;
80012d0: 78 01 08 01 mvhi r1,0x801
80012d4: 38 21 76 c4 ori r1,r1,0x76c4
80012d8: 34 02 00 01 mvi r2,1
80012dc: 58 22 00 00 sw (r1+0),r2
}
80012e0: 2b 9d 00 04 lw ra,(sp+4)
80012e4: 37 9c 00 04 addi sp,sp,4
80012e8: c3 a0 00 00 ret
08006030 <_CORE_RWLock_Release>:
*/
CORE_RWLock_Status _CORE_RWLock_Release(
CORE_RWLock_Control *the_rwlock
)
{
8006030: 37 9c ff f4 addi sp,sp,-12
8006034: 5b 8b 00 0c sw (sp+12),r11
8006038: 5b 8c 00 08 sw (sp+8),r12
800603c: 5b 9d 00 04 sw (sp+4),ra
8006040: b8 20 58 00 mv r11,r1
ISR_Level level;
Thread_Control *executing = _Thread_Executing;
8006044: 78 01 08 01 mvhi r1,0x801
8006048: 38 21 8d 38 ori r1,r1,0x8d38
800604c: 28 22 00 0c lw r2,(r1+12)
* Otherwise, we have to block.
* If locked for reading and no waiters, then OK to read.
* If any thread is waiting, then we wait.
*/
_ISR_Disable( level );
8006050: 90 00 08 00 rcsr r1,IE
8006054: 34 03 ff fe mvi r3,-2
8006058: a0 23 18 00 and r3,r1,r3
800605c: d0 03 00 00 wcsr IE,r3
if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){
8006060: 29 63 00 44 lw r3,(r11+68)
8006064: 5c 60 00 05 bne r3,r0,8006078 <_CORE_RWLock_Release+0x48>
_ISR_Enable( level );
8006068: d0 01 00 00 wcsr IE,r1
executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE;
800606c: 34 01 00 02 mvi r1,2
8006070: 58 41 00 34 sw (r2+52),r1
return CORE_RWLOCK_SUCCESSFUL;
8006074: e0 00 00 26 bi 800610c <_CORE_RWLock_Release+0xdc>
}
if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) {
8006078: 34 04 00 01 mvi r4,1
800607c: 5c 64 00 07 bne r3,r4,8006098 <_CORE_RWLock_Release+0x68>
the_rwlock->number_of_readers -= 1;
8006080: 29 63 00 48 lw r3,(r11+72)
8006084: 34 63 ff ff addi r3,r3,-1
8006088: 59 63 00 48 sw (r11+72),r3
if ( the_rwlock->number_of_readers != 0 ) {
800608c: 44 60 00 03 be r3,r0,8006098 <_CORE_RWLock_Release+0x68>
/* must be unlocked again */
_ISR_Enable( level );
8006090: d0 01 00 00 wcsr IE,r1
return CORE_RWLOCK_SUCCESSFUL;
8006094: e0 00 00 1e bi 800610c <_CORE_RWLock_Release+0xdc>
}
}
/* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */
executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL;
8006098: 58 40 00 34 sw (r2+52),r0
/*
* Implicitly transition to "unlocked" and find another thread interested
* in obtaining this rwlock.
*/
the_rwlock->current_state = CORE_RWLOCK_UNLOCKED;
800609c: 59 60 00 44 sw (r11+68),r0
_ISR_Enable( level );
80060a0: d0 01 00 00 wcsr IE,r1
next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue );
80060a4: b9 60 08 00 mv r1,r11
80060a8: f8 00 07 a9 calli 8007f4c <_Thread_queue_Dequeue>
if ( next ) {
80060ac: 44 20 00 18 be r1,r0,800610c <_CORE_RWLock_Release+0xdc>
if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) {
80060b0: 28 22 00 30 lw r2,(r1+48)
80060b4: 34 01 00 01 mvi r1,1
80060b8: 5c 41 00 04 bne r2,r1,80060c8 <_CORE_RWLock_Release+0x98>
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING;
80060bc: 34 01 00 02 mvi r1,2
80060c0: 59 61 00 44 sw (r11+68),r1
return CORE_RWLOCK_SUCCESSFUL;
80060c4: e0 00 00 12 bi 800610c <_CORE_RWLock_Release+0xdc>
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
80060c8: 29 62 00 48 lw r2,(r11+72)
the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING;
80060cc: 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 ||
80060d0: 34 0c 00 01 mvi r12,1
}
/*
* Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING
*/
the_rwlock->number_of_readers += 1;
80060d4: 34 42 00 01 addi r2,r2,1
80060d8: 59 62 00 48 sw (r11+72),r2
/*
* Now see if more readers can be let go.
*/
while ( 1 ) {
next = _Thread_queue_First( &the_rwlock->Wait_queue );
80060dc: b9 60 08 00 mv r1,r11
80060e0: f8 00 09 22 calli 8008568 <_Thread_queue_First>
80060e4: b8 20 10 00 mv r2,r1
if ( !next ||
80060e8: 44 20 00 09 be r1,r0,800610c <_CORE_RWLock_Release+0xdc>
80060ec: 28 21 00 30 lw r1,(r1+48)
80060f0: 44 2c 00 07 be r1,r12,800610c <_CORE_RWLock_Release+0xdc> <== NEVER TAKEN
next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE )
return CORE_RWLOCK_SUCCESSFUL;
the_rwlock->number_of_readers += 1;
80060f4: 29 61 00 48 lw r1,(r11+72)
80060f8: 34 21 00 01 addi r1,r1,1
80060fc: 59 61 00 48 sw (r11+72),r1
_Thread_queue_Extract( &the_rwlock->Wait_queue, next );
8006100: b9 60 08 00 mv r1,r11
8006104: f8 00 08 cf calli 8008440 <_Thread_queue_Extract>
}
8006108: e3 ff ff f5 bi 80060dc <_CORE_RWLock_Release+0xac>
}
/* indentation is to match _ISR_Disable at top */
return CORE_RWLOCK_SUCCESSFUL;
}
800610c: 34 01 00 00 mvi r1,0
8006110: 2b 9d 00 04 lw ra,(sp+4)
8006114: 2b 8b 00 0c lw r11,(sp+12)
8006118: 2b 8c 00 08 lw r12,(sp+8)
800611c: 37 9c 00 0c addi sp,sp,12
8006120: c3 a0 00 00 ret
08006124 <_CORE_RWLock_Timeout>:
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
8006124: 37 9c ff f8 addi sp,sp,-8
8006128: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
800612c: 37 82 00 08 addi r2,sp,8
8006130: f8 00 06 9a calli 8007b98 <_Thread_Get>
switch ( location ) {
8006134: 2b 82 00 08 lw r2,(sp+8)
8006138: 5c 40 00 07 bne r2,r0,8006154 <_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 );
800613c: f8 00 09 65 calli 80086d0 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
8006140: 78 01 08 01 mvhi r1,0x801
8006144: 38 21 88 68 ori r1,r1,0x8868
8006148: 28 22 00 00 lw r2,(r1+0)
800614c: 34 42 ff ff addi r2,r2,-1
8006150: 58 22 00 00 sw (r1+0),r2
_Thread_Unnest_dispatch();
break;
}
}
8006154: 2b 9d 00 04 lw ra,(sp+4)
8006158: 37 9c 00 08 addi sp,sp,8
800615c: c3 a0 00 00 ret
08015640 <_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
)
{
8015640: 37 9c ff e4 addi sp,sp,-28
8015644: 5b 8b 00 1c sw (sp+28),r11
8015648: 5b 8c 00 18 sw (sp+24),r12
801564c: 5b 8d 00 14 sw (sp+20),r13
8015650: 5b 8e 00 10 sw (sp+16),r14
8015654: 5b 8f 00 0c sw (sp+12),r15
8015658: 5b 90 00 08 sw (sp+8),r16
801565c: 5b 9d 00 04 sw (sp+4),ra
8015660: b8 40 80 00 mv r16,r2
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
8015664: 28 22 00 4c lw r2,(r1+76)
Objects_Id id __attribute__((unused)),
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)),
#endif
uint32_t *count
)
{
8015668: b8 20 58 00 mv r11,r1
801566c: b8 60 68 00 mv r13,r3
8015670: b8 c0 78 00 mv r15,r6
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
8015674: 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 ) {
8015678: 54 62 00 13 bgu r3,r2,80156c4 <_CORE_message_queue_Broadcast+0x84><== NEVER TAKEN
* NOTE: This check is critical because threads can block on
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
801567c: 29 61 00 48 lw r1,(r11+72)
8015680: 34 0c 00 00 mvi r12,0
8015684: 44 20 00 0a be r1,r0,80156ac <_CORE_message_queue_Broadcast+0x6c>
*count = 0;
8015688: 58 c0 00 00 sw (r6+0),r0
801568c: e0 00 00 0d bi 80156c0 <_CORE_message_queue_Broadcast+0x80>
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
8015690: 29 c1 00 2c lw r1,(r14+44)
8015694: ba 00 10 00 mv r2,r16
8015698: b9 a0 18 00 mv r3,r13
801569c: f8 00 2a 69 calli 8020040 <memcpy>
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
80156a0: 29 c1 00 28 lw r1,(r14+40)
*/
number_broadcasted = 0;
while ((the_thread =
_Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
waitp = &the_thread->Wait;
number_broadcasted += 1;
80156a4: 35 8c 00 01 addi r12,r12,1
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
80156a8: 58 2d 00 00 sw (r1+0),r13
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
80156ac: b9 60 08 00 mv r1,r11
80156b0: f8 00 0d 4c calli 8018be0 <_Thread_queue_Dequeue>
80156b4: b8 20 70 00 mv r14,r1
80156b8: 5c 20 ff f6 bne r1,r0,8015690 <_CORE_message_queue_Broadcast+0x50>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
80156bc: 59 ec 00 00 sw (r15+0),r12
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
80156c0: 34 01 00 00 mvi r1,0
}
80156c4: 2b 9d 00 04 lw ra,(sp+4)
80156c8: 2b 8b 00 1c lw r11,(sp+28)
80156cc: 2b 8c 00 18 lw r12,(sp+24)
80156d0: 2b 8d 00 14 lw r13,(sp+20)
80156d4: 2b 8e 00 10 lw r14,(sp+16)
80156d8: 2b 8f 00 0c lw r15,(sp+12)
80156dc: 2b 90 00 08 lw r16,(sp+8)
80156e0: 37 9c 00 1c addi sp,sp,28
80156e4: c3 a0 00 00 ret
0800da98 <_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
)
{
800da98: 37 9c ff e4 addi sp,sp,-28
800da9c: 5b 8b 00 1c sw (sp+28),r11
800daa0: 5b 8c 00 18 sw (sp+24),r12
800daa4: 5b 8d 00 14 sw (sp+20),r13
800daa8: 5b 8e 00 10 sw (sp+16),r14
800daac: 5b 8f 00 0c sw (sp+12),r15
800dab0: 5b 90 00 08 sw (sp+8),r16
800dab4: 5b 9d 00 04 sw (sp+4),ra
800dab8: 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;
800dabc: 58 20 00 48 sw (r1+72),r0
the_message_queue->maximum_message_size = maximum_message_size;
800dac0: 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;
800dac4: 58 20 00 60 sw (r1+96),r0
the_message_queue->notify_argument = the_argument;
800dac8: 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;
800dacc: 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)) {
800dad0: 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
)
{
800dad4: b8 40 80 00 mv r16,r2
800dad8: b8 60 70 00 mv r14,r3
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
800dadc: b8 80 60 00 mv r12,r4
800dae0: 44 20 00 06 be r1,r0,800daf8 <_CORE_message_queue_Initialize+0x60>
allocated_message_size += sizeof(uint32_t);
800dae4: 34 8c 00 04 addi r12,r4,4
allocated_message_size &= ~(sizeof(uint32_t) - 1);
800dae8: 34 01 ff fc mvi r1,-4
800daec: a1 81 60 00 and r12,r12,r1
}
if (allocated_message_size < maximum_message_size)
return false;
800daf0: 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)
800daf4: 54 8c 00 1c bgu r4,r12,800db64 <_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));
800daf8: 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 *
800dafc: b9 e0 08 00 mv r1,r15
800db00: b9 c0 10 00 mv r2,r14
800db04: f8 00 5d 23 calli 8024f90 <__mulsi3>
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
return false;
800db08: 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)
800db0c: 55 81 00 16 bgu r12,r1,800db64 <_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 );
800db10: f8 00 0e 9c calli 8011580 <_Workspace_Allocate>
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
800db14: 59 61 00 5c sw (r11+92),r1
_Workspace_Allocate( message_buffering_required );
800db18: b8 20 28 00 mv r5,r1
if (the_message_queue->message_buffers == 0)
800db1c: 44 20 00 12 be r1,r0,800db64 <_CORE_message_queue_Initialize+0xcc>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
800db20: b8 a0 10 00 mv r2,r5
800db24: 35 61 00 68 addi r1,r11,104
800db28: b9 c0 18 00 mv r3,r14
800db2c: b9 e0 20 00 mv r4,r15
800db30: f8 00 19 e5 calli 80142c4 <_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 );
800db34: 35 61 00 54 addi r1,r11,84
head->next = tail;
800db38: 59 61 00 50 sw (r11+80),r1
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
800db3c: 35 61 00 50 addi r1,r11,80
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
tail->previous = head;
800db40: 59 61 00 58 sw (r11+88),r1
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
800db44: 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(
800db48: 2a 02 00 00 lw r2,(r16+0)
800db4c: b9 60 08 00 mv r1,r11
800db50: 34 03 00 80 mvi r3,128
800db54: 64 42 00 01 cmpei r2,r2,1
800db58: 34 04 00 06 mvi r4,6
800db5c: f8 00 0b 5b calli 80108c8 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
800db60: 34 0d 00 01 mvi r13,1
}
800db64: b9 a0 08 00 mv r1,r13
800db68: 2b 9d 00 04 lw ra,(sp+4)
800db6c: 2b 8b 00 1c lw r11,(sp+28)
800db70: 2b 8c 00 18 lw r12,(sp+24)
800db74: 2b 8d 00 14 lw r13,(sp+20)
800db78: 2b 8e 00 10 lw r14,(sp+16)
800db7c: 2b 8f 00 0c lw r15,(sp+12)
800db80: 2b 90 00 08 lw r16,(sp+8)
800db84: 37 9c 00 1c addi sp,sp,28
800db88: c3 a0 00 00 ret
0800db8c <_CORE_message_queue_Seize>:
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
800db8c: 37 9c ff f0 addi sp,sp,-16
800db90: 5b 8b 00 10 sw (sp+16),r11
800db94: 5b 8c 00 0c sw (sp+12),r12
800db98: 5b 8d 00 08 sw (sp+8),r13
800db9c: 5b 9d 00 04 sw (sp+4),ra
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
800dba0: 78 07 08 02 mvhi r7,0x802
800dba4: 38 e7 8f 10 ori r7,r7,0x8f10
800dba8: 28 e7 00 0c lw r7,(r7+12)
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
800dbac: b8 20 58 00 mv r11,r1
800dbb0: 20 a5 00 ff andi r5,r5,0xff
ISR_Level level;
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
800dbb4: 58 e0 00 34 sw (r7+52),r0
void *buffer,
size_t *size_p,
bool wait,
Watchdog_Interval timeout
)
{
800dbb8: b8 60 08 00 mv r1,r3
CORE_message_queue_Buffer_control *the_message;
Thread_Control *executing;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
_ISR_Disable( level );
800dbbc: 90 00 40 00 rcsr r8,IE
800dbc0: 34 03 ff fe mvi r3,-2
800dbc4: a1 03 18 00 and r3,r8,r3
800dbc8: d0 03 00 00 wcsr IE,r3
executing->Wait.return_argument = size_p;
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
800dbcc: 29 6c 00 50 lw r12,(r11+80)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
800dbd0: 35 63 00 54 addi r3,r11,84
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
800dbd4: 45 83 00 07 be r12,r3,800dbf0 <_CORE_message_queue_Seize+0x64>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
800dbd8: 29 83 00 00 lw r3,(r12+0)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
800dbdc: 35 69 00 50 addi r9,r11,80
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
800dbe0: 59 63 00 50 sw (r11+80),r3
new_first->previous = head;
800dbe4: 58 69 00 04 sw (r3+4),r9
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
_ISR_Disable( level );
the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
if ( the_message != NULL ) {
800dbe8: 5d 80 00 04 bne r12,r0,800dbf8 <_CORE_message_queue_Seize+0x6c><== ALWAYS TAKEN
800dbec: e0 00 00 25 bi 800dc80 <_CORE_message_queue_Seize+0xf4> <== NOT EXECUTED
)
{
if ( !_Chain_Is_empty(the_chain))
return _Chain_Get_first_unprotected(the_chain);
else
return NULL;
800dbf0: 34 0c 00 00 mvi r12,0
800dbf4: e0 00 00 23 bi 800dc80 <_CORE_message_queue_Seize+0xf4>
the_message_queue->number_of_pending_messages -= 1;
800dbf8: 29 62 00 48 lw r2,(r11+72)
800dbfc: 34 42 ff ff addi r2,r2,-1
800dc00: 59 62 00 48 sw (r11+72),r2
_ISR_Enable( level );
800dc04: d0 08 00 00 wcsr IE,r8
*size_p = the_message->Contents.size;
800dc08: 29 83 00 0c lw r3,(r12+12)
_Thread_Executing->Wait.count =
800dc0c: 78 02 08 02 mvhi r2,0x802
800dc10: 38 42 8f 10 ori r2,r2,0x8f10
the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
if ( the_message != NULL ) {
the_message_queue->number_of_pending_messages -= 1;
_ISR_Enable( level );
*size_p = the_message->Contents.size;
800dc14: 58 83 00 00 sw (r4+0),r3
_Thread_Executing->Wait.count =
800dc18: 29 84 00 08 lw r4,(r12+8)
800dc1c: 28 42 00 0c lw r2,(r2+12)
_CORE_message_queue_Get_message_priority( the_message );
_CORE_message_queue_Copy_buffer(
the_message->Contents.buffer,
800dc20: 35 8d 00 10 addi r13,r12,16
if ( the_message != NULL ) {
the_message_queue->number_of_pending_messages -= 1;
_ISR_Enable( level );
*size_p = the_message->Contents.size;
_Thread_Executing->Wait.count =
800dc24: 58 44 00 24 sw (r2+36),r4
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
800dc28: b9 a0 10 00 mv r2,r13
800dc2c: f8 00 27 97 calli 8017a88 <memcpy>
* is not, then we can go ahead and free the buffer.
*
* NOTE: If we note that the queue was not full before this receive,
* then we can avoid this dequeue.
*/
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
800dc30: b9 60 08 00 mv r1,r11
800dc34: f8 00 09 c7 calli 8010350 <_Thread_queue_Dequeue>
800dc38: b8 20 20 00 mv r4,r1
if ( !the_thread ) {
800dc3c: 5c 20 00 05 bne r1,r0,800dc50 <_CORE_message_queue_Seize+0xc4>
RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer (
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Buffer_control *the_message
)
{
_Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node );
800dc40: 35 61 00 68 addi r1,r11,104
800dc44: b9 80 10 00 mv r2,r12
800dc48: fb ff ff 64 calli 800d9d8 <_Chain_Append>
_CORE_message_queue_Free_message_buffer(
the_message_queue,
the_message
);
return;
800dc4c: e0 00 00 1e bi 800dcc4 <_CORE_message_queue_Seize+0x138>
CORE_message_queue_Buffer_control *the_message,
int priority
)
{
#if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
the_message->priority = priority;
800dc50: 28 21 00 24 lw r1,(r1+36)
*/
_CORE_message_queue_Set_message_priority(
the_message,
the_thread->Wait.count
);
the_message->Contents.size = (size_t) the_thread->Wait.option;
800dc54: 28 83 00 30 lw r3,(r4+48)
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
800dc58: 28 82 00 2c lw r2,(r4+44)
CORE_message_queue_Buffer_control *the_message,
int priority
)
{
#if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY)
the_message->priority = priority;
800dc5c: 59 81 00 08 sw (r12+8),r1
800dc60: 59 83 00 0c sw (r12+12),r3
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
800dc64: b9 a0 08 00 mv r1,r13
800dc68: f8 00 27 88 calli 8017a88 <memcpy>
the_thread->Wait.return_argument_second.immutable_object,
the_message->Contents.buffer,
the_message->Contents.size
);
_CORE_message_queue_Insert_message(
800dc6c: 29 83 00 08 lw r3,(r12+8)
800dc70: b9 60 08 00 mv r1,r11
800dc74: b9 80 10 00 mv r2,r12
800dc78: f8 00 19 a0 calli 80142f8 <_CORE_message_queue_Insert_message>
the_message_queue,
the_message,
_CORE_message_queue_Get_message_priority( the_message )
);
return;
800dc7c: e0 00 00 12 bi 800dcc4 <_CORE_message_queue_Seize+0x138>
}
#endif
}
if ( !wait ) {
800dc80: 5c ac 00 05 bne r5,r12,800dc94 <_CORE_message_queue_Seize+0x108>
_ISR_Enable( level );
800dc84: d0 08 00 00 wcsr IE,r8
executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
800dc88: 34 01 00 04 mvi r1,4
800dc8c: 58 e1 00 34 sw (r7+52),r1
return;
800dc90: e0 00 00 0d bi 800dcc4 <_CORE_message_queue_Seize+0x138>
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
800dc94: 34 03 00 01 mvi r3,1
800dc98: 59 63 00 30 sw (r11+48),r3
}
_Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
executing->Wait.queue = &the_message_queue->Wait_queue;
800dc9c: 58 eb 00 44 sw (r7+68),r11
executing->Wait.id = id;
800dca0: 58 e2 00 20 sw (r7+32),r2
executing->Wait.return_argument_second.mutable_object = buffer;
800dca4: 58 e1 00 2c sw (r7+44),r1
executing->Wait.return_argument = size_p;
800dca8: 58 e4 00 28 sw (r7+40),r4
/* Wait.count will be filled in with the message priority */
_ISR_Enable( level );
800dcac: d0 08 00 00 wcsr IE,r8
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
800dcb0: 78 03 08 01 mvhi r3,0x801
800dcb4: b9 60 08 00 mv r1,r11
800dcb8: b8 c0 10 00 mv r2,r6
800dcbc: 38 63 0a 08 ori r3,r3,0xa08
800dcc0: f8 00 0a 17 calli 801051c <_Thread_queue_Enqueue_with_handler>
}
800dcc4: 2b 9d 00 04 lw ra,(sp+4)
800dcc8: 2b 8b 00 10 lw r11,(sp+16)
800dccc: 2b 8c 00 0c lw r12,(sp+12)
800dcd0: 2b 8d 00 08 lw r13,(sp+8)
800dcd4: 37 9c 00 10 addi sp,sp,16
800dcd8: c3 a0 00 00 ret
08004d10 <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
8004d10: 37 9c ff e8 addi sp,sp,-24
8004d14: 5b 8b 00 14 sw (sp+20),r11
8004d18: 5b 8c 00 10 sw (sp+16),r12
8004d1c: 5b 8d 00 0c sw (sp+12),r13
8004d20: 5b 8e 00 08 sw (sp+8),r14
8004d24: 5b 9d 00 04 sw (sp+4),ra
8004d28: b8 20 58 00 mv r11,r1
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
8004d2c: 78 01 08 01 mvhi r1,0x801
8004d30: 38 21 99 20 ori r1,r1,0x9920
8004d34: 28 21 00 00 lw r1,(r1+0)
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
8004d38: 5b 85 00 18 sw (sp+24),r5
8004d3c: b8 40 70 00 mv r14,r2
8004d40: b8 80 68 00 mv r13,r4
8004d44: 20 6c 00 ff andi r12,r3,0xff
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
8004d48: 44 20 00 0b be r1,r0,8004d74 <_CORE_mutex_Seize+0x64>
8004d4c: 45 80 00 0a be r12,r0,8004d74 <_CORE_mutex_Seize+0x64> <== NEVER TAKEN
8004d50: 78 01 08 01 mvhi r1,0x801
8004d54: 38 21 9a 98 ori r1,r1,0x9a98
8004d58: 28 21 00 00 lw r1,(r1+0)
8004d5c: 34 02 00 01 mvi r2,1
8004d60: 50 41 00 05 bgeu r2,r1,8004d74 <_CORE_mutex_Seize+0x64>
8004d64: 34 01 00 00 mvi r1,0
8004d68: 34 02 00 00 mvi r2,0
8004d6c: 34 03 00 12 mvi r3,18
8004d70: f8 00 02 0c calli 80055a0 <_Internal_error_Occurred>
8004d74: b9 60 08 00 mv r1,r11
8004d78: 37 82 00 18 addi r2,sp,24
8004d7c: f8 00 25 f0 calli 800e53c <_CORE_mutex_Seize_interrupt_trylock>
8004d80: 44 20 00 19 be r1,r0,8004de4 <_CORE_mutex_Seize+0xd4>
8004d84: 78 01 08 01 mvhi r1,0x801
8004d88: 38 21 9d f0 ori r1,r1,0x9df0
8004d8c: 5d 80 00 07 bne r12,r0,8004da8 <_CORE_mutex_Seize+0x98>
8004d90: 2b 82 00 18 lw r2,(sp+24)
8004d94: d0 02 00 00 wcsr IE,r2
8004d98: 28 21 00 0c lw r1,(r1+12)
8004d9c: 34 02 00 01 mvi r2,1
8004da0: 58 22 00 34 sw (r1+52),r2
8004da4: e0 00 00 10 bi 8004de4 <_CORE_mutex_Seize+0xd4>
8004da8: 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;
8004dac: 34 02 00 01 mvi r2,1
8004db0: 59 62 00 30 sw (r11+48),r2
8004db4: 58 2b 00 44 sw (r1+68),r11
8004db8: 58 2e 00 20 sw (r1+32),r14
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8004dbc: 78 01 08 01 mvhi r1,0x801
8004dc0: 38 21 99 20 ori r1,r1,0x9920
8004dc4: 28 22 00 00 lw r2,(r1+0)
8004dc8: 34 42 00 01 addi r2,r2,1
8004dcc: 58 22 00 00 sw (r1+0),r2
8004dd0: 2b 81 00 18 lw r1,(sp+24)
8004dd4: d0 01 00 00 wcsr IE,r1
8004dd8: b9 60 08 00 mv r1,r11
8004ddc: b9 a0 10 00 mv r2,r13
8004de0: fb ff ff ab calli 8004c8c <_CORE_mutex_Seize_interrupt_blocking>
}
8004de4: 2b 9d 00 04 lw ra,(sp+4)
8004de8: 2b 8b 00 14 lw r11,(sp+20)
8004dec: 2b 8c 00 10 lw r12,(sp+16)
8004df0: 2b 8d 00 0c lw r13,(sp+12)
8004df4: 2b 8e 00 08 lw r14,(sp+8)
8004df8: 37 9c 00 18 addi sp,sp,24
8004dfc: c3 a0 00 00 ret
08004f78 <_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
)
{
8004f78: 37 9c ff f8 addi sp,sp,-8
8004f7c: 5b 8b 00 08 sw (sp+8),r11
8004f80: 5b 9d 00 04 sw (sp+4),ra
8004f84: 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)) ) {
8004f88: f8 00 07 66 calli 8006d20 <_Thread_queue_Dequeue>
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
8004f8c: 34 02 00 00 mvi r2,0
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
8004f90: 5c 20 00 0d bne r1,r0,8004fc4 <_CORE_semaphore_Surrender+0x4c>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_semaphore_mp_support) ( the_thread, id );
#endif
} else {
_ISR_Disable( level );
8004f94: 90 00 08 00 rcsr r1,IE
8004f98: 34 02 ff fe mvi r2,-2
8004f9c: a0 22 10 00 and r2,r1,r2
8004fa0: d0 02 00 00 wcsr IE,r2
if ( the_semaphore->count < the_semaphore->Attributes.maximum_count )
8004fa4: 29 63 00 48 lw r3,(r11+72)
8004fa8: 29 64 00 40 lw r4,(r11+64)
the_semaphore->count += 1;
else
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
8004fac: 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 )
8004fb0: 50 64 00 04 bgeu r3,r4,8004fc0 <_CORE_semaphore_Surrender+0x48><== NEVER TAKEN
the_semaphore->count += 1;
8004fb4: 34 63 00 01 addi r3,r3,1
8004fb8: 59 63 00 48 sw (r11+72),r3
{
Thread_Control *the_thread;
ISR_Level level;
CORE_semaphore_Status status;
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
8004fbc: 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 );
8004fc0: d0 01 00 00 wcsr IE,r1
}
return status;
}
8004fc4: b8 40 08 00 mv r1,r2
8004fc8: 2b 9d 00 04 lw ra,(sp+4)
8004fcc: 2b 8b 00 08 lw r11,(sp+8)
8004fd0: 37 9c 00 08 addi sp,sp,8
8004fd4: c3 a0 00 00 ret
0800d938 <_Event_Surrender>:
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
800d938: 37 9c ff f8 addi sp,sp,-8
800d93c: 5b 8b 00 08 sw (sp+8),r11
800d940: 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 ];
800d944: 28 24 01 1c lw r4,(r1+284)
option_set = (rtems_option) the_thread->Wait.option;
800d948: 28 28 00 30 lw r8,(r1+48)
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
800d94c: 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 );
800d950: 90 00 08 00 rcsr r1,IE
800d954: 34 07 ff fe mvi r7,-2
800d958: a0 27 38 00 and r7,r1,r7
800d95c: d0 07 00 00 wcsr IE,r7
pending_events = api->pending_events;
800d960: 28 85 00 00 lw r5,(r4+0)
event_condition = (rtems_event_set) the_thread->Wait.count;
800d964: 29 66 00 24 lw r6,(r11+36)
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
rtems_event_set the_event_set,
rtems_event_set the_event_condition
)
{
return ( the_event_set & the_event_condition );
800d968: a0 c5 10 00 and r2,r6,r5
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
800d96c: 5c 40 00 03 bne r2,r0,800d978 <_Event_Surrender+0x40>
_ISR_Enable( level );
800d970: d0 01 00 00 wcsr IE,r1
return;
800d974: e0 00 00 3d bi 800da68 <_Event_Surrender+0x130>
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
800d978: 78 03 08 01 mvhi r3,0x801
800d97c: 38 63 9d f0 ori r3,r3,0x9df0
800d980: 28 69 00 08 lw r9,(r3+8)
800d984: 45 20 00 1a be r9,r0,800d9ec <_Event_Surrender+0xb4>
800d988: 28 63 00 0c lw r3,(r3+12)
800d98c: 5d 63 00 18 bne r11,r3,800d9ec <_Event_Surrender+0xb4>
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
800d990: 78 03 08 01 mvhi r3,0x801
800d994: 38 63 a2 e8 ori r3,r3,0xa2e8
800d998: 28 6a 00 00 lw r10,(r3+0)
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
800d99c: 34 09 00 02 mvi r9,2
800d9a0: 45 49 00 04 be r10,r9,800d9b0 <_Event_Surrender+0x78> <== NEVER TAKEN
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
800d9a4: 28 69 00 00 lw r9,(r3+0)
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
800d9a8: 34 03 00 01 mvi r3,1
800d9ac: 5d 23 00 10 bne r9,r3,800d9ec <_Event_Surrender+0xb4>
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
800d9b0: 44 46 00 03 be r2,r6,800d9bc <_Event_Surrender+0x84>
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_any (
rtems_option option_set
)
{
return (option_set & RTEMS_EVENT_ANY) ? true : false;
800d9b4: 21 08 00 02 andi r8,r8,0x2
800d9b8: 45 00 00 0b be r8,r0,800d9e4 <_Event_Surrender+0xac> <== 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) );
800d9bc: a4 40 18 00 not r3,r2
800d9c0: a0 65 28 00 and r5,r3,r5
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800d9c4: 29 63 00 28 lw r3,(r11+40)
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
800d9c8: 58 85 00 00 sw (r4+0),r5
the_thread->Wait.count = 0;
800d9cc: 59 60 00 24 sw (r11+36),r0
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800d9d0: 58 62 00 00 sw (r3+0),r2
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
800d9d4: 78 02 08 01 mvhi r2,0x801
800d9d8: 38 42 a2 e8 ori r2,r2,0xa2e8
800d9dc: 34 03 00 03 mvi r3,3
800d9e0: 58 43 00 00 sw (r2+0),r3
}
_ISR_Enable( level );
800d9e4: d0 01 00 00 wcsr IE,r1
return;
800d9e8: e0 00 00 20 bi 800da68 <_Event_Surrender+0x130>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_EVENT);
800d9ec: 29 63 00 10 lw r3,(r11+16)
800d9f0: 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 ) ) {
800d9f4: 44 60 00 1c be r3,r0,800da64 <_Event_Surrender+0x12c>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
800d9f8: 44 46 00 03 be r2,r6,800da04 <_Event_Surrender+0xcc>
800d9fc: 21 08 00 02 andi r8,r8,0x2
800da00: 45 00 00 19 be r8,r0,800da64 <_Event_Surrender+0x12c> <== NEVER TAKEN
800da04: a4 40 18 00 not r3,r2
800da08: a0 65 28 00 and r5,r3,r5
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800da0c: 29 63 00 28 lw r3,(r11+40)
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
800da10: 58 85 00 00 sw (r4+0),r5
the_thread->Wait.count = 0;
800da14: 59 60 00 24 sw (r11+36),r0
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
800da18: 58 62 00 00 sw (r3+0),r2
_ISR_Flash( level );
800da1c: d0 01 00 00 wcsr IE,r1
800da20: d0 07 00 00 wcsr IE,r7
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
800da24: 29 63 00 50 lw r3,(r11+80)
800da28: 34 02 00 02 mvi r2,2
800da2c: 44 62 00 03 be r3,r2,800da38 <_Event_Surrender+0x100>
_ISR_Enable( level );
800da30: d0 01 00 00 wcsr IE,r1
800da34: e0 00 00 06 bi 800da4c <_Event_Surrender+0x114>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
800da38: 34 02 00 03 mvi r2,3
800da3c: 59 62 00 50 sw (r11+80),r2
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
800da40: d0 01 00 00 wcsr IE,r1
(void) _Watchdog_Remove( &the_thread->Timer );
800da44: 35 61 00 48 addi r1,r11,72
800da48: fb ff e8 73 calli 8007c14 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800da4c: 78 03 08 01 mvhi r3,0x801
800da50: 38 63 80 9c ori r3,r3,0x809c
800da54: 28 62 00 00 lw r2,(r3+0)
800da58: b9 60 08 00 mv r1,r11
800da5c: f8 00 05 70 calli 800f01c <_Thread_Clear_state>
800da60: e0 00 00 02 bi 800da68 <_Event_Surrender+0x130>
_Thread_Unblock( the_thread );
}
return;
}
}
_ISR_Enable( level );
800da64: d0 01 00 00 wcsr IE,r1
}
800da68: 2b 9d 00 04 lw ra,(sp+4)
800da6c: 2b 8b 00 08 lw r11,(sp+8)
800da70: 37 9c 00 08 addi sp,sp,8
800da74: c3 a0 00 00 ret
0800da78 <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
800da78: 37 9c ff f8 addi sp,sp,-8
800da7c: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
800da80: 37 82 00 08 addi r2,sp,8
800da84: fb ff e3 ba calli 800696c <_Thread_Get>
switch ( location ) {
800da88: 2b 82 00 08 lw r2,(sp+8)
800da8c: 5c 40 00 1d bne r2,r0,800db00 <_Event_Timeout+0x88> <== NEVER TAKEN
*
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
_ISR_Disable( level );
800da90: 90 00 18 00 rcsr r3,IE
800da94: 34 02 ff fe mvi r2,-2
800da98: a0 62 10 00 and r2,r3,r2
800da9c: d0 02 00 00 wcsr IE,r2
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
800daa0: 78 02 08 01 mvhi r2,0x801
800daa4: 38 42 9d f0 ori r2,r2,0x9df0
return;
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
800daa8: 28 42 00 0c lw r2,(r2+12)
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
800daac: 58 20 00 24 sw (r1+36),r0
if ( _Thread_Is_executing( the_thread ) ) {
800dab0: 5c 22 00 08 bne r1,r2,800dad0 <_Event_Timeout+0x58>
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
800dab4: 78 02 08 01 mvhi r2,0x801
800dab8: 38 42 a2 e8 ori r2,r2,0xa2e8
800dabc: 28 45 00 00 lw r5,(r2+0)
800dac0: 34 04 00 01 mvi r4,1
800dac4: 5c a4 00 03 bne r5,r4,800dad0 <_Event_Timeout+0x58> <== ALWAYS TAKEN
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
800dac8: 34 04 00 02 mvi r4,2 <== NOT EXECUTED
800dacc: 58 44 00 00 sw (r2+0),r4 <== NOT EXECUTED
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
800dad0: 34 02 00 06 mvi r2,6
800dad4: 58 22 00 34 sw (r1+52),r2
_ISR_Enable( level );
800dad8: d0 03 00 00 wcsr IE,r3
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800dadc: 78 03 08 01 mvhi r3,0x801
800dae0: 38 63 80 9c ori r3,r3,0x809c
800dae4: 28 62 00 00 lw r2,(r3+0)
800dae8: f8 00 05 4d calli 800f01c <_Thread_Clear_state>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
800daec: 78 01 08 01 mvhi r1,0x801
800daf0: 38 21 99 20 ori r1,r1,0x9920
800daf4: 28 22 00 00 lw r2,(r1+0)
800daf8: 34 42 ff ff addi r2,r2,-1
800dafc: 58 22 00 00 sw (r1+0),r2
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
800db00: 2b 9d 00 04 lw ra,(sp+4)
800db04: 37 9c 00 08 addi sp,sp,8
800db08: c3 a0 00 00 ret
08009e30 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
8009e30: 37 9c ff b8 addi sp,sp,-72
8009e34: 5b 8b 00 40 sw (sp+64),r11
8009e38: 5b 8c 00 3c sw (sp+60),r12
8009e3c: 5b 8d 00 38 sw (sp+56),r13
8009e40: 5b 8e 00 34 sw (sp+52),r14
8009e44: 5b 8f 00 30 sw (sp+48),r15
8009e48: 5b 90 00 2c sw (sp+44),r16
8009e4c: 5b 91 00 28 sw (sp+40),r17
8009e50: 5b 92 00 24 sw (sp+36),r18
8009e54: 5b 93 00 20 sw (sp+32),r19
8009e58: 5b 94 00 1c sw (sp+28),r20
8009e5c: 5b 95 00 18 sw (sp+24),r21
8009e60: 5b 96 00 14 sw (sp+20),r22
8009e64: 5b 97 00 10 sw (sp+16),r23
8009e68: 5b 98 00 0c sw (sp+12),r24
8009e6c: 5b 99 00 08 sw (sp+8),r25
8009e70: 5b 9d 00 04 sw (sp+4),ra
8009e74: b8 40 70 00 mv r14,r2
Heap_Block *start_block = first_block;
Heap_Block *merge_below_block = NULL;
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
8009e78: 5b 80 00 48 sw (sp+72),r0
Heap_Block *extend_last_block = NULL;
8009e7c: 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;
8009e80: b5 c3 68 00 add r13,r14,r3
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
8009e84: b8 80 a0 00 mv r20,r4
8009e88: b8 20 58 00 mv r11,r1
8009e8c: b8 60 10 00 mv r2,r3
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
8009e90: 28 35 00 20 lw r21,(r1+32)
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
Heap_Block *extend_last_block = NULL;
uintptr_t const page_size = heap->page_size;
8009e94: 28 36 00 10 lw r22,(r1+16)
uintptr_t const min_block_size = heap->min_block_size;
8009e98: 28 24 00 14 lw r4,(r1+20)
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
uintptr_t const free_size = stats->free_size;
8009e9c: 28 37 00 30 lw r23,(r1+48)
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
return false;
8009ea0: 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 ) {
8009ea4: 55 cd 00 8e bgu r14,r13,800a0dc <_Heap_Extend+0x2ac>
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
8009ea8: b9 c0 08 00 mv r1,r14
8009eac: ba c0 18 00 mv r3,r22
8009eb0: 37 85 00 48 addi r5,sp,72
8009eb4: 37 86 00 44 addi r6,sp,68
8009eb8: fb ff e8 34 calli 8003f88 <_Heap_Get_first_and_last_block>
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
8009ebc: 44 20 00 88 be r1,r0,800a0dc <_Heap_Extend+0x2ac>
8009ec0: ba a0 78 00 mv r15,r21
8009ec4: 34 11 00 00 mvi r17,0
8009ec8: 34 13 00 00 mvi r19,0
8009ecc: 34 10 00 00 mvi r16,0
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
8009ed0: 29 61 00 18 lw r1,(r11+24)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8009ed4: 34 18 ff fe mvi r24,-2
8009ed8: e0 00 00 02 bi 8009ee0 <_Heap_Extend+0xb0>
8009edc: b9 e0 08 00 mv r1,r15
uintptr_t const sub_area_end = start_block->prev_size;
8009ee0: 29 f2 00 00 lw r18,(r15+0)
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
8009ee4: f5 a1 18 00 cmpgu r3,r13,r1
8009ee8: f6 4e 10 00 cmpgu r2,r18,r14
(uintptr_t) start_block : heap->area_begin;
uintptr_t const sub_area_end = start_block->prev_size;
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
8009eec: a0 62 10 00 and r2,r3,r2
8009ef0: 5c 40 00 7a bne r2,r0,800a0d8 <_Heap_Extend+0x2a8>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
8009ef4: 45 a1 00 03 be r13,r1,8009f00 <_Heap_Extend+0xd0>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
8009ef8: 56 4d 00 04 bgu r18,r13,8009f08 <_Heap_Extend+0xd8>
8009efc: e0 00 00 04 bi 8009f0c <_Heap_Extend+0xdc>
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
8009f00: b9 e0 80 00 mv r16,r15
8009f04: e0 00 00 02 bi 8009f0c <_Heap_Extend+0xdc>
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
8009f08: b9 e0 98 00 mv r19,r15
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
8009f0c: ba 40 08 00 mv r1,r18
8009f10: ba c0 10 00 mv r2,r22
8009f14: 36 59 ff f8 addi r25,r18,-8
8009f18: f8 00 20 ed calli 80122cc <__umodsi3>
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
8009f1c: cb 21 08 00 sub r1,r25,r1
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
8009f20: 5d d2 00 04 bne r14,r18,8009f30 <_Heap_Extend+0x100>
start_block->prev_size = extend_area_end;
8009f24: 59 ed 00 00 sw (r15+0),r13
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
8009f28: b8 20 60 00 mv r12,r1
8009f2c: e0 00 00 04 bi 8009f3c <_Heap_Extend+0x10c>
merge_above_block = end_block;
} else if ( sub_area_end < extend_area_begin ) {
8009f30: 55 d2 00 02 bgu r14,r18,8009f38 <_Heap_Extend+0x108>
8009f34: e0 00 00 02 bi 8009f3c <_Heap_Extend+0x10c>
8009f38: 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;
8009f3c: 28 2f 00 04 lw r15,(r1+4)
8009f40: a3 0f 78 00 and r15,r24,r15
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
8009f44: b4 2f 78 00 add r15,r1,r15
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
8009f48: 5d f5 ff e5 bne r15,r21,8009edc <_Heap_Extend+0xac>
if ( extend_area_begin < heap->area_begin ) {
8009f4c: 29 61 00 18 lw r1,(r11+24)
8009f50: 51 c1 00 03 bgeu r14,r1,8009f5c <_Heap_Extend+0x12c>
heap->area_begin = extend_area_begin;
8009f54: 59 6e 00 18 sw (r11+24),r14
8009f58: e0 00 00 04 bi 8009f68 <_Heap_Extend+0x138>
} else if ( heap->area_end < extend_area_end ) {
8009f5c: 29 61 00 1c lw r1,(r11+28)
8009f60: 50 2d 00 02 bgeu r1,r13,8009f68 <_Heap_Extend+0x138>
heap->area_end = extend_area_end;
8009f64: 59 6d 00 1c sw (r11+28),r13
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
8009f68: 2b 81 00 44 lw r1,(sp+68)
8009f6c: 2b 82 00 48 lw r2,(sp+72)
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
8009f70: 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;
8009f74: 58 4d 00 00 sw (r2+0),r13
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
8009f78: 38 64 00 01 ori r4,r3,0x1
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
8009f7c: 58 23 00 00 sw (r1+0),r3
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
8009f80: 29 63 00 20 lw r3,(r11+32)
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
8009f84: 58 44 00 04 sw (r2+4),r4
extend_first_block_size | HEAP_PREV_BLOCK_USED;
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
extend_last_block->size_and_flag = 0;
8009f88: 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 ) {
8009f8c: 50 43 00 03 bgeu r2,r3,8009f98 <_Heap_Extend+0x168>
heap->first_block = extend_first_block;
8009f90: 59 62 00 20 sw (r11+32),r2
8009f94: e0 00 00 04 bi 8009fa4 <_Heap_Extend+0x174>
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
8009f98: 29 62 00 24 lw r2,(r11+36)
8009f9c: 50 41 00 02 bgeu r2,r1,8009fa4 <_Heap_Extend+0x174>
heap->last_block = extend_last_block;
8009fa0: 59 61 00 24 sw (r11+36),r1
}
if ( merge_below_block != NULL ) {
8009fa4: 46 00 00 12 be r16,r0,8009fec <_Heap_Extend+0x1bc>
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
8009fa8: 29 6f 00 10 lw r15,(r11+16)
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
8009fac: 35 ce 00 08 addi r14,r14,8
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
8009fb0: b9 c0 08 00 mv r1,r14
8009fb4: b9 e0 10 00 mv r2,r15
8009fb8: f8 00 20 c5 calli 80122cc <__umodsi3>
if ( remainder != 0 ) {
8009fbc: 44 20 00 03 be r1,r0,8009fc8 <_Heap_Extend+0x198> <== ALWAYS TAKEN
return value - remainder + alignment;
8009fc0: b5 cf 70 00 add r14,r14,r15 <== NOT EXECUTED
8009fc4: c9 c1 70 00 sub r14,r14,r1 <== NOT EXECUTED
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
8009fc8: 2a 01 00 00 lw r1,(r16+0)
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const new_first_block_begin =
8009fcc: 35 c2 ff f8 addi r2,r14,-8
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
8009fd0: 59 c1 ff f8 sw (r14+-8),r1
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const new_first_block_begin =
new_first_block_alloc_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
8009fd4: ca 02 08 00 sub r1,r16,r2
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
8009fd8: 38 21 00 01 ori r1,r1,0x1
8009fdc: 58 41 00 04 sw (r2+4),r1
_Heap_Free_block( heap, new_first_block );
8009fe0: b9 60 08 00 mv r1,r11
8009fe4: fb ff ff 86 calli 8009dfc <_Heap_Free_block>
8009fe8: e0 00 00 06 bi 800a000 <_Heap_Extend+0x1d0>
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
_Heap_Merge_below( heap, extend_area_begin, merge_below_block );
} else if ( link_below_block != NULL ) {
8009fec: 46 70 00 05 be r19,r16,800a000 <_Heap_Extend+0x1d0>
_Heap_Link_below(
8009ff0: 2b 81 00 44 lw r1,(sp+68)
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
(link_begin - last_block_begin) | HEAP_PREV_BLOCK_USED;
8009ff4: ca 61 98 00 sub r19,r19,r1
8009ff8: 3a 73 00 01 ori r19,r19,0x1
)
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
8009ffc: 58 33 00 04 sw (r1+4),r19
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
800a000: 45 80 00 14 be r12,r0,800a050 <_Heap_Extend+0x220>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800a004: 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,
800a008: 35 ad ff f8 addi r13,r13,-8
uintptr_t extend_area_end
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
800a00c: c9 ac 68 00 sub r13,r13,r12
800a010: b9 a0 08 00 mv r1,r13
800a014: f8 00 20 ae calli 80122cc <__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)
800a018: 29 83 00 04 lw r3,(r12+4)
800a01c: c9 a1 08 00 sub r1,r13,r1
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
800a020: b4 2c 10 00 add r2,r1,r12
(last_block->size_and_flag - last_block_new_size)
800a024: c8 61 18 00 sub r3,r3,r1
| HEAP_PREV_BLOCK_USED;
800a028: 38 63 00 01 ori r3,r3,0x1
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
800a02c: 58 43 00 04 sw (r2+4),r3
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a030: 29 82 00 04 lw r2,(r12+4)
800a034: 20 42 00 01 andi r2,r2,0x1
block->size_and_flag = size | flag;
800a038: b8 22 08 00 or r1,r1,r2
800a03c: 59 81 00 04 sw (r12+4),r1
(last_block->size_and_flag - last_block_new_size)
| HEAP_PREV_BLOCK_USED;
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
800a040: b9 80 10 00 mv r2,r12
800a044: b9 60 08 00 mv r1,r11
800a048: fb ff ff 6d calli 8009dfc <_Heap_Free_block>
800a04c: e0 00 00 0c bi 800a07c <_Heap_Extend+0x24c>
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
800a050: 46 2c 00 0b be r17,r12,800a07c <_Heap_Extend+0x24c>
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a054: 2a 21 00 04 lw r1,(r17+4)
)
{
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
800a058: 2b 83 00 48 lw r3,(sp+72)
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
_Heap_Link_above(
800a05c: 2b 82 00 44 lw r2,(sp+68)
800a060: 20 21 00 01 andi r1,r1,0x1
)
{
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
800a064: c8 71 18 00 sub r3,r3,r17
block->size_and_flag = size | flag;
800a068: b8 61 08 00 or r1,r3,r1
800a06c: 5a 21 00 04 sw (r17+4),r1
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
800a070: 28 41 00 04 lw r1,(r2+4)
800a074: 38 21 00 01 ori r1,r1,0x1
800a078: 58 41 00 04 sw (r2+4),r1
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
800a07c: 65 8c 00 00 cmpei r12,r12,0
800a080: 66 10 00 00 cmpei r16,r16,0
800a084: a1 90 60 00 and r12,r12,r16
800a088: 45 80 00 04 be r12,r0,800a098 <_Heap_Extend+0x268>
_Heap_Free_block( heap, extend_first_block );
800a08c: 2b 82 00 48 lw r2,(sp+72)
800a090: b9 60 08 00 mv r1,r11
800a094: fb ff ff 5a calli 8009dfc <_Heap_Free_block>
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
heap->last_block,
(uintptr_t) heap->first_block - (uintptr_t) heap->last_block
800a098: 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(
800a09c: 29 63 00 20 lw r3,(r11+32)
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
800a0a0: 34 0c 00 01 mvi r12,1
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800a0a4: 28 22 00 04 lw r2,(r1+4)
* This feature will be used to terminate the scattered heap area list. See
* also _Heap_Extend().
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
800a0a8: 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;
800a0ac: 20 42 00 01 andi r2,r2,0x1
block->size_and_flag = size | flag;
800a0b0: b8 62 10 00 or r2,r3,r2
800a0b4: 58 22 00 04 sw (r1+4),r2
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
800a0b8: 29 61 00 30 lw r1,(r11+48)
/* Statistics */
stats->size += extended_size;
800a0bc: 29 62 00 2c lw r2,(r11+44)
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
800a0c0: c8 37 08 00 sub r1,r1,r23
/* Statistics */
stats->size += extended_size;
800a0c4: b4 41 10 00 add r2,r2,r1
800a0c8: 59 62 00 2c sw (r11+44),r2
if ( extended_size_ptr != NULL )
800a0cc: 46 80 00 04 be r20,r0,800a0dc <_Heap_Extend+0x2ac> <== NEVER TAKEN
*extended_size_ptr = extended_size;
800a0d0: 5a 81 00 00 sw (r20+0),r1
800a0d4: e0 00 00 02 bi 800a0dc <_Heap_Extend+0x2ac>
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
800a0d8: 34 0c 00 00 mvi r12,0
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
800a0dc: b9 80 08 00 mv r1,r12
800a0e0: 2b 9d 00 04 lw ra,(sp+4)
800a0e4: 2b 8b 00 40 lw r11,(sp+64)
800a0e8: 2b 8c 00 3c lw r12,(sp+60)
800a0ec: 2b 8d 00 38 lw r13,(sp+56)
800a0f0: 2b 8e 00 34 lw r14,(sp+52)
800a0f4: 2b 8f 00 30 lw r15,(sp+48)
800a0f8: 2b 90 00 2c lw r16,(sp+44)
800a0fc: 2b 91 00 28 lw r17,(sp+40)
800a100: 2b 92 00 24 lw r18,(sp+36)
800a104: 2b 93 00 20 lw r19,(sp+32)
800a108: 2b 94 00 1c lw r20,(sp+28)
800a10c: 2b 95 00 18 lw r21,(sp+24)
800a110: 2b 96 00 14 lw r22,(sp+20)
800a114: 2b 97 00 10 lw r23,(sp+16)
800a118: 2b 98 00 0c lw r24,(sp+12)
800a11c: 2b 99 00 08 lw r25,(sp+8)
800a120: 37 9c 00 48 addi sp,sp,72
800a124: c3 a0 00 00 ret
0800e920 <_Heap_Free>:
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
800e920: 37 9c ff f4 addi sp,sp,-12
800e924: 5b 8b 00 0c sw (sp+12),r11
800e928: 5b 8c 00 08 sw (sp+8),r12
800e92c: 5b 9d 00 04 sw (sp+4),ra
800e930: b8 20 58 00 mv r11,r1
800e934: 34 4c ff f8 addi r12,r2,-8
800e938: b8 40 08 00 mv r1,r2
800e93c: 29 62 00 10 lw r2,(r11+16)
800e940: f8 00 22 23 calli 80171cc <__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
800e944: 29 67 00 20 lw r7,(r11+32)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800e948: c9 81 18 00 sub r3,r12,r1
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800e94c: 34 01 00 00 mvi r1,0
800e950: 54 e3 00 03 bgu r7,r3,800e95c <_Heap_Free+0x3c>
800e954: 29 61 00 24 lw r1,(r11+36)
800e958: f0 23 08 00 cmpgeu r1,r1,r3
uintptr_t next_block_size = 0;
bool next_is_free = false;
_Heap_Protection_block_check( heap, block );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
800e95c: b8 20 10 00 mv r2,r1
return false;
800e960: 34 01 00 00 mvi r1,0
uintptr_t next_block_size = 0;
bool next_is_free = false;
_Heap_Protection_block_check( heap, block );
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
800e964: 44 40 00 66 be r2,r0,800eafc <_Heap_Free+0x1dc>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800e968: 28 66 00 04 lw r6,(r3+4)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800e96c: 34 04 ff fe mvi r4,-2
800e970: a0 c4 20 00 and r4,r6,r4
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800e974: b4 64 10 00 add r2,r3,r4
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800e978: 54 e2 00 03 bgu r7,r2,800e984 <_Heap_Free+0x64> <== NEVER TAKEN
800e97c: 29 61 00 24 lw r1,(r11+36)
800e980: f0 22 08 00 cmpgeu r1,r1,r2
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
800e984: b8 20 28 00 mv r5,r1
_HAssert( false );
return false;
800e988: 34 01 00 00 mvi r1,0
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
800e98c: 44 a0 00 5c be r5,r0,800eafc <_Heap_Free+0x1dc> <== NEVER TAKEN
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800e990: 28 45 00 04 lw r5,(r2+4)
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800e994: 20 a8 00 01 andi r8,r5,0x1
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
_HAssert( false );
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
800e998: 45 00 00 59 be r8,r0,800eafc <_Heap_Free+0x1dc> <== NEVER TAKEN
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
800e99c: 29 69 00 24 lw r9,(r11+36)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800e9a0: 34 01 ff fe mvi r1,-2
800e9a4: a0 a1 28 00 and r5,r5,r1
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
800e9a8: 34 08 00 00 mvi r8,0
800e9ac: 45 22 00 05 be r9,r2,800e9c0 <_Heap_Free+0xa0>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
800e9b0: b4 45 08 00 add r1,r2,r5
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800e9b4: 28 28 00 04 lw r8,(r1+4)
800e9b8: 21 08 00 01 andi r8,r8,0x1
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
800e9bc: 65 08 00 00 cmpei r8,r8,0
800e9c0: 20 c6 00 01 andi r6,r6,0x1
if ( !_Heap_Protection_determine_block_free( heap, block ) ) {
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
800e9c4: 21 08 00 ff andi r8,r8,0xff
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
800e9c8: 5c c0 00 24 bne r6,r0,800ea58 <_Heap_Free+0x138>
uintptr_t const prev_size = block->prev_size;
800e9cc: 28 66 00 00 lw r6,(r3+0)
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800e9d0: 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);
800e9d4: c8 66 18 00 sub r3,r3,r6
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800e9d8: 54 e3 00 02 bgu r7,r3,800e9e0 <_Heap_Free+0xc0> <== NEVER TAKEN
800e9dc: f1 23 08 00 cmpgeu r1,r9,r3
Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size );
if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) {
800e9e0: b8 20 38 00 mv r7,r1
_HAssert( false );
return( false );
800e9e4: 34 01 00 00 mvi r1,0
if ( !_Heap_Is_prev_used( block ) ) {
uintptr_t const prev_size = block->prev_size;
Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size );
if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) {
800e9e8: 44 e0 00 45 be r7,r0,800eafc <_Heap_Free+0x1dc> <== NEVER TAKEN
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800e9ec: 28 67 00 04 lw r7,(r3+4)
800e9f0: 20 e7 00 01 andi r7,r7,0x1
return( false );
}
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
800e9f4: 44 e0 00 42 be r7,r0,800eafc <_Heap_Free+0x1dc> <== NEVER TAKEN
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
800e9f8: 45 00 00 0f be r8,r0,800ea34 <_Heap_Free+0x114>
return _Heap_Free_list_tail(heap)->prev;
}
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
800e9fc: 28 41 00 08 lw r1,(r2+8)
Heap_Block *prev = block->prev;
800ea00: 28 42 00 0c lw r2,(r2+12)
uintptr_t const size = block_size + prev_size + next_block_size;
800ea04: b4 85 28 00 add r5,r4,r5
800ea08: b4 a6 30 00 add r6,r5,r6
prev->next = next;
800ea0c: 58 41 00 08 sw (r2+8),r1
next->prev = prev;
800ea10: 58 22 00 0c sw (r1+12),r2
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
800ea14: 29 61 00 38 lw r1,(r11+56)
800ea18: 34 21 ff ff addi r1,r1,-1
800ea1c: 59 61 00 38 sw (r11+56),r1
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800ea20: 38 c1 00 01 ori r1,r6,0x1
800ea24: 58 61 00 04 sw (r3+4),r1
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
800ea28: b4 66 18 00 add r3,r3,r6
800ea2c: 58 66 00 00 sw (r3+0),r6
800ea30: e0 00 00 29 bi 800ead4 <_Heap_Free+0x1b4>
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
800ea34: b4 86 30 00 add r6,r4,r6
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800ea38: 38 c1 00 01 ori r1,r6,0x1
800ea3c: 58 61 00 04 sw (r3+4),r1
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800ea40: 28 43 00 04 lw r3,(r2+4)
800ea44: 34 01 ff fe mvi r1,-2
next_block->prev_size = size;
800ea48: 58 46 00 00 sw (r2+0),r6
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800ea4c: a0 61 08 00 and r1,r3,r1
800ea50: 58 41 00 04 sw (r2+4),r1
800ea54: e0 00 00 20 bi 800ead4 <_Heap_Free+0x1b4>
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
800ea58: 45 00 00 0d be r8,r0,800ea8c <_Heap_Free+0x16c>
uintptr_t const size = block_size + next_block_size;
800ea5c: b4 a4 08 00 add r1,r5,r4
RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace(
Heap_Block *old_block,
Heap_Block *new_block
)
{
Heap_Block *next = old_block->next;
800ea60: 28 45 00 08 lw r5,(r2+8)
Heap_Block *prev = old_block->prev;
800ea64: 28 42 00 0c lw r2,(r2+12)
new_block->next = next;
800ea68: 58 65 00 08 sw (r3+8),r5
new_block->prev = prev;
800ea6c: 58 62 00 0c sw (r3+12),r2
next->prev = new_block;
prev->next = new_block;
800ea70: 58 43 00 08 sw (r2+8),r3
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
800ea74: 38 22 00 01 ori r2,r1,0x1
Heap_Block *prev = old_block->prev;
new_block->next = next;
new_block->prev = prev;
next->prev = new_block;
800ea78: 58 a3 00 0c sw (r5+12),r3
800ea7c: 58 62 00 04 sw (r3+4),r2
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
800ea80: b4 61 18 00 add r3,r3,r1
800ea84: 58 61 00 00 sw (r3+0),r1
800ea88: e0 00 00 13 bi 800ead4 <_Heap_Free+0x1b4>
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
800ea8c: 29 61 00 08 lw r1,(r11+8)
new_block->next = next;
new_block->prev = block_before;
800ea90: 58 6b 00 0c sw (r3+12),r11
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
800ea94: 58 44 00 00 sw (r2+0),r4
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
new_block->next = next;
800ea98: 58 61 00 08 sw (r3+8),r1
new_block->prev = block_before;
block_before->next = new_block;
next->prev = new_block;
800ea9c: 58 23 00 0c sw (r1+12),r3
next_block->prev_size = size;
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
800eaa0: 38 81 00 01 ori r1,r4,0x1
800eaa4: 58 61 00 04 sw (r3+4),r1
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
800eaa8: 59 63 00 08 sw (r11+8),r3
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
800eaac: 28 43 00 04 lw r3,(r2+4)
800eab0: 34 01 ff fe mvi r1,-2
800eab4: a0 61 08 00 and r1,r3,r1
800eab8: 58 41 00 04 sw (r2+4),r1
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
800eabc: 29 61 00 38 lw r1,(r11+56)
if ( stats->max_free_blocks < stats->free_blocks ) {
800eac0: 29 62 00 3c lw r2,(r11+60)
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
800eac4: 34 21 00 01 addi r1,r1,1
800eac8: 59 61 00 38 sw (r11+56),r1
if ( stats->max_free_blocks < stats->free_blocks ) {
800eacc: 50 41 00 02 bgeu r2,r1,800ead4 <_Heap_Free+0x1b4>
stats->max_free_blocks = stats->free_blocks;
800ead0: 59 61 00 3c sw (r11+60),r1
}
}
/* Statistics */
--stats->used_blocks;
800ead4: 29 61 00 40 lw r1,(r11+64)
800ead8: 34 21 ff ff addi r1,r1,-1
800eadc: 59 61 00 40 sw (r11+64),r1
++stats->frees;
800eae0: 29 61 00 50 lw r1,(r11+80)
800eae4: 34 21 00 01 addi r1,r1,1
800eae8: 59 61 00 50 sw (r11+80),r1
stats->free_size += block_size;
800eaec: 29 61 00 30 lw r1,(r11+48)
800eaf0: b4 24 20 00 add r4,r1,r4
800eaf4: 59 64 00 30 sw (r11+48),r4
return( true );
800eaf8: 34 01 00 01 mvi r1,1
}
800eafc: 2b 9d 00 04 lw ra,(sp+4)
800eb00: 2b 8b 00 0c lw r11,(sp+12)
800eb04: 2b 8c 00 08 lw r12,(sp+8)
800eb08: 37 9c 00 0c addi sp,sp,12
800eb0c: c3 a0 00 00 ret
0800eb10 <_Heap_Resize_block>:
void *alloc_begin_ptr,
uintptr_t new_alloc_size,
uintptr_t *old_size,
uintptr_t *new_size
)
{
800eb10: 37 9c ff e4 addi sp,sp,-28
800eb14: 5b 8b 00 1c sw (sp+28),r11
800eb18: 5b 8c 00 18 sw (sp+24),r12
800eb1c: 5b 8d 00 14 sw (sp+20),r13
800eb20: 5b 8e 00 10 sw (sp+16),r14
800eb24: 5b 8f 00 0c sw (sp+12),r15
800eb28: 5b 90 00 08 sw (sp+8),r16
800eb2c: 5b 9d 00 04 sw (sp+4),ra
800eb30: b8 20 58 00 mv r11,r1
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800eb34: 34 50 ff f8 addi r16,r2,-8
800eb38: b8 40 08 00 mv r1,r2
800eb3c: b8 40 60 00 mv r12,r2
800eb40: 29 62 00 10 lw r2,(r11+16)
800eb44: b8 80 78 00 mv r15,r4
800eb48: b8 a0 68 00 mv r13,r5
800eb4c: b8 60 70 00 mv r14,r3
800eb50: f8 00 21 9f calli 80171cc <__umodsi3>
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800eb54: 29 62 00 20 lw r2,(r11+32)
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *const block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
*old_size = 0;
800eb58: 59 e0 00 00 sw (r15+0),r0
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800eb5c: ca 01 30 00 sub r6,r16,r1
*new_size = 0;
800eb60: 59 a0 00 00 sw (r13+0),r0
new_alloc_size,
old_size,
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
800eb64: 34 01 00 02 mvi r1,2
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800eb68: 54 46 00 38 bgu r2,r6,800ec48 <_Heap_Resize_block+0x138>
800eb6c: 29 62 00 24 lw r2,(r11+36)
800eb70: 54 c2 00 36 bgu r6,r2,800ec48 <_Heap_Resize_block+0x138> <== NEVER TAKEN
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800eb74: 28 c2 00 04 lw r2,(r6+4)
800eb78: 34 01 ff fe mvi r1,-2
800eb7c: a0 22 10 00 and r2,r1,r2
{
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t block_size = _Heap_Block_size( block );
uintptr_t block_end = block_begin + block_size;
800eb80: b4 c2 38 00 add r7,r6,r2
800eb84: 28 e8 00 04 lw r8,(r7+4)
uintptr_t alloc_size = block_end - alloc_begin + HEAP_ALLOC_BONUS;
800eb88: c8 ec 48 00 sub r9,r7,r12
800eb8c: 35 29 00 04 addi r9,r9,4
800eb90: a0 28 40 00 and r8,r1,r8
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
800eb94: b4 e8 08 00 add r1,r7,r8
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800eb98: 28 23 00 04 lw r3,(r1+4)
bool next_block_is_free = _Heap_Is_free( next_block );;
_HAssert( _Heap_Is_block_in_heap( heap, next_block ) );
_HAssert( _Heap_Is_prev_used( next_block ) );
*old_size = alloc_size;
800eb9c: 59 e9 00 00 sw (r15+0),r9
800eba0: 20 63 00 01 andi r3,r3,0x1
RTEMS_INLINE_ROUTINE bool _Heap_Is_free(
const Heap_Block *block
)
{
return !_Heap_Is_used( block );
800eba4: 18 63 00 01 xori r3,r3,0x1
if ( next_block_is_free ) {
800eba8: 44 60 00 03 be r3,r0,800ebb4 <_Heap_Resize_block+0xa4>
block_size += next_block_size;
800ebac: b4 48 10 00 add r2,r2,r8
alloc_size += next_block_size;
800ebb0: b5 28 48 00 add r9,r9,r8
}
if ( new_alloc_size > alloc_size ) {
return HEAP_RESIZE_UNSATISFIED;
800ebb4: 34 01 00 01 mvi r1,1
if ( next_block_is_free ) {
block_size += next_block_size;
alloc_size += next_block_size;
}
if ( new_alloc_size > alloc_size ) {
800ebb8: 55 c9 00 24 bgu r14,r9,800ec48 <_Heap_Resize_block+0x138>
return HEAP_RESIZE_UNSATISFIED;
}
if ( next_block_is_free ) {
800ebbc: 44 60 00 13 be r3,r0,800ec08 <_Heap_Resize_block+0xf8>
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800ebc0: 28 c1 00 04 lw r1,(r6+4)
}
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
800ebc4: 28 e3 00 0c lw r3,(r7+12)
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
800ebc8: 20 21 00 01 andi r1,r1,0x1
block->size_and_flag = size | flag;
800ebcc: b8 41 08 00 or r1,r2,r1
800ebd0: 58 c1 00 04 sw (r6+4),r1
return _Heap_Free_list_tail(heap)->prev;
}
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
800ebd4: 28 e1 00 08 lw r1,(r7+8)
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800ebd8: b4 46 10 00 add r2,r2,r6
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
800ebdc: 58 61 00 08 sw (r3+8),r1
next->prev = prev;
800ebe0: 58 23 00 0c sw (r1+12),r3
_Heap_Block_set_size( block, block_size );
_Heap_Free_list_remove( next_block );
next_block = _Heap_Block_at( block, block_size );
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
800ebe4: 28 41 00 04 lw r1,(r2+4)
800ebe8: 38 21 00 01 ori r1,r1,0x1
800ebec: 58 41 00 04 sw (r2+4),r1
/* Statistics */
--stats->free_blocks;
800ebf0: 29 61 00 38 lw r1,(r11+56)
800ebf4: 34 21 ff ff addi r1,r1,-1
800ebf8: 59 61 00 38 sw (r11+56),r1
stats->free_size -= next_block_size;
800ebfc: 29 61 00 30 lw r1,(r11+48)
800ec00: c8 28 40 00 sub r8,r1,r8
800ec04: 59 68 00 30 sw (r11+48),r8
}
block = _Heap_Block_allocate( heap, block, alloc_begin, new_alloc_size );
800ec08: b9 80 18 00 mv r3,r12
800ec0c: b8 c0 10 00 mv r2,r6
800ec10: b9 60 08 00 mv r1,r11
800ec14: b9 c0 20 00 mv r4,r14
800ec18: fb ff da 06 calli 8005430 <_Heap_Block_allocate>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800ec1c: 28 23 00 04 lw r3,(r1+4)
800ec20: 34 02 ff fe mvi r2,-2
800ec24: a0 43 10 00 and r2,r2,r3
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800ec28: 34 42 00 04 addi r2,r2,4
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
*new_size = (uintptr_t) next_block - alloc_begin + HEAP_ALLOC_BONUS;
800ec2c: c8 4c 60 00 sub r12,r2,r12
800ec30: b4 2c 08 00 add r1,r1,r12
800ec34: 59 a1 00 00 sw (r13+0),r1
/* Statistics */
++stats->resizes;
800ec38: 29 61 00 54 lw r1,(r11+84)
800ec3c: 34 21 00 01 addi r1,r1,1
800ec40: 59 61 00 54 sw (r11+84),r1
return HEAP_RESIZE_SUCCESSFUL;
800ec44: 34 01 00 00 mvi r1,0
new_size
);
} else {
return HEAP_RESIZE_FATAL_ERROR;
}
}
800ec48: 2b 9d 00 04 lw ra,(sp+4)
800ec4c: 2b 8b 00 1c lw r11,(sp+28)
800ec50: 2b 8c 00 18 lw r12,(sp+24)
800ec54: 2b 8d 00 14 lw r13,(sp+20)
800ec58: 2b 8e 00 10 lw r14,(sp+16)
800ec5c: 2b 8f 00 0c lw r15,(sp+12)
800ec60: 2b 90 00 08 lw r16,(sp+8)
800ec64: 37 9c 00 1c addi sp,sp,28
800ec68: c3 a0 00 00 ret
0800ec6c <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
800ec6c: 37 9c ff ec addi sp,sp,-20
800ec70: 5b 8b 00 14 sw (sp+20),r11
800ec74: 5b 8c 00 10 sw (sp+16),r12
800ec78: 5b 8d 00 0c sw (sp+12),r13
800ec7c: 5b 8e 00 08 sw (sp+8),r14
800ec80: 5b 9d 00 04 sw (sp+4),ra
800ec84: b8 20 58 00 mv r11,r1
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
800ec88: 34 4e ff f8 addi r14,r2,-8
800ec8c: b8 40 08 00 mv r1,r2
800ec90: b8 40 60 00 mv r12,r2
800ec94: 29 62 00 10 lw r2,(r11+16)
800ec98: b8 60 68 00 mv r13,r3
800ec9c: f8 00 21 4c calli 80171cc <__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
800eca0: 29 62 00 20 lw r2,(r11+32)
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
800eca4: c9 c1 20 00 sub r4,r14,r1
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800eca8: 34 01 00 00 mvi r1,0
800ecac: 54 44 00 03 bgu r2,r4,800ecb8 <_Heap_Size_of_alloc_area+0x4c>
800ecb0: 29 61 00 24 lw r1,(r11+36)
800ecb4: f0 24 08 00 cmpgeu r1,r1,r4
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
Heap_Block *next_block = NULL;
uintptr_t block_size = 0;
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
800ecb8: b8 20 18 00 mv r3,r1
return false;
800ecbc: 34 01 00 00 mvi r1,0
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
Heap_Block *next_block = NULL;
uintptr_t block_size = 0;
if ( !_Heap_Is_block_in_heap( heap, block ) ) {
800ecc0: 44 60 00 13 be r3,r0,800ed0c <_Heap_Size_of_alloc_area+0xa0>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
800ecc4: 28 83 00 04 lw r3,(r4+4)
800ecc8: 34 01 ff fe mvi r1,-2
800eccc: a0 23 08 00 and r1,r1,r3
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
800ecd0: b4 81 20 00 add r4,r4,r1
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
800ecd4: 34 01 00 00 mvi r1,0
800ecd8: 54 44 00 03 bgu r2,r4,800ece4 <_Heap_Size_of_alloc_area+0x78><== NEVER TAKEN
800ecdc: 29 61 00 24 lw r1,(r11+36)
800ece0: f0 24 08 00 cmpgeu r1,r1,r4
}
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
800ece4: b8 20 10 00 mv r2,r1
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
) {
return false;
800ece8: 34 01 00 00 mvi r1,0
}
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
800ecec: 44 40 00 08 be r2,r0,800ed0c <_Heap_Size_of_alloc_area+0xa0><== NEVER TAKEN
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
800ecf0: 28 82 00 04 lw r2,(r4+4)
800ecf4: 20 42 00 01 andi r2,r2,0x1
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
800ecf8: 44 40 00 05 be r2,r0,800ed0c <_Heap_Size_of_alloc_area+0xa0><== NEVER TAKEN
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
800ecfc: c8 8c 20 00 sub r4,r4,r12
800ed00: 34 84 00 04 addi r4,r4,4
800ed04: 59 a4 00 00 sw (r13+0),r4
return true;
800ed08: 34 01 00 01 mvi r1,1
}
800ed0c: 2b 9d 00 04 lw ra,(sp+4)
800ed10: 2b 8b 00 14 lw r11,(sp+20)
800ed14: 2b 8c 00 10 lw r12,(sp+16)
800ed18: 2b 8d 00 0c lw r13,(sp+12)
800ed1c: 2b 8e 00 08 lw r14,(sp+8)
800ed20: 37 9c 00 14 addi sp,sp,20
800ed24: c3 a0 00 00 ret
08004c00 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
8004c00: 37 9c ff a0 addi sp,sp,-96
8004c04: 5b 8b 00 50 sw (sp+80),r11
8004c08: 5b 8c 00 4c sw (sp+76),r12
8004c0c: 5b 8d 00 48 sw (sp+72),r13
8004c10: 5b 8e 00 44 sw (sp+68),r14
8004c14: 5b 8f 00 40 sw (sp+64),r15
8004c18: 5b 90 00 3c sw (sp+60),r16
8004c1c: 5b 91 00 38 sw (sp+56),r17
8004c20: 5b 92 00 34 sw (sp+52),r18
8004c24: 5b 93 00 30 sw (sp+48),r19
8004c28: 5b 94 00 2c sw (sp+44),r20
8004c2c: 5b 95 00 28 sw (sp+40),r21
8004c30: 5b 96 00 24 sw (sp+36),r22
8004c34: 5b 97 00 20 sw (sp+32),r23
8004c38: 5b 98 00 1c sw (sp+28),r24
8004c3c: 5b 99 00 18 sw (sp+24),r25
8004c40: 5b 9b 00 14 sw (sp+20),fp
8004c44: 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;
8004c48: 78 0d 08 00 mvhi r13,0x800
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
8004c4c: 20 63 00 ff andi r3,r3,0xff
8004c50: b8 20 60 00 mv r12,r1
8004c54: b8 40 70 00 mv r14,r2
uintptr_t const page_size = heap->page_size;
8004c58: 28 33 00 10 lw r19,(r1+16)
uintptr_t const min_block_size = heap->min_block_size;
8004c5c: 28 35 00 14 lw r21,(r1+20)
Heap_Block *const first_block = heap->first_block;
8004c60: 28 34 00 20 lw r20,(r1+32)
Heap_Block *const last_block = heap->last_block;
8004c64: 28 36 00 24 lw r22,(r1+36)
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
8004c68: 39 ad 4b 68 ori r13,r13,0x4b68
8004c6c: 44 60 00 03 be r3,r0,8004c78 <_Heap_Walk+0x78>
8004c70: 78 0d 08 00 mvhi r13,0x800
8004c74: 39 ad 4b 8c ori r13,r13,0x4b8c
if ( !_System_state_Is_up( _System_state_Get() ) ) {
8004c78: 78 03 08 01 mvhi r3,0x801
8004c7c: 38 63 6a 68 ori r3,r3,0x6a68
8004c80: 28 67 00 00 lw r7,(r3+0)
8004c84: 34 02 00 03 mvi r2,3
return true;
8004c88: 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() ) ) {
8004c8c: 5c e2 01 08 bne r7,r2,80050ac <_Heap_Walk+0x4ac> <== NEVER TAKEN
Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
(*printer)(
8004c90: 29 81 00 08 lw r1,(r12+8)
8004c94: 29 86 00 18 lw r6,(r12+24)
8004c98: 29 87 00 1c lw r7,(r12+28)
8004c9c: 5b 81 00 08 sw (sp+8),r1
8004ca0: 29 81 00 0c lw r1,(r12+12)
8004ca4: 78 03 08 01 mvhi r3,0x801
8004ca8: 5b 96 00 04 sw (sp+4),r22
8004cac: 5b 81 00 0c sw (sp+12),r1
8004cb0: 34 02 00 00 mvi r2,0
8004cb4: b9 c0 08 00 mv r1,r14
8004cb8: 38 63 40 d0 ori r3,r3,0x40d0
8004cbc: ba 60 20 00 mv r4,r19
8004cc0: ba a0 28 00 mv r5,r21
8004cc4: ba 80 40 00 mv r8,r20
8004cc8: d9 a0 00 00 call r13
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
8004ccc: 5e 60 00 06 bne r19,r0,8004ce4 <_Heap_Walk+0xe4>
(*printer)( source, true, "page size is zero\n" );
8004cd0: 78 03 08 01 mvhi r3,0x801
8004cd4: b9 c0 08 00 mv r1,r14
8004cd8: 34 02 00 01 mvi r2,1
8004cdc: 38 63 41 64 ori r3,r3,0x4164
8004ce0: e0 00 00 25 bi 8004d74 <_Heap_Walk+0x174>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
8004ce4: 22 6f 00 07 andi r15,r19,0x7
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
8004ce8: 45 e0 00 07 be r15,r0,8004d04 <_Heap_Walk+0x104>
(*printer)(
8004cec: 78 03 08 01 mvhi r3,0x801
8004cf0: b9 c0 08 00 mv r1,r14
8004cf4: 34 02 00 01 mvi r2,1
8004cf8: 38 63 41 78 ori r3,r3,0x4178
8004cfc: ba 60 20 00 mv r4,r19
8004d00: e0 00 01 04 bi 8005110 <_Heap_Walk+0x510>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8004d04: ba a0 08 00 mv r1,r21
8004d08: ba 60 10 00 mv r2,r19
8004d0c: fb ff ef 9b calli 8000b78 <__umodsi3>
8004d10: b8 20 58 00 mv r11,r1
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
8004d14: 44 2f 00 07 be r1,r15,8004d30 <_Heap_Walk+0x130>
(*printer)(
8004d18: 78 03 08 01 mvhi r3,0x801
8004d1c: b9 c0 08 00 mv r1,r14
8004d20: 34 02 00 01 mvi r2,1
8004d24: 38 63 41 98 ori r3,r3,0x4198
8004d28: ba a0 20 00 mv r4,r21
8004d2c: e0 00 00 f9 bi 8005110 <_Heap_Walk+0x510>
8004d30: 36 81 00 08 addi r1,r20,8
8004d34: ba 60 10 00 mv r2,r19
8004d38: fb ff ef 90 calli 8000b78 <__umodsi3>
);
return false;
}
if (
8004d3c: 44 2b 00 07 be r1,r11,8004d58 <_Heap_Walk+0x158>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
8004d40: 78 03 08 01 mvhi r3,0x801
8004d44: b9 c0 08 00 mv r1,r14
8004d48: 34 02 00 01 mvi r2,1
8004d4c: 38 63 41 bc ori r3,r3,0x41bc
8004d50: ba 80 20 00 mv r4,r20
8004d54: e0 00 00 ef bi 8005110 <_Heap_Walk+0x510>
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8004d58: 2a 82 00 04 lw r2,(r20+4)
8004d5c: 20 42 00 01 andi r2,r2,0x1
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
8004d60: 5c 41 00 07 bne r2,r1,8004d7c <_Heap_Walk+0x17c>
(*printer)(
8004d64: 78 03 08 01 mvhi r3,0x801
8004d68: b9 c0 08 00 mv r1,r14
8004d6c: 34 02 00 01 mvi r2,1
8004d70: 38 63 41 f0 ori r3,r3,0x41f0
8004d74: d9 a0 00 00 call r13
8004d78: e0 00 00 40 bi 8004e78 <_Heap_Walk+0x278>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8004d7c: 2a cf 00 04 lw r15,(r22+4)
8004d80: 34 02 ff fe mvi r2,-2
8004d84: a0 4f 78 00 and r15,r2,r15
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
8004d88: b6 cf 78 00 add r15,r22,r15
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8004d8c: 29 e2 00 04 lw r2,(r15+4)
8004d90: 20 42 00 01 andi r2,r2,0x1
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
8004d94: 5c 41 00 06 bne r2,r1,8004dac <_Heap_Walk+0x1ac>
(*printer)(
8004d98: 78 03 08 01 mvhi r3,0x801
8004d9c: b9 c0 08 00 mv r1,r14
8004da0: 34 02 00 01 mvi r2,1
8004da4: 38 63 42 20 ori r3,r3,0x4220
8004da8: e3 ff ff f3 bi 8004d74 <_Heap_Walk+0x174>
);
return false;
}
if (
8004dac: 45 f4 00 06 be r15,r20,8004dc4 <_Heap_Walk+0x1c4> <== ALWAYS TAKEN
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
8004db0: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED
8004db4: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
8004db8: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8004dbc: 38 63 42 38 ori r3,r3,0x4238 <== NOT EXECUTED
8004dc0: e3 ff ff ed bi 8004d74 <_Heap_Walk+0x174> <== NOT EXECUTED
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
8004dc4: 29 92 00 10 lw r18,(r12+16)
block = next_block;
} while ( block != first_block );
return true;
}
8004dc8: 29 8b 00 08 lw r11,(r12+8)
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
8004dcc: b9 80 80 00 mv r16,r12
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8004dd0: 34 11 ff fe mvi r17,-2
8004dd4: e0 00 00 2d bi 8004e88 <_Heap_Walk+0x288>
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
8004dd8: 29 83 00 20 lw r3,(r12+32)
8004ddc: 34 01 00 00 mvi r1,0
8004de0: 54 6b 00 03 bgu r3,r11,8004dec <_Heap_Walk+0x1ec>
8004de4: 29 81 00 24 lw r1,(r12+36)
8004de8: f0 2b 08 00 cmpgeu r1,r1,r11
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
8004dec: 5c 20 00 06 bne r1,r0,8004e04 <_Heap_Walk+0x204>
(*printer)(
8004df0: 78 03 08 01 mvhi r3,0x801
8004df4: b9 c0 08 00 mv r1,r14
8004df8: 34 02 00 01 mvi r2,1
8004dfc: 38 63 42 68 ori r3,r3,0x4268
8004e00: e0 00 00 14 bi 8004e50 <_Heap_Walk+0x250>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8004e04: 35 61 00 08 addi r1,r11,8
8004e08: ba 40 10 00 mv r2,r18
8004e0c: fb ff ef 5b calli 8000b78 <__umodsi3>
);
return false;
}
if (
8004e10: 44 20 00 06 be r1,r0,8004e28 <_Heap_Walk+0x228>
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
8004e14: 78 03 08 01 mvhi r3,0x801
8004e18: b9 c0 08 00 mv r1,r14
8004e1c: 34 02 00 01 mvi r2,1
8004e20: 38 63 42 88 ori r3,r3,0x4288
8004e24: e0 00 00 0b bi 8004e50 <_Heap_Walk+0x250>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8004e28: 29 63 00 04 lw r3,(r11+4)
8004e2c: a2 23 18 00 and r3,r17,r3
block = next_block;
} while ( block != first_block );
return true;
}
8004e30: b5 63 18 00 add r3,r11,r3
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8004e34: 28 63 00 04 lw r3,(r3+4)
8004e38: 20 63 00 01 andi r3,r3,0x1
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
8004e3c: 44 61 00 07 be r3,r1,8004e58 <_Heap_Walk+0x258>
(*printer)(
8004e40: 78 03 08 01 mvhi r3,0x801
8004e44: b9 c0 08 00 mv r1,r14
8004e48: 34 02 00 01 mvi r2,1
8004e4c: 38 63 42 b8 ori r3,r3,0x42b8
8004e50: b9 60 20 00 mv r4,r11
8004e54: e0 00 00 af bi 8005110 <_Heap_Walk+0x510>
);
return false;
}
if ( free_block->prev != prev_block ) {
8004e58: 29 65 00 0c lw r5,(r11+12)
8004e5c: 44 b0 00 09 be r5,r16,8004e80 <_Heap_Walk+0x280>
(*printer)(
8004e60: 78 03 08 01 mvhi r3,0x801
8004e64: b9 c0 08 00 mv r1,r14
8004e68: 34 02 00 01 mvi r2,1
8004e6c: 38 63 42 d4 ori r3,r3,0x42d4
8004e70: b9 60 20 00 mv r4,r11
8004e74: d9 a0 00 00 call r13
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
8004e78: 34 03 00 00 mvi r3,0
8004e7c: e0 00 00 8c bi 80050ac <_Heap_Walk+0x4ac>
return false;
}
prev_block = free_block;
free_block = free_block->next;
8004e80: b9 60 80 00 mv r16,r11
8004e84: 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 ) {
8004e88: 5d 6c ff d4 bne r11,r12,8004dd8 <_Heap_Walk+0x1d8>
8004e8c: e0 00 00 03 bi 8004e98 <_Heap_Walk+0x298>
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
8004e90: ba 20 78 00 mv r15,r17
8004e94: e0 00 00 15 bi 8004ee8 <_Heap_Walk+0x2e8>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
8004e98: 78 01 08 01 mvhi r1,0x801
8004e9c: 38 21 44 84 ori r1,r1,0x4484
8004ea0: 5b 81 00 54 sw (sp+84),r1
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
(*printer)(
8004ea4: 78 01 08 01 mvhi r1,0x801
8004ea8: 38 21 44 6c ori r1,r1,0x446c
8004eac: 5b 81 00 58 sw (sp+88),r1
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8004eb0: 78 01 08 01 mvhi r1,0x801
8004eb4: 38 21 40 98 ori r1,r1,0x4098
8004eb8: 5b 81 00 5c sw (sp+92),r1
8004ebc: 78 01 08 01 mvhi r1,0x801
8004ec0: 38 21 40 b4 ori r1,r1,0x40b4
8004ec4: 78 1b 08 01 mvhi fp,0x801
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
8004ec8: 78 17 08 01 mvhi r23,0x801
8004ecc: 78 19 08 01 mvhi r25,0x801
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
8004ed0: 78 18 08 01 mvhi r24,0x801
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8004ed4: 5b 81 00 60 sw (sp+96),r1
8004ed8: 3b 7b 43 c8 ori fp,fp,0x43c8
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
8004edc: 3a f7 44 38 ori r23,r23,0x4438
8004ee0: 3b 39 40 c4 ori r25,r25,0x40c4
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
8004ee4: 3b 18 40 a8 ori r24,r24,0x40a8
block = next_block;
} while ( block != first_block );
return true;
}
8004ee8: 29 f2 00 04 lw r18,(r15+4)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8004eec: 34 01 ff fe mvi r1,-2
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
8004ef0: 29 84 00 20 lw r4,(r12+32)
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
8004ef4: a2 41 80 00 and r16,r18,r1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
8004ef8: b5 f0 88 00 add r17,r15,r16
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
8004efc: 34 06 00 00 mvi r6,0
8004f00: 54 91 00 03 bgu r4,r17,8004f0c <_Heap_Walk+0x30c> <== NEVER TAKEN
8004f04: 29 86 00 24 lw r6,(r12+36)
8004f08: f0 d1 30 00 cmpgeu r6,r6,r17
bool const prev_used = _Heap_Is_prev_used( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
8004f0c: 5c c0 00 06 bne r6,r0,8004f24 <_Heap_Walk+0x324>
(*printer)(
8004f10: 78 03 08 01 mvhi r3,0x801
8004f14: b9 c0 08 00 mv r1,r14
8004f18: 34 02 00 01 mvi r2,1
8004f1c: 38 63 43 08 ori r3,r3,0x4308
8004f20: e0 00 00 1f bi 8004f9c <_Heap_Walk+0x39c>
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
8004f24: ba 00 08 00 mv r1,r16
8004f28: ba 60 10 00 mv r2,r19
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
bool const prev_used = _Heap_Is_prev_used( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
8004f2c: fd f6 58 00 cmpne r11,r15,r22
8004f30: fb ff ef 12 calli 8000b78 <__umodsi3>
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
8004f34: 44 20 00 09 be r1,r0,8004f58 <_Heap_Walk+0x358>
8004f38: 45 60 00 08 be r11,r0,8004f58 <_Heap_Walk+0x358>
(*printer)(
8004f3c: 78 03 08 01 mvhi r3,0x801
8004f40: b9 c0 08 00 mv r1,r14
8004f44: 34 02 00 01 mvi r2,1
8004f48: 38 63 43 38 ori r3,r3,0x4338
8004f4c: b9 e0 20 00 mv r4,r15
8004f50: ba 00 28 00 mv r5,r16
8004f54: e3 ff ff c8 bi 8004e74 <_Heap_Walk+0x274>
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
8004f58: 52 15 00 0b bgeu r16,r21,8004f84 <_Heap_Walk+0x384>
8004f5c: 45 60 00 0a be r11,r0,8004f84 <_Heap_Walk+0x384> <== NEVER TAKEN
(*printer)(
8004f60: 78 03 08 01 mvhi r3,0x801
8004f64: b9 c0 08 00 mv r1,r14
8004f68: 34 02 00 01 mvi r2,1
8004f6c: 38 63 43 68 ori r3,r3,0x4368
8004f70: b9 e0 20 00 mv r4,r15
8004f74: ba 00 28 00 mv r5,r16
8004f78: ba a0 30 00 mv r6,r21
8004f7c: d9 a0 00 00 call r13
8004f80: e3 ff ff be bi 8004e78 <_Heap_Walk+0x278>
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
8004f84: 56 2f 00 09 bgu r17,r15,8004fa8 <_Heap_Walk+0x3a8>
8004f88: 45 60 00 08 be r11,r0,8004fa8 <_Heap_Walk+0x3a8>
(*printer)(
8004f8c: 78 03 08 01 mvhi r3,0x801
8004f90: b9 c0 08 00 mv r1,r14
8004f94: 34 02 00 01 mvi r2,1
8004f98: 38 63 43 94 ori r3,r3,0x4394
8004f9c: b9 e0 20 00 mv r4,r15
8004fa0: ba 20 28 00 mv r5,r17
8004fa4: e3 ff ff b4 bi 8004e74 <_Heap_Walk+0x274>
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
8004fa8: 2a 24 00 04 lw r4,(r17+4)
8004fac: 22 52 00 01 andi r18,r18,0x1
8004fb0: 20 84 00 01 andi r4,r4,0x1
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
8004fb4: 5c 80 00 2d bne r4,r0,8005068 <_Heap_Walk+0x468>
false,
"block 0x%08x: size %u, prev 0x%08x%s, next 0x%08x%s\n",
block,
block_size,
block->prev,
block->prev == first_free_block ?
8004fb8: 29 e6 00 0c lw r6,(r15+12)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8004fbc: 29 85 00 08 lw r5,(r12+8)
block = next_block;
} while ( block != first_block );
return true;
}
8004fc0: 29 84 00 0c lw r4,(r12+12)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8004fc4: 2b 87 00 5c lw r7,(sp+92)
8004fc8: 44 c5 00 04 be r6,r5,8004fd8 <_Heap_Walk+0x3d8>
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
8004fcc: ba e0 38 00 mv r7,r23
8004fd0: 5c cc 00 02 bne r6,r12,8004fd8 <_Heap_Walk+0x3d8>
8004fd4: bb 00 38 00 mv r7,r24
block->next,
block->next == last_free_block ?
8004fd8: 29 e8 00 08 lw r8,(r15+8)
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8004fdc: 2b 89 00 60 lw r9,(sp+96)
8004fe0: 45 04 00 04 be r8,r4,8004ff0 <_Heap_Walk+0x3f0>
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
8004fe4: ba e0 48 00 mv r9,r23
8004fe8: 5d 0c 00 02 bne r8,r12,8004ff0 <_Heap_Walk+0x3f0>
8004fec: bb 20 48 00 mv r9,r25
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
8004ff0: 5b 89 00 04 sw (sp+4),r9
8004ff4: b9 c0 08 00 mv r1,r14
8004ff8: 34 02 00 00 mvi r2,0
8004ffc: bb 60 18 00 mv r3,fp
8005000: b9 e0 20 00 mv r4,r15
8005004: ba 00 28 00 mv r5,r16
8005008: d9 a0 00 00 call r13
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
800500c: 2a 26 00 00 lw r6,(r17+0)
8005010: 46 06 00 0a be r16,r6,8005038 <_Heap_Walk+0x438>
(*printer)(
8005014: 78 03 08 01 mvhi r3,0x801
8005018: b9 c0 08 00 mv r1,r14
800501c: 34 02 00 01 mvi r2,1
8005020: 38 63 44 00 ori r3,r3,0x4400
8005024: b9 e0 20 00 mv r4,r15
8005028: ba 00 28 00 mv r5,r16
800502c: ba 20 38 00 mv r7,r17
8005030: d9 a0 00 00 call r13
8005034: e3 ff ff 91 bi 8004e78 <_Heap_Walk+0x278>
);
return false;
}
if ( !prev_used ) {
8005038: 5e 40 00 06 bne r18,r0,8005050 <_Heap_Walk+0x450>
(*printer)(
800503c: 78 03 08 01 mvhi r3,0x801
8005040: b9 c0 08 00 mv r1,r14
8005044: 34 02 00 01 mvi r2,1
8005048: 38 63 44 3c ori r3,r3,0x443c
800504c: e0 00 00 30 bi 800510c <_Heap_Walk+0x50c>
block = next_block;
} while ( block != first_block );
return true;
}
8005050: 29 85 00 08 lw r5,(r12+8)
8005054: e0 00 00 03 bi 8005060 <_Heap_Walk+0x460>
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
if ( free_block == block ) {
8005058: 44 af 00 13 be r5,r15,80050a4 <_Heap_Walk+0x4a4>
return true;
}
free_block = free_block->next;
800505c: 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 ) {
8005060: 5c ac ff fe bne r5,r12,8005058 <_Heap_Walk+0x458>
8005064: e0 00 00 26 bi 80050fc <_Heap_Walk+0x4fc>
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
8005068: 46 40 00 08 be r18,r0,8005088 <_Heap_Walk+0x488>
(*printer)(
800506c: 2b 83 00 58 lw r3,(sp+88)
8005070: b9 c0 08 00 mv r1,r14
8005074: 34 02 00 00 mvi r2,0
8005078: b9 e0 20 00 mv r4,r15
800507c: ba 00 28 00 mv r5,r16
8005080: d9 a0 00 00 call r13
8005084: e0 00 00 08 bi 80050a4 <_Heap_Walk+0x4a4>
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
8005088: 2b 83 00 54 lw r3,(sp+84)
800508c: 29 e6 00 00 lw r6,(r15+0)
8005090: b9 c0 08 00 mv r1,r14
8005094: 34 02 00 00 mvi r2,0
8005098: b9 e0 20 00 mv r4,r15
800509c: ba 00 28 00 mv r5,r16
80050a0: d9 a0 00 00 call r13
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
80050a4: 5e 91 ff 7b bne r20,r17,8004e90 <_Heap_Walk+0x290>
return true;
80050a8: 34 03 00 01 mvi r3,1
}
80050ac: b8 60 08 00 mv r1,r3
80050b0: 2b 9d 00 10 lw ra,(sp+16)
80050b4: 2b 8b 00 50 lw r11,(sp+80)
80050b8: 2b 8c 00 4c lw r12,(sp+76)
80050bc: 2b 8d 00 48 lw r13,(sp+72)
80050c0: 2b 8e 00 44 lw r14,(sp+68)
80050c4: 2b 8f 00 40 lw r15,(sp+64)
80050c8: 2b 90 00 3c lw r16,(sp+60)
80050cc: 2b 91 00 38 lw r17,(sp+56)
80050d0: 2b 92 00 34 lw r18,(sp+52)
80050d4: 2b 93 00 30 lw r19,(sp+48)
80050d8: 2b 94 00 2c lw r20,(sp+44)
80050dc: 2b 95 00 28 lw r21,(sp+40)
80050e0: 2b 96 00 24 lw r22,(sp+36)
80050e4: 2b 97 00 20 lw r23,(sp+32)
80050e8: 2b 98 00 1c lw r24,(sp+28)
80050ec: 2b 99 00 18 lw r25,(sp+24)
80050f0: 2b 9b 00 14 lw fp,(sp+20)
80050f4: 37 9c 00 60 addi sp,sp,96
80050f8: c3 a0 00 00 ret
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
80050fc: 78 03 08 01 mvhi r3,0x801
8005100: b9 c0 08 00 mv r1,r14
8005104: 34 02 00 01 mvi r2,1
8005108: 38 63 44 ac ori r3,r3,0x44ac
800510c: b9 e0 20 00 mv r4,r15
8005110: d9 a0 00 00 call r13
8005114: e3 ff ff 59 bi 8004e78 <_Heap_Walk+0x278>
08004500 <_IO_Manager_initialization>:
* workspace.
*
*/
void _IO_Manager_initialization(void)
{
8004500: 37 9c ff e8 addi sp,sp,-24
8004504: 5b 8b 00 18 sw (sp+24),r11
8004508: 5b 8c 00 14 sw (sp+20),r12
800450c: 5b 8d 00 10 sw (sp+16),r13
8004510: 5b 8e 00 0c sw (sp+12),r14
8004514: 5b 8f 00 08 sw (sp+8),r15
8004518: 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;
800451c: 78 01 08 01 mvhi r1,0x801
8004520: 38 21 90 ac ori r1,r1,0x90ac
drivers_in_table = Configuration.number_of_device_drivers;
8004524: 28 2d 00 34 lw r13,(r1+52)
number_of_drivers = Configuration.maximum_drivers;
8004528: 28 2b 00 30 lw r11,(r1+48)
uint32_t index;
rtems_driver_address_table *driver_table;
uint32_t drivers_in_table;
uint32_t number_of_drivers;
driver_table = Configuration.Device_driver_table;
800452c: 28 2e 00 38 lw r14,(r1+56)
/*
* If the user claims there are less drivers than are actually in
* the table, then let's just go with the table's count.
*/
if ( number_of_drivers <= drivers_in_table )
8004530: 51 ab 00 03 bgeu r13,r11,800453c <_IO_Manager_initialization+0x3c>
/*
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
8004534: 5d 6d 00 0a bne r11,r13,800455c <_IO_Manager_initialization+0x5c><== ALWAYS TAKEN
8004538: e0 00 00 02 bi 8004540 <_IO_Manager_initialization+0x40> <== NOT EXECUTED
/*
* If the user claims there are less drivers than are actually in
* the table, then let's just go with the table's count.
*/
if ( number_of_drivers <= drivers_in_table )
800453c: b9 a0 58 00 mv r11,r13
* If the maximum number of driver is the same as the number in the
* table, then we do not have to copy the driver table. They can't
* register any dynamically.
*/
if ( number_of_drivers == drivers_in_table ) {
_IO_Driver_address_table = driver_table;
8004540: 78 01 08 01 mvhi r1,0x801
8004544: 38 21 a2 64 ori r1,r1,0xa264
8004548: 58 2e 00 00 sw (r1+0),r14
_IO_Number_of_drivers = number_of_drivers;
800454c: 78 01 08 01 mvhi r1,0x801
8004550: 38 21 a2 60 ori r1,r1,0xa260
8004554: 58 2b 00 00 sw (r1+0),r11
return;
8004558: e0 00 00 27 bi 80045f4 <_IO_Manager_initialization+0xf4>
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
800455c: 34 02 00 01 mvi r2,1
8004560: b9 60 08 00 mv r1,r11
8004564: f8 00 4a 30 calli 8016e24 <__ashlsi3>
8004568: 34 02 00 03 mvi r2,3
800456c: b4 2b 08 00 add r1,r1,r11
8004570: f8 00 4a 2d calli 8016e24 <__ashlsi3>
8004574: b8 20 78 00 mv r15,r1
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
_Workspace_Allocate_or_fatal_error(
8004578: f8 00 0e 01 calli 8007d7c <_Workspace_Allocate_or_fatal_error>
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
800457c: 78 02 08 01 mvhi r2,0x801
8004580: 38 42 a2 60 ori r2,r2,0xa260
/*
* 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 *)
8004584: 78 0c 08 01 mvhi r12,0x801
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
8004588: 58 4b 00 00 sw (r2+0),r11
memset(
800458c: b9 e0 18 00 mv r3,r15
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
8004590: 39 8c a2 64 ori r12,r12,0xa264
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
8004594: 34 02 00 00 mvi r2,0
/*
* The application requested extra slots in the driver table, so we
* have to allocate a new driver table and copy theirs to it.
*/
_IO_Driver_address_table = (rtems_driver_address_table *)
8004598: 59 81 00 00 sw (r12+0),r1
_Workspace_Allocate_or_fatal_error(
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
_IO_Number_of_drivers = number_of_drivers;
memset(
800459c: f8 00 36 ac calli 801204c <memset>
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
80045a0: 34 03 00 00 mvi r3,0
80045a4: 34 04 00 00 mvi r4,0
80045a8: e0 00 00 12 bi 80045f0 <_IO_Manager_initialization+0xf0>
_IO_Driver_address_table[index] = driver_table[index];
80045ac: 29 82 00 00 lw r2,(r12+0)
* registration. The driver table is now allocated in the
* workspace.
*
*/
void _IO_Manager_initialization(void)
80045b0: b5 c3 08 00 add r1,r14,r3
_IO_Driver_address_table, 0,
sizeof( rtems_driver_address_table ) * ( number_of_drivers )
);
for ( index = 0 ; index < drivers_in_table ; index++ )
_IO_Driver_address_table[index] = driver_table[index];
80045b4: 28 29 00 00 lw r9,(r1+0)
80045b8: 28 28 00 04 lw r8,(r1+4)
80045bc: 28 27 00 08 lw r7,(r1+8)
80045c0: 28 26 00 0c lw r6,(r1+12)
80045c4: 28 25 00 10 lw r5,(r1+16)
80045c8: 28 21 00 14 lw r1,(r1+20)
80045cc: b4 43 10 00 add r2,r2,r3
80045d0: 58 49 00 00 sw (r2+0),r9
80045d4: 58 48 00 04 sw (r2+4),r8
80045d8: 58 47 00 08 sw (r2+8),r7
80045dc: 58 46 00 0c sw (r2+12),r6
80045e0: 58 45 00 10 sw (r2+16),r5
80045e4: 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++ )
80045e8: 34 84 00 01 addi r4,r4,1
80045ec: 34 63 00 18 addi r3,r3,24
80045f0: 55 a4 ff ef bgu r13,r4,80045ac <_IO_Manager_initialization+0xac>
_IO_Driver_address_table[index] = driver_table[index];
}
80045f4: 2b 9d 00 04 lw ra,(sp+4)
80045f8: 2b 8b 00 18 lw r11,(sp+24)
80045fc: 2b 8c 00 14 lw r12,(sp+20)
8004600: 2b 8d 00 10 lw r13,(sp+16)
8004604: 2b 8e 00 0c lw r14,(sp+12)
8004608: 2b 8f 00 08 lw r15,(sp+8)
800460c: 37 9c 00 18 addi sp,sp,24
8004610: c3 a0 00 00 ret
08005664 <_Objects_Allocate>:
*/
Objects_Control *_Objects_Allocate(
Objects_Information *information
)
{
8005664: 37 9c ff ec addi sp,sp,-20
8005668: 5b 8b 00 14 sw (sp+20),r11
800566c: 5b 8c 00 10 sw (sp+16),r12
8005670: 5b 8d 00 0c sw (sp+12),r13
8005674: 5b 8e 00 08 sw (sp+8),r14
8005678: 5b 9d 00 04 sw (sp+4),ra
800567c: b8 20 58 00 mv r11,r1
* If the application is using the optional manager stubs and
* still attempts to create the object, the information block
* should be all zeroed out because it is in the BSS. So let's
* check that code for this manager is even present.
*/
if ( information->size == 0 )
8005680: 28 21 00 18 lw r1,(r1+24)
return NULL;
8005684: 34 0c 00 00 mvi r12,0
* If the application is using the optional manager stubs and
* still attempts to create the object, the information block
* should be all zeroed out because it is in the BSS. So let's
* check that code for this manager is even present.
*/
if ( information->size == 0 )
8005688: 44 20 00 1e be r1,r0,8005700 <_Objects_Allocate+0x9c> <== NEVER TAKEN
/*
* OK. The manager should be initialized and configured to have objects.
* With any luck, it is safe to attempt to allocate an object.
*/
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
800568c: 35 6d 00 20 addi r13,r11,32
8005690: b9 a0 08 00 mv r1,r13
8005694: fb ff fd 3b calli 8004b80 <_Chain_Get>
8005698: b8 20 60 00 mv r12,r1
800569c: b8 20 70 00 mv r14,r1
if ( information->auto_extend ) {
80056a0: 41 61 00 12 lbu r1,(r11+18)
80056a4: 44 20 00 17 be r1,r0,8005700 <_Objects_Allocate+0x9c>
/*
* If the list is empty then we are out of objects and need to
* extend information base.
*/
if ( !the_object ) {
80056a8: 5d 80 00 07 bne r12,r0,80056c4 <_Objects_Allocate+0x60>
_Objects_Extend_information( information );
80056ac: b9 60 08 00 mv r1,r11
80056b0: f8 00 00 32 calli 8005778 <_Objects_Extend_information>
the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
80056b4: b9 a0 08 00 mv r1,r13
80056b8: fb ff fd 32 calli 8004b80 <_Chain_Get>
80056bc: b8 20 60 00 mv r12,r1
}
if ( the_object ) {
80056c0: 44 2e 00 10 be r1,r14,8005700 <_Objects_Allocate+0x9c>
uint32_t block;
block = (uint32_t) _Objects_Get_index( the_object->id ) -
80056c4: 2d 82 00 0a lhu r2,(r12+10)
80056c8: 2d 61 00 0a lhu r1,(r11+10)
_Objects_Get_index( information->minimum_id );
block /= information->allocation_size;
80056cc: c8 41 08 00 sub r1,r2,r1
80056d0: 2d 62 00 14 lhu r2,(r11+20)
80056d4: f8 00 46 ae calli 801718c <__udivsi3>
information->inactive_per_block[ block ]--;
80056d8: 34 02 00 02 mvi r2,2
80056dc: f8 00 45 d2 calli 8016e24 <__ashlsi3>
80056e0: 29 62 00 30 lw r2,(r11+48)
80056e4: b4 41 08 00 add r1,r2,r1
80056e8: 28 22 00 00 lw r2,(r1+0)
80056ec: 34 42 ff ff addi r2,r2,-1
80056f0: 58 22 00 00 sw (r1+0),r2
information->inactive--;
80056f4: 2d 61 00 2c lhu r1,(r11+44)
80056f8: 34 21 ff ff addi r1,r1,-1
80056fc: 0d 61 00 2c sh (r11+44),r1
);
}
#endif
return the_object;
}
8005700: b9 80 08 00 mv r1,r12
8005704: 2b 9d 00 04 lw ra,(sp+4)
8005708: 2b 8b 00 14 lw r11,(sp+20)
800570c: 2b 8c 00 10 lw r12,(sp+16)
8005710: 2b 8d 00 0c lw r13,(sp+12)
8005714: 2b 8e 00 08 lw r14,(sp+8)
8005718: 37 9c 00 14 addi sp,sp,20
800571c: c3 a0 00 00 ret
0800ed74 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
800ed74: 37 9c ff ec addi sp,sp,-20
800ed78: 5b 8b 00 14 sw (sp+20),r11
800ed7c: 5b 8c 00 10 sw (sp+16),r12
800ed80: 5b 8d 00 0c sw (sp+12),r13
800ed84: 5b 8e 00 08 sw (sp+8),r14
800ed88: 5b 9d 00 04 sw (sp+4),ra
800ed8c: 20 4c ff ff andi r12,r2,0xffff
800ed90: b8 20 70 00 mv r14,r1
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
return NULL;
800ed94: 34 0b 00 00 mvi r11,0
)
{
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
800ed98: 45 80 00 16 be r12,r0,800edf0 <_Objects_Get_information+0x7c>
/*
* This call implicitly validates the_api so we do not call
* _Objects_Is_api_valid above here.
*/
the_class_api_maximum = _Objects_API_maximum_class( the_api );
800ed9c: f8 00 09 02 calli 80111a4 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
800eda0: 44 20 00 14 be r1,r0,800edf0 <_Objects_Get_information+0x7c>
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
800eda4: 55 81 00 13 bgu r12,r1,800edf0 <_Objects_Get_information+0x7c>
return NULL;
if ( !_Objects_Information_table[ the_api ] )
800eda8: 78 0d 08 01 mvhi r13,0x801
800edac: b9 c0 08 00 mv r1,r14
800edb0: 34 02 00 02 mvi r2,2
800edb4: 39 ad 98 bc ori r13,r13,0x98bc
800edb8: f8 00 20 1b calli 8016e24 <__ashlsi3>
800edbc: b5 a1 08 00 add r1,r13,r1
800edc0: 28 2d 00 00 lw r13,(r1+0)
800edc4: 45 a0 00 0b be r13,r0,800edf0 <_Objects_Get_information+0x7c><== NEVER TAKEN
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
800edc8: b9 80 08 00 mv r1,r12
800edcc: 34 02 00 02 mvi r2,2
800edd0: f8 00 20 15 calli 8016e24 <__ashlsi3>
800edd4: b5 a1 08 00 add r1,r13,r1
800edd8: 28 2b 00 00 lw r11,(r1+0)
if ( !info )
800eddc: 45 60 00 05 be r11,r0,800edf0 <_Objects_Get_information+0x7c><== NEVER TAKEN
* In a multprocessing configuration, we may access remote objects.
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
800ede0: 2d 61 00 10 lhu r1,(r11+16)
return NULL;
800ede4: 7c 21 00 00 cmpnei r1,r1,0
800ede8: c8 01 08 00 sub r1,r0,r1
800edec: a1 61 58 00 and r11,r11,r1
#endif
return info;
}
800edf0: b9 60 08 00 mv r1,r11
800edf4: 2b 9d 00 04 lw ra,(sp+4)
800edf8: 2b 8b 00 14 lw r11,(sp+20)
800edfc: 2b 8c 00 10 lw r12,(sp+16)
800ee00: 2b 8d 00 0c lw r13,(sp+12)
800ee04: 2b 8e 00 08 lw r14,(sp+8)
800ee08: 37 9c 00 14 addi sp,sp,20
800ee0c: c3 a0 00 00 ret
080178a8 <_Objects_Get_no_protection>:
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
80178a8: 37 9c ff f4 addi sp,sp,-12
80178ac: 5b 8b 00 0c sw (sp+12),r11
80178b0: 5b 8c 00 08 sw (sp+8),r12
80178b4: 5b 9d 00 04 sw (sp+4),ra
80178b8: b8 20 20 00 mv r4,r1
/*
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
80178bc: 28 21 00 08 lw r1,(r1+8)
Objects_Control *_Objects_Get_no_protection(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
80178c0: b8 60 58 00 mv r11,r3
/*
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
80178c4: c8 41 08 00 sub r1,r2,r1
if ( information->maximum >= index ) {
80178c8: 2c 82 00 10 lhu r2,(r4+16)
/*
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
80178cc: 34 21 00 01 addi r1,r1,1
if ( information->maximum >= index ) {
80178d0: 54 22 00 09 bgu r1,r2,80178f4 <_Objects_Get_no_protection+0x4c>
if ( (the_object = information->local_table[ index ]) != NULL ) {
80178d4: 28 8c 00 1c lw r12,(r4+28)
80178d8: 34 02 00 02 mvi r2,2
80178dc: fb ff d9 5e calli 800de54 <__ashlsi3>
80178e0: b5 81 08 00 add r1,r12,r1
80178e4: 28 21 00 00 lw r1,(r1+0)
80178e8: 44 20 00 03 be r1,r0,80178f4 <_Objects_Get_no_protection+0x4c><== NEVER TAKEN
*location = OBJECTS_LOCAL;
80178ec: 59 60 00 00 sw (r11+0),r0
return the_object;
80178f0: e0 00 00 04 bi 8017900 <_Objects_Get_no_protection+0x58>
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
80178f4: 34 01 00 01 mvi r1,1
80178f8: 59 61 00 00 sw (r11+0),r1
return NULL;
80178fc: 34 01 00 00 mvi r1,0
}
8017900: 2b 9d 00 04 lw ra,(sp+4)
8017904: 2b 8b 00 0c lw r11,(sp+12)
8017908: 2b 8c 00 08 lw r12,(sp+8)
801790c: 37 9c 00 0c addi sp,sp,12
8017910: c3 a0 00 00 ret
08006264 <_Objects_Id_to_name>:
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
8006264: 37 9c ff e8 addi sp,sp,-24
8006268: 5b 8b 00 14 sw (sp+20),r11
800626c: 5b 8c 00 10 sw (sp+16),r12
8006270: 5b 8d 00 0c sw (sp+12),r13
8006274: 5b 8e 00 08 sw (sp+8),r14
8006278: 5b 9d 00 04 sw (sp+4),ra
800627c: b8 40 70 00 mv r14,r2
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
8006280: b8 20 58 00 mv r11,r1
8006284: 5c 20 00 05 bne r1,r0,8006298 <_Objects_Id_to_name+0x34>
8006288: 78 01 08 02 mvhi r1,0x802
800628c: 38 21 0d c0 ori r1,r1,0xdc0
8006290: 28 21 00 0c lw r1,(r1+12)
8006294: 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);
8006298: 34 02 00 18 mvi r2,24
800629c: b9 60 08 00 mv r1,r11
80062a0: f8 00 57 43 calli 801bfac <__lshrsi3>
80062a4: 20 21 00 07 andi r1,r1,0x7
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
80062a8: 34 23 ff ff addi r3,r1,-1
80062ac: 34 02 00 02 mvi r2,2
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
80062b0: 34 0d 00 03 mvi r13,3
80062b4: 54 62 00 14 bgu r3,r2,8006304 <_Objects_Id_to_name+0xa0>
80062b8: e0 00 00 1b bi 8006324 <_Objects_Id_to_name+0xc0>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
80062bc: 34 02 00 1b mvi r2,27
80062c0: b9 60 08 00 mv r1,r11
80062c4: f8 00 57 3a calli 801bfac <__lshrsi3>
if ( !_Objects_Information_table[ the_api ] )
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
80062c8: 34 02 00 02 mvi r2,2
80062cc: fb ff ec dc calli 800163c <__ashlsi3>
80062d0: b5 81 08 00 add r1,r12,r1
80062d4: 28 21 00 00 lw r1,(r1+0)
if ( !information )
80062d8: 44 20 00 0b be r1,r0,8006304 <_Objects_Id_to_name+0xa0> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
80062dc: 40 2c 00 38 lbu r12,(r1+56)
80062e0: 5d 80 00 09 bne r12,r0,8006304 <_Objects_Id_to_name+0xa0> <== NEVER TAKEN
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
80062e4: b9 60 10 00 mv r2,r11
80062e8: 37 83 00 18 addi r3,sp,24
80062ec: fb ff ff b8 calli 80061cc <_Objects_Get>
if ( !the_object )
80062f0: 44 2c 00 05 be r1,r12,8006304 <_Objects_Id_to_name+0xa0>
return OBJECTS_INVALID_ID;
*name = the_object->name;
80062f4: 28 21 00 0c lw r1,(r1+12)
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
80062f8: 34 0d 00 00 mvi r13,0
the_object = _Objects_Get( information, tmpId, &ignored_location );
if ( !the_object )
return OBJECTS_INVALID_ID;
*name = the_object->name;
80062fc: 59 c1 00 00 sw (r14+0),r1
_Thread_Enable_dispatch();
8006300: f8 00 03 65 calli 8007094 <_Thread_Enable_dispatch>
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
8006304: b9 a0 08 00 mv r1,r13
8006308: 2b 9d 00 04 lw ra,(sp+4)
800630c: 2b 8b 00 14 lw r11,(sp+20)
8006310: 2b 8c 00 10 lw r12,(sp+16)
8006314: 2b 8d 00 0c lw r13,(sp+12)
8006318: 2b 8e 00 08 lw r14,(sp+8)
800631c: 37 9c 00 18 addi sp,sp,24
8006320: c3 a0 00 00 ret
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
8006324: 78 0c 08 02 mvhi r12,0x802
8006328: 34 02 00 02 mvi r2,2
800632c: 39 8c 08 8c ori r12,r12,0x88c
8006330: fb ff ec c3 calli 800163c <__ashlsi3>
8006334: b5 81 08 00 add r1,r12,r1
8006338: 28 2c 00 00 lw r12,(r1+0)
800633c: 5d 80 ff e0 bne r12,r0,80062bc <_Objects_Id_to_name+0x58>
8006340: e3 ff ff f1 bi 8006304 <_Objects_Id_to_name+0xa0>
08005c90 <_Objects_Initialize_information>:
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8005c90: 37 9c ff e4 addi sp,sp,-28
8005c94: 5b 8b 00 1c sw (sp+28),r11
8005c98: 5b 8c 00 18 sw (sp+24),r12
8005c9c: 5b 8d 00 14 sw (sp+20),r13
8005ca0: 5b 8e 00 10 sw (sp+16),r14
8005ca4: 5b 8f 00 0c sw (sp+12),r15
8005ca8: 5b 90 00 08 sw (sp+8),r16
8005cac: 5b 9d 00 04 sw (sp+4),ra
8005cb0: 20 6d ff ff andi r13,r3,0xffff
8005cb4: b8 20 58 00 mv r11,r1
8005cb8: 20 a5 ff ff andi r5,r5,0xffff
uint32_t index;
#endif
information->the_api = the_api;
information->the_class = the_class;
information->size = size;
8005cbc: 58 25 00 18 sw (r1+24),r5
information->local_table = 0;
information->inactive_per_block = 0;
information->object_blocks = 0;
information->inactive = 0;
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
information->is_string = is_string;
8005cc0: 30 26 00 38 sb (r1+56),r6
uint32_t maximum_per_allocation;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t index;
#endif
information->the_api = the_api;
8005cc4: 59 62 00 00 sw (r11+0),r2
information->the_class = the_class;
8005cc8: 0c 2d 00 04 sh (r1+4),r13
information->size = size;
information->local_table = 0;
8005ccc: 58 20 00 1c sw (r1+28),r0
information->inactive_per_block = 0;
8005cd0: 58 20 00 30 sw (r1+48),r0
information->object_blocks = 0;
8005cd4: 58 20 00 34 sw (r1+52),r0
information->inactive = 0;
8005cd8: 0c 20 00 2c sh (r1+44),r0
/*
* Set the maximum value to 0. It will be updated when objects are
* added to the inactive set from _Objects_Extend_information()
*/
information->maximum = 0;
8005cdc: 0c 20 00 10 sh (r1+16),r0
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8005ce0: b8 40 70 00 mv r14,r2
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8005ce4: b8 40 08 00 mv r1,r2
8005ce8: 78 0f 08 01 mvhi r15,0x801
8005cec: 34 02 00 02 mvi r2,2
,
bool supports_global,
Objects_Thread_queue_Extract_callout extract
#endif
)
{
8005cf0: b8 80 60 00 mv r12,r4
8005cf4: b8 e0 80 00 mv r16,r7
information->maximum = 0;
/*
* Register this Object Class in the Object Information Table.
*/
_Objects_Information_table[ the_api ][ the_class ] = information;
8005cf8: 39 ef 98 bc ori r15,r15,0x98bc
8005cfc: f8 00 44 4a calli 8016e24 <__ashlsi3>
8005d00: b5 e1 08 00 add r1,r15,r1
8005d04: 28 2f 00 00 lw r15,(r1+0)
8005d08: 34 02 00 02 mvi r2,2
8005d0c: b9 a0 08 00 mv r1,r13
8005d10: f8 00 44 45 calli 8016e24 <__ashlsi3>
8005d14: b5 e1 08 00 add r1,r15,r1
8005d18: 58 2b 00 00 sw (r1+0),r11
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
8005d1c: 34 02 00 1f mvi r2,31
8005d20: b9 80 08 00 mv r1,r12
8005d24: f8 00 44 8e calli 8016f5c <__lshrsi3>
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8005d28: 78 03 08 01 mvhi r3,0x801
8005d2c: 38 63 80 90 ori r3,r3,0x8090
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
8005d30: 20 22 00 ff andi r2,r1,0xff
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8005d34: 28 61 00 00 lw r1,(r3+0)
_Objects_Information_table[ the_api ][ the_class ] = information;
/*
* Are we operating in limited or unlimited (e.g. auto-extend) mode.
*/
information->auto_extend =
8005d38: 31 62 00 12 sb (r11+18),r2
(maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false;
maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS;
8005d3c: a1 81 60 00 and r12,r12,r1
/*
* Unlimited and maximum of zero is illogical.
*/
if ( information->auto_extend && maximum_per_allocation == 0) {
8005d40: 44 40 00 06 be r2,r0,8005d58 <_Objects_Initialize_information+0xc8>
8005d44: 5d 80 00 05 bne r12,r0,8005d58 <_Objects_Initialize_information+0xc8><== ALWAYS TAKEN
_Internal_error_Occurred(
8005d48: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8005d4c: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8005d50: 34 03 00 13 mvi r3,19 <== NOT EXECUTED
8005d54: fb ff fe 13 calli 80055a0 <_Internal_error_Occurred> <== NOT EXECUTED
information->allocation_size = maximum_per_allocation;
/*
* Provide a null local table entry for the case of any empty table.
*/
information->local_table = &null_local_table;
8005d58: 78 01 08 01 mvhi r1,0x801
8005d5c: 38 21 96 e4 ori r1,r1,0x96e4
8005d60: 59 61 00 1c sw (r11+28),r1
8005d64: 34 02 00 18 mvi r2,24
8005d68: b9 c0 08 00 mv r1,r14
}
/*
* The allocation unit is the maximum value
*/
information->allocation_size = maximum_per_allocation;
8005d6c: 0d 6c 00 14 sh (r11+20),r12
8005d70: f8 00 44 2d calli 8016e24 <__ashlsi3>
8005d74: 78 0e 00 01 mvhi r14,0x1
8005d78: b8 2e 70 00 or r14,r1,r14
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
8005d7c: 34 02 00 1b mvi r2,27
8005d80: b9 a0 08 00 mv r1,r13
8005d84: f8 00 44 28 calli 8016e24 <__ashlsi3>
information->local_table = &null_local_table;
/*
* Calculate minimum and maximum Id's
*/
minimum_index = (maximum_per_allocation == 0) ? 0 : 1;
8005d88: 7d 82 00 00 cmpnei r2,r12,0
8005d8c: b9 c1 08 00 or r1,r14,r1
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
8005d90: b8 22 08 00 or r1,r1,r2
information->minimum_id =
8005d94: 59 61 00 08 sw (r11+8),r1
/*
* Calculate the maximum name length
*/
name_length = maximum_name_length;
if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) )
8005d98: 22 01 00 03 andi r1,r16,0x3
8005d9c: ba 00 38 00 mv r7,r16
8005da0: 44 20 00 04 be r1,r0,8005db0 <_Objects_Initialize_information+0x120>
name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
8005da4: 36 07 00 04 addi r7,r16,4
8005da8: 34 01 ff fc mvi r1,-4
8005dac: a0 e1 38 00 and r7,r7,r1
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
8005db0: 35 61 00 24 addi r1,r11,36
head->next = tail;
8005db4: 59 61 00 20 sw (r11+32),r1
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
8005db8: 35 61 00 20 addi r1,r11,32
~(OBJECTS_NAME_ALIGNMENT-1);
information->name_length = name_length;
8005dbc: 0d 67 00 3a sh (r11+58),r7
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
8005dc0: 59 60 00 24 sw (r11+36),r0
tail->previous = head;
8005dc4: 59 61 00 28 sw (r11+40),r1
_Chain_Initialize_empty( &information->Inactive );
/*
* Initialize objects .. if there are any
*/
if ( maximum_per_allocation ) {
8005dc8: 45 80 00 03 be r12,r0,8005dd4 <_Objects_Initialize_information+0x144>
/*
* Always have the maximum size available so the current performance
* figures are create are met. If the user moves past the maximum
* number then a performance hit is taken.
*/
_Objects_Extend_information( information );
8005dcc: b9 60 08 00 mv r1,r11
8005dd0: fb ff fe 6a calli 8005778 <_Objects_Extend_information>
_Chain_Initialize_empty( &information->global_table[ index ] );
}
else
information->global_table = NULL;
#endif
}
8005dd4: 2b 9d 00 04 lw ra,(sp+4)
8005dd8: 2b 8b 00 1c lw r11,(sp+28)
8005ddc: 2b 8c 00 18 lw r12,(sp+24)
8005de0: 2b 8d 00 14 lw r13,(sp+20)
8005de4: 2b 8e 00 10 lw r14,(sp+16)
8005de8: 2b 8f 00 0c lw r15,(sp+12)
8005dec: 2b 90 00 08 lw r16,(sp+8)
8005df0: 37 9c 00 1c addi sp,sp,28
8005df4: c3 a0 00 00 ret
08003f50 <_POSIX_Condition_variables_Wait_support>:
pthread_cond_t *cond,
pthread_mutex_t *mutex,
Watchdog_Interval timeout,
bool already_timedout
)
{
8003f50: 37 9c ff e0 addi sp,sp,-32
8003f54: 5b 8b 00 1c sw (sp+28),r11
8003f58: 5b 8c 00 18 sw (sp+24),r12
8003f5c: 5b 8d 00 14 sw (sp+20),r13
8003f60: 5b 8e 00 10 sw (sp+16),r14
8003f64: 5b 8f 00 0c sw (sp+12),r15
8003f68: 5b 90 00 08 sw (sp+8),r16
8003f6c: 5b 9d 00 04 sw (sp+4),ra
8003f70: b8 20 70 00 mv r14,r1
8003f74: b8 40 60 00 mv r12,r2
register POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
int status;
int mutex_status;
if ( !_POSIX_Mutex_Get( mutex, &location ) ) {
8003f78: b8 40 08 00 mv r1,r2
8003f7c: 37 82 00 20 addi r2,sp,32
pthread_cond_t *cond,
pthread_mutex_t *mutex,
Watchdog_Interval timeout,
bool already_timedout
)
{
8003f80: b8 60 78 00 mv r15,r3
8003f84: 20 90 00 ff andi r16,r4,0xff
register POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
int status;
int mutex_status;
if ( !_POSIX_Mutex_Get( mutex, &location ) ) {
8003f88: f8 00 00 62 calli 8004110 <_POSIX_Mutex_Get>
return EINVAL;
8003f8c: 34 0b 00 16 mvi r11,22
register POSIX_Condition_variables_Control *the_cond;
Objects_Locations location;
int status;
int mutex_status;
if ( !_POSIX_Mutex_Get( mutex, &location ) ) {
8003f90: 44 20 00 33 be r1,r0,800405c <_POSIX_Condition_variables_Wait_support+0x10c><== NEVER TAKEN
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
8003f94: 78 05 08 01 mvhi r5,0x801
8003f98: 38 a5 78 68 ori r5,r5,0x7868
8003f9c: 28 a1 00 00 lw r1,(r5+0)
return EINVAL;
}
_Thread_Unnest_dispatch();
the_cond = _POSIX_Condition_variables_Get( cond, &location );
8003fa0: 37 82 00 20 addi r2,sp,32
8003fa4: 34 21 ff ff addi r1,r1,-1
8003fa8: 58 a1 00 00 sw (r5+0),r1
8003fac: b9 c0 08 00 mv r1,r14
8003fb0: fb ff ff 4d calli 8003ce4 <_POSIX_Condition_variables_Get>
switch ( location ) {
8003fb4: 2b 85 00 20 lw r5,(sp+32)
return EINVAL;
}
_Thread_Unnest_dispatch();
the_cond = _POSIX_Condition_variables_Get( cond, &location );
8003fb8: b8 20 68 00 mv r13,r1
switch ( location ) {
8003fbc: 5c a0 00 28 bne r5,r0,800405c <_POSIX_Condition_variables_Wait_support+0x10c><== NEVER TAKEN
case OBJECTS_LOCAL:
if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) {
8003fc0: 28 21 00 14 lw r1,(r1+20)
8003fc4: 44 25 00 05 be r1,r5,8003fd8 <_POSIX_Condition_variables_Wait_support+0x88>
8003fc8: 29 82 00 00 lw r2,(r12+0)
8003fcc: 44 22 00 03 be r1,r2,8003fd8 <_POSIX_Condition_variables_Wait_support+0x88>
_Thread_Enable_dispatch();
8003fd0: f8 00 0d f3 calli 800779c <_Thread_Enable_dispatch>
return EINVAL;
8003fd4: e0 00 00 22 bi 800405c <_POSIX_Condition_variables_Wait_support+0x10c>
}
(void) pthread_mutex_unlock( mutex );
8003fd8: b9 80 08 00 mv r1,r12
8003fdc: f8 00 01 17 calli 8004438 <pthread_mutex_unlock>
_Thread_Enable_dispatch();
return EINVAL;
}
*/
if ( !already_timedout ) {
8003fe0: 5e 00 00 19 bne r16,r0,8004044 <_POSIX_Condition_variables_Wait_support+0xf4><== NEVER TAKEN
the_cond->Mutex = *mutex;
8003fe4: 29 81 00 00 lw r1,(r12+0)
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
_Thread_Executing->Wait.return_code = 0;
8003fe8: 78 0b 08 01 mvhi r11,0x801
8003fec: 39 6b 7d 38 ori r11,r11,0x7d38
8003ff0: 29 64 00 0c lw r4,(r11+12)
return EINVAL;
}
*/
if ( !already_timedout ) {
the_cond->Mutex = *mutex;
8003ff4: 59 a1 00 14 sw (r13+20),r1
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
8003ff8: 34 01 00 01 mvi r1,1
8003ffc: 59 a1 00 48 sw (r13+72),r1
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
_Thread_Executing->Wait.return_code = 0;
8004000: 58 80 00 34 sw (r4+52),r0
_Thread_Executing->Wait.queue = &the_cond->Wait_queue;
_Thread_Executing->Wait.id = *cond;
8004004: 29 c1 00 00 lw r1,(r14+0)
if ( !already_timedout ) {
the_cond->Mutex = *mutex;
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
_Thread_Executing->Wait.return_code = 0;
_Thread_Executing->Wait.queue = &the_cond->Wait_queue;
8004008: 35 ad 00 18 addi r13,r13,24
_Thread_Executing->Wait.id = *cond;
_Thread_queue_Enqueue( &the_cond->Wait_queue, timeout );
800400c: 78 03 08 00 mvhi r3,0x800
the_cond->Mutex = *mutex;
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
_Thread_Executing->Wait.return_code = 0;
_Thread_Executing->Wait.queue = &the_cond->Wait_queue;
_Thread_Executing->Wait.id = *cond;
8004010: 58 81 00 20 sw (r4+32),r1
if ( !already_timedout ) {
the_cond->Mutex = *mutex;
_Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
_Thread_Executing->Wait.return_code = 0;
_Thread_Executing->Wait.queue = &the_cond->Wait_queue;
8004014: 58 8d 00 44 sw (r4+68),r13
_Thread_Executing->Wait.id = *cond;
_Thread_queue_Enqueue( &the_cond->Wait_queue, timeout );
8004018: b9 a0 08 00 mv r1,r13
800401c: b9 e0 10 00 mv r2,r15
8004020: 38 63 82 08 ori r3,r3,0x8208
8004024: f8 00 0f 0e calli 8007c5c <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
8004028: f8 00 0d dd calli 800779c <_Thread_Enable_dispatch>
* a POSIX signal, then pthread_cond_wait returns spuriously,
* according to the POSIX standard. It means that pthread_cond_wait
* returns a success status, except for the fact that it was not
* woken up a pthread_cond_signal or a pthread_cond_broadcast.
*/
status = _Thread_Executing->Wait.return_code;
800402c: 29 61 00 0c lw r1,(r11+12)
8004030: 28 2b 00 34 lw r11,(r1+52)
if ( status == EINTR )
status = 0;
8004034: 7d 61 00 04 cmpnei r1,r11,4
8004038: c8 01 08 00 sub r1,r0,r1
800403c: a1 61 58 00 and r11,r11,r1
8004040: e0 00 00 03 bi 800404c <_POSIX_Condition_variables_Wait_support+0xfc>
} else {
_Thread_Enable_dispatch();
8004044: f8 00 0d d6 calli 800779c <_Thread_Enable_dispatch>
status = ETIMEDOUT;
8004048: 34 0b 00 74 mvi r11,116
/*
* When we get here the dispatch disable level is 0.
*/
mutex_status = pthread_mutex_lock( mutex );
800404c: b9 80 08 00 mv r1,r12
8004050: f8 00 00 c7 calli 800436c <pthread_mutex_lock>
if ( mutex_status )
8004054: 44 20 00 02 be r1,r0,800405c <_POSIX_Condition_variables_Wait_support+0x10c>
return EINVAL;
8004058: 34 0b 00 16 mvi r11,22
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
800405c: b9 60 08 00 mv r1,r11
8004060: 2b 9d 00 04 lw ra,(sp+4)
8004064: 2b 8b 00 1c lw r11,(sp+28)
8004068: 2b 8c 00 18 lw r12,(sp+24)
800406c: 2b 8d 00 14 lw r13,(sp+20)
8004070: 2b 8e 00 10 lw r14,(sp+16)
8004074: 2b 8f 00 0c lw r15,(sp+12)
8004078: 2b 90 00 08 lw r16,(sp+8)
800407c: 37 9c 00 20 addi sp,sp,32
8004080: c3 a0 00 00 ret
08008d78 <_POSIX_Message_queue_Receive_support>:
size_t msg_len,
unsigned int *msg_prio,
bool wait,
Watchdog_Interval timeout
)
{
8008d78: 37 9c ff dc addi sp,sp,-36
8008d7c: 5b 8b 00 18 sw (sp+24),r11
8008d80: 5b 8c 00 14 sw (sp+20),r12
8008d84: 5b 8d 00 10 sw (sp+16),r13
8008d88: 5b 8e 00 0c sw (sp+12),r14
8008d8c: 5b 8f 00 08 sw (sp+8),r15
8008d90: 5b 9d 00 04 sw (sp+4),ra
8008d94: b8 20 58 00 mv r11,r1
RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd (
mqd_t id,
Objects_Locations *location
)
{
return (POSIX_Message_queue_Control_fd *) _Objects_Get(
8008d98: 78 01 08 02 mvhi r1,0x802
8008d9c: b8 40 60 00 mv r12,r2
8008da0: b8 60 78 00 mv r15,r3
8008da4: b9 60 10 00 mv r2,r11
8008da8: 38 21 92 1c ori r1,r1,0x921c
8008dac: 37 83 00 24 addi r3,sp,36
8008db0: 5b 86 00 1c sw (sp+28),r6
8008db4: b8 80 68 00 mv r13,r4
8008db8: 20 ae 00 ff andi r14,r5,0xff
8008dbc: f8 00 0c c8 calli 800c0dc <_Objects_Get>
Objects_Locations location;
size_t length_out;
bool do_wait;
the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
switch ( location ) {
8008dc0: 2b 82 00 24 lw r2,(sp+36)
8008dc4: 2b 86 00 1c lw r6,(sp+28)
8008dc8: 5c 40 00 2f bne r2,r0,8008e84 <_POSIX_Message_queue_Receive_support+0x10c>
case OBJECTS_LOCAL:
if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) {
8008dcc: 28 28 00 14 lw r8,(r1+20)
8008dd0: 34 02 00 01 mvi r2,1
8008dd4: 21 03 00 03 andi r3,r8,0x3
8008dd8: 5c 62 00 03 bne r3,r2,8008de4 <_POSIX_Message_queue_Receive_support+0x6c>
_Thread_Enable_dispatch();
8008ddc: f8 00 10 43 calli 800cee8 <_Thread_Enable_dispatch>
8008de0: e0 00 00 29 bi 8008e84 <_POSIX_Message_queue_Receive_support+0x10c>
rtems_set_errno_and_return_minus_one( EBADF );
}
the_mq = the_mq_fd->Queue;
8008de4: 28 27 00 10 lw r7,(r1+16)
if ( msg_len < the_mq->Message_queue.maximum_message_size ) {
8008de8: 28 e1 00 68 lw r1,(r7+104)
8008dec: 51 e1 00 05 bgeu r15,r1,8008e00 <_POSIX_Message_queue_Receive_support+0x88>
_Thread_Enable_dispatch();
8008df0: f8 00 10 3e calli 800cee8 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EMSGSIZE );
8008df4: f8 00 2e e1 calli 8014978 <__errno>
8008df8: 34 02 00 7a mvi r2,122
8008dfc: e0 00 00 24 bi 8008e8c <_POSIX_Message_queue_Receive_support+0x114>
/*
* Now if something goes wrong, we return a "length" of -1
* to indicate an error.
*/
length_out = -1;
8008e00: 34 01 ff ff mvi r1,-1
8008e04: 5b 81 00 20 sw (sp+32),r1
/*
* A timed receive with a bad time will do a poll regardless.
*/
if ( wait )
8008e08: 34 05 00 00 mvi r5,0
8008e0c: 45 c0 00 03 be r14,r0,8008e18 <_POSIX_Message_queue_Receive_support+0xa0><== NEVER TAKEN
do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true;
8008e10: 21 05 40 00 andi r5,r8,0x4000
8008e14: 64 a5 00 00 cmpei r5,r5,0
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
8008e18: b9 60 10 00 mv r2,r11
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
8008e1c: 78 0b 08 02 mvhi r11,0x802
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
8008e20: 34 e1 00 1c addi r1,r7,28
8008e24: b9 80 18 00 mv r3,r12
8008e28: 37 84 00 20 addi r4,sp,32
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
8008e2c: 39 6b 92 88 ori r11,r11,0x9288
do_wait = wait;
/*
* Now perform the actual message receive
*/
_CORE_message_queue_Seize(
8008e30: f8 00 07 8b calli 800ac5c <_CORE_message_queue_Seize>
&length_out,
do_wait,
timeout
);
_Thread_Enable_dispatch();
8008e34: f8 00 10 2d calli 800cee8 <_Thread_Enable_dispatch>
*msg_prio =
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
8008e38: 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);
8008e3c: 34 02 00 1f mvi r2,31
8008e40: 29 81 00 24 lw r1,(r12+36)
8008e44: f8 00 6c a4 calli 80240d4 <__ashrsi3>
8008e48: 29 82 00 24 lw r2,(r12+36)
8008e4c: 98 22 10 00 xor r2,r1,r2
8008e50: c8 41 08 00 sub r1,r2,r1
do_wait,
timeout
);
_Thread_Enable_dispatch();
*msg_prio =
8008e54: 59 a1 00 00 sw (r13+0),r1
_POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count);
if ( !_Thread_Executing->Wait.return_code )
8008e58: 29 81 00 34 lw r1,(r12+52)
8008e5c: 5c 20 00 03 bne r1,r0,8008e68 <_POSIX_Message_queue_Receive_support+0xf0>
return length_out;
8008e60: 2b 81 00 20 lw r1,(sp+32)
8008e64: e0 00 00 0c bi 8008e94 <_POSIX_Message_queue_Receive_support+0x11c>
rtems_set_errno_and_return_minus_one(
8008e68: f8 00 2e c4 calli 8014978 <__errno>
8008e6c: b8 20 60 00 mv r12,r1
8008e70: 29 61 00 0c lw r1,(r11+12)
8008e74: 28 21 00 34 lw r1,(r1+52)
8008e78: f8 00 00 b9 calli 800915c <_POSIX_Message_queue_Translate_core_message_queue_return_code>
8008e7c: 59 81 00 00 sw (r12+0),r1
8008e80: e0 00 00 04 bi 8008e90 <_POSIX_Message_queue_Receive_support+0x118>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EBADF );
8008e84: f8 00 2e bd calli 8014978 <__errno>
8008e88: 34 02 00 09 mvi r2,9
8008e8c: 58 22 00 00 sw (r1+0),r2
8008e90: 34 01 ff ff mvi r1,-1
}
8008e94: 2b 9d 00 04 lw ra,(sp+4)
8008e98: 2b 8b 00 18 lw r11,(sp+24)
8008e9c: 2b 8c 00 14 lw r12,(sp+20)
8008ea0: 2b 8d 00 10 lw r13,(sp+16)
8008ea4: 2b 8e 00 0c lw r14,(sp+12)
8008ea8: 2b 8f 00 08 lw r15,(sp+8)
8008eac: 37 9c 00 24 addi sp,sp,36
8008eb0: c3 a0 00 00 ret
080085f4 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>:
#include <rtems/posix/pthread.h>
void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch(
Thread_Control *the_thread
)
{
80085f4: 37 9c ff fc addi sp,sp,-4
80085f8: 5b 9d 00 04 sw (sp+4),ra
POSIX_API_Control *thread_support;
thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
80085fc: 28 22 01 20 lw r2,(r1+288)
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
8008600: 28 43 00 d8 lw r3,(r2+216)
8008604: 5c 60 00 0e bne r3,r0,800863c <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x48><== NEVER TAKEN
8008608: 28 44 00 dc lw r4,(r2+220)
800860c: 34 03 00 01 mvi r3,1
8008610: 5c 83 00 0b bne r4,r3,800863c <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x48>
thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
8008614: 28 42 00 e0 lw r2,(r2+224)
8008618: 44 40 00 09 be r2,r0,800863c <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x48>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
800861c: 78 02 08 01 mvhi r2,0x801
8008620: 38 42 58 58 ori r2,r2,0x5858
8008624: 28 43 00 00 lw r3,(r2+0)
8008628: 34 63 ff ff addi r3,r3,-1
800862c: 58 43 00 00 sw (r2+0),r3
thread_support->cancelation_requested ) {
_Thread_Unnest_dispatch();
_POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED );
8008630: 34 02 ff ff mvi r2,-1
8008634: f8 00 02 62 calli 8008fbc <_POSIX_Thread_Exit>
8008638: e0 00 00 02 bi 8008640 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x4c>
} else
_Thread_Enable_dispatch();
800863c: fb ff f3 7f calli 8005438 <_Thread_Enable_dispatch>
}
8008640: 2b 9d 00 04 lw ra,(sp+4)
8008644: 37 9c 00 04 addi sp,sp,4
8008648: c3 a0 00 00 ret
0800a05c <_POSIX_Thread_Translate_sched_param>:
int policy,
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
800a05c: 37 9c ff e8 addi sp,sp,-24
800a060: 5b 8b 00 18 sw (sp+24),r11
800a064: 5b 8c 00 14 sw (sp+20),r12
800a068: 5b 8d 00 10 sw (sp+16),r13
800a06c: 5b 8e 00 0c sw (sp+12),r14
800a070: 5b 8f 00 08 sw (sp+8),r15
800a074: 5b 9d 00 04 sw (sp+4),ra
800a078: b8 20 68 00 mv r13,r1
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a07c: 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
)
{
800a080: b8 40 58 00 mv r11,r2
800a084: b8 60 70 00 mv r14,r3
800a088: b8 80 78 00 mv r15,r4
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a08c: fb ff ff ec calli 800a03c <_POSIX_Priority_Is_valid>
return EINVAL;
800a090: 34 0c 00 16 mvi r12,22
struct sched_param *param,
Thread_CPU_budget_algorithms *budget_algorithm,
Thread_CPU_budget_algorithm_callout *budget_callout
)
{
if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
800a094: 44 20 00 2a be r1,r0,800a13c <_POSIX_Thread_Translate_sched_param+0xe0><== NEVER TAKEN
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
800a098: 59 c0 00 00 sw (r14+0),r0
*budget_callout = NULL;
800a09c: 59 e0 00 00 sw (r15+0),r0
if ( policy == SCHED_OTHER ) {
800a0a0: 5d a0 00 04 bne r13,r0,800a0b0 <_POSIX_Thread_Translate_sched_param+0x54>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
800a0a4: 34 01 00 01 mvi r1,1
800a0a8: 59 c1 00 00 sw (r14+0),r1
800a0ac: e0 00 00 23 bi 800a138 <_POSIX_Thread_Translate_sched_param+0xdc>
return 0;
}
if ( policy == SCHED_FIFO ) {
800a0b0: 34 01 00 01 mvi r1,1
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
800a0b4: 34 0c 00 00 mvi r12,0
if ( policy == SCHED_OTHER ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
return 0;
}
if ( policy == SCHED_FIFO ) {
800a0b8: 45 a1 00 21 be r13,r1,800a13c <_POSIX_Thread_Translate_sched_param+0xe0>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
return 0;
}
if ( policy == SCHED_RR ) {
800a0bc: 34 01 00 02 mvi r1,2
800a0c0: 5d a1 00 03 bne r13,r1,800a0cc <_POSIX_Thread_Translate_sched_param+0x70>
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
800a0c4: 59 cd 00 00 sw (r14+0),r13
return 0;
800a0c8: e0 00 00 1d bi 800a13c <_POSIX_Thread_Translate_sched_param+0xe0>
}
if ( policy == SCHED_SPORADIC ) {
800a0cc: 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;
800a0d0: 34 0c 00 16 mvi r12,22
if ( policy == SCHED_RR ) {
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
return 0;
}
if ( policy == SCHED_SPORADIC ) {
800a0d4: 5d a1 00 1a bne r13,r1,800a13c <_POSIX_Thread_Translate_sched_param+0xe0>
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
800a0d8: 29 61 00 08 lw r1,(r11+8)
800a0dc: 5c 20 00 03 bne r1,r0,800a0e8 <_POSIX_Thread_Translate_sched_param+0x8c>
800a0e0: 29 62 00 0c lw r2,(r11+12)
800a0e4: 44 41 00 16 be r2,r1,800a13c <_POSIX_Thread_Translate_sched_param+0xe0>
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
800a0e8: 29 61 00 10 lw r1,(r11+16)
800a0ec: 5c 20 00 04 bne r1,r0,800a0fc <_POSIX_Thread_Translate_sched_param+0xa0>
800a0f0: 29 62 00 14 lw r2,(r11+20)
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
800a0f4: 34 0c 00 16 mvi r12,22
if ( policy == SCHED_SPORADIC ) {
if ( (param->sched_ss_repl_period.tv_sec == 0) &&
(param->sched_ss_repl_period.tv_nsec == 0) )
return EINVAL;
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
800a0f8: 44 41 00 11 be r2,r1,800a13c <_POSIX_Thread_Translate_sched_param+0xe0>
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
800a0fc: 35 61 00 08 addi r1,r11,8
800a100: fb ff f4 9a calli 8007368 <_Timespec_To_ticks>
800a104: b8 20 68 00 mv r13,r1
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
800a108: 35 61 00 10 addi r1,r11,16
800a10c: fb ff f4 97 calli 8007368 <_Timespec_To_ticks>
return EINVAL;
800a110: 34 0c 00 16 mvi r12,22
if ( (param->sched_ss_init_budget.tv_sec == 0) &&
(param->sched_ss_init_budget.tv_nsec == 0) )
return EINVAL;
if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) <
800a114: 54 2d 00 0a bgu r1,r13,800a13c <_POSIX_Thread_Translate_sched_param+0xe0>
_Timespec_To_ticks( ¶m->sched_ss_init_budget ) )
return EINVAL;
if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) )
800a118: 29 61 00 04 lw r1,(r11+4)
800a11c: fb ff ff c8 calli 800a03c <_POSIX_Priority_Is_valid>
800a120: 44 20 00 07 be r1,r0,800a13c <_POSIX_Thread_Translate_sched_param+0xe0>
return EINVAL;
*budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
800a124: 34 01 00 03 mvi r1,3
800a128: 59 c1 00 00 sw (r14+0),r1
*budget_callout = _POSIX_Threads_Sporadic_budget_callout;
800a12c: 78 01 08 00 mvhi r1,0x800
800a130: 38 21 37 fc ori r1,r1,0x37fc
800a134: 59 e1 00 00 sw (r15+0),r1
return 0;
800a138: 34 0c 00 00 mvi r12,0
}
return EINVAL;
}
800a13c: b9 80 08 00 mv r1,r12
800a140: 2b 9d 00 04 lw ra,(sp+4)
800a144: 2b 8b 00 18 lw r11,(sp+24)
800a148: 2b 8c 00 14 lw r12,(sp+20)
800a14c: 2b 8d 00 10 lw r13,(sp+16)
800a150: 2b 8e 00 0c lw r14,(sp+12)
800a154: 2b 8f 00 08 lw r15,(sp+8)
800a158: 37 9c 00 18 addi sp,sp,24
800a15c: c3 a0 00 00 ret
0800347c <_POSIX_Threads_Initialize_user_threads_body>:
*
* Output parameters: NONE
*/
void _POSIX_Threads_Initialize_user_threads_body(void)
{
800347c: 37 9c ff a8 addi sp,sp,-88
8003480: 5b 8b 00 14 sw (sp+20),r11
8003484: 5b 8c 00 10 sw (sp+16),r12
8003488: 5b 8d 00 0c sw (sp+12),r13
800348c: 5b 8e 00 08 sw (sp+8),r14
8003490: 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;
8003494: 78 01 08 01 mvhi r1,0x801
8003498: 38 21 f0 a8 ori r1,r1,0xf0a8
maximum = Configuration_POSIX_API.number_of_initialization_threads;
800349c: 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;
80034a0: 28 2c 00 34 lw r12,(r1+52)
maximum = Configuration_POSIX_API.number_of_initialization_threads;
if ( !user_threads || maximum == 0 )
80034a4: 65 c2 00 00 cmpei r2,r14,0
80034a8: 65 81 00 00 cmpei r1,r12,0
80034ac: b8 41 08 00 or r1,r2,r1
80034b0: 5c 20 00 18 bne r1,r0,8003510 <_POSIX_Threads_Initialize_user_threads_body+0x94><== NEVER TAKEN
80034b4: 34 0d 00 00 mvi r13,0
for ( index=0 ; index < maximum ; index++ ) {
/*
* There is no way for these calls to fail in this situation.
*/
(void) pthread_attr_init( &attr );
80034b8: 37 8b 00 18 addi r11,sp,24
80034bc: b9 60 08 00 mv r1,r11
80034c0: f8 00 1b 28 calli 800a160 <pthread_attr_init>
(void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
80034c4: 34 02 00 02 mvi r2,2
80034c8: b9 60 08 00 mv r1,r11
80034cc: f8 00 1b 32 calli 800a194 <pthread_attr_setinheritsched>
(void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size);
80034d0: 29 82 00 04 lw r2,(r12+4)
80034d4: b9 60 08 00 mv r1,r11
80034d8: f8 00 1b 3b calli 800a1c4 <pthread_attr_setstacksize>
status = pthread_create(
80034dc: 29 83 00 00 lw r3,(r12+0)
80034e0: 37 81 00 58 addi r1,sp,88
80034e4: b9 60 10 00 mv r2,r11
80034e8: 34 04 00 00 mvi r4,0
80034ec: fb ff fe ed calli 80030a0 <pthread_create>
80034f0: b8 20 18 00 mv r3,r1
&thread_id,
&attr,
user_threads[ index ].thread_entry,
NULL
);
if ( status )
80034f4: 44 20 00 04 be r1,r0,8003504 <_POSIX_Threads_Initialize_user_threads_body+0x88>
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
80034f8: 34 01 00 02 mvi r1,2
80034fc: 34 02 00 01 mvi r2,1
8003500: f8 00 07 20 calli 8005180 <_Internal_error_Occurred>
*
* Setting the attributes explicitly is critical, since we don't want
* to inherit the idle tasks attributes.
*/
for ( index=0 ; index < maximum ; index++ ) {
8003504: 35 ad 00 01 addi r13,r13,1
8003508: 35 8c 00 08 addi r12,r12,8
800350c: 55 cd ff ec bgu r14,r13,80034bc <_POSIX_Threads_Initialize_user_threads_body+0x40><== NEVER TAKEN
NULL
);
if ( status )
_Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status );
}
}
8003510: 2b 9d 00 04 lw ra,(sp+4)
8003514: 2b 8b 00 14 lw r11,(sp+20)
8003518: 2b 8c 00 10 lw r12,(sp+16)
800351c: 2b 8d 00 0c lw r13,(sp+12)
8003520: 2b 8e 00 08 lw r14,(sp+8)
8003524: 37 9c 00 58 addi sp,sp,88
8003528: c3 a0 00 00 ret
0800d4cc <_POSIX_Threads_Sporadic_budget_TSR>:
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
800d4cc: 37 9c ff f4 addi sp,sp,-12
800d4d0: 5b 8b 00 0c sw (sp+12),r11
800d4d4: 5b 8c 00 08 sw (sp+8),r12
800d4d8: 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 ];
800d4dc: 28 4c 01 20 lw r12,(r2+288)
*/
void _POSIX_Threads_Sporadic_budget_TSR(
Objects_Id id __attribute__((unused)),
void *argument
)
{
800d4e0: 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 );
800d4e4: 35 81 00 98 addi r1,r12,152
800d4e8: f8 00 07 e3 calli 800f474 <_Timespec_To_ticks>
the_thread->cpu_time_budget = ticks;
800d4ec: 59 61 00 78 sw (r11+120),r1
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
800d4f0: 78 01 08 01 mvhi r1,0x801
800d4f4: 38 21 90 a8 ori r1,r1,0x90a8
800d4f8: 40 21 00 00 lbu r1,(r1+0)
800d4fc: 29 82 00 88 lw r2,(r12+136)
800d500: c8 22 10 00 sub r2,r1,r2
*/
#if 0
printk( "TSR %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
800d504: 29 61 00 1c lw r1,(r11+28)
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget );
the_thread->cpu_time_budget = ticks;
new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority );
the_thread->real_priority = new_priority;
800d508: 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 ) {
800d50c: 5c 20 00 06 bne r1,r0,800d524 <_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 ) {
800d510: 29 61 00 14 lw r1,(r11+20)
800d514: 50 41 00 04 bgeu r2,r1,800d524 <_POSIX_Threads_Sporadic_budget_TSR+0x58>
_Thread_Change_priority( the_thread, new_priority, true );
800d518: b9 60 08 00 mv r1,r11
800d51c: 34 03 00 01 mvi r3,1
800d520: fb ff e4 07 calli 800653c <_Thread_Change_priority>
#endif
}
}
/* ticks is guaranteed to be at least one */
ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period );
800d524: 35 81 00 90 addi r1,r12,144
800d528: f8 00 07 d3 calli 800f474 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
800d52c: 59 81 00 b4 sw (r12+180),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800d530: 78 01 08 01 mvhi r1,0x801
800d534: 38 21 9a 00 ori r1,r1,0x9a00
800d538: 35 82 00 a8 addi r2,r12,168
800d53c: fb ff e9 59 calli 8007aa0 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
}
800d540: 2b 9d 00 04 lw ra,(sp+4)
800d544: 2b 8b 00 0c lw r11,(sp+12)
800d548: 2b 8c 00 08 lw r12,(sp+8)
800d54c: 37 9c 00 0c addi sp,sp,12
800d550: c3 a0 00 00 ret
0800d554 <_POSIX_Threads_Sporadic_budget_callout>:
* _POSIX_Threads_Sporadic_budget_callout
*/
void _POSIX_Threads_Sporadic_budget_callout(
Thread_Control *the_thread
)
{
800d554: 37 9c ff fc addi sp,sp,-4
800d558: 5b 9d 00 04 sw (sp+4),ra
/*
* This will prevent the thread from consuming its entire "budget"
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
800d55c: 34 02 ff ff mvi r2,-1
)
{
POSIX_API_Control *api;
uint32_t new_priority;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
800d560: 28 25 01 20 lw r5,(r1+288)
/*
* This will prevent the thread from consuming its entire "budget"
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
800d564: 58 22 00 78 sw (r1+120),r2
800d568: 78 02 08 01 mvhi r2,0x801
800d56c: 38 42 90 a8 ori r2,r2,0x90a8
800d570: 40 44 00 00 lbu r4,(r2+0)
800d574: 28 a2 00 8c lw r2,(r5+140)
800d578: c8 82 10 00 sub r2,r4,r2
*/
#if 0
printk( "callout %d %d %d\n", the_thread->resource_count,
the_thread->current_priority, new_priority );
#endif
if ( the_thread->resource_count == 0 ) {
800d57c: 28 24 00 1c lw r4,(r1+28)
* while at low priority.
*/
the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
new_priority = _POSIX_Priority_To_core(api->schedparam.sched_ss_low_priority);
the_thread->real_priority = new_priority;
800d580: 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 ) {
800d584: 5c 80 00 05 bne r4,r0,800d598 <_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 ) {
800d588: 28 23 00 14 lw r3,(r1+20)
800d58c: 50 62 00 03 bgeu r3,r2,800d598 <_POSIX_Threads_Sporadic_budget_callout+0x44><== NEVER TAKEN
_Thread_Change_priority( the_thread, new_priority, true );
800d590: 34 03 00 01 mvi r3,1
800d594: fb ff e3 ea calli 800653c <_Thread_Change_priority>
#if 0
printk( "lower priority\n" );
#endif
}
}
}
800d598: 2b 9d 00 04 lw ra,(sp+4)
800d59c: 37 9c 00 04 addi sp,sp,4
800d5a0: c3 a0 00 00 ret
0800317c <_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)
{
800317c: 37 9c ff f8 addi sp,sp,-8
8003180: 5b 8b 00 08 sw (sp+8),r11
8003184: 5b 9d 00 04 sw (sp+4),ra
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
8003188: 28 41 00 68 lw r1,(r2+104)
* This is the operation that is run when a timer expires
*/
void _POSIX_Timer_TSR(
Objects_Id timer __attribute__((unused)),
void *data)
{
800318c: b8 40 58 00 mv r11,r2
bool activated;
ptimer = (POSIX_Timer_Control *)data;
/* Increment the number of expirations. */
ptimer->overrun = ptimer->overrun + 1;
8003190: 34 21 00 01 addi r1,r1,1
8003194: 58 41 00 68 sw (r2+104),r1
/* The timer must be reprogrammed */
if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) ||
8003198: 28 41 00 54 lw r1,(r2+84)
800319c: 5c 20 00 03 bne r1,r0,80031a8 <_POSIX_Timer_TSR+0x2c>
80031a0: 28 42 00 58 lw r2,(r2+88)
80031a4: 44 41 00 0d be r2,r1,80031d8 <_POSIX_Timer_TSR+0x5c> <== NEVER TAKEN
( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) {
activated = _POSIX_Timer_Insert_helper(
80031a8: 29 62 00 64 lw r2,(r11+100)
80031ac: 29 63 00 08 lw r3,(r11+8)
80031b0: 78 04 08 00 mvhi r4,0x800
80031b4: 35 61 00 10 addi r1,r11,16
80031b8: 38 84 31 7c ori r4,r4,0x317c
80031bc: b9 60 28 00 mv r5,r11
80031c0: f8 00 1a 6f calli 8009b7c <_POSIX_Timer_Insert_helper>
ptimer->ticks,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated )
80031c4: 44 20 00 0b be r1,r0,80031f0 <_POSIX_Timer_TSR+0x74> <== NEVER TAKEN
return;
/* Store the time when the timer was started again */
_TOD_Get( &ptimer->time );
80031c8: 35 61 00 6c addi r1,r11,108
80031cc: f8 00 04 82 calli 80043d4 <_TOD_Get>
/* The state really did not change but just to be safe */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
80031d0: 34 01 00 03 mvi r1,3
80031d4: e0 00 00 02 bi 80031dc <_POSIX_Timer_TSR+0x60>
} else {
/* Indicates that the timer is stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
80031d8: 34 01 00 04 mvi r1,4 <== NOT EXECUTED
80031dc: 31 61 00 3c sb (r11+60),r1
/*
* The sending of the signal to the process running the handling function
* specified for that signal is simulated
*/
if ( pthread_kill ( ptimer->thread_id, ptimer->inf.sigev_signo ) ) {
80031e0: 29 62 00 44 lw r2,(r11+68)
80031e4: 29 61 00 38 lw r1,(r11+56)
80031e8: f8 00 19 15 calli 800963c <pthread_kill>
}
/* After the signal handler returns, the count of expirations of the
* timer must be set to 0.
*/
ptimer->overrun = 0;
80031ec: 59 60 00 68 sw (r11+104),r0
}
80031f0: 2b 9d 00 04 lw ra,(sp+4)
80031f4: 2b 8b 00 08 lw r11,(sp+8)
80031f8: 37 9c 00 08 addi sp,sp,8
80031fc: c3 a0 00 00 ret
08010b44 <_POSIX_signals_Check_signal>:
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
8010b44: 37 9c ff b0 addi sp,sp,-80
8010b48: 5b 8b 00 1c sw (sp+28),r11
8010b4c: 5b 8c 00 18 sw (sp+24),r12
8010b50: 5b 8d 00 14 sw (sp+20),r13
8010b54: 5b 8e 00 10 sw (sp+16),r14
8010b58: 5b 8f 00 0c sw (sp+12),r15
8010b5c: 5b 90 00 08 sw (sp+8),r16
8010b60: 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,
8010b64: 37 90 00 48 addi r16,sp,72
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
8010b68: 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,
8010b6c: 34 05 00 01 mvi r5,1
8010b70: ba 00 18 00 mv r3,r16
bool _POSIX_signals_Check_signal(
POSIX_API_Control *api,
int signo,
bool is_global
)
{
8010b74: b8 20 68 00 mv r13,r1
8010b78: 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,
8010b7c: f8 00 00 37 calli 8010c58 <_POSIX_signals_Clear_signals>
is_global, true ) )
return false;
8010b80: 34 0f 00 00 mvi r15,0
{
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
8010b84: 44 20 00 2b be r1,r0,8010c30 <_POSIX_signals_Check_signal+0xec>
#endif
/*
* Just to prevent sending a signal which is currently being ignored.
*/
if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
8010b88: 34 02 00 01 mvi r2,1
8010b8c: b9 60 08 00 mv r1,r11
8010b90: f8 00 18 a5 calli 8016e24 <__ashlsi3>
8010b94: 78 0c 08 01 mvhi r12,0x801
8010b98: b4 2b 08 00 add r1,r1,r11
8010b9c: 34 02 00 02 mvi r2,2
8010ba0: f8 00 18 a1 calli 8016e24 <__ashlsi3>
8010ba4: 39 8c 9e 40 ori r12,r12,0x9e40
8010ba8: b5 81 60 00 add r12,r12,r1
8010bac: 29 8e 00 08 lw r14,(r12+8)
8010bb0: 34 01 00 01 mvi r1,1
8010bb4: 45 c1 00 1f be r14,r1,8010c30 <_POSIX_signals_Check_signal+0xec><== NEVER TAKEN
return false;
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
8010bb8: 29 af 00 d0 lw r15,(r13+208)
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
8010bbc: 29 81 00 04 lw r1,(r12+4)
/*
* We have to save the blocking information of the current wait queue
* because the signal handler may subsequently go on and put the thread
* on a wait queue, for its own purposes.
*/
memcpy( &stored_thread_wait_information, &_Thread_Executing->Wait,
8010bc0: 34 03 00 28 mvi r3,40
/*
* Block the signals requested in sa_mask
*/
saved_signals_blocked = api->signals_blocked;
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
8010bc4: b8 2f 08 00 or r1,r1,r15
8010bc8: 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,
8010bcc: 78 01 08 01 mvhi r1,0x801
8010bd0: 38 21 9d f0 ori r1,r1,0x9df0
8010bd4: 28 22 00 0c lw r2,(r1+12)
8010bd8: 37 81 00 20 addi r1,sp,32
8010bdc: 34 42 00 20 addi r2,r2,32
8010be0: f8 00 04 da calli 8011f48 <memcpy>
sizeof( Thread_Wait_information ));
/*
* Here, the signal handler function executes
*/
switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
8010be4: 29 82 00 00 lw r2,(r12+0)
8010be8: 34 01 00 02 mvi r1,2
8010bec: 5c 41 00 06 bne r2,r1,8010c04 <_POSIX_signals_Check_signal+0xc0>
case SA_SIGINFO:
(*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
8010bf0: b9 60 08 00 mv r1,r11
8010bf4: ba 00 10 00 mv r2,r16
8010bf8: 34 03 00 00 mvi r3,0
8010bfc: d9 c0 00 00 call r14
signo,
&siginfo_struct,
NULL /* context is undefined per 1003.1b-1993, p. 66 */
);
break;
8010c00: e0 00 00 03 bi 8010c0c <_POSIX_signals_Check_signal+0xc8>
default:
(*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
8010c04: b9 60 08 00 mv r1,r11
8010c08: d9 c0 00 00 call r14
}
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
8010c0c: 78 01 08 01 mvhi r1,0x801
8010c10: 38 21 9d f0 ori r1,r1,0x9df0
8010c14: 28 21 00 0c lw r1,(r1+12)
8010c18: 37 82 00 20 addi r2,sp,32
8010c1c: 34 03 00 28 mvi r3,40
8010c20: 34 21 00 20 addi r1,r1,32
8010c24: f8 00 04 c9 calli 8011f48 <memcpy>
sizeof( Thread_Wait_information ));
/*
* Restore the previous set of blocked signals
*/
api->signals_blocked = saved_signals_blocked;
8010c28: 59 af 00 d0 sw (r13+208),r15
return true;
8010c2c: 34 0f 00 01 mvi r15,1
}
8010c30: b9 e0 08 00 mv r1,r15
8010c34: 2b 9d 00 04 lw ra,(sp+4)
8010c38: 2b 8b 00 1c lw r11,(sp+28)
8010c3c: 2b 8c 00 18 lw r12,(sp+24)
8010c40: 2b 8d 00 14 lw r13,(sp+20)
8010c44: 2b 8e 00 10 lw r14,(sp+16)
8010c48: 2b 8f 00 0c lw r15,(sp+12)
8010c4c: 2b 90 00 08 lw r16,(sp+8)
8010c50: 37 9c 00 50 addi sp,sp,80
8010c54: c3 a0 00 00 ret
08011308 <_POSIX_signals_Clear_process_signals>:
*/
void _POSIX_signals_Clear_process_signals(
int signo
)
{
8011308: 37 9c ff ec addi sp,sp,-20
801130c: 5b 8b 00 14 sw (sp+20),r11
8011310: 5b 8c 00 10 sw (sp+16),r12
8011314: 5b 8d 00 0c sw (sp+12),r13
8011318: 5b 8e 00 08 sw (sp+8),r14
801131c: 5b 9d 00 04 sw (sp+4),ra
8011320: b8 20 60 00 mv r12,r1
clear_signal = true;
mask = signo_to_mask( signo );
ISR_Level level;
_ISR_Disable( level );
8011324: 90 00 68 00 rcsr r13,IE
8011328: 34 01 ff fe mvi r1,-2
801132c: a1 a1 08 00 and r1,r13,r1
8011330: d0 01 00 00 wcsr IE,r1
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
8011334: 34 02 00 01 mvi r2,1
8011338: b9 80 08 00 mv r1,r12
801133c: f8 00 16 ba calli 8016e24 <__ashlsi3>
8011340: b4 2c 70 00 add r14,r1,r12
8011344: 34 02 00 02 mvi r2,2
8011348: 78 0b 08 01 mvhi r11,0x801
801134c: b9 c0 08 00 mv r1,r14
8011350: f8 00 16 b5 calli 8016e24 <__ashlsi3>
8011354: 39 6b 9e 40 ori r11,r11,0x9e40
8011358: b5 61 08 00 add r1,r11,r1
801135c: 28 22 00 00 lw r2,(r1+0)
8011360: 34 01 00 02 mvi r1,2
8011364: 5c 41 00 0a bne r2,r1,801138c <_POSIX_signals_Clear_process_signals+0x84>
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
}
_ISR_Enable( level );
}
8011368: 34 02 00 02 mvi r2,2
801136c: 78 0b 08 01 mvhi r11,0x801
8011370: b9 c0 08 00 mv r1,r14
8011374: f8 00 16 ac calli 8016e24 <__ashlsi3>
8011378: 39 6b a0 38 ori r11,r11,0xa038
801137c: b5 61 08 00 add r1,r11,r1
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
8011380: 34 22 00 04 addi r2,r1,4
ISR_Level level;
_ISR_Disable( level );
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
8011384: 28 21 00 00 lw r1,(r1+0)
8011388: 5c 22 00 0a bne r1,r2,80113b0 <_POSIX_signals_Clear_process_signals+0xa8><== NEVER TAKEN
801138c: 35 82 ff ff addi r2,r12,-1
clear_signal = false;
}
if ( clear_signal ) {
_POSIX_signals_Pending &= ~mask;
8011390: 78 0b 08 01 mvhi r11,0x801
8011394: 34 01 00 01 mvi r1,1
8011398: f8 00 16 a3 calli 8016e24 <__ashlsi3>
801139c: 39 6b a0 34 ori r11,r11,0xa034
80113a0: 29 62 00 00 lw r2,(r11+0)
80113a4: a4 20 08 00 not r1,r1
80113a8: a0 22 08 00 and r1,r1,r2
80113ac: 59 61 00 00 sw (r11+0),r1
}
_ISR_Enable( level );
80113b0: d0 0d 00 00 wcsr IE,r13
}
80113b4: 2b 9d 00 04 lw ra,(sp+4)
80113b8: 2b 8b 00 14 lw r11,(sp+20)
80113bc: 2b 8c 00 10 lw r12,(sp+16)
80113c0: 2b 8d 00 0c lw r13,(sp+12)
80113c4: 2b 8e 00 08 lw r14,(sp+8)
80113c8: 37 9c 00 14 addi sp,sp,20
80113cc: c3 a0 00 00 ret
08003db8 <_POSIX_signals_Get_lowest>:
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
8003db8: 37 9c ff f0 addi sp,sp,-16
8003dbc: 5b 8b 00 10 sw (sp+16),r11
8003dc0: 5b 8c 00 0c sw (sp+12),r12
8003dc4: 5b 8d 00 08 sw (sp+8),r13
8003dc8: 5b 9d 00 04 sw (sp+4),ra
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
8003dcc: 34 0b 00 1b mvi r11,27
#include <rtems/score/isr.h>
int _POSIX_signals_Get_lowest(
sigset_t set
)
{
8003dd0: b8 20 60 00 mv r12,r1
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
8003dd4: 34 0d 00 20 mvi r13,32
8003dd8: 34 01 00 01 mvi r1,1
8003ddc: 35 62 ff ff addi r2,r11,-1
8003de0: f8 00 65 f5 calli 801d5b4 <__ashlsi3>
if ( set & signo_to_mask( signo ) ) {
8003de4: a0 2c 08 00 and r1,r1,r12
8003de8: 5c 20 00 0c bne r1,r0,8003e18 <_POSIX_signals_Get_lowest+0x60><== NEVER TAKEN
sigset_t set
)
{
int signo;
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
8003dec: 35 6b 00 01 addi r11,r11,1
8003df0: 5d 6d ff fa bne r11,r13,8003dd8 <_POSIX_signals_Get_lowest+0x20>
8003df4: 34 0b 00 01 mvi r11,1
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
8003df8: 34 0d 00 1b mvi r13,27
8003dfc: 34 01 00 01 mvi r1,1
8003e00: 35 62 ff ff addi r2,r11,-1
8003e04: f8 00 65 ec calli 801d5b4 <__ashlsi3>
if ( set & signo_to_mask( signo ) ) {
8003e08: a0 2c 08 00 and r1,r1,r12
8003e0c: 5c 20 00 03 bne r1,r0,8003e18 <_POSIX_signals_Get_lowest+0x60>
*/
#if (SIGHUP != 1)
#error "Assumption that SIGHUP==1 violated!!"
#endif
for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
8003e10: 35 6b 00 01 addi r11,r11,1
8003e14: 5d 6d ff fa bne r11,r13,8003dfc <_POSIX_signals_Get_lowest+0x44><== ALWAYS TAKEN
* a return 0. This routine will NOT be called unless a signal
* is pending in the set passed in.
*/
found_it:
return signo;
}
8003e18: b9 60 08 00 mv r1,r11
8003e1c: 2b 9d 00 04 lw ra,(sp+4)
8003e20: 2b 8b 00 10 lw r11,(sp+16)
8003e24: 2b 8c 00 0c lw r12,(sp+12)
8003e28: 2b 8d 00 08 lw r13,(sp+8)
8003e2c: 37 9c 00 10 addi sp,sp,16
8003e30: c3 a0 00 00 ret
080254c4 <_POSIX_signals_Unblock_thread>:
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
80254c4: 37 9c ff ec addi sp,sp,-20
80254c8: 5b 8b 00 14 sw (sp+20),r11
80254cc: 5b 8c 00 10 sw (sp+16),r12
80254d0: 5b 8d 00 0c sw (sp+12),r13
80254d4: 5b 8e 00 08 sw (sp+8),r14
80254d8: 5b 9d 00 04 sw (sp+4),ra
80254dc: b8 20 58 00 mv r11,r1
80254e0: b8 40 70 00 mv r14,r2
POSIX_API_Control *api;
sigset_t mask;
siginfo_t *the_info = NULL;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
80254e4: 28 2c 01 20 lw r12,(r1+288)
80254e8: 34 42 ff ff addi r2,r2,-1
80254ec: 34 01 00 01 mvi r1,1
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
siginfo_t *info
)
{
80254f0: b8 60 68 00 mv r13,r3
80254f4: fb ff 72 6b calli 8001ea0 <__ashlsi3>
/*
* Is the thread is specifically waiting for a signal?
*/
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
80254f8: 78 03 08 02 mvhi r3,0x802
80254fc: 38 63 6d 10 ori r3,r3,0x6d10
8025500: 29 64 00 10 lw r4,(r11+16)
8025504: 28 62 00 00 lw r2,(r3+0)
8025508: a0 82 18 00 and r3,r4,r2
802550c: 5c 62 00 1c bne r3,r2,802557c <_POSIX_signals_Unblock_thread+0xb8>
if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
8025510: 29 62 00 30 lw r2,(r11+48)
8025514: a0 22 10 00 and r2,r1,r2
8025518: 5c 40 00 06 bne r2,r0,8025530 <_POSIX_signals_Unblock_thread+0x6c>
802551c: 29 82 00 d0 lw r2,(r12+208)
/*
* This should only be reached via pthread_kill().
*/
return false;
8025520: 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) ) {
8025524: a4 40 10 00 not r2,r2
8025528: a0 22 08 00 and r1,r1,r2
802552c: 44 2c 00 39 be r1,r12,8025610 <_POSIX_signals_Unblock_thread+0x14c>
the_thread->Wait.return_code = EINTR;
8025530: 34 01 00 04 mvi r1,4
8025534: 59 61 00 34 sw (r11+52),r1
the_info = (siginfo_t *) the_thread->Wait.return_argument;
8025538: 29 61 00 28 lw r1,(r11+40)
if ( !info ) {
802553c: 5d a0 00 06 bne r13,r0,8025554 <_POSIX_signals_Unblock_thread+0x90>
the_info->si_signo = signo;
the_info->si_code = SI_USER;
8025540: 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;
8025544: 58 2e 00 00 sw (r1+0),r14
the_info->si_code = SI_USER;
8025548: 58 22 00 04 sw (r1+4),r2
the_info->si_value.sival_int = 0;
802554c: 58 20 00 08 sw (r1+8),r0
8025550: e0 00 00 07 bi 802556c <_POSIX_signals_Unblock_thread+0xa8>
} else {
*the_info = *info;
8025554: 29 a3 00 00 lw r3,(r13+0)
8025558: 29 a2 00 04 lw r2,(r13+4)
802555c: 29 a4 00 08 lw r4,(r13+8)
8025560: 58 23 00 00 sw (r1+0),r3
8025564: 58 22 00 04 sw (r1+4),r2
8025568: 58 24 00 08 sw (r1+8),r4
}
_Thread_queue_Extract_with_proxy( the_thread );
802556c: b9 60 08 00 mv r1,r11
8025570: fb ff 9c c3 calli 800c87c <_Thread_queue_Extract_with_proxy>
return true;
8025574: 34 0c 00 01 mvi r12,1
8025578: e0 00 00 26 bi 8025610 <_POSIX_signals_Unblock_thread+0x14c>
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
802557c: 29 82 00 d0 lw r2,(r12+208)
} else if ( the_thread->current_state == STATES_READY ) {
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
_Thread_Dispatch_necessary = true;
}
}
return false;
8025580: 34 0c 00 00 mvi r12,0
}
/*
* Thread is not waiting due to a sigwait.
*/
if ( ~api->signals_blocked & mask ) {
8025584: a4 40 10 00 not r2,r2
8025588: a0 22 08 00 and r1,r1,r2
802558c: 44 20 00 21 be r1,r0,8025610 <_POSIX_signals_Unblock_thread+0x14c>
8025590: 78 01 10 00 mvhi r1,0x1000
8025594: 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 ) ) {
8025598: 44 20 00 15 be r1,r0,80255ec <_POSIX_signals_Unblock_thread+0x128>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
802559c: 78 02 08 02 mvhi r2,0x802
the_thread->Wait.return_code = EINTR;
80255a0: 34 01 00 04 mvi r1,4
80255a4: 38 42 6a c4 ori r2,r2,0x6ac4
80255a8: 59 61 00 34 sw (r11+52),r1
80255ac: 28 41 00 00 lw r1,(r2+0)
80255b0: 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) )
80255b4: 44 20 00 04 be r1,r0,80255c4 <_POSIX_signals_Unblock_thread+0x100>
_Thread_queue_Extract_with_proxy( the_thread );
80255b8: b9 60 08 00 mv r1,r11
80255bc: fb ff 9c b0 calli 800c87c <_Thread_queue_Extract_with_proxy>
80255c0: e0 00 00 14 bi 8025610 <_POSIX_signals_Unblock_thread+0x14c>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_delaying (
States_Control the_states
)
{
return (the_states & STATES_DELAYING);
80255c4: 20 84 00 08 andi r4,r4,0x8
else if ( _States_Is_delaying(the_thread->current_state) ) {
80255c8: 44 8c 00 12 be r4,r12,8025610 <_POSIX_signals_Unblock_thread+0x14c><== NEVER TAKEN
(void) _Watchdog_Remove( &the_thread->Timer );
80255cc: 35 61 00 48 addi r1,r11,72
80255d0: fb ff 9f 80 calli 800d3d0 <_Watchdog_Remove>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
80255d4: 78 03 08 02 mvhi r3,0x802
80255d8: 38 63 69 18 ori r3,r3,0x6918
80255dc: 28 62 00 00 lw r2,(r3+0)
80255e0: b9 60 08 00 mv r1,r11
80255e4: fb ff 99 73 calli 800bbb0 <_Thread_Clear_state>
80255e8: e0 00 00 0a bi 8025610 <_POSIX_signals_Unblock_thread+0x14c>
_Thread_Unblock( the_thread );
}
} else if ( the_thread->current_state == STATES_READY ) {
80255ec: 5c 8c 00 09 bne r4,r12,8025610 <_POSIX_signals_Unblock_thread+0x14c><== NEVER TAKEN
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
80255f0: 78 01 08 02 mvhi r1,0x802
80255f4: 38 21 9e f0 ori r1,r1,0x9ef0
80255f8: 28 22 00 08 lw r2,(r1+8)
80255fc: 44 4c 00 05 be r2,r12,8025610 <_POSIX_signals_Unblock_thread+0x14c>
8025600: 28 22 00 0c lw r2,(r1+12)
8025604: 5d 62 00 03 bne r11,r2,8025610 <_POSIX_signals_Unblock_thread+0x14c><== NEVER TAKEN
_Thread_Dispatch_necessary = true;
8025608: 34 02 00 01 mvi r2,1
802560c: 30 22 00 18 sb (r1+24),r2
}
}
return false;
}
8025610: b9 80 08 00 mv r1,r12
8025614: 2b 9d 00 04 lw ra,(sp+4)
8025618: 2b 8b 00 14 lw r11,(sp+20)
802561c: 2b 8c 00 10 lw r12,(sp+16)
8025620: 2b 8d 00 0c lw r13,(sp+12)
8025624: 2b 8e 00 08 lw r14,(sp+8)
8025628: 37 9c 00 14 addi sp,sp,20
802562c: c3 a0 00 00 ret
08004264 <_RTEMS_tasks_Initialize_user_tasks_body>:
*
* Output parameters: NONE
*/
void _RTEMS_tasks_Initialize_user_tasks_body( void )
{
8004264: 37 9c ff e8 addi sp,sp,-24
8004268: 5b 8b 00 14 sw (sp+20),r11
800426c: 5b 8c 00 10 sw (sp+16),r12
8004270: 5b 8d 00 0c sw (sp+12),r13
8004274: 5b 8e 00 08 sw (sp+8),r14
8004278: 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;
800427c: 78 01 08 01 mvhi r1,0x801
8004280: 38 21 90 74 ori r1,r1,0x9074
8004284: 28 2b 00 2c lw r11,(r1+44)
maximum = Configuration_RTEMS_API.number_of_initialization_tasks;
8004288: 28 2e 00 28 lw r14,(r1+40)
/*
* Verify that we have a set of user tasks to iterate
*/
if ( !user_tasks )
800428c: 34 0d 00 00 mvi r13,0
8004290: 5d 60 00 1a bne r11,r0,80042f8 <_RTEMS_tasks_Initialize_user_tasks_body+0x94>
8004294: e0 00 00 1a bi 80042fc <_RTEMS_tasks_Initialize_user_tasks_body+0x98>
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
return_value = rtems_task_create(
8004298: 29 61 00 00 lw r1,(r11+0)
800429c: 29 62 00 08 lw r2,(r11+8)
80042a0: 29 63 00 04 lw r3,(r11+4)
80042a4: 29 64 00 14 lw r4,(r11+20)
80042a8: 29 65 00 0c lw r5,(r11+12)
80042ac: 37 86 00 18 addi r6,sp,24
80042b0: f8 00 26 95 calli 800dd04 <rtems_task_create>
80042b4: b8 20 60 00 mv r12,r1
user_tasks[ index ].stack_size,
user_tasks[ index ].mode_set,
user_tasks[ index ].attribute_set,
&id
);
if ( !rtems_is_status_successful( return_value ) )
80042b8: 44 20 00 05 be r1,r0,80042cc <_RTEMS_tasks_Initialize_user_tasks_body+0x68><== ALWAYS TAKEN
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
80042bc: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
80042c0: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
80042c4: b9 80 18 00 mv r3,r12 <== NOT EXECUTED
80042c8: e0 00 00 0a bi 80042f0 <_RTEMS_tasks_Initialize_user_tasks_body+0x8c><== NOT EXECUTED
return_value = rtems_task_start(
80042cc: 29 63 00 18 lw r3,(r11+24)
80042d0: 29 62 00 10 lw r2,(r11+16)
80042d4: 2b 81 00 18 lw r1,(sp+24)
80042d8: 35 6b 00 1c addi r11,r11,28
80042dc: f8 00 00 0f calli 8004318 <rtems_task_start>
80042e0: b8 20 18 00 mv r3,r1
id,
user_tasks[ index ].entry_point,
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
80042e4: 44 2c 00 04 be r1,r12,80042f4 <_RTEMS_tasks_Initialize_user_tasks_body+0x90>
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
80042e8: 34 01 00 01 mvi r1,1
80042ec: 34 02 00 01 mvi r2,1
80042f0: f8 00 04 ac calli 80055a0 <_Internal_error_Occurred>
return;
/*
* Now iterate over the initialization tasks and create/start them.
*/
for ( index=0 ; index < maximum ; index++ ) {
80042f4: 35 ad 00 01 addi r13,r13,1
80042f8: 55 cd ff e8 bgu r14,r13,8004298 <_RTEMS_tasks_Initialize_user_tasks_body+0x34>
user_tasks[ index ].argument
);
if ( !rtems_is_status_successful( return_value ) )
_Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value );
}
}
80042fc: 2b 9d 00 04 lw ra,(sp+4)
8004300: 2b 8b 00 14 lw r11,(sp+20)
8004304: 2b 8c 00 10 lw r12,(sp+16)
8004308: 2b 8d 00 0c lw r13,(sp+12)
800430c: 2b 8e 00 08 lw r14,(sp+8)
8004310: 37 9c 00 18 addi sp,sp,24
8004314: c3 a0 00 00 ret
08004604 <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
8004604: 37 9c ff f4 addi sp,sp,-12
8004608: 5b 8b 00 08 sw (sp+8),r11
800460c: 5b 9d 00 04 sw (sp+4),ra
8004610: b8 20 10 00 mv r2,r1
8004614: 78 01 08 02 mvhi r1,0x802
8004618: 38 21 08 90 ori r1,r1,0x890
800461c: 37 83 00 0c addi r3,sp,12
8004620: f8 00 08 e7 calli 80069bc <_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 ) {
8004624: 2b 82 00 0c lw r2,(sp+12)
8004628: b8 20 58 00 mv r11,r1
800462c: 5c 40 00 22 bne r2,r0,80046b4 <_Rate_monotonic_Timeout+0xb0><== NEVER TAKEN
case OBJECTS_LOCAL:
the_thread = the_period->owner;
8004630: 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);
8004634: 28 23 00 10 lw r3,(r1+16)
8004638: 20 63 40 00 andi r3,r3,0x4000
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
800463c: 44 62 00 09 be r3,r2,8004660 <_Rate_monotonic_Timeout+0x5c>
8004640: 28 23 00 20 lw r3,(r1+32)
8004644: 29 62 00 08 lw r2,(r11+8)
8004648: 5c 62 00 06 bne r3,r2,8004660 <_Rate_monotonic_Timeout+0x5c>
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
800464c: 78 03 08 01 mvhi r3,0x801
8004650: 38 63 e6 ec ori r3,r3,0xe6ec
8004654: 28 62 00 00 lw r2,(r3+0)
8004658: f8 00 0b 70 calli 8007418 <_Thread_Clear_state>
800465c: e0 00 00 06 bi 8004674 <_Rate_monotonic_Timeout+0x70>
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
8004660: 29 62 00 38 lw r2,(r11+56)
8004664: 34 01 00 01 mvi r1,1
8004668: 5c 41 00 0c bne r2,r1,8004698 <_Rate_monotonic_Timeout+0x94>
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
800466c: 34 01 00 03 mvi r1,3
8004670: 59 61 00 38 sw (r11+56),r1
_Rate_monotonic_Initiate_statistics( the_period );
8004674: b9 60 08 00 mv r1,r11
8004678: fb ff fe 2e calli 8003f30 <_Rate_monotonic_Initiate_statistics>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
800467c: 29 61 00 3c lw r1,(r11+60)
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8004680: 35 62 00 10 addi r2,r11,16
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004684: 59 61 00 1c sw (r11+28),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8004688: 78 01 08 02 mvhi r1,0x802
800468c: 38 21 0a 98 ori r1,r1,0xa98
8004690: f8 00 11 02 calli 8008a98 <_Watchdog_Insert>
8004694: e0 00 00 03 bi 80046a0 <_Rate_monotonic_Timeout+0x9c>
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
8004698: 34 01 00 04 mvi r1,4
800469c: 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;
80046a0: 78 01 08 02 mvhi r1,0x802
80046a4: 38 21 09 b8 ori r1,r1,0x9b8
80046a8: 28 22 00 00 lw r2,(r1+0)
80046ac: 34 42 ff ff addi r2,r2,-1
80046b0: 58 22 00 00 sw (r1+0),r2
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
80046b4: 2b 9d 00 04 lw ra,(sp+4)
80046b8: 2b 8b 00 08 lw r11,(sp+8)
80046bc: 37 9c 00 0c addi sp,sp,12
80046c0: c3 a0 00 00 ret
08003fc4 <_Rate_monotonic_Update_statistics>:
void _Rate_monotonic_Update_statistics(
Rate_monotonic_Control *the_period
)
{
8003fc4: 37 9c ff e4 addi sp,sp,-28
8003fc8: 5b 8b 00 0c sw (sp+12),r11
8003fcc: 5b 8c 00 08 sw (sp+8),r12
8003fd0: 5b 9d 00 04 sw (sp+4),ra
8003fd4: b8 20 58 00 mv r11,r1
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
8003fd8: 28 21 00 54 lw r1,(r1+84)
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
8003fdc: 29 62 00 38 lw r2,(r11+56)
/*
* Update the counts.
*/
stats = &the_period->Statistics;
stats->count++;
8003fe0: 34 21 00 01 addi r1,r1,1
8003fe4: 59 61 00 54 sw (r11+84),r1
if ( the_period->state == RATE_MONOTONIC_EXPIRED )
8003fe8: 34 01 00 04 mvi r1,4
8003fec: 5c 41 00 04 bne r2,r1,8003ffc <_Rate_monotonic_Update_statistics+0x38>
stats->missed_count++;
8003ff0: 29 61 00 58 lw r1,(r11+88)
8003ff4: 34 21 00 01 addi r1,r1,1
8003ff8: 59 61 00 58 sw (r11+88),r1
/*
* Grab status for time statistics.
*/
valid_status =
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
8003ffc: 37 8c 00 18 addi r12,sp,24
stats->missed_count++;
/*
* Grab status for time statistics.
*/
valid_status =
8004000: b9 60 08 00 mv r1,r11
8004004: 37 82 00 10 addi r2,sp,16
8004008: b9 80 18 00 mv r3,r12
800400c: fb ff ff 90 calli 8003e4c <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status( the_period, &since_last_period, &executed );
if (!valid_status)
8004010: 44 20 00 28 be r1,r0,80040b0 <_Rate_monotonic_Update_statistics+0xec><== NEVER TAKEN
/*
* Update CPU time
*/
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_Add_to( &stats->total_cpu_time, &executed );
8004014: b9 80 10 00 mv r2,r12
8004018: 35 61 00 6c addi r1,r11,108
800401c: f8 00 11 3c calli 800850c <_Timespec_Add_to>
if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) )
8004020: b9 80 08 00 mv r1,r12
8004024: 35 62 00 5c addi r2,r11,92
8004028: f8 00 11 97 calli 8008684 <_Timespec_Less_than>
800402c: 44 20 00 05 be r1,r0,8004040 <_Rate_monotonic_Update_statistics+0x7c>
stats->min_cpu_time = executed;
8004030: 2b 81 00 18 lw r1,(sp+24)
8004034: 59 61 00 5c sw (r11+92),r1
8004038: 2b 81 00 1c lw r1,(sp+28)
800403c: 59 61 00 60 sw (r11+96),r1
if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) )
8004040: 37 81 00 18 addi r1,sp,24
8004044: 35 62 00 64 addi r2,r11,100
8004048: f8 00 11 84 calli 8008658 <_Timespec_Greater_than>
800404c: 44 20 00 05 be r1,r0,8004060 <_Rate_monotonic_Update_statistics+0x9c>
stats->max_cpu_time = executed;
8004050: 2b 81 00 18 lw r1,(sp+24)
8004054: 59 61 00 64 sw (r11+100),r1
8004058: 2b 81 00 1c lw r1,(sp+28)
800405c: 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 );
8004060: 37 8c 00 10 addi r12,sp,16
8004064: b9 80 10 00 mv r2,r12
8004068: 35 61 00 84 addi r1,r11,132
800406c: f8 00 11 28 calli 800850c <_Timespec_Add_to>
if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) )
8004070: b9 80 08 00 mv r1,r12
8004074: 35 62 00 74 addi r2,r11,116
8004078: f8 00 11 83 calli 8008684 <_Timespec_Less_than>
800407c: 44 20 00 05 be r1,r0,8004090 <_Rate_monotonic_Update_statistics+0xcc>
stats->min_wall_time = since_last_period;
8004080: 2b 81 00 10 lw r1,(sp+16)
8004084: 59 61 00 74 sw (r11+116),r1
8004088: 2b 81 00 14 lw r1,(sp+20)
800408c: 59 61 00 78 sw (r11+120),r1
if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) )
8004090: 37 81 00 10 addi r1,sp,16
8004094: 35 62 00 7c addi r2,r11,124
8004098: f8 00 11 70 calli 8008658 <_Timespec_Greater_than>
800409c: 44 20 00 05 be r1,r0,80040b0 <_Rate_monotonic_Update_statistics+0xec>
stats->max_wall_time = since_last_period;
80040a0: 2b 81 00 10 lw r1,(sp+16)
80040a4: 59 61 00 7c sw (r11+124),r1
80040a8: 2b 81 00 14 lw r1,(sp+20)
80040ac: 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
}
80040b0: 2b 9d 00 04 lw ra,(sp+4)
80040b4: 2b 8b 00 0c lw r11,(sp+12)
80040b8: 2b 8c 00 08 lw r12,(sp+8)
80040bc: 37 9c 00 1c addi sp,sp,28
80040c0: c3 a0 00 00 ret
0800ee10 <_Scheduler_priority_Block>:
void _Scheduler_priority_Block(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
800ee10: 37 9c ff ec addi sp,sp,-20
800ee14: 5b 8b 00 14 sw (sp+20),r11
800ee18: 5b 8c 00 10 sw (sp+16),r12
800ee1c: 5b 8d 00 0c sw (sp+12),r13
800ee20: 5b 8e 00 08 sw (sp+8),r14
800ee24: 5b 9d 00 04 sw (sp+4),ra
800ee28: b8 40 60 00 mv r12,r2
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_extract(
Thread_Control *the_thread
)
{
Chain_Control *ready = the_thread->scheduler.priority->ready_chain;
800ee2c: 28 42 00 8c lw r2,(r2+140)
800ee30: 28 43 00 00 lw r3,(r2+0)
if ( _Chain_Has_only_one_node( ready ) ) {
800ee34: 28 64 00 00 lw r4,(r3+0)
800ee38: 28 62 00 08 lw r2,(r3+8)
800ee3c: 5c 82 00 13 bne r4,r2,800ee88 <_Scheduler_priority_Block+0x78>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
800ee40: 34 62 00 04 addi r2,r3,4
head->next = tail;
800ee44: 58 62 00 00 sw (r3+0),r2
head->previous = NULL;
800ee48: 58 60 00 04 sw (r3+4),r0
tail->previous = head;
800ee4c: 58 63 00 08 sw (r3+8),r3
_Chain_Initialize_empty( ready );
_Priority_bit_map_Remove( &the_thread->scheduler.priority->Priority_map );
800ee50: 29 82 00 8c lw r2,(r12+140)
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor &= the_priority_map->block_minor;
800ee54: 28 44 00 04 lw r4,(r2+4)
800ee58: 2c 45 00 0e lhu r5,(r2+14)
800ee5c: 2c 83 00 00 lhu r3,(r4+0)
800ee60: a0 65 18 00 and r3,r3,r5
800ee64: 0c 83 00 00 sh (r4+0),r3
if ( *the_priority_map->minor == 0 )
800ee68: 5c 60 00 0c bne r3,r0,800ee98 <_Scheduler_priority_Block+0x88>
_Priority_Major_bit_map &= the_priority_map->block_major;
800ee6c: 78 03 08 01 mvhi r3,0x801
800ee70: 38 63 9e 10 ori r3,r3,0x9e10
800ee74: 2c 64 00 00 lhu r4,(r3+0)
800ee78: 2c 42 00 0c lhu r2,(r2+12)
800ee7c: a0 44 10 00 and r2,r2,r4
800ee80: 0c 62 00 00 sh (r3+0),r2
800ee84: e0 00 00 05 bi 800ee98 <_Scheduler_priority_Block+0x88>
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
800ee88: 29 83 00 00 lw r3,(r12+0)
previous = the_node->previous;
800ee8c: 29 82 00 04 lw r2,(r12+4)
next->previous = previous;
800ee90: 58 62 00 04 sw (r3+4),r2
previous->next = next;
800ee94: 58 43 00 00 sw (r2+0),r3
RTEMS_INLINE_ROUTINE bool _Thread_Is_heir (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Heir );
800ee98: 78 02 08 01 mvhi r2,0x801
800ee9c: 38 42 9d f0 ori r2,r2,0x9df0
{
_Scheduler_priority_Ready_queue_extract(the_thread);
/* TODO: flash critical section */
if ( _Thread_Is_heir( the_thread ) )
800eea0: 28 42 00 10 lw r2,(r2+16)
800eea4: 5d 82 00 39 bne r12,r2,800ef88 <_Scheduler_priority_Block+0x178>
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
800eea8: 78 02 08 01 mvhi r2,0x801
800eeac: 38 42 9e 10 ori r2,r2,0x9e10
_Scheduler_priority_Block_body(the_scheduler, the_thread);
}
800eeb0: 28 2e 00 00 lw r14,(r1+0)
800eeb4: 2c 41 00 00 lhu r1,(r2+0)
800eeb8: 78 0b 08 01 mvhi r11,0x801
800eebc: 34 02 00 ff mvi r2,255
800eec0: 20 21 ff ff andi r1,r1,0xffff
800eec4: 39 6b 7f 1c ori r11,r11,0x7f1c
800eec8: 54 22 00 05 bgu r1,r2,800eedc <_Scheduler_priority_Block+0xcc>
800eecc: b5 61 58 00 add r11,r11,r1
800eed0: 41 6d 00 00 lbu r13,(r11+0)
800eed4: 35 ad 00 08 addi r13,r13,8
800eed8: e0 00 00 05 bi 800eeec <_Scheduler_priority_Block+0xdc>
800eedc: 34 02 00 08 mvi r2,8
800eee0: f8 00 20 1f calli 8016f5c <__lshrsi3>
800eee4: b5 61 58 00 add r11,r11,r1
800eee8: 41 6d 00 00 lbu r13,(r11+0)
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
800eeec: 34 02 00 01 mvi r2,1
800eef0: 78 0b 08 01 mvhi r11,0x801
800eef4: b9 a0 08 00 mv r1,r13
800eef8: f8 00 1f cb calli 8016e24 <__ashlsi3>
800eefc: 39 6b 9e 18 ori r11,r11,0x9e18
800ef00: b5 61 58 00 add r11,r11,r1
800ef04: 2d 62 00 00 lhu r2,(r11+0)
800ef08: 34 01 00 ff mvi r1,255
800ef0c: 78 0b 08 01 mvhi r11,0x801
800ef10: 39 6b 7f 1c ori r11,r11,0x7f1c
800ef14: 54 41 00 05 bgu r2,r1,800ef28 <_Scheduler_priority_Block+0x118>
800ef18: b5 62 58 00 add r11,r11,r2
800ef1c: 41 6b 00 00 lbu r11,(r11+0)
800ef20: 35 6b 00 08 addi r11,r11,8
800ef24: e0 00 00 06 bi 800ef3c <_Scheduler_priority_Block+0x12c>
800ef28: b8 40 08 00 mv r1,r2
800ef2c: 34 02 00 08 mvi r2,8
800ef30: f8 00 20 0b calli 8016f5c <__lshrsi3>
800ef34: b5 61 58 00 add r11,r11,r1
800ef38: 41 6b 00 00 lbu r11,(r11+0)
return (_Priority_Bits_index( major ) << 4) +
800ef3c: 34 02 00 04 mvi r2,4
800ef40: b9 a0 08 00 mv r1,r13
800ef44: f8 00 1f b8 calli 8016e24 <__ashlsi3>
800ef48: b5 61 58 00 add r11,r11,r1
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
800ef4c: 34 02 00 01 mvi r2,1
800ef50: b9 60 08 00 mv r1,r11
800ef54: f8 00 1f b4 calli 8016e24 <__ashlsi3>
800ef58: 34 02 00 02 mvi r2,2
800ef5c: b4 2b 08 00 add r1,r1,r11
800ef60: f8 00 1f b1 calli 8016e24 <__ashlsi3>
800ef64: b5 c1 08 00 add r1,r14,r1
800ef68: 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 );
800ef6c: 34 21 00 04 addi r1,r1,4
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
800ef70: 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 ] ) )
800ef74: 44 61 00 02 be r3,r1,800ef7c <_Scheduler_priority_Block+0x16c><== NEVER TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
800ef78: 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(
800ef7c: 78 01 08 01 mvhi r1,0x801
800ef80: 38 21 9d f0 ori r1,r1,0x9df0
800ef84: 58 22 00 10 sw (r1+16),r2
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
800ef88: 78 01 08 01 mvhi r1,0x801
800ef8c: 38 21 9d f0 ori r1,r1,0x9df0
/* TODO: flash critical section */
if ( _Thread_Is_heir( the_thread ) )
_Scheduler_priority_Schedule_body(the_scheduler);
if ( _Thread_Is_executing( the_thread ) )
800ef90: 28 22 00 0c lw r2,(r1+12)
800ef94: 5d 82 00 03 bne r12,r2,800efa0 <_Scheduler_priority_Block+0x190>
_Thread_Dispatch_necessary = true;
800ef98: 34 02 00 01 mvi r2,1
800ef9c: 30 22 00 18 sb (r1+24),r2
800efa0: 2b 9d 00 04 lw ra,(sp+4)
800efa4: 2b 8b 00 14 lw r11,(sp+20)
800efa8: 2b 8c 00 10 lw r12,(sp+16)
800efac: 2b 8d 00 0c lw r13,(sp+12)
800efb0: 2b 8e 00 08 lw r14,(sp+8)
800efb4: 37 9c 00 14 addi sp,sp,20
800efb8: c3 a0 00 00 ret
080061f4 <_Scheduler_priority_Schedule>:
*/
void _Scheduler_priority_Schedule(
Scheduler_Control *the_scheduler
)
{
80061f4: 37 9c ff f0 addi sp,sp,-16
80061f8: 5b 8b 00 10 sw (sp+16),r11
80061fc: 5b 8c 00 0c sw (sp+12),r12
8006200: 5b 8d 00 08 sw (sp+8),r13
8006204: 5b 9d 00 04 sw (sp+4),ra
RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void )
{
Priority_bit_map_Control minor;
Priority_bit_map_Control major;
_Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
8006208: 78 02 08 01 mvhi r2,0x801
800620c: 38 42 9e 10 ori r2,r2,0x9e10
_Scheduler_priority_Schedule_body( the_scheduler );
}
8006210: 28 2d 00 00 lw r13,(r1+0)
8006214: 2c 41 00 00 lhu r1,(r2+0)
8006218: 78 0b 08 01 mvhi r11,0x801
800621c: 34 02 00 ff mvi r2,255
8006220: 20 21 ff ff andi r1,r1,0xffff
8006224: 39 6b 7f 1c ori r11,r11,0x7f1c
8006228: 54 22 00 05 bgu r1,r2,800623c <_Scheduler_priority_Schedule+0x48>
800622c: b5 61 58 00 add r11,r11,r1
8006230: 41 6c 00 00 lbu r12,(r11+0)
8006234: 35 8c 00 08 addi r12,r12,8
8006238: e0 00 00 05 bi 800624c <_Scheduler_priority_Schedule+0x58>
800623c: 34 02 00 08 mvi r2,8
8006240: f8 00 43 47 calli 8016f5c <__lshrsi3>
8006244: b5 61 58 00 add r11,r11,r1
8006248: 41 6c 00 00 lbu r12,(r11+0)
_Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
800624c: 34 02 00 01 mvi r2,1
8006250: 78 0b 08 01 mvhi r11,0x801
8006254: b9 80 08 00 mv r1,r12
8006258: f8 00 42 f3 calli 8016e24 <__ashlsi3>
800625c: 39 6b 9e 18 ori r11,r11,0x9e18
8006260: b5 61 58 00 add r11,r11,r1
8006264: 2d 62 00 00 lhu r2,(r11+0)
8006268: 34 01 00 ff mvi r1,255
800626c: 78 0b 08 01 mvhi r11,0x801
8006270: 39 6b 7f 1c ori r11,r11,0x7f1c
8006274: 54 41 00 05 bgu r2,r1,8006288 <_Scheduler_priority_Schedule+0x94>
8006278: b5 62 58 00 add r11,r11,r2
800627c: 41 6b 00 00 lbu r11,(r11+0)
8006280: 35 6b 00 08 addi r11,r11,8
8006284: e0 00 00 06 bi 800629c <_Scheduler_priority_Schedule+0xa8>
8006288: b8 40 08 00 mv r1,r2
800628c: 34 02 00 08 mvi r2,8
8006290: f8 00 43 33 calli 8016f5c <__lshrsi3>
8006294: b5 61 58 00 add r11,r11,r1
8006298: 41 6b 00 00 lbu r11,(r11+0)
return (_Priority_Bits_index( major ) << 4) +
800629c: 34 02 00 04 mvi r2,4
80062a0: b9 80 08 00 mv r1,r12
80062a4: f8 00 42 e0 calli 8016e24 <__ashlsi3>
80062a8: b5 61 58 00 add r11,r11,r1
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
80062ac: 34 02 00 01 mvi r2,1
80062b0: b9 60 08 00 mv r1,r11
80062b4: f8 00 42 dc calli 8016e24 <__ashlsi3>
80062b8: 34 02 00 02 mvi r2,2
80062bc: b4 2b 08 00 add r1,r1,r11
80062c0: f8 00 42 d9 calli 8016e24 <__ashlsi3>
80062c4: b5 a1 08 00 add r1,r13,r1
80062c8: 28 23 00 00 lw r3,(r1+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
80062cc: 34 21 00 04 addi r1,r1,4
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
return NULL;
80062d0: 34 02 00 00 mvi r2,0
Chain_Control *the_ready_queue
)
{
Priority_Control index = _Priority_bit_map_Get_highest();
if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) )
80062d4: 44 61 00 02 be r3,r1,80062dc <_Scheduler_priority_Schedule+0xe8><== NEVER TAKEN
return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] );
80062d8: b8 60 10 00 mv r2,r3
RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(
Scheduler_Control *the_scheduler
)
{
_Thread_Heir = _Scheduler_priority_Ready_queue_first(
80062dc: 78 01 08 01 mvhi r1,0x801
80062e0: 38 21 9d f0 ori r1,r1,0x9df0
80062e4: 58 22 00 10 sw (r1+16),r2
80062e8: 2b 9d 00 04 lw ra,(sp+4)
80062ec: 2b 8b 00 10 lw r11,(sp+16)
80062f0: 2b 8c 00 0c lw r12,(sp+12)
80062f4: 2b 8d 00 08 lw r13,(sp+8)
80062f8: 37 9c 00 10 addi sp,sp,16
80062fc: c3 a0 00 00 ret
08004fd8 <_TOD_Get>:
*/
void _TOD_Get(
struct timespec *time
)
{
8004fd8: 37 9c ff e4 addi sp,sp,-28
8004fdc: 5b 8b 00 0c sw (sp+12),r11
8004fe0: 5b 8c 00 08 sw (sp+8),r12
8004fe4: 5b 9d 00 04 sw (sp+4),ra
8004fe8: 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 );
8004fec: 90 00 60 00 rcsr r12,IE
8004ff0: 34 01 ff fe mvi r1,-2
8004ff4: a1 81 08 00 and r1,r12,r1
8004ff8: d0 01 00 00 wcsr IE,r1
now = _TOD_Now;
8004ffc: 78 02 08 01 mvhi r2,0x801
8005000: 38 42 99 c8 ori r2,r2,0x99c8
8005004: 28 41 00 00 lw r1,(r2+0)
8005008: 5b 81 00 10 sw (sp+16),r1
800500c: 28 41 00 04 lw r1,(r2+4)
if ( _Watchdog_Nanoseconds_since_tick_handler )
8005010: 78 02 08 01 mvhi r2,0x801
8005014: 38 42 9a 9c ori r2,r2,0x9a9c
8005018: 28 43 00 00 lw r3,(r2+0)
/* assume time checked for NULL by caller */
/* _TOD_Now is the native current time */
nanoseconds = 0;
_ISR_Disable( level );
now = _TOD_Now;
800501c: 5b 81 00 14 sw (sp+20),r1
long nanoseconds;
/* assume time checked for NULL by caller */
/* _TOD_Now is the native current time */
nanoseconds = 0;
8005020: 34 02 00 00 mvi r2,0
_ISR_Disable( level );
now = _TOD_Now;
if ( _Watchdog_Nanoseconds_since_tick_handler )
8005024: 44 60 00 03 be r3,r0,8005030 <_TOD_Get+0x58> <== ALWAYS TAKEN
nanoseconds = (*_Watchdog_Nanoseconds_since_tick_handler)();
8005028: d8 60 00 00 call r3 <== NOT EXECUTED
800502c: b8 20 10 00 mv r2,r1 <== NOT EXECUTED
_ISR_Enable( level );
8005030: d0 0c 00 00 wcsr IE,r12
_Timestamp_Set( &offset, 0, nanoseconds );
8005034: 5b 82 00 1c sw (sp+28),r2
_Timestamp_Add_to( &now, &offset );
8005038: 37 81 00 10 addi r1,sp,16
800503c: 37 82 00 18 addi r2,sp,24
now = _TOD_Now;
if ( _Watchdog_Nanoseconds_since_tick_handler )
nanoseconds = (*_Watchdog_Nanoseconds_since_tick_handler)();
_ISR_Enable( level );
_Timestamp_Set( &offset, 0, nanoseconds );
8005040: 5b 80 00 18 sw (sp+24),r0
_Timestamp_Add_to( &now, &offset );
8005044: f8 00 09 84 calli 8007654 <_Timespec_Add_to>
_Timestamp_To_timespec( &now, time );
8005048: 2b 81 00 10 lw r1,(sp+16)
800504c: 59 61 00 00 sw (r11+0),r1
8005050: 2b 81 00 14 lw r1,(sp+20)
8005054: 59 61 00 04 sw (r11+4),r1
}
8005058: 2b 9d 00 04 lw ra,(sp+4)
800505c: 2b 8b 00 0c lw r11,(sp+12)
8005060: 2b 8c 00 08 lw r12,(sp+8)
8005064: 37 9c 00 1c addi sp,sp,28
8005068: c3 a0 00 00 ret
0800e674 <_TOD_Get_uptime>:
*/
void _TOD_Get_uptime(
Timestamp_Control *uptime
)
{
800e674: 37 9c ff e4 addi sp,sp,-28
800e678: 5b 8b 00 0c sw (sp+12),r11
800e67c: 5b 8c 00 08 sw (sp+8),r12
800e680: 5b 9d 00 04 sw (sp+4),ra
800e684: 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 );
800e688: 90 00 60 00 rcsr r12,IE
800e68c: 34 01 ff fe mvi r1,-2
800e690: a1 81 08 00 and r1,r12,r1
800e694: d0 01 00 00 wcsr IE,r1
up = _TOD_Uptime;
800e698: 78 02 08 01 mvhi r2,0x801
800e69c: 38 42 99 9c ori r2,r2,0x999c
800e6a0: 28 41 00 00 lw r1,(r2+0)
800e6a4: 5b 81 00 10 sw (sp+16),r1
800e6a8: 28 41 00 04 lw r1,(r2+4)
if ( _Watchdog_Nanoseconds_since_tick_handler )
800e6ac: 78 02 08 01 mvhi r2,0x801
800e6b0: 38 42 9a 9c ori r2,r2,0x9a9c
800e6b4: 28 43 00 00 lw r3,(r2+0)
/* assume time checked for NULL by caller */
/* _TOD_Uptime is in native timestamp format */
nanoseconds = 0;
_ISR_Disable( level );
up = _TOD_Uptime;
800e6b8: 5b 81 00 14 sw (sp+20),r1
long nanoseconds;
/* assume time checked for NULL by caller */
/* _TOD_Uptime is in native timestamp format */
nanoseconds = 0;
800e6bc: 34 02 00 00 mvi r2,0
_ISR_Disable( level );
up = _TOD_Uptime;
if ( _Watchdog_Nanoseconds_since_tick_handler )
800e6c0: 44 60 00 03 be r3,r0,800e6cc <_TOD_Get_uptime+0x58> <== ALWAYS TAKEN
nanoseconds = (*_Watchdog_Nanoseconds_since_tick_handler)();
800e6c4: d8 60 00 00 call r3 <== NOT EXECUTED
800e6c8: b8 20 10 00 mv r2,r1 <== NOT EXECUTED
_ISR_Enable( level );
800e6cc: d0 0c 00 00 wcsr IE,r12
_Timestamp_Set( &offset, 0, nanoseconds );
800e6d0: 5b 82 00 1c sw (sp+28),r2
_Timestamp_Add_to( &up, &offset );
800e6d4: 37 81 00 10 addi r1,sp,16
800e6d8: 37 82 00 18 addi r2,sp,24
up = _TOD_Uptime;
if ( _Watchdog_Nanoseconds_since_tick_handler )
nanoseconds = (*_Watchdog_Nanoseconds_since_tick_handler)();
_ISR_Enable( level );
_Timestamp_Set( &offset, 0, nanoseconds );
800e6dc: 5b 80 00 18 sw (sp+24),r0
_Timestamp_Add_to( &up, &offset );
800e6e0: fb ff e3 dd calli 8007654 <_Timespec_Add_to>
*uptime = up;
800e6e4: 2b 81 00 10 lw r1,(sp+16)
800e6e8: 59 61 00 00 sw (r11+0),r1
800e6ec: 2b 81 00 14 lw r1,(sp+20)
800e6f0: 59 61 00 04 sw (r11+4),r1
}
800e6f4: 2b 9d 00 04 lw ra,(sp+4)
800e6f8: 2b 8b 00 0c lw r11,(sp+12)
800e6fc: 2b 8c 00 08 lw r12,(sp+8)
800e700: 37 9c 00 1c addi sp,sp,28
800e704: c3 a0 00 00 ret
08004230 <_TOD_Validate>:
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
8004230: 37 9c ff f0 addi sp,sp,-16
8004234: 5b 8b 00 10 sw (sp+16),r11
8004238: 5b 8c 00 0c sw (sp+12),r12
800423c: 5b 8d 00 08 sw (sp+8),r13
8004240: 5b 9d 00 04 sw (sp+4),ra
8004244: 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();
8004248: 78 01 08 02 mvhi r1,0x802
800424c: 38 21 10 c4 ori r1,r1,0x10c4
8004250: 28 22 00 0c lw r2,(r1+12)
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
return false;
8004254: 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) ||
8004258: 45 60 00 22 be r11,r0,80042e0 <_TOD_Validate+0xb0> <== NEVER TAKEN
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
800425c: 78 03 08 01 mvhi r3,0x801
8004260: 38 63 e4 ac ori r3,r3,0xe4ac
8004264: 28 61 00 00 lw r1,(r3+0)
8004268: f8 00 62 ea calli 801ce10 <__udivsi3>
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
800426c: 29 62 00 18 lw r2,(r11+24)
8004270: 50 41 00 1c bgeu r2,r1,80042e0 <_TOD_Validate+0xb0>
(the_tod->ticks >= ticks_per_second) ||
8004274: 29 62 00 14 lw r2,(r11+20)
8004278: 34 01 00 3b mvi r1,59
800427c: 54 41 00 19 bgu r2,r1,80042e0 <_TOD_Validate+0xb0>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
8004280: 29 62 00 10 lw r2,(r11+16)
8004284: 54 41 00 17 bgu r2,r1,80042e0 <_TOD_Validate+0xb0>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
8004288: 29 62 00 0c lw r2,(r11+12)
800428c: 34 01 00 17 mvi r1,23
8004290: 54 41 00 14 bgu r2,r1,80042e0 <_TOD_Validate+0xb0>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
8004294: 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) ||
8004298: 44 20 00 12 be r1,r0,80042e0 <_TOD_Validate+0xb0> <== NEVER TAKEN
(the_tod->month == 0) ||
800429c: 34 02 00 0c mvi r2,12
80042a0: 54 22 00 10 bgu r1,r2,80042e0 <_TOD_Validate+0xb0>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
80042a4: 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) ||
80042a8: 34 03 07 c3 mvi r3,1987
80042ac: 50 62 00 0d bgeu r3,r2,80042e0 <_TOD_Validate+0xb0>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
80042b0: 29 6d 00 08 lw r13,(r11+8)
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
80042b4: 45 a0 00 0b be r13,r0,80042e0 <_TOD_Validate+0xb0> <== NEVER TAKEN
80042b8: 78 0b 08 01 mvhi r11,0x801
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
80042bc: 20 42 00 03 andi r2,r2,0x3
80042c0: 39 6b ed 64 ori r11,r11,0xed64
80042c4: 5c 40 00 02 bne r2,r0,80042cc <_TOD_Validate+0x9c>
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
80042c8: 34 21 00 0d addi r1,r1,13
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
80042cc: 34 02 00 02 mvi r2,2
80042d0: fb ff f3 f4 calli 80012a0 <__ashlsi3>
80042d4: b5 61 08 00 add r1,r11,r1
80042d8: 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(
80042dc: f1 8d 60 00 cmpgeu r12,r12,r13
if ( the_tod->day > days_in_month )
return false;
return true;
}
80042e0: b9 80 08 00 mv r1,r12
80042e4: 2b 9d 00 04 lw ra,(sp+4)
80042e8: 2b 8b 00 10 lw r11,(sp+16)
80042ec: 2b 8c 00 0c lw r12,(sp+12)
80042f0: 2b 8d 00 08 lw r13,(sp+8)
80042f4: 37 9c 00 10 addi sp,sp,16
80042f8: c3 a0 00 00 ret
0800653c <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
800653c: 37 9c ff e8 addi sp,sp,-24
8006540: 5b 8b 00 14 sw (sp+20),r11
8006544: 5b 8c 00 10 sw (sp+16),r12
8006548: 5b 8d 00 0c sw (sp+12),r13
800654c: 5b 8e 00 08 sw (sp+8),r14
8006550: 5b 9d 00 04 sw (sp+4),ra
*/
/*
* Save original state
*/
original_state = the_thread->current_state;
8006554: 28 2e 00 10 lw r14,(r1+16)
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
8006558: b8 20 58 00 mv r11,r1
/*
* Set a transient state for the thread so it is pulled off the Ready chains.
* This will prevent it from being scheduled no matter what happens in an
* ISR.
*/
_Thread_Set_transient( the_thread );
800655c: 5b 82 00 18 sw (sp+24),r2
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
8006560: 20 6d 00 ff andi r13,r3,0xff
/*
* Set a transient state for the thread so it is pulled off the Ready chains.
* This will prevent it from being scheduled no matter what happens in an
* ISR.
*/
_Thread_Set_transient( the_thread );
8006564: f8 00 03 c1 calli 8007468 <_Thread_Set_transient>
/*
* Do not bother recomputing all the priority related information if
* we are not REALLY changing priority.
*/
if ( the_thread->current_priority != new_priority )
8006568: 29 61 00 14 lw r1,(r11+20)
800656c: 2b 82 00 18 lw r2,(sp+24)
8006570: 44 22 00 03 be r1,r2,800657c <_Thread_Change_priority+0x40>
_Thread_Set_priority( the_thread, new_priority );
8006574: b9 60 08 00 mv r1,r11
8006578: f8 00 03 97 calli 80073d4 <_Thread_Set_priority>
_ISR_Disable( level );
800657c: 90 00 60 00 rcsr r12,IE
8006580: 34 05 ff fe mvi r5,-2
8006584: a1 85 28 00 and r5,r12,r5
8006588: d0 05 00 00 wcsr IE,r5
/*
* If the thread has more than STATES_TRANSIENT set, then it is blocked,
* If it is blocked on a thread queue, then we need to requeue it.
*/
state = the_thread->current_state;
800658c: 29 61 00 10 lw r1,(r11+16)
if ( state != STATES_TRANSIENT ) {
8006590: 34 02 00 04 mvi r2,4
8006594: 21 c4 00 04 andi r4,r14,0x4
8006598: 44 22 00 0f be r1,r2,80065d4 <_Thread_Change_priority+0x98>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
800659c: 5c 80 00 04 bne r4,r0,80065ac <_Thread_Change_priority+0x70><== NEVER TAKEN
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
80065a0: 34 02 ff fb mvi r2,-5
80065a4: a0 22 10 00 and r2,r1,r2
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
80065a8: 59 62 00 10 sw (r11+16),r2
_ISR_Enable( level );
80065ac: d0 0c 00 00 wcsr IE,r12
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
80065b0: 78 03 08 01 mvhi r3,0x801
80065b4: 38 63 80 94 ori r3,r3,0x8094
80065b8: 28 62 00 00 lw r2,(r3+0)
80065bc: a0 22 08 00 and r1,r1,r2
if ( _States_Is_waiting_on_thread_queue( state ) ) {
80065c0: 44 20 00 3d be r1,r0,80066b4 <_Thread_Change_priority+0x178>
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
80065c4: 29 61 00 44 lw r1,(r11+68)
80065c8: b9 60 10 00 mv r2,r11
80065cc: f8 00 03 4d calli 8007300 <_Thread_queue_Requeue>
80065d0: e0 00 00 39 bi 80066b4 <_Thread_Change_priority+0x178>
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
80065d4: 5c 80 00 28 bne r4,r0,8006674 <_Thread_Change_priority+0x138><== NEVER TAKEN
80065d8: 78 02 08 01 mvhi r2,0x801
* Ready Queue with interrupts off.
*
* FIXME: hard-coded for priority scheduling. Might be ok since this
* function is specific to priority scheduling?
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
80065dc: 59 60 00 10 sw (r11+16),r0
80065e0: 29 61 00 8c lw r1,(r11+140)
80065e4: 38 42 9e 10 ori r2,r2,0x9e10
if ( prepend_it )
80065e8: 45 a4 00 12 be r13,r4,8006630 <_Thread_Change_priority+0xf4>
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
80065ec: 28 23 00 04 lw r3,(r1+4)
80065f0: 2c 24 00 0a lhu r4,(r1+10)
80065f4: 2c 66 00 00 lhu r6,(r3+0)
80065f8: b8 c4 20 00 or r4,r6,r4
80065fc: 0c 64 00 00 sh (r3+0),r4
_Priority_Major_bit_map |= the_priority_map->ready_major;
8006600: 2c 43 00 00 lhu r3,(r2+0)
8006604: 2c 24 00 08 lhu r4,(r1+8)
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
_Chain_Prepend_unprotected( the_thread->scheduler.priority->ready_chain,
8006608: 28 21 00 00 lw r1,(r1+0)
800660c: b8 83 18 00 or r3,r4,r3
8006610: 20 63 ff ff andi r3,r3,0xffff
8006614: 0c 43 00 00 sh (r2+0),r3
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
8006618: 28 22 00 00 lw r2,(r1+0)
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
800661c: 59 61 00 04 sw (r11+4),r1
before_node = after_node->next;
after_node->next = the_node;
8006620: 58 2b 00 00 sw (r1+0),r11
the_node->next = before_node;
8006624: 59 62 00 00 sw (r11+0),r2
before_node->previous = the_node;
8006628: 58 4b 00 04 sw (r2+4),r11
800662c: e0 00 00 12 bi 8006674 <_Thread_Change_priority+0x138>
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add (
Priority_bit_map_Information *the_priority_map
)
{
*the_priority_map->minor |= the_priority_map->ready_minor;
8006630: 28 23 00 04 lw r3,(r1+4)
8006634: 2c 24 00 0a lhu r4,(r1+10)
8006638: 2c 66 00 00 lhu r6,(r3+0)
800663c: b8 c4 20 00 or r4,r6,r4
8006640: 0c 64 00 00 sh (r3+0),r4
_Priority_Major_bit_map |= the_priority_map->ready_major;
8006644: 2c 24 00 08 lhu r4,(r1+8)
8006648: 2c 43 00 00 lhu r3,(r2+0)
Thread_Control *the_thread
)
{
_Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map );
_Chain_Append_unprotected( the_thread->scheduler.priority->ready_chain,
800664c: 28 21 00 00 lw r1,(r1+0)
8006650: b8 83 18 00 or r3,r4,r3
8006654: 20 63 ff ff andi r3,r3,0xffff
8006658: 0c 43 00 00 sh (r2+0),r3
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
800665c: 28 22 00 08 lw r2,(r1+8)
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
8006660: 34 23 00 04 addi r3,r1,4
Chain_Node *old_last = tail->previous;
the_node->next = tail;
8006664: 59 63 00 00 sw (r11+0),r3
tail->previous = the_node;
8006668: 58 2b 00 08 sw (r1+8),r11
old_last->next = the_node;
800666c: 58 4b 00 00 sw (r2+0),r11
the_node->previous = old_last;
8006670: 59 62 00 04 sw (r11+4),r2
_Scheduler_priority_Ready_queue_enqueue_first( the_thread );
else
_Scheduler_priority_Ready_queue_enqueue( the_thread );
}
_ISR_Flash( level );
8006674: d0 0c 00 00 wcsr IE,r12
8006678: d0 05 00 00 wcsr IE,r5
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule(
Scheduler_Control *the_scheduler
)
{
the_scheduler->Operations.schedule( the_scheduler );
800667c: 78 01 08 01 mvhi r1,0x801
8006680: 38 21 99 a4 ori r1,r1,0x99a4
8006684: 28 22 00 04 lw r2,(r1+4)
8006688: d8 40 00 00 call r2
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
800668c: 78 01 08 01 mvhi r1,0x801
8006690: 38 21 9d f0 ori r1,r1,0x9df0
8006694: 28 22 00 0c lw r2,(r1+12)
* We altered the set of thread priorities. So let's figure out
* who is the heir and if we need to switch to them.
*/
_Scheduler_Schedule(&_Scheduler);
if ( !_Thread_Is_executing_also_the_heir() &&
8006698: 28 23 00 10 lw r3,(r1+16)
800669c: 44 43 00 05 be r2,r3,80066b0 <_Thread_Change_priority+0x174>
80066a0: 40 42 00 74 lbu r2,(r2+116)
80066a4: 44 40 00 03 be r2,r0,80066b0 <_Thread_Change_priority+0x174>
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
80066a8: 34 02 00 01 mvi r2,1
80066ac: 30 22 00 18 sb (r1+24),r2
_ISR_Enable( level );
80066b0: d0 0c 00 00 wcsr IE,r12
}
80066b4: 2b 9d 00 04 lw ra,(sp+4)
80066b8: 2b 8b 00 14 lw r11,(sp+20)
80066bc: 2b 8c 00 10 lw r12,(sp+16)
80066c0: 2b 8d 00 0c lw r13,(sp+12)
80066c4: 2b 8e 00 08 lw r14,(sp+8)
80066c8: 37 9c 00 18 addi sp,sp,24
80066cc: c3 a0 00 00 ret
0800bdd8 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
800bdd8: 37 9c ff f8 addi sp,sp,-8
800bddc: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
800bde0: 37 82 00 08 addi r2,sp,8
800bde4: f8 00 00 7c calli 800bfd4 <_Thread_Get>
switch ( location ) {
800bde8: 2b 82 00 08 lw r2,(sp+8)
800bdec: 5c 40 00 0a bne r2,r0,800be14 <_Thread_Delay_ended+0x3c> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
800bdf0: 78 03 08 02 mvhi r3,0x802
800bdf4: 38 63 6a cc ori r3,r3,0x6acc
800bdf8: 28 62 00 00 lw r2,(r3+0)
800bdfc: fb ff ff 6d calli 800bbb0 <_Thread_Clear_state>
800be00: 78 01 08 02 mvhi r1,0x802
800be04: 38 21 9a 20 ori r1,r1,0x9a20
800be08: 28 22 00 00 lw r2,(r1+0)
800be0c: 34 42 ff ff addi r2,r2,-1
800be10: 58 22 00 00 sw (r1+0),r2
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
800be14: 2b 9d 00 04 lw ra,(sp+4)
800be18: 37 9c 00 08 addi sp,sp,8
800be1c: c3 a0 00 00 ret
080067b8 <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
80067b8: 37 9c ff c0 addi sp,sp,-64
80067bc: 5b 8b 00 30 sw (sp+48),r11
80067c0: 5b 8c 00 2c sw (sp+44),r12
80067c4: 5b 8d 00 28 sw (sp+40),r13
80067c8: 5b 8e 00 24 sw (sp+36),r14
80067cc: 5b 8f 00 20 sw (sp+32),r15
80067d0: 5b 90 00 1c sw (sp+28),r16
80067d4: 5b 91 00 18 sw (sp+24),r17
80067d8: 5b 92 00 14 sw (sp+20),r18
80067dc: 5b 93 00 10 sw (sp+16),r19
80067e0: 5b 94 00 0c sw (sp+12),r20
80067e4: 5b 95 00 08 sw (sp+8),r21
80067e8: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
80067ec: 78 01 08 01 mvhi r1,0x801
80067f0: 38 21 9d f0 ori r1,r1,0x9df0
80067f4: 28 2d 00 0c lw r13,(r1+12)
_ISR_Disable( level );
80067f8: 90 00 20 00 rcsr r4,IE
80067fc: 34 01 ff fe mvi r1,-2
8006800: a0 81 08 00 and r1,r4,r1
8006804: d0 01 00 00 wcsr IE,r1
while ( _Thread_Dispatch_necessary == true ) {
8006808: 78 0c 08 01 mvhi r12,0x801
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
800680c: 78 11 08 01 mvhi r17,0x801
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006810: 78 0f 08 01 mvhi r15,0x801
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
_Timestamp_Subtract(
8006814: 78 0e 08 01 mvhi r14,0x801
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
8006818: 78 10 08 01 mvhi r16,0x801
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
800681c: 39 8c 9d f0 ori r12,r12,0x9df0
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
8006820: 3a 31 99 20 ori r17,r17,0x9920
8006824: 34 14 00 01 mvi r20,1
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006828: 39 ef 98 b8 ori r15,r15,0x98b8
_ISR_Enable( level );
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
800682c: 37 93 00 3c addi r19,sp,60
_Timestamp_Subtract(
8006830: 39 ce 99 ec ori r14,r14,0x99ec
8006834: 37 92 00 34 addi r18,sp,52
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
8006838: 3a 10 99 c4 ori r16,r16,0x99c4
#endif
#endif
executing = _Thread_Executing;
_ISR_Disable( level );
800683c: 34 15 ff fe mvi r21,-2
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
8006840: e0 00 00 28 bi 80068e0 <_Thread_Dispatch+0x128>
heir = _Thread_Heir;
8006844: 29 8b 00 10 lw r11,(r12+16)
_Thread_Dispatch_disable_level = 1;
8006848: 5a 34 00 00 sw (r17+0),r20
_Thread_Dispatch_necessary = false;
800684c: 31 80 00 18 sb (r12+24),r0
_Thread_Executing = heir;
8006850: 59 8b 00 0c sw (r12+12),r11
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
8006854: 45 6d 00 26 be r11,r13,80068ec <_Thread_Dispatch+0x134>
*/
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
8006858: 29 61 00 7c lw r1,(r11+124)
800685c: 5c 34 00 03 bne r1,r20,8006868 <_Thread_Dispatch+0xb0>
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006860: 29 e1 00 00 lw r1,(r15+0)
8006864: 59 61 00 78 sw (r11+120),r1
_ISR_Enable( level );
8006868: d0 04 00 00 wcsr IE,r4
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
800686c: ba 60 08 00 mv r1,r19
8006870: f8 00 1f 81 calli 800e674 <_TOD_Get_uptime>
_Timestamp_Subtract(
8006874: b9 c0 08 00 mv r1,r14
8006878: ba 60 10 00 mv r2,r19
800687c: ba 40 18 00 mv r3,r18
8006880: f8 00 03 8e calli 80076b8 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
8006884: 35 a1 00 84 addi r1,r13,132
8006888: ba 40 10 00 mv r2,r18
800688c: f8 00 03 72 calli 8007654 <_Timespec_Add_to>
_Thread_Time_of_last_context_switch = uptime;
8006890: 2b 81 00 3c lw r1,(sp+60)
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
8006894: 2a 04 00 00 lw r4,(r16+0)
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
8006898: 59 c1 00 00 sw (r14+0),r1
800689c: 2b 81 00 40 lw r1,(sp+64)
80068a0: 59 c1 00 04 sw (r14+4),r1
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
80068a4: 44 80 00 05 be r4,r0,80068b8 <_Thread_Dispatch+0x100> <== NEVER TAKEN
executing->libc_reent = *_Thread_libc_reent;
80068a8: 28 81 00 00 lw r1,(r4+0)
80068ac: 59 a1 01 18 sw (r13+280),r1
*_Thread_libc_reent = heir->libc_reent;
80068b0: 29 61 01 18 lw r1,(r11+280)
80068b4: 58 81 00 00 sw (r4+0),r1
}
_User_extensions_Thread_switch( executing, heir );
80068b8: b9 a0 08 00 mv r1,r13
80068bc: b9 60 10 00 mv r2,r11
80068c0: f8 00 04 5d calli 8007a34 <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
80068c4: 35 a1 00 c4 addi r1,r13,196
80068c8: 35 62 00 c4 addi r2,r11,196
80068cc: f8 00 05 3b calli 8007db8 <_CPU_Context_switch>
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
80068d0: 29 8d 00 0c lw r13,(r12+12)
_ISR_Disable( level );
80068d4: 90 00 20 00 rcsr r4,IE
80068d8: a0 95 08 00 and r1,r4,r21
80068dc: d0 01 00 00 wcsr IE,r1
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
80068e0: 41 81 00 18 lbu r1,(r12+24)
80068e4: 20 21 00 ff andi r1,r1,0xff
80068e8: 5c 20 ff d7 bne r1,r0,8006844 <_Thread_Dispatch+0x8c>
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
80068ec: 78 01 08 01 mvhi r1,0x801
80068f0: 38 21 99 20 ori r1,r1,0x9920
80068f4: 58 20 00 00 sw (r1+0),r0
_ISR_Enable( level );
80068f8: d0 04 00 00 wcsr IE,r4
_API_extensions_Run_postswitch();
80068fc: fb ff f8 3d calli 80049f0 <_API_extensions_Run_postswitch>
}
8006900: 2b 9d 00 04 lw ra,(sp+4)
8006904: 2b 8b 00 30 lw r11,(sp+48)
8006908: 2b 8c 00 2c lw r12,(sp+44)
800690c: 2b 8d 00 28 lw r13,(sp+40)
8006910: 2b 8e 00 24 lw r14,(sp+36)
8006914: 2b 8f 00 20 lw r15,(sp+32)
8006918: 2b 90 00 1c lw r16,(sp+28)
800691c: 2b 91 00 18 lw r17,(sp+24)
8006920: 2b 92 00 14 lw r18,(sp+20)
8006924: 2b 93 00 10 lw r19,(sp+16)
8006928: 2b 94 00 0c lw r20,(sp+12)
800692c: 2b 95 00 08 lw r21,(sp+8)
8006930: 37 9c 00 40 addi sp,sp,64
8006934: c3 a0 00 00 ret
080111ec <_Thread_Handler>:
*
* Output parameters: NONE
*/
void _Thread_Handler( void )
{
80111ec: 37 9c ff f4 addi sp,sp,-12
80111f0: 5b 8b 00 0c sw (sp+12),r11
80111f4: 5b 8c 00 08 sw (sp+8),r12
80111f8: 5b 9d 00 04 sw (sp+4),ra
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
static char doneConstructors;
char doneCons;
#endif
executing = _Thread_Executing;
80111fc: 78 01 08 01 mvhi r1,0x801
8011200: 38 21 9d f0 ori r1,r1,0x9df0
8011204: 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;
8011208: 29 61 00 ac lw r1,(r11+172)
_ISR_Set_level(level);
801120c: 64 21 00 00 cmpei r1,r1,0
8011210: d0 01 00 00 wcsr IE,r1
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
doneCons = doneConstructors;
8011214: 78 01 08 01 mvhi r1,0x801
8011218: 38 21 97 7c ori r1,r1,0x977c
801121c: 40 2c 00 00 lbu r12,(r1+0)
doneConstructors = 1;
8011220: 34 02 00 01 mvi r2,1
8011224: 30 22 00 00 sb (r1+0),r2
/*
* Take care that 'begin' extensions get to complete before
* 'switch' extensions can run. This means must keep dispatch
* disabled until all 'begin' extensions complete.
*/
_User_extensions_Thread_begin( executing );
8011228: b9 60 08 00 mv r1,r11
801122c: fb ff d9 76 calli 8007804 <_User_extensions_Thread_begin>
/*
* At this point, the dispatch disable level BETTER be 1.
*/
_Thread_Enable_dispatch();
8011230: fb ff d5 c2 calli 8006938 <_Thread_Enable_dispatch>
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
* in any configuration I know of and it generates a warning on every
* RTEMS target configuration. --joel (12 May 2007)
*/
if (!doneCons) /* && (volatile void *)_init) */ {
8011234: 5d 80 00 02 bne r12,r0,801123c <_Thread_Handler+0x50>
INIT_NAME ();
8011238: fb ff bb 72 calli 8000000 <RamBase>
}
#endif
if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
801123c: 29 61 00 94 lw r1,(r11+148)
8011240: 5c 20 00 04 bne r1,r0,8011250 <_Thread_Handler+0x64>
executing->Wait.return_argument =
(*(Thread_Entry_numeric) executing->Start.entry_point)(
8011244: 29 62 00 90 lw r2,(r11+144)
8011248: 29 61 00 9c lw r1,(r11+156)
801124c: e0 00 00 05 bi 8011260 <_Thread_Handler+0x74>
executing->Start.numeric_argument
);
}
#if defined(RTEMS_POSIX_API)
else if ( executing->Start.prototype == THREAD_START_POINTER ) {
8011250: 34 02 00 01 mvi r2,1
8011254: 5c 22 00 05 bne r1,r2,8011268 <_Thread_Handler+0x7c> <== NEVER TAKEN
executing->Wait.return_argument =
(*(Thread_Entry_pointer) executing->Start.entry_point)(
8011258: 29 62 00 90 lw r2,(r11+144)
801125c: 29 61 00 98 lw r1,(r11+152)
8011260: 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 =
8011264: 59 61 00 28 sw (r11+40),r1
* was placed in return_argument. This assumed that if it returned
* anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
_User_extensions_Thread_exitted( executing );
8011268: b9 60 08 00 mv r1,r11
801126c: fb ff d9 7e calli 8007864 <_User_extensions_Thread_exitted>
_Internal_error_Occurred(
8011270: 34 01 00 00 mvi r1,0
8011274: 34 02 00 01 mvi r2,1
8011278: 34 03 00 05 mvi r3,5
801127c: fb ff d0 c9 calli 80055a0 <_Internal_error_Occurred>
0800a31c <_Thread_Resume>:
void _Thread_Resume(
Thread_Control *the_thread,
bool force
)
{
800a31c: 37 9c ff f8 addi sp,sp,-8
800a320: 5b 8b 00 08 sw (sp+8),r11
800a324: 5b 9d 00 04 sw (sp+4),ra
800a328: b8 20 10 00 mv r2,r1
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
800a32c: 90 00 58 00 rcsr r11,IE
800a330: 34 01 ff fe mvi r1,-2
800a334: a1 61 08 00 and r1,r11,r1
800a338: d0 01 00 00 wcsr IE,r1
current_state = the_thread->current_state;
800a33c: 28 41 00 10 lw r1,(r2+16)
if ( current_state & STATES_SUSPENDED ) {
800a340: 20 23 00 02 andi r3,r1,0x2
800a344: 44 60 00 09 be r3,r0,800a368 <_Thread_Resume+0x4c> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
800a348: 34 03 ff fd mvi r3,-3
800a34c: a0 23 08 00 and r1,r1,r3
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
800a350: 58 41 00 10 sw (r2+16),r1
if ( _States_Is_ready( current_state ) ) {
800a354: 5c 20 00 05 bne r1,r0,800a368 <_Thread_Resume+0x4c>
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Scheduler_Control *the_scheduler,
Thread_Control *the_thread
)
{
the_scheduler->Operations.unblock( the_scheduler, the_thread );
800a358: 78 01 08 01 mvhi r1,0x801
800a35c: 38 21 99 f4 ori r1,r1,0x99f4
800a360: 28 23 00 10 lw r3,(r1+16)
800a364: d8 60 00 00 call r3
_Scheduler_Unblock( &_Scheduler, the_thread );
}
}
_ISR_Enable( level );
800a368: d0 0b 00 00 wcsr IE,r11
}
800a36c: 2b 9d 00 04 lw ra,(sp+4)
800a370: 2b 8b 00 08 lw r11,(sp+8)
800a374: 37 9c 00 08 addi sp,sp,8
800a378: c3 a0 00 00 ret
0800bcd4 <_Thread_Tickle_timeslice>:
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
800bcd4: 37 9c ff f8 addi sp,sp,-8
800bcd8: 5b 8b 00 08 sw (sp+8),r11
800bcdc: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *executing;
executing = _Thread_Executing;
800bce0: 78 01 08 01 mvhi r1,0x801
800bce4: 38 21 ae b0 ori r1,r1,0xaeb0
800bce8: 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 )
800bcec: 41 61 00 74 lbu r1,(r11+116)
800bcf0: 44 20 00 1e be r1,r0,800bd68 <_Thread_Tickle_timeslice+0x94>
return;
if ( !_States_Is_ready( executing->current_state ) )
800bcf4: 29 61 00 10 lw r1,(r11+16)
800bcf8: 5c 20 00 1c bne r1,r0,800bd68 <_Thread_Tickle_timeslice+0x94>
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
800bcfc: 29 61 00 7c lw r1,(r11+124)
800bd00: 44 20 00 1a be r1,r0,800bd68 <_Thread_Tickle_timeslice+0x94>
800bd04: 34 02 00 02 mvi r2,2
800bd08: 50 41 00 04 bgeu r2,r1,800bd18 <_Thread_Tickle_timeslice+0x44>
800bd0c: 34 02 00 03 mvi r2,3
800bd10: 5c 22 00 16 bne r1,r2,800bd68 <_Thread_Tickle_timeslice+0x94><== NEVER TAKEN
800bd14: e0 00 00 0e bi 800bd4c <_Thread_Tickle_timeslice+0x78>
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
#endif
if ( (int)(--executing->cpu_time_budget) <= 0 ) {
800bd18: 29 61 00 78 lw r1,(r11+120)
800bd1c: 34 21 ff ff addi r1,r1,-1
800bd20: 59 61 00 78 sw (r11+120),r1
800bd24: 48 20 00 11 bg r1,r0,800bd68 <_Thread_Tickle_timeslice+0x94>
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield( &_Scheduler );
800bd28: 78 01 08 01 mvhi r1,0x801
800bd2c: 38 21 aa 64 ori r1,r1,0xaa64
800bd30: 28 22 00 08 lw r2,(r1+8)
800bd34: 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;
800bd38: 78 01 08 01 mvhi r1,0x801
800bd3c: 38 21 a9 78 ori r1,r1,0xa978
800bd40: 28 21 00 00 lw r1,(r1+0)
800bd44: 59 61 00 78 sw (r11+120),r1
800bd48: e0 00 00 08 bi 800bd68 <_Thread_Tickle_timeslice+0x94>
}
break;
#if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT)
case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
if ( --executing->cpu_time_budget == 0 )
800bd4c: 29 61 00 78 lw r1,(r11+120)
800bd50: 34 21 ff ff addi r1,r1,-1
800bd54: 59 61 00 78 sw (r11+120),r1
800bd58: 5c 20 00 04 bne r1,r0,800bd68 <_Thread_Tickle_timeslice+0x94>
(*executing->budget_callout)( executing );
800bd5c: 29 62 00 80 lw r2,(r11+128)
800bd60: b9 60 08 00 mv r1,r11
800bd64: d8 40 00 00 call r2
break;
#endif
}
}
800bd68: 2b 9d 00 04 lw ra,(sp+4)
800bd6c: 2b 8b 00 08 lw r11,(sp+8)
800bd70: 37 9c 00 08 addi sp,sp,8
800bd74: c3 a0 00 00 ret
08006fb0 <_Thread_queue_Enqueue_priority>:
Thread_blocking_operation_States _Thread_queue_Enqueue_priority (
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
ISR_Level *level_p
)
{
8006fb0: 37 9c ff cc addi sp,sp,-52
8006fb4: 5b 8b 00 34 sw (sp+52),r11
8006fb8: 5b 8c 00 30 sw (sp+48),r12
8006fbc: 5b 8d 00 2c sw (sp+44),r13
8006fc0: 5b 8e 00 28 sw (sp+40),r14
8006fc4: 5b 8f 00 24 sw (sp+36),r15
8006fc8: 5b 90 00 20 sw (sp+32),r16
8006fcc: 5b 91 00 1c sw (sp+28),r17
8006fd0: 5b 92 00 18 sw (sp+24),r18
8006fd4: 5b 93 00 14 sw (sp+20),r19
8006fd8: 5b 94 00 10 sw (sp+16),r20
8006fdc: 5b 95 00 0c sw (sp+12),r21
8006fe0: 5b 96 00 08 sw (sp+8),r22
8006fe4: 5b 9d 00 04 sw (sp+4),ra
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
8006fe8: 28 50 00 14 lw r16,(r2+20)
Thread_blocking_operation_States _Thread_queue_Enqueue_priority (
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
ISR_Level *level_p
)
{
8006fec: b8 20 68 00 mv r13,r1
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
8006ff0: 34 41 00 3c addi r1,r2,60
head->next = tail;
8006ff4: 58 41 00 38 sw (r2+56),r1
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
8006ff8: 34 41 00 38 addi r1,r2,56
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
tail->previous = head;
8006ffc: 58 41 00 40 sw (r2+64),r1
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
8007000: 58 40 00 3c sw (r2+60),r0
8007004: b8 40 60 00 mv r12,r2
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
8007008: ba 00 08 00 mv r1,r16
800700c: 34 02 00 06 mvi r2,6
8007010: b8 60 a8 00 mv r21,r3
8007014: f8 00 3f d2 calli 8016f5c <__lshrsi3>
8007018: b8 20 70 00 mv r14,r1
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
800701c: 78 12 08 01 mvhi r18,0x801
RTEMS_INLINE_ROUTINE bool _Thread_queue_Is_reverse_search (
Priority_Control the_priority
)
{
return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK );
8007020: 22 01 00 20 andi r1,r16,0x20
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
block_state = the_thread_queue->state;
8007024: 29 b3 00 38 lw r19,(r13+56)
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
8007028: 3a 52 90 a8 ori r18,r18,0x90a8
_ISR_Disable( level );
800702c: 34 16 ff fe mvi r22,-2
priority = the_thread->current_priority;
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
block_state = the_thread_queue->state;
if ( _Thread_queue_Is_reverse_search( priority ) )
8007030: 5c 20 00 30 bne r1,r0,80070f0 <_Thread_queue_Enqueue_priority+0x140>
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
8007034: 34 14 ff fe mvi r20,-2
8007038: 90 00 78 00 rcsr r15,IE
800703c: a1 f4 90 00 and r18,r15,r20
8007040: d0 12 00 00 wcsr IE,r18
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8007044: 34 02 00 01 mvi r2,1
8007048: b9 c0 08 00 mv r1,r14
800704c: f8 00 3f 76 calli 8016e24 <__ashlsi3>
8007050: b4 2e 08 00 add r1,r1,r14
8007054: 34 02 00 02 mvi r2,2
8007058: f8 00 3f 73 calli 8016e24 <__ashlsi3>
800705c: b5 a1 08 00 add r1,r13,r1
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
8007060: 28 2b 00 00 lw r11,(r1+0)
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
8007064: 34 11 ff ff mvi r17,-1
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
8007068: e0 00 00 0b bi 8007094 <_Thread_queue_Enqueue_priority+0xe4>
search_priority = search_thread->current_priority;
800706c: 29 71 00 14 lw r17,(r11+20)
if ( priority <= search_priority )
8007070: 52 30 00 12 bgeu r17,r16,80070b8 <_Thread_queue_Enqueue_priority+0x108>
break;
search_priority = search_thread->current_priority;
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
8007074: d0 0f 00 00 wcsr IE,r15
8007078: d0 12 00 00 wcsr IE,r18
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
800707c: 29 61 00 10 lw r1,(r11+16)
8007080: a2 61 08 00 and r1,r19,r1
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
8007084: 5c 20 00 03 bne r1,r0,8007090 <_Thread_queue_Enqueue_priority+0xe0><== ALWAYS TAKEN
_ISR_Enable( level );
8007088: d0 0f 00 00 wcsr IE,r15 <== NOT EXECUTED
goto restart_forward_search;
800708c: e3 ff ff eb bi 8007038 <_Thread_queue_Enqueue_priority+0x88><== NOT EXECUTED
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
8007090: 29 6b 00 00 lw r11,(r11+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
8007094: 34 02 00 01 mvi r2,1
8007098: b9 c0 08 00 mv r1,r14
800709c: f8 00 3f 62 calli 8016e24 <__ashlsi3>
80070a0: b4 2e 08 00 add r1,r1,r14
80070a4: 34 02 00 02 mvi r2,2
80070a8: f8 00 3f 5f calli 8016e24 <__ashlsi3>
80070ac: b5 a1 08 00 add r1,r13,r1
80070b0: 34 21 00 04 addi r1,r1,4
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
80070b4: 5d 61 ff ee bne r11,r1,800706c <_Thread_queue_Enqueue_priority+0xbc>
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
80070b8: 29 a3 00 30 lw r3,(r13+48)
80070bc: 34 02 00 01 mvi r2,1
80070c0: b9 e0 08 00 mv r1,r15
80070c4: 5c 62 00 43 bne r3,r2,80071d0 <_Thread_queue_Enqueue_priority+0x220><== NEVER TAKEN
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
80070c8: 59 a0 00 30 sw (r13+48),r0
if ( priority == search_priority )
80070cc: 46 11 00 38 be r16,r17,80071ac <_Thread_queue_Enqueue_priority+0x1fc>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
80070d0: 29 61 00 04 lw r1,(r11+4)
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
80070d4: 59 8b 00 00 sw (r12+0),r11
the_node->previous = previous_node;
80070d8: 59 81 00 04 sw (r12+4),r1
previous_node->next = the_node;
80070dc: 58 2c 00 00 sw (r1+0),r12
search_node->previous = the_node;
80070e0: 59 6c 00 04 sw (r11+4),r12
the_thread->Wait.queue = the_thread_queue;
80070e4: 59 8d 00 44 sw (r12+68),r13
_ISR_Enable( level );
80070e8: d0 0f 00 00 wcsr IE,r15
80070ec: e0 00 00 2e bi 80071a4 <_Thread_queue_Enqueue_priority+0x1f4>
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
80070f0: 42 51 00 00 lbu r17,(r18+0)
80070f4: 36 31 00 01 addi r17,r17,1
_ISR_Disable( level );
80070f8: 90 00 78 00 rcsr r15,IE
80070fc: a1 f6 a0 00 and r20,r15,r22
8007100: d0 14 00 00 wcsr IE,r20
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
8007104: 34 02 00 01 mvi r2,1
8007108: b9 c0 08 00 mv r1,r14
800710c: f8 00 3f 46 calli 8016e24 <__ashlsi3>
8007110: b4 2e 08 00 add r1,r1,r14
8007114: 34 02 00 02 mvi r2,2
8007118: f8 00 3f 43 calli 8016e24 <__ashlsi3>
800711c: b5 a1 08 00 add r1,r13,r1
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
8007120: 28 2b 00 08 lw r11,(r1+8)
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
8007124: e0 00 00 0b bi 8007150 <_Thread_queue_Enqueue_priority+0x1a0>
search_priority = search_thread->current_priority;
8007128: 29 71 00 14 lw r17,(r11+20)
if ( priority >= search_priority )
800712c: 52 11 00 11 bgeu r16,r17,8007170 <_Thread_queue_Enqueue_priority+0x1c0>
break;
search_priority = search_thread->current_priority;
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
8007130: d0 0f 00 00 wcsr IE,r15
8007134: d0 14 00 00 wcsr IE,r20
8007138: 29 61 00 10 lw r1,(r11+16)
800713c: a2 61 08 00 and r1,r19,r1
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
8007140: 5c 20 00 03 bne r1,r0,800714c <_Thread_queue_Enqueue_priority+0x19c><== ALWAYS TAKEN
_ISR_Enable( level );
8007144: d0 0f 00 00 wcsr IE,r15 <== NOT EXECUTED
goto restart_reverse_search;
8007148: e3 ff ff ea bi 80070f0 <_Thread_queue_Enqueue_priority+0x140><== NOT EXECUTED
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
800714c: 29 6b 00 04 lw r11,(r11+4)
RTEMS_INLINE_ROUTINE bool _Chain_Is_head(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Head(the_chain));
8007150: 34 02 00 01 mvi r2,1
8007154: b9 c0 08 00 mv r1,r14
8007158: f8 00 3f 33 calli 8016e24 <__ashlsi3>
800715c: b4 2e 08 00 add r1,r1,r14
8007160: 34 02 00 02 mvi r2,2
8007164: f8 00 3f 30 calli 8016e24 <__ashlsi3>
8007168: b5 a1 08 00 add r1,r13,r1
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
800716c: 5d 61 ff ef bne r11,r1,8007128 <_Thread_queue_Enqueue_priority+0x178>
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
8007170: 29 a3 00 30 lw r3,(r13+48)
8007174: 34 02 00 01 mvi r2,1
8007178: b9 e0 08 00 mv r1,r15
800717c: 5c 62 00 15 bne r3,r2,80071d0 <_Thread_queue_Enqueue_priority+0x220><== NEVER TAKEN
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
8007180: 59 a0 00 30 sw (r13+48),r0
if ( priority == search_priority )
8007184: 46 11 00 0a be r16,r17,80071ac <_Thread_queue_Enqueue_priority+0x1fc>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
8007188: 29 61 00 00 lw r1,(r11+0)
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
the_node->previous = search_node;
800718c: 59 8b 00 04 sw (r12+4),r11
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
8007190: 59 81 00 00 sw (r12+0),r1
the_node->previous = search_node;
search_node->next = the_node;
8007194: 59 6c 00 00 sw (r11+0),r12
next_node->previous = the_node;
8007198: 58 2c 00 04 sw (r1+4),r12
the_thread->Wait.queue = the_thread_queue;
800719c: 59 8d 00 44 sw (r12+68),r13
_ISR_Enable( level );
80071a0: d0 0f 00 00 wcsr IE,r15
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
80071a4: 34 01 00 01 mvi r1,1
80071a8: e0 00 00 0c bi 80071d8 <_Thread_queue_Enqueue_priority+0x228>
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
previous_node = search_node->previous;
80071ac: 29 61 00 40 lw r1,(r11+64)
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
80071b0: 35 62 00 3c addi r2,r11,60
previous_node = search_node->previous;
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
80071b4: 59 82 00 00 sw (r12+0),r2
the_node->previous = previous_node;
80071b8: 59 81 00 04 sw (r12+4),r1
previous_node->next = the_node;
80071bc: 58 2c 00 00 sw (r1+0),r12
search_node->previous = the_node;
80071c0: 59 6c 00 40 sw (r11+64),r12
the_thread->Wait.queue = the_thread_queue;
80071c4: 59 8d 00 44 sw (r12+68),r13
_ISR_Enable( level );
80071c8: d0 0f 00 00 wcsr IE,r15
80071cc: e3 ff ff f6 bi 80071a4 <_Thread_queue_Enqueue_priority+0x1f4>
* For example, the blocking thread could have been given
* the mutex by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
80071d0: 5a a1 00 00 sw (r21+0),r1 <== NOT EXECUTED
return the_thread_queue->sync_state;
80071d4: 29 a1 00 30 lw r1,(r13+48) <== NOT EXECUTED
}
80071d8: 2b 9d 00 04 lw ra,(sp+4)
80071dc: 2b 8b 00 34 lw r11,(sp+52)
80071e0: 2b 8c 00 30 lw r12,(sp+48)
80071e4: 2b 8d 00 2c lw r13,(sp+44)
80071e8: 2b 8e 00 28 lw r14,(sp+40)
80071ec: 2b 8f 00 24 lw r15,(sp+36)
80071f0: 2b 90 00 20 lw r16,(sp+32)
80071f4: 2b 91 00 1c lw r17,(sp+28)
80071f8: 2b 92 00 18 lw r18,(sp+24)
80071fc: 2b 93 00 14 lw r19,(sp+20)
8007200: 2b 94 00 10 lw r20,(sp+16)
8007204: 2b 95 00 0c lw r21,(sp+12)
8007208: 2b 96 00 08 lw r22,(sp+8)
800720c: 37 9c 00 34 addi sp,sp,52
8007210: c3 a0 00 00 ret
0800f3d0 <_Thread_queue_Process_timeout>:
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
800f3d0: 37 9c ff fc addi sp,sp,-4
800f3d4: 5b 9d 00 04 sw (sp+4),ra
800f3d8: b8 20 10 00 mv r2,r1
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
800f3dc: 28 21 00 44 lw r1,(r1+68)
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
800f3e0: 28 24 00 30 lw r4,(r1+48)
800f3e4: 44 80 00 0c be r4,r0,800f414 <_Thread_queue_Process_timeout+0x44>
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
800f3e8: 78 03 08 01 mvhi r3,0x801
800f3ec: 38 63 9d f0 ori r3,r3,0x9df0
800f3f0: 28 63 00 0c lw r3,(r3+12)
800f3f4: 5c 43 00 08 bne r2,r3,800f414 <_Thread_queue_Process_timeout+0x44><== NEVER TAKEN
_Thread_Is_executing( the_thread ) ) {
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
800f3f8: 34 03 00 03 mvi r3,3
800f3fc: 44 83 00 09 be r4,r3,800f420 <_Thread_queue_Process_timeout+0x50><== ALWAYS TAKEN
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
800f400: 28 23 00 3c lw r3,(r1+60) <== NOT EXECUTED
800f404: 58 43 00 34 sw (r2+52),r3 <== NOT EXECUTED
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
800f408: 34 02 00 02 mvi r2,2 <== NOT EXECUTED
800f40c: 58 22 00 30 sw (r1+48),r2 <== NOT EXECUTED
800f410: e0 00 00 04 bi 800f420 <_Thread_queue_Process_timeout+0x50><== NOT EXECUTED
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
800f414: 28 23 00 3c lw r3,(r1+60)
800f418: 58 43 00 34 sw (r2+52),r3
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
800f41c: f8 00 07 99 calli 8011280 <_Thread_queue_Extract>
}
}
800f420: 2b 9d 00 04 lw ra,(sp+4)
800f424: 37 9c 00 04 addi sp,sp,4
800f428: c3 a0 00 00 ret
08007300 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
8007300: 37 9c ff ec addi sp,sp,-20
8007304: 5b 8b 00 10 sw (sp+16),r11
8007308: 5b 8c 00 0c sw (sp+12),r12
800730c: 5b 8d 00 08 sw (sp+8),r13
8007310: 5b 9d 00 04 sw (sp+4),ra
8007314: b8 20 58 00 mv r11,r1
8007318: b8 40 60 00 mv r12,r2
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
800731c: 44 20 00 19 be r1,r0,8007380 <_Thread_queue_Requeue+0x80> <== NEVER TAKEN
/*
* If queueing by FIFO, there is nothing to do. This only applies to
* priority blocking discipline.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
8007320: 28 22 00 34 lw r2,(r1+52)
8007324: 34 01 00 01 mvi r1,1
8007328: 5c 41 00 16 bne r2,r1,8007380 <_Thread_queue_Requeue+0x80> <== NEVER TAKEN
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
800732c: 90 00 68 00 rcsr r13,IE
8007330: 34 01 ff fe mvi r1,-2
8007334: a1 a1 08 00 and r1,r13,r1
8007338: d0 01 00 00 wcsr IE,r1
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
800733c: 78 03 08 01 mvhi r3,0x801
8007340: 38 63 80 94 ori r3,r3,0x8094
8007344: 29 82 00 10 lw r2,(r12+16)
8007348: 28 61 00 00 lw r1,(r3+0)
800734c: a0 41 08 00 and r1,r2,r1
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
8007350: 44 20 00 0b be r1,r0,800737c <_Thread_queue_Requeue+0x7c> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
8007354: 34 01 00 01 mvi r1,1
8007358: 59 61 00 30 sw (r11+48),r1
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
800735c: b9 80 10 00 mv r2,r12
8007360: b9 60 08 00 mv r1,r11
8007364: 34 03 00 01 mvi r3,1
8007368: f8 00 1f cc calli 800f298 <_Thread_queue_Extract_priority_helper>
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
800736c: b9 60 08 00 mv r1,r11
8007370: b9 80 10 00 mv r2,r12
8007374: 37 83 00 14 addi r3,sp,20
8007378: fb ff ff 0e calli 8006fb0 <_Thread_queue_Enqueue_priority>
}
_ISR_Enable( level );
800737c: d0 0d 00 00 wcsr IE,r13
}
}
8007380: 2b 9d 00 04 lw ra,(sp+4)
8007384: 2b 8b 00 10 lw r11,(sp+16)
8007388: 2b 8c 00 0c lw r12,(sp+12)
800738c: 2b 8d 00 08 lw r13,(sp+8)
8007390: 37 9c 00 14 addi sp,sp,20
8007394: c3 a0 00 00 ret
08007398 <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
8007398: 37 9c ff f8 addi sp,sp,-8
800739c: 5b 9d 00 04 sw (sp+4),ra
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
80073a0: 37 82 00 08 addi r2,sp,8
80073a4: fb ff fd 72 calli 800696c <_Thread_Get>
switch ( location ) {
80073a8: 2b 82 00 08 lw r2,(sp+8)
80073ac: 5c 40 00 07 bne r2,r0,80073c8 <_Thread_queue_Timeout+0x30> <== NEVER TAKEN
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
80073b0: f8 00 20 08 calli 800f3d0 <_Thread_queue_Process_timeout>
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
80073b4: 78 01 08 01 mvhi r1,0x801
80073b8: 38 21 99 20 ori r1,r1,0x9920
80073bc: 28 22 00 00 lw r2,(r1+0)
80073c0: 34 42 ff ff addi r2,r2,-1
80073c4: 58 22 00 00 sw (r1+0),r2
_Thread_Unnest_dispatch();
break;
}
}
80073c8: 2b 9d 00 04 lw ra,(sp+4)
80073cc: 37 9c 00 08 addi sp,sp,8
80073d0: c3 a0 00 00 ret
080146b8 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
80146b8: 37 9c ff a8 addi sp,sp,-88
80146bc: 5b 8b 00 40 sw (sp+64),r11
80146c0: 5b 8c 00 3c sw (sp+60),r12
80146c4: 5b 8d 00 38 sw (sp+56),r13
80146c8: 5b 8e 00 34 sw (sp+52),r14
80146cc: 5b 8f 00 30 sw (sp+48),r15
80146d0: 5b 90 00 2c sw (sp+44),r16
80146d4: 5b 91 00 28 sw (sp+40),r17
80146d8: 5b 92 00 24 sw (sp+36),r18
80146dc: 5b 93 00 20 sw (sp+32),r19
80146e0: 5b 94 00 1c sw (sp+28),r20
80146e4: 5b 95 00 18 sw (sp+24),r21
80146e8: 5b 96 00 14 sw (sp+20),r22
80146ec: 5b 97 00 10 sw (sp+16),r23
80146f0: 5b 98 00 0c sw (sp+12),r24
80146f4: 5b 99 00 08 sw (sp+8),r25
80146f8: 5b 9d 00 04 sw (sp+4),ra
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
80146fc: 78 10 08 03 mvhi r16,0x803
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
8014700: b8 20 58 00 mv r11,r1
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8014704: 37 82 00 54 addi r2,sp,84
8014708: 37 81 00 50 addi r1,sp,80
801470c: 37 8f 00 44 addi r15,sp,68
8014710: 37 91 00 48 addi r17,sp,72
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
8014714: 78 0e 08 03 mvhi r14,0x803
8014718: 5b 82 00 50 sw (sp+80),r2
head->previous = NULL;
801471c: 5b 80 00 54 sw (sp+84),r0
tail->previous = head;
8014720: 5b 81 00 58 sw (sp+88),r1
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8014724: 5b 91 00 44 sw (sp+68),r17
head->previous = NULL;
8014728: 5b 80 00 48 sw (sp+72),r0
tail->previous = head;
801472c: 5b 8f 00 4c sw (sp+76),r15
Chain_Control *tmp;
/*
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
8014730: b8 20 c8 00 mv r25,r1
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
8014734: 3a 10 fd e0 ori r16,r16,0xfde0
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014738: 35 73 00 30 addi r19,r11,48
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
801473c: 39 ce fd 58 ori r14,r14,0xfd58
/*
* 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 );
8014740: 35 6d 00 68 addi r13,r11,104
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
8014744: 34 18 00 03 mvi r24,3
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
8014748: 34 12 ff fe mvi r18,-2
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
801474c: b8 40 b8 00 mv r23,r2
_Thread_Set_state( ts->thread, STATES_DELAYING );
_Timer_server_Reset_interval_system_watchdog( ts );
_Timer_server_Reset_tod_system_watchdog( ts );
_Thread_Enable_dispatch();
ts->active = true;
8014750: 34 16 00 01 mvi r22,1
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
8014754: 35 75 00 08 addi r21,r11,8
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
8014758: 35 74 00 40 addi r20,r11,64
Chain_Control *tmp;
/*
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
801475c: 59 79 00 78 sw (r11+120),r25
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
8014760: 2a 02 00 00 lw r2,(r16+0)
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
8014764: 29 63 00 3c lw r3,(r11+60)
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014768: ba 60 08 00 mv r1,r19
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
801476c: 59 62 00 3c sw (r11+60),r2
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014770: c8 43 10 00 sub r2,r2,r3
8014774: b9 e0 18 00 mv r3,r15
8014778: f8 00 15 8b calli 8019da4 <_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;
801477c: 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();
8014780: 29 cc 00 00 lw r12,(r14+0)
/*
* Process the seconds chain. Start by checking that the Time
* of Day (TOD) has not been set backwards. If it has then
* we want to adjust the watchdogs->Chain to indicate this.
*/
if ( snapshot > last_snapshot ) {
8014784: 50 8c 00 06 bgeu r4,r12,801479c <_Timer_server_Body+0xe4>
/*
* This path is for normal forward movement and cases where the
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
8014788: b9 a0 08 00 mv r1,r13
801478c: c9 84 10 00 sub r2,r12,r4
8014790: b9 e0 18 00 mv r3,r15
8014794: f8 00 15 84 calli 8019da4 <_Watchdog_Adjust_to_chain>
8014798: e0 00 00 06 bi 80147b0 <_Timer_server_Body+0xf8>
} else if ( snapshot < last_snapshot ) {
801479c: 51 84 00 05 bgeu r12,r4,80147b0 <_Timer_server_Body+0xf8>
/*
* The current TOD is before the last TOD which indicates that
* TOD has been set backwards.
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
80147a0: b9 a0 08 00 mv r1,r13
80147a4: 34 02 00 01 mvi r2,1
80147a8: c8 8c 18 00 sub r3,r4,r12
80147ac: f8 00 15 47 calli 8019cc8 <_Watchdog_Adjust>
}
watchdogs->last_snapshot = snapshot;
80147b0: 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 ) {
80147b4: 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 );
80147b8: 29 63 00 78 lw r3,(r11+120)
80147bc: b8 60 08 00 mv r1,r3
80147c0: f8 00 03 84 calli 80155d0 <_Chain_Get>
80147c4: b8 20 10 00 mv r2,r1
if ( timer == NULL ) {
80147c8: 44 20 00 09 be r1,r0,80147ec <_Timer_server_Body+0x134> <== ALWAYS TAKEN
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
80147cc: 28 23 00 38 lw r3,(r1+56) <== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
80147d0: ba 60 08 00 mv r1,r19 <== NOT EXECUTED
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
80147d4: 44 6c 00 03 be r3,r12,80147e0 <_Timer_server_Body+0x128> <== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
80147d8: 5c 78 ff f8 bne r3,r24,80147b8 <_Timer_server_Body+0x100> <== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
80147dc: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
80147e0: 34 42 00 10 addi r2,r2,16 <== NOT EXECUTED
80147e4: f8 00 15 95 calli 8019e38 <_Watchdog_Insert> <== NOT EXECUTED
80147e8: e3 ff ff f4 bi 80147b8 <_Timer_server_Body+0x100> <== NOT EXECUTED
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
80147ec: 90 00 20 00 rcsr r4,IE
80147f0: a0 92 08 00 and r1,r4,r18
80147f4: d0 01 00 00 wcsr IE,r1
tmp = ts->insert_chain;
80147f8: 29 61 00 78 lw r1,(r11+120)
if ( _Chain_Is_empty( insert_chain ) ) {
80147fc: 2b 81 00 50 lw r1,(sp+80)
8014800: 34 03 00 01 mvi r3,1
8014804: 5c 37 00 03 bne r1,r23,8014810 <_Timer_server_Body+0x158> <== NEVER TAKEN
ts->insert_chain = NULL;
8014808: 59 60 00 78 sw (r11+120),r0
do_loop = false;
801480c: 34 03 00 00 mvi r3,0
}
_ISR_Enable( level );
8014810: d0 04 00 00 wcsr IE,r4
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
while ( do_loop ) {
8014814: 5c 60 ff d3 bne r3,r0,8014760 <_Timer_server_Body+0xa8> <== NEVER TAKEN
_Chain_Initialize_empty( &fire_chain );
while ( true ) {
_Timer_server_Get_watchdogs_that_fire_now( ts, &insert_chain, &fire_chain );
if ( !_Chain_Is_empty( &fire_chain ) ) {
8014818: 2b 81 00 44 lw r1,(sp+68)
801481c: 44 31 00 13 be r1,r17,8014868 <_Timer_server_Body+0x1b0>
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
8014820: 90 00 18 00 rcsr r3,IE
8014824: a0 72 08 00 and r1,r3,r18
8014828: d0 01 00 00 wcsr IE,r1
initialized = false;
}
#endif
return status;
}
801482c: 2b 82 00 44 lw r2,(sp+68)
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
8014830: 44 51 00 0c be r2,r17,8014860 <_Timer_server_Body+0x1a8>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
8014834: 28 44 00 00 lw r4,(r2+0)
head->next = new_first;
8014838: 5b 84 00 44 sw (sp+68),r4
new_first->previous = head;
801483c: 58 8f 00 04 sw (r4+4),r15
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
8014840: 44 40 00 08 be r2,r0,8014860 <_Timer_server_Body+0x1a8> <== NEVER TAKEN
watchdog->state = WATCHDOG_INACTIVE;
8014844: 58 40 00 08 sw (r2+8),r0
_ISR_Enable( level );
8014848: d0 03 00 00 wcsr IE,r3
/*
* The timer server may block here and wait for resources or time.
* The system watchdogs are inactive and will remain inactive since
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
801484c: 28 43 00 1c lw r3,(r2+28)
8014850: 28 41 00 20 lw r1,(r2+32)
8014854: 28 42 00 24 lw r2,(r2+36)
8014858: d8 60 00 00 call r3
}
801485c: e3 ff ff f1 bi 8014820 <_Timer_server_Body+0x168>
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
_ISR_Enable( level );
} else {
_ISR_Enable( level );
8014860: d0 03 00 00 wcsr IE,r3
8014864: e3 ff ff be bi 801475c <_Timer_server_Body+0xa4>
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
8014868: 31 60 00 7c sb (r11+124),r0
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
801486c: fb ff ff 53 calli 80145b8 <_Thread_Disable_dispatch>
_Thread_Set_state( ts->thread, STATES_DELAYING );
8014870: 29 61 00 00 lw r1,(r11+0)
8014874: 34 02 00 08 mvi r2,8
8014878: f8 00 12 dc calli 80193e8 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
801487c: b9 60 08 00 mv r1,r11
8014880: fb ff ff 54 calli 80145d0 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
8014884: b9 60 08 00 mv r1,r11
8014888: fb ff ff 6f calli 8014644 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
801488c: f8 00 0f db calli 80187f8 <_Thread_Enable_dispatch>
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
8014890: ba a0 08 00 mv r1,r21
_Thread_Set_state( ts->thread, STATES_DELAYING );
_Timer_server_Reset_interval_system_watchdog( ts );
_Timer_server_Reset_tod_system_watchdog( ts );
_Thread_Enable_dispatch();
ts->active = true;
8014894: 31 76 00 7c sb (r11+124),r22
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
8014898: f8 00 15 c5 calli 8019fac <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
801489c: ba 80 08 00 mv r1,r20
80148a0: f8 00 15 c3 calli 8019fac <_Watchdog_Remove>
80148a4: e3 ff ff ae bi 801475c <_Timer_server_Body+0xa4>
080148a8 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
80148a8: 37 9c ff f4 addi sp,sp,-12
80148ac: 5b 8b 00 0c sw (sp+12),r11
80148b0: 5b 8c 00 08 sw (sp+8),r12
80148b4: 5b 9d 00 04 sw (sp+4),ra
80148b8: b8 20 58 00 mv r11,r1
if ( ts->insert_chain == NULL ) {
80148bc: 28 21 00 78 lw r1,(r1+120)
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
80148c0: b8 40 60 00 mv r12,r2
if ( ts->insert_chain == NULL ) {
80148c4: 5c 20 00 43 bne r1,r0,80149d0 <_Timer_server_Schedule_operation_method+0x128><== NEVER TAKEN
* is the reference point for the delta chain. Thus if we do not update the
* reference point we have to add DT to the initial delta of the watchdog
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
80148c8: fb ff ff 3c calli 80145b8 <_Thread_Disable_dispatch>
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
80148cc: 29 81 00 38 lw r1,(r12+56)
80148d0: 34 02 00 01 mvi r2,1
80148d4: 5c 22 00 1d bne r1,r2,8014948 <_Timer_server_Schedule_operation_method+0xa0>
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
80148d8: 90 00 10 00 rcsr r2,IE
80148dc: 34 01 ff fe mvi r1,-2
80148e0: a0 41 08 00 and r1,r2,r1
80148e4: d0 01 00 00 wcsr IE,r1
snapshot = _Watchdog_Ticks_since_boot;
80148e8: 78 01 08 03 mvhi r1,0x803
80148ec: 38 21 fd e0 ori r1,r1,0xfde0
80148f0: 28 23 00 00 lw r3,(r1+0)
initialized = false;
}
#endif
return status;
}
80148f4: 29 61 00 30 lw r1,(r11+48)
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
last_snapshot = ts->Interval_watchdogs.last_snapshot;
80148f8: 29 65 00 3c lw r5,(r11+60)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
80148fc: 35 64 00 34 addi r4,r11,52
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
8014900: 44 24 00 07 be r1,r4,801491c <_Timer_server_Schedule_operation_method+0x74>
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
8014904: 28 26 00 10 lw r6,(r1+16)
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
8014908: c8 65 28 00 sub r5,r3,r5
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
801490c: 34 04 00 00 mvi r4,0
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
8014910: 50 a6 00 02 bgeu r5,r6,8014918 <_Timer_server_Schedule_operation_method+0x70>
delta_interval -= delta;
8014914: c8 c5 20 00 sub r4,r6,r5
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
8014918: 58 24 00 10 sw (r1+16),r4
}
ts->Interval_watchdogs.last_snapshot = snapshot;
801491c: 59 63 00 3c sw (r11+60),r3
_ISR_Enable( level );
8014920: d0 02 00 00 wcsr IE,r2
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
8014924: 35 61 00 30 addi r1,r11,48
8014928: 35 82 00 10 addi r2,r12,16
801492c: f8 00 15 43 calli 8019e38 <_Watchdog_Insert>
if ( !ts->active ) {
8014930: 41 61 00 7c lbu r1,(r11+124)
8014934: 20 21 00 ff andi r1,r1,0xff
8014938: 5c 20 00 24 bne r1,r0,80149c8 <_Timer_server_Schedule_operation_method+0x120>
_Timer_server_Reset_interval_system_watchdog( ts );
801493c: b9 60 08 00 mv r1,r11
8014940: fb ff ff 24 calli 80145d0 <_Timer_server_Reset_interval_system_watchdog>
8014944: e0 00 00 21 bi 80149c8 <_Timer_server_Schedule_operation_method+0x120>
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
8014948: 34 02 00 03 mvi r2,3
801494c: 5c 22 00 1f bne r1,r2,80149c8 <_Timer_server_Schedule_operation_method+0x120>
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
8014950: 90 00 30 00 rcsr r6,IE
8014954: 34 01 ff fe mvi r1,-2
8014958: a0 c1 08 00 and r1,r6,r1
801495c: d0 01 00 00 wcsr IE,r1
initialized = false;
}
#endif
return status;
}
8014960: 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();
8014964: 78 01 08 03 mvhi r1,0x803
last_snapshot = ts->TOD_watchdogs.last_snapshot;
8014968: 29 65 00 74 lw r5,(r11+116)
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
801496c: 38 21 fd 58 ori r1,r1,0xfd58
8014970: 35 63 00 6c addi r3,r11,108
8014974: 28 21 00 00 lw r1,(r1+0)
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
8014978: 44 43 00 0a be r2,r3,80149a0 <_Timer_server_Schedule_operation_method+0xf8>
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
801497c: 28 44 00 10 lw r4,(r2+16)
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
8014980: b4 85 18 00 add r3,r4,r5
delta_interval += delta;
8014984: c8 61 18 00 sub r3,r3,r1
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
if ( snapshot > last_snapshot ) {
8014988: 50 a1 00 05 bgeu r5,r1,801499c <_Timer_server_Schedule_operation_method+0xf4>
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
801498c: c8 25 28 00 sub r5,r1,r5
if (delta_interval > delta) {
delta_interval -= delta;
} else {
delta_interval = 0;
8014990: 34 03 00 00 mvi r3,0
if ( snapshot > last_snapshot ) {
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
if (delta_interval > delta) {
8014994: 50 a4 00 02 bgeu r5,r4,801499c <_Timer_server_Schedule_operation_method+0xf4><== NEVER TAKEN
delta_interval -= delta;
8014998: c8 85 18 00 sub r3,r4,r5
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
801499c: 58 43 00 10 sw (r2+16),r3
}
ts->TOD_watchdogs.last_snapshot = snapshot;
80149a0: 59 61 00 74 sw (r11+116),r1
_ISR_Enable( level );
80149a4: d0 06 00 00 wcsr IE,r6
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
80149a8: 35 61 00 68 addi r1,r11,104
80149ac: 35 82 00 10 addi r2,r12,16
80149b0: f8 00 15 22 calli 8019e38 <_Watchdog_Insert>
if ( !ts->active ) {
80149b4: 41 61 00 7c lbu r1,(r11+124)
80149b8: 20 21 00 ff andi r1,r1,0xff
80149bc: 5c 20 00 03 bne r1,r0,80149c8 <_Timer_server_Schedule_operation_method+0x120><== NEVER TAKEN
_Timer_server_Reset_tod_system_watchdog( ts );
80149c0: b9 60 08 00 mv r1,r11
80149c4: fb ff ff 20 calli 8014644 <_Timer_server_Reset_tod_system_watchdog>
}
}
_Thread_Enable_dispatch();
80149c8: f8 00 0f 8c calli 80187f8 <_Thread_Enable_dispatch>
80149cc: e0 00 00 03 bi 80149d8 <_Timer_server_Schedule_operation_method+0x130>
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
80149d0: 29 61 00 78 lw r1,(r11+120) <== NOT EXECUTED
80149d4: f8 00 02 e9 calli 8015578 <_Chain_Append> <== NOT EXECUTED
}
}
80149d8: 2b 9d 00 04 lw ra,(sp+4)
80149dc: 2b 8b 00 0c lw r11,(sp+12)
80149e0: 2b 8c 00 08 lw r12,(sp+8)
80149e4: 37 9c 00 0c addi sp,sp,12
80149e8: c3 a0 00 00 ret
08007700 <_User_extensions_Handler_initialization>:
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <string.h>
void _User_extensions_Handler_initialization(void)
{
8007700: 37 9c ff ec addi sp,sp,-20
8007704: 5b 8b 00 14 sw (sp+20),r11
8007708: 5b 8c 00 10 sw (sp+16),r12
800770c: 5b 8d 00 0c sw (sp+12),r13
8007710: 5b 8e 00 08 sw (sp+8),r14
8007714: 5b 9d 00 04 sw (sp+4),ra
User_extensions_Control *extension;
uint32_t i;
uint32_t number_of_extensions;
User_extensions_Table *initial_extensions;
number_of_extensions = Configuration.number_of_initial_extensions;
8007718: 78 02 08 01 mvhi r2,0x801
800771c: 38 42 90 ac ori r2,r2,0x90ac
8007720: 28 4e 00 3c lw r14,(r2+60)
initial_extensions = Configuration.User_extension_table;
8007724: 28 4b 00 40 lw r11,(r2+64)
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8007728: 78 03 08 01 mvhi r3,0x801
800772c: 78 02 08 01 mvhi r2,0x801
8007730: 38 42 9a a0 ori r2,r2,0x9aa0
8007734: 38 63 9a a4 ori r3,r3,0x9aa4
8007738: 58 43 00 00 sw (r2+0),r3
head->previous = NULL;
800773c: 58 40 00 04 sw (r2+4),r0
tail->previous = head;
8007740: 58 42 00 08 sw (r2+8),r2
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8007744: 78 03 08 01 mvhi r3,0x801
8007748: 78 02 08 01 mvhi r2,0x801
800774c: 38 42 99 24 ori r2,r2,0x9924
8007750: 38 63 99 28 ori r3,r3,0x9928
8007754: 58 43 00 00 sw (r2+0),r3
head->previous = NULL;
8007758: 58 40 00 04 sw (r2+4),r0
tail->previous = head;
800775c: 58 42 00 08 sw (r2+8),r2
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
8007760: 45 60 00 22 be r11,r0,80077e8 <_User_extensions_Handler_initialization+0xe8><== NEVER TAKEN
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
number_of_extensions * sizeof( User_extensions_Control )
8007764: 34 02 00 34 mvi r2,52
8007768: b9 c0 08 00 mv r1,r14
800776c: f8 00 3e 23 calli 8016ff8 <__mulsi3>
8007770: b8 20 68 00 mv r13,r1
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
8007774: f8 00 01 82 calli 8007d7c <_Workspace_Allocate_or_fatal_error>
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
8007778: b9 a0 18 00 mv r3,r13
800777c: 34 02 00 00 mvi r2,0
_Chain_Initialize_empty( &_User_extensions_List );
_Chain_Initialize_empty( &_User_extensions_Switches_list );
if ( initial_extensions ) {
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
8007780: b8 20 60 00 mv r12,r1
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
8007784: 34 0d 00 00 mvi r13,0
extension = (User_extensions_Control *)
_Workspace_Allocate_or_fatal_error(
number_of_extensions * sizeof( User_extensions_Control )
);
memset (
8007788: f8 00 2a 31 calli 801204c <memset>
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
800778c: e0 00 00 16 bi 80077e4 <_User_extensions_Handler_initialization+0xe4>
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
8007790: 29 61 00 1c lw r1,(r11+28)
8007794: 29 68 00 00 lw r8,(r11+0)
8007798: 29 67 00 04 lw r7,(r11+4)
800779c: 29 66 00 08 lw r6,(r11+8)
80077a0: 29 65 00 0c lw r5,(r11+12)
80077a4: 29 64 00 10 lw r4,(r11+16)
80077a8: 29 63 00 14 lw r3,(r11+20)
80077ac: 29 62 00 18 lw r2,(r11+24)
80077b0: 59 81 00 30 sw (r12+48),r1
80077b4: 59 88 00 14 sw (r12+20),r8
80077b8: 59 87 00 18 sw (r12+24),r7
80077bc: 59 86 00 1c sw (r12+28),r6
80077c0: 59 85 00 20 sw (r12+32),r5
80077c4: 59 84 00 24 sw (r12+36),r4
80077c8: 59 83 00 28 sw (r12+40),r3
80077cc: 59 82 00 2c sw (r12+44),r2
_User_extensions_Add_set( extension );
80077d0: b9 80 08 00 mv r1,r12
80077d4: f8 00 1f 46 calli 800f4ec <_User_extensions_Add_set>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
80077d8: 35 8c 00 34 addi r12,r12,52
extension,
0,
number_of_extensions * sizeof( User_extensions_Control )
);
for ( i = 0 ; i < number_of_extensions ; i++ ) {
80077dc: 35 ad 00 01 addi r13,r13,1
80077e0: 35 6b 00 20 addi r11,r11,32
80077e4: 55 cd ff eb bgu r14,r13,8007790 <_User_extensions_Handler_initialization+0x90>
_User_extensions_Add_set_with_table (extension, &initial_extensions[i]);
extension++;
}
}
}
80077e8: 2b 9d 00 04 lw ra,(sp+4)
80077ec: 2b 8b 00 14 lw r11,(sp+20)
80077f0: 2b 8c 00 10 lw r12,(sp+16)
80077f4: 2b 8d 00 0c lw r13,(sp+12)
80077f8: 2b 8e 00 08 lw r14,(sp+8)
80077fc: 37 9c 00 14 addi sp,sp,20
8007800: c3 a0 00 00 ret
0800889c <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
800889c: 37 9c ff e4 addi sp,sp,-28
80088a0: 5b 8b 00 1c sw (sp+28),r11
80088a4: 5b 8c 00 18 sw (sp+24),r12
80088a8: 5b 8d 00 14 sw (sp+20),r13
80088ac: 5b 8e 00 10 sw (sp+16),r14
80088b0: 5b 8f 00 0c sw (sp+12),r15
80088b4: 5b 90 00 08 sw (sp+8),r16
80088b8: 5b 9d 00 04 sw (sp+4),ra
80088bc: b8 20 60 00 mv r12,r1
80088c0: b8 60 58 00 mv r11,r3
ISR_Level level;
_ISR_Disable( level );
80088c4: 90 00 08 00 rcsr r1,IE
80088c8: 34 03 ff fe mvi r3,-2
80088cc: a0 23 18 00 and r3,r1,r3
80088d0: d0 03 00 00 wcsr IE,r3
}
}
_ISR_Enable( level );
}
80088d4: 29 83 00 00 lw r3,(r12+0)
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
80088d8: 35 8e 00 04 addi r14,r12,4
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
80088dc: 44 6e 00 1d be r3,r14,8008950 <_Watchdog_Adjust+0xb4>
switch ( direction ) {
80088e0: 44 40 00 04 be r2,r0,80088f0 <_Watchdog_Adjust+0x54>
80088e4: 34 04 00 01 mvi r4,1
80088e8: 5c 44 00 1a bne r2,r4,8008950 <_Watchdog_Adjust+0xb4> <== NEVER TAKEN
80088ec: e0 00 00 04 bi 80088fc <_Watchdog_Adjust+0x60>
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
80088f0: 34 10 00 01 mvi r16,1
_ISR_Enable( level );
_Watchdog_Tickle( header );
_ISR_Disable( level );
80088f4: 34 0f ff fe mvi r15,-2
80088f8: e0 00 00 15 bi 800894c <_Watchdog_Adjust+0xb0>
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
80088fc: 28 62 00 10 lw r2,(r3+16)
8008900: b4 4b 58 00 add r11,r2,r11
8008904: 58 6b 00 10 sw (r3+16),r11
break;
8008908: e0 00 00 12 bi 8008950 <_Watchdog_Adjust+0xb4>
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
800890c: 29 82 00 00 lw r2,(r12+0)
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
8008910: 28 4d 00 10 lw r13,(r2+16)
8008914: 51 6d 00 04 bgeu r11,r13,8008924 <_Watchdog_Adjust+0x88>
_Watchdog_First( header )->delta_interval -= units;
8008918: c9 ab 58 00 sub r11,r13,r11
800891c: 58 4b 00 10 sw (r2+16),r11
break;
8008920: e0 00 00 0c bi 8008950 <_Watchdog_Adjust+0xb4>
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
8008924: 58 50 00 10 sw (r2+16),r16
_ISR_Enable( level );
8008928: d0 01 00 00 wcsr IE,r1
_Watchdog_Tickle( header );
800892c: b9 80 08 00 mv r1,r12
8008930: f8 00 00 98 calli 8008b90 <_Watchdog_Tickle>
_ISR_Disable( level );
8008934: 90 00 08 00 rcsr r1,IE
8008938: a0 2f 10 00 and r2,r1,r15
800893c: d0 02 00 00 wcsr IE,r2
if ( _Chain_Is_empty( header ) )
8008940: 29 82 00 00 lw r2,(r12+0)
8008944: 44 4e 00 03 be r2,r14,8008950 <_Watchdog_Adjust+0xb4>
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
8008948: c9 6d 58 00 sub r11,r11,r13
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
800894c: 5d 60 ff f0 bne r11,r0,800890c <_Watchdog_Adjust+0x70> <== ALWAYS TAKEN
}
break;
}
}
_ISR_Enable( level );
8008950: d0 01 00 00 wcsr IE,r1
}
8008954: 2b 9d 00 04 lw ra,(sp+4)
8008958: 2b 8b 00 1c lw r11,(sp+28)
800895c: 2b 8c 00 18 lw r12,(sp+24)
8008960: 2b 8d 00 14 lw r13,(sp+20)
8008964: 2b 8e 00 10 lw r14,(sp+16)
8008968: 2b 8f 00 0c lw r15,(sp+12)
800896c: 2b 90 00 08 lw r16,(sp+8)
8008970: 37 9c 00 1c addi sp,sp,28
8008974: c3 a0 00 00 ret
08007c14 <_Watchdog_Remove>:
{
ISR_Level level;
Watchdog_States previous_state;
Watchdog_Control *next_watchdog;
_ISR_Disable( level );
8007c14: 90 00 28 00 rcsr r5,IE
8007c18: 34 02 ff fe mvi r2,-2
8007c1c: a0 a2 10 00 and r2,r5,r2
8007c20: d0 02 00 00 wcsr IE,r2
previous_state = the_watchdog->state;
8007c24: 28 23 00 08 lw r3,(r1+8)
switch ( previous_state ) {
8007c28: 34 02 00 01 mvi r2,1
8007c2c: 44 62 00 05 be r3,r2,8007c40 <_Watchdog_Remove+0x2c>
8007c30: 44 60 00 1b be r3,r0,8007c9c <_Watchdog_Remove+0x88>
8007c34: 34 02 00 03 mvi r2,3
8007c38: 54 62 00 19 bgu r3,r2,8007c9c <_Watchdog_Remove+0x88> <== NEVER TAKEN
8007c3c: e0 00 00 03 bi 8007c48 <_Watchdog_Remove+0x34>
/*
* It is not actually on the chain so just change the state and
* the Insert operation we interrupted will be aborted.
*/
the_watchdog->state = WATCHDOG_INACTIVE;
8007c40: 58 20 00 08 sw (r1+8),r0
break;
8007c44: e0 00 00 16 bi 8007c9c <_Watchdog_Remove+0x88>
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
_ISR_Enable( level );
return( previous_state );
}
8007c48: 28 22 00 00 lw r2,(r1+0)
break;
case WATCHDOG_ACTIVE:
case WATCHDOG_REMOVE_IT:
the_watchdog->state = WATCHDOG_INACTIVE;
8007c4c: 58 20 00 08 sw (r1+8),r0
next_watchdog = _Watchdog_Next( the_watchdog );
if ( _Watchdog_Next(next_watchdog) )
8007c50: 28 44 00 00 lw r4,(r2+0)
8007c54: 44 80 00 05 be r4,r0,8007c68 <_Watchdog_Remove+0x54>
next_watchdog->delta_interval += the_watchdog->delta_interval;
8007c58: 28 46 00 10 lw r6,(r2+16)
8007c5c: 28 24 00 10 lw r4,(r1+16)
8007c60: b4 c4 20 00 add r4,r6,r4
8007c64: 58 44 00 10 sw (r2+16),r4
if ( _Watchdog_Sync_count )
8007c68: 78 04 08 01 mvhi r4,0x801
8007c6c: 38 84 9a 4c ori r4,r4,0x9a4c
8007c70: 28 84 00 00 lw r4,(r4+0)
8007c74: 44 80 00 07 be r4,r0,8007c90 <_Watchdog_Remove+0x7c>
_Watchdog_Sync_level = _ISR_Nest_level;
8007c78: 78 04 08 01 mvhi r4,0x801
8007c7c: 38 84 9d f0 ori r4,r4,0x9df0
8007c80: 28 86 00 08 lw r6,(r4+8)
8007c84: 78 04 08 01 mvhi r4,0x801
8007c88: 38 84 99 e4 ori r4,r4,0x99e4
8007c8c: 58 86 00 00 sw (r4+0),r6
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
8007c90: 28 24 00 04 lw r4,(r1+4)
next->previous = previous;
8007c94: 58 44 00 04 sw (r2+4),r4
previous->next = next;
8007c98: 58 82 00 00 sw (r4+0),r2
_Chain_Extract_unprotected( &the_watchdog->Node );
break;
}
the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
8007c9c: 78 02 08 01 mvhi r2,0x801
8007ca0: 38 42 9a 50 ori r2,r2,0x9a50
8007ca4: 28 42 00 00 lw r2,(r2+0)
8007ca8: 58 22 00 18 sw (r1+24),r2
_ISR_Enable( level );
8007cac: d0 05 00 00 wcsr IE,r5
return( previous_state );
}
8007cb0: b8 60 08 00 mv r1,r3
8007cb4: c3 a0 00 00 ret
080084e8 <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
80084e8: 37 9c ff ec addi sp,sp,-20
80084ec: 5b 8b 00 14 sw (sp+20),r11
80084f0: 5b 8c 00 10 sw (sp+16),r12
80084f4: 5b 8d 00 0c sw (sp+12),r13
80084f8: 5b 8e 00 08 sw (sp+8),r14
80084fc: 5b 9d 00 04 sw (sp+4),ra
8008500: b8 20 70 00 mv r14,r1
8008504: b8 40 60 00 mv r12,r2
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
8008508: 90 00 68 00 rcsr r13,IE
800850c: 34 01 ff fe mvi r1,-2
8008510: a1 a1 08 00 and r1,r13,r1
8008514: d0 01 00 00 wcsr IE,r1
printk( "Watchdog Chain: %s %p\n", name, header );
8008518: 78 01 08 01 mvhi r1,0x801
800851c: b9 80 18 00 mv r3,r12
8008520: 38 21 e8 b4 ori r1,r1,0xe8b4
8008524: b9 c0 10 00 mv r2,r14
8008528: fb ff eb a9 calli 80033cc <printk>
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
800852c: 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 );
8008530: 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 ) ) {
8008534: 45 6c 00 0b be r11,r12,8008560 <_Watchdog_Report_chain+0x78>
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
8008538: b9 60 10 00 mv r2,r11
800853c: 34 01 00 00 mvi r1,0
8008540: f8 00 00 13 calli 800858c <_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 )
8008544: 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 ) ;
8008548: 5d 6c ff fc bne r11,r12,8008538 <_Watchdog_Report_chain+0x50><== NEVER TAKEN
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
800854c: 78 01 08 01 mvhi r1,0x801
8008550: 38 21 e8 cc ori r1,r1,0xe8cc
8008554: b9 c0 10 00 mv r2,r14
8008558: fb ff eb 9d calli 80033cc <printk>
800855c: e0 00 00 04 bi 800856c <_Watchdog_Report_chain+0x84>
} else {
printk( "Chain is empty\n" );
8008560: 78 01 08 01 mvhi r1,0x801
8008564: 38 21 e8 dc ori r1,r1,0xe8dc
8008568: fb ff eb 99 calli 80033cc <printk>
}
_ISR_Enable( level );
800856c: d0 0d 00 00 wcsr IE,r13
}
8008570: 2b 9d 00 04 lw ra,(sp+4)
8008574: 2b 8b 00 14 lw r11,(sp+20)
8008578: 2b 8c 00 10 lw r12,(sp+16)
800857c: 2b 8d 00 0c lw r13,(sp+12)
8008580: 2b 8e 00 08 lw r14,(sp+8)
8008584: 37 9c 00 14 addi sp,sp,20
8008588: c3 a0 00 00 ret
0800c44c <_Watchdog_Tickle>:
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
800c44c: 37 9c ff e4 addi sp,sp,-28
800c450: 5b 8b 00 1c sw (sp+28),r11
800c454: 5b 8c 00 18 sw (sp+24),r12
800c458: 5b 8d 00 14 sw (sp+20),r13
800c45c: 5b 8e 00 10 sw (sp+16),r14
800c460: 5b 8f 00 0c sw (sp+12),r15
800c464: 5b 90 00 08 sw (sp+8),r16
800c468: 5b 9d 00 04 sw (sp+4),ra
800c46c: 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 );
800c470: 90 00 18 00 rcsr r3,IE
800c474: 34 01 ff fe mvi r1,-2
800c478: a0 61 08 00 and r1,r3,r1
800c47c: d0 01 00 00 wcsr IE,r1
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
800c480: 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 );
800c484: 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 );
800c488: b8 60 10 00 mv r2,r3
if ( _Chain_Is_empty( header ) )
800c48c: 45 6e 00 1a be r11,r14,800c4f4 <_Watchdog_Tickle+0xa8>
* to be inserted has already had its delta_interval adjusted to 0, and
* so is added to the head of the chain with a delta_interval of 0.
*
* Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
*/
if (the_watchdog->delta_interval != 0) {
800c490: 29 61 00 10 lw r1,(r11+16)
800c494: 44 20 00 04 be r1,r0,800c4a4 <_Watchdog_Tickle+0x58>
the_watchdog->delta_interval--;
800c498: 34 21 ff ff addi r1,r1,-1
800c49c: 59 61 00 10 sw (r11+16),r1
if ( the_watchdog->delta_interval != 0 )
800c4a0: 5c 20 00 15 bne r1,r0,800c4f4 <_Watchdog_Tickle+0xa8>
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
800c4a4: b8 60 68 00 mv r13,r3
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
_ISR_Enable( level );
switch( watchdog_state ) {
800c4a8: 34 10 00 02 mvi r16,2
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
800c4ac: 34 0f ff fe mvi r15,-2
800c4b0: e0 00 00 02 bi 800c4b8 <_Watchdog_Tickle+0x6c>
800c4b4: b8 40 68 00 mv r13,r2
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
800c4b8: b9 60 08 00 mv r1,r11
800c4bc: fb ff ff bb calli 800c3a8 <_Watchdog_Remove>
_ISR_Enable( level );
800c4c0: d0 0d 00 00 wcsr IE,r13
switch( watchdog_state ) {
800c4c4: 5c 30 00 05 bne r1,r16,800c4d8 <_Watchdog_Tickle+0x8c> <== NEVER TAKEN
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
800c4c8: 29 63 00 1c lw r3,(r11+28)
800c4cc: 29 61 00 20 lw r1,(r11+32)
800c4d0: 29 62 00 24 lw r2,(r11+36)
800c4d4: d8 60 00 00 call r3
case WATCHDOG_REMOVE_IT:
break;
}
_ISR_Disable( level );
800c4d8: 90 00 10 00 rcsr r2,IE
800c4dc: a0 4f 08 00 and r1,r2,r15
800c4e0: d0 01 00 00 wcsr IE,r1
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
800c4e4: 29 8b 00 00 lw r11,(r12+0)
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
800c4e8: 45 6e 00 03 be r11,r14,800c4f4 <_Watchdog_Tickle+0xa8>
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
800c4ec: 29 61 00 10 lw r1,(r11+16)
800c4f0: 44 20 ff f1 be r1,r0,800c4b4 <_Watchdog_Tickle+0x68>
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
800c4f4: d0 02 00 00 wcsr IE,r2
}
800c4f8: 2b 9d 00 04 lw ra,(sp+4)
800c4fc: 2b 8b 00 1c lw r11,(sp+28)
800c500: 2b 8c 00 18 lw r12,(sp+24)
800c504: 2b 8d 00 14 lw r13,(sp+20)
800c508: 2b 8e 00 10 lw r14,(sp+16)
800c50c: 2b 8f 00 0c lw r15,(sp+12)
800c510: 2b 90 00 08 lw r16,(sp+8)
800c514: 37 9c 00 1c addi sp,sp,28
800c518: c3 a0 00 00 ret
08006060 <_rename_r>:
int _rename_r(
struct _reent *ptr __attribute__((unused)),
const char *old,
const char *new
)
{
8006060: 37 9c ff a0 addi sp,sp,-96
8006064: 5b 8b 00 1c sw (sp+28),r11
8006068: 5b 8c 00 18 sw (sp+24),r12
800606c: 5b 8d 00 14 sw (sp+20),r13
8006070: 5b 8e 00 10 sw (sp+16),r14
8006074: 5b 8f 00 0c sw (sp+12),r15
8006078: 5b 90 00 08 sw (sp+8),r16
800607c: 5b 9d 00 04 sw (sp+4),ra
/*
* Get the parent node of the old path to be renamed. Find the parent path.
*/
old_parent_pathlen = rtems_filesystem_dirname ( old );
8006080: b8 40 08 00 mv r1,r2
int _rename_r(
struct _reent *ptr __attribute__((unused)),
const char *old,
const char *new
)
{
8006084: b8 40 58 00 mv r11,r2
8006088: b8 60 80 00 mv r16,r3
/*
* Get the parent node of the old path to be renamed. Find the parent path.
*/
old_parent_pathlen = rtems_filesystem_dirname ( old );
800608c: fb ff f9 8b calli 80046b8 <rtems_filesystem_dirname>
8006090: b8 20 70 00 mv r14,r1
8006094: 37 84 00 34 addi r4,sp,52
if ( old_parent_pathlen == 0 )
8006098: 5c 20 00 07 bne r1,r0,80060b4 <_rename_r+0x54>
rtems_filesystem_get_start_loc( old, &i, &old_parent_loc );
800609c: b9 60 08 00 mv r1,r11
80060a0: 37 82 00 60 addi r2,sp,96
80060a4: b8 80 18 00 mv r3,r4
80060a8: f8 00 00 fa calli 8006490 <rtems_filesystem_get_start_loc>
rtems_filesystem_location_info_t old_parent_loc;
rtems_filesystem_location_info_t new_parent_loc;
int i;
int result;
const char *name;
bool free_old_parentloc = false;
80060ac: 34 0d 00 00 mvi r13,0
80060b0: e0 00 00 09 bi 80060d4 <_rename_r+0x74>
old_parent_pathlen = rtems_filesystem_dirname ( old );
if ( old_parent_pathlen == 0 )
rtems_filesystem_get_start_loc( old, &i, &old_parent_loc );
else {
result = rtems_filesystem_evaluate_path( old, old_parent_pathlen,
80060b4: b9 60 08 00 mv r1,r11
80060b8: b9 c0 10 00 mv r2,r14
80060bc: 34 03 00 02 mvi r3,2
80060c0: 34 05 00 00 mvi r5,0
80060c4: fb ff f9 62 calli 800464c <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&old_parent_loc,
false );
if ( result != 0 )
return -1;
80060c8: 34 0c ff ff mvi r12,-1
else {
result = rtems_filesystem_evaluate_path( old, old_parent_pathlen,
RTEMS_LIBIO_PERMS_WRITE,
&old_parent_loc,
false );
if ( result != 0 )
80060cc: 5c 20 00 59 bne r1,r0,8006230 <_rename_r+0x1d0> <== NEVER TAKEN
return -1;
free_old_parentloc = true;
80060d0: 34 0d 00 01 mvi r13,1
/*
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
80060d4: 2b 81 00 34 lw r1,(sp+52)
name = old + old_parent_pathlen;
80060d8: b5 6e 58 00 add r11,r11,r14
80060dc: 5b 8b 00 5c sw (sp+92),r11
/*
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
80060e0: 5b 81 00 48 sw (sp+72),r1
80060e4: 2b 81 00 38 lw r1,(sp+56)
name = old + old_parent_pathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
80060e8: 37 8c 00 48 addi r12,sp,72
/*
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
80060ec: 5b 81 00 4c sw (sp+76),r1
80060f0: 2b 81 00 3c lw r1,(sp+60)
80060f4: 5b 81 00 50 sw (sp+80),r1
80060f8: 2b 81 00 40 lw r1,(sp+64)
80060fc: 5b 81 00 54 sw (sp+84),r1
8006100: 2b 81 00 44 lw r1,(sp+68)
8006104: 5b 81 00 58 sw (sp+88),r1
name = old + old_parent_pathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8006108: b9 60 08 00 mv r1,r11
800610c: f8 00 38 12 calli 8014154 <strlen>
8006110: b8 20 10 00 mv r2,r1
8006114: b9 60 08 00 mv r1,r11
8006118: fb ff f9 7c calli 8004708 <rtems_filesystem_prefix_separators>
800611c: b5 61 58 00 add r11,r11,r1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
8006120: b9 60 08 00 mv r1,r11
* Start from the parent to find the node that should be under it.
*/
old_loc = old_parent_loc;
name = old + old_parent_pathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8006124: 5b 8b 00 5c sw (sp+92),r11
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
8006128: f8 00 38 0b calli 8014154 <strlen>
800612c: b8 20 10 00 mv r2,r1
8006130: 34 03 00 00 mvi r3,0
8006134: b9 60 08 00 mv r1,r11
8006138: b9 80 20 00 mv r4,r12
800613c: 34 05 00 00 mvi r5,0
8006140: fb ff f9 21 calli 80045c4 <rtems_filesystem_evaluate_relative_path>
8006144: b8 20 78 00 mv r15,r1
0, &old_loc, false );
if ( result != 0 ) {
8006148: 44 20 00 05 be r1,r0,800615c <_rename_r+0xfc>
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
return -1;
800614c: 34 0c ff ff mvi r12,-1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &old_loc, false );
if ( result != 0 ) {
if ( free_old_parentloc )
rtems_filesystem_freenode( &old_parent_loc );
8006150: 37 81 00 34 addi r1,sp,52
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &old_loc, false );
if ( result != 0 ) {
if ( free_old_parentloc )
8006154: 45 a0 00 37 be r13,r0,8006230 <_rename_r+0x1d0> <== NEVER TAKEN
8006158: e0 00 00 35 bi 800622c <_rename_r+0x1cc>
/*
* Get the parent of the new node we are renaming to.
*/
rtems_filesystem_get_start_loc( new, &i, &new_parent_loc );
800615c: 37 8b 00 20 addi r11,sp,32
8006160: ba 00 08 00 mv r1,r16
8006164: 37 82 00 60 addi r2,sp,96
8006168: b9 60 18 00 mv r3,r11
800616c: f8 00 00 c9 calli 8006490 <rtems_filesystem_get_start_loc>
result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name );
8006170: 2b 81 00 2c lw r1,(sp+44)
8006174: b9 60 10 00 mv r2,r11
8006178: 37 83 00 5c addi r3,sp,92
800617c: 28 24 00 04 lw r4,(r1+4)
8006180: 2b 81 00 60 lw r1,(sp+96)
8006184: b6 01 08 00 add r1,r16,r1
8006188: d8 80 00 00 call r4
800618c: b8 20 70 00 mv r14,r1
if ( result != 0 ) {
8006190: 44 2f 00 09 be r1,r15,80061b4 <_rename_r+0x154>
rtems_filesystem_freenode( &new_parent_loc );
8006194: b9 60 08 00 mv r1,r11
8006198: fb ff fa 00 calli 8004998 <rtems_filesystem_freenode>
if ( free_old_parentloc )
800619c: 45 a0 00 03 be r13,r0,80061a8 <_rename_r+0x148> <== NEVER TAKEN
rtems_filesystem_freenode( &old_parent_loc );
80061a0: 37 81 00 34 addi r1,sp,52
80061a4: fb ff f9 fd calli 8004998 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &old_loc );
80061a8: 37 81 00 48 addi r1,sp,72
80061ac: fb ff f9 fb calli 8004998 <rtems_filesystem_freenode>
80061b0: e0 00 00 0e bi 80061e8 <_rename_r+0x188>
/*
* Check to see if the caller is trying to rename across file system
* boundaries.
*/
if ( old_parent_loc.mt_entry != new_parent_loc.mt_entry ) {
80061b4: 2b 81 00 30 lw r1,(sp+48)
80061b8: 2b 82 00 44 lw r2,(sp+68)
80061bc: 44 41 00 0d be r2,r1,80061f0 <_rename_r+0x190>
rtems_filesystem_freenode( &new_parent_loc );
80061c0: b9 60 08 00 mv r1,r11
80061c4: fb ff f9 f5 calli 8004998 <rtems_filesystem_freenode>
if ( free_old_parentloc )
80061c8: 45 ae 00 03 be r13,r14,80061d4 <_rename_r+0x174>
rtems_filesystem_freenode( &old_parent_loc );
80061cc: 37 81 00 34 addi r1,sp,52
80061d0: fb ff f9 f2 calli 8004998 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &old_loc );
80061d4: 37 81 00 48 addi r1,sp,72
80061d8: fb ff f9 f0 calli 8004998 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EXDEV );
80061dc: f8 00 2a 44 calli 8010aec <__errno>
80061e0: 34 02 00 12 mvi r2,18
80061e4: 58 22 00 00 sw (r1+0),r2
80061e8: 34 0c ff ff mvi r12,-1
80061ec: e0 00 00 11 bi 8006230 <_rename_r+0x1d0>
}
result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name );
80061f0: 2b 81 00 2c lw r1,(sp+44)
80061f4: 2b 84 00 5c lw r4,(sp+92)
80061f8: 37 8f 00 34 addi r15,sp,52
80061fc: 28 25 00 40 lw r5,(r1+64)
8006200: b9 80 10 00 mv r2,r12
8006204: b9 e0 08 00 mv r1,r15
8006208: b9 60 18 00 mv r3,r11
800620c: d8 a0 00 00 call r5
8006210: b8 20 60 00 mv r12,r1
rtems_filesystem_freenode( &new_parent_loc );
8006214: b9 60 08 00 mv r1,r11
8006218: fb ff f9 e0 calli 8004998 <rtems_filesystem_freenode>
if ( free_old_parentloc )
800621c: 45 ae 00 03 be r13,r14,8006228 <_rename_r+0x1c8>
rtems_filesystem_freenode( &old_parent_loc );
8006220: b9 e0 08 00 mv r1,r15
8006224: fb ff f9 dd calli 8004998 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &old_loc );
8006228: 37 81 00 48 addi r1,sp,72
800622c: fb ff f9 db calli 8004998 <rtems_filesystem_freenode>
return result;
}
8006230: b9 80 08 00 mv r1,r12
8006234: 2b 9d 00 04 lw ra,(sp+4)
8006238: 2b 8b 00 1c lw r11,(sp+28)
800623c: 2b 8c 00 18 lw r12,(sp+24)
8006240: 2b 8d 00 14 lw r13,(sp+20)
8006244: 2b 8e 00 10 lw r14,(sp+16)
8006248: 2b 8f 00 0c lw r15,(sp+12)
800624c: 2b 90 00 08 lw r16,(sp+8)
8006250: 37 9c 00 60 addi sp,sp,96
8006254: c3 a0 00 00 ret
08003974 <aio_cancel>:
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
8003974: 37 9c ff ec addi sp,sp,-20
8003978: 5b 8b 00 14 sw (sp+20),r11
800397c: 5b 8c 00 10 sw (sp+16),r12
8003980: 5b 8d 00 0c sw (sp+12),r13
8003984: 5b 8e 00 08 sw (sp+8),r14
8003988: 5b 9d 00 04 sw (sp+4),ra
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
800398c: 78 0b 08 01 mvhi r11,0x801
8003990: 39 6b 77 f8 ori r11,r11,0x77f8
* operation(s) cannot be canceled
*/
int aio_cancel(int fildes, struct aiocb *aiocbp)
{
8003994: b8 20 68 00 mv r13,r1
8003998: b8 40 60 00 mv r12,r2
rtems_aio_request_chain *r_chain;
int result;
pthread_mutex_lock (&aio_request_queue.mutex);
800399c: b9 60 08 00 mv r1,r11
80039a0: f8 00 04 bd calli 8004c94 <pthread_mutex_lock>
if (aiocbp == NULL)
80039a4: 5d 80 00 38 bne r12,r0,8003a84 <aio_cancel+0x110>
{
if (fcntl (fildes, F_GETFL) < 0) {
80039a8: b9 a0 08 00 mv r1,r13
80039ac: 34 02 00 03 mvi r2,3
80039b0: f8 00 1d d2 calli 800b0f8 <fcntl>
80039b4: 4c 2c 00 06 bge r1,r12,80039cc <aio_cancel+0x58> <== NEVER TAKEN
pthread_mutex_unlock(&aio_request_queue.mutex);
80039b8: b9 60 08 00 mv r1,r11
80039bc: f8 00 04 e9 calli 8004d60 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EBADF);
80039c0: f8 00 2e d3 calli 800f50c <__errno>
80039c4: 34 02 00 09 mvi r2,9
80039c8: e0 00 00 35 bi 8003a9c <aio_cancel+0x128>
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
80039cc: 78 01 08 01 mvhi r1,0x801
80039d0: 38 21 78 40 ori r1,r1,0x7840 <== NOT EXECUTED
80039d4: b9 a0 10 00 mv r2,r13 <== NOT EXECUTED
80039d8: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
80039dc: f8 00 00 c1 calli 8003ce0 <rtems_aio_search_fd> <== NOT EXECUTED
80039e0: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
80039e4: 5c 20 00 1b bne r1,r0,8003a50 <aio_cancel+0xdc> <== NOT EXECUTED
{
if (!rtems_chain_is_empty (&aio_request_queue.idle_req))
80039e8: 29 62 00 54 lw r2,(r11+84) <== NOT EXECUTED
80039ec: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
80039f0: 38 21 78 50 ori r1,r1,0x7850 <== NOT EXECUTED
80039f4: 44 41 00 13 be r2,r1,8003a40 <aio_cancel+0xcc> <== NOT EXECUTED
{
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
80039f8: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
80039fc: 38 21 78 4c ori r1,r1,0x784c <== NOT EXECUTED
8003a00: b9 a0 10 00 mv r2,r13 <== NOT EXECUTED
8003a04: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8003a08: f8 00 00 b6 calli 8003ce0 <rtems_aio_search_fd> <== NOT EXECUTED
8003a0c: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL) {
8003a10: 44 20 00 0c be r1,r0,8003a40 <aio_cancel+0xcc> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8003a14: f8 00 0a 7a calli 80063fc <_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);
8003a18: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003a1c: f8 00 01 ab calli 80040c8 <rtems_aio_remove_fd> <== NOT EXECUTED
pthread_mutex_destroy (&r_chain->mutex);
8003a20: 35 8d 00 1c addi r13,r12,28 <== NOT EXECUTED
8003a24: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003a28: f8 00 03 e1 calli 80049ac <pthread_mutex_destroy> <== NOT EXECUTED
pthread_cond_destroy (&r_chain->mutex);
8003a2c: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003a30: f8 00 02 e0 calli 80045b0 <pthread_cond_destroy> <== NOT EXECUTED
free (r_chain);
8003a34: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003a38: fb ff f9 ca calli 8002160 <free> <== NOT EXECUTED
8003a3c: e0 00 00 0e bi 8003a74 <aio_cancel+0x100> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
return AIO_CANCELED;
}
pthread_mutex_unlock (&aio_request_queue.mutex);
8003a40: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003a44: f8 00 04 c7 calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_ALLDONE;
8003a48: 34 0c 00 02 mvi r12,2 <== NOT EXECUTED
8003a4c: e0 00 00 39 bi 8003b30 <aio_cancel+0x1bc> <== NOT EXECUTED
}
pthread_mutex_lock (&r_chain->mutex);
8003a50: 34 2d 00 1c addi r13,r1,28 <== NOT EXECUTED
8003a54: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003a58: f8 00 04 8f calli 8004c94 <pthread_mutex_lock> <== NOT EXECUTED
8003a5c: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003a60: f8 00 0a 67 calli 80063fc <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (&r_chain->next_fd);
rtems_aio_remove_fd (r_chain);
8003a64: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003a68: f8 00 01 98 calli 80040c8 <rtems_aio_remove_fd> <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
8003a6c: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003a70: f8 00 04 bc calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
8003a74: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003a78: f8 00 04 ba calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
return AIO_CANCELED;
8003a7c: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
8003a80: e0 00 00 2c bi 8003b30 <aio_cancel+0x1bc> <== NOT EXECUTED
}
else
{
if (aiocbp->aio_fildes != fildes) {
8003a84: 29 8e 00 00 lw r14,(r12+0)
8003a88: 45 cd 00 08 be r14,r13,8003aa8 <aio_cancel+0x134> <== NEVER TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
8003a8c: b9 60 08 00 mv r1,r11
8003a90: f8 00 04 b4 calli 8004d60 <pthread_mutex_unlock>
rtems_set_errno_and_return_minus_one (EINVAL);
8003a94: f8 00 2e 9e calli 800f50c <__errno>
8003a98: 34 02 00 16 mvi r2,22
8003a9c: 58 22 00 00 sw (r1+0),r2
8003aa0: 34 0c ff ff mvi r12,-1
8003aa4: e0 00 00 23 bi 8003b30 <aio_cancel+0x1bc>
}
r_chain = rtems_aio_search_fd (&aio_request_queue.work_req,
8003aa8: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003aac: 38 21 78 40 ori r1,r1,0x7840 <== NOT EXECUTED
8003ab0: b9 c0 10 00 mv r2,r14 <== NOT EXECUTED
8003ab4: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8003ab8: f8 00 00 8a calli 8003ce0 <rtems_aio_search_fd> <== NOT EXECUTED
8003abc: b8 20 68 00 mv r13,r1 <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
8003ac0: 5c 20 00 10 bne r1,r0,8003b00 <aio_cancel+0x18c> <== NOT EXECUTED
if (!rtems_chain_is_empty (&aio_request_queue.idle_req))
8003ac4: 29 62 00 54 lw r2,(r11+84) <== NOT EXECUTED
8003ac8: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003acc: 38 21 78 50 ori r1,r1,0x7850 <== NOT EXECUTED
8003ad0: 44 41 00 0c be r2,r1,8003b00 <aio_cancel+0x18c> <== NOT EXECUTED
{
r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req,
8003ad4: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003ad8: 38 21 78 4c ori r1,r1,0x784c <== NOT EXECUTED
8003adc: b9 c0 10 00 mv r2,r14 <== NOT EXECUTED
8003ae0: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
8003ae4: f8 00 00 7f calli 8003ce0 <rtems_aio_search_fd> <== NOT EXECUTED
fildes,
0);
if (r_chain == NULL)
8003ae8: 44 20 ff e9 be r1,r0,8003a8c <aio_cancel+0x118> <== 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);
8003aec: b9 80 10 00 mv r2,r12 <== NOT EXECUTED
8003af0: f8 00 01 90 calli 8004130 <rtems_aio_remove_req> <== NOT EXECUTED
8003af4: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
8003af8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003afc: e0 00 00 0c bi 8003b2c <aio_cancel+0x1b8> <== NOT EXECUTED
return result;
}
pthread_mutex_lock (&r_chain->mutex);
8003b00: 35 ab 00 1c addi r11,r13,28 <== NOT EXECUTED
8003b04: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003b08: f8 00 04 63 calli 8004c94 <pthread_mutex_lock> <== NOT EXECUTED
result = rtems_aio_remove_req (&r_chain->next_fd, aiocbp);
8003b0c: b9 80 10 00 mv r2,r12 <== NOT EXECUTED
8003b10: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003b14: f8 00 01 87 calli 8004130 <rtems_aio_remove_req> <== NOT EXECUTED
8003b18: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
8003b1c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003b20: f8 00 04 90 calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
8003b24: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003b28: 38 21 77 f8 ori r1,r1,0x77f8 <== NOT EXECUTED
8003b2c: f8 00 04 8d calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
}
return AIO_ALLDONE;
}
8003b30: b9 80 08 00 mv r1,r12
8003b34: 2b 9d 00 04 lw ra,(sp+4)
8003b38: 2b 8b 00 14 lw r11,(sp+20)
8003b3c: 2b 8c 00 10 lw r12,(sp+16)
8003b40: 2b 8d 00 0c lw r13,(sp+12)
8003b44: 2b 8e 00 08 lw r14,(sp+8)
8003b48: 37 9c 00 14 addi sp,sp,20
8003b4c: c3 a0 00 00 ret
08003b58 <aio_fsync>:
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
8003b58: 37 9c ff f4 addi sp,sp,-12
8003b5c: 5b 8b 00 0c sw (sp+12),r11
8003b60: 5b 8c 00 08 sw (sp+8),r12
8003b64: 5b 9d 00 04 sw (sp+4),ra
8003b68: b8 40 58 00 mv r11,r2
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
8003b6c: 34 02 20 00 mvi r2,8192
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
8003b70: 34 0c 00 16 mvi r12,22
)
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
8003b74: 5c 22 00 09 bne r1,r2,8003b98 <aio_fsync+0x40>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
8003b78: 29 61 00 00 lw r1,(r11+0)
8003b7c: 34 02 00 03 mvi r2,3
8003b80: f8 00 1d 5e calli 800b0f8 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
8003b84: 20 21 00 03 andi r1,r1,0x3
8003b88: 34 21 ff ff addi r1,r1,-1
8003b8c: 34 02 00 01 mvi r2,1
8003b90: 50 41 00 09 bgeu r2,r1,8003bb4 <aio_fsync+0x5c> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
8003b94: 34 0c 00 09 mvi r12,9
8003b98: 34 01 ff ff mvi r1,-1
8003b9c: 59 6c 00 2c sw (r11+44),r12
8003ba0: 59 61 00 30 sw (r11+48),r1
8003ba4: f8 00 2e 5a calli 800f50c <__errno>
8003ba8: 58 2c 00 00 sw (r1+0),r12
8003bac: 34 01 ff ff mvi r1,-1
8003bb0: e0 00 00 09 bi 8003bd4 <aio_fsync+0x7c>
req = malloc (sizeof (rtems_aio_request));
8003bb4: 34 01 00 18 mvi r1,24 <== NOT EXECUTED
8003bb8: fb ff fb 22 calli 8002840 <malloc> <== NOT EXECUTED
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
8003bbc: 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)
8003bc0: 44 20 ff f6 be r1,r0,8003b98 <aio_fsync+0x40> <== NOT EXECUTED
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
8003bc4: 58 2b 00 14 sw (r1+20),r11 <== NOT EXECUTED
req->aiocbp->aio_lio_opcode = LIO_SYNC;
8003bc8: 34 02 00 03 mvi r2,3 <== NOT EXECUTED
8003bcc: 59 62 00 28 sw (r11+40),r2 <== NOT EXECUTED
return rtems_aio_enqueue (req);
8003bd0: f8 00 01 72 calli 8004198 <rtems_aio_enqueue> <== NOT EXECUTED
}
8003bd4: 2b 9d 00 04 lw ra,(sp+4)
8003bd8: 2b 8b 00 0c lw r11,(sp+12)
8003bdc: 2b 8c 00 08 lw r12,(sp+8)
8003be0: 37 9c 00 0c addi sp,sp,12
8003be4: c3 a0 00 00 ret
080043f4 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
80043f4: 37 9c ff f4 addi sp,sp,-12
80043f8: 5b 8b 00 0c sw (sp+12),r11
80043fc: 5b 8c 00 08 sw (sp+8),r12
8004400: 5b 9d 00 04 sw (sp+4),ra
8004404: b8 20 58 00 mv r11,r1
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
8004408: 28 21 00 00 lw r1,(r1+0)
800440c: 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);
8004410: 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);
8004414: f8 00 1b 39 calli 800b0f8 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
8004418: 20 21 00 03 andi r1,r1,0x3
800441c: 7c 22 00 02 cmpnei r2,r1,2
8004420: 7c 21 00 00 cmpnei r1,r1,0
8004424: a0 41 08 00 and r1,r2,r1
8004428: 5c 20 00 04 bne r1,r0,8004438 <aio_read+0x44>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
800442c: 29 6c 00 10 lw r12,(r11+16)
8004430: 45 81 00 09 be r12,r1,8004454 <aio_read+0x60>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
8004434: 34 0c 00 16 mvi r12,22
8004438: 34 01 ff ff mvi r1,-1
800443c: 59 6c 00 2c sw (r11+44),r12
8004440: 59 61 00 30 sw (r11+48),r1
8004444: f8 00 2c 32 calli 800f50c <__errno>
8004448: 58 2c 00 00 sw (r1+0),r12
800444c: 34 01 ff ff mvi r1,-1
8004450: e0 00 00 0d bi 8004484 <aio_read+0x90>
if (aiocbp->aio_offset < 0)
8004454: 29 61 00 04 lw r1,(r11+4)
8004458: 4c 2c 00 02 bge r1,r12,8004460 <aio_read+0x6c>
800445c: e3 ff ff f6 bi 8004434 <aio_read+0x40>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
8004460: 34 01 00 18 mvi r1,24
8004464: fb ff f8 f7 calli 8002840 <malloc>
if (req == NULL)
8004468: 5c 2c 00 03 bne r1,r12,8004474 <aio_read+0x80> <== ALWAYS TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
800446c: 34 0c 00 0b mvi r12,11 <== NOT EXECUTED
8004470: e3 ff ff f2 bi 8004438 <aio_read+0x44> <== NOT EXECUTED
req->aiocbp = aiocbp;
8004474: 58 2b 00 14 sw (r1+20),r11
req->aiocbp->aio_lio_opcode = LIO_READ;
8004478: 34 02 00 01 mvi r2,1
800447c: 59 62 00 28 sw (r11+40),r2
return rtems_aio_enqueue (req);
8004480: fb ff ff 46 calli 8004198 <rtems_aio_enqueue>
}
8004484: 2b 9d 00 04 lw ra,(sp+4)
8004488: 2b 8b 00 0c lw r11,(sp+12)
800448c: 2b 8c 00 08 lw r12,(sp+8)
8004490: 37 9c 00 0c addi sp,sp,12
8004494: c3 a0 00 00 ret
080044a0 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
80044a0: 37 9c ff f4 addi sp,sp,-12
80044a4: 5b 8b 00 0c sw (sp+12),r11
80044a8: 5b 8c 00 08 sw (sp+8),r12
80044ac: 5b 9d 00 04 sw (sp+4),ra
80044b0: b8 20 58 00 mv r11,r1
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
80044b4: 28 21 00 00 lw r1,(r1+0)
80044b8: 34 02 00 03 mvi r2,3
80044bc: f8 00 1b 0f calli 800b0f8 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
80044c0: 20 21 00 03 andi r1,r1,0x3
80044c4: 34 21 ff ff addi r1,r1,-1
80044c8: 34 02 00 01 mvi r2,1
80044cc: 50 41 00 03 bgeu r2,r1,80044d8 <aio_write+0x38>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
80044d0: 34 0c 00 09 mvi r12,9
80044d4: e0 00 00 04 bi 80044e4 <aio_write+0x44>
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
80044d8: 29 61 00 10 lw r1,(r11+16)
80044dc: 44 20 00 09 be r1,r0,8004500 <aio_write+0x60>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
80044e0: 34 0c 00 16 mvi r12,22
80044e4: 34 01 ff ff mvi r1,-1
80044e8: 59 6c 00 2c sw (r11+44),r12
80044ec: 59 61 00 30 sw (r11+48),r1
80044f0: f8 00 2c 07 calli 800f50c <__errno>
80044f4: 58 2c 00 00 sw (r1+0),r12
80044f8: 34 01 ff ff mvi r1,-1
80044fc: e0 00 00 0c bi 800452c <aio_write+0x8c>
if (aiocbp->aio_offset < 0)
8004500: 29 62 00 04 lw r2,(r11+4)
8004504: 4c 41 00 02 bge r2,r1,800450c <aio_write+0x6c>
8004508: e3 ff ff f6 bi 80044e0 <aio_write+0x40>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
req = malloc (sizeof (rtems_aio_request));
800450c: 34 01 00 18 mvi r1,24
8004510: fb ff f8 cc calli 8002840 <malloc>
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
8004514: 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)
8004518: 44 20 ff f3 be r1,r0,80044e4 <aio_write+0x44> <== NEVER TAKEN
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
800451c: 58 2b 00 14 sw (r1+20),r11
req->aiocbp->aio_lio_opcode = LIO_WRITE;
8004520: 34 02 00 02 mvi r2,2
8004524: 59 62 00 28 sw (r11+40),r2
return rtems_aio_enqueue (req);
8004528: fb ff ff 1c calli 8004198 <rtems_aio_enqueue>
}
800452c: 2b 9d 00 04 lw ra,(sp+4)
8004530: 2b 8b 00 0c lw r11,(sp+12)
8004534: 2b 8c 00 08 lw r12,(sp+8)
8004538: 37 9c 00 0c addi sp,sp,12
800453c: c3 a0 00 00 ret
080013f4 <chroot>:
#include <rtems/seterr.h>
int chroot(
const char *pathname
)
{
80013f4: 37 9c ff dc addi sp,sp,-36
80013f8: 5b 8b 00 10 sw (sp+16),r11
80013fc: 5b 8c 00 0c sw (sp+12),r12
8001400: 5b 8d 00 08 sw (sp+8),r13
8001404: 5b 9d 00 04 sw (sp+4),ra
int result;
rtems_filesystem_location_info_t loc;
/* an automatic call to new private env the first time */
if (rtems_current_user_env == &rtems_global_user_env) {
8001408: 78 0b 08 01 mvhi r11,0x801
800140c: 39 6b 41 08 ori r11,r11,0x4108
8001410: 29 6c 00 00 lw r12,(r11+0)
8001414: 78 02 08 01 mvhi r2,0x801
8001418: 38 42 47 50 ori r2,r2,0x4750
#include <rtems/seterr.h>
int chroot(
const char *pathname
)
{
800141c: b8 20 68 00 mv r13,r1
int result;
rtems_filesystem_location_info_t loc;
/* an automatic call to new private env the first time */
if (rtems_current_user_env == &rtems_global_user_env) {
8001420: 5d 82 00 08 bne r12,r2,8001440 <chroot+0x4c>
rtems_libio_set_private_env(); /* try to set a new private env*/
8001424: f8 00 05 9c calli 8002a94 <rtems_libio_set_private_env>
if (rtems_current_user_env == &rtems_global_user_env) /* not ok */
8001428: 29 61 00 00 lw r1,(r11+0)
800142c: 5c 2c 00 05 bne r1,r12,8001440 <chroot+0x4c>
rtems_set_errno_and_return_minus_one( ENOTSUP );
8001430: f8 00 2d be calli 800cb28 <__errno>
8001434: 34 02 00 86 mvi r2,134
8001438: 58 22 00 00 sw (r1+0),r2
800143c: e0 00 00 0a bi 8001464 <chroot+0x70>
}
result = chdir(pathname);
8001440: b9 a0 08 00 mv r1,r13
8001444: f8 00 1c 72 calli 800860c <chdir>
8001448: b8 20 58 00 mv r11,r1
if (result) {
800144c: 44 20 00 08 be r1,r0,800146c <chroot+0x78>
rtems_set_errno_and_return_minus_one( errno );
8001450: f8 00 2d b6 calli 800cb28 <__errno>
8001454: b8 20 58 00 mv r11,r1
8001458: f8 00 2d b4 calli 800cb28 <__errno>
800145c: 28 21 00 00 lw r1,(r1+0)
8001460: 59 61 00 00 sw (r11+0),r1
8001464: 34 01 ff ff mvi r1,-1
8001468: e0 00 00 1a bi 80014d0 <chroot+0xdc>
}
/* clone the new root location */
if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) {
800146c: 78 01 08 01 mvhi r1,0x801
8001470: 38 21 31 74 ori r1,r1,0x3174
8001474: 34 02 00 01 mvi r2,1
8001478: 34 03 00 00 mvi r3,0
800147c: 37 84 00 14 addi r4,sp,20
8001480: 34 05 00 00 mvi r5,0
8001484: f8 00 00 68 calli 8001624 <rtems_filesystem_evaluate_path>
8001488: 5c 2b ff f2 bne r1,r11,8001450 <chroot+0x5c> <== NEVER TAKEN
/* our cwd has changed, though - but there is no easy way of return :-( */
rtems_set_errno_and_return_minus_one( errno );
}
rtems_filesystem_freenode(&rtems_filesystem_root);
800148c: 78 0b 08 01 mvhi r11,0x801
8001490: 39 6b 41 08 ori r11,r11,0x4108
8001494: 29 61 00 00 lw r1,(r11+0)
8001498: 34 21 00 18 addi r1,r1,24
800149c: f8 00 00 aa calli 8001744 <rtems_filesystem_freenode>
rtems_filesystem_root = loc;
80014a0: 29 61 00 00 lw r1,(r11+0)
80014a4: 2b 82 00 14 lw r2,(sp+20)
80014a8: 58 22 00 18 sw (r1+24),r2
80014ac: 2b 82 00 18 lw r2,(sp+24)
80014b0: 58 22 00 1c sw (r1+28),r2
80014b4: 2b 82 00 1c lw r2,(sp+28)
80014b8: 58 22 00 20 sw (r1+32),r2
80014bc: 2b 82 00 20 lw r2,(sp+32)
80014c0: 58 22 00 24 sw (r1+36),r2
80014c4: 2b 82 00 24 lw r2,(sp+36)
80014c8: 58 22 00 28 sw (r1+40),r2
return 0;
80014cc: 34 01 00 00 mvi r1,0
}
80014d0: 2b 9d 00 04 lw ra,(sp+4)
80014d4: 2b 8b 00 10 lw r11,(sp+16)
80014d8: 2b 8c 00 0c lw r12,(sp+12)
80014dc: 2b 8d 00 08 lw r13,(sp+8)
80014e0: 37 9c 00 24 addi sp,sp,36
80014e4: c3 a0 00 00 ret
08002dac <clock_gettime>:
int clock_gettime(
clockid_t clock_id,
struct timespec *tp
)
{
8002dac: 37 9c ff fc addi sp,sp,-4
8002db0: 5b 9d 00 04 sw (sp+4),ra
8002db4: b8 20 18 00 mv r3,r1
8002db8: b8 40 08 00 mv r1,r2
if ( !tp )
8002dbc: 44 40 00 11 be r2,r0,8002e00 <clock_gettime+0x54>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
8002dc0: 34 02 00 01 mvi r2,1
8002dc4: 5c 62 00 03 bne r3,r2,8002dd0 <clock_gettime+0x24>
_TOD_Get(tp);
8002dc8: f8 00 06 f7 calli 80049a4 <_TOD_Get>
8002dcc: e0 00 00 06 bi 8002de4 <clock_gettime+0x38>
return 0;
}
#ifdef CLOCK_MONOTONIC
if ( clock_id == CLOCK_MONOTONIC ) {
8002dd0: 34 02 00 04 mvi r2,4
8002dd4: 44 62 00 03 be r3,r2,8002de0 <clock_gettime+0x34> <== NEVER TAKEN
return 0;
}
#endif
#ifdef _POSIX_CPUTIME
if ( clock_id == CLOCK_PROCESS_CPUTIME ) {
8002dd8: 34 02 00 02 mvi r2,2
8002ddc: 5c 62 00 04 bne r3,r2,8002dec <clock_gettime+0x40>
_TOD_Get_uptime_as_timespec( tp );
8002de0: f8 00 07 16 calli 8004a38 <_TOD_Get_uptime_as_timespec>
return 0;
8002de4: 34 01 00 00 mvi r1,0
8002de8: e0 00 00 0a bi 8002e10 <clock_gettime+0x64>
}
#endif
#ifdef _POSIX_THREAD_CPUTIME
if ( clock_id == CLOCK_THREAD_CPUTIME )
8002dec: 34 01 00 03 mvi r1,3
8002df0: 5c 61 00 04 bne r3,r1,8002e00 <clock_gettime+0x54>
rtems_set_errno_and_return_minus_one( ENOSYS );
8002df4: f8 00 2a af calli 800d8b0 <__errno>
8002df8: 34 02 00 58 mvi r2,88
8002dfc: e0 00 00 03 bi 8002e08 <clock_gettime+0x5c>
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
8002e00: f8 00 2a ac calli 800d8b0 <__errno>
8002e04: 34 02 00 16 mvi r2,22
8002e08: 58 22 00 00 sw (r1+0),r2
8002e0c: 34 01 ff ff mvi r1,-1
return 0;
}
8002e10: 2b 9d 00 04 lw ra,(sp+4)
8002e14: 37 9c 00 04 addi sp,sp,4
8002e18: c3 a0 00 00 ret
08002e1c <clock_settime>:
int clock_settime(
clockid_t clock_id,
const struct timespec *tp
)
{
8002e1c: 37 9c ff fc addi sp,sp,-4
8002e20: 5b 9d 00 04 sw (sp+4),ra
if ( !tp )
8002e24: 44 40 00 1a be r2,r0,8002e8c <clock_settime+0x70> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
if ( clock_id == CLOCK_REALTIME ) {
8002e28: 34 03 00 01 mvi r3,1
8002e2c: 5c 23 00 11 bne r1,r3,8002e70 <clock_settime+0x54>
if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 )
8002e30: 78 04 08 01 mvhi r4,0x801
8002e34: 38 84 e4 ac ori r4,r4,0xe4ac
8002e38: 28 43 00 00 lw r3,(r2+0)
8002e3c: 28 81 00 00 lw r1,(r4+0)
8002e40: 54 61 00 02 bgu r3,r1,8002e48 <clock_settime+0x2c>
8002e44: e0 00 00 12 bi 8002e8c <clock_settime+0x70>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8002e48: 78 01 08 02 mvhi r1,0x802
8002e4c: 38 21 08 b8 ori r1,r1,0x8b8
8002e50: 28 23 00 00 lw r3,(r1+0)
8002e54: 34 63 00 01 addi r3,r3,1
8002e58: 58 23 00 00 sw (r1+0),r3
rtems_set_errno_and_return_minus_one( EINVAL );
_Thread_Disable_dispatch();
_TOD_Set( tp );
8002e5c: b8 40 08 00 mv r1,r2
8002e60: f8 00 07 13 calli 8004aac <_TOD_Set>
_Thread_Enable_dispatch();
8002e64: f8 00 0d 3d calli 8006358 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
return 0;
8002e68: 34 01 00 00 mvi r1,0
8002e6c: e0 00 00 0c bi 8002e9c <clock_settime+0x80>
_Thread_Disable_dispatch();
_TOD_Set( tp );
_Thread_Enable_dispatch();
}
#ifdef _POSIX_CPUTIME
else if ( clock_id == CLOCK_PROCESS_CPUTIME )
8002e70: 34 02 00 02 mvi r2,2
8002e74: 44 22 00 03 be r1,r2,8002e80 <clock_settime+0x64>
rtems_set_errno_and_return_minus_one( ENOSYS );
#endif
#ifdef _POSIX_THREAD_CPUTIME
else if ( clock_id == CLOCK_THREAD_CPUTIME )
8002e78: 34 02 00 03 mvi r2,3
8002e7c: 5c 22 00 04 bne r1,r2,8002e8c <clock_settime+0x70>
rtems_set_errno_and_return_minus_one( ENOSYS );
8002e80: f8 00 2a 8c calli 800d8b0 <__errno>
8002e84: 34 02 00 58 mvi r2,88
8002e88: e0 00 00 03 bi 8002e94 <clock_settime+0x78>
#endif
else
rtems_set_errno_and_return_minus_one( EINVAL );
8002e8c: f8 00 2a 89 calli 800d8b0 <__errno>
8002e90: 34 02 00 16 mvi r2,22
8002e94: 58 22 00 00 sw (r1+0),r2
8002e98: 34 01 ff ff mvi r1,-1
return 0;
}
8002e9c: 2b 9d 00 04 lw ra,(sp+4)
8002ea0: 37 9c 00 04 addi sp,sp,4
8002ea4: c3 a0 00 00 ret
080012b0 <ctermid>:
static char *ctermid_name = "/dev/console";
char *ctermid(
char *s
)
{
80012b0: 37 9c ff f8 addi sp,sp,-8 <== NOT EXECUTED
80012b4: 5b 8b 00 08 sw (sp+8),r11 <== NOT EXECUTED
80012b8: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
80012bc: 78 02 08 00 mvhi r2,0x800 <== NOT EXECUTED
80012c0: b8 20 58 00 mv r11,r1 <== NOT EXECUTED
80012c4: 38 42 fe 70 ori r2,r2,0xfe70 <== NOT EXECUTED
if ( !s )
80012c8: 44 20 00 03 be r1,r0,80012d4 <ctermid+0x24> <== NOT EXECUTED
/*
* We have no way of knowing the length of the user provided buffer.
* It may not be large enough but there is no way to know that. :(
* So this is a potential buffer owerrun that we can do nothing about.
*/
strcpy( s, ctermid_name );
80012cc: f8 00 27 fd calli 800b2c0 <strcpy> <== NOT EXECUTED
return s;
80012d0: e0 00 00 02 bi 80012d8 <ctermid+0x28> <== NOT EXECUTED
char *ctermid(
char *s
)
{
if ( !s )
return ctermid_name;
80012d4: b8 40 58 00 mv r11,r2 <== NOT EXECUTED
* It may not be large enough but there is no way to know that. :(
* So this is a potential buffer owerrun that we can do nothing about.
*/
strcpy( s, ctermid_name );
return s;
}
80012d8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80012dc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80012e0: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
80012e4: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
80012e8: c3 a0 00 00 ret <== NOT EXECUTED
080066d8 <devFS_evaluate_path>:
const char *pathname,
size_t pathnamelen,
int flags,
rtems_filesystem_location_info_t *pathloc
)
{
80066d8: 37 9c ff e0 addi sp,sp,-32
80066dc: 5b 8b 00 20 sw (sp+32),r11
80066e0: 5b 8c 00 1c sw (sp+28),r12
80066e4: 5b 8d 00 18 sw (sp+24),r13
80066e8: 5b 8e 00 14 sw (sp+20),r14
80066ec: 5b 8f 00 10 sw (sp+16),r15
80066f0: 5b 90 00 0c sw (sp+12),r16
80066f4: 5b 91 00 08 sw (sp+8),r17
80066f8: 5b 9d 00 04 sw (sp+4),ra
80066fc: b8 80 58 00 mv r11,r4
int i;
rtems_device_name_t *device_name_table;
/* see if 'flags' is valid */
if ( !rtems_libio_is_valid_perms( flags ) )
8006700: 34 04 ff f8 mvi r4,-8
8006704: a0 64 20 00 and r4,r3,r4
const char *pathname,
size_t pathnamelen,
int flags,
rtems_filesystem_location_info_t *pathloc
)
{
8006708: b8 20 88 00 mv r17,r1
800670c: b8 40 80 00 mv r16,r2
int i;
rtems_device_name_t *device_name_table;
/* see if 'flags' is valid */
if ( !rtems_libio_is_valid_perms( flags ) )
8006710: 44 80 00 04 be r4,r0,8006720 <devFS_evaluate_path+0x48> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EPERM );
8006714: f8 00 0e 66 calli 800a0ac <__errno> <== NOT EXECUTED
8006718: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
800671c: e0 00 00 28 bi 80067bc <devFS_evaluate_path+0xe4> <== NOT EXECUTED
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
8006720: 29 6c 00 00 lw r12,(r11+0)
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (i = 0; i < rtems_device_table_size; i++) {
8006724: 78 0d 08 01 mvhi r13,0x801
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
8006728: 34 0e 00 00 mvi r14,0
rtems_set_errno_and_return_minus_one( EFAULT );
for (i = 0; i < rtems_device_table_size; i++) {
800672c: 39 ad 10 14 ori r13,r13,0x1014
if ( !rtems_libio_is_valid_perms( flags ) )
rtems_set_errno_and_return_minus_one( EPERM );
/* get the device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
8006730: 5d 84 00 1f bne r12,r4,80067ac <devFS_evaluate_path+0xd4>
rtems_set_errno_and_return_minus_one( EFAULT );
8006734: f8 00 0e 5e calli 800a0ac <__errno>
8006738: 34 02 00 0e mvi r2,14
800673c: e0 00 00 20 bi 80067bc <devFS_evaluate_path+0xe4>
for (i = 0; i < rtems_device_table_size; i++) {
if (!device_name_table[i].device_name)
8006740: 29 8f 00 00 lw r15,(r12+0)
8006744: 45 e0 00 18 be r15,r0,80067a4 <devFS_evaluate_path+0xcc>
continue;
if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0)
8006748: ba 20 08 00 mv r1,r17
800674c: b9 e0 10 00 mv r2,r15
8006750: ba 00 18 00 mv r3,r16
8006754: f8 00 12 9f calli 800b1d0 <strncmp>
8006758: b8 20 20 00 mv r4,r1
800675c: 5c 20 00 12 bne r1,r0,80067a4 <devFS_evaluate_path+0xcc>
continue;
if (device_name_table[i].device_name[pathnamelen] != '\0')
8006760: b5 f0 78 00 add r15,r15,r16
8006764: 41 e1 00 00 lbu r1,(r15+0)
8006768: 5c 24 00 0f bne r1,r4,80067a4 <devFS_evaluate_path+0xcc> <== NEVER TAKEN
continue;
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
pathloc->handlers = &devFS_file_handlers;
800676c: 78 01 08 01 mvhi r1,0x801
8006770: 38 21 11 5c ori r1,r1,0x115c
8006774: 59 61 00 08 sw (r11+8),r1
pathloc->ops = &devFS_ops;
8006778: 78 01 08 01 mvhi r1,0x801
800677c: 38 21 11 14 ori r1,r1,0x1114
8006780: 59 61 00 0c sw (r11+12),r1
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
8006784: 78 01 08 01 mvhi r1,0x801
8006788: 38 21 11 a0 ori r1,r1,0x11a0
800678c: 28 21 00 00 lw r1,(r1+0)
if (device_name_table[i].device_name[pathnamelen] != '\0')
continue;
/* find the device, set proper values */
pathloc->node_access = (void *)&device_name_table[i];
8006790: 59 6c 00 00 sw (r11+0),r12
pathloc->handlers = &devFS_file_handlers;
pathloc->ops = &devFS_ops;
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
8006794: 28 21 00 28 lw r1,(r1+40)
8006798: 59 61 00 10 sw (r11+16),r1
return 0;
800679c: 34 01 00 00 mvi r1,0
80067a0: e0 00 00 09 bi 80067c4 <devFS_evaluate_path+0xec>
/* 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++) {
80067a4: 35 ce 00 01 addi r14,r14,1
80067a8: 35 8c 00 14 addi r12,r12,20
80067ac: 29 a1 00 00 lw r1,(r13+0)
80067b0: 54 2e ff e4 bgu r1,r14,8006740 <devFS_evaluate_path+0x68>
pathloc->mt_entry = rtems_filesystem_root.mt_entry;
return 0;
}
/* no such file or directory */
rtems_set_errno_and_return_minus_one( ENOENT );
80067b4: f8 00 0e 3e calli 800a0ac <__errno>
80067b8: 34 02 00 02 mvi r2,2
80067bc: 58 22 00 00 sw (r1+0),r2
80067c0: 34 01 ff ff mvi r1,-1
}
80067c4: 2b 9d 00 04 lw ra,(sp+4)
80067c8: 2b 8b 00 20 lw r11,(sp+32)
80067cc: 2b 8c 00 1c lw r12,(sp+28)
80067d0: 2b 8d 00 18 lw r13,(sp+24)
80067d4: 2b 8e 00 14 lw r14,(sp+20)
80067d8: 2b 8f 00 10 lw r15,(sp+16)
80067dc: 2b 90 00 0c lw r16,(sp+12)
80067e0: 2b 91 00 08 lw r17,(sp+8)
80067e4: 37 9c 00 20 addi sp,sp,32
80067e8: c3 a0 00 00 ret
080009d8 <devFS_mknod>:
const char *path,
mode_t mode,
dev_t dev,
rtems_filesystem_location_info_t *pathloc
)
{
80009d8: 37 9c ff d8 addi sp,sp,-40
80009dc: 5b 8b 00 28 sw (sp+40),r11
80009e0: 5b 8c 00 24 sw (sp+36),r12
80009e4: 5b 8d 00 20 sw (sp+32),r13
80009e8: 5b 8e 00 1c sw (sp+28),r14
80009ec: 5b 8f 00 18 sw (sp+24),r15
80009f0: 5b 90 00 14 sw (sp+20),r16
80009f4: 5b 91 00 10 sw (sp+16),r17
80009f8: 5b 92 00 0c sw (sp+12),r18
80009fc: 5b 93 00 08 sw (sp+8),r19
8000a00: 5b 9d 00 04 sw (sp+4),ra
8000a04: b8 40 88 00 mv r17,r2
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
8000a08: 40 22 00 00 lbu r2,(r1+0)
const char *path,
mode_t mode,
dev_t dev,
rtems_filesystem_location_info_t *pathloc
)
{
8000a0c: b8 20 58 00 mv r11,r1
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
8000a10: 34 01 00 64 mvi r1,100
const char *path,
mode_t mode,
dev_t dev,
rtems_filesystem_location_info_t *pathloc
)
{
8000a14: b8 60 98 00 mv r19,r3
8000a18: b8 80 90 00 mv r18,r4
* condition and do not create the '/dev' and the 'path'
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
8000a1c: 5c 41 00 0a bne r2,r1,8000a44 <devFS_mknod+0x6c>
8000a20: 41 62 00 01 lbu r2,(r11+1)
8000a24: 34 01 00 65 mvi r1,101
8000a28: 5c 41 00 07 bne r2,r1,8000a44 <devFS_mknod+0x6c> <== NEVER TAKEN
8000a2c: 41 62 00 02 lbu r2,(r11+2)
8000a30: 34 01 00 76 mvi r1,118
8000a34: 5c 41 00 04 bne r2,r1,8000a44 <devFS_mknod+0x6c> <== NEVER TAKEN
(path[2] == 'v') && (path[3] == '\0'))
8000a38: 41 62 00 03 lbu r2,(r11+3)
return 0;
8000a3c: 34 01 00 00 mvi r1,0
* actually passed in is 'dev', not '/dev'. Just return 0 to
* indicate we are OK.
*/
if ((path[0] == 'd') && (path[1] == 'e') &&
(path[2] == 'v') && (path[3] == '\0'))
8000a40: 44 40 00 3d be r2,r0,8000b34 <devFS_mknod+0x15c>
return 0;
/* must be a character device or a block device */
if (!S_ISBLK(mode) && !S_ISCHR(mode))
8000a44: 22 22 f0 00 andi r2,r17,0xf000
8000a48: 7c 41 20 00 cmpnei r1,r2,8192
8000a4c: 7c 42 60 00 cmpnei r2,r2,24576
8000a50: a0 22 08 00 and r1,r1,r2
8000a54: 44 20 00 04 be r1,r0,8000a64 <devFS_mknod+0x8c>
rtems_set_errno_and_return_minus_one( EINVAL );
8000a58: f8 00 25 95 calli 800a0ac <__errno>
8000a5c: 34 02 00 16 mvi r2,22
8000a60: e0 00 00 0b bi 8000a8c <devFS_mknod+0xb4>
else
rtems_filesystem_split_dev_t(dev, major, minor);
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
8000a64: 28 af 00 00 lw r15,(r5+0)
if (!device_name_table)
8000a68: 45 e1 00 07 be r15,r1,8000a84 <devFS_mknod+0xac>
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
8000a6c: 78 0d 08 01 mvhi r13,0x801
else
rtems_filesystem_split_dev_t(dev, major, minor);
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
8000a70: b9 e0 80 00 mv r16,r15
8000a74: 34 0c ff ff mvi r12,-1
8000a78: 34 0e 00 00 mvi r14,0
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
8000a7c: 39 ad 10 14 ori r13,r13,0x1014
8000a80: e0 00 00 11 bi 8000ac4 <devFS_mknod+0xec>
rtems_filesystem_split_dev_t(dev, major, minor);
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
8000a84: f8 00 25 8a calli 800a0ac <__errno>
8000a88: 34 02 00 0e mvi r2,14
8000a8c: 58 22 00 00 sw (r1+0),r2
8000a90: 34 01 ff ff mvi r1,-1
8000a94: e0 00 00 28 bi 8000b34 <devFS_mknod+0x15c>
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
if (device_name_table[i].device_name == NULL)
8000a98: 2a 02 00 00 lw r2,(r16+0)
8000a9c: 44 40 00 07 be r2,r0,8000ab8 <devFS_mknod+0xe0>
slot = i;
else
if (strcmp(path, device_name_table[i].device_name) == 0)
8000aa0: b9 60 08 00 mv r1,r11
8000aa4: f8 00 29 6c calli 800b054 <strcmp>
8000aa8: 5c 20 00 05 bne r1,r0,8000abc <devFS_mknod+0xe4>
rtems_set_errno_and_return_minus_one( EEXIST );
8000aac: f8 00 25 80 calli 800a0ac <__errno>
8000ab0: 34 02 00 11 mvi r2,17
8000ab4: e3 ff ff f6 bi 8000a8c <devFS_mknod+0xb4>
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
if (device_name_table[i].device_name == NULL)
slot = i;
8000ab8: b9 c0 60 00 mv r12,r14
/* Find an empty slot in device name table */
device_name_table = (rtems_device_name_t *)pathloc->node_access;
if (!device_name_table)
rtems_set_errno_and_return_minus_one( EFAULT );
for (slot = -1, i = 0; i < rtems_device_table_size; i++){
8000abc: 35 ce 00 01 addi r14,r14,1
8000ac0: 36 10 00 14 addi r16,r16,20
8000ac4: 29 a1 00 00 lw r1,(r13+0)
8000ac8: 54 2e ff f4 bgu r1,r14,8000a98 <devFS_mknod+0xc0>
else
if (strcmp(path, device_name_table[i].device_name) == 0)
rtems_set_errno_and_return_minus_one( EEXIST );
}
if (slot == -1)
8000acc: 34 01 ff ff mvi r1,-1
8000ad0: 5d 81 00 04 bne r12,r1,8000ae0 <devFS_mknod+0x108>
rtems_set_errno_and_return_minus_one( ENOMEM );
8000ad4: f8 00 25 76 calli 800a0ac <__errno>
8000ad8: 34 02 00 0c mvi r2,12
8000adc: e3 ff ff ec bi 8000a8c <devFS_mknod+0xb4>
_ISR_Disable(level);
8000ae0: 90 00 68 00 rcsr r13,IE
8000ae4: 34 01 ff fe mvi r1,-2
8000ae8: a1 a1 08 00 and r1,r13,r1
8000aec: d0 01 00 00 wcsr IE,r1
device_name_table[slot].device_name = (char *)path;
8000af0: 34 02 00 02 mvi r2,2
8000af4: b9 80 08 00 mv r1,r12
8000af8: f8 00 37 97 calli 800e954 <__ashlsi3>
8000afc: 34 02 00 02 mvi r2,2
8000b00: b8 20 60 00 mv r12,r1
8000b04: f8 00 37 94 calli 800e954 <__ashlsi3>
8000b08: b5 81 08 00 add r1,r12,r1
8000b0c: b5 e1 60 00 add r12,r15,r1
8000b10: 59 8b 00 00 sw (r12+0),r11
device_name_table[slot].device_name_length = strlen(path);
8000b14: b9 60 08 00 mv r1,r11
8000b18: f8 00 29 7f calli 800b114 <strlen>
8000b1c: 59 81 00 04 sw (r12+4),r1
device_name_table[slot].major = major;
8000b20: 59 93 00 08 sw (r12+8),r19
device_name_table[slot].minor = minor;
8000b24: 59 92 00 0c sw (r12+12),r18
device_name_table[slot].mode = mode;
8000b28: 59 91 00 10 sw (r12+16),r17
_ISR_Enable(level);
8000b2c: d0 0d 00 00 wcsr IE,r13
return 0;
8000b30: 34 01 00 00 mvi r1,0
}
8000b34: 2b 9d 00 04 lw ra,(sp+4)
8000b38: 2b 8b 00 28 lw r11,(sp+40)
8000b3c: 2b 8c 00 24 lw r12,(sp+36)
8000b40: 2b 8d 00 20 lw r13,(sp+32)
8000b44: 2b 8e 00 1c lw r14,(sp+28)
8000b48: 2b 8f 00 18 lw r15,(sp+24)
8000b4c: 2b 90 00 14 lw r16,(sp+20)
8000b50: 2b 91 00 10 lw r17,(sp+16)
8000b54: 2b 92 00 0c lw r18,(sp+12)
8000b58: 2b 93 00 08 lw r19,(sp+8)
8000b5c: 37 9c 00 28 addi sp,sp,40
8000b60: c3 a0 00 00 ret
08004884 <drainOutput>:
/*
* Drain output queue
*/
static void
drainOutput (struct rtems_termios_tty *tty)
{
8004884: 37 9c ff f0 addi sp,sp,-16
8004888: 5b 8b 00 10 sw (sp+16),r11
800488c: 5b 8c 00 0c sw (sp+12),r12
8004890: 5b 8d 00 08 sw (sp+8),r13
8004894: 5b 9d 00 04 sw (sp+4),ra
8004898: b8 20 58 00 mv r11,r1
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
800489c: 28 21 00 b4 lw r1,(r1+180)
80048a0: 44 20 00 17 be r1,r0,80048fc <drainOutput+0x78>
rtems_interrupt_disable (level);
80048a4: 90 00 08 00 rcsr r1,IE
80048a8: 34 02 ff fe mvi r2,-2
80048ac: a0 22 10 00 and r2,r1,r2
80048b0: d0 02 00 00 wcsr IE,r2
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
tty->rawOutBufState = rob_wait;
80048b4: 34 0d 00 02 mvi r13,2
rtems_interrupt_enable (level);
sc = rtems_semaphore_obtain(
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
80048b8: 34 0c ff fe mvi r12,-2
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
rtems_interrupt_disable (level);
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
80048bc: e0 00 00 0c bi 80048ec <drainOutput+0x68>
tty->rawOutBufState = rob_wait;
80048c0: 59 6d 00 94 sw (r11+148),r13
rtems_interrupt_enable (level);
80048c4: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
sc = rtems_semaphore_obtain(
80048c8: 29 61 00 8c lw r1,(r11+140) <== NOT EXECUTED
80048cc: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
80048d0: 34 03 00 00 mvi r3,0 <== NOT EXECUTED
80048d4: f8 00 0a 0d calli 8007108 <rtems_semaphore_obtain> <== NOT EXECUTED
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
80048d8: 44 20 00 02 be r1,r0,80048e0 <drainOutput+0x5c> <== NOT EXECUTED
rtems_fatal_error_occurred (sc);
80048dc: f8 00 0b ee calli 8007894 <rtems_fatal_error_occurred> <== NOT EXECUTED
rtems_interrupt_disable (level);
80048e0: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED
80048e4: a0 2c 10 00 and r2,r1,r12 <== NOT EXECUTED
80048e8: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
rtems_interrupt_disable (level);
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
80048ec: 29 63 00 84 lw r3,(r11+132)
80048f0: 29 62 00 80 lw r2,(r11+128)
80048f4: 5c 62 ff f3 bne r3,r2,80048c0 <drainOutput+0x3c> <== NEVER TAKEN
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
rtems_interrupt_enable (level);
80048f8: d0 01 00 00 wcsr IE,r1
}
}
80048fc: 2b 9d 00 04 lw ra,(sp+4)
8004900: 2b 8b 00 10 lw r11,(sp+16)
8004904: 2b 8c 00 0c lw r12,(sp+12)
8004908: 2b 8d 00 08 lw r13,(sp+8)
800490c: 37 9c 00 10 addi sp,sp,16
8004910: c3 a0 00 00 ret
08005654 <echo>:
/*
* Echo a typed character
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
8005654: 37 9c ff f4 addi sp,sp,-12
8005658: 5b 8b 00 08 sw (sp+8),r11
800565c: 5b 9d 00 04 sw (sp+4),ra
8005660: b8 40 58 00 mv r11,r2
if ((tty->termios.c_lflag & ECHOCTL) &&
8005664: 28 42 00 3c lw r2,(r2+60)
8005668: 20 42 02 00 andi r2,r2,0x200
800566c: 44 40 00 19 be r2,r0,80056d0 <echo+0x7c> <== NEVER TAKEN
iscntrl(c) && (c != '\t') && (c != '\n')) {
8005670: 78 02 08 02 mvhi r2,0x802
8005674: 38 42 34 10 ori r2,r2,0x3410
8005678: 28 42 00 00 lw r2,(r2+0)
800567c: 7c 23 00 09 cmpnei r3,r1,9
8005680: b4 41 10 00 add r2,r2,r1
8005684: 40 42 00 01 lbu r2,(r2+1)
8005688: 20 42 00 20 andi r2,r2,0x20
* Echo a typed character
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
if ((tty->termios.c_lflag & ECHOCTL) &&
800568c: 7c 42 00 00 cmpnei r2,r2,0
iscntrl(c) && (c != '\t') && (c != '\n')) {
8005690: a0 43 10 00 and r2,r2,r3
8005694: 44 40 00 0f be r2,r0,80056d0 <echo+0x7c>
8005698: 34 02 00 0a mvi r2,10
800569c: 44 22 00 0d be r1,r2,80056d0 <echo+0x7c>
char echobuf[2];
echobuf[0] = '^';
80056a0: 34 02 00 5e mvi r2,94
echobuf[1] = c ^ 0x40;
80056a4: 18 21 00 40 xori r1,r1,0x40
{
if ((tty->termios.c_lflag & ECHOCTL) &&
iscntrl(c) && (c != '\t') && (c != '\n')) {
char echobuf[2];
echobuf[0] = '^';
80056a8: 33 82 00 0c sb (sp+12),r2
echobuf[1] = c ^ 0x40;
80056ac: 33 81 00 0d sb (sp+13),r1
rtems_termios_puts (echobuf, 2, tty);
80056b0: 34 02 00 02 mvi r2,2
80056b4: 37 81 00 0c addi r1,sp,12
80056b8: b9 60 18 00 mv r3,r11
80056bc: fb ff ff 34 calli 800538c <rtems_termios_puts>
tty->column += 2;
80056c0: 29 61 00 28 lw r1,(r11+40)
80056c4: 34 21 00 02 addi r1,r1,2
80056c8: 59 61 00 28 sw (r11+40),r1
*/
static void
echo (unsigned char c, struct rtems_termios_tty *tty)
{
if ((tty->termios.c_lflag & ECHOCTL) &&
iscntrl(c) && (c != '\t') && (c != '\n')) {
80056cc: e0 00 00 03 bi 80056d8 <echo+0x84>
echobuf[0] = '^';
echobuf[1] = c ^ 0x40;
rtems_termios_puts (echobuf, 2, tty);
tty->column += 2;
} else {
oproc (c, tty);
80056d0: b9 60 10 00 mv r2,r11
80056d4: fb ff ff 84 calli 80054e4 <oproc>
}
}
80056d8: 2b 9d 00 04 lw ra,(sp+4)
80056dc: 2b 8b 00 08 lw r11,(sp+8)
80056e0: 37 9c 00 0c addi sp,sp,12
80056e4: c3 a0 00 00 ret
08002690 <endgrent>:
void endgrent(void)
{
8002690: 37 9c ff fc addi sp,sp,-4
8002694: 5b 9d 00 04 sw (sp+4),ra
if (group_fp != NULL)
8002698: 78 01 08 01 mvhi r1,0x801
800269c: 38 21 66 b4 ori r1,r1,0x66b4
80026a0: 28 21 00 00 lw r1,(r1+0)
80026a4: 44 20 00 02 be r1,r0,80026ac <endgrent+0x1c> <== NEVER TAKEN
fclose(group_fp);
80026a8: f8 00 2c a0 calli 800d928 <fclose>
}
80026ac: 2b 9d 00 04 lw ra,(sp+4)
80026b0: 37 9c 00 04 addi sp,sp,4
80026b4: c3 a0 00 00 ret
080024c8 <endpwent>:
void endpwent(void)
{
80024c8: 37 9c ff fc addi sp,sp,-4
80024cc: 5b 9d 00 04 sw (sp+4),ra
if (passwd_fp != NULL)
80024d0: 78 01 08 01 mvhi r1,0x801
80024d4: 38 21 67 90 ori r1,r1,0x6790
80024d8: 28 21 00 00 lw r1,(r1+0)
80024dc: 44 20 00 02 be r1,r0,80024e4 <endpwent+0x1c> <== NEVER TAKEN
fclose(passwd_fp);
80024e0: f8 00 2d 12 calli 800d928 <fclose>
}
80024e4: 2b 9d 00 04 lw ra,(sp+4)
80024e8: 37 9c 00 04 addi sp,sp,4
80024ec: c3 a0 00 00 ret
080056e8 <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)
{
80056e8: 37 9c ff e0 addi sp,sp,-32
80056ec: 5b 8b 00 20 sw (sp+32),r11
80056f0: 5b 8c 00 1c sw (sp+28),r12
80056f4: 5b 8d 00 18 sw (sp+24),r13
80056f8: 5b 8e 00 14 sw (sp+20),r14
80056fc: 5b 8f 00 10 sw (sp+16),r15
8005700: 5b 90 00 0c sw (sp+12),r16
8005704: 5b 91 00 08 sw (sp+8),r17
8005708: 5b 9d 00 04 sw (sp+4),ra
800570c: b8 20 58 00 mv r11,r1
if (tty->ccount == 0)
8005710: 28 21 00 20 lw r1,(r1+32)
* FIXME: Needs support for WERASE and ECHOPRT.
* FIXME: Some of the tests should check for IEXTEN, too.
*/
static void
erase (struct rtems_termios_tty *tty, int lineFlag)
{
8005714: b8 40 78 00 mv r15,r2
if (tty->ccount == 0)
8005718: 44 20 00 6c be r1,r0,80058c8 <erase+0x1e0>
return;
if (lineFlag) {
800571c: 44 40 00 62 be r2,r0,80058a4 <erase+0x1bc>
if (!(tty->termios.c_lflag & ECHO)) {
8005720: 29 6c 00 3c lw r12,(r11+60)
8005724: 21 81 00 08 andi r1,r12,0x8
8005728: 5c 20 00 03 bne r1,r0,8005734 <erase+0x4c> <== ALWAYS TAKEN
tty->ccount = 0;
800572c: 59 60 00 20 sw (r11+32),r0 <== NOT EXECUTED
return;
8005730: e0 00 00 66 bi 80058c8 <erase+0x1e0> <== NOT EXECUTED
}
if (!(tty->termios.c_lflag & ECHOE)) {
8005734: 21 8c 00 10 andi r12,r12,0x10
8005738: 5d 80 00 5b bne r12,r0,80058a4 <erase+0x1bc> <== ALWAYS TAKEN
tty->ccount = 0;
echo (tty->termios.c_cc[VKILL], tty);
800573c: 41 61 00 44 lbu r1,(r11+68) <== NOT EXECUTED
if (!(tty->termios.c_lflag & ECHO)) {
tty->ccount = 0;
return;
}
if (!(tty->termios.c_lflag & ECHOE)) {
tty->ccount = 0;
8005740: 59 60 00 20 sw (r11+32),r0 <== NOT EXECUTED
echo (tty->termios.c_cc[VKILL], tty);
8005744: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8005748: fb ff ff c3 calli 8005654 <echo> <== NOT EXECUTED
if (tty->termios.c_lflag & ECHOK)
800574c: 29 61 00 3c lw r1,(r11+60) <== NOT EXECUTED
8005750: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED
8005754: 44 2c 00 5d be r1,r12,80058c8 <erase+0x1e0> <== NOT EXECUTED
echo ('\n', tty);
8005758: 34 01 00 0a mvi r1,10 <== NOT EXECUTED
800575c: e0 00 00 0d bi 8005790 <erase+0xa8> <== NOT EXECUTED
return;
}
}
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
8005760: 29 64 00 1c lw r4,(r11+28)
8005764: 34 21 ff ff addi r1,r1,-1
8005768: 59 61 00 20 sw (r11+32),r1
800576c: b4 81 10 00 add r2,r4,r1
8005770: 40 4c 00 00 lbu r12,(r2+0)
if (tty->termios.c_lflag & ECHO) {
8005774: 29 62 00 3c lw r2,(r11+60)
8005778: 20 43 00 08 andi r3,r2,0x8
800577c: 44 60 00 48 be r3,r0,800589c <erase+0x1b4> <== NEVER TAKEN
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
8005780: 5d e0 00 07 bne r15,r0,800579c <erase+0xb4>
8005784: 20 43 00 10 andi r3,r2,0x10
8005788: 5c 6f 00 05 bne r3,r15,800579c <erase+0xb4> <== ALWAYS TAKEN
echo (tty->termios.c_cc[VERASE], tty);
800578c: 41 61 00 43 lbu r1,(r11+67) <== NOT EXECUTED
8005790: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8005794: fb ff ff b0 calli 8005654 <echo> <== NOT EXECUTED
8005798: e0 00 00 4c bi 80058c8 <erase+0x1e0> <== NOT EXECUTED
} else if (c == '\t') {
800579c: 5d 91 00 20 bne r12,r17,800581c <erase+0x134>
int col = tty->read_start_column;
80057a0: 29 6c 00 2c lw r12,(r11+44)
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
80057a4: 29 a6 00 00 lw r6,(r13+0)
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
int col = tty->read_start_column;
int i = 0;
80057a8: 34 03 00 00 mvi r3,0
while (i != tty->ccount) {
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
if (tty->termios.c_lflag & ECHOCTL)
80057ac: 20 42 02 00 andi r2,r2,0x200
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
80057b0: e0 00 00 0f bi 80057ec <erase+0x104>
* Erase a character or line
* FIXME: Needs support for WERASE and ECHOPRT.
* FIXME: Some of the tests should check for IEXTEN, too.
*/
static void
erase (struct rtems_termios_tty *tty, int lineFlag)
80057b4: b4 83 28 00 add r5,r4,r3
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
80057b8: 40 a5 00 00 lbu r5,(r5+0)
80057bc: 34 63 00 01 addi r3,r3,1
if (c == '\t') {
80057c0: 5c b1 00 03 bne r5,r17,80057cc <erase+0xe4>
col = (col | 7) + 1;
80057c4: 39 8c 00 07 ori r12,r12,0x7
80057c8: e0 00 00 08 bi 80057e8 <erase+0x100>
} else if (iscntrl (c)) {
80057cc: b4 c5 28 00 add r5,r6,r5
80057d0: 40 a5 00 01 lbu r5,(r5+1)
80057d4: 20 a5 00 20 andi r5,r5,0x20
80057d8: 44 a0 00 04 be r5,r0,80057e8 <erase+0x100> <== ALWAYS TAKEN
if (tty->termios.c_lflag & ECHOCTL)
80057dc: 44 40 00 04 be r2,r0,80057ec <erase+0x104> <== NOT EXECUTED
col += 2;
80057e0: 35 8c 00 02 addi r12,r12,2 <== NOT EXECUTED
80057e4: e0 00 00 02 bi 80057ec <erase+0x104> <== NOT EXECUTED
} else {
col++;
80057e8: 35 8c 00 01 addi r12,r12,1
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
80057ec: 5c 61 ff f2 bne r3,r1,80057b4 <erase+0xcc>
80057f0: e0 00 00 08 bi 8005810 <erase+0x128>
/*
* Back up over the tab
*/
while (tty->column > col) {
rtems_termios_puts ("\b", 1, tty);
80057f4: ba 00 08 00 mv r1,r16
80057f8: 34 02 00 01 mvi r2,1
80057fc: b9 60 18 00 mv r3,r11
8005800: fb ff fe e3 calli 800538c <rtems_termios_puts>
tty->column--;
8005804: 29 61 00 28 lw r1,(r11+40)
8005808: 34 21 ff ff addi r1,r1,-1
800580c: 59 61 00 28 sw (r11+40),r1
}
/*
* Back up over the tab
*/
while (tty->column > col) {
8005810: 29 61 00 28 lw r1,(r11+40)
8005814: 48 2c ff f8 bg r1,r12,80057f4 <erase+0x10c>
8005818: e0 00 00 21 bi 800589c <erase+0x1b4>
rtems_termios_puts ("\b", 1, tty);
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
800581c: 29 a1 00 00 lw r1,(r13+0)
8005820: 35 8c 00 01 addi r12,r12,1
8005824: b4 2c 08 00 add r1,r1,r12
8005828: 40 21 00 00 lbu r1,(r1+0)
800582c: 20 21 00 20 andi r1,r1,0x20
8005830: 44 20 00 0b be r1,r0,800585c <erase+0x174> <== ALWAYS TAKEN
8005834: 20 42 02 00 andi r2,r2,0x200 <== NOT EXECUTED
8005838: 44 40 00 09 be r2,r0,800585c <erase+0x174> <== NOT EXECUTED
rtems_termios_puts ("\b \b", 3, tty);
800583c: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED
8005840: 34 02 00 03 mvi r2,3 <== NOT EXECUTED
8005844: b9 60 18 00 mv r3,r11 <== NOT EXECUTED
8005848: fb ff fe d1 calli 800538c <rtems_termios_puts> <== NOT EXECUTED
if (tty->column)
800584c: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED
8005850: 44 20 00 03 be r1,r0,800585c <erase+0x174> <== NOT EXECUTED
tty->column--;
8005854: 34 21 ff ff addi r1,r1,-1 <== NOT EXECUTED
8005858: 59 61 00 28 sw (r11+40),r1 <== NOT EXECUTED
}
if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) {
800585c: 29 a1 00 00 lw r1,(r13+0)
8005860: b4 2c 60 00 add r12,r1,r12
8005864: 41 81 00 00 lbu r1,(r12+0)
8005868: 20 21 00 20 andi r1,r1,0x20
800586c: 44 20 00 04 be r1,r0,800587c <erase+0x194> <== ALWAYS TAKEN
8005870: 29 61 00 3c lw r1,(r11+60) <== NOT EXECUTED
8005874: 20 21 02 00 andi r1,r1,0x200 <== NOT EXECUTED
8005878: 44 20 00 09 be r1,r0,800589c <erase+0x1b4> <== NOT EXECUTED
rtems_termios_puts ("\b \b", 3, tty);
800587c: b9 c0 08 00 mv r1,r14
8005880: 34 02 00 03 mvi r2,3
8005884: b9 60 18 00 mv r3,r11
8005888: fb ff fe c1 calli 800538c <rtems_termios_puts>
if (tty->column)
800588c: 29 61 00 28 lw r1,(r11+40)
8005890: 44 20 00 03 be r1,r0,800589c <erase+0x1b4> <== NEVER TAKEN
tty->column--;
8005894: 34 21 ff ff addi r1,r1,-1
8005898: 59 61 00 28 sw (r11+40),r1
}
}
}
if (!lineFlag)
800589c: 5d e0 00 09 bne r15,r0,80058c0 <erase+0x1d8>
80058a0: e0 00 00 0a bi 80058c8 <erase+0x1e0>
80058a4: 78 0d 08 02 mvhi r13,0x802
rtems_termios_puts ("\b \b", 3, tty);
if (tty->column)
tty->column--;
}
if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) {
rtems_termios_puts ("\b \b", 3, tty);
80058a8: 78 0e 08 02 mvhi r14,0x802
/*
* Back up over the tab
*/
while (tty->column > col) {
rtems_termios_puts ("\b", 1, tty);
80058ac: 78 10 08 02 mvhi r16,0x802
unsigned char c = tty->cbuf[--tty->ccount];
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
} else if (c == '\t') {
80058b0: 34 11 00 09 mvi r17,9
80058b4: 39 ad 34 10 ori r13,r13,0x3410
rtems_termios_puts ("\b \b", 3, tty);
if (tty->column)
tty->column--;
}
if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) {
rtems_termios_puts ("\b \b", 3, tty);
80058b8: 39 ce 0f 60 ori r14,r14,0xf60
/*
* Back up over the tab
*/
while (tty->column > col) {
rtems_termios_puts ("\b", 1, tty);
80058bc: 3a 10 0f 5c ori r16,r16,0xf5c
echo ('\n', tty);
return;
}
}
while (tty->ccount) {
80058c0: 29 61 00 20 lw r1,(r11+32)
80058c4: 5c 20 ff a7 bne r1,r0,8005760 <erase+0x78>
}
}
if (!lineFlag)
break;
}
}
80058c8: 2b 9d 00 04 lw ra,(sp+4)
80058cc: 2b 8b 00 20 lw r11,(sp+32)
80058d0: 2b 8c 00 1c lw r12,(sp+28)
80058d4: 2b 8d 00 18 lw r13,(sp+24)
80058d8: 2b 8e 00 14 lw r14,(sp+20)
80058dc: 2b 8f 00 10 lw r15,(sp+16)
80058e0: 2b 90 00 0c lw r16,(sp+12)
80058e4: 2b 91 00 08 lw r17,(sp+8)
80058e8: 37 9c 00 20 addi sp,sp,32
80058ec: c3 a0 00 00 ret
08001e44 <fcntl>:
int fcntl(
int fd,
int cmd,
...
)
{
8001e44: 37 9c ff c4 addi sp,sp,-60
8001e48: 5b 8b 00 20 sw (sp+32),r11
8001e4c: 5b 8c 00 1c sw (sp+28),r12
8001e50: 5b 8d 00 18 sw (sp+24),r13
8001e54: 5b 8e 00 14 sw (sp+20),r14
8001e58: 5b 8f 00 10 sw (sp+16),r15
8001e5c: 5b 90 00 0c sw (sp+12),r16
8001e60: 5b 91 00 08 sw (sp+8),r17
8001e64: 5b 9d 00 04 sw (sp+4),ra
8001e68: 5b 82 00 24 sw (sp+36),r2
8001e6c: b8 40 68 00 mv r13,r2
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
8001e70: 78 02 08 01 mvhi r2,0x801
int fcntl(
int fd,
int cmd,
...
)
{
8001e74: 5b 83 00 28 sw (sp+40),r3
8001e78: 5b 84 00 2c sw (sp+44),r4
8001e7c: 5b 85 00 30 sw (sp+48),r5
8001e80: 5b 86 00 34 sw (sp+52),r6
8001e84: 5b 87 00 38 sw (sp+56),r7
8001e88: 5b 88 00 3c sw (sp+60),r8
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
8001e8c: 38 42 60 10 ori r2,r2,0x6010
8001e90: 28 51 00 00 lw r17,(r2+0)
...
)
{
int ret;
va_list ap;
va_start( ap, cmd );
8001e94: 37 8e 00 28 addi r14,sp,40
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
8001e98: 56 21 00 02 bgu r17,r1,8001ea0 <fcntl+0x5c>
8001e9c: e0 00 00 0a bi 8001ec4 <fcntl+0x80>
iop = rtems_libio_iop( fd );
8001ea0: 78 02 08 01 mvhi r2,0x801
8001ea4: 38 42 67 2c ori r2,r2,0x672c
8001ea8: 28 50 00 00 lw r16,(r2+0)
8001eac: 34 02 00 06 mvi r2,6
8001eb0: f8 00 46 78 calli 8013890 <__ashlsi3>
8001eb4: b6 01 58 00 add r11,r16,r1
rtems_libio_check_is_open(iop);
8001eb8: 29 6c 00 18 lw r12,(r11+24)
8001ebc: 21 81 01 00 andi r1,r12,0x100
8001ec0: 5c 20 00 04 bne r1,r0,8001ed0 <fcntl+0x8c>
8001ec4: f8 00 2e 8f calli 800d900 <__errno>
8001ec8: 34 02 00 09 mvi r2,9
8001ecc: e0 00 00 49 bi 8001ff0 <fcntl+0x1ac>
/*
* This switch should contain all the cases from POSIX.
*/
switch ( cmd ) {
8001ed0: 34 01 00 09 mvi r1,9
8001ed4: 55 a1 00 45 bgu r13,r1,8001fe8 <fcntl+0x1a4>
8001ed8: 78 0f 08 01 mvhi r15,0x801
8001edc: b9 a0 08 00 mv r1,r13
8001ee0: 34 02 00 02 mvi r2,2
8001ee4: f8 00 46 6b calli 8013890 <__ashlsi3>
8001ee8: 39 ef 4a e8 ori r15,r15,0x4ae8
8001eec: b5 e1 08 00 add r1,r15,r1
8001ef0: 28 21 00 00 lw r1,(r1+0)
8001ef4: c0 20 00 00 b r1
case F_DUPFD: /* dup */
fd2 = va_arg( ap, int );
8001ef8: 29 cc 00 00 lw r12,(r14+0)
if ( fd2 )
8001efc: 45 80 00 08 be r12,r0,8001f1c <fcntl+0xd8>
diop = rtems_libio_iop( fd2 );
8001f00: 34 03 00 00 mvi r3,0
8001f04: 51 91 00 09 bgeu r12,r17,8001f28 <fcntl+0xe4> <== NEVER TAKEN
8001f08: b9 80 08 00 mv r1,r12
8001f0c: 34 02 00 06 mvi r2,6
8001f10: f8 00 46 60 calli 8013890 <__ashlsi3>
8001f14: b6 01 18 00 add r3,r16,r1
8001f18: e0 00 00 04 bi 8001f28 <fcntl+0xe4>
else {
/* allocate a file control block */
diop = rtems_libio_allocate();
8001f1c: f8 00 01 e6 calli 80026b4 <rtems_libio_allocate>
8001f20: b8 20 18 00 mv r3,r1
if ( diop == 0 ) {
8001f24: 44 2c 00 3e be r1,r12,800201c <fcntl+0x1d8> <== NEVER TAKEN
ret = -1;
break;
}
}
diop->flags = iop->flags;
8001f28: 29 61 00 18 lw r1,(r11+24)
diop->pathinfo = iop->pathinfo;
8001f2c: 29 62 00 28 lw r2,(r11+40)
8001f30: 29 66 00 1c lw r6,(r11+28)
ret = -1;
break;
}
}
diop->flags = iop->flags;
8001f34: 58 61 00 18 sw (r3+24),r1
diop->pathinfo = iop->pathinfo;
8001f38: 29 61 00 2c lw r1,(r11+44)
8001f3c: 29 65 00 20 lw r5,(r11+32)
8001f40: 29 64 00 24 lw r4,(r11+36)
8001f44: 58 61 00 2c sw (r3+44),r1
ret = (int) (diop - rtems_libio_iops);
8001f48: 78 01 08 01 mvhi r1,0x801
8001f4c: 38 21 67 2c ori r1,r1,0x672c
8001f50: 28 21 00 00 lw r1,(r1+0)
break;
}
}
diop->flags = iop->flags;
diop->pathinfo = iop->pathinfo;
8001f54: 58 62 00 28 sw (r3+40),r2
8001f58: 58 66 00 1c sw (r3+28),r6
8001f5c: 58 65 00 20 sw (r3+32),r5
8001f60: 58 64 00 24 sw (r3+36),r4
ret = (int) (diop - rtems_libio_iops);
8001f64: c8 61 08 00 sub r1,r3,r1
8001f68: 34 02 00 06 mvi r2,6
8001f6c: f8 00 46 70 calli 801392c <__ashrsi3>
8001f70: e0 00 00 0e bi 8001fa8 <fcntl+0x164>
break;
case F_GETFD: /* get f_flags */
ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0);
8001f74: 21 8c 08 00 andi r12,r12,0x800
8001f78: 7d 8c 00 00 cmpnei r12,r12,0
8001f7c: e0 00 00 1f bi 8001ff8 <fcntl+0x1b4>
* if a new process is exec()'ed. Since RTEMS does not support
* processes, then we can ignore this one except to make
* F_GETFD work.
*/
if ( va_arg( ap, int ) )
8001f80: 29 c1 00 00 lw r1,(r14+0)
8001f84: 44 20 00 03 be r1,r0,8001f90 <fcntl+0x14c>
iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC;
8001f88: 39 8c 08 00 ori r12,r12,0x800
8001f8c: e0 00 00 03 bi 8001f98 <fcntl+0x154>
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
8001f90: 34 01 f7 ff mvi r1,-2049
8001f94: a1 81 60 00 and r12,r12,r1
8001f98: 59 6c 00 18 sw (r11+24),r12
8001f9c: e0 00 00 0e bi 8001fd4 <fcntl+0x190>
break;
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
8001fa0: b9 80 08 00 mv r1,r12
8001fa4: f8 00 01 b0 calli 8002664 <rtems_libio_to_fcntl_flags>
8001fa8: b8 20 60 00 mv r12,r1
/*
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
8001fac: 48 01 00 1d bg r0,r1,8002020 <fcntl+0x1dc> <== NEVER TAKEN
8001fb0: e0 00 00 12 bi 8001ff8 <fcntl+0x1b4>
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
break;
case F_SETFL:
flags = rtems_libio_fcntl_flags( va_arg( ap, int ) );
8001fb4: 29 c1 00 00 lw r1,(r14+0)
8001fb8: f8 00 01 95 calli 800260c <rtems_libio_fcntl_flags>
/*
* XXX If we are turning on append, should we seek to the end?
*/
iop->flags = (iop->flags & ~mask) | (flags & mask);
8001fbc: 29 63 00 18 lw r3,(r11+24)
8001fc0: 34 02 fd fe mvi r2,-514
8001fc4: 20 21 02 01 andi r1,r1,0x201
8001fc8: a0 43 10 00 and r2,r2,r3
8001fcc: b8 22 08 00 or r1,r1,r2
8001fd0: 59 61 00 18 sw (r11+24),r1
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
int flags;
int mask;
int ret = 0;
8001fd4: 34 0c 00 00 mvi r12,0
8001fd8: e0 00 00 08 bi 8001ff8 <fcntl+0x1b4>
errno = ENOTSUP;
ret = -1;
break;
case F_GETOWN: /* for sockets. */
errno = ENOTSUP;
8001fdc: f8 00 2e 49 calli 800d900 <__errno>
8001fe0: 34 02 00 86 mvi r2,134
8001fe4: e0 00 00 03 bi 8001ff0 <fcntl+0x1ac>
ret = -1;
break;
default:
errno = EINVAL;
8001fe8: f8 00 2e 46 calli 800d900 <__errno>
8001fec: 34 02 00 16 mvi r2,22
8001ff0: 58 22 00 00 sw (r1+0),r2
8001ff4: e0 00 00 0a bi 800201c <fcntl+0x1d8>
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop );
8001ff8: 29 61 00 24 lw r1,(r11+36)
8001ffc: b9 60 10 00 mv r2,r11
8002000: 28 23 00 30 lw r3,(r1+48)
8002004: b9 a0 08 00 mv r1,r13
8002008: d8 60 00 00 call r3
800200c: b8 20 58 00 mv r11,r1
if (err) {
8002010: 44 20 00 04 be r1,r0,8002020 <fcntl+0x1dc> <== ALWAYS TAKEN
errno = err;
8002014: f8 00 2e 3b calli 800d900 <__errno> <== NOT EXECUTED
8002018: 58 2b 00 00 sw (r1+0),r11 <== NOT EXECUTED
ret = -1;
800201c: 34 0c ff ff mvi r12,-1
va_list ap;
va_start( ap, cmd );
ret = vfcntl(fd,cmd,ap);
va_end(ap);
return ret;
}
8002020: b9 80 08 00 mv r1,r12
8002024: 2b 9d 00 04 lw ra,(sp+4)
8002028: 2b 8b 00 20 lw r11,(sp+32)
800202c: 2b 8c 00 1c lw r12,(sp+28)
8002030: 2b 8d 00 18 lw r13,(sp+24)
8002034: 2b 8e 00 14 lw r14,(sp+20)
8002038: 2b 8f 00 10 lw r15,(sp+16)
800203c: 2b 90 00 0c lw r16,(sp+12)
8002040: 2b 91 00 08 lw r17,(sp+8)
8002044: 37 9c 00 3c addi sp,sp,60
8002048: c3 a0 00 00 ret
0800a284 <fifo_open>:
*/
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
800a284: 37 9c ff d4 addi sp,sp,-44
800a288: 5b 8b 00 24 sw (sp+36),r11
800a28c: 5b 8c 00 20 sw (sp+32),r12
800a290: 5b 8d 00 1c sw (sp+28),r13
800a294: 5b 8e 00 18 sw (sp+24),r14
800a298: 5b 8f 00 14 sw (sp+20),r15
800a29c: 5b 90 00 10 sw (sp+16),r16
800a2a0: 5b 91 00 0c sw (sp+12),r17
800a2a4: 5b 92 00 08 sw (sp+8),r18
800a2a8: 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) {
800a2ac: 78 0b 08 02 mvhi r11,0x802
800a2b0: 39 6b 36 cc ori r11,r11,0x36cc
*/
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
800a2b4: b8 20 78 00 mv r15,r1
static rtems_status_code pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
800a2b8: 29 61 00 00 lw r1,(r11+0)
*/
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
800a2bc: b8 40 70 00 mv r14,r2
static rtems_status_code pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
800a2c0: 5c 20 00 18 bne r1,r0,800a320 <fifo_open+0x9c>
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 );
800a2c4: 78 01 08 02 mvhi r1,0x802
800a2c8: 38 21 37 48 ori r1,r1,0x3748
800a2cc: 28 21 00 00 lw r1,(r1+0)
800a2d0: 34 02 00 00 mvi r2,0
800a2d4: 34 03 00 00 mvi r3,0
800a2d8: fb ff eb 88 calli 80050f8 <rtems_semaphore_obtain>
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
800a2dc: 29 61 00 00 lw r1,(r11+0)
free(pipe);
}
static rtems_status_code pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
800a2e0: 34 0c 00 00 mvi r12,0
if (pipe_semaphore == RTEMS_ID_NONE) {
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
800a2e4: 5c 2c 00 0a bne r1,r12,800a30c <fifo_open+0x88> <== NEVER TAKEN
sc = rtems_semaphore_create(
800a2e8: 78 02 08 02 mvhi r2,0x802
800a2ec: 38 42 16 d0 ori r2,r2,0x16d0
800a2f0: 28 41 00 00 lw r1,(r2+0)
800a2f4: 34 03 00 54 mvi r3,84
800a2f8: 34 02 00 01 mvi r2,1
800a2fc: 34 04 00 00 mvi r4,0
800a300: b9 60 28 00 mv r5,r11
800a304: fb ff ea d1 calli 8004e48 <rtems_semaphore_create>
800a308: b8 20 60 00 mv r12,r1
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
800a30c: 78 01 08 02 mvhi r1,0x802
800a310: 38 21 37 48 ori r1,r1,0x3748
800a314: 28 21 00 00 lw r1,(r1+0)
800a318: fb ff eb c8 calli 8005238 <rtems_semaphore_release>
}
rtems_libio_unlock();
}
if (sc == RTEMS_SUCCESSFUL) {
800a31c: 5d 80 00 08 bne r12,r0,800a33c <fifo_open+0xb8>
sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
800a320: 78 01 08 02 mvhi r1,0x802
800a324: 38 21 36 cc ori r1,r1,0x36cc
800a328: 28 21 00 00 lw r1,(r1+0)
800a32c: 34 02 00 00 mvi r2,0
800a330: 34 03 00 00 mvi r3,0
800a334: fb ff eb 71 calli 80050f8 <rtems_semaphore_obtain>
}
if (sc == RTEMS_SUCCESSFUL) {
800a338: 44 20 00 03 be r1,r0,800a344 <fifo_open+0xc0> <== ALWAYS TAKEN
800a33c: 34 0c ff f4 mvi r12,-12
800a340: e0 00 00 cd bi 800a674 <fifo_open+0x3f0>
err = pipe_lock();
if (err)
return err;
pipe = *pipep;
800a344: 29 eb 00 00 lw r11,(r15+0)
800a348: 34 0c 00 00 mvi r12,0
if (pipe == NULL) {
800a34c: 5d 60 00 55 bne r11,r0,800a4a0 <fifo_open+0x21c>
{
static char c = 'a';
pipe_control_t *pipe;
int err = -ENOMEM;
pipe = malloc(sizeof(pipe_control_t));
800a350: 34 01 00 34 mvi r1,52
800a354: fb ff e6 43 calli 8003c60 <malloc>
800a358: b8 20 58 00 mv r11,r1
800a35c: b8 20 80 00 mv r16,r1
if (pipe == NULL)
800a360: 44 20 00 4e be r1,r0,800a498 <fifo_open+0x214>
return err;
memset(pipe, 0, sizeof(pipe_control_t));
800a364: 34 02 00 00 mvi r2,0
800a368: 34 03 00 34 mvi r3,52
800a36c: f8 00 17 b7 calli 8010248 <memset>
pipe->Size = PIPE_BUF;
800a370: 34 01 02 00 mvi r1,512
800a374: 59 61 00 04 sw (r11+4),r1
pipe->Buffer = malloc(pipe->Size);
800a378: fb ff e6 3a calli 8003c60 <malloc>
800a37c: 59 61 00 00 sw (r11+0),r1
if (! pipe->Buffer)
800a380: 44 20 00 44 be r1,r0,800a490 <fifo_open+0x20c> <== NEVER TAKEN
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'r', c),
800a384: 78 0d 08 02 mvhi r13,0x802
if (! pipe->Buffer)
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
800a388: 78 03 08 02 mvhi r3,0x802
800a38c: 38 63 16 d4 ori r3,r3,0x16d4
rtems_build_name ('P', 'I', 'r', c),
800a390: 39 ad 31 24 ori r13,r13,0x3124
800a394: 41 a2 00 00 lbu r2,(r13+0)
if (! pipe->Buffer)
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
800a398: 28 61 00 00 lw r1,(r3+0)
800a39c: 35 64 00 2c addi r4,r11,44
800a3a0: 34 03 00 00 mvi r3,0
800a3a4: b8 41 08 00 or r1,r2,r1
800a3a8: 34 02 00 00 mvi r2,0
800a3ac: f8 00 07 24 calli 800c03c <rtems_barrier_create>
800a3b0: 5c 20 00 36 bne r1,r0,800a488 <fifo_open+0x204>
rtems_build_name ('P', 'I', 'r', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->readBarrier) != RTEMS_SUCCESSFUL)
goto err_rbar;
if (rtems_barrier_create(
800a3b4: 78 03 08 02 mvhi r3,0x802
800a3b8: 38 63 16 d8 ori r3,r3,0x16d8
rtems_build_name ('P', 'I', 'w', c),
800a3bc: 41 a2 00 00 lbu r2,(r13+0)
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'r', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->readBarrier) != RTEMS_SUCCESSFUL)
goto err_rbar;
if (rtems_barrier_create(
800a3c0: 28 61 00 00 lw r1,(r3+0)
800a3c4: 35 64 00 30 addi r4,r11,48
800a3c8: 34 03 00 00 mvi r3,0
800a3cc: b8 41 08 00 or r1,r2,r1
800a3d0: 34 02 00 00 mvi r2,0
800a3d4: f8 00 07 1a calli 800c03c <rtems_barrier_create>
800a3d8: 5c 20 00 2a bne r1,r0,800a480 <fifo_open+0x1fc>
rtems_build_name ('P', 'I', 'w', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
if (rtems_semaphore_create(
800a3dc: 78 03 08 02 mvhi r3,0x802
800a3e0: 38 63 16 dc ori r3,r3,0x16dc
rtems_build_name ('P', 'I', 's', c), 1,
800a3e4: 41 a2 00 00 lbu r2,(r13+0)
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'w', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
if (rtems_semaphore_create(
800a3e8: 28 61 00 00 lw r1,(r3+0)
800a3ec: 34 04 00 00 mvi r4,0
800a3f0: 34 03 00 10 mvi r3,16
800a3f4: b8 41 08 00 or r1,r2,r1
800a3f8: 35 65 00 28 addi r5,r11,40
800a3fc: 34 02 00 01 mvi r2,1
800a400: fb ff ea 92 calli 8004e48 <rtems_semaphore_create>
800a404: 5c 20 00 1d bne r1,r0,800a478 <fifo_open+0x1f4>
Objects_Id id,
Objects_Locations *location
)
{
return (Barrier_Control *)
_Objects_Get( &_Barrier_Information, id, location );
800a408: 29 62 00 2c lw r2,(r11+44)
800a40c: 78 10 08 02 mvhi r16,0x802
800a410: 3a 10 41 38 ori r16,r16,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
800a414: 37 92 00 28 addi r18,sp,40
800a418: ba 40 18 00 mv r3,r18
800a41c: ba 00 08 00 mv r1,r16
800a420: fb ff f1 ba calli 8006b08 <_Objects_Get>
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
800a424: 28 22 00 4c lw r2,(r1+76)
800a428: 78 11 10 00 mvhi r17,0x1000
800a42c: b8 51 10 00 or r2,r2,r17
800a430: 58 22 00 4c sw (r1+76),r2
_Thread_Enable_dispatch();
800a434: fb ff f4 e8 calli 80077d4 <_Thread_Enable_dispatch>
800a438: 29 62 00 30 lw r2,(r11+48)
800a43c: ba 40 18 00 mv r3,r18
800a440: ba 00 08 00 mv r1,r16
800a444: fb ff f1 b1 calli 8006b08 <_Objects_Get>
_Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
800a448: 28 22 00 4c lw r2,(r1+76)
800a44c: b8 51 88 00 or r17,r2,r17
800a450: 58 31 00 4c sw (r1+76),r17
_Thread_Enable_dispatch();
800a454: fb ff f4 e0 calli 80077d4 <_Thread_Enable_dispatch>
#ifdef RTEMS_POSIX_API
pipe_interruptible(pipe);
#endif
*pipep = pipe;
if (c ++ == 'z')
800a458: 41 a1 00 00 lbu r1,(r13+0)
800a45c: 34 22 00 01 addi r2,r1,1
800a460: 31 a2 00 00 sb (r13+0),r2
800a464: 34 02 00 7a mvi r2,122
800a468: 5c 22 00 0e bne r1,r2,800a4a0 <fifo_open+0x21c>
c = 'a';
800a46c: 34 01 00 61 mvi r1,97
800a470: 31 a1 00 00 sb (r13+0),r1
800a474: e0 00 00 0b bi 800a4a0 <fifo_open+0x21c>
return 0;
err_sem:
rtems_barrier_delete(pipe->writeBarrier);
800a478: 29 61 00 30 lw r1,(r11+48)
800a47c: f8 00 07 2c calli 800c12c <rtems_barrier_delete>
err_wbar:
rtems_barrier_delete(pipe->readBarrier);
800a480: 2a 01 00 2c lw r1,(r16+44)
800a484: f8 00 07 2a calli 800c12c <rtems_barrier_delete>
err_rbar:
free(pipe->Buffer);
800a488: 2a 01 00 00 lw r1,(r16+0)
800a48c: fb ff e3 ac calli 800333c <free>
err_buf:
free(pipe);
800a490: ba 00 08 00 mv r1,r16
800a494: fb ff e3 aa calli 800333c <free>
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
err = -EINTR;
800a498: 34 0c ff f4 mvi r12,-12
800a49c: e0 00 00 0e bi 800a4d4 <fifo_open+0x250>
err = pipe_alloc(&pipe);
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
800a4a0: 29 61 00 28 lw r1,(r11+40)
800a4a4: 34 02 00 00 mvi r2,0
800a4a8: 34 03 00 00 mvi r3,0
800a4ac: fb ff eb 13 calli 80050f8 <rtems_semaphore_obtain>
800a4b0: 44 20 00 02 be r1,r0,800a4b8 <fifo_open+0x234> <== ALWAYS TAKEN
err = -EINTR;
800a4b4: 34 0c ff fc mvi r12,-4 <== NOT EXECUTED
if (*pipep == NULL) {
800a4b8: 29 e1 00 00 lw r1,(r15+0)
800a4bc: 5c 20 00 06 bne r1,r0,800a4d4 <fifo_open+0x250>
if (err)
800a4c0: 45 81 00 04 be r12,r1,800a4d0 <fifo_open+0x24c> <== ALWAYS TAKEN
pipe_free(pipe);
800a4c4: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800a4c8: fb ff ff 2b calli 800a174 <pipe_free> <== NOT EXECUTED
800a4cc: e0 00 00 02 bi 800a4d4 <fifo_open+0x250> <== NOT EXECUTED
else
*pipep = pipe;
800a4d0: 59 eb 00 00 sw (r15+0),r11
}
out:
pipe_unlock();
800a4d4: fb ff ff 1f calli 800a150 <pipe_unlock>
pipe_control_t *pipe;
unsigned int prevCounter;
int err;
err = pipe_new(pipep);
if (err)
800a4d8: 5d 80 00 67 bne r12,r0,800a674 <fifo_open+0x3f0>
return err;
pipe = *pipep;
switch (LIBIO_ACCMODE(iop)) {
800a4dc: 29 c1 00 18 lw r1,(r14+24)
800a4e0: 34 02 00 04 mvi r2,4
int err;
err = pipe_new(pipep);
if (err)
return err;
pipe = *pipep;
800a4e4: 29 eb 00 00 lw r11,(r15+0)
switch (LIBIO_ACCMODE(iop)) {
800a4e8: 20 21 00 06 andi r1,r1,0x6
800a4ec: 44 22 00 24 be r1,r2,800a57c <fifo_open+0x2f8>
800a4f0: 34 02 00 06 mvi r2,6
800a4f4: 44 22 00 45 be r1,r2,800a608 <fifo_open+0x384>
800a4f8: 34 02 00 02 mvi r2,2
800a4fc: 5c 22 00 57 bne r1,r2,800a658 <fifo_open+0x3d4> <== NEVER TAKEN
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
800a500: 29 61 00 20 lw r1,(r11+32)
800a504: 34 21 00 01 addi r1,r1,1
800a508: 59 61 00 20 sw (r11+32),r1
if (pipe->Readers ++ == 0)
800a50c: 29 61 00 10 lw r1,(r11+16)
800a510: 34 22 00 01 addi r2,r1,1
800a514: 59 62 00 10 sw (r11+16),r2
800a518: 5c 20 00 04 bne r1,r0,800a528 <fifo_open+0x2a4> <== NEVER TAKEN
PIPE_WAKEUPWRITERS(pipe);
800a51c: 29 61 00 30 lw r1,(r11+48)
800a520: 37 82 00 2c addi r2,sp,44
800a524: f8 00 07 32 calli 800c1ec <rtems_barrier_release>
if (pipe->Writers == 0) {
800a528: 29 61 00 14 lw r1,(r11+20)
800a52c: 5c 20 00 4b bne r1,r0,800a658 <fifo_open+0x3d4>
/* Not an error */
if (LIBIO_NODELAY(iop))
800a530: 29 c2 00 18 lw r2,(r14+24)
800a534: 20 42 00 01 andi r2,r2,0x1
800a538: 5c 41 00 48 bne r2,r1,800a658 <fifo_open+0x3d4>
break;
prevCounter = pipe->writerCounter;
800a53c: 29 70 00 24 lw r16,(r11+36)
err = -EINTR;
/* Wait until a writer opens the pipe */
do {
PIPE_UNLOCK(pipe);
800a540: 29 61 00 28 lw r1,(r11+40)
800a544: fb ff eb 3d calli 8005238 <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
800a548: 29 61 00 2c lw r1,(r11+44)
800a54c: 34 02 00 00 mvi r2,0
800a550: f8 00 07 44 calli 800c260 <rtems_barrier_wait>
800a554: b8 20 68 00 mv r13,r1
800a558: 5c 20 00 43 bne r1,r0,800a664 <fifo_open+0x3e0> <== NEVER TAKEN
goto out_error;
if (! PIPE_LOCK(pipe))
800a55c: 29 61 00 28 lw r1,(r11+40)
800a560: 34 02 00 00 mvi r2,0
800a564: 34 03 00 00 mvi r3,0
800a568: fb ff ea e4 calli 80050f8 <rtems_semaphore_obtain>
800a56c: 5c 2d 00 3e bne r1,r13,800a664 <fifo_open+0x3e0> <== NEVER TAKEN
goto out_error;
} while (prevCounter == pipe->writerCounter);
800a570: 29 61 00 24 lw r1,(r11+36)
800a574: 46 01 ff f3 be r16,r1,800a540 <fifo_open+0x2bc> <== NEVER TAKEN
800a578: e0 00 00 38 bi 800a658 <fifo_open+0x3d4>
}
break;
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
800a57c: 29 61 00 24 lw r1,(r11+36)
800a580: 34 21 00 01 addi r1,r1,1
800a584: 59 61 00 24 sw (r11+36),r1
if (pipe->Writers ++ == 0)
800a588: 29 61 00 14 lw r1,(r11+20)
800a58c: 34 22 00 01 addi r2,r1,1
800a590: 59 62 00 14 sw (r11+20),r2
800a594: 5c 20 00 04 bne r1,r0,800a5a4 <fifo_open+0x320> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
800a598: 29 61 00 2c lw r1,(r11+44)
800a59c: 37 82 00 2c addi r2,sp,44
800a5a0: f8 00 07 13 calli 800c1ec <rtems_barrier_release>
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
800a5a4: 29 61 00 10 lw r1,(r11+16)
800a5a8: 5c 20 00 2c bne r1,r0,800a658 <fifo_open+0x3d4>
800a5ac: 29 c2 00 18 lw r2,(r14+24)
800a5b0: 20 42 00 01 andi r2,r2,0x1
800a5b4: 44 41 00 05 be r2,r1,800a5c8 <fifo_open+0x344>
PIPE_UNLOCK(pipe);
800a5b8: 29 61 00 28 lw r1,(r11+40)
err = -ENXIO;
800a5bc: 34 0c ff fa mvi r12,-6
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
PIPE_UNLOCK(pipe);
800a5c0: fb ff eb 1e calli 8005238 <rtems_semaphore_release>
err = -ENXIO;
goto out_error;
800a5c4: e0 00 00 29 bi 800a668 <fifo_open+0x3e4>
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
800a5c8: 29 70 00 20 lw r16,(r11+32)
err = -EINTR;
do {
PIPE_UNLOCK(pipe);
800a5cc: 29 61 00 28 lw r1,(r11+40)
800a5d0: fb ff eb 1a calli 8005238 <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
800a5d4: 29 61 00 30 lw r1,(r11+48)
800a5d8: 34 02 00 00 mvi r2,0
800a5dc: f8 00 07 21 calli 800c260 <rtems_barrier_wait>
800a5e0: b8 20 68 00 mv r13,r1
800a5e4: 5c 20 00 20 bne r1,r0,800a664 <fifo_open+0x3e0> <== NEVER TAKEN
goto out_error;
if (! PIPE_LOCK(pipe))
800a5e8: 29 61 00 28 lw r1,(r11+40)
800a5ec: 34 02 00 00 mvi r2,0
800a5f0: 34 03 00 00 mvi r3,0
800a5f4: fb ff ea c1 calli 80050f8 <rtems_semaphore_obtain>
800a5f8: 5c 2d 00 1b bne r1,r13,800a664 <fifo_open+0x3e0> <== NEVER TAKEN
goto out_error;
} while (prevCounter == pipe->readerCounter);
800a5fc: 29 61 00 20 lw r1,(r11+32)
800a600: 46 01 ff f3 be r16,r1,800a5cc <fifo_open+0x348> <== NEVER TAKEN
800a604: e0 00 00 15 bi 800a658 <fifo_open+0x3d4>
}
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
800a608: 29 61 00 20 lw r1,(r11+32)
800a60c: 34 21 00 01 addi r1,r1,1
800a610: 59 61 00 20 sw (r11+32),r1
if (pipe->Readers ++ == 0)
800a614: 29 61 00 10 lw r1,(r11+16)
800a618: 34 22 00 01 addi r2,r1,1
800a61c: 59 62 00 10 sw (r11+16),r2
800a620: 5c 20 00 04 bne r1,r0,800a630 <fifo_open+0x3ac> <== NEVER TAKEN
PIPE_WAKEUPWRITERS(pipe);
800a624: 29 61 00 30 lw r1,(r11+48)
800a628: 37 82 00 2c addi r2,sp,44
800a62c: f8 00 06 f0 calli 800c1ec <rtems_barrier_release>
pipe->writerCounter ++;
800a630: 29 61 00 24 lw r1,(r11+36)
800a634: 34 21 00 01 addi r1,r1,1
800a638: 59 61 00 24 sw (r11+36),r1
if (pipe->Writers ++ == 0)
800a63c: 29 61 00 14 lw r1,(r11+20)
800a640: 34 22 00 01 addi r2,r1,1
800a644: 59 62 00 14 sw (r11+20),r2
800a648: 5c 20 00 04 bne r1,r0,800a658 <fifo_open+0x3d4> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
800a64c: 29 61 00 2c lw r1,(r11+44)
800a650: 37 82 00 2c addi r2,sp,44
800a654: f8 00 06 e6 calli 800c1ec <rtems_barrier_release>
break;
}
PIPE_UNLOCK(pipe);
800a658: 29 61 00 28 lw r1,(r11+40)
800a65c: fb ff ea f7 calli 8005238 <rtems_semaphore_release>
return 0;
800a660: e0 00 00 05 bi 800a674 <fifo_open+0x3f0>
goto out_error;
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
800a664: 34 0c ff fc mvi r12,-4 <== NOT EXECUTED
PIPE_UNLOCK(pipe);
return 0;
out_error:
pipe_release(pipep, iop);
800a668: b9 e0 08 00 mv r1,r15
800a66c: b9 c0 10 00 mv r2,r14
800a670: fb ff fe d3 calli 800a1bc <pipe_release>
return err;
}
800a674: b9 80 08 00 mv r1,r12
800a678: 2b 9d 00 04 lw ra,(sp+4)
800a67c: 2b 8b 00 24 lw r11,(sp+36)
800a680: 2b 8c 00 20 lw r12,(sp+32)
800a684: 2b 8d 00 1c lw r13,(sp+28)
800a688: 2b 8e 00 18 lw r14,(sp+24)
800a68c: 2b 8f 00 14 lw r15,(sp+20)
800a690: 2b 90 00 10 lw r16,(sp+16)
800a694: 2b 91 00 0c lw r17,(sp+12)
800a698: 2b 92 00 08 lw r18,(sp+8)
800a69c: 37 9c 00 2c addi sp,sp,44
800a6a0: c3 a0 00 00 ret
080020f8 <fpathconf>:
long fpathconf(
int fd,
int name
)
{
80020f8: 37 9c ff f0 addi sp,sp,-16
80020fc: 5b 8b 00 10 sw (sp+16),r11
8002100: 5b 8c 00 0c sw (sp+12),r12
8002104: 5b 8d 00 08 sw (sp+8),r13
8002108: 5b 9d 00 04 sw (sp+4),ra
long return_value;
rtems_libio_t *iop;
rtems_filesystem_limits_and_options_t *the_limits;
rtems_libio_check_fd(fd);
800210c: 78 03 08 01 mvhi r3,0x801
8002110: 38 63 60 10 ori r3,r3,0x6010
long fpathconf(
int fd,
int name
)
{
8002114: b8 40 68 00 mv r13,r2
long return_value;
rtems_libio_t *iop;
rtems_filesystem_limits_and_options_t *the_limits;
rtems_libio_check_fd(fd);
8002118: 28 62 00 00 lw r2,(r3+0)
800211c: 54 41 00 02 bgu r2,r1,8002124 <fpathconf+0x2c>
8002120: e0 00 00 0a bi 8002148 <fpathconf+0x50>
iop = rtems_libio_iop(fd);
8002124: 34 02 00 06 mvi r2,6
8002128: 78 0b 08 01 mvhi r11,0x801
800212c: f8 00 45 d9 calli 8013890 <__ashlsi3>
8002130: 39 6b 67 2c ori r11,r11,0x672c
8002134: 29 63 00 00 lw r3,(r11+0)
8002138: b4 61 18 00 add r3,r3,r1
rtems_libio_check_is_open(iop);
800213c: 28 61 00 18 lw r1,(r3+24)
8002140: 20 22 01 00 andi r2,r1,0x100
8002144: 5c 40 00 04 bne r2,r0,8002154 <fpathconf+0x5c> <== ALWAYS TAKEN
8002148: f8 00 2d ee calli 800d900 <__errno>
800214c: 34 02 00 09 mvi r2,9
8002150: e0 00 00 28 bi 80021f0 <fpathconf+0xf8>
rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
8002154: 20 21 00 02 andi r1,r1,0x2
8002158: 44 20 00 24 be r1,r0,80021e8 <fpathconf+0xf0>
* Now process the information request.
*/
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
switch ( name ) {
800215c: 34 01 00 0b mvi r1,11
/*
* Now process the information request.
*/
the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options;
8002160: 28 6b 00 2c lw r11,(r3+44)
switch ( name ) {
8002164: 55 a1 00 21 bgu r13,r1,80021e8 <fpathconf+0xf0>
8002168: 78 0c 08 01 mvhi r12,0x801
800216c: b9 a0 08 00 mv r1,r13
8002170: 34 02 00 02 mvi r2,2
8002174: f8 00 45 c7 calli 8013890 <__ashlsi3>
8002178: 39 8c 4b 10 ori r12,r12,0x4b10
800217c: b5 81 08 00 add r1,r12,r1
8002180: 28 21 00 00 lw r1,(r1+0)
8002184: c0 20 00 00 b r1
case _PC_LINK_MAX:
return_value = the_limits->link_max;
8002188: 29 61 00 38 lw r1,(r11+56)
break;
800218c: e0 00 00 1b bi 80021f8 <fpathconf+0x100>
case _PC_MAX_CANON:
return_value = the_limits->max_canon;
8002190: 29 61 00 3c lw r1,(r11+60)
break;
8002194: e0 00 00 19 bi 80021f8 <fpathconf+0x100>
case _PC_MAX_INPUT:
return_value = the_limits->max_input;
8002198: 29 61 00 40 lw r1,(r11+64)
break;
800219c: e0 00 00 17 bi 80021f8 <fpathconf+0x100>
case _PC_NAME_MAX:
return_value = the_limits->name_max;
80021a0: 29 61 00 44 lw r1,(r11+68)
break;
80021a4: e0 00 00 15 bi 80021f8 <fpathconf+0x100>
case _PC_PATH_MAX:
return_value = the_limits->path_max;
80021a8: 29 61 00 48 lw r1,(r11+72)
break;
80021ac: e0 00 00 13 bi 80021f8 <fpathconf+0x100>
case _PC_PIPE_BUF:
return_value = the_limits->pipe_buf;
80021b0: 29 61 00 4c lw r1,(r11+76)
break;
80021b4: e0 00 00 11 bi 80021f8 <fpathconf+0x100>
case _PC_CHOWN_RESTRICTED:
return_value = the_limits->posix_chown_restrictions;
80021b8: 29 61 00 54 lw r1,(r11+84)
break;
80021bc: e0 00 00 0f bi 80021f8 <fpathconf+0x100>
case _PC_NO_TRUNC:
return_value = the_limits->posix_no_trunc;
80021c0: 29 61 00 58 lw r1,(r11+88)
break;
80021c4: e0 00 00 0d bi 80021f8 <fpathconf+0x100>
case _PC_VDISABLE:
return_value = the_limits->posix_vdisable;
80021c8: 29 61 00 64 lw r1,(r11+100)
break;
80021cc: e0 00 00 0b bi 80021f8 <fpathconf+0x100>
case _PC_ASYNC_IO:
return_value = the_limits->posix_async_io;
80021d0: 29 61 00 50 lw r1,(r11+80)
break;
80021d4: e0 00 00 09 bi 80021f8 <fpathconf+0x100>
case _PC_PRIO_IO:
return_value = the_limits->posix_prio_io;
80021d8: 29 61 00 5c lw r1,(r11+92)
break;
80021dc: e0 00 00 07 bi 80021f8 <fpathconf+0x100>
case _PC_SYNC_IO:
return_value = the_limits->posix_sync_io;
80021e0: 29 61 00 60 lw r1,(r11+96)
break;
80021e4: e0 00 00 05 bi 80021f8 <fpathconf+0x100>
default:
rtems_set_errno_and_return_minus_one( EINVAL );
80021e8: f8 00 2d c6 calli 800d900 <__errno>
80021ec: 34 02 00 16 mvi r2,22
80021f0: 58 22 00 00 sw (r1+0),r2
80021f4: 34 01 ff ff mvi r1,-1
break;
}
return return_value;
}
80021f8: 2b 9d 00 04 lw ra,(sp+4)
80021fc: 2b 8b 00 10 lw r11,(sp+16)
8002200: 2b 8c 00 0c lw r12,(sp+12)
8002204: 2b 8d 00 08 lw r13,(sp+8)
8002208: 37 9c 00 10 addi sp,sp,16
800220c: c3 a0 00 00 ret
080026c0 <free>:
#include <stdlib.h>
void free(
void *ptr
)
{
80026c0: 37 9c ff f4 addi sp,sp,-12
80026c4: 5b 8b 00 0c sw (sp+12),r11
80026c8: 5b 8c 00 08 sw (sp+8),r12
80026cc: 5b 9d 00 04 sw (sp+4),ra
80026d0: b8 20 58 00 mv r11,r1
MSBUMP(free_calls, 1);
80026d4: 78 01 08 01 mvhi r1,0x801
80026d8: 38 21 98 00 ori r1,r1,0x9800
80026dc: 28 22 00 0c lw r2,(r1+12)
80026e0: 34 42 00 01 addi r2,r2,1
80026e4: 58 22 00 0c sw (r1+12),r2
if ( !ptr )
80026e8: 45 60 00 1f be r11,r0,8002764 <free+0xa4>
return;
/*
* Do not attempt to free memory if in a critical section or ISR.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
80026ec: 78 01 08 01 mvhi r1,0x801
80026f0: 38 21 9a 98 ori r1,r1,0x9a98
80026f4: 28 22 00 00 lw r2,(r1+0)
80026f8: 34 01 00 03 mvi r1,3
80026fc: 5c 41 00 06 bne r2,r1,8002714 <free+0x54> <== NEVER TAKEN
!malloc_is_system_state_OK() ) {
8002700: f8 00 00 80 calli 8002900 <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()) &&
8002704: 5c 20 00 04 bne r1,r0,8002714 <free+0x54>
!malloc_is_system_state_OK() ) {
malloc_deferred_free(ptr);
8002708: b9 60 08 00 mv r1,r11
800270c: f8 00 00 9d calli 8002980 <malloc_deferred_free>
return;
8002710: e0 00 00 15 bi 8002764 <free+0xa4>
}
/*
* If configured, update the statistics
*/
if ( rtems_malloc_statistics_helpers )
8002714: 78 01 08 01 mvhi r1,0x801
8002718: 38 21 96 80 ori r1,r1,0x9680
800271c: 28 21 00 00 lw r1,(r1+0)
8002720: 44 20 00 04 be r1,r0,8002730 <free+0x70>
(*rtems_malloc_statistics_helpers->at_free)(ptr);
8002724: 28 22 00 08 lw r2,(r1+8)
8002728: b9 60 08 00 mv r1,r11
800272c: d8 40 00 00 call r2
if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) {
8002730: 78 0c 08 01 mvhi r12,0x801
8002734: 39 8c 90 1c ori r12,r12,0x901c
8002738: 29 81 00 00 lw r1,(r12+0)
800273c: b9 60 10 00 mv r2,r11
8002740: f8 00 0e 10 calli 8005f80 <_Protected_heap_Free>
8002744: 5c 20 00 08 bne r1,r0,8002764 <free+0xa4>
printk( "Program heap: free of bad pointer %p -- range %p - %p \n",
ptr,
RTEMS_Malloc_Heap->area_begin,
8002748: 29 84 00 00 lw r4,(r12+0)
*/
if ( rtems_malloc_statistics_helpers )
(*rtems_malloc_statistics_helpers->at_free)(ptr);
if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) {
printk( "Program heap: free of bad pointer %p -- range %p - %p \n",
800274c: 78 01 08 01 mvhi r1,0x801
8002750: 38 21 7e 60 ori r1,r1,0x7e60
8002754: 28 83 00 18 lw r3,(r4+24)
8002758: 28 84 00 1c lw r4,(r4+28)
800275c: b9 60 10 00 mv r2,r11
8002760: f8 00 03 bb calli 800364c <printk>
RTEMS_Malloc_Heap->area_begin,
RTEMS_Malloc_Heap->area_end
);
}
}
8002764: 2b 9d 00 04 lw ra,(sp+4)
8002768: 2b 8b 00 0c lw r11,(sp+12)
800276c: 2b 8c 00 08 lw r12,(sp+8)
8002770: 37 9c 00 0c addi sp,sp,12
8002774: c3 a0 00 00 ret
08002a50 <free_user_env>:
* NOTE: this must be called with
* thread dispatching disabled!
*/
static void
free_user_env(void *venv)
{
8002a50: 37 9c ff f8 addi sp,sp,-8
8002a54: 5b 8b 00 08 sw (sp+8),r11
8002a58: 5b 9d 00 04 sw (sp+4),ra
8002a5c: b8 20 58 00 mv r11,r1
rtems_user_env_t *env = (rtems_user_env_t*) venv ;
if (env != &rtems_global_user_env
8002a60: 78 01 08 01 mvhi r1,0x801
8002a64: 38 21 47 50 ori r1,r1,0x4750
8002a68: 45 61 00 07 be r11,r1,8002a84 <free_user_env+0x34> <== NEVER TAKEN
#ifdef HAVE_USERENV_REFCNT
&& --env->refcnt <= 0
#endif
) {
rtems_filesystem_freenode( &env->current_directory);
8002a6c: 35 61 00 04 addi r1,r11,4
8002a70: fb ff fb 35 calli 8001744 <rtems_filesystem_freenode>
rtems_filesystem_freenode( &env->root_directory);
8002a74: 35 61 00 18 addi r1,r11,24
8002a78: fb ff fb 33 calli 8001744 <rtems_filesystem_freenode>
free(env);
8002a7c: b9 60 08 00 mv r1,r11
8002a80: fb ff fb 39 calli 8001764 <free>
}
}
8002a84: 2b 9d 00 04 lw ra,(sp+4)
8002a88: 2b 8b 00 08 lw r11,(sp+8)
8002a8c: 37 9c 00 08 addi sp,sp,8
8002a90: c3 a0 00 00 ret
080138b0 <getdents>:
int getdents(
int dd_fd,
char *dd_buf,
int dd_len
)
{
80138b0: 37 9c ff dc addi sp,sp,-36
80138b4: 5b 8b 00 10 sw (sp+16),r11
80138b8: 5b 8c 00 0c sw (sp+12),r12
80138bc: 5b 8d 00 08 sw (sp+8),r13
80138c0: 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 );
80138c4: 78 04 08 01 mvhi r4,0x801
80138c8: 38 84 70 10 ori r4,r4,0x7010
int getdents(
int dd_fd,
char *dd_buf,
int dd_len
)
{
80138cc: b8 40 68 00 mv r13,r2
rtems_filesystem_location_info_t loc;
/*
* Get the file control block structure associated with the file descriptor
*/
iop = rtems_libio_iop( dd_fd );
80138d0: 28 82 00 00 lw r2,(r4+0)
int getdents(
int dd_fd,
char *dd_buf,
int dd_len
)
{
80138d4: 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 );
80138d8: 34 0b 00 00 mvi r11,0
80138dc: 50 22 00 07 bgeu r1,r2,80138f8 <getdents+0x48> <== NEVER TAKEN
80138e0: 78 0b 08 01 mvhi r11,0x801
80138e4: 39 6b 78 48 ori r11,r11,0x7848
80138e8: 34 02 00 06 mvi r2,6
80138ec: fb ff b6 0a calli 8001114 <__ashlsi3>
80138f0: 29 6b 00 00 lw r11,(r11+0)
80138f4: b5 61 58 00 add r11,r11,r1
/*
* Make sure we are working on a directory
*/
loc = iop->pathinfo;
80138f8: 29 64 00 20 lw r4,(r11+32)
80138fc: 29 61 00 28 lw r1,(r11+40)
8013900: 29 65 00 1c lw r5,(r11+28)
8013904: 29 62 00 2c lw r2,(r11+44)
8013908: 29 63 00 24 lw r3,(r11+36)
801390c: 5b 84 00 18 sw (sp+24),r4
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
8013910: 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;
8013914: 5b 81 00 20 sw (sp+32),r1
8013918: 5b 82 00 24 sw (sp+36),r2
801391c: 5b 85 00 14 sw (sp+20),r5
8013920: 5b 83 00 1c sw (sp+28),r3
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY )
8013924: 37 81 00 14 addi r1,sp,20
8013928: d8 80 00 00 call r4
801392c: 34 02 00 01 mvi r2,1
8013930: 44 22 00 06 be r1,r2,8013948 <getdents+0x98>
rtems_set_errno_and_return_minus_one( ENOTDIR );
8013934: fb ff e6 f7 calli 800d510 <__errno>
8013938: 34 02 00 14 mvi r2,20
801393c: 58 22 00 00 sw (r1+0),r2
8013940: 34 01 ff ff mvi r1,-1
8013944: e0 00 00 07 bi 8013960 <getdents+0xb0>
/*
* 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 );
8013948: 29 61 00 24 lw r1,(r11+36)
801394c: b9 a0 10 00 mv r2,r13
8013950: b9 80 18 00 mv r3,r12
8013954: 28 24 00 08 lw r4,(r1+8)
8013958: b9 60 08 00 mv r1,r11
801395c: d8 80 00 00 call r4
}
8013960: 2b 9d 00 04 lw ra,(sp+4)
8013964: 2b 8b 00 10 lw r11,(sp+16)
8013968: 2b 8c 00 0c lw r12,(sp+12)
801396c: 2b 8d 00 08 lw r13,(sp+8)
8013970: 37 9c 00 24 addi sp,sp,36
8013974: c3 a0 00 00 ret
0801053c <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 )
801053c: 28 22 00 1c lw r2,(r1+28)
8010540: 34 03 00 01 mvi r3,1
8010544: 28 44 00 4c lw r4,(r2+76)
return -1; /* It wasn't a directory --> return error */
8010548: 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 )
801054c: 5c 83 00 04 bne r4,r3,801055c <imfs_dir_open+0x20> <== NEVER TAKEN
return -1; /* It wasn't a directory --> return error */
iop->offset = 0;
8010550: 58 20 00 10 sw (r1+16),r0
8010554: 58 20 00 14 sw (r1+20),r0
return 0;
8010558: 34 02 00 00 mvi r2,0
}
801055c: b8 40 08 00 mv r1,r2
8010560: c3 a0 00 00 ret
08010798 <imfs_dir_rmnod>:
int imfs_dir_rmnod(
rtems_filesystem_location_info_t *parent_pathloc, /* IN */
rtems_filesystem_location_info_t *pathloc /* IN */
)
{
8010798: 37 9c ff f8 addi sp,sp,-8
801079c: 5b 8b 00 08 sw (sp+8),r11
80107a0: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *the_jnode;
the_jnode = (IMFS_jnode_t *) pathloc->node_access;
80107a4: 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 ) )
80107a8: 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 );
80107ac: 35 61 00 54 addi r1,r11,84
80107b0: 44 61 00 04 be r3,r1,80107c0 <imfs_dir_rmnod+0x28>
rtems_set_errno_and_return_minus_one( ENOTEMPTY );
80107b4: f8 00 03 2f calli 8011470 <__errno>
80107b8: 34 02 00 5a mvi r2,90
80107bc: e0 00 00 06 bi 80107d4 <imfs_dir_rmnod+0x3c>
/*
* You cannot remove the file system root node.
*/
if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access )
80107c0: 28 41 00 10 lw r1,(r2+16)
80107c4: 28 21 00 1c lw r1,(r1+28)
80107c8: 5c 2b 00 06 bne r1,r11,80107e0 <imfs_dir_rmnod+0x48>
rtems_set_errno_and_return_minus_one( EBUSY );
80107cc: f8 00 03 29 calli 8011470 <__errno>
80107d0: 34 02 00 10 mvi r2,16
80107d4: 58 22 00 00 sw (r1+0),r2
80107d8: 34 01 ff ff mvi r1,-1
80107dc: e0 00 00 08 bi 80107fc <imfs_dir_rmnod+0x64>
/*
* You cannot remove a mountpoint.
*/
if ( the_jnode->info.directory.mt_fs != NULL )
80107e0: 29 61 00 5c lw r1,(r11+92)
80107e4: 5c 20 ff fa bne r1,r0,80107cc <imfs_dir_rmnod+0x34> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EBUSY );
IMFS_create_orphan( the_jnode );
80107e8: b9 60 08 00 mv r1,r11
80107ec: fb ff ee 7c calli 800c1dc <IMFS_create_orphan>
IMFS_check_node_remove( the_jnode );
80107f0: b9 60 08 00 mv r1,r11
80107f4: fb ff ee 8e calli 800c22c <IMFS_check_node_remove>
return 0;
80107f8: 34 01 00 00 mvi r1,0
}
80107fc: 2b 9d 00 04 lw ra,(sp+4)
8010800: 2b 8b 00 08 lw r11,(sp+8)
8010804: 37 9c 00 08 addi sp,sp,8
8010808: c3 a0 00 00 ret
08002054 <init_etc_passwd_group>:
/*
* Initialize useable but dummy databases
*/
void init_etc_passwd_group(void)
{
8002054: 37 9c ff f0 addi sp,sp,-16
8002058: 5b 8b 00 10 sw (sp+16),r11
800205c: 5b 8c 00 0c sw (sp+12),r12
8002060: 5b 8d 00 08 sw (sp+8),r13
8002064: 5b 9d 00 04 sw (sp+4),ra
FILE *fp;
static char etc_passwd_initted = 0;
if (etc_passwd_initted)
8002068: 78 01 08 01 mvhi r1,0x801
800206c: 38 21 68 78 ori r1,r1,0x6878
8002070: 40 2d 00 00 lbu r13,(r1+0)
8002074: 5d a0 00 2f bne r13,r0,8002130 <init_etc_passwd_group+0xdc>
return;
etc_passwd_initted = 1;
8002078: 34 02 00 01 mvi r2,1
800207c: 30 22 00 00 sb (r1+0),r2
mkdir("/etc", 0777);
8002080: 78 01 08 01 mvhi r1,0x801
8002084: 34 02 01 ff mvi r2,511
8002088: 38 21 4a 40 ori r1,r1,0x4a40
800208c: f8 00 02 9d calli 8002b00 <mkdir>
/*
* Initialize /etc/passwd
*/
if ((fp = fopen("/etc/passwd", "r")) != NULL) {
8002090: 78 0b 08 01 mvhi r11,0x801
8002094: 39 6b 4a 48 ori r11,r11,0x4a48
8002098: 78 02 08 01 mvhi r2,0x801
800209c: b9 60 08 00 mv r1,r11
80020a0: 38 42 4a 54 ori r2,r2,0x4a54
80020a4: f8 00 30 50 calli 800e1e4 <fopen>
80020a8: b8 20 60 00 mv r12,r1
80020ac: 5c 2d 00 0c bne r1,r13,80020dc <init_etc_passwd_group+0x88>
fclose(fp);
}
else if ((fp = fopen("/etc/passwd", "w")) != NULL) {
80020b0: 78 02 08 01 mvhi r2,0x801
80020b4: b9 60 08 00 mv r1,r11
80020b8: 38 42 4a 58 ori r2,r2,0x4a58
80020bc: f8 00 30 4a calli 800e1e4 <fopen>
80020c0: b8 20 58 00 mv r11,r1
80020c4: 44 2c 00 07 be r1,r12,80020e0 <init_etc_passwd_group+0x8c> <== NEVER TAKEN
fprintf(fp, "root:*:0:0:root::/:/bin/sh\n"
80020c8: 78 01 08 01 mvhi r1,0x801
80020cc: 38 21 4a 5c ori r1,r1,0x4a5c
80020d0: b9 60 10 00 mv r2,r11
80020d4: f8 00 30 7b calli 800e2c0 <fputs>
"rtems:*:1:1:RTEMS Application::/:/bin/sh\n"
"tty:!:2:2:tty owner::/:/bin/false\n" );
fclose(fp);
80020d8: b9 60 08 00 mv r1,r11
80020dc: f8 00 2e 13 calli 800d928 <fclose>
}
/*
* Initialize /etc/group
*/
if ((fp = fopen("/etc/group", "r")) != NULL) {
80020e0: 78 0b 08 01 mvhi r11,0x801
80020e4: 39 6b 4a c4 ori r11,r11,0x4ac4
80020e8: 78 02 08 01 mvhi r2,0x801
80020ec: b9 60 08 00 mv r1,r11
80020f0: 38 42 4a 54 ori r2,r2,0x4a54
80020f4: f8 00 30 3c calli 800e1e4 <fopen>
80020f8: b8 20 60 00 mv r12,r1
80020fc: 5c 20 00 0c bne r1,r0,800212c <init_etc_passwd_group+0xd8>
fclose(fp);
}
else if ((fp = fopen("/etc/group", "w")) != NULL) {
8002100: 78 02 08 01 mvhi r2,0x801
8002104: b9 60 08 00 mv r1,r11
8002108: 38 42 4a 58 ori r2,r2,0x4a58
800210c: f8 00 30 36 calli 800e1e4 <fopen>
8002110: b8 20 58 00 mv r11,r1
8002114: 44 2c 00 07 be r1,r12,8002130 <init_etc_passwd_group+0xdc> <== NEVER TAKEN
fprintf( fp, "root:x:0:root\n"
8002118: 78 01 08 01 mvhi r1,0x801
800211c: 38 21 4a d0 ori r1,r1,0x4ad0
8002120: b9 60 10 00 mv r2,r11
8002124: f8 00 30 67 calli 800e2c0 <fputs>
"rtems:x:1:rtems\n"
"tty:x:2:tty\n" );
fclose(fp);
8002128: b9 60 08 00 mv r1,r11
800212c: f8 00 2d ff calli 800d928 <fclose>
}
}
8002130: 2b 9d 00 04 lw ra,(sp+4)
8002134: 2b 8b 00 10 lw r11,(sp+16)
8002138: 2b 8c 00 0c lw r12,(sp+12)
800213c: 2b 8d 00 08 lw r13,(sp+8)
8002140: 37 9c 00 10 addi sp,sp,16
8002144: c3 a0 00 00 ret
080058f0 <iproc>:
/*
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
80058f0: 37 9c ff f4 addi sp,sp,-12
80058f4: 5b 8b 00 0c sw (sp+12),r11
80058f8: 5b 8c 00 08 sw (sp+8),r12
80058fc: 5b 9d 00 04 sw (sp+4),ra
8005900: b8 40 58 00 mv r11,r2
if (tty->termios.c_iflag & ISTRIP)
8005904: 28 42 00 30 lw r2,(r2+48)
/*
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
8005908: b8 20 60 00 mv r12,r1
if (tty->termios.c_iflag & ISTRIP)
800590c: 20 41 00 20 andi r1,r2,0x20
8005910: 44 20 00 02 be r1,r0,8005918 <iproc+0x28> <== ALWAYS TAKEN
c &= 0x7f;
8005914: 21 8c 00 7f andi r12,r12,0x7f <== NOT EXECUTED
if (tty->termios.c_iflag & IUCLC)
8005918: 20 41 02 00 andi r1,r2,0x200
800591c: 44 20 00 0b be r1,r0,8005948 <iproc+0x58>
c = tolower (c);
8005920: 78 01 08 02 mvhi r1,0x802
8005924: 38 21 34 10 ori r1,r1,0x3410
8005928: 28 21 00 00 lw r1,(r1+0)
800592c: b4 2c 08 00 add r1,r1,r12
8005930: 40 23 00 01 lbu r3,(r1+1)
8005934: 34 01 00 01 mvi r1,1
8005938: 20 63 00 03 andi r3,r3,0x3
800593c: 5c 61 00 02 bne r3,r1,8005944 <iproc+0x54>
8005940: 35 8c 00 20 addi r12,r12,32
8005944: 21 8c 00 ff andi r12,r12,0xff
if (c == '\r') {
8005948: 34 01 00 0d mvi r1,13
800594c: 5d 81 00 08 bne r12,r1,800596c <iproc+0x7c>
if (tty->termios.c_iflag & IGNCR)
8005950: 20 43 00 80 andi r3,r2,0x80
return 0;
8005954: 34 01 00 00 mvi r1,0
if (tty->termios.c_iflag & IUCLC)
c = tolower (c);
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
8005958: 5c 60 00 4e bne r3,r0,8005a90 <iproc+0x1a0> <== NEVER TAKEN
return 0;
if (tty->termios.c_iflag & ICRNL)
800595c: 20 42 01 00 andi r2,r2,0x100
8005960: 44 43 00 0a be r2,r3,8005988 <iproc+0x98> <== NEVER TAKEN
c = '\n';
8005964: 34 0c 00 0a mvi r12,10
8005968: e0 00 00 08 bi 8005988 <iproc+0x98>
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
800596c: 34 01 00 0a mvi r1,10
8005970: 5d 81 00 05 bne r12,r1,8005984 <iproc+0x94>
8005974: 20 42 00 40 andi r2,r2,0x40
8005978: 44 40 00 04 be r2,r0,8005988 <iproc+0x98> <== ALWAYS TAKEN
c = '\r';
800597c: 34 0c 00 0d mvi r12,13 <== NOT EXECUTED
8005980: e0 00 00 02 bi 8005988 <iproc+0x98> <== NOT EXECUTED
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
8005984: 45 80 00 2f be r12,r0,8005a40 <iproc+0x150> <== NEVER TAKEN
8005988: 29 62 00 3c lw r2,(r11+60)
800598c: 20 41 00 02 andi r1,r2,0x2
8005990: 44 20 00 2c be r1,r0,8005a40 <iproc+0x150>
if (c == tty->termios.c_cc[VERASE]) {
8005994: 41 61 00 43 lbu r1,(r11+67)
8005998: 5c 2c 00 04 bne r1,r12,80059a8 <iproc+0xb8>
erase (tty, 0);
800599c: b9 60 08 00 mv r1,r11
80059a0: 34 02 00 00 mvi r2,0
80059a4: e0 00 00 05 bi 80059b8 <iproc+0xc8>
return 0;
}
else if (c == tty->termios.c_cc[VKILL]) {
80059a8: 41 61 00 44 lbu r1,(r11+68)
80059ac: 5c 2c 00 05 bne r1,r12,80059c0 <iproc+0xd0>
erase (tty, 1);
80059b0: b9 60 08 00 mv r1,r11
80059b4: 34 02 00 01 mvi r2,1
80059b8: fb ff ff 4c calli 80056e8 <erase>
80059bc: e0 00 00 34 bi 8005a8c <iproc+0x19c>
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
80059c0: 41 63 00 45 lbu r3,(r11+69)
return 1;
80059c4: 34 01 00 01 mvi r1,1
}
else if (c == tty->termios.c_cc[VKILL]) {
erase (tty, 1);
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
80059c8: 44 6c 00 32 be r3,r12,8005a90 <iproc+0x1a0> <== NEVER TAKEN
return 1;
} else if (c == '\n') {
80059cc: 34 01 00 0a mvi r1,10
80059d0: 5d 81 00 0b bne r12,r1,80059fc <iproc+0x10c>
if (tty->termios.c_lflag & (ECHO | ECHONL))
80059d4: 20 42 00 48 andi r2,r2,0x48
80059d8: 44 40 00 03 be r2,r0,80059e4 <iproc+0xf4> <== NEVER TAKEN
echo (c, tty);
80059dc: b9 60 10 00 mv r2,r11
80059e0: fb ff ff 1d calli 8005654 <echo>
tty->cbuf[tty->ccount++] = c;
80059e4: 29 61 00 20 lw r1,(r11+32)
80059e8: 29 62 00 1c lw r2,(r11+28)
80059ec: 34 03 00 0a mvi r3,10
80059f0: b4 41 10 00 add r2,r2,r1
80059f4: 30 43 00 00 sb (r2+0),r3
80059f8: e0 00 00 0e bi 8005a30 <iproc+0x140>
return 1;
} else if ((c == tty->termios.c_cc[VEOL]) ||
80059fc: 41 61 00 4c lbu r1,(r11+76)
8005a00: 44 2c 00 03 be r1,r12,8005a0c <iproc+0x11c> <== NEVER TAKEN
8005a04: 41 61 00 51 lbu r1,(r11+81)
8005a08: 5c 2c 00 0e bne r1,r12,8005a40 <iproc+0x150> <== ALWAYS TAKEN
(c == tty->termios.c_cc[VEOL2])) {
if (tty->termios.c_lflag & ECHO)
8005a0c: 20 42 00 08 andi r2,r2,0x8 <== NOT EXECUTED
8005a10: 44 40 00 04 be r2,r0,8005a20 <iproc+0x130> <== NOT EXECUTED
echo (c, tty);
8005a14: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8005a18: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8005a1c: fb ff ff 0e calli 8005654 <echo> <== NOT EXECUTED
tty->cbuf[tty->ccount++] = c;
8005a20: 29 61 00 20 lw r1,(r11+32) <== NOT EXECUTED
8005a24: 29 62 00 1c lw r2,(r11+28) <== NOT EXECUTED
8005a28: b4 41 10 00 add r2,r2,r1 <== NOT EXECUTED
8005a2c: 30 4c 00 00 sb (r2+0),r12 <== NOT EXECUTED
8005a30: 34 21 00 01 addi r1,r1,1
8005a34: 59 61 00 20 sw (r11+32),r1
return 1;
8005a38: 34 01 00 01 mvi r1,1
8005a3c: e0 00 00 15 bi 8005a90 <iproc+0x1a0>
}
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
8005a40: 78 01 08 02 mvhi r1,0x802
8005a44: 38 21 33 40 ori r1,r1,0x3340
8005a48: 28 22 00 00 lw r2,(r1+0)
8005a4c: 29 63 00 20 lw r3,(r11+32)
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
}
return 0;
8005a50: 34 01 00 00 mvi r1,0
}
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
8005a54: 34 42 ff ff addi r2,r2,-1
8005a58: 4c 62 00 0e bge r3,r2,8005a90 <iproc+0x1a0> <== NEVER TAKEN
if (tty->termios.c_lflag & ECHO)
8005a5c: 29 61 00 3c lw r1,(r11+60)
8005a60: 20 21 00 08 andi r1,r1,0x8
8005a64: 44 20 00 04 be r1,r0,8005a74 <iproc+0x184> <== NEVER TAKEN
echo (c, tty);
8005a68: b9 80 08 00 mv r1,r12
8005a6c: b9 60 10 00 mv r2,r11
8005a70: fb ff fe f9 calli 8005654 <echo>
tty->cbuf[tty->ccount++] = c;
8005a74: 29 61 00 20 lw r1,(r11+32)
8005a78: 29 62 00 1c lw r2,(r11+28)
8005a7c: b4 41 10 00 add r2,r2,r1
8005a80: 30 4c 00 00 sb (r2+0),r12
8005a84: 34 21 00 01 addi r1,r1,1
8005a88: 59 61 00 20 sw (r11+32),r1
}
return 0;
8005a8c: 34 01 00 00 mvi r1,0
}
8005a90: 2b 9d 00 04 lw ra,(sp+4)
8005a94: 2b 8b 00 0c lw r11,(sp+12)
8005a98: 2b 8c 00 08 lw r12,(sp+8)
8005a9c: 37 9c 00 0c addi sp,sp,12
8005aa0: c3 a0 00 00 ret
080251ac <killinfo>:
int killinfo(
pid_t pid,
int sig,
const union sigval *value
)
{
80251ac: 37 9c ff dc addi sp,sp,-36
80251b0: 5b 8b 00 18 sw (sp+24),r11
80251b4: 5b 8c 00 14 sw (sp+20),r12
80251b8: 5b 8d 00 10 sw (sp+16),r13
80251bc: 5b 8e 00 0c sw (sp+12),r14
80251c0: 5b 8f 00 08 sw (sp+8),r15
80251c4: 5b 9d 00 04 sw (sp+4),ra
80251c8: b8 20 60 00 mv r12,r1
80251cc: b8 40 58 00 mv r11,r2
80251d0: b8 60 68 00 mv r13,r3
POSIX_signals_Siginfo_node *psiginfo;
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid != getpid() )
80251d4: fb ff fe e8 calli 8024d74 <getpid>
80251d8: 45 81 00 04 be r12,r1,80251e8 <killinfo+0x3c>
rtems_set_errno_and_return_minus_one( ESRCH );
80251dc: fb ff b7 8b calli 8013008 <__errno>
80251e0: 34 02 00 03 mvi r2,3
80251e4: e0 00 00 04 bi 80251f4 <killinfo+0x48>
/*
* Validate the signal passed.
*/
if ( !sig )
80251e8: 5d 60 00 06 bne r11,r0,8025200 <killinfo+0x54>
rtems_set_errno_and_return_minus_one( EINVAL );
80251ec: fb ff b7 87 calli 8013008 <__errno>
80251f0: 34 02 00 16 mvi r2,22
80251f4: 58 22 00 00 sw (r1+0),r2
80251f8: 34 01 ff ff mvi r1,-1
80251fc: e0 00 00 9f bi 8025478 <killinfo+0x2cc>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
8025200: 35 6f ff ff addi r15,r11,-1
if ( !is_valid_signo(sig) )
8025204: 34 01 00 1f mvi r1,31
8025208: 50 2f 00 02 bgeu r1,r15,8025210 <killinfo+0x64>
802520c: e3 ff ff f8 bi 80251ec <killinfo+0x40>
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 )
8025210: 34 02 00 01 mvi r2,1
8025214: b9 60 08 00 mv r1,r11
8025218: fb ff 73 22 calli 8001ea0 <__ashlsi3>
802521c: 34 02 00 02 mvi r2,2
8025220: 78 0c 08 02 mvhi r12,0x802
8025224: b4 2b 08 00 add r1,r1,r11
8025228: fb ff 73 1e calli 8001ea0 <__ashlsi3>
802522c: 39 8c 9f 40 ori r12,r12,0x9f40
8025230: b5 81 08 00 add r1,r12,r1
8025234: 28 22 00 08 lw r2,(r1+8)
8025238: 34 0e 00 01 mvi r14,1
return 0;
802523c: 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 )
8025240: 44 4e 00 8e be r2,r14,8025478 <killinfo+0x2cc>
/*
* 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 ) )
8025244: 65 62 00 04 cmpei r2,r11,4
8025248: 65 61 00 08 cmpei r1,r11,8
802524c: b8 41 08 00 or r1,r2,r1
8025250: 5c 20 00 03 bne r1,r0,802525c <killinfo+0xb0>
8025254: 34 01 00 0b mvi r1,11
8025258: 5d 61 00 05 bne r11,r1,802526c <killinfo+0xc0>
return pthread_kill( pthread_self(), sig );
802525c: f8 00 01 3a calli 8025744 <pthread_self>
8025260: b9 60 10 00 mv r2,r11
8025264: f8 00 00 f3 calli 8025630 <pthread_kill>
8025268: e0 00 00 84 bi 8025478 <killinfo+0x2cc>
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
802526c: 34 01 00 01 mvi r1,1
8025270: b9 e0 10 00 mv r2,r15
8025274: fb ff 73 0b calli 8001ea0 <__ashlsi3>
/*
* Build up a siginfo structure
*/
siginfo = &siginfo_struct;
siginfo->si_signo = sig;
8025278: 5b 8b 00 1c sw (sp+28),r11
siginfo->si_code = SI_USER;
802527c: 5b 8e 00 20 sw (sp+32),r14
8025280: b8 20 60 00 mv r12,r1
if ( !value ) {
8025284: 5d a0 00 03 bne r13,r0,8025290 <killinfo+0xe4>
siginfo->si_value.sival_int = 0;
8025288: 5b 80 00 24 sw (sp+36),r0
802528c: e0 00 00 03 bi 8025298 <killinfo+0xec>
} else {
siginfo->si_value = *value;
8025290: 29 a1 00 00 lw r1,(r13+0)
8025294: 5b 81 00 24 sw (sp+36),r1
8025298: 78 01 08 02 mvhi r1,0x802
802529c: 38 21 9a 20 ori r1,r1,0x9a20
80252a0: 28 22 00 00 lw r2,(r1+0)
80252a4: 34 42 00 01 addi r2,r2,1
80252a8: 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;
80252ac: 78 01 08 02 mvhi r1,0x802
80252b0: 38 21 9e f0 ori r1,r1,0x9ef0
80252b4: 28 23 00 0c lw r3,(r1+12)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) {
80252b8: 28 61 01 20 lw r1,(r3+288)
80252bc: 28 21 00 d0 lw r1,(r1+208)
80252c0: a4 20 08 00 not r1,r1
80252c4: a1 81 08 00 and r1,r12,r1
80252c8: 5c 20 00 3f bne r1,r0,80253c4 <killinfo+0x218>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
return 0;
}
80252cc: 78 01 08 02 mvhi r1,0x802
80252d0: 38 21 a0 cc ori r1,r1,0xa0cc
80252d4: 28 22 00 00 lw r2,(r1+0)
/* XXX violation of visibility -- need to define thread queue support */
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
80252d8: 78 01 08 02 mvhi r1,0x802
80252dc: 38 21 a0 d0 ori r1,r1,0xa0d0
80252e0: e0 00 00 0b bi 802530c <killinfo+0x160>
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
80252e4: 28 44 00 30 lw r4,(r2+48)
for ( the_node = _Chain_First( the_chain );
!_Chain_Is_tail( the_chain, the_node ) ;
the_node = the_node->next ) {
the_thread = (Thread_Control *)the_node;
80252e8: b8 40 18 00 mv r3,r2
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
80252ec: 28 45 01 20 lw r5,(r2+288)
#endif
/*
* Is this thread is actually blocked waiting for the signal?
*/
if (the_thread->Wait.option & mask)
80252f0: a1 84 20 00 and r4,r12,r4
80252f4: 5c 80 00 34 bne r4,r0,80253c4 <killinfo+0x218>
/*
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
if (~api->signals_blocked & mask)
80252f8: 28 a5 00 d0 lw r5,(r5+208)
80252fc: a4 a0 28 00 not r5,r5
8025300: a1 85 28 00 and r5,r12,r5
8025304: 5c a4 00 30 bne r5,r4,80253c4 <killinfo+0x218>
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 ) {
8025308: 28 42 00 00 lw r2,(r2+0)
/* XXX violation of visibility -- need to define thread queue support */
the_chain = &_POSIX_signals_Wait_queue.Queues.Fifo;
for ( the_node = _Chain_First( the_chain );
802530c: 5c 41 ff f6 bne r2,r1,80252e4 <killinfo+0x138>
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
8025310: 78 01 08 02 mvhi r1,0x802
8025314: 38 21 90 c0 ori r1,r1,0x90c0
8025318: 40 21 00 00 lbu r1,(r1+0)
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
802531c: 78 02 08 02 mvhi r2,0x802
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
8025320: 78 04 08 02 mvhi r4,0x802
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
8025324: 38 42 99 bc ori r2,r2,0x99bc
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
8025328: 34 21 00 01 addi r1,r1,1
802532c: 38 84 99 c4 ori r4,r4,0x99c4
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
( ~(_api)->signals_blocked & (_mask) )
int killinfo(
8025330: 34 4d 00 10 addi r13,r2,16
*
* NOTES:
*
* + rtems internal threads do not receive signals.
*/
interested = NULL;
8025334: 34 03 00 00 mvi r3,0
*/
RTEMS_INLINE_ROUTINE bool _States_Is_interruptible_by_signal (
States_Control the_states
)
{
return (the_states & STATES_INTERRUPTIBLE_BY_SIGNAL);
8025338: 78 08 10 00 mvhi r8,0x1000
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
/*
* This can occur when no one is interested and an API is not configured.
*/
if ( !_Objects_Information_table[ the_api ] )
802533c: 28 85 00 00 lw r5,(r4+0)
8025340: 44 a0 00 1e be r5,r0,80253b8 <killinfo+0x20c> <== NEVER TAKEN
continue;
the_info = _Objects_Information_table[ the_api ][ 1 ];
8025344: 28 a5 00 04 lw r5,(r5+4)
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
8025348: 34 06 00 01 mvi r6,1
*/
if ( !the_info )
continue;
#endif
maximum = the_info->maximum;
802534c: 2c ae 00 10 lhu r14,(r5+16)
8025350: 28 a7 00 1c lw r7,(r5+28)
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
8025354: e0 00 00 18 bi 80253b4 <killinfo+0x208>
the_thread = (Thread_Control *) object_table[ index ];
8025358: 28 e2 00 04 lw r2,(r7+4)
if ( !the_thread )
802535c: 44 40 00 14 be r2,r0,80253ac <killinfo+0x200>
/*
* If this thread is of lower priority than the interested thread,
* go on to the next thread.
*/
if ( the_thread->current_priority > interested_priority )
8025360: 28 45 00 14 lw r5,(r2+20)
8025364: 54 a1 00 12 bgu r5,r1,80253ac <killinfo+0x200>
#if defined(RTEMS_DEBUG)
if ( !api )
continue;
#endif
if ( !_POSIX_signals_Is_interested( api, mask ) )
8025368: 28 49 01 20 lw r9,(r2+288)
802536c: 29 29 00 d0 lw r9,(r9+208)
8025370: a5 20 48 00 not r9,r9
8025374: a1 89 48 00 and r9,r12,r9
8025378: 45 20 00 0d be r9,r0,80253ac <killinfo+0x200>
*
* 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 ) {
802537c: 54 25 00 0a bgu r1,r5,80253a4 <killinfo+0x1f8>
* and blocking interruptibutable by signal.
*
* If the interested thread is ready, don't think about changing.
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
8025380: 44 60 00 0b be r3,r0,80253ac <killinfo+0x200> <== NEVER TAKEN
8025384: 28 69 00 10 lw r9,(r3+16)
8025388: 45 20 00 09 be r9,r0,80253ac <killinfo+0x200> <== NEVER TAKEN
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
802538c: 28 4a 00 10 lw r10,(r2+16)
8025390: 45 40 00 05 be r10,r0,80253a4 <killinfo+0x1f8>
8025394: a1 28 48 00 and r9,r9,r8
continue;
}
DEBUG_STEP("6");
/* prefer blocked/interruptible over blocked/not interruptible */
if ( !_States_Is_interruptible_by_signal(interested->current_state) ) {
8025398: 5d 20 00 05 bne r9,r0,80253ac <killinfo+0x200>
802539c: a1 48 50 00 and r10,r10,r8
DEBUG_STEP("7");
if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) {
80253a0: 45 49 00 03 be r10,r9,80253ac <killinfo+0x200>
*/
if ( interested && !_States_Is_ready( interested->current_state ) ) {
/* preferred ready over blocked */
DEBUG_STEP("5");
if ( _States_Is_ready( the_thread->current_state ) ) {
80253a4: b8 a0 08 00 mv r1,r5
80253a8: b8 40 18 00 mv r3,r2
#endif
maximum = the_info->maximum;
object_table = the_info->local_table;
for ( index = 1 ; index <= maximum ; index++ ) {
80253ac: 34 c6 00 01 addi r6,r6,1
80253b0: 34 e7 00 04 addi r7,r7,4
80253b4: 51 c6 ff e9 bgeu r14,r6,8025358 <killinfo+0x1ac>
80253b8: 34 84 00 04 addi r4,r4,4
* + rtems internal threads do not receive signals.
*/
interested = NULL;
interested_priority = PRIORITY_MAXIMUM + 1;
for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) {
80253bc: 5c 8d ff e0 bne r4,r13,802533c <killinfo+0x190>
}
}
}
}
if ( interested ) {
80253c0: 44 60 00 06 be r3,r0,80253d8 <killinfo+0x22c>
/*
* 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 ) ) {
80253c4: b8 60 08 00 mv r1,r3
80253c8: b9 60 10 00 mv r2,r11
80253cc: 37 83 00 1c addi r3,sp,28
80253d0: f8 00 00 3d calli 80254c4 <_POSIX_signals_Unblock_thread>
80253d4: 5c 20 00 27 bne r1,r0,8025470 <killinfo+0x2c4>
/*
* 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 );
80253d8: b9 80 08 00 mv r1,r12
80253dc: f8 00 00 2f calli 8025498 <_POSIX_signals_Set_process_signals>
if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
80253e0: b9 60 08 00 mv r1,r11
80253e4: 34 02 00 01 mvi r2,1
80253e8: fb ff 72 ae calli 8001ea0 <__ashlsi3>
80253ec: b4 2b 58 00 add r11,r1,r11
80253f0: 34 02 00 02 mvi r2,2
80253f4: 78 0c 08 02 mvhi r12,0x802
80253f8: b9 60 08 00 mv r1,r11
80253fc: fb ff 72 a9 calli 8001ea0 <__ashlsi3>
8025400: 39 8c 9f 40 ori r12,r12,0x9f40
8025404: b5 81 08 00 add r1,r12,r1
8025408: 28 22 00 00 lw r2,(r1+0)
802540c: 34 01 00 02 mvi r1,2
8025410: 5c 41 00 18 bne r2,r1,8025470 <killinfo+0x2c4>
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get( &_POSIX_signals_Inactive_siginfo );
8025414: 78 01 08 02 mvhi r1,0x802
8025418: 38 21 a0 c0 ori r1,r1,0xa0c0
802541c: fb ff 92 85 calli 8009e30 <_Chain_Get>
8025420: b8 20 60 00 mv r12,r1
if ( !psiginfo ) {
8025424: 5c 20 00 05 bne r1,r0,8025438 <killinfo+0x28c>
_Thread_Enable_dispatch();
8025428: fb ff 9a de calli 800bfa0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
802542c: fb ff b6 f7 calli 8013008 <__errno>
8025430: 34 02 00 0b mvi r2,11
8025434: e3 ff ff 70 bi 80251f4 <killinfo+0x48>
}
psiginfo->Info = *siginfo;
8025438: 2b 81 00 1c lw r1,(sp+28)
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
802543c: 34 02 00 02 mvi r2,2
if ( !psiginfo ) {
_Thread_Enable_dispatch();
rtems_set_errno_and_return_minus_one( EAGAIN );
}
psiginfo->Info = *siginfo;
8025440: 59 81 00 08 sw (r12+8),r1
8025444: 2b 81 00 20 lw r1,(sp+32)
8025448: 59 81 00 0c sw (r12+12),r1
802544c: 2b 81 00 24 lw r1,(sp+36)
8025450: 59 81 00 10 sw (r12+16),r1
_Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
8025454: b9 60 08 00 mv r1,r11
8025458: fb ff 72 92 calli 8001ea0 <__ashlsi3>
802545c: 78 02 08 02 mvhi r2,0x802
8025460: 38 42 a1 38 ori r2,r2,0xa138
8025464: b4 22 08 00 add r1,r1,r2
8025468: b9 80 10 00 mv r2,r12
802546c: fb ff 92 5b calli 8009dd8 <_Chain_Append>
}
DEBUG_STEP("\n");
_Thread_Enable_dispatch();
8025470: fb ff 9a cc calli 800bfa0 <_Thread_Enable_dispatch>
return 0;
8025474: 34 01 00 00 mvi r1,0
}
8025478: 2b 9d 00 04 lw ra,(sp+4)
802547c: 2b 8b 00 18 lw r11,(sp+24)
8025480: 2b 8c 00 14 lw r12,(sp+20)
8025484: 2b 8d 00 10 lw r13,(sp+16)
8025488: 2b 8e 00 0c lw r14,(sp+12)
802548c: 2b 8f 00 08 lw r15,(sp+8)
8025490: 37 9c 00 24 addi sp,sp,36
8025494: c3 a0 00 00 ret
08017520 <libc_wrapup>:
extern void _wrapup_reent(struct _reent *);
extern void _reclaim_reent(struct _reent *);
void libc_wrapup(void)
{
8017520: 37 9c ff f4 addi sp,sp,-12
8017524: 5b 8b 00 0c sw (sp+12),r11
8017528: 5b 8c 00 08 sw (sp+8),r12
801752c: 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()))
8017530: 78 01 08 01 mvhi r1,0x801
8017534: 38 21 9a 98 ori r1,r1,0x9a98
8017538: 28 22 00 00 lw r2,(r1+0)
801753c: 34 01 00 03 mvi r1,3
8017540: 5c 41 00 16 bne r2,r1,8017598 <libc_wrapup+0x78> <== NEVER TAKEN
/*
* This was already done if the user called exit() directly .
_wrapup_reent(0);
*/
if (_REENT != _global_impure_ptr) {
8017544: 78 01 08 01 mvhi r1,0x801
8017548: 78 0b 08 01 mvhi r11,0x801
801754c: 38 21 86 68 ori r1,r1,0x8668
8017550: 39 6b 91 e0 ori r11,r11,0x91e0
8017554: 28 2c 00 00 lw r12,(r1+0)
8017558: 29 61 00 00 lw r1,(r11+0)
801755c: 44 2c 00 04 be r1,r12,801756c <libc_wrapup+0x4c>
_wrapup_reent(_global_impure_ptr);
8017560: b9 80 08 00 mv r1,r12
8017564: f8 00 01 1c calli 80179d4 <_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;
8017568: 59 6c 00 00 sw (r11+0),r12
*
* Should this be changed to do *all* file streams?
* _fwalk (_REENT, fclose);
*/
fclose (stdin);
801756c: 78 0b 08 01 mvhi r11,0x801
8017570: 39 6b 91 e0 ori r11,r11,0x91e0
8017574: 29 61 00 00 lw r1,(r11+0)
8017578: 28 21 00 04 lw r1,(r1+4)
801757c: fb ff e8 1d calli 80115f0 <fclose>
fclose (stdout);
8017580: 29 61 00 00 lw r1,(r11+0)
8017584: 28 21 00 08 lw r1,(r1+8)
8017588: fb ff e8 1a calli 80115f0 <fclose>
fclose (stderr);
801758c: 29 61 00 00 lw r1,(r11+0)
8017590: 28 21 00 0c lw r1,(r1+12)
8017594: fb ff e8 17 calli 80115f0 <fclose>
}
8017598: 2b 9d 00 04 lw ra,(sp+4)
801759c: 2b 8b 00 0c lw r11,(sp+12)
80175a0: 2b 8c 00 08 lw r12,(sp+8)
80175a4: 37 9c 00 0c addi sp,sp,12
80175a8: c3 a0 00 00 ret
08002aa8 <malloc>:
#include "malloc_p.h"
void *malloc(
size_t size
)
{
8002aa8: 37 9c ff f4 addi sp,sp,-12
8002aac: 5b 8b 00 0c sw (sp+12),r11
8002ab0: 5b 8c 00 08 sw (sp+8),r12
8002ab4: 5b 9d 00 04 sw (sp+4),ra
void *return_this;
MSBUMP(malloc_calls, 1);
8002ab8: 78 03 08 01 mvhi r3,0x801
8002abc: 38 63 98 00 ori r3,r3,0x9800
#include "malloc_p.h"
void *malloc(
size_t size
)
{
8002ac0: b8 20 60 00 mv r12,r1
void *return_this;
MSBUMP(malloc_calls, 1);
8002ac4: 28 61 00 04 lw r1,(r3+4)
/*
* Validate the parameters
*/
if ( !size )
return (void *) 0;
8002ac8: 34 0b 00 00 mvi r11,0
size_t size
)
{
void *return_this;
MSBUMP(malloc_calls, 1);
8002acc: 34 21 00 01 addi r1,r1,1
8002ad0: 58 61 00 04 sw (r3+4),r1
/*
* If some free's have been deferred, then do them now.
*/
malloc_deferred_frees_process();
8002ad4: fb ff ff 9d calli 8002948 <malloc_deferred_frees_process>
/*
* Validate the parameters
*/
if ( !size )
8002ad8: 45 80 00 2d be r12,r0,8002b8c <malloc+0xe4>
return (void *) 0;
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
8002adc: 78 01 08 01 mvhi r1,0x801
8002ae0: 38 21 9a 98 ori r1,r1,0x9a98
8002ae4: 28 22 00 00 lw r2,(r1+0)
8002ae8: 34 01 00 03 mvi r1,3
8002aec: 5c 41 00 03 bne r2,r1,8002af8 <malloc+0x50>
!malloc_is_system_state_OK() )
8002af0: fb ff ff 84 calli 8002900 <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()) &&
8002af4: 44 20 00 26 be r1,r0,8002b8c <malloc+0xe4> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE void *_Protected_heap_Allocate(
Heap_Control *heap,
uintptr_t size
)
{
return _Protected_heap_Allocate_aligned_with_boundary( heap, size, 0, 0 );
8002af8: 78 01 08 01 mvhi r1,0x801
8002afc: 38 21 90 1c ori r1,r1,0x901c
8002b00: 28 21 00 00 lw r1,(r1+0)
8002b04: b9 80 10 00 mv r2,r12
8002b08: 34 03 00 00 mvi r3,0
8002b0c: 34 04 00 00 mvi r4,0
8002b10: f8 00 0d 02 calli 8005f18 <_Protected_heap_Allocate_aligned_with_boundary>
8002b14: 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 ) {
8002b18: 5c 20 00 0f bne r1,r0,8002b54 <malloc+0xac>
if (rtems_malloc_sbrk_helpers)
8002b1c: 78 01 08 01 mvhi r1,0x801
8002b20: 38 21 96 84 ori r1,r1,0x9684
8002b24: 28 21 00 00 lw r1,(r1+0)
8002b28: 44 2b 00 06 be r1,r11,8002b40 <malloc+0x98>
return_this = (*rtems_malloc_sbrk_helpers->extend)( size );
8002b2c: 28 22 00 04 lw r2,(r1+4)
8002b30: b9 80 08 00 mv r1,r12
8002b34: d8 40 00 00 call r2
8002b38: b8 20 58 00 mv r11,r1
if ( !return_this ) {
8002b3c: 5c 20 00 06 bne r1,r0,8002b54 <malloc+0xac>
errno = ENOMEM;
8002b40: f8 00 3a 4c calli 8011470 <__errno>
8002b44: 34 02 00 0c mvi r2,12
8002b48: 58 22 00 00 sw (r1+0),r2
return (void *) 0;
8002b4c: 34 0b 00 00 mvi r11,0
8002b50: e0 00 00 0f bi 8002b8c <malloc+0xe4>
}
/*
* If the user wants us to dirty the allocated memory, then do it.
*/
if ( rtems_malloc_dirty_helper )
8002b54: 78 01 08 01 mvhi r1,0x801
8002b58: 38 21 96 88 ori r1,r1,0x9688
8002b5c: 28 23 00 00 lw r3,(r1+0)
8002b60: 44 60 00 04 be r3,r0,8002b70 <malloc+0xc8>
(*rtems_malloc_dirty_helper)( return_this, size );
8002b64: b9 60 08 00 mv r1,r11
8002b68: b9 80 10 00 mv r2,r12
8002b6c: d8 60 00 00 call r3
/*
* If configured, update the statistics
*/
if ( rtems_malloc_statistics_helpers )
8002b70: 78 01 08 01 mvhi r1,0x801
8002b74: 38 21 96 80 ori r1,r1,0x9680
8002b78: 28 21 00 00 lw r1,(r1+0)
8002b7c: 44 20 00 04 be r1,r0,8002b8c <malloc+0xe4>
(*rtems_malloc_statistics_helpers->at_malloc)(return_this);
8002b80: 28 22 00 04 lw r2,(r1+4)
8002b84: b9 60 08 00 mv r1,r11
8002b88: d8 40 00 00 call r2
return return_this;
}
8002b8c: b9 60 08 00 mv r1,r11
8002b90: 2b 9d 00 04 lw ra,(sp+4)
8002b94: 2b 8b 00 0c lw r11,(sp+12)
8002b98: 2b 8c 00 08 lw r12,(sp+8)
8002b9c: 37 9c 00 0c addi sp,sp,12
8002ba0: c3 a0 00 00 ret
08001afc <malloc_sbrk_extend_and_allocate>:
}
void *malloc_sbrk_extend_and_allocate(
size_t size
)
{
8001afc: 37 9c ff ec addi sp,sp,-20
8001b00: 5b 8b 00 14 sw (sp+20),r11
8001b04: 5b 8c 00 10 sw (sp+16),r12
8001b08: 5b 8d 00 0c sw (sp+12),r13
8001b0c: 5b 8e 00 08 sw (sp+8),r14
8001b10: 5b 9d 00 04 sw (sp+4),ra
* Round to the "requested sbrk amount" so hopefully we won't have
* to grow again for a while. This effectively does sbrk() calls
* in "page" amounts.
*/
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
8001b14: 78 03 08 01 mvhi r3,0x801
8001b18: 38 63 48 b0 ori r3,r3,0x48b0
8001b1c: 28 6b 00 00 lw r11,(r3+0)
}
void *malloc_sbrk_extend_and_allocate(
size_t size
)
{
8001b20: b8 20 70 00 mv r14,r1
*/
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
if ( sbrk_amount == 0 )
return (void *) 0;
8001b24: 34 0d 00 00 mvi r13,0
* in "page" amounts.
*/
sbrk_amount = RTEMS_Malloc_Sbrk_amount;
if ( sbrk_amount == 0 )
8001b28: 45 60 00 22 be r11,r0,8001bb0 <malloc_sbrk_extend_and_allocate+0xb4><== NEVER TAKEN
return (void *) 0;
the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount);
8001b2c: b9 60 10 00 mv r2,r11
8001b30: b4 2b 08 00 add r1,r1,r11
8001b34: f8 00 41 d6 calli 801228c <__udivsi3>
8001b38: b9 60 10 00 mv r2,r11
8001b3c: f8 00 41 6f calli 80120f8 <__mulsi3>
8001b40: b8 20 60 00 mv r12,r1
starting_address = (void *) sbrk(the_size);
8001b44: fb ff fa 34 calli 8000414 <sbrk>
8001b48: b8 20 10 00 mv r2,r1
if ( starting_address == (void*) -1 )
8001b4c: 34 01 ff ff mvi r1,-1
8001b50: 44 41 00 18 be r2,r1,8001bb0 <malloc_sbrk_extend_and_allocate+0xb4>
return (void *) 0;
if ( !_Protected_heap_Extend(
8001b54: 78 0b 08 01 mvhi r11,0x801
8001b58: 39 6b 40 1c ori r11,r11,0x401c
8001b5c: 29 61 00 00 lw r1,(r11+0)
8001b60: b9 80 18 00 mv r3,r12
8001b64: f8 00 0c 7e calli 8004d5c <_Protected_heap_Extend>
8001b68: 5c 20 00 07 bne r1,r0,8001b84 <malloc_sbrk_extend_and_allocate+0x88>
RTEMS_Malloc_Heap, starting_address, the_size) ) {
sbrk(-the_size);
8001b6c: c8 0c 08 00 sub r1,r0,r12
8001b70: fb ff fa 29 calli 8000414 <sbrk>
errno = ENOMEM;
8001b74: f8 00 2c 29 calli 800cc18 <__errno>
8001b78: 34 02 00 0c mvi r2,12
8001b7c: 58 22 00 00 sw (r1+0),r2
return (void *) 0;
8001b80: e0 00 00 0c bi 8001bb0 <malloc_sbrk_extend_and_allocate+0xb4>
}
MSBUMP(space_available, the_size);
8001b84: 78 04 08 01 mvhi r4,0x801
8001b88: 38 84 48 80 ori r4,r4,0x4880
8001b8c: 28 81 00 00 lw r1,(r4+0)
8001b90: b9 c0 10 00 mv r2,r14
8001b94: 34 03 00 00 mvi r3,0
8001b98: b5 81 60 00 add r12,r12,r1
8001b9c: 29 61 00 00 lw r1,(r11+0)
8001ba0: 58 8c 00 00 sw (r4+0),r12
8001ba4: 34 04 00 00 mvi r4,0
8001ba8: f8 00 0c 53 calli 8004cf4 <_Protected_heap_Allocate_aligned_with_boundary>
8001bac: b8 20 68 00 mv r13,r1
return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size );
return return_this;
}
8001bb0: b9 a0 08 00 mv r1,r13
8001bb4: 2b 9d 00 04 lw ra,(sp+4)
8001bb8: 2b 8b 00 14 lw r11,(sp+20)
8001bbc: 2b 8c 00 10 lw r12,(sp+16)
8001bc0: 2b 8d 00 0c lw r13,(sp+12)
8001bc4: 2b 8e 00 08 lw r14,(sp+8)
8001bc8: 37 9c 00 14 addi sp,sp,20
8001bcc: c3 a0 00 00 ret
08010194 <memfile_ftruncate>:
*/
int memfile_ftruncate(
rtems_libio_t *iop,
rtems_off64_t length
)
{
8010194: 37 9c ff f0 addi sp,sp,-16
8010198: 5b 8b 00 08 sw (sp+8),r11
801019c: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
80101a0: 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 )
80101a4: 29 64 00 50 lw r4,(r11+80)
80101a8: 48 44 00 05 bg r2,r4,80101bc <memfile_ftruncate+0x28> <== NEVER TAKEN
80101ac: 5c 82 00 08 bne r4,r2,80101cc <memfile_ftruncate+0x38> <== NEVER TAKEN
80101b0: 29 64 00 54 lw r4,(r11+84)
80101b4: 54 64 00 02 bgu r3,r4,80101bc <memfile_ftruncate+0x28>
80101b8: e0 00 00 05 bi 80101cc <memfile_ftruncate+0x38>
return IMFS_memfile_extend( the_jnode, length );
80101bc: b9 60 08 00 mv r1,r11
80101c0: b8 60 10 00 mv r2,r3
80101c4: fb ff fe ed calli 800fd78 <IMFS_memfile_extend>
80101c8: e0 00 00 0b bi 80101f4 <memfile_ftruncate+0x60>
/*
* 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;
80101cc: 59 62 00 50 sw (r11+80),r2
80101d0: 59 63 00 54 sw (r11+84),r3
iop->size = the_jnode->info.file.size;
80101d4: 58 22 00 08 sw (r1+8),r2
80101d8: 58 23 00 0c sw (r1+12),r3
IMFS_update_atime( the_jnode );
80101dc: 34 02 00 00 mvi r2,0
80101e0: 37 81 00 0c addi r1,sp,12
80101e4: fb ff c9 65 calli 8002778 <gettimeofday>
80101e8: 2b 81 00 0c lw r1,(sp+12)
80101ec: 59 61 00 40 sw (r11+64),r1
return 0;
80101f0: 34 01 00 00 mvi r1,0
}
80101f4: 2b 9d 00 04 lw ra,(sp+4)
80101f8: 2b 8b 00 08 lw r11,(sp+8)
80101fc: 37 9c 00 10 addi sp,sp,16
8010200: c3 a0 00 00 ret
08010204 <memfile_lseek>:
rtems_off64_t memfile_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
8010204: 37 9c ff f4 addi sp,sp,-12
8010208: 5b 8b 00 0c sw (sp+12),r11
801020c: 5b 8c 00 08 sw (sp+8),r12
8010210: 5b 9d 00 04 sw (sp+4),ra
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
8010214: 28 2c 00 1c lw r12,(r1+28)
rtems_off64_t memfile_lseek(
rtems_libio_t *iop,
rtems_off64_t offset,
int whence
)
{
8010218: 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) {
801021c: 34 01 00 06 mvi r1,6
8010220: 29 82 00 4c lw r2,(r12+76)
8010224: 5c 41 00 0c bne r2,r1,8010254 <memfile_lseek+0x50>
if (iop->offset > the_jnode->info.linearfile.size)
8010228: 29 81 00 50 lw r1,(r12+80)
801022c: 29 63 00 10 lw r3,(r11+16)
8010230: 29 82 00 54 lw r2,(r12+84)
8010234: 48 61 00 05 bg r3,r1,8010248 <memfile_lseek+0x44> <== NEVER TAKEN
8010238: 5c 61 00 15 bne r3,r1,801028c <memfile_lseek+0x88> <== NEVER TAKEN
801023c: 29 63 00 14 lw r3,(r11+20)
8010240: 54 62 00 02 bgu r3,r2,8010248 <memfile_lseek+0x44> <== NEVER TAKEN
8010244: e0 00 00 12 bi 801028c <memfile_lseek+0x88>
iop->offset = the_jnode->info.linearfile.size;
8010248: 59 61 00 10 sw (r11+16),r1 <== NOT EXECUTED
801024c: 59 62 00 14 sw (r11+20),r2 <== NOT EXECUTED
8010250: e0 00 00 0f bi 801028c <memfile_lseek+0x88> <== NOT EXECUTED
}
else { /* Must be a block file (IMFS_MEMORY_FILE). */
if (IMFS_memfile_extend( the_jnode, iop->offset ))
8010254: 29 62 00 14 lw r2,(r11+20)
8010258: b9 80 08 00 mv r1,r12
801025c: fb ff fe c7 calli 800fd78 <IMFS_memfile_extend>
8010260: 44 20 00 07 be r1,r0,801027c <memfile_lseek+0x78>
rtems_set_errno_and_return_minus_one( ENOSPC );
8010264: f8 00 04 83 calli 8011470 <__errno>
8010268: 34 02 00 1c mvi r2,28
801026c: 58 22 00 00 sw (r1+0),r2
8010270: 34 01 ff ff mvi r1,-1
8010274: 34 02 ff ff mvi r2,-1
8010278: e0 00 00 07 bi 8010294 <memfile_lseek+0x90>
iop->size = the_jnode->info.file.size;
801027c: 29 81 00 50 lw r1,(r12+80)
8010280: 59 61 00 08 sw (r11+8),r1
8010284: 29 81 00 54 lw r1,(r12+84)
8010288: 59 61 00 0c sw (r11+12),r1
}
return iop->offset;
801028c: 29 61 00 10 lw r1,(r11+16)
8010290: 29 62 00 14 lw r2,(r11+20)
}
8010294: 2b 9d 00 04 lw ra,(sp+4)
8010298: 2b 8b 00 0c lw r11,(sp+12)
801029c: 2b 8c 00 08 lw r12,(sp+8)
80102a0: 37 9c 00 0c addi sp,sp,12
80102a4: c3 a0 00 00 ret
080100e0 <memfile_open>:
rtems_libio_t *iop,
const char *pathname,
uint32_t flag,
uint32_t mode
)
{
80100e0: 37 9c ff f4 addi sp,sp,-12
80100e4: 5b 8b 00 0c sw (sp+12),r11
80100e8: 5b 8c 00 08 sw (sp+8),r12
80100ec: 5b 9d 00 04 sw (sp+4),ra
80100f0: b8 20 60 00 mv r12,r1
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
80100f4: 28 2b 00 1c lw r11,(r1+28)
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
80100f8: 28 21 00 18 lw r1,(r1+24)
80100fc: 20 21 02 04 andi r1,r1,0x204
8010100: 44 20 00 13 be r1,r0,801014c <memfile_open+0x6c>
&& (the_jnode->type == IMFS_LINEAR_FILE)) {
8010104: 29 62 00 4c lw r2,(r11+76)
8010108: 34 01 00 06 mvi r1,6
801010c: 5c 41 00 10 bne r2,r1,801014c <memfile_open+0x6c> <== ALWAYS TAKEN
uint32_t count = the_jnode->info.linearfile.size;
8010110: 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;
8010114: 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;
8010118: 29 63 00 58 lw r3,(r11+88) <== NOT EXECUTED
the_jnode->type = IMFS_MEMORY_FILE;
801011c: 59 61 00 4c sw (r11+76),r1 <== NOT EXECUTED
the_jnode->info.file.size = 0;
8010120: 59 60 00 50 sw (r11+80),r0 <== NOT EXECUTED
8010124: 59 60 00 54 sw (r11+84),r0 <== NOT EXECUTED
the_jnode->info.file.indirect = 0;
8010128: 59 60 00 58 sw (r11+88),r0 <== NOT EXECUTED
the_jnode->info.file.doubly_indirect = 0;
801012c: 59 60 00 5c sw (r11+92),r0 <== NOT EXECUTED
the_jnode->info.file.triply_indirect = 0;
8010130: 59 60 00 60 sw (r11+96),r0 <== NOT EXECUTED
if ((count != 0)
8010134: 44 80 00 06 be r4,r0,801014c <memfile_open+0x6c> <== NOT EXECUTED
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
8010138: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
801013c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8010140: fb ff ff 64 calli 800fed0 <IMFS_memfile_write> <== NOT EXECUTED
return -1;
8010144: 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))
8010148: 44 22 00 0d be r1,r2,801017c <memfile_open+0x9c> <== NOT EXECUTED
return -1;
}
if (iop->flags & LIBIO_FLAGS_APPEND)
801014c: 29 81 00 18 lw r1,(r12+24)
8010150: 20 21 02 00 andi r1,r1,0x200
8010154: 44 20 00 05 be r1,r0,8010168 <memfile_open+0x88>
iop->offset = the_jnode->info.file.size;
8010158: 29 61 00 50 lw r1,(r11+80)
801015c: 59 81 00 10 sw (r12+16),r1
8010160: 29 61 00 54 lw r1,(r11+84)
8010164: 59 81 00 14 sw (r12+20),r1
iop->size = the_jnode->info.file.size;
8010168: 29 61 00 50 lw r1,(r11+80)
return 0;
801016c: 34 02 00 00 mvi r2,0
return -1;
}
if (iop->flags & LIBIO_FLAGS_APPEND)
iop->offset = the_jnode->info.file.size;
iop->size = the_jnode->info.file.size;
8010170: 59 81 00 08 sw (r12+8),r1
8010174: 29 61 00 54 lw r1,(r11+84)
8010178: 59 81 00 0c sw (r12+12),r1
return 0;
}
801017c: b8 40 08 00 mv r1,r2
8010180: 2b 9d 00 04 lw ra,(sp+4)
8010184: 2b 8b 00 0c lw r11,(sp+12)
8010188: 2b 8c 00 08 lw r12,(sp+8)
801018c: 37 9c 00 0c addi sp,sp,12
8010190: c3 a0 00 00 ret
08002d70 <mount>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
8002d70: 37 9c ff b0 addi sp,sp,-80
8002d74: 5b 8b 00 3c sw (sp+60),r11
8002d78: 5b 8c 00 38 sw (sp+56),r12
8002d7c: 5b 8d 00 34 sw (sp+52),r13
8002d80: 5b 8e 00 30 sw (sp+48),r14
8002d84: 5b 8f 00 2c sw (sp+44),r15
8002d88: 5b 90 00 28 sw (sp+40),r16
8002d8c: 5b 91 00 24 sw (sp+36),r17
8002d90: 5b 92 00 20 sw (sp+32),r18
8002d94: 5b 93 00 1c sw (sp+28),r19
8002d98: 5b 94 00 18 sw (sp+24),r20
8002d9c: 5b 95 00 14 sw (sp+20),r21
8002da0: 5b 96 00 10 sw (sp+16),r22
8002da4: 5b 97 00 0c sw (sp+12),r23
8002da8: 5b 98 00 08 sw (sp+8),r24
8002dac: 5b 9d 00 04 sw (sp+4),ra
8002db0: b8 20 88 00 mv r17,r1
/*
* Are the file system options valid?
*/
if ( options != RTEMS_FILESYSTEM_READ_ONLY &&
8002db4: 34 01 00 01 mvi r1,1
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
8002db8: b8 40 78 00 mv r15,r2
8002dbc: b8 60 98 00 mv r19,r3
8002dc0: b8 80 b0 00 mv r22,r4
8002dc4: b8 a0 c0 00 mv r24,r5
/*
* Are the file system options valid?
*/
if ( options != RTEMS_FILESYSTEM_READ_ONLY &&
8002dc8: 50 24 00 02 bgeu r1,r4,8002dd0 <mount+0x60>
8002dcc: e0 00 00 05 bi 8002de0 <mount+0x70>
rtems_set_errno_and_return_minus_one( EINVAL );
/*
* Get mount handler
*/
mount_h = rtems_filesystem_get_mount_handler( filesystemtype );
8002dd0: b8 60 08 00 mv r1,r3
8002dd4: f8 00 27 10 calli 800ca14 <rtems_filesystem_get_mount_handler>
8002dd8: b8 20 a0 00 mv r20,r1
if ( !mount_h )
8002ddc: 5c 20 00 04 bne r1,r0,8002dec <mount+0x7c>
rtems_set_errno_and_return_minus_one( EINVAL );
8002de0: f8 00 39 a4 calli 8011470 <__errno>
8002de4: 34 02 00 16 mvi r2,22
8002de8: e0 00 00 37 bi 8002ec4 <mount+0x154>
{
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;
8002dec: 7d ee 00 00 cmpnei r14,r15,0
const char *target_or_null,
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
8002df0: b9 e0 60 00 mv r12,r15
8002df4: 5d c0 00 03 bne r14,r0,8002e00 <mount+0x90>
8002df8: 78 0c 08 01 mvhi r12,0x801
8002dfc: 39 8c 7e 48 ori r12,r12,0x7e48
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
8002e00: ba 60 08 00 mv r1,r19
8002e04: f8 00 3d fc calli 80125f4 <strlen>
8002e08: 34 30 00 01 addi r16,r1,1
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
8002e0c: 34 0d 00 00 mvi r13,0
8002e10: 46 20 00 04 be r17,r0,8002e20 <mount+0xb0>
8002e14: ba 20 08 00 mv r1,r17
8002e18: f8 00 3d f7 calli 80125f4 <strlen>
8002e1c: 34 2d 00 01 addi r13,r1,1
size_t target_size = strlen( target ) + 1;
8002e20: b9 80 08 00 mv r1,r12
8002e24: f8 00 3d f4 calli 80125f4 <strlen>
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
+ filesystemtype_size + source_size + target_size;
8002e28: 36 03 00 74 addi r3,r16,116
{
const char *target = target_or_null != NULL ? target_or_null : "/";
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
size_t target_size = strlen( target ) + 1;
8002e2c: 34 37 00 01 addi r23,r1,1
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
+ filesystemtype_size + source_size + target_size;
8002e30: b4 6d 18 00 add r3,r3,r13
{
const char *target = target_or_null != NULL ? target_or_null : "/";
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
size_t target_size = strlen( target ) + 1;
8002e34: b8 20 a8 00 mv r21,r1
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
+ filesystemtype_size + source_size + target_size;
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
8002e38: b4 77 10 00 add r2,r3,r23
8002e3c: 34 01 00 01 mvi r1,1
8002e40: fb ff fd 8f calli 800247c <calloc>
8002e44: b8 20 58 00 mv r11,r1
if ( mt_entry != NULL ) {
8002e48: 44 20 00 1d be r1,r0,8002ebc <mount+0x14c> <== NEVER TAKEN
char *str = (char *) mt_entry + sizeof( *mt_entry );
8002e4c: 34 32 00 74 addi r18,r1,116
memcpy( str, filesystemtype, filesystemtype_size );
8002e50: ba 00 18 00 mv r3,r16
8002e54: ba 60 10 00 mv r2,r19
8002e58: ba 40 08 00 mv r1,r18
8002e5c: f8 00 3c 3b calli 8011f48 <memcpy>
mt_entry->type = str;
str += filesystemtype_size;
8002e60: b6 50 80 00 add r16,r18,r16
memcpy( str, source_or_null, source_size );
8002e64: b9 a0 18 00 mv r3,r13
8002e68: ba 20 10 00 mv r2,r17
8002e6c: ba 00 08 00 mv r1,r16
mt_entry->dev = str;
str += source_size;
8002e70: b6 0d 68 00 add r13,r16,r13
if ( mt_entry != NULL ) {
char *str = (char *) mt_entry + sizeof( *mt_entry );
memcpy( str, filesystemtype, filesystemtype_size );
mt_entry->type = str;
8002e74: 59 72 00 6c sw (r11+108),r18
str += filesystemtype_size;
memcpy( str, source_or_null, source_size );
8002e78: f8 00 3c 34 calli 8011f48 <memcpy>
mt_entry->dev = str;
str += source_size;
memcpy( str, target, target_size );
8002e7c: b9 80 10 00 mv r2,r12
8002e80: ba e0 18 00 mv r3,r23
8002e84: b9 a0 08 00 mv r1,r13
memcpy( str, filesystemtype, filesystemtype_size );
mt_entry->type = str;
str += filesystemtype_size;
memcpy( str, source_or_null, source_size );
mt_entry->dev = str;
8002e88: 59 70 00 70 sw (r11+112),r16
str += source_size;
memcpy( str, target, target_size );
8002e8c: f8 00 3c 2f calli 8011f48 <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;
8002e90: 78 03 08 01 mvhi r3,0x801
8002e94: b8 60 10 00 mv r2,r3
8002e98: 35 61 00 38 addi r1,r11,56
8002e9c: 38 42 7e 9c ori r2,r2,0x7e9c
8002ea0: 34 03 00 30 mvi r3,48
memcpy( str, source_or_null, source_size );
mt_entry->dev = str;
str += source_size;
memcpy( str, target, target_size );
mt_entry->target = str;
8002ea4: 59 6d 00 68 sw (r11+104),r13
&target_length
);
if ( !mt_entry )
rtems_set_errno_and_return_minus_one( ENOMEM );
mt_entry->mt_fs_root.mt_entry = mt_entry;
8002ea8: 59 6b 00 2c sw (r11+44),r11
mt_entry->options = options;
8002eac: 59 76 00 30 sw (r11+48),r22
mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf;
8002eb0: f8 00 3c 26 calli 8011f48 <memcpy>
/*
* The mount_point should be a directory with read/write/execute
* permissions in the existing tree.
*/
if ( has_target ) {
8002eb4: 45 c0 00 2f be r14,r0,8002f70 <mount+0x200>
8002eb8: e0 00 00 06 bi 8002ed0 <mount+0x160>
target,
filesystemtype,
&target_length
);
if ( !mt_entry )
rtems_set_errno_and_return_minus_one( ENOMEM );
8002ebc: f8 00 39 6d calli 8011470 <__errno> <== NOT EXECUTED
8002ec0: 34 02 00 0c mvi r2,12 <== NOT EXECUTED
8002ec4: 58 22 00 00 sw (r1+0),r2
8002ec8: 34 0d ff ff mvi r13,-1
8002ecc: e0 00 00 5a bi 8003034 <mount+0x2c4>
* The mount_point should be a directory with read/write/execute
* permissions in the existing tree.
*/
if ( has_target ) {
if ( rtems_filesystem_evaluate_path(
8002ed0: 37 8c 00 40 addi r12,sp,64
8002ed4: ba a0 10 00 mv r2,r21
8002ed8: b9 e0 08 00 mv r1,r15
8002edc: 34 03 00 07 mvi r3,7
8002ee0: b9 80 20 00 mv r4,r12
8002ee4: 34 05 00 01 mvi r5,1
8002ee8: fb ff fd a6 calli 8002580 <rtems_filesystem_evaluate_path>
8002eec: 34 02 ff ff mvi r2,-1
8002ef0: 44 22 00 4a be r1,r2,8003018 <mount+0x2a8> <== NEVER TAKEN
/*
* Test to see if it is a directory
*/
if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
8002ef4: 2b 81 00 4c lw r1,(sp+76)
8002ef8: 28 23 00 10 lw r3,(r1+16)
8002efc: b9 80 08 00 mv r1,r12
8002f00: d8 60 00 00 call r3
8002f04: 34 02 00 01 mvi r2,1
8002f08: 44 22 00 04 be r1,r2,8002f18 <mount+0x1a8>
errno = ENOTDIR;
8002f0c: f8 00 39 59 calli 8011470 <__errno>
8002f10: 34 02 00 14 mvi r2,20
8002f14: e0 00 00 20 bi 8002f94 <mount+0x224>
/*
* You can only mount one file system onto a single mount point.
*/
if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) {
8002f18: 2b 82 00 40 lw r2,(sp+64)
8002f1c: 78 01 08 00 mvhi r1,0x800
8002f20: 38 21 2c 8c ori r1,r1,0x2c8c
8002f24: fb ff ff 71 calli 8002ce8 <rtems_filesystem_mount_iterate>
8002f28: b8 20 68 00 mv r13,r1
8002f2c: 44 20 00 04 be r1,r0,8002f3c <mount+0x1cc>
errno = EBUSY;
8002f30: f8 00 39 50 calli 8011470 <__errno>
8002f34: 34 02 00 10 mvi r2,16
8002f38: e0 00 00 17 bi 8002f94 <mount+0x224>
* 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;
8002f3c: 2b 81 00 40 lw r1,(sp+64)
mt_entry->mt_point_node.handlers = loc.handlers;
mt_entry->mt_point_node.ops = loc.ops;
mt_entry->mt_point_node.mt_entry = loc.mt_entry;
8002f40: 2b 82 00 50 lw r2,(sp+80)
* may have been allocated in loc should not be sent to freenode
* until the system is unmounted. It may be needed to correctly
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
8002f44: 59 61 00 08 sw (r11+8),r1
mt_entry->mt_point_node.handlers = loc.handlers;
8002f48: 2b 81 00 48 lw r1,(sp+72)
mt_entry->mt_point_node.ops = loc.ops;
mt_entry->mt_point_node.mt_entry = loc.mt_entry;
8002f4c: 59 62 00 18 sw (r11+24),r2
* until the system is unmounted. It may be needed to correctly
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
mt_entry->mt_point_node.handlers = loc.handlers;
8002f50: 59 61 00 10 sw (r11+16),r1
mt_entry->mt_point_node.ops = loc.ops;
8002f54: 2b 81 00 4c lw r1,(sp+76)
/*
* This link to the parent is only done when we are dealing with system
* below the base file system
*/
if ( loc.ops->mount_h( mt_entry ) ) {
8002f58: 28 23 00 20 lw r3,(r1+32)
* traverse the tree.
*/
mt_entry->mt_point_node.node_access = loc.node_access;
mt_entry->mt_point_node.handlers = loc.handlers;
mt_entry->mt_point_node.ops = loc.ops;
8002f5c: 59 61 00 14 sw (r11+20),r1
/*
* This link to the parent is only done when we are dealing with system
* below the base file system
*/
if ( loc.ops->mount_h( mt_entry ) ) {
8002f60: b9 60 08 00 mv r1,r11
8002f64: d8 60 00 00 call r3
8002f68: 44 2d 00 0d be r1,r13,8002f9c <mount+0x22c> <== ALWAYS TAKEN
8002f6c: e0 00 00 2c bi 800301c <mount+0x2ac> <== NOT EXECUTED
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
8002f70: 78 04 08 01 mvhi r4,0x801
8002f74: 38 84 90 fc ori r4,r4,0x90fc
}
} else {
/*
* Do we already have a base file system ?
*/
if ( !rtems_chain_is_empty( &mount_chain ) ) {
8002f78: 28 81 00 00 lw r1,(r4+0)
8002f7c: 78 03 08 01 mvhi r3,0x801
8002f80: 38 63 91 00 ori r3,r3,0x9100
)
{
rtems_filesystem_fsmount_me_t mount_h = NULL;
rtems_filesystem_location_info_t loc;
rtems_filesystem_mount_table_entry_t *mt_entry = NULL;
rtems_filesystem_location_info_t *loc_to_free = NULL;
8002f84: 34 0c 00 00 mvi r12,0
}
} else {
/*
* Do we already have a base file system ?
*/
if ( !rtems_chain_is_empty( &mount_chain ) ) {
8002f88: 44 23 00 05 be r1,r3,8002f9c <mount+0x22c> <== ALWAYS TAKEN
errno = EINVAL;
8002f8c: f8 00 39 39 calli 8011470 <__errno> <== NOT EXECUTED
8002f90: 34 02 00 16 mvi r2,22 <== NOT EXECUTED
8002f94: 58 22 00 00 sw (r1+0),r2
goto cleanup_and_bail;
8002f98: e0 00 00 21 bi 800301c <mount+0x2ac>
* 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 ) ) {
8002f9c: b9 60 08 00 mv r1,r11
8002fa0: bb 00 10 00 mv r2,r24
8002fa4: da 80 00 00 call r20
8002fa8: 44 20 00 06 be r1,r0,8002fc0 <mount+0x250>
/*
* Try to undo the mount operation
*/
loc.ops->unmount_h( mt_entry );
8002fac: 2b 81 00 4c lw r1,(sp+76)
8002fb0: 28 22 00 28 lw r2,(r1+40)
8002fb4: b9 60 08 00 mv r1,r11
8002fb8: d8 40 00 00 call r2
goto cleanup_and_bail;
8002fbc: e0 00 00 18 bi 800301c <mount+0x2ac>
}
/*
* Add the mount table entry to the mount table chain
*/
rtems_libio_lock();
8002fc0: fb ff ff 36 calli 8002c98 <rtems_libio_lock>
8002fc4: 78 01 08 01 mvhi r1,0x801
8002fc8: 38 21 90 fc ori r1,r1,0x90fc
8002fcc: b9 60 10 00 mv r2,r11
rtems_libio_unlock();
if ( !has_target )
rtems_filesystem_root = mt_entry->mt_fs_root;
return 0;
8002fd0: 34 0d 00 00 mvi r13,0
8002fd4: f8 00 06 d5 calli 8004b28 <_Chain_Append>
/*
* Add the mount table entry to the mount table chain
*/
rtems_libio_lock();
rtems_chain_append( &mount_chain, &mt_entry->Node );
rtems_libio_unlock();
8002fd8: fb ff ff 3b calli 8002cc4 <rtems_libio_unlock>
if ( !has_target )
8002fdc: 5d cd 00 16 bne r14,r13,8003034 <mount+0x2c4>
rtems_filesystem_root = mt_entry->mt_fs_root;
8002fe0: 78 01 08 01 mvhi r1,0x801
8002fe4: 38 21 91 08 ori r1,r1,0x9108
8002fe8: 28 21 00 00 lw r1,(r1+0)
8002fec: 29 66 00 1c lw r6,(r11+28)
8002ff0: 29 65 00 20 lw r5,(r11+32)
8002ff4: 29 64 00 24 lw r4,(r11+36)
8002ff8: 29 63 00 28 lw r3,(r11+40)
8002ffc: 29 62 00 2c lw r2,(r11+44)
8003000: 58 26 00 18 sw (r1+24),r6
8003004: 58 25 00 1c sw (r1+28),r5
8003008: 58 24 00 20 sw (r1+32),r4
800300c: 58 23 00 24 sw (r1+36),r3
8003010: 58 22 00 28 sw (r1+40),r2
8003014: e0 00 00 08 bi 8003034 <mount+0x2c4>
)
{
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;
8003018: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
return 0;
cleanup_and_bail:
free( mt_entry );
800301c: b9 60 08 00 mv r1,r11
8003020: fb ff fd a8 calli 80026c0 <free>
if ( loc_to_free )
rtems_filesystem_freenode( loc_to_free );
return -1;
8003024: 34 0d ff ff mvi r13,-1
cleanup_and_bail:
free( mt_entry );
if ( loc_to_free )
8003028: 45 80 00 03 be r12,r0,8003034 <mount+0x2c4> <== NEVER TAKEN
rtems_filesystem_freenode( loc_to_free );
800302c: b9 80 08 00 mv r1,r12
8003030: fb ff fd 9c calli 80026a0 <rtems_filesystem_freenode>
return -1;
}
8003034: b9 a0 08 00 mv r1,r13
8003038: 2b 9d 00 04 lw ra,(sp+4)
800303c: 2b 8b 00 3c lw r11,(sp+60)
8003040: 2b 8c 00 38 lw r12,(sp+56)
8003044: 2b 8d 00 34 lw r13,(sp+52)
8003048: 2b 8e 00 30 lw r14,(sp+48)
800304c: 2b 8f 00 2c lw r15,(sp+44)
8003050: 2b 90 00 28 lw r16,(sp+40)
8003054: 2b 91 00 24 lw r17,(sp+36)
8003058: 2b 92 00 20 lw r18,(sp+32)
800305c: 2b 93 00 1c lw r19,(sp+28)
8003060: 2b 94 00 18 lw r20,(sp+24)
8003064: 2b 95 00 14 lw r21,(sp+20)
8003068: 2b 96 00 10 lw r22,(sp+16)
800306c: 2b 97 00 0c lw r23,(sp+12)
8003070: 2b 98 00 08 lw r24,(sp+8)
8003074: 37 9c 00 50 addi sp,sp,80
8003078: c3 a0 00 00 ret
08002020 <mount_and_make_target_path>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
8002020: 37 9c ff e8 addi sp,sp,-24
8002024: 5b 8b 00 0c sw (sp+12),r11
8002028: 5b 8c 00 08 sw (sp+8),r12
800202c: 5b 9d 00 04 sw (sp+4),ra
8002030: b8 20 60 00 mv r12,r1
8002034: b8 40 58 00 mv r11,r2
int rv = -1;
if (target != NULL) {
8002038: 44 40 00 0f be r2,r0,8002074 <mount_and_make_target_path+0x54>
rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO);
800203c: b8 40 08 00 mv r1,r2
8002040: 34 02 01 ff mvi r2,511
8002044: 5b 83 00 18 sw (sp+24),r3
8002048: 5b 84 00 14 sw (sp+20),r4
800204c: 5b 85 00 10 sw (sp+16),r5
8002050: f8 00 02 91 calli 8002a94 <rtems_mkdir>
if (rv == 0) {
8002054: 2b 83 00 18 lw r3,(sp+24)
8002058: 2b 84 00 14 lw r4,(sp+20)
800205c: 2b 85 00 10 lw r5,(sp+16)
8002060: 5c 20 00 09 bne r1,r0,8002084 <mount_and_make_target_path+0x64><== NEVER TAKEN
rv = mount(
8002064: b9 80 08 00 mv r1,r12
8002068: b9 60 10 00 mv r2,r11
800206c: f8 00 00 44 calli 800217c <mount>
8002070: e0 00 00 05 bi 8002084 <mount_and_make_target_path+0x64>
options,
data
);
}
} else {
errno = EINVAL;
8002074: f8 00 2a 44 calli 800c984 <__errno>
8002078: 34 02 00 16 mvi r2,22
800207c: 58 22 00 00 sw (r1+0),r2
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
int rv = -1;
8002080: 34 01 ff ff mvi r1,-1
} else {
errno = EINVAL;
}
return rv;
}
8002084: 2b 9d 00 04 lw ra,(sp+4)
8002088: 2b 8b 00 0c lw r11,(sp+12)
800208c: 2b 8c 00 08 lw r12,(sp+8)
8002090: 37 9c 00 18 addi sp,sp,24
8002094: c3 a0 00 00 ret
080032a4 <newlib_delete_hook>:
void newlib_delete_hook(
rtems_tcb *current_task,
rtems_tcb *deleted_task
)
{
80032a4: 37 9c ff f0 addi sp,sp,-16
80032a8: 5b 8b 00 10 sw (sp+16),r11
80032ac: 5b 8c 00 0c sw (sp+12),r12
80032b0: 5b 8d 00 08 sw (sp+8),r13
80032b4: 5b 9d 00 04 sw (sp+4),ra
80032b8: b8 20 68 00 mv r13,r1
80032bc: b8 40 60 00 mv r12,r2
/*
* The reentrancy structure was allocated by newlib using malloc()
*/
if (current_task == deleted_task) {
80032c0: 5c 22 00 05 bne r1,r2,80032d4 <newlib_delete_hook+0x30>
ptr = _REENT;
80032c4: 78 02 08 01 mvhi r2,0x801
80032c8: 38 42 91 e0 ori r2,r2,0x91e0
80032cc: 28 4b 00 00 lw r11,(r2+0)
80032d0: e0 00 00 02 bi 80032d8 <newlib_delete_hook+0x34>
} else {
ptr = deleted_task->libc_reent;
80032d4: 28 4b 01 18 lw r11,(r2+280)
}
if (ptr && ptr != _global_impure_ptr) {
80032d8: 45 60 00 0b be r11,r0,8003304 <newlib_delete_hook+0x60> <== NEVER TAKEN
80032dc: 78 02 08 01 mvhi r2,0x801
80032e0: 38 42 86 68 ori r2,r2,0x8668
80032e4: 28 41 00 00 lw r1,(r2+0)
80032e8: 45 61 00 07 be r11,r1,8003304 <newlib_delete_hook+0x60>
_reclaim_reent(ptr);
*/
/*
* Just in case there are some buffers lying around.
*/
_fwalk(ptr, newlib_free_buffers);
80032ec: 78 02 08 00 mvhi r2,0x800
80032f0: b9 60 08 00 mv r1,r11
80032f4: 38 42 30 80 ori r2,r2,0x3080
80032f8: f8 00 3a ac calli 8011da8 <_fwalk>
#if REENT_MALLOCED
free(ptr);
#else
_Workspace_Free(ptr);
80032fc: b9 60 08 00 mv r1,r11
8003300: f8 00 12 96 calli 8007d58 <_Workspace_Free>
#endif
}
deleted_task->libc_reent = NULL;
8003304: 59 80 01 18 sw (r12+280),r0
/*
* Require the switch back to another task to install its own
*/
if ( current_task == deleted_task ) {
8003308: 5d ac 00 04 bne r13,r12,8003318 <newlib_delete_hook+0x74>
_REENT = 0;
800330c: 78 01 08 01 mvhi r1,0x801
8003310: 38 21 91 e0 ori r1,r1,0x91e0
8003314: 58 20 00 00 sw (r1+0),r0
}
}
8003318: 2b 9d 00 04 lw ra,(sp+4)
800331c: 2b 8b 00 10 lw r11,(sp+16)
8003320: 2b 8c 00 0c lw r12,(sp+12)
8003324: 2b 8d 00 08 lw r13,(sp+8)
8003328: 37 9c 00 10 addi sp,sp,16
800332c: c3 a0 00 00 ret
08003080 <newlib_free_buffers>:
*/
int newlib_free_buffers(
FILE *fp
)
{
8003080: 37 9c ff f8 addi sp,sp,-8
8003084: 5b 8b 00 08 sw (sp+8),r11
8003088: 5b 9d 00 04 sw (sp+4),ra
800308c: b8 20 58 00 mv r11,r1
switch ( fileno(fp) ) {
8003090: f8 00 3a 0d calli 80118c4 <fileno>
8003094: 34 02 00 02 mvi r2,2
8003098: 54 22 00 0c bgu r1,r2,80030c8 <newlib_free_buffers+0x48> <== NEVER TAKEN
case 0:
case 1:
case 2:
if (fp->_flags & __SMBF) {
800309c: 2d 61 00 0c lhu r1,(r11+12)
80030a0: 20 21 00 80 andi r1,r1,0x80
80030a4: 44 20 00 0b be r1,r0,80030d0 <newlib_free_buffers+0x50> <== ALWAYS TAKEN
free( fp->_bf._base );
80030a8: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
80030ac: fb ff fd 85 calli 80026c0 <free> <== NOT EXECUTED
fp->_flags &= ~__SMBF;
80030b0: 2d 61 00 0c lhu r1,(r11+12) <== NOT EXECUTED
fp->_bf._base = fp->_p = (unsigned char *) NULL;
80030b4: 59 60 00 00 sw (r11+0),r0 <== NOT EXECUTED
80030b8: 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;
80030bc: 20 21 ff 7f andi r1,r1,0xff7f <== NOT EXECUTED
80030c0: 0d 61 00 0c sh (r11+12),r1 <== NOT EXECUTED
80030c4: e0 00 00 03 bi 80030d0 <newlib_free_buffers+0x50> <== NOT EXECUTED
fp->_bf._base = fp->_p = (unsigned char *) NULL;
}
break;
default:
fclose(fp);
80030c8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80030cc: f8 00 39 49 calli 80115f0 <fclose> <== NOT EXECUTED
}
return 0;
}
80030d0: 34 01 00 00 mvi r1,0
80030d4: 2b 9d 00 04 lw ra,(sp+4)
80030d8: 2b 8b 00 08 lw r11,(sp+8)
80030dc: 37 9c 00 08 addi sp,sp,8
80030e0: c3 a0 00 00 ret
080033b4 <open>:
int open(
const char *pathname,
int flags,
...
)
{
80033b4: 37 9c ff ac addi sp,sp,-84
80033b8: 5b 8b 00 24 sw (sp+36),r11
80033bc: 5b 8c 00 20 sw (sp+32),r12
80033c0: 5b 8d 00 1c sw (sp+28),r13
80033c4: 5b 8e 00 18 sw (sp+24),r14
80033c8: 5b 8f 00 14 sw (sp+20),r15
80033cc: 5b 90 00 10 sw (sp+16),r16
80033d0: 5b 91 00 0c sw (sp+12),r17
80033d4: 5b 92 00 08 sw (sp+8),r18
80033d8: 5b 9d 00 04 sw (sp+4),ra
80033dc: b8 20 78 00 mv r15,r1
/*
* Set the Evaluation flags
*/
eval_flags = 0;
status = flags + 1;
80033e0: 34 41 00 01 addi r1,r2,1
int open(
const char *pathname,
int flags,
...
)
{
80033e4: 5b 82 00 3c sw (sp+60),r2
80033e8: b8 40 70 00 mv r14,r2
80033ec: 5b 83 00 40 sw (sp+64),r3
80033f0: 5b 84 00 44 sw (sp+68),r4
80033f4: 5b 85 00 48 sw (sp+72),r5
80033f8: 5b 86 00 4c sw (sp+76),r6
80033fc: 5b 87 00 50 sw (sp+80),r7
8003400: 5b 88 00 54 sw (sp+84),r8
/*
* Set the Evaluation flags
*/
eval_flags = 0;
status = flags + 1;
if ( ( status & _FREAD ) == _FREAD )
8003404: 20 22 00 01 andi r2,r1,0x1
int eval_flags;
/*
* Set the Evaluation flags
*/
eval_flags = 0;
8003408: 34 10 00 00 mvi r16,0
status = flags + 1;
if ( ( status & _FREAD ) == _FREAD )
800340c: 44 40 00 02 be r2,r0,8003414 <open+0x60>
eval_flags |= RTEMS_LIBIO_PERMS_READ;
8003410: 34 10 00 04 mvi r16,4
if ( ( status & _FWRITE ) == _FWRITE )
8003414: 20 21 00 02 andi r1,r1,0x2
8003418: 44 20 00 02 be r1,r0,8003420 <open+0x6c>
eval_flags |= RTEMS_LIBIO_PERMS_WRITE;
800341c: 3a 10 00 02 ori r16,r16,0x2
va_start(ap, flags);
mode = va_arg( ap, int );
8003420: 2b 92 00 40 lw r18,(sp+64)
* code does not require changes here since network file
* descriptors are obtained using socket(), not open().
*/
/* allocate a file control block */
iop = rtems_libio_allocate();
8003424: f8 00 24 a3 calli 800c6b0 <rtems_libio_allocate>
8003428: b8 20 58 00 mv r11,r1
int mode;
int rc;
rtems_libio_t *iop = 0;
int status;
rtems_filesystem_location_info_t loc;
rtems_filesystem_location_info_t *loc_to_free = NULL;
800342c: 34 0d 00 00 mvi r13,0
*/
/* allocate a file control block */
iop = rtems_libio_allocate();
if ( iop == 0 ) {
rc = ENFILE;
8003430: 34 0c 00 17 mvi r12,23
* descriptors are obtained using socket(), not open().
*/
/* allocate a file control block */
iop = rtems_libio_allocate();
if ( iop == 0 ) {
8003434: 44 20 00 62 be r1,r0,80035bc <open+0x208>
}
/*
* See if the file exists.
*/
status = rtems_filesystem_evaluate_path(
8003438: b9 e0 08 00 mv r1,r15
800343c: f8 00 3c 6e calli 80125f4 <strlen>
8003440: 37 91 00 28 addi r17,sp,40
8003444: b8 20 10 00 mv r2,r1
8003448: ba 00 18 00 mv r3,r16
800344c: b9 e0 08 00 mv r1,r15
8003450: ba 20 20 00 mv r4,r17
8003454: 34 05 00 01 mvi r5,1
8003458: fb ff fc 4a calli 8002580 <rtems_filesystem_evaluate_path>
pathname, strlen( pathname ), eval_flags, &loc, true );
if ( status == -1 ) {
800345c: 34 02 ff ff mvi r2,-1
8003460: 5c 22 00 1c bne r1,r2,80034d0 <open+0x11c>
if ( errno != ENOENT ) {
8003464: f8 00 38 03 calli 8011470 <__errno>
8003468: 28 22 00 00 lw r2,(r1+0)
800346c: 34 01 00 02 mvi r1,2
8003470: 5c 41 00 0a bne r2,r1,8003498 <open+0xe4>
rc = errno;
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
8003474: 21 c1 02 00 andi r1,r14,0x200
rc = ENOENT;
8003478: 34 0c 00 02 mvi r12,2
rc = errno;
goto done;
}
/* If the file does not exist and we are not trying to create it--> error */
if ( !(flags & O_CREAT) ) {
800347c: 44 20 00 50 be r1,r0,80035bc <open+0x208>
rc = ENOENT;
goto done;
}
/* Create the node for the new regular file */
rc = mknod( pathname, S_IFREG | mode, 0LL );
8003480: b9 e0 08 00 mv r1,r15
8003484: 3a 42 80 00 ori r2,r18,0x8000
8003488: 34 03 00 00 mvi r3,0
800348c: 34 04 00 00 mvi r4,0
8003490: fb ff fd ce calli 8002bc8 <mknod>
if ( rc ) {
8003494: 44 20 00 04 be r1,r0,80034a4 <open+0xf0> <== ALWAYS TAKEN
rc = errno;
8003498: f8 00 37 f6 calli 8011470 <__errno>
800349c: 28 2c 00 00 lw r12,(r1+0)
goto done;
80034a0: e0 00 00 46 bi 80035b8 <open+0x204>
/*
* 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(
80034a4: b9 e0 08 00 mv r1,r15
80034a8: f8 00 3c 53 calli 80125f4 <strlen>
80034ac: b8 20 10 00 mv r2,r1
80034b0: 34 03 00 00 mvi r3,0
80034b4: b9 e0 08 00 mv r1,r15
80034b8: ba 20 20 00 mv r4,r17
80034bc: 34 05 00 01 mvi r5,1
80034c0: fb ff fc 30 calli 8002580 <rtems_filesystem_evaluate_path>
pathname, strlen( pathname ), 0x0, &loc, true );
if ( status != 0 ) { /* The file did not exist */
rc = EACCES;
80034c4: 34 0c 00 0d mvi r12,13
* "loc" structure needed to actually have the file itself open.
* So we created it, and then we need to have "look it up."
*/
status = rtems_filesystem_evaluate_path(
pathname, strlen( pathname ), 0x0, &loc, true );
if ( status != 0 ) { /* The file did not exist */
80034c8: 5d a1 00 3d bne r13,r1,80035bc <open+0x208> <== NEVER TAKEN
80034cc: e0 00 00 06 bi 80034e4 <open+0x130>
rc = EACCES;
goto done;
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
80034d0: 21 c2 0a 00 andi r2,r14,0xa00
80034d4: 34 01 0a 00 mvi r1,2560
/* We were trying to create a file that already exists */
rc = EEXIST;
loc_to_free = &loc;
80034d8: ba 20 68 00 mv r13,r17
goto done;
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
/* We were trying to create a file that already exists */
rc = EEXIST;
80034dc: 34 0c 00 11 mvi r12,17
if ( status != 0 ) { /* The file did not exist */
rc = EACCES;
goto done;
}
} else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
80034e0: 44 41 00 37 be r2,r1,80035bc <open+0x208>
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
80034e4: b9 c0 08 00 mv r1,r14
80034e8: 29 6c 00 18 lw r12,(r11+24)
80034ec: f8 00 24 47 calli 800c608 <rtems_libio_fcntl_flags>
iop->pathinfo = loc;
80034f0: 2b 82 00 28 lw r2,(sp+40)
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
80034f4: b8 2c 08 00 or r1,r1,r12
80034f8: 59 61 00 18 sw (r11+24),r1
iop->pathinfo = loc;
80034fc: 59 62 00 1c sw (r11+28),r2
8003500: 2b 82 00 2c lw r2,(sp+44)
8003504: 2b 81 00 30 lw r1,(sp+48)
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
8003508: b9 c0 18 00 mv r3,r14
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
iop->pathinfo = loc;
800350c: 59 62 00 20 sw (r11+32),r2
8003510: 2b 82 00 34 lw r2,(sp+52)
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
8003514: 28 25 00 00 lw r5,(r1+0)
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
iop->pathinfo = loc;
8003518: 59 61 00 24 sw (r11+36),r1
800351c: 59 62 00 28 sw (r11+40),r2
8003520: 2b 82 00 38 lw r2,(sp+56)
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
8003524: b9 60 08 00 mv r1,r11
8003528: ba 40 20 00 mv r4,r18
/*
* Fill in the file control block based on the loc structure
* returned by successful path evaluation.
*/
iop->flags |= rtems_libio_fcntl_flags( flags );
iop->pathinfo = loc;
800352c: 59 62 00 2c sw (r11+44),r2
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
8003530: b9 e0 10 00 mv r2,r15
8003534: d8 a0 00 00 call r5
if ( rc ) {
8003538: 44 20 00 05 be r1,r0,800354c <open+0x198>
rc = errno;
800353c: f8 00 37 cd calli 8011470 <__errno>
8003540: 28 2c 00 00 lw r12,(r1+0)
rc = EEXIST;
loc_to_free = &loc;
goto done;
}
loc_to_free = &loc;
8003544: 37 8d 00 28 addi r13,sp,40
iop->pathinfo = loc;
rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode );
if ( rc ) {
rc = errno;
goto done;
8003548: e0 00 00 1c bi 80035b8 <open+0x204>
}
/*
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
800354c: 21 ce 04 00 andi r14,r14,0x400
8003550: 45 c1 00 25 be r14,r1,80035e4 <open+0x230>
rc = ftruncate( iop - rtems_libio_iops, 0 );
8003554: 78 01 08 01 mvhi r1,0x801
8003558: 38 21 97 e8 ori r1,r1,0x97e8
800355c: 28 21 00 00 lw r1,(r1+0)
8003560: 34 02 00 06 mvi r2,6
rc = EEXIST;
loc_to_free = &loc;
goto done;
}
loc_to_free = &loc;
8003564: 37 8d 00 28 addi r13,sp,40
/*
* Optionally truncate the file.
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
rc = ftruncate( iop - rtems_libio_iops, 0 );
8003568: c9 61 08 00 sub r1,r11,r1
800356c: f8 00 4e 55 calli 8016ec0 <__ashrsi3>
8003570: 34 02 00 00 mvi r2,0
8003574: f8 00 23 c7 calli 800c490 <ftruncate>
8003578: b8 20 60 00 mv r12,r1
if ( rc ) {
800357c: 44 20 00 0f be r1,r0,80035b8 <open+0x204>
if(errno) rc = errno;
8003580: f8 00 37 bc calli 8011470 <__errno>
8003584: 28 21 00 00 lw r1,(r1+0)
8003588: 44 20 00 03 be r1,r0,8003594 <open+0x1e0> <== NEVER TAKEN
800358c: f8 00 37 b9 calli 8011470 <__errno>
8003590: 28 2c 00 00 lw r12,(r1+0)
close( iop - rtems_libio_iops );
8003594: 78 01 08 01 mvhi r1,0x801
8003598: 38 21 97 e8 ori r1,r1,0x97e8
800359c: 28 21 00 00 lw r1,(r1+0)
80035a0: 34 02 00 06 mvi r2,6
/* those are released by close(): */
iop = 0;
loc_to_free = NULL;
80035a4: 34 0d 00 00 mvi r13,0
*/
if ( (flags & O_TRUNC) == O_TRUNC ) {
rc = ftruncate( iop - rtems_libio_iops, 0 );
if ( rc ) {
if(errno) rc = errno;
close( iop - rtems_libio_iops );
80035a8: c9 61 08 00 sub r1,r11,r1
80035ac: f8 00 4e 45 calli 8016ec0 <__ashrsi3>
80035b0: f8 00 23 8b calli 800c3dc <close>
/* those are released by close(): */
iop = 0;
80035b4: 34 0b 00 00 mvi r11,0
* Single exit and clean up path.
*/
done:
va_end(ap);
if ( rc ) {
80035b8: 45 80 00 0b be r12,r0,80035e4 <open+0x230>
if ( iop )
80035bc: 45 60 00 03 be r11,r0,80035c8 <open+0x214>
rtems_libio_free( iop );
80035c0: b9 60 08 00 mv r1,r11
80035c4: f8 00 24 69 calli 800c768 <rtems_libio_free>
if ( loc_to_free )
80035c8: 45 a0 00 03 be r13,r0,80035d4 <open+0x220>
rtems_filesystem_freenode( loc_to_free );
80035cc: b9 a0 08 00 mv r1,r13
80035d0: fb ff fc 34 calli 80026a0 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( rc );
80035d4: f8 00 37 a7 calli 8011470 <__errno>
80035d8: 58 2c 00 00 sw (r1+0),r12
80035dc: 34 01 ff ff mvi r1,-1
80035e0: e0 00 00 07 bi 80035fc <open+0x248>
}
return iop - rtems_libio_iops;
80035e4: 78 01 08 01 mvhi r1,0x801
80035e8: 38 21 97 e8 ori r1,r1,0x97e8
80035ec: 28 21 00 00 lw r1,(r1+0)
80035f0: 34 02 00 06 mvi r2,6
80035f4: c9 61 08 00 sub r1,r11,r1
80035f8: f8 00 4e 32 calli 8016ec0 <__ashrsi3>
}
80035fc: 2b 9d 00 04 lw ra,(sp+4)
8003600: 2b 8b 00 24 lw r11,(sp+36)
8003604: 2b 8c 00 20 lw r12,(sp+32)
8003608: 2b 8d 00 1c lw r13,(sp+28)
800360c: 2b 8e 00 18 lw r14,(sp+24)
8003610: 2b 8f 00 14 lw r15,(sp+20)
8003614: 2b 90 00 10 lw r16,(sp+16)
8003618: 2b 91 00 0c lw r17,(sp+12)
800361c: 2b 92 00 08 lw r18,(sp+8)
8003620: 37 9c 00 54 addi sp,sp,84
8003624: c3 a0 00 00 ret
08003330 <open_dev_console>:
/*
* This is a replaceable stub which opens the console, if present.
*/
void open_dev_console(void)
{
8003330: 37 9c ff f4 addi sp,sp,-12
8003334: 5b 8b 00 0c sw (sp+12),r11
8003338: 5b 8c 00 08 sw (sp+8),r12
800333c: 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) {
8003340: 78 0b 08 01 mvhi r11,0x801
8003344: 39 6b 7d c4 ori r11,r11,0x7dc4
8003348: b9 60 08 00 mv r1,r11
800334c: 34 02 00 00 mvi r2,0
8003350: 34 03 00 00 mvi r3,0
8003354: f8 00 00 18 calli 80033b4 <open>
8003358: 34 0c ff ff mvi r12,-1
800335c: 44 2c 00 11 be r1,r12,80033a0 <open_dev_console+0x70>
/*
* 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)
8003360: 34 02 00 01 mvi r2,1
8003364: b9 60 08 00 mv r1,r11
8003368: 34 03 00 00 mvi r3,0
800336c: f8 00 00 12 calli 80033b4 <open>
rtems_fatal_error_occurred( 0x55544431 ); /* error STD1 */
8003370: 78 02 08 01 mvhi r2,0x801
8003374: 38 42 7e d0 ori r2,r2,0x7ed0
/*
* 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)
8003378: 44 2c 00 08 be r1,r12,8003398 <open_dev_console+0x68> <== NEVER TAKEN
rtems_fatal_error_occurred( 0x55544431 ); /* error STD1 */
if ((stderr_fd = open("/dev/console", O_WRONLY, 0)) == -1)
800337c: b9 60 08 00 mv r1,r11
8003380: 34 02 00 01 mvi r2,1
8003384: 34 03 00 00 mvi r3,0
8003388: f8 00 00 0b calli 80033b4 <open>
800338c: 5c 2c 00 05 bne r1,r12,80033a0 <open_dev_console+0x70> <== ALWAYS TAKEN
rtems_fatal_error_occurred( 0x55544432 ); /* error STD2 */
8003390: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
8003394: 38 42 7e d4 ori r2,r2,0x7ed4 <== NOT EXECUTED
8003398: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED
800339c: f8 00 04 53 calli 80044e8 <rtems_fatal_error_occurred> <== NOT EXECUTED
}
80033a0: 2b 9d 00 04 lw ra,(sp+4)
80033a4: 2b 8b 00 0c lw r11,(sp+12)
80033a8: 2b 8c 00 08 lw r12,(sp+8)
80033ac: 37 9c 00 0c addi sp,sp,12
80033b0: c3 a0 00 00 ret
080054e4 <oproc>:
/*
* Handle output processing
*/
static void
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
80054e4: 37 9c ff f4 addi sp,sp,-12
80054e8: 5b 8b 00 08 sw (sp+8),r11
80054ec: 5b 9d 00 04 sw (sp+4),ra
80054f0: 33 81 00 0c sb (sp+12),r1
int i;
if (tty->termios.c_oflag & OPOST) {
80054f4: 28 41 00 34 lw r1,(r2+52)
/*
* Handle output processing
*/
static void
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
80054f8: b8 40 58 00 mv r11,r2
int i;
if (tty->termios.c_oflag & OPOST) {
80054fc: 20 22 00 01 andi r2,r1,0x1
8005500: 44 40 00 4d be r2,r0,8005634 <oproc+0x150> <== NEVER TAKEN
switch (c) {
8005504: 43 82 00 0c lbu r2,(sp+12)
8005508: 34 03 00 09 mvi r3,9
800550c: 44 43 00 21 be r2,r3,8005590 <oproc+0xac>
8005510: 54 43 00 04 bgu r2,r3,8005520 <oproc+0x3c> <== ALWAYS TAKEN
8005514: 34 03 00 08 mvi r3,8 <== NOT EXECUTED
8005518: 5c 43 00 30 bne r2,r3,80055d8 <oproc+0xf4> <== NOT EXECUTED
800551c: e0 00 00 2b bi 80055c8 <oproc+0xe4> <== NOT EXECUTED
8005520: 34 03 00 0a mvi r3,10
8005524: 44 43 00 04 be r2,r3,8005534 <oproc+0x50>
8005528: 34 03 00 0d mvi r3,13
800552c: 5c 43 00 2b bne r2,r3,80055d8 <oproc+0xf4> <== ALWAYS TAKEN
8005530: e0 00 00 0c bi 8005560 <oproc+0x7c> <== NOT EXECUTED
case '\n':
if (tty->termios.c_oflag & ONLRET)
8005534: 20 22 00 20 andi r2,r1,0x20
8005538: 44 40 00 02 be r2,r0,8005540 <oproc+0x5c> <== ALWAYS TAKEN
tty->column = 0;
800553c: 59 60 00 28 sw (r11+40),r0 <== NOT EXECUTED
if (tty->termios.c_oflag & ONLCR) {
8005540: 20 21 00 04 andi r1,r1,0x4
8005544: 44 20 00 3c be r1,r0,8005634 <oproc+0x150> <== NEVER TAKEN
rtems_termios_puts ("\r", 1, tty);
8005548: 78 01 08 02 mvhi r1,0x802
800554c: 38 21 0f 4c ori r1,r1,0xf4c
8005550: 34 02 00 01 mvi r2,1
8005554: b9 60 18 00 mv r3,r11
8005558: fb ff ff 8d calli 800538c <rtems_termios_puts>
800555c: e0 00 00 0b bi 8005588 <oproc+0xa4>
tty->column = 0;
}
break;
case '\r':
if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0))
8005560: 20 22 00 10 andi r2,r1,0x10 <== NOT EXECUTED
8005564: 44 40 00 03 be r2,r0,8005570 <oproc+0x8c> <== NOT EXECUTED
8005568: 29 62 00 28 lw r2,(r11+40) <== NOT EXECUTED
800556c: 44 40 00 36 be r2,r0,8005644 <oproc+0x160> <== NOT EXECUTED
return;
if (tty->termios.c_oflag & OCRNL) {
8005570: 20 22 00 08 andi r2,r1,0x8 <== NOT EXECUTED
8005574: 44 40 00 05 be r2,r0,8005588 <oproc+0xa4> <== NOT EXECUTED
c = '\n';
8005578: 34 02 00 0a mvi r2,10 <== NOT EXECUTED
800557c: 33 82 00 0c sb (sp+12),r2 <== NOT EXECUTED
if (tty->termios.c_oflag & ONLRET)
8005580: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED
8005584: 44 20 00 2c be r1,r0,8005634 <oproc+0x150> <== NOT EXECUTED
tty->column = 0;
break;
}
tty->column = 0;
8005588: 59 60 00 28 sw (r11+40),r0
break;
800558c: e0 00 00 2a bi 8005634 <oproc+0x150>
case '\t':
i = 8 - (tty->column & 7);
8005590: 29 63 00 28 lw r3,(r11+40)
8005594: 34 04 00 08 mvi r4,8
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
8005598: 20 21 18 00 andi r1,r1,0x1800
}
tty->column = 0;
break;
case '\t':
i = 8 - (tty->column & 7);
800559c: 20 62 00 07 andi r2,r3,0x7
80055a0: c8 82 10 00 sub r2,r4,r2
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
80055a4: 34 04 18 00 mvi r4,6144
80055a8: b4 43 18 00 add r3,r2,r3
80055ac: 5c 24 00 05 bne r1,r4,80055c0 <oproc+0xdc> <== NEVER TAKEN
tty->column += i;
rtems_termios_puts ( " ", i, tty);
80055b0: 78 01 08 02 mvhi r1,0x802
break;
case '\t':
i = 8 - (tty->column & 7);
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
tty->column += i;
80055b4: 59 63 00 28 sw (r11+40),r3
rtems_termios_puts ( " ", i, tty);
80055b8: 38 21 0f 50 ori r1,r1,0xf50
80055bc: e0 00 00 20 bi 800563c <oproc+0x158>
return;
}
tty->column += i;
80055c0: 59 63 00 28 sw (r11+40),r3 <== NOT EXECUTED
break;
80055c4: e0 00 00 1c bi 8005634 <oproc+0x150> <== NOT EXECUTED
case '\b':
if (tty->column > 0)
80055c8: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED
80055cc: 4c 01 00 1a bge r0,r1,8005634 <oproc+0x150> <== NOT EXECUTED
tty->column--;
80055d0: 34 21 ff ff addi r1,r1,-1 <== NOT EXECUTED
80055d4: e0 00 00 17 bi 8005630 <oproc+0x14c> <== NOT EXECUTED
break;
default:
if (tty->termios.c_oflag & OLCUC)
80055d8: 20 21 00 02 andi r1,r1,0x2
80055dc: 44 20 00 0b be r1,r0,8005608 <oproc+0x124> <== ALWAYS TAKEN
c = toupper(c);
80055e0: 78 01 08 02 mvhi r1,0x802 <== NOT EXECUTED
80055e4: 38 21 34 10 ori r1,r1,0x3410 <== NOT EXECUTED
80055e8: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED
80055ec: b4 22 08 00 add r1,r1,r2 <== NOT EXECUTED
80055f0: 40 23 00 01 lbu r3,(r1+1) <== NOT EXECUTED
80055f4: 34 01 00 02 mvi r1,2 <== NOT EXECUTED
80055f8: 20 63 00 03 andi r3,r3,0x3 <== NOT EXECUTED
80055fc: 5c 61 00 02 bne r3,r1,8005604 <oproc+0x120> <== NOT EXECUTED
8005600: 34 42 ff e0 addi r2,r2,-32 <== NOT EXECUTED
8005604: 33 82 00 0c sb (sp+12),r2 <== NOT EXECUTED
if (!iscntrl(c))
8005608: 78 01 08 02 mvhi r1,0x802
800560c: 38 21 34 10 ori r1,r1,0x3410
8005610: 43 82 00 0c lbu r2,(sp+12)
8005614: 28 21 00 00 lw r1,(r1+0)
8005618: b4 22 08 00 add r1,r1,r2
800561c: 40 21 00 01 lbu r1,(r1+1)
8005620: 20 21 00 20 andi r1,r1,0x20
8005624: 5c 20 00 04 bne r1,r0,8005634 <oproc+0x150> <== NEVER TAKEN
tty->column++;
8005628: 29 61 00 28 lw r1,(r11+40)
800562c: 34 21 00 01 addi r1,r1,1
8005630: 59 61 00 28 sw (r11+40),r1
break;
}
}
rtems_termios_puts (&c, 1, tty);
8005634: 37 81 00 0c addi r1,sp,12
8005638: 34 02 00 01 mvi r2,1
800563c: b9 60 18 00 mv r3,r11
8005640: fb ff ff 53 calli 800538c <rtems_termios_puts>
}
8005644: 2b 9d 00 04 lw ra,(sp+4)
8005648: 2b 8b 00 08 lw r11,(sp+8)
800564c: 37 9c 00 0c addi sp,sp,12
8005650: c3 a0 00 00 ret
08009218 <pipe_create>:
* Called by pipe() to create an anonymous pipe.
*/
int pipe_create(
int filsdes[2]
)
{
8009218: 37 9c ff d8 addi sp,sp,-40
800921c: 5b 8b 00 18 sw (sp+24),r11
8009220: 5b 8c 00 14 sw (sp+20),r12
8009224: 5b 8d 00 10 sw (sp+16),r13
8009228: 5b 8e 00 0c sw (sp+12),r14
800922c: 5b 8f 00 08 sw (sp+8),r15
8009230: 5b 9d 00 04 sw (sp+4),ra
8009234: b8 20 70 00 mv r14,r1
rtems_libio_t *iop;
int err = 0;
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
8009238: 78 01 08 01 mvhi r1,0x801
800923c: 38 21 e3 b8 ori r1,r1,0xe3b8
8009240: 34 02 01 ff mvi r2,511
8009244: f8 00 06 44 calli 800ab54 <rtems_mkdir>
8009248: b8 20 78 00 mv r15,r1
return -1;
800924c: 34 0d ff ff mvi r13,-1
)
{
rtems_libio_t *iop;
int err = 0;
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
8009250: 5c 20 00 43 bne r1,r0,800935c <pipe_create+0x144> <== NEVER TAKEN
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
8009254: 78 02 08 01 mvhi r2,0x801
8009258: 38 42 e3 c0 ori r2,r2,0xe3c0
800925c: 28 43 00 00 lw r3,(r2+0)
8009260: 28 41 00 04 lw r1,(r2+4)
8009264: 37 8b 00 1c addi r11,sp,28
8009268: 5b 83 00 1c sw (sp+28),r3
800926c: 59 61 00 04 sw (r11+4),r1
8009270: 2c 41 00 08 lhu r1,(r2+8)
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
8009274: 78 02 08 01 mvhi r2,0x801
8009278: 38 42 f6 cc ori r2,r2,0xf6cc
800927c: 2c 43 00 00 lhu r3,(r2+0)
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
8009280: 0d 61 00 08 sh (r11+8),r1
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
8009284: 34 61 00 01 addi r1,r3,1
8009288: 0c 41 00 00 sh (r2+0),r1
800928c: 78 02 08 01 mvhi r2,0x801
8009290: 38 42 e3 cc ori r2,r2,0xe3cc
8009294: 37 81 00 26 addi r1,sp,38
8009298: f8 00 17 ee calli 800f250 <sprintf>
/* Try creating FIFO file until find an available file name */
while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) {
800929c: b9 60 08 00 mv r1,r11
80092a0: 34 02 01 80 mvi r2,384
80092a4: f8 00 05 61 calli 800a828 <mkfifo>
80092a8: b8 20 60 00 mv r12,r1
80092ac: 44 2f 00 03 be r1,r15,80092b8 <pipe_create+0xa0>
if (errno != EEXIST){
80092b0: f8 00 14 72 calli 800e478 <__errno>
80092b4: e0 00 00 2a bi 800935c <pipe_create+0x144>
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);
80092b8: b9 60 08 00 mv r1,r11
80092bc: 34 02 40 00 mvi r2,16384
80092c0: fb ff e9 77 calli 800389c <open>
80092c4: 59 c1 00 00 sw (r14+0),r1
if (filsdes[0] < 0) {
80092c8: 4c 2c 00 05 bge r1,r12,80092dc <pipe_create+0xc4>
err = errno;
80092cc: f8 00 14 6b calli 800e478 <__errno>
80092d0: 28 2c 00 00 lw r12,(r1+0)
/* Delete file at errors, or else if pipe is successfully created
the file node will be deleted after it is closed by all. */
unlink(fifopath);
80092d4: b9 60 08 00 mv r1,r11
80092d8: e0 00 00 1b bi 8009344 <pipe_create+0x12c>
}
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
80092dc: 78 02 08 01 mvhi r2,0x801
80092e0: 38 42 f0 10 ori r2,r2,0xf010
80092e4: 28 44 00 00 lw r4,(r2+0)
80092e8: 34 02 00 00 mvi r2,0
80092ec: 50 24 00 07 bgeu r1,r4,8009308 <pipe_create+0xf0> <== NEVER TAKEN
80092f0: 34 02 00 06 mvi r2,6
80092f4: 78 0b 08 01 mvhi r11,0x801
80092f8: f8 00 4d e6 calli 801ca90 <__ashlsi3>
80092fc: 39 6b f7 44 ori r11,r11,0xf744
8009300: 29 62 00 00 lw r2,(r11+0)
8009304: b4 41 10 00 add r2,r2,r1
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
8009308: 28 43 00 18 lw r3,(r2+24)
800930c: 34 01 ff fe mvi r1,-2
int pipe_create(
int filsdes[2]
)
{
rtems_libio_t *iop;
int err = 0;
8009310: 34 0c 00 00 mvi r12,0
unlink(fifopath);
}
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
8009314: a0 61 08 00 and r1,r3,r1
8009318: 58 41 00 18 sw (r2+24),r1
filsdes[1] = open(fifopath, O_WRONLY);
800931c: 37 81 00 1c addi r1,sp,28
8009320: 34 02 00 01 mvi r2,1
8009324: fb ff e9 5e calli 800389c <open>
8009328: 59 c1 00 04 sw (r14+4),r1
if (filsdes[1] < 0) {
800932c: 4c 20 00 05 bge r1,r0,8009340 <pipe_create+0x128>
err = errno;
8009330: f8 00 14 52 calli 800e478 <__errno>
8009334: 28 2c 00 00 lw r12,(r1+0)
close(filsdes[0]);
8009338: 29 c1 00 00 lw r1,(r14+0)
800933c: fb ff e4 a9 calli 80025e0 <close>
}
unlink(fifopath);
8009340: 37 81 00 1c addi r1,sp,28
8009344: fb ff ea 68 calli 8003ce4 <unlink>
}
if(err != 0)
rtems_set_errno_and_return_minus_one(err);
return 0;
8009348: 34 0d 00 00 mvi r13,0
err = errno;
close(filsdes[0]);
}
unlink(fifopath);
}
if(err != 0)
800934c: 45 80 00 04 be r12,r0,800935c <pipe_create+0x144>
rtems_set_errno_and_return_minus_one(err);
8009350: f8 00 14 4a calli 800e478 <__errno>
8009354: 58 2c 00 00 sw (r1+0),r12
8009358: 34 0d ff ff mvi r13,-1
return 0;
}
800935c: b9 a0 08 00 mv r1,r13
8009360: 2b 9d 00 04 lw ra,(sp+4)
8009364: 2b 8b 00 18 lw r11,(sp+24)
8009368: 2b 8c 00 14 lw r12,(sp+20)
800936c: 2b 8d 00 10 lw r13,(sp+16)
8009370: 2b 8e 00 0c lw r14,(sp+12)
8009374: 2b 8f 00 08 lw r15,(sp+8)
8009378: 37 9c 00 28 addi sp,sp,40
800937c: c3 a0 00 00 ret
0800aa50 <pipe_ioctl>:
pipe_control_t *pipe,
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
800aa50: 37 9c ff f4 addi sp,sp,-12
800aa54: 5b 8b 00 0c sw (sp+12),r11
800aa58: 5b 8c 00 08 sw (sp+8),r12
800aa5c: 5b 9d 00 04 sw (sp+4),ra
800aa60: b8 60 60 00 mv r12,r3
if (cmd == FIONREAD) {
800aa64: 78 03 08 02 mvhi r3,0x802
800aa68: 38 63 16 e0 ori r3,r3,0x16e0
pipe_control_t *pipe,
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
800aa6c: b8 20 58 00 mv r11,r1
if (cmd == FIONREAD) {
800aa70: 28 61 00 00 lw r1,(r3+0)
*(unsigned int *)buffer = pipe->Length;
PIPE_UNLOCK(pipe);
return 0;
}
return -EINVAL;
800aa74: 34 04 ff ea mvi r4,-22
uint32_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
800aa78: 5c 41 00 0e bne r2,r1,800aab0 <pipe_ioctl+0x60>
if (buffer == NULL)
return -EFAULT;
800aa7c: 34 04 ff f2 mvi r4,-14
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
if (buffer == NULL)
800aa80: 45 80 00 0c be r12,r0,800aab0 <pipe_ioctl+0x60>
return -EFAULT;
if (! PIPE_LOCK(pipe))
800aa84: 29 61 00 28 lw r1,(r11+40)
800aa88: 34 02 00 00 mvi r2,0
800aa8c: 34 03 00 00 mvi r3,0
800aa90: fb ff e9 9a calli 80050f8 <rtems_semaphore_obtain>
return -EINTR;
800aa94: 34 04 ff fc mvi r4,-4
{
if (cmd == FIONREAD) {
if (buffer == NULL)
return -EFAULT;
if (! PIPE_LOCK(pipe))
800aa98: 5c 20 00 06 bne r1,r0,800aab0 <pipe_ioctl+0x60> <== NEVER TAKEN
return -EINTR;
/* Return length of pipe */
*(unsigned int *)buffer = pipe->Length;
800aa9c: 29 61 00 0c lw r1,(r11+12)
800aaa0: 59 81 00 00 sw (r12+0),r1
PIPE_UNLOCK(pipe);
800aaa4: 29 61 00 28 lw r1,(r11+40)
800aaa8: fb ff e9 e4 calli 8005238 <rtems_semaphore_release>
return 0;
800aaac: 34 04 00 00 mvi r4,0
}
return -EINVAL;
}
800aab0: b8 80 08 00 mv r1,r4
800aab4: 2b 9d 00 04 lw ra,(sp+4)
800aab8: 2b 8b 00 0c lw r11,(sp+12)
800aabc: 2b 8c 00 08 lw r12,(sp+8)
800aac0: 37 9c 00 0c addi sp,sp,12
800aac4: c3 a0 00 00 ret
0800a6a4 <pipe_read>:
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800a6a4: 37 9c ff d8 addi sp,sp,-40
800a6a8: 5b 8b 00 24 sw (sp+36),r11
800a6ac: 5b 8c 00 20 sw (sp+32),r12
800a6b0: 5b 8d 00 1c sw (sp+28),r13
800a6b4: 5b 8e 00 18 sw (sp+24),r14
800a6b8: 5b 8f 00 14 sw (sp+20),r15
800a6bc: 5b 90 00 10 sw (sp+16),r16
800a6c0: 5b 91 00 0c sw (sp+12),r17
800a6c4: 5b 92 00 08 sw (sp+8),r18
800a6c8: 5b 9d 00 04 sw (sp+4),ra
800a6cc: b8 20 58 00 mv r11,r1
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
800a6d0: 28 21 00 28 lw r1,(r1+40)
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800a6d4: b8 40 78 00 mv r15,r2
800a6d8: b8 60 80 00 mv r16,r3
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
800a6dc: 34 02 00 00 mvi r2,0
800a6e0: 34 03 00 00 mvi r3,0
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800a6e4: b8 80 88 00 mv r17,r4
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
800a6e8: fb ff ea 84 calli 80050f8 <rtems_semaphore_obtain>
return -EINTR;
800a6ec: 34 0c ff fc mvi r12,-4
rtems_libio_t *iop
)
{
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
800a6f0: 5c 20 00 4d bne r1,r0,800a824 <pipe_read+0x180> <== NEVER TAKEN
800a6f4: 34 0c 00 00 mvi r12,0
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
800a6f8: 34 12 ff fc mvi r18,-4
800a6fc: e0 00 00 3f bi 800a7f8 <pipe_read+0x154>
return -EINTR;
while (read < count) {
while (PIPE_EMPTY(pipe)) {
/* Not an error */
if (pipe->Writers == 0)
800a700: 29 61 00 14 lw r1,(r11+20)
800a704: 44 2d 00 3e be r1,r13,800a7fc <pipe_read+0x158> <== NEVER TAKEN
goto out_locked;
if (LIBIO_NODELAY(iop)) {
800a708: 2a 2d 00 18 lw r13,(r17+24)
800a70c: 21 ad 00 01 andi r13,r13,0x1
800a710: 5d a0 00 3d bne r13,r0,800a804 <pipe_read+0x160> <== NEVER TAKEN
ret = -EAGAIN;
goto out_locked;
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
800a714: 29 61 00 18 lw r1,(r11+24)
800a718: 34 21 00 01 addi r1,r1,1
800a71c: 59 61 00 18 sw (r11+24),r1
PIPE_UNLOCK(pipe);
800a720: 29 61 00 28 lw r1,(r11+40)
800a724: fb ff ea c5 calli 8005238 <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
800a728: 29 61 00 2c lw r1,(r11+44)
800a72c: 34 02 00 00 mvi r2,0
800a730: f8 00 06 cc calli 800c260 <rtems_barrier_wait>
800a734: fc 2d 68 00 cmpne r13,r1,r13
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800a738: 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))
800a73c: c8 0d 68 00 sub r13,r0,r13
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800a740: 34 02 00 00 mvi r2,0
800a744: 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))
800a748: a1 b2 68 00 and r13,r13,r18
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800a74c: fb ff ea 6b calli 80050f8 <rtems_semaphore_obtain>
800a750: 5c 20 00 31 bne r1,r0,800a814 <pipe_read+0x170> <== NEVER TAKEN
/* WARN waitingReaders not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingReaders --;
800a754: 29 62 00 18 lw r2,(r11+24)
800a758: 34 42 ff ff addi r2,r2,-1
800a75c: 59 62 00 18 sw (r11+24),r2
if (ret != 0)
800a760: 5d a1 00 2a bne r13,r1,800a808 <pipe_read+0x164> <== NEVER TAKEN
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
while (PIPE_EMPTY(pipe)) {
800a764: 29 6d 00 0c lw r13,(r11+12)
800a768: 45 a0 ff e6 be r13,r0,800a700 <pipe_read+0x5c>
if (ret != 0)
goto out_locked;
}
/* Read chunk bytes */
chunk = MIN(count - read, pipe->Length);
800a76c: ca 0c 08 00 sub r1,r16,r12
800a770: 50 2d 00 02 bgeu r1,r13,800a778 <pipe_read+0xd4>
800a774: b8 20 68 00 mv r13,r1
chunk1 = pipe->Size - pipe->Start;
800a778: 29 65 00 08 lw r5,(r11+8)
800a77c: 29 6e 00 04 lw r14,(r11+4)
800a780: 29 66 00 00 lw r6,(r11+0)
800a784: b5 ec 08 00 add r1,r15,r12
800a788: c9 c5 70 00 sub r14,r14,r5
if (chunk > chunk1) {
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
800a78c: b4 c5 10 00 add r2,r6,r5
800a790: b9 a0 18 00 mv r3,r13
}
/* Read chunk bytes */
chunk = MIN(count - read, pipe->Length);
chunk1 = pipe->Size - pipe->Start;
if (chunk > chunk1) {
800a794: 4d cd 00 08 bge r14,r13,800a7b4 <pipe_read+0x110>
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
800a798: b4 c5 10 00 add r2,r6,r5
800a79c: b9 c0 18 00 mv r3,r14
800a7a0: f8 00 16 1c calli 8010010 <memcpy>
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
800a7a4: 29 62 00 00 lw r2,(r11+0)
800a7a8: b5 8e 08 00 add r1,r12,r14
800a7ac: b5 e1 08 00 add r1,r15,r1
800a7b0: c9 ae 18 00 sub r3,r13,r14
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
800a7b4: f8 00 16 17 calli 8010010 <memcpy>
pipe->Start += chunk;
800a7b8: 29 61 00 08 lw r1,(r11+8)
pipe->Start %= pipe->Size;
800a7bc: 29 62 00 04 lw r2,(r11+4)
800a7c0: b5 a1 08 00 add r1,r13,r1
800a7c4: f8 00 55 53 calli 801fd10 <__umodsi3>
800a7c8: 59 61 00 08 sw (r11+8),r1
pipe->Length -= chunk;
800a7cc: 29 61 00 0c lw r1,(r11+12)
800a7d0: c8 2d 08 00 sub r1,r1,r13
800a7d4: 59 61 00 0c sw (r11+12),r1
/* For buffering optimization */
if (PIPE_EMPTY(pipe))
800a7d8: 5c 20 00 02 bne r1,r0,800a7e0 <pipe_read+0x13c> <== NEVER TAKEN
pipe->Start = 0;
800a7dc: 59 60 00 08 sw (r11+8),r0
if (pipe->waitingWriters > 0)
800a7e0: 29 61 00 1c lw r1,(r11+28)
800a7e4: 44 20 00 04 be r1,r0,800a7f4 <pipe_read+0x150>
PIPE_WAKEUPWRITERS(pipe);
800a7e8: 29 61 00 30 lw r1,(r11+48)
800a7ec: 37 82 00 28 addi r2,sp,40
800a7f0: f8 00 06 7f calli 800c1ec <rtems_barrier_release>
read += chunk;
800a7f4: b5 8d 60 00 add r12,r12,r13
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
800a7f8: 56 0c ff db bgu r16,r12,800a764 <pipe_read+0xc0>
while (PIPE_EMPTY(pipe)) {
/* Not an error */
if (pipe->Writers == 0)
800a7fc: 34 0d 00 00 mvi r13,0
800a800: e0 00 00 02 bi 800a808 <pipe_read+0x164>
goto out_locked;
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
800a804: 34 0d ff f5 mvi r13,-11
PIPE_WAKEUPWRITERS(pipe);
read += chunk;
}
out_locked:
PIPE_UNLOCK(pipe);
800a808: 29 61 00 28 lw r1,(r11+40)
800a80c: fb ff ea 8b calli 8005238 <rtems_semaphore_release>
800a810: e0 00 00 02 bi 800a818 <pipe_read+0x174>
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingReaders not restored! */
ret = -EINTR;
800a814: 34 0d ff fc mvi r13,-4 <== NOT EXECUTED
out_locked:
PIPE_UNLOCK(pipe);
out_nolock:
if (read > 0)
800a818: 4c 0c 00 02 bge r0,r12,800a820 <pipe_read+0x17c>
800a81c: e0 00 00 02 bi 800a824 <pipe_read+0x180>
return read;
return ret;
800a820: b9 a0 60 00 mv r12,r13
}
800a824: b9 80 08 00 mv r1,r12
800a828: 2b 9d 00 04 lw ra,(sp+4)
800a82c: 2b 8b 00 24 lw r11,(sp+36)
800a830: 2b 8c 00 20 lw r12,(sp+32)
800a834: 2b 8d 00 1c lw r13,(sp+28)
800a838: 2b 8e 00 18 lw r14,(sp+24)
800a83c: 2b 8f 00 14 lw r15,(sp+20)
800a840: 2b 90 00 10 lw r16,(sp+16)
800a844: 2b 91 00 0c lw r17,(sp+12)
800a848: 2b 92 00 08 lw r18,(sp+8)
800a84c: 37 9c 00 28 addi sp,sp,40
800a850: c3 a0 00 00 ret
0800a1bc <pipe_release>:
*/
void pipe_release(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
800a1bc: 37 9c ff ec addi sp,sp,-20
800a1c0: 5b 8b 00 10 sw (sp+16),r11
800a1c4: 5b 8c 00 0c sw (sp+12),r12
800a1c8: 5b 8d 00 08 sw (sp+8),r13
800a1cc: 5b 9d 00 04 sw (sp+4),ra
800a1d0: b8 20 68 00 mv r13,r1
pipe_control_t *pipe = *pipep;
800a1d4: 28 2b 00 00 lw r11,(r1+0)
/* WARN pipe not released! */
if (!PIPE_LOCK(pipe))
rtems_fatal_error_occurred(0xdeadbeef);
#endif
mode = LIBIO_ACCMODE(iop);
800a1d8: 28 41 00 18 lw r1,(r2+24)
800a1dc: 20 2c 00 06 andi r12,r1,0x6
if (mode & LIBIO_FLAGS_READ)
800a1e0: 20 21 00 02 andi r1,r1,0x2
800a1e4: 44 20 00 04 be r1,r0,800a1f4 <pipe_release+0x38>
pipe->Readers --;
800a1e8: 29 61 00 10 lw r1,(r11+16)
800a1ec: 34 21 ff ff addi r1,r1,-1
800a1f0: 59 61 00 10 sw (r11+16),r1
if (mode & LIBIO_FLAGS_WRITE)
800a1f4: 21 81 00 04 andi r1,r12,0x4
800a1f8: 44 20 00 04 be r1,r0,800a208 <pipe_release+0x4c>
pipe->Writers --;
800a1fc: 29 61 00 14 lw r1,(r11+20)
800a200: 34 21 ff ff addi r1,r1,-1
800a204: 59 61 00 14 sw (r11+20),r1
PIPE_UNLOCK(pipe);
800a208: 29 61 00 28 lw r1,(r11+40)
800a20c: fb ff ec 0b calli 8005238 <rtems_semaphore_release>
if (pipe->Readers == 0 && pipe->Writers == 0) {
800a210: 29 62 00 10 lw r2,(r11+16)
800a214: 5c 40 00 07 bne r2,r0,800a230 <pipe_release+0x74>
800a218: 29 61 00 14 lw r1,(r11+20)
800a21c: 5c 22 00 05 bne r1,r2,800a230 <pipe_release+0x74>
#if 0
/* To delete an anonymous pipe file when all users closed it */
if (pipe->Anonymous)
delfile = TRUE;
#endif
pipe_free(pipe);
800a220: b9 60 08 00 mv r1,r11
800a224: fb ff ff d4 calli 800a174 <pipe_free>
*pipep = NULL;
800a228: 59 a0 00 00 sw (r13+0),r0
800a22c: e0 00 00 0f bi 800a268 <pipe_release+0xac>
}
else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE)
800a230: 7d 81 00 04 cmpnei r1,r12,4
800a234: 64 42 00 00 cmpei r2,r2,0
800a238: a0 22 10 00 and r2,r1,r2
800a23c: 44 40 00 03 be r2,r0,800a248 <pipe_release+0x8c>
/* Notify waiting Writers that all their partners left */
PIPE_WAKEUPWRITERS(pipe);
800a240: 29 61 00 30 lw r1,(r11+48)
800a244: e0 00 00 07 bi 800a260 <pipe_release+0xa4>
else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ)
800a248: 29 61 00 14 lw r1,(r11+20)
800a24c: 7d 8c 00 02 cmpnei r12,r12,2
800a250: 64 21 00 00 cmpei r1,r1,0
800a254: a1 81 60 00 and r12,r12,r1
800a258: 45 82 00 04 be r12,r2,800a268 <pipe_release+0xac> <== NEVER TAKEN
PIPE_WAKEUPREADERS(pipe);
800a25c: 29 61 00 2c lw r1,(r11+44)
800a260: 37 82 00 14 addi r2,sp,20
800a264: f8 00 07 e2 calli 800c1ec <rtems_barrier_release>
pipe_unlock();
800a268: fb ff ff ba calli 800a150 <pipe_unlock>
iop->flags &= ~LIBIO_FLAGS_OPEN;
if(iop->pathinfo.ops->unlink_h(&iop->pathinfo))
return;
#endif
}
800a26c: 2b 9d 00 04 lw ra,(sp+4)
800a270: 2b 8b 00 10 lw r11,(sp+16)
800a274: 2b 8c 00 0c lw r12,(sp+12)
800a278: 2b 8d 00 08 lw r13,(sp+8)
800a27c: 37 9c 00 14 addi sp,sp,20
800a280: c3 a0 00 00 ret
0800a854 <pipe_write>:
pipe_control_t *pipe,
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800a854: 37 9c ff d4 addi sp,sp,-44
800a858: 5b 8b 00 28 sw (sp+40),r11
800a85c: 5b 8c 00 24 sw (sp+36),r12
800a860: 5b 8d 00 20 sw (sp+32),r13
800a864: 5b 8e 00 1c sw (sp+28),r14
800a868: 5b 8f 00 18 sw (sp+24),r15
800a86c: 5b 90 00 14 sw (sp+20),r16
800a870: 5b 91 00 10 sw (sp+16),r17
800a874: 5b 92 00 0c sw (sp+12),r18
800a878: 5b 93 00 08 sw (sp+8),r19
800a87c: 5b 9d 00 04 sw (sp+4),ra
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
return 0;
800a880: 34 0c 00 00 mvi r12,0
pipe_control_t *pipe,
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
800a884: b8 20 58 00 mv r11,r1
800a888: b8 40 88 00 mv r17,r2
800a88c: b8 60 70 00 mv r14,r3
800a890: b8 80 90 00 mv r18,r4
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
800a894: 44 60 00 62 be r3,r0,800aa1c <pipe_write+0x1c8> <== NEVER TAKEN
return 0;
if (! PIPE_LOCK(pipe))
800a898: 28 21 00 28 lw r1,(r1+40)
800a89c: 34 02 00 00 mvi r2,0
800a8a0: 34 03 00 00 mvi r3,0
800a8a4: fb ff ea 15 calli 80050f8 <rtems_semaphore_obtain>
return -EINTR;
800a8a8: 34 0c ff fc mvi r12,-4
/* Write nothing */
if (count == 0)
return 0;
if (! PIPE_LOCK(pipe))
800a8ac: 5c 20 00 5c bne r1,r0,800aa1c <pipe_write+0x1c8> <== NEVER TAKEN
return -EINTR;
if (pipe->Readers == 0) {
800a8b0: 29 62 00 10 lw r2,(r11+16)
800a8b4: 44 41 00 48 be r2,r1,800a9d4 <pipe_write+0x180>
ret = -EPIPE;
goto out_locked;
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
800a8b8: 29 61 00 04 lw r1,(r11+4)
800a8bc: 34 10 00 01 mvi r16,1
800a8c0: 55 c1 00 02 bgu r14,r1,800a8c8 <pipe_write+0x74> <== NEVER TAKEN
800a8c4: b9 c0 80 00 mv r16,r14
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
800a8c8: 34 0c 00 00 mvi r12,0
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
800a8cc: 34 13 ff fc mvi r19,-4
800a8d0: e0 00 00 3e bi 800a9c8 <pipe_write+0x174>
/* 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)) {
800a8d4: 2a 4d 00 18 lw r13,(r18+24)
800a8d8: 21 ad 00 01 andi r13,r13,0x1
800a8dc: 5d a0 00 41 bne r13,r0,800a9e0 <pipe_write+0x18c>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
800a8e0: 29 61 00 1c lw r1,(r11+28)
800a8e4: 34 21 00 01 addi r1,r1,1
800a8e8: 59 61 00 1c sw (r11+28),r1
PIPE_UNLOCK(pipe);
800a8ec: 29 61 00 28 lw r1,(r11+40)
800a8f0: fb ff ea 52 calli 8005238 <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
800a8f4: 29 61 00 30 lw r1,(r11+48)
800a8f8: 34 02 00 00 mvi r2,0
800a8fc: f8 00 06 59 calli 800c260 <rtems_barrier_wait>
800a900: fc 2d 68 00 cmpne r13,r1,r13
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800a904: 29 61 00 28 lw r1,(r11+40)
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
800a908: c8 0d 68 00 sub r13,r0,r13
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800a90c: 34 02 00 00 mvi r2,0
800a910: 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))
800a914: a1 b3 68 00 and r13,r13,r19
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
800a918: fb ff e9 f8 calli 80050f8 <rtems_semaphore_obtain>
800a91c: 5c 20 00 3c bne r1,r0,800aa0c <pipe_write+0x1b8> <== NEVER TAKEN
/* WARN waitingWriters not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingWriters --;
800a920: 29 62 00 1c lw r2,(r11+28)
800a924: 34 42 ff ff addi r2,r2,-1
800a928: 59 62 00 1c sw (r11+28),r2
if (ret != 0)
800a92c: 5d a1 00 30 bne r13,r1,800a9ec <pipe_write+0x198> <== NEVER TAKEN
goto out_locked;
if (pipe->Readers == 0) {
800a930: 29 61 00 10 lw r1,(r11+16)
800a934: 44 2d 00 2d be r1,r13,800a9e8 <pipe_write+0x194> <== NEVER TAKEN
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
800a938: 29 6f 00 04 lw r15,(r11+4)
800a93c: 29 61 00 0c lw r1,(r11+12)
800a940: c9 e1 68 00 sub r13,r15,r1
800a944: 56 0d ff e4 bgu r16,r13,800a8d4 <pipe_write+0x80>
ret = -EPIPE;
goto out_locked;
}
}
chunk = MIN(count - written, PIPE_SPACE(pipe));
800a948: c9 cc 10 00 sub r2,r14,r12
800a94c: 50 4d 00 02 bgeu r2,r13,800a954 <pipe_write+0x100>
800a950: b8 40 68 00 mv r13,r2
chunk1 = pipe->Size - PIPE_WSTART(pipe);
800a954: 29 62 00 08 lw r2,(r11+8)
800a958: b4 22 08 00 add r1,r1,r2
800a95c: b9 e0 10 00 mv r2,r15
800a960: f8 00 54 ec calli 801fd10 <__umodsi3>
800a964: c9 e1 78 00 sub r15,r15,r1
800a968: 29 63 00 00 lw r3,(r11+0)
800a96c: b6 2c 10 00 add r2,r17,r12
if (chunk > chunk1) {
800a970: 4d ed 00 09 bge r15,r13,800a994 <pipe_write+0x140>
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1);
800a974: b4 61 08 00 add r1,r3,r1
800a978: b9 e0 18 00 mv r3,r15
800a97c: f8 00 15 a5 calli 8010010 <memcpy>
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
800a980: b5 ec 10 00 add r2,r15,r12
800a984: 29 61 00 00 lw r1,(r11+0)
800a988: b6 22 10 00 add r2,r17,r2
800a98c: c9 af 18 00 sub r3,r13,r15
800a990: e0 00 00 03 bi 800a99c <pipe_write+0x148>
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
800a994: b4 61 08 00 add r1,r3,r1
800a998: b9 a0 18 00 mv r3,r13
800a99c: f8 00 15 9d calli 8010010 <memcpy>
pipe->Length += chunk;
800a9a0: 29 61 00 0c lw r1,(r11+12)
800a9a4: b4 2d 08 00 add r1,r1,r13
800a9a8: 59 61 00 0c sw (r11+12),r1
if (pipe->waitingReaders > 0)
800a9ac: 29 61 00 18 lw r1,(r11+24)
800a9b0: 44 20 00 04 be r1,r0,800a9c0 <pipe_write+0x16c>
PIPE_WAKEUPREADERS(pipe);
800a9b4: 29 61 00 2c lw r1,(r11+44)
800a9b8: 37 82 00 2c addi r2,sp,44
800a9bc: f8 00 06 0c calli 800c1ec <rtems_barrier_release>
written += chunk;
800a9c0: b5 8d 60 00 add r12,r12,r13
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
800a9c4: 34 10 00 01 mvi r16,1
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
800a9c8: 55 cc ff dc bgu r14,r12,800a938 <pipe_write+0xe4>
800a9cc: 34 0d 00 00 mvi r13,0
800a9d0: e0 00 00 07 bi 800a9ec <pipe_write+0x198>
if (! PIPE_LOCK(pipe))
return -EINTR;
if (pipe->Readers == 0) {
ret = -EPIPE;
800a9d4: 34 0d ff e0 mvi r13,-32
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
int chunk, chunk1, written = 0, ret = 0;
800a9d8: 34 0c 00 00 mvi r12,0
800a9dc: e0 00 00 04 bi 800a9ec <pipe_write+0x198>
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
while (PIPE_SPACE(pipe) < chunk) {
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
800a9e0: 34 0d ff f5 mvi r13,-11
800a9e4: e0 00 00 02 bi 800a9ec <pipe_write+0x198>
pipe->waitingWriters --;
if (ret != 0)
goto out_locked;
if (pipe->Readers == 0) {
ret = -EPIPE;
800a9e8: 34 0d ff e0 mvi r13,-32 <== NOT EXECUTED
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
}
out_locked:
PIPE_UNLOCK(pipe);
800a9ec: 29 61 00 28 lw r1,(r11+40)
800a9f0: fb ff ea 12 calli 8005238 <rtems_semaphore_release>
out_nolock:
#ifdef RTEMS_POSIX_API
/* Signal SIGPIPE */
if (ret == -EPIPE)
800a9f4: 34 01 ff e0 mvi r1,-32
800a9f8: 5d a1 00 06 bne r13,r1,800aa10 <pipe_write+0x1bc>
kill(getpid(), SIGPIPE);
800a9fc: f8 00 02 53 calli 800b348 <getpid>
800aa00: 34 02 00 0d mvi r2,13
800aa04: f8 00 03 37 calli 800b6e0 <kill>
800aa08: e0 00 00 02 bi 800aa10 <pipe_write+0x1bc>
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingWriters not restored! */
ret = -EINTR;
800aa0c: 34 0d ff fc mvi r13,-4 <== NOT EXECUTED
/* Signal SIGPIPE */
if (ret == -EPIPE)
kill(getpid(), SIGPIPE);
#endif
if (written > 0)
800aa10: 4c 0c 00 02 bge r0,r12,800aa18 <pipe_write+0x1c4>
800aa14: e0 00 00 02 bi 800aa1c <pipe_write+0x1c8>
800aa18: b9 a0 60 00 mv r12,r13
return written;
return ret;
}
800aa1c: b9 80 08 00 mv r1,r12
800aa20: 2b 9d 00 04 lw ra,(sp+4)
800aa24: 2b 8b 00 28 lw r11,(sp+40)
800aa28: 2b 8c 00 24 lw r12,(sp+36)
800aa2c: 2b 8d 00 20 lw r13,(sp+32)
800aa30: 2b 8e 00 1c lw r14,(sp+28)
800aa34: 2b 8f 00 18 lw r15,(sp+24)
800aa38: 2b 90 00 14 lw r16,(sp+20)
800aa3c: 2b 91 00 10 lw r17,(sp+16)
800aa40: 2b 92 00 0c lw r18,(sp+12)
800aa44: 2b 93 00 08 lw r19,(sp+8)
800aa48: 37 9c 00 2c addi sp,sp,44
800aa4c: c3 a0 00 00 ret
0800842c <pthread_attr_setschedpolicy>:
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
800842c: 34 03 00 16 mvi r3,22
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
8008430: 44 20 00 0c be r1,r0,8008460 <pthread_attr_setschedpolicy+0x34>
8008434: 28 24 00 00 lw r4,(r1+0)
8008438: 44 80 00 0a be r4,r0,8008460 <pthread_attr_setschedpolicy+0x34>
return EINVAL;
switch ( policy ) {
800843c: 48 02 00 08 bg r0,r2,800845c <pthread_attr_setschedpolicy+0x30>
8008440: 34 03 00 02 mvi r3,2
8008444: 4c 62 00 03 bge r3,r2,8008450 <pthread_attr_setschedpolicy+0x24>
8008448: 34 03 00 04 mvi r3,4
800844c: 5c 43 00 04 bne r2,r3,800845c <pthread_attr_setschedpolicy+0x30><== NEVER TAKEN
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
8008450: 58 22 00 14 sw (r1+20),r2
return 0;
8008454: 34 03 00 00 mvi r3,0
8008458: e0 00 00 02 bi 8008460 <pthread_attr_setschedpolicy+0x34>
default:
return ENOTSUP;
800845c: 34 03 00 86 mvi r3,134
}
}
8008460: b8 60 08 00 mv r1,r3
8008464: c3 a0 00 00 ret
0800340c <pthread_barrier_init>:
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
800340c: 37 9c ff dc addi sp,sp,-36
8003410: 5b 8b 00 14 sw (sp+20),r11
8003414: 5b 8c 00 10 sw (sp+16),r12
8003418: 5b 8d 00 0c sw (sp+12),r13
800341c: 5b 8e 00 08 sw (sp+8),r14
8003420: 5b 9d 00 04 sw (sp+4),ra
/*
* Error check parameters
*/
if ( !barrier )
return EINVAL;
8003424: 34 04 00 16 mvi r4,22
int pthread_barrier_init(
pthread_barrier_t *barrier,
const pthread_barrierattr_t *attr,
unsigned int count
)
{
8003428: b8 20 68 00 mv r13,r1
800342c: b8 60 58 00 mv r11,r3
const pthread_barrierattr_t *the_attr;
/*
* Error check parameters
*/
if ( !barrier )
8003430: 44 20 00 2a be r1,r0,80034d8 <pthread_barrier_init+0xcc>
return EINVAL;
if ( count == 0 )
8003434: 44 60 00 29 be r3,r0,80034d8 <pthread_barrier_init+0xcc>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
8003438: 5c 40 00 05 bne r2,r0,800344c <pthread_barrier_init+0x40>
the_attr = attr;
} else {
(void) pthread_barrierattr_init( &my_attr );
800343c: 37 8c 00 18 addi r12,sp,24
8003440: b9 80 08 00 mv r1,r12
8003444: fb ff ff bb calli 8003330 <pthread_barrierattr_init>
the_attr = &my_attr;
8003448: b9 80 10 00 mv r2,r12
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
800344c: 28 41 00 00 lw r1,(r2+0)
return EINVAL;
8003450: 34 04 00 16 mvi r4,22
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
8003454: 44 20 00 21 be r1,r0,80034d8 <pthread_barrier_init+0xcc>
return EINVAL;
switch ( the_attr->process_shared ) {
8003458: 28 4e 00 04 lw r14,(r2+4)
800345c: 5d c0 00 1f bne r14,r0,80034d8 <pthread_barrier_init+0xcc> <== NEVER TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8003460: 78 02 08 01 mvhi r2,0x801
8003464: 38 42 68 68 ori r2,r2,0x6868
8003468: 28 41 00 00 lw r1,(r2+0)
}
/*
* Convert from POSIX attributes to Core Barrier attributes
*/
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
800346c: 5b 80 00 20 sw (sp+32),r0
the_attributes.maximum_count = count;
8003470: 5b 8b 00 24 sw (sp+36),r11
8003474: 34 21 00 01 addi r1,r1,1
8003478: 58 41 00 00 sw (r2+0),r1
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void )
{
return (POSIX_Barrier_Control *)
_Objects_Allocate( &_POSIX_Barrier_Information );
800347c: 78 0c 08 01 mvhi r12,0x801
8003480: 39 8c 6b c0 ori r12,r12,0x6bc0
8003484: b9 80 08 00 mv r1,r12
8003488: f8 00 07 e5 calli 800541c <_Objects_Allocate>
800348c: b8 20 58 00 mv r11,r1
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _POSIX_Barrier_Allocate();
if ( !the_barrier ) {
8003490: 5c 2e 00 04 bne r1,r14,80034a0 <pthread_barrier_init+0x94>
_Thread_Enable_dispatch();
8003494: f8 00 0c 65 calli 8006628 <_Thread_Enable_dispatch>
return EAGAIN;
8003498: 34 04 00 0b mvi r4,11
800349c: e0 00 00 0f bi 80034d8 <pthread_barrier_init+0xcc>
}
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
80034a0: 34 21 00 10 addi r1,r1,16
80034a4: 37 82 00 20 addi r2,sp,32
80034a8: f8 00 04 e8 calli 8004848 <_CORE_barrier_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
80034ac: 29 6e 00 08 lw r14,(r11+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80034b0: 29 8c 00 1c lw r12,(r12+28)
80034b4: 34 02 00 02 mvi r2,2
80034b8: 21 c1 ff ff andi r1,r14,0xffff
80034bc: f8 00 3d bb calli 8012ba8 <__ashlsi3>
80034c0: b5 81 08 00 add r1,r12,r1
80034c4: 58 2b 00 00 sw (r1+0),r11
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
80034c8: 59 60 00 0c sw (r11+12),r0
);
/*
* Exit the critical section and return the user an operational barrier
*/
*barrier = the_barrier->Object.id;
80034cc: 59 ae 00 00 sw (r13+0),r14
_Thread_Enable_dispatch();
80034d0: f8 00 0c 56 calli 8006628 <_Thread_Enable_dispatch>
return 0;
80034d4: 34 04 00 00 mvi r4,0
}
80034d8: b8 80 08 00 mv r1,r4
80034dc: 2b 9d 00 04 lw ra,(sp+4)
80034e0: 2b 8b 00 14 lw r11,(sp+20)
80034e4: 2b 8c 00 10 lw r12,(sp+16)
80034e8: 2b 8d 00 0c lw r13,(sp+12)
80034ec: 2b 8e 00 08 lw r14,(sp+8)
80034f0: 37 9c 00 24 addi sp,sp,36
80034f4: c3 a0 00 00 ret
08002c88 <pthread_cleanup_push>:
void pthread_cleanup_push(
void (*routine)( void * ),
void *arg
)
{
8002c88: 37 9c ff f4 addi sp,sp,-12
8002c8c: 5b 8b 00 0c sw (sp+12),r11
8002c90: 5b 8c 00 08 sw (sp+8),r12
8002c94: 5b 9d 00 04 sw (sp+4),ra
8002c98: b8 20 58 00 mv r11,r1
8002c9c: 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 )
8002ca0: 44 20 00 13 be r1,r0,8002cec <pthread_cleanup_push+0x64>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8002ca4: 78 03 08 01 mvhi r3,0x801
8002ca8: 38 63 68 50 ori r3,r3,0x6850
8002cac: 28 61 00 00 lw r1,(r3+0)
8002cb0: 34 21 00 01 addi r1,r1,1
8002cb4: 58 61 00 00 sw (r3+0),r1
return;
_Thread_Disable_dispatch();
handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
8002cb8: 34 01 00 10 mvi r1,16
8002cbc: f8 00 11 87 calli 80072d8 <_Workspace_Allocate>
8002cc0: b8 20 10 00 mv r2,r1
if ( handler ) {
8002cc4: 44 20 00 09 be r1,r0,8002ce8 <pthread_cleanup_push+0x60> <== NEVER TAKEN
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
8002cc8: 78 03 08 01 mvhi r3,0x801
8002ccc: 38 63 6d 20 ori r3,r3,0x6d20
8002cd0: 28 61 00 0c lw r1,(r3+12)
handler_stack = &thread_support->Cancellation_Handlers;
8002cd4: 28 21 01 20 lw r1,(r1+288)
handler->routine = routine;
8002cd8: 58 4b 00 08 sw (r2+8),r11
handler->arg = arg;
8002cdc: 58 4c 00 0c sw (r2+12),r12
_Chain_Append( handler_stack, &handler->Node );
8002ce0: 34 21 00 e4 addi r1,r1,228
8002ce4: f8 00 04 f8 calli 80040c4 <_Chain_Append>
}
_Thread_Enable_dispatch();
8002ce8: f8 00 0c 3f calli 8005de4 <_Thread_Enable_dispatch>
}
8002cec: 2b 9d 00 04 lw ra,(sp+4)
8002cf0: 2b 8b 00 0c lw r11,(sp+12)
8002cf4: 2b 8c 00 08 lw r12,(sp+8)
8002cf8: 37 9c 00 0c addi sp,sp,12
8002cfc: c3 a0 00 00 ret
08003d50 <pthread_cond_init>:
int pthread_cond_init(
pthread_cond_t *cond,
const pthread_condattr_t *attr
)
{
8003d50: 37 9c ff ec addi sp,sp,-20
8003d54: 5b 8b 00 14 sw (sp+20),r11
8003d58: 5b 8c 00 10 sw (sp+16),r12
8003d5c: 5b 8d 00 0c sw (sp+12),r13
8003d60: 5b 8e 00 08 sw (sp+8),r14
8003d64: 5b 9d 00 04 sw (sp+4),ra
8003d68: b8 20 70 00 mv r14,r1
8003d6c: b8 40 58 00 mv r11,r2
POSIX_Condition_variables_Control *the_cond;
const pthread_condattr_t *the_attr;
if ( attr ) the_attr = attr;
8003d70: 5c 40 00 03 bne r2,r0,8003d7c <pthread_cond_init+0x2c>
else the_attr = &_POSIX_Condition_variables_Default_attributes;
8003d74: 78 0b 08 01 mvhi r11,0x801
8003d78: 39 6b 59 d8 ori r11,r11,0x59d8
/*
* Be careful about attributes when global!!!
*/
if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
8003d7c: 29 63 00 04 lw r3,(r11+4)
8003d80: 34 02 00 01 mvi r2,1
return EINVAL;
8003d84: 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 )
8003d88: 44 62 00 26 be r3,r2,8003e20 <pthread_cond_init+0xd0> <== NEVER TAKEN
return EINVAL;
if ( !the_attr->is_initialized )
8003d8c: 29 62 00 00 lw r2,(r11+0)
8003d90: 44 40 00 24 be r2,r0,8003e20 <pthread_cond_init+0xd0>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8003d94: 78 02 08 01 mvhi r2,0x801
8003d98: 38 42 78 68 ori r2,r2,0x7868
8003d9c: 28 41 00 00 lw r1,(r2+0)
8003da0: 34 21 00 01 addi r1,r1,1
8003da4: 58 41 00 00 sw (r2+0),r1
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Allocate( void )
{
return (POSIX_Condition_variables_Control *)
_Objects_Allocate( &_POSIX_Condition_variables_Information );
8003da8: 78 0d 08 01 mvhi r13,0x801
8003dac: 39 ad 7c 58 ori r13,r13,0x7c58
8003db0: b9 a0 08 00 mv r1,r13
8003db4: f8 00 09 86 calli 80063cc <_Objects_Allocate>
8003db8: b8 20 60 00 mv r12,r1
_Thread_Disable_dispatch();
the_cond = _POSIX_Condition_variables_Allocate();
if ( !the_cond ) {
8003dbc: 5c 20 00 04 bne r1,r0,8003dcc <pthread_cond_init+0x7c>
_Thread_Enable_dispatch();
8003dc0: f8 00 0e 77 calli 800779c <_Thread_Enable_dispatch>
return ENOMEM;
8003dc4: 34 01 00 0c mvi r1,12
8003dc8: e0 00 00 16 bi 8003e20 <pthread_cond_init+0xd0>
the_cond->process_shared = the_attr->process_shared;
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
8003dcc: 78 04 08 01 mvhi r4,0x801
if ( !the_cond ) {
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
8003dd0: 29 61 00 04 lw r1,(r11+4)
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
8003dd4: 38 84 59 e0 ori r4,r4,0x59e0
8003dd8: 28 83 00 00 lw r3,(r4+0)
if ( !the_cond ) {
_Thread_Enable_dispatch();
return ENOMEM;
}
the_cond->process_shared = the_attr->process_shared;
8003ddc: 59 81 00 10 sw (r12+16),r1
the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
_Thread_queue_Initialize(
8003de0: 34 04 00 74 mvi r4,116
8003de4: 35 81 00 18 addi r1,r12,24
8003de8: 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;
8003dec: 59 80 00 14 sw (r12+20),r0
_Thread_queue_Initialize(
8003df0: f8 00 10 b6 calli 80080c8 <_Thread_queue_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8003df4: 29 8b 00 08 lw r11,(r12+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8003df8: 29 ad 00 1c lw r13,(r13+28)
8003dfc: 34 02 00 02 mvi r2,2
8003e00: 21 61 ff ff andi r1,r11,0xffff
8003e04: f8 00 3f 20 calli 8013a84 <__ashlsi3>
8003e08: b5 a1 10 00 add r2,r13,r1
8003e0c: 58 4c 00 00 sw (r2+0),r12
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
8003e10: 59 80 00 0c sw (r12+12),r0
&_POSIX_Condition_variables_Information,
&the_cond->Object,
0
);
*cond = the_cond->Object.id;
8003e14: 59 cb 00 00 sw (r14+0),r11
_Thread_Enable_dispatch();
8003e18: f8 00 0e 61 calli 800779c <_Thread_Enable_dispatch>
return 0;
8003e1c: 34 01 00 00 mvi r1,0
}
8003e20: 2b 9d 00 04 lw ra,(sp+4)
8003e24: 2b 8b 00 14 lw r11,(sp+20)
8003e28: 2b 8c 00 10 lw r12,(sp+16)
8003e2c: 2b 8d 00 0c lw r13,(sp+12)
8003e30: 2b 8e 00 08 lw r14,(sp+8)
8003e34: 37 9c 00 14 addi sp,sp,20
8003e38: c3 a0 00 00 ret
08003bc4 <pthread_condattr_destroy>:
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
return EINVAL;
8003bc4: 34 02 00 16 mvi r2,22
int pthread_condattr_destroy(
pthread_condattr_t *attr
)
{
if ( !attr || attr->is_initialized == false )
8003bc8: 44 20 00 05 be r1,r0,8003bdc <pthread_condattr_destroy+0x18>
8003bcc: 28 23 00 00 lw r3,(r1+0)
8003bd0: 44 60 00 03 be r3,r0,8003bdc <pthread_condattr_destroy+0x18><== NEVER TAKEN
return EINVAL;
attr->is_initialized = false;
8003bd4: 58 20 00 00 sw (r1+0),r0
return 0;
8003bd8: 34 02 00 00 mvi r2,0
}
8003bdc: b8 40 08 00 mv r1,r2
8003be0: c3 a0 00 00 ret
080030a0 <pthread_create>:
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
80030a0: 37 9c ff a0 addi sp,sp,-96
80030a4: 5b 8b 00 3c sw (sp+60),r11
80030a8: 5b 8c 00 38 sw (sp+56),r12
80030ac: 5b 8d 00 34 sw (sp+52),r13
80030b0: 5b 8e 00 30 sw (sp+48),r14
80030b4: 5b 8f 00 2c sw (sp+44),r15
80030b8: 5b 90 00 28 sw (sp+40),r16
80030bc: 5b 91 00 24 sw (sp+36),r17
80030c0: 5b 92 00 20 sw (sp+32),r18
80030c4: 5b 93 00 1c sw (sp+28),r19
80030c8: 5b 94 00 18 sw (sp+24),r20
80030cc: 5b 95 00 14 sw (sp+20),r21
80030d0: 5b 9d 00 10 sw (sp+16),ra
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
return EFAULT;
80030d4: 34 0d 00 0e mvi r13,14
pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)( void * ),
void *arg
)
{
80030d8: b8 20 88 00 mv r17,r1
80030dc: b8 60 80 00 mv r16,r3
80030e0: b8 80 90 00 mv r18,r4
int schedpolicy = SCHED_RR;
struct sched_param schedparam;
Objects_Name name;
int rc;
if ( !start_routine )
80030e4: 44 60 00 a5 be r3,r0,8003378 <pthread_create+0x2d8>
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
80030e8: b8 40 58 00 mv r11,r2
80030ec: 5c 40 00 03 bne r2,r0,80030f8 <pthread_create+0x58>
80030f0: 78 0b 08 01 mvhi r11,0x801
80030f4: 39 6b d3 dc ori r11,r11,0xd3dc
if ( !the_attr->is_initialized )
80030f8: 29 61 00 00 lw r1,(r11+0)
return EINVAL;
80030fc: 34 0d 00 16 mvi r13,22
if ( !start_routine )
return EFAULT;
the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
if ( !the_attr->is_initialized )
8003100: 44 20 00 9e be r1,r0,8003378 <pthread_create+0x2d8>
* 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) )
8003104: 29 61 00 04 lw r1,(r11+4)
8003108: 44 20 00 06 be r1,r0,8003120 <pthread_create+0x80>
800310c: 78 02 08 01 mvhi r2,0x801
8003110: 38 42 f0 e0 ori r2,r2,0xf0e0
8003114: 29 63 00 08 lw r3,(r11+8)
8003118: 28 41 00 00 lw r1,(r2+0)
800311c: 54 23 00 97 bgu r1,r3,8003378 <pthread_create+0x2d8>
* 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 ) {
8003120: 29 62 00 10 lw r2,(r11+16)
8003124: 34 01 00 01 mvi r1,1
8003128: 44 41 00 05 be r2,r1,800313c <pthread_create+0x9c>
800312c: 34 01 00 02 mvi r1,2
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
break;
default:
return EINVAL;
8003130: 34 0d 00 16 mvi r13,22
* If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread
* inherits scheduling attributes from the creating thread. If it is
* PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
8003134: 5c 41 00 91 bne r2,r1,8003378 <pthread_create+0x2d8>
8003138: e0 00 00 14 bi 8003188 <pthread_create+0xe8>
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
800313c: 78 02 08 01 mvhi r2,0x801
8003140: 38 42 fd 28 ori r2,r2,0xfd28
8003144: 28 41 00 0c lw r1,(r2+12)
8003148: 28 22 01 20 lw r2,(r1+288)
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
800314c: 28 48 00 88 lw r8,(r2+136)
8003150: 28 47 00 8c lw r7,(r2+140)
8003154: 28 46 00 90 lw r6,(r2+144)
8003158: 28 45 00 94 lw r5,(r2+148)
800315c: 28 44 00 98 lw r4,(r2+152)
8003160: 28 43 00 9c lw r3,(r2+156)
* attributes structure.
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
schedpolicy = api->schedpolicy;
8003164: 28 4f 00 84 lw r15,(r2+132)
schedparam = api->schedparam;
8003168: 28 41 00 a0 lw r1,(r2+160)
800316c: 5b 88 00 40 sw (sp+64),r8
8003170: 5b 87 00 44 sw (sp+68),r7
8003174: 5b 86 00 48 sw (sp+72),r6
8003178: 5b 85 00 4c sw (sp+76),r5
800317c: 5b 84 00 50 sw (sp+80),r4
8003180: 5b 83 00 54 sw (sp+84),r3
8003184: e0 00 00 0f bi 80031c0 <pthread_create+0x120>
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
8003188: 29 67 00 18 lw r7,(r11+24)
800318c: 29 66 00 1c lw r6,(r11+28)
8003190: 29 65 00 20 lw r5,(r11+32)
8003194: 29 64 00 24 lw r4,(r11+36)
8003198: 29 63 00 28 lw r3,(r11+40)
800319c: 29 62 00 2c lw r2,(r11+44)
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
80031a0: 29 6f 00 14 lw r15,(r11+20)
schedparam = the_attr->schedparam;
80031a4: 29 61 00 30 lw r1,(r11+48)
80031a8: 5b 87 00 40 sw (sp+64),r7
80031ac: 5b 86 00 44 sw (sp+68),r6
80031b0: 5b 85 00 48 sw (sp+72),r5
80031b4: 5b 84 00 4c sw (sp+76),r4
80031b8: 5b 83 00 50 sw (sp+80),r3
80031bc: 5b 82 00 54 sw (sp+84),r2
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
80031c0: 29 6c 00 0c lw r12,(r11+12)
schedparam = api->schedparam;
break;
case PTHREAD_EXPLICIT_SCHED:
schedpolicy = the_attr->schedpolicy;
schedparam = the_attr->schedparam;
80031c4: 5b 81 00 58 sw (sp+88),r1
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
return ENOTSUP;
80031c8: 34 0d 00 86 mvi r13,134
/*
* Check the contentionscope since rtems only supports PROCESS wide
* contention (i.e. no system wide contention).
*/
if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
80031cc: 5d 80 00 6b bne r12,r0,8003378 <pthread_create+0x2d8>
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
80031d0: 2b 81 00 40 lw r1,(sp+64)
return EINVAL;
80031d4: 34 0d 00 16 mvi r13,22
return ENOTSUP;
/*
* Interpret the scheduling parameters.
*/
if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
80031d8: f8 00 1b 99 calli 800a03c <_POSIX_Priority_Is_valid>
80031dc: 44 2c 00 67 be r1,r12,8003378 <pthread_create+0x2d8> <== NEVER TAKEN
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
int priority
)
{
return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
80031e0: 78 02 08 01 mvhi r2,0x801
80031e4: 38 42 f0 e4 ori r2,r2,0xf0e4
80031e8: 40 54 00 00 lbu r20,(r2+0)
core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
80031ec: b9 e0 08 00 mv r1,r15
80031f0: 37 82 00 40 addi r2,sp,64
80031f4: 37 83 00 60 addi r3,sp,96
80031f8: 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 );
80031fc: 2b 93 00 40 lw r19,(sp+64)
/*
* Set the core scheduling policy information.
*/
rc = _POSIX_Thread_Translate_sched_param(
8003200: f8 00 1b 97 calli 800a05c <_POSIX_Thread_Translate_sched_param>
8003204: b8 20 68 00 mv r13,r1
schedpolicy,
&schedparam,
&budget_algorithm,
&budget_callout
);
if ( rc )
8003208: 5c 20 00 5c bne r1,r0,8003378 <pthread_create+0x2d8> <== NEVER TAKEN
#endif
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
800320c: 78 0c 08 01 mvhi r12,0x801
8003210: 39 8c f9 18 ori r12,r12,0xf918
8003214: 29 81 00 00 lw r1,(r12+0)
8003218: f8 00 04 f5 calli 80045ec <_API_Mutex_Lock>
* _POSIX_Threads_Allocate
*/
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
800321c: 78 02 08 01 mvhi r2,0x801
8003220: b8 40 08 00 mv r1,r2
8003224: 38 21 fa 30 ori r1,r1,0xfa30
8003228: f8 00 08 07 calli 8005244 <_Objects_Allocate>
800322c: b8 20 70 00 mv r14,r1
* Allocate the thread control block.
*
* NOTE: Global threads are not currently supported.
*/
the_thread = _POSIX_Threads_Allocate();
if ( !the_thread ) {
8003230: 5c 2d 00 03 bne r1,r13,800323c <pthread_create+0x19c>
_RTEMS_Unlock_allocator();
8003234: 29 81 00 00 lw r1,(r12+0)
8003238: e0 00 00 21 bi 80032bc <pthread_create+0x21c>
static inline size_t _POSIX_Threads_Ensure_minimum_stack (
size_t size
)
{
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
800323c: 78 02 08 01 mvhi r2,0x801
8003240: 38 42 f0 e0 ori r2,r2,0xf0e0
8003244: 28 41 00 00 lw r1,(r2+0)
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
8003248: 29 6c 00 08 lw r12,(r11+8)
static inline size_t _POSIX_Threads_Ensure_minimum_stack (
size_t size
)
{
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
800324c: 34 02 00 01 mvi r2,1
8003250: f8 00 61 e5 calli 801b9e4 <__ashlsi3>
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
8003254: 29 75 00 04 lw r21,(r11+4)
static inline size_t _POSIX_Threads_Ensure_minimum_stack (
size_t size
)
{
if ( size >= PTHREAD_MINIMUM_STACK_SIZE )
8003258: b8 20 28 00 mv r5,r1
/*
* Initialize the core thread for this task.
*/
name.name_p = NULL; /* posix threads don't have a name by default */
status = _Thread_Initialize(
800325c: 50 2c 00 02 bgeu r1,r12,8003264 <pthread_create+0x1c4>
8003260: b9 80 28 00 mv r5,r12
8003264: 2b 81 00 5c lw r1,(sp+92)
8003268: 78 0c 08 01 mvhi r12,0x801
800326c: 2b 88 00 60 lw r8,(sp+96)
8003270: 39 8c fa 30 ori r12,r12,0xfa30
8003274: 5b 81 00 04 sw (sp+4),r1
8003278: b8 a0 20 00 mv r4,r5
800327c: b9 80 08 00 mv r1,r12
8003280: b9 c0 10 00 mv r2,r14
8003284: ba a0 18 00 mv r3,r21
8003288: 34 05 00 00 mvi r5,0
800328c: ca 93 30 00 sub r6,r20,r19
8003290: 34 07 00 01 mvi r7,1
8003294: 5b 80 00 08 sw (sp+8),r0
8003298: 5b 80 00 0c sw (sp+12),r0
800329c: f8 00 0c c7 calli 80065b8 <_Thread_Initialize>
budget_callout,
0, /* isr level */
name /* posix threads don't have a name */
);
if ( !status ) {
80032a0: 5c 20 00 0a bne r1,r0,80032c8 <pthread_create+0x228> <== ALWAYS TAKEN
RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
Thread_Control *the_pthread
)
{
_Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
80032a4: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
80032a8: b9 c0 10 00 mv r2,r14 <== NOT EXECUTED
80032ac: f8 00 08 e2 calli 8005634 <_Objects_Free> <== NOT EXECUTED
_POSIX_Threads_Free( the_thread );
_RTEMS_Unlock_allocator();
80032b0: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
80032b4: 38 21 f9 18 ori r1,r1,0xf918 <== NOT EXECUTED
80032b8: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED
80032bc: f8 00 04 e9 calli 8004660 <_API_Mutex_Unlock>
return EAGAIN;
80032c0: 34 0d 00 0b mvi r13,11
80032c4: e0 00 00 2d bi 8003378 <pthread_create+0x2d8>
}
/*
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
80032c8: 29 cc 01 20 lw r12,(r14+288)
api->Attributes = *the_attr;
80032cc: b9 60 10 00 mv r2,r11
80032d0: 34 03 00 40 mvi r3,64
80032d4: b9 80 08 00 mv r1,r12
80032d8: f8 00 2a d9 calli 800de3c <memcpy>
api->detachstate = the_attr->detachstate;
80032dc: 29 61 00 3c lw r1,(r11+60)
api->schedparam = schedparam;
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
80032e0: 34 02 00 01 mvi r2,1
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
api->schedpolicy = schedpolicy;
80032e4: 59 8f 00 84 sw (r12+132),r15
* finish initializing the per API structure
*/
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
80032e8: 59 81 00 40 sw (r12+64),r1
api->schedpolicy = schedpolicy;
api->schedparam = schedparam;
80032ec: 2b 81 00 40 lw r1,(sp+64)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
80032f0: ba 00 18 00 mv r3,r16
80032f4: ba 40 20 00 mv r4,r18
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
api->schedpolicy = schedpolicy;
api->schedparam = schedparam;
80032f8: 59 81 00 88 sw (r12+136),r1
80032fc: 2b 81 00 44 lw r1,(sp+68)
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
8003300: 34 05 00 00 mvi r5,0
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
api->Attributes = *the_attr;
api->detachstate = the_attr->detachstate;
api->schedpolicy = schedpolicy;
api->schedparam = schedparam;
8003304: 59 81 00 8c sw (r12+140),r1
8003308: 2b 81 00 48 lw r1,(sp+72)
800330c: 59 81 00 90 sw (r12+144),r1
8003310: 2b 81 00 4c lw r1,(sp+76)
8003314: 59 81 00 94 sw (r12+148),r1
8003318: 2b 81 00 50 lw r1,(sp+80)
800331c: 59 81 00 98 sw (r12+152),r1
8003320: 2b 81 00 54 lw r1,(sp+84)
8003324: 59 81 00 9c sw (r12+156),r1
8003328: 2b 81 00 58 lw r1,(sp+88)
800332c: 59 81 00 a0 sw (r12+160),r1
/*
* POSIX threads are allocated and started in one operation.
*/
status = _Thread_Start(
8003330: b9 c0 08 00 mv r1,r14
8003334: f8 00 0f 86 calli 800714c <_Thread_Start>
_RTEMS_Unlock_allocator();
return EINVAL;
}
#endif
if ( schedpolicy == SCHED_SPORADIC ) {
8003338: 34 01 00 04 mvi r1,4
800333c: 5d e1 00 09 bne r15,r1,8003360 <pthread_create+0x2c0>
_Watchdog_Insert_ticks(
8003340: 35 81 00 90 addi r1,r12,144
8003344: f8 00 10 09 calli 8007368 <_Timespec_To_ticks>
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8003348: 78 02 08 01 mvhi r2,0x801
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
800334c: 59 81 00 b4 sw (r12+180),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8003350: b8 40 08 00 mv r1,r2
8003354: 38 21 f9 38 ori r1,r1,0xf938
8003358: 35 82 00 a8 addi r2,r12,168
800335c: f8 00 11 38 calli 800783c <_Watchdog_Insert>
}
/*
* Return the id and indicate we successfully created the thread
*/
*thread = the_thread->Object.id;
8003360: 29 c1 00 08 lw r1,(r14+8)
8003364: 5a 21 00 00 sw (r17+0),r1
_RTEMS_Unlock_allocator();
8003368: 78 01 08 01 mvhi r1,0x801
800336c: 38 21 f9 18 ori r1,r1,0xf918
8003370: 28 21 00 00 lw r1,(r1+0)
8003374: f8 00 04 bb calli 8004660 <_API_Mutex_Unlock>
return 0;
}
8003378: b9 a0 08 00 mv r1,r13
800337c: 2b 9d 00 10 lw ra,(sp+16)
8003380: 2b 8b 00 3c lw r11,(sp+60)
8003384: 2b 8c 00 38 lw r12,(sp+56)
8003388: 2b 8d 00 34 lw r13,(sp+52)
800338c: 2b 8e 00 30 lw r14,(sp+48)
8003390: 2b 8f 00 2c lw r15,(sp+44)
8003394: 2b 90 00 28 lw r16,(sp+40)
8003398: 2b 91 00 24 lw r17,(sp+36)
800339c: 2b 92 00 20 lw r18,(sp+32)
80033a0: 2b 93 00 1c lw r19,(sp+28)
80033a4: 2b 94 00 18 lw r20,(sp+24)
80033a8: 2b 95 00 14 lw r21,(sp+20)
80033ac: 37 9c 00 60 addi sp,sp,96
80033b0: c3 a0 00 00 ret
08010e68 <pthread_exit>:
void pthread_exit(
void *value_ptr
)
{
8010e68: 37 9c ff fc addi sp,sp,-4
8010e6c: 5b 9d 00 04 sw (sp+4),ra
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
8010e70: 78 03 08 01 mvhi r3,0x801
8010e74: 38 63 9d f0 ori r3,r3,0x9df0
}
void pthread_exit(
void *value_ptr
)
{
8010e78: b8 20 10 00 mv r2,r1
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
8010e7c: 28 61 00 0c lw r1,(r3+12)
8010e80: fb ff ff d4 calli 8010dd0 <_POSIX_Thread_Exit>
}
8010e84: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8010e88: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED
8010e8c: c3 a0 00 00 ret <== NOT EXECUTED
08005658 <pthread_mutex_timedlock>:
int pthread_mutex_timedlock(
pthread_mutex_t *mutex,
const struct timespec *abstime
)
{
8005658: 37 9c ff ec addi sp,sp,-20
800565c: 5b 8b 00 10 sw (sp+16),r11
8005660: 5b 8c 00 0c sw (sp+12),r12
8005664: 5b 8d 00 08 sw (sp+8),r13
8005668: 5b 9d 00 04 sw (sp+4),ra
800566c: b8 20 68 00 mv r13,r1
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
8005670: b8 40 08 00 mv r1,r2
8005674: 37 82 00 14 addi r2,sp,20
8005678: f8 00 00 41 calli 800577c <_POSIX_Absolute_timeout_to_ticks>
int _EXFUN(pthread_mutex_trylock, (pthread_mutex_t *__mutex));
int _EXFUN(pthread_mutex_unlock, (pthread_mutex_t *__mutex));
#if defined(_POSIX_TIMEOUTS)
int _EXFUN(pthread_mutex_timedlock,
800567c: 64 2c 00 03 cmpei r12,r1,3
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
8005680: 2b 83 00 14 lw r3,(sp+20)
*
* If the status is POSIX_ABSOLUTE_TIMEOUT_INVALID,
* POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST, or POSIX_ABSOLUTE_TIMEOUT_IS_NOW,
* then we should not wait.
*/
status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks );
8005684: b8 20 58 00 mv r11,r1
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks );
8005688: b9 80 10 00 mv r2,r12
800568c: b9 a0 08 00 mv r1,r13
8005690: fb ff ff a3 calli 800551c <_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) ) {
8005694: 5d 80 00 0b bne r12,r0,80056c0 <pthread_mutex_timedlock+0x68>
8005698: 34 02 00 10 mvi r2,16
800569c: 5c 22 00 09 bne r1,r2,80056c0 <pthread_mutex_timedlock+0x68><== NEVER TAKEN
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
80056a0: 45 60 00 05 be r11,r0,80056b4 <pthread_mutex_timedlock+0x5c><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
80056a4: 35 6b ff ff addi r11,r11,-1
80056a8: 34 02 00 01 mvi r2,1
80056ac: 50 4b 00 04 bgeu r2,r11,80056bc <pthread_mutex_timedlock+0x64><== ALWAYS TAKEN
80056b0: e0 00 00 04 bi 80056c0 <pthread_mutex_timedlock+0x68> <== NOT EXECUTED
* not obtain the mutex, then not look at the status immediately,
* make sure the right reason is returned.
*/
if ( !do_wait && (lock_status == EBUSY) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
80056b4: 34 01 00 16 mvi r1,22 <== NOT EXECUTED
80056b8: e0 00 00 02 bi 80056c0 <pthread_mutex_timedlock+0x68> <== NOT EXECUTED
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
80056bc: 34 01 00 74 mvi r1,116
}
return lock_status;
}
80056c0: 2b 9d 00 04 lw ra,(sp+4)
80056c4: 2b 8b 00 10 lw r11,(sp+16)
80056c8: 2b 8c 00 0c lw r12,(sp+12)
80056cc: 2b 8d 00 08 lw r13,(sp+8)
80056d0: 37 9c 00 14 addi sp,sp,20
80056d4: c3 a0 00 00 ret
0800295c <pthread_mutexattr_gettype>:
const pthread_mutexattr_t *attr,
int *type
)
{
if ( !attr )
return EINVAL;
800295c: 34 03 00 16 mvi r3,22
int pthread_mutexattr_gettype(
const pthread_mutexattr_t *attr,
int *type
)
{
if ( !attr )
8002960: 44 20 00 07 be r1,r0,800297c <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !attr->is_initialized )
8002964: 28 24 00 00 lw r4,(r1+0)
8002968: 44 80 00 05 be r4,r0,800297c <pthread_mutexattr_gettype+0x20>
return EINVAL;
if ( !type )
800296c: 44 40 00 04 be r2,r0,800297c <pthread_mutexattr_gettype+0x20><== NEVER TAKEN
return EINVAL;
*type = attr->type;
8002970: 28 21 00 10 lw r1,(r1+16)
return 0;
8002974: 34 03 00 00 mvi r3,0
return EINVAL;
if ( !type )
return EINVAL;
*type = attr->type;
8002978: 58 41 00 00 sw (r2+0),r1
return 0;
}
800297c: b8 60 08 00 mv r1,r3
8002980: c3 a0 00 00 ret
08005188 <pthread_mutexattr_setpshared>:
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
8005188: 34 03 00 16 mvi r3,22
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
800518c: 44 20 00 07 be r1,r0,80051a8 <pthread_mutexattr_setpshared+0x20>
8005190: 28 24 00 00 lw r4,(r1+0)
8005194: 44 80 00 05 be r4,r0,80051a8 <pthread_mutexattr_setpshared+0x20>
return EINVAL;
switch ( pshared ) {
8005198: 34 04 00 01 mvi r4,1
800519c: 54 44 00 03 bgu r2,r4,80051a8 <pthread_mutexattr_setpshared+0x20><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
80051a0: 58 22 00 04 sw (r1+4),r2
return 0;
80051a4: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
80051a8: b8 60 08 00 mv r1,r3
80051ac: c3 a0 00 00 ret
080029d0 <pthread_mutexattr_settype>:
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
80029d0: 34 03 00 16 mvi r3,22
int pthread_mutexattr_settype(
pthread_mutexattr_t *attr,
int type
)
{
if ( !attr || !attr->is_initialized )
80029d4: 44 20 00 07 be r1,r0,80029f0 <pthread_mutexattr_settype+0x20>
80029d8: 28 24 00 00 lw r4,(r1+0)
80029dc: 44 80 00 05 be r4,r0,80029f0 <pthread_mutexattr_settype+0x20><== NEVER TAKEN
return EINVAL;
switch ( type ) {
80029e0: 34 04 00 03 mvi r4,3
80029e4: 54 44 00 03 bgu r2,r4,80029f0 <pthread_mutexattr_settype+0x20>
case PTHREAD_MUTEX_NORMAL:
case PTHREAD_MUTEX_RECURSIVE:
case PTHREAD_MUTEX_ERRORCHECK:
case PTHREAD_MUTEX_DEFAULT:
attr->type = type;
80029e8: 58 22 00 10 sw (r1+16),r2
return 0;
80029ec: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
80029f0: b8 60 08 00 mv r1,r3
80029f4: c3 a0 00 00 ret
080038a4 <pthread_once>:
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
80038a4: 37 9c ff ec addi sp,sp,-20
80038a8: 5b 8b 00 10 sw (sp+16),r11
80038ac: 5b 8c 00 0c sw (sp+12),r12
80038b0: 5b 8d 00 08 sw (sp+8),r13
80038b4: 5b 9d 00 04 sw (sp+4),ra
80038b8: b8 20 58 00 mv r11,r1
80038bc: b8 40 60 00 mv r12,r2
if ( !once_control || !init_routine )
80038c0: 64 21 00 00 cmpei r1,r1,0
80038c4: 64 42 00 00 cmpei r2,r2,0
80038c8: b8 41 10 00 or r2,r2,r1
return EINVAL;
80038cc: 34 01 00 16 mvi r1,22
int pthread_once(
pthread_once_t *once_control,
void (*init_routine)(void)
)
{
if ( !once_control || !init_routine )
80038d0: 5c 40 00 13 bne r2,r0,800391c <pthread_once+0x78>
return EINVAL;
if ( !once_control->init_executed ) {
80038d4: 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;
80038d8: 34 01 00 00 mvi r1,0
)
{
if ( !once_control || !init_routine )
return EINVAL;
if ( !once_control->init_executed ) {
80038dc: 5d a2 00 10 bne r13,r2,800391c <pthread_once+0x78>
rtems_mode saveMode;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
80038e0: 34 01 01 00 mvi r1,256
80038e4: 34 02 01 00 mvi r2,256
80038e8: 37 83 00 14 addi r3,sp,20
80038ec: f8 00 01 96 calli 8003f44 <rtems_task_mode>
if ( !once_control->init_executed ) {
80038f0: 29 61 00 04 lw r1,(r11+4)
80038f4: 5c 2d 00 05 bne r1,r13,8003908 <pthread_once+0x64> <== NEVER TAKEN
once_control->is_initialized = true;
80038f8: 34 01 00 01 mvi r1,1
80038fc: 59 61 00 00 sw (r11+0),r1
once_control->init_executed = true;
8003900: 59 61 00 04 sw (r11+4),r1
(*init_routine)();
8003904: d9 80 00 00 call r12
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
8003908: 2b 81 00 14 lw r1,(sp+20)
800390c: 34 02 01 00 mvi r2,256
8003910: 37 83 00 14 addi r3,sp,20
8003914: f8 00 01 8c calli 8003f44 <rtems_task_mode>
}
return 0;
8003918: 34 01 00 00 mvi r1,0
}
800391c: 2b 9d 00 04 lw ra,(sp+4)
8003920: 2b 8b 00 10 lw r11,(sp+16)
8003924: 2b 8c 00 0c lw r12,(sp+12)
8003928: 2b 8d 00 08 lw r13,(sp+8)
800392c: 37 9c 00 14 addi sp,sp,20
8003930: c3 a0 00 00 ret
0800425c <pthread_rwlock_init>:
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
800425c: 37 9c ff e0 addi sp,sp,-32
8004260: 5b 8b 00 14 sw (sp+20),r11
8004264: 5b 8c 00 10 sw (sp+16),r12
8004268: 5b 8d 00 0c sw (sp+12),r13
800426c: 5b 8e 00 08 sw (sp+8),r14
8004270: 5b 9d 00 04 sw (sp+4),ra
/*
* Error check parameters
*/
if ( !rwlock )
return EINVAL;
8004274: 34 03 00 16 mvi r3,22
int pthread_rwlock_init(
pthread_rwlock_t *rwlock,
const pthread_rwlockattr_t *attr
)
{
8004278: b8 20 68 00 mv r13,r1
const pthread_rwlockattr_t *the_attr;
/*
* Error check parameters
*/
if ( !rwlock )
800427c: 44 20 00 28 be r1,r0,800431c <pthread_rwlock_init+0xc0>
return EINVAL;
/*
* If the user passed in NULL, use the default attributes
*/
if ( attr ) {
8004280: 5c 40 00 05 bne r2,r0,8004294 <pthread_rwlock_init+0x38>
the_attr = attr;
} else {
(void) pthread_rwlockattr_init( &default_attr );
8004284: 37 8b 00 18 addi r11,sp,24
8004288: b9 60 08 00 mv r1,r11
800428c: f8 00 02 ff calli 8004e88 <pthread_rwlockattr_init>
the_attr = &default_attr;
8004290: b9 60 10 00 mv r2,r11
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
8004294: 28 41 00 00 lw r1,(r2+0)
return EINVAL;
8004298: 34 03 00 16 mvi r3,22
}
/*
* Now start error checking the attributes that we are going to use
*/
if ( !the_attr->is_initialized )
800429c: 44 20 00 20 be r1,r0,800431c <pthread_rwlock_init+0xc0> <== NEVER TAKEN
return EINVAL;
switch ( the_attr->process_shared ) {
80042a0: 28 4e 00 04 lw r14,(r2+4)
80042a4: 5d c0 00 1e bne r14,r0,800431c <pthread_rwlock_init+0xc0> <== NEVER TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
80042a8: 78 02 08 01 mvhi r2,0x801
80042ac: 38 42 88 68 ori r2,r2,0x8868
80042b0: 28 41 00 00 lw r1,(r2+0)
*/
RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes(
CORE_RWLock_Attributes *the_attributes
)
{
the_attributes->XXX = 0;
80042b4: 5b 80 00 20 sw (sp+32),r0
80042b8: 34 21 00 01 addi r1,r1,1
80042bc: 58 41 00 00 sw (r2+0),r1
* the inactive chain of free RWLock control blocks.
*/
RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void )
{
return (POSIX_RWLock_Control *)
_Objects_Allocate( &_POSIX_RWLock_Information );
80042c0: 78 0c 08 01 mvhi r12,0x801
80042c4: 39 8c 8a 00 ori r12,r12,0x8a00
80042c8: b9 80 08 00 mv r1,r12
80042cc: f8 00 09 a3 calli 8006958 <_Objects_Allocate>
80042d0: b8 20 58 00 mv r11,r1
*/
_Thread_Disable_dispatch(); /* prevents deletion */
the_rwlock = _POSIX_RWLock_Allocate();
if ( !the_rwlock ) {
80042d4: 5c 2e 00 04 bne r1,r14,80042e4 <pthread_rwlock_init+0x88>
_Thread_Enable_dispatch();
80042d8: f8 00 0e 23 calli 8007b64 <_Thread_Enable_dispatch>
return EAGAIN;
80042dc: 34 03 00 0b mvi r3,11
80042e0: e0 00 00 0f bi 800431c <pthread_rwlock_init+0xc0>
}
_CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes );
80042e4: 34 21 00 10 addi r1,r1,16
80042e8: 37 82 00 20 addi r2,sp,32
80042ec: f8 00 06 de calli 8005e64 <_CORE_RWLock_Initialize>
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
80042f0: 29 6e 00 08 lw r14,(r11+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
80042f4: 29 8c 00 1c lw r12,(r12+28)
80042f8: 34 02 00 02 mvi r2,2
80042fc: 21 c1 ff ff andi r1,r14,0xffff
8004300: f8 00 40 bf calli 80145fc <__ashlsi3>
8004304: b5 81 08 00 add r1,r12,r1
8004308: 58 2b 00 00 sw (r1+0),r11
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
800430c: 59 60 00 0c sw (r11+12),r0
&_POSIX_RWLock_Information,
&the_rwlock->Object,
0
);
*rwlock = the_rwlock->Object.id;
8004310: 59 ae 00 00 sw (r13+0),r14
_Thread_Enable_dispatch();
8004314: f8 00 0e 14 calli 8007b64 <_Thread_Enable_dispatch>
return 0;
8004318: 34 03 00 00 mvi r3,0
}
800431c: b8 60 08 00 mv r1,r3
8004320: 2b 9d 00 04 lw ra,(sp+4)
8004324: 2b 8b 00 14 lw r11,(sp+20)
8004328: 2b 8c 00 10 lw r12,(sp+16)
800432c: 2b 8d 00 0c lw r13,(sp+12)
8004330: 2b 8e 00 08 lw r14,(sp+8)
8004334: 37 9c 00 20 addi sp,sp,32
8004338: c3 a0 00 00 ret
080043c4 <pthread_rwlock_timedrdlock>:
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80043c4: 37 9c ff e0 addi sp,sp,-32
80043c8: 5b 8b 00 18 sw (sp+24),r11
80043cc: 5b 8c 00 14 sw (sp+20),r12
80043d0: 5b 8d 00 10 sw (sp+16),r13
80043d4: 5b 8e 00 0c sw (sp+12),r14
80043d8: 5b 8f 00 08 sw (sp+8),r15
80043dc: 5b 9d 00 04 sw (sp+4),ra
80043e0: b8 20 70 00 mv r14,r1
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
return EINVAL;
80043e4: 34 0b 00 16 mvi r11,22
int pthread_rwlock_timedrdlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80043e8: 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 )
80043ec: 45 c0 00 25 be r14,r0,8004480 <pthread_rwlock_timedrdlock+0xbc>
*
* 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 );
80043f0: 37 82 00 1c addi r2,sp,28
80043f4: f8 00 1c 13 calli 800b440 <_POSIX_Absolute_timeout_to_ticks>
80043f8: 29 c2 00 00 lw r2,(r14+0)
80043fc: b8 20 60 00 mv r12,r1
8004400: 78 01 08 01 mvhi r1,0x801
8004404: 38 21 8a 00 ori r1,r1,0x8a00
8004408: 37 83 00 20 addi r3,sp,32
800440c: f8 00 0a b8 calli 8006eec <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
8004410: 2b 8f 00 20 lw r15,(sp+32)
8004414: 5d e0 00 1b bne r15,r0,8004480 <pthread_rwlock_timedrdlock+0xbc>
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,
8004418: 65 8d 00 03 cmpei r13,r12,3
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_reading(
800441c: 29 c2 00 00 lw r2,(r14+0)
8004420: 2b 84 00 1c lw r4,(sp+28)
8004424: 34 21 00 10 addi r1,r1,16
8004428: b9 a0 18 00 mv r3,r13
800442c: 34 05 00 00 mvi r5,0
8004430: f8 00 06 9a calli 8005e98 <_CORE_RWLock_Obtain_for_reading>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
8004434: f8 00 0d cc calli 8007b64 <_Thread_Enable_dispatch>
if ( !do_wait ) {
8004438: 5d af 00 0c bne r13,r15,8004468 <pthread_rwlock_timedrdlock+0xa4>
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
800443c: 78 01 08 01 mvhi r1,0x801
8004440: 38 21 8d 38 ori r1,r1,0x8d38
8004444: 28 21 00 0c lw r1,(r1+12)
8004448: 28 22 00 34 lw r2,(r1+52)
800444c: 34 01 00 02 mvi r1,2
8004450: 5c 41 00 06 bne r2,r1,8004468 <pthread_rwlock_timedrdlock+0xa4>
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
8004454: 45 8d 00 0b be r12,r13,8004480 <pthread_rwlock_timedrdlock+0xbc><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004458: 35 8c ff ff addi r12,r12,-1
800445c: 34 01 00 01 mvi r1,1
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
8004460: 34 0b 00 74 mvi r11,116
_Thread_Enable_dispatch();
if ( !do_wait ) {
if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004464: 50 2c 00 07 bgeu r1,r12,8004480 <pthread_rwlock_timedrdlock+0xbc><== ALWAYS TAKEN
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
8004468: 78 01 08 01 mvhi r1,0x801
800446c: 38 21 8d 38 ori r1,r1,0x8d38
8004470: 28 21 00 0c lw r1,(r1+12)
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
8004474: 28 21 00 34 lw r1,(r1+52)
8004478: f8 00 00 43 calli 8004584 <_POSIX_RWLock_Translate_core_RWLock_return_code>
800447c: b8 20 58 00 mv r11,r1
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
8004480: b9 60 08 00 mv r1,r11
8004484: 2b 9d 00 04 lw ra,(sp+4)
8004488: 2b 8b 00 18 lw r11,(sp+24)
800448c: 2b 8c 00 14 lw r12,(sp+20)
8004490: 2b 8d 00 10 lw r13,(sp+16)
8004494: 2b 8e 00 0c lw r14,(sp+12)
8004498: 2b 8f 00 08 lw r15,(sp+8)
800449c: 37 9c 00 20 addi sp,sp,32
80044a0: c3 a0 00 00 ret
080044a4 <pthread_rwlock_timedwrlock>:
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80044a4: 37 9c ff e0 addi sp,sp,-32
80044a8: 5b 8b 00 18 sw (sp+24),r11
80044ac: 5b 8c 00 14 sw (sp+20),r12
80044b0: 5b 8d 00 10 sw (sp+16),r13
80044b4: 5b 8e 00 0c sw (sp+12),r14
80044b8: 5b 8f 00 08 sw (sp+8),r15
80044bc: 5b 9d 00 04 sw (sp+4),ra
80044c0: b8 20 70 00 mv r14,r1
Watchdog_Interval ticks;
bool do_wait = true;
POSIX_Absolute_timeout_conversion_results_t status;
if ( !rwlock )
return EINVAL;
80044c4: 34 0b 00 16 mvi r11,22
int pthread_rwlock_timedwrlock(
pthread_rwlock_t *rwlock,
const struct timespec *abstime
)
{
80044c8: 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 )
80044cc: 45 c0 00 25 be r14,r0,8004560 <pthread_rwlock_timedwrlock+0xbc>
*
* 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 );
80044d0: 37 82 00 1c addi r2,sp,28
80044d4: f8 00 1b db calli 800b440 <_POSIX_Absolute_timeout_to_ticks>
80044d8: 29 c2 00 00 lw r2,(r14+0)
80044dc: b8 20 60 00 mv r12,r1
80044e0: 78 01 08 01 mvhi r1,0x801
80044e4: 38 21 8a 00 ori r1,r1,0x8a00
80044e8: 37 83 00 20 addi r3,sp,32
80044ec: f8 00 0a 80 calli 8006eec <_Objects_Get>
if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE )
do_wait = false;
the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
switch ( location ) {
80044f0: 2b 8f 00 20 lw r15,(sp+32)
80044f4: 5d e0 00 1b bne r15,r0,8004560 <pthread_rwlock_timedwrlock+0xbc>
(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,
80044f8: 65 8d 00 03 cmpei r13,r12,3
case OBJECTS_LOCAL:
_CORE_RWLock_Obtain_for_writing(
80044fc: 29 c2 00 00 lw r2,(r14+0)
8004500: 2b 84 00 1c lw r4,(sp+28)
8004504: 34 21 00 10 addi r1,r1,16
8004508: b9 a0 18 00 mv r3,r13
800450c: 34 05 00 00 mvi r5,0
8004510: f8 00 06 a4 calli 8005fa0 <_CORE_RWLock_Obtain_for_writing>
do_wait,
ticks,
NULL
);
_Thread_Enable_dispatch();
8004514: f8 00 0d 94 calli 8007b64 <_Thread_Enable_dispatch>
if ( !do_wait &&
8004518: 5d af 00 0c bne r13,r15,8004548 <pthread_rwlock_timedwrlock+0xa4>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
800451c: 78 01 08 01 mvhi r1,0x801
8004520: 38 21 8d 38 ori r1,r1,0x8d38
8004524: 28 21 00 0c lw r1,(r1+12)
ticks,
NULL
);
_Thread_Enable_dispatch();
if ( !do_wait &&
8004528: 28 22 00 34 lw r2,(r1+52)
800452c: 34 01 00 02 mvi r1,2
8004530: 5c 41 00 06 bne r2,r1,8004548 <pthread_rwlock_timedwrlock+0xa4>
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
8004534: 45 8d 00 0b be r12,r13,8004560 <pthread_rwlock_timedwrlock+0xbc><== NEVER TAKEN
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004538: 35 8c ff ff addi r12,r12,-1
800453c: 34 01 00 01 mvi r1,1
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
8004540: 34 0b 00 74 mvi r11,116
_Thread_Enable_dispatch();
if ( !do_wait &&
(_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) {
if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID )
return EINVAL;
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
8004544: 50 2c 00 07 bgeu r1,r12,8004560 <pthread_rwlock_timedwrlock+0xbc><== ALWAYS TAKEN
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
(CORE_RWLock_Status) _Thread_Executing->Wait.return_code
8004548: 78 01 08 01 mvhi r1,0x801
800454c: 38 21 8d 38 ori r1,r1,0x8d38
8004550: 28 21 00 0c lw r1,(r1+12)
if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST ||
status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW )
return ETIMEDOUT;
}
return _POSIX_RWLock_Translate_core_RWLock_return_code(
8004554: 28 21 00 34 lw r1,(r1+52)
8004558: f8 00 00 0b calli 8004584 <_POSIX_RWLock_Translate_core_RWLock_return_code>
800455c: b8 20 58 00 mv r11,r1
case OBJECTS_ERROR:
break;
}
return EINVAL;
}
8004560: b9 60 08 00 mv r1,r11
8004564: 2b 9d 00 04 lw ra,(sp+4)
8004568: 2b 8b 00 18 lw r11,(sp+24)
800456c: 2b 8c 00 14 lw r12,(sp+20)
8004570: 2b 8d 00 10 lw r13,(sp+16)
8004574: 2b 8e 00 0c lw r14,(sp+12)
8004578: 2b 8f 00 08 lw r15,(sp+8)
800457c: 37 9c 00 20 addi sp,sp,32
8004580: c3 a0 00 00 ret
08004ea8 <pthread_rwlockattr_setpshared>:
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
return EINVAL;
8004ea8: 34 03 00 16 mvi r3,22
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
8004eac: 44 20 00 07 be r1,r0,8004ec8 <pthread_rwlockattr_setpshared+0x20>
return EINVAL;
if ( !attr->is_initialized )
8004eb0: 28 24 00 00 lw r4,(r1+0)
8004eb4: 44 80 00 05 be r4,r0,8004ec8 <pthread_rwlockattr_setpshared+0x20>
return EINVAL;
switch ( pshared ) {
8004eb8: 34 04 00 01 mvi r4,1
8004ebc: 54 44 00 03 bgu r2,r4,8004ec8 <pthread_rwlockattr_setpshared+0x20><== NEVER TAKEN
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
8004ec0: 58 22 00 04 sw (r1+4),r2
return 0;
8004ec4: 34 03 00 00 mvi r3,0
default:
return EINVAL;
}
}
8004ec8: b8 60 08 00 mv r1,r3
8004ecc: c3 a0 00 00 ret
08006124 <pthread_setschedparam>:
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
8006124: 37 9c ff dc addi sp,sp,-36
8006128: 5b 8b 00 18 sw (sp+24),r11
800612c: 5b 8c 00 14 sw (sp+20),r12
8006130: 5b 8d 00 10 sw (sp+16),r13
8006134: 5b 8e 00 0c sw (sp+12),r14
8006138: 5b 8f 00 08 sw (sp+8),r15
800613c: 5b 9d 00 04 sw (sp+4),ra
/*
* Check all the parameters
*/
if ( !param )
return EINVAL;
8006140: 34 0e 00 16 mvi r14,22
int pthread_setschedparam(
pthread_t thread,
int policy,
struct sched_param *param
)
{
8006144: b8 20 58 00 mv r11,r1
8006148: b8 40 78 00 mv r15,r2
800614c: b8 60 60 00 mv r12,r3
int rc;
/*
* Check all the parameters
*/
if ( !param )
8006150: 44 60 00 46 be r3,r0,8006268 <pthread_setschedparam+0x144> <== NEVER TAKEN
return EINVAL;
rc = _POSIX_Thread_Translate_sched_param(
8006154: b8 40 08 00 mv r1,r2
8006158: 37 84 00 20 addi r4,sp,32
800615c: b8 60 10 00 mv r2,r3
8006160: 37 83 00 24 addi r3,sp,36
8006164: f8 00 19 f5 calli 800c938 <_POSIX_Thread_Translate_sched_param>
8006168: b8 20 70 00 mv r14,r1
policy,
param,
&budget_algorithm,
&budget_callout
);
if ( rc )
800616c: 5c 20 00 3f bne r1,r0,8006268 <pthread_setschedparam+0x144><== NEVER TAKEN
8006170: 78 03 08 01 mvhi r3,0x801
8006174: b8 60 08 00 mv r1,r3
8006178: 38 21 aa a0 ori r1,r1,0xaaa0
800617c: b9 60 10 00 mv r2,r11
8006180: 37 83 00 1c addi r3,sp,28
8006184: f8 00 07 a7 calli 8008020 <_Objects_Get>
8006188: b8 20 68 00 mv r13,r1
/*
* Actually change the scheduling policy and parameters
*/
the_thread = _POSIX_Threads_Get( thread, &location );
switch ( location ) {
800618c: 2b 81 00 1c lw r1,(sp+28)
8006190: 5c 2e 00 35 bne r1,r14,8006264 <pthread_setschedparam+0x140><== NEVER TAKEN
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8006194: 29 ab 01 20 lw r11,(r13+288)
if ( api->schedpolicy == SCHED_SPORADIC )
8006198: 34 01 00 04 mvi r1,4
800619c: 29 62 00 84 lw r2,(r11+132)
80061a0: 5c 41 00 03 bne r2,r1,80061ac <pthread_setschedparam+0x88>
(void) _Watchdog_Remove( &api->Sporadic_timer );
80061a4: 35 61 00 a8 addi r1,r11,168
80061a8: f8 00 10 41 calli 800a2ac <_Watchdog_Remove>
api->schedpolicy = policy;
80061ac: 59 6f 00 84 sw (r11+132),r15
api->schedparam = *param;
80061b0: 29 81 00 14 lw r1,(r12+20)
80061b4: 29 82 00 00 lw r2,(r12+0)
80061b8: 29 86 00 04 lw r6,(r12+4)
80061bc: 29 85 00 08 lw r5,(r12+8)
80061c0: 29 84 00 0c lw r4,(r12+12)
80061c4: 29 83 00 10 lw r3,(r12+16)
80061c8: 29 87 00 18 lw r7,(r12+24)
80061cc: 59 61 00 9c sw (r11+156),r1
the_thread->budget_algorithm = budget_algorithm;
80061d0: 2b 81 00 24 lw r1,(sp+36)
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
api->schedpolicy = policy;
api->schedparam = *param;
80061d4: 59 62 00 88 sw (r11+136),r2
80061d8: 59 66 00 8c sw (r11+140),r6
80061dc: 59 65 00 90 sw (r11+144),r5
80061e0: 59 64 00 94 sw (r11+148),r4
80061e4: 59 63 00 98 sw (r11+152),r3
80061e8: 59 67 00 a0 sw (r11+160),r7
the_thread->budget_algorithm = budget_algorithm;
80061ec: 59 a1 00 7c sw (r13+124),r1
the_thread->budget_callout = budget_callout;
80061f0: 2b 81 00 20 lw r1,(sp+32)
80061f4: 59 a1 00 80 sw (r13+128),r1
switch ( api->schedpolicy ) {
80061f8: 48 0f 00 19 bg r0,r15,800625c <pthread_setschedparam+0x138><== NEVER TAKEN
80061fc: 34 01 00 02 mvi r1,2
8006200: 4c 2f 00 04 bge r1,r15,8006210 <pthread_setschedparam+0xec>
8006204: 34 01 00 04 mvi r1,4
8006208: 5d e1 00 15 bne r15,r1,800625c <pthread_setschedparam+0x138><== NEVER TAKEN
800620c: e0 00 00 0e bi 8006244 <pthread_setschedparam+0x120>
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006210: 78 01 08 01 mvhi r1,0x801
8006214: 38 21 a8 60 ori r1,r1,0xa860
8006218: 28 21 00 00 lw r1,(r1+0)
the_thread->real_priority =
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
800621c: 34 03 00 01 mvi r3,1
switch ( api->schedpolicy ) {
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
8006220: 59 a1 00 78 sw (r13+120),r1
8006224: 78 01 08 01 mvhi r1,0x801
8006228: 38 21 a0 e4 ori r1,r1,0xa0e4
800622c: 40 21 00 00 lbu r1,(r1+0)
8006230: c8 22 10 00 sub r2,r1,r2
the_thread->real_priority =
8006234: 59 a2 00 18 sw (r13+24),r2
_POSIX_Priority_To_core( api->schedparam.sched_priority );
_Thread_Change_priority(
8006238: b9 a0 08 00 mv r1,r13
800623c: f8 00 09 98 calli 800889c <_Thread_Change_priority>
the_thread,
the_thread->real_priority,
true
);
break;
8006240: e0 00 00 07 bi 800625c <pthread_setschedparam+0x138>
case SCHED_SPORADIC:
api->ss_high_priority = api->schedparam.sched_priority;
8006244: 59 62 00 a4 sw (r11+164),r2
_Watchdog_Remove( &api->Sporadic_timer );
8006248: 35 61 00 a8 addi r1,r11,168
800624c: f8 00 10 18 calli 800a2ac <_Watchdog_Remove>
_POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
8006250: 34 01 00 00 mvi r1,0
8006254: b9 a0 10 00 mv r2,r13
8006258: fb ff ff 62 calli 8005fe0 <_POSIX_Threads_Sporadic_budget_TSR>
break;
}
_Thread_Enable_dispatch();
800625c: f8 00 0a c6 calli 8008d74 <_Thread_Enable_dispatch>
return 0;
8006260: e0 00 00 02 bi 8006268 <pthread_setschedparam+0x144>
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
8006264: 34 0e 00 03 mvi r14,3
}
8006268: b9 c0 08 00 mv r1,r14
800626c: 2b 9d 00 04 lw ra,(sp+4)
8006270: 2b 8b 00 18 lw r11,(sp+24)
8006274: 2b 8c 00 14 lw r12,(sp+20)
8006278: 2b 8d 00 10 lw r13,(sp+16)
800627c: 2b 8e 00 0c lw r14,(sp+12)
8006280: 2b 8f 00 08 lw r15,(sp+8)
8006284: 37 9c 00 24 addi sp,sp,36
8006288: c3 a0 00 00 ret
080035d0 <pthread_testcancel>:
*
* 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
*/
void pthread_testcancel( void )
{
80035d0: 37 9c ff f8 addi sp,sp,-8
80035d4: 5b 8b 00 08 sw (sp+8),r11
80035d8: 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() )
80035dc: 78 01 08 01 mvhi r1,0x801
80035e0: 38 21 6d 20 ori r1,r1,0x6d20
80035e4: 28 22 00 08 lw r2,(r1+8)
80035e8: 5c 40 00 14 bne r2,r0,8003638 <pthread_testcancel+0x68> <== NEVER TAKEN
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
80035ec: 28 21 00 0c lw r1,(r1+12)
80035f0: 28 22 01 20 lw r2,(r1+288)
80035f4: 78 01 08 01 mvhi r1,0x801
80035f8: 38 21 68 50 ori r1,r1,0x6850
80035fc: 28 23 00 00 lw r3,(r1+0)
8003600: 34 63 00 01 addi r3,r3,1
8003604: 58 23 00 00 sw (r1+0),r3
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
8003608: 28 41 00 d8 lw r1,(r2+216)
*/
void pthread_testcancel( void )
{
POSIX_API_Control *thread_support;
bool cancel = false;
800360c: 34 0b 00 00 mvi r11,0
return;
thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
_Thread_Disable_dispatch();
if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
8003610: 5c 2b 00 03 bne r1,r11,800361c <pthread_testcancel+0x4c> <== NEVER TAKEN
/* Setting Cancelability State, P1003.1c/Draft 10, p. 183 */
int _EXFUN(pthread_setcancelstate, (int __state, int *__oldstate));
int _EXFUN(pthread_setcanceltype, (int __type, int *__oldtype));
void _EXFUN(pthread_testcancel, (void));
8003614: 28 4b 00 e0 lw r11,(r2+224)
8003618: 7d 6b 00 00 cmpnei r11,r11,0
thread_support->cancelation_requested )
cancel = true;
_Thread_Enable_dispatch();
800361c: f8 00 09 f2 calli 8005de4 <_Thread_Enable_dispatch>
if ( cancel )
8003620: 45 60 00 06 be r11,r0,8003638 <pthread_testcancel+0x68>
_POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED );
8003624: 78 01 08 01 mvhi r1,0x801
8003628: 38 21 6d 20 ori r1,r1,0x6d20
800362c: 28 21 00 0c lw r1,(r1+12)
8003630: 34 02 ff ff mvi r2,-1
8003634: f8 00 18 e3 calli 80099c0 <_POSIX_Thread_Exit>
}
8003638: 2b 9d 00 04 lw ra,(sp+4)
800363c: 2b 8b 00 08 lw r11,(sp+8)
8003640: 37 9c 00 08 addi sp,sp,8
8003644: c3 a0 00 00 ret
080175c8 <read>:
ssize_t read(
int fd,
void *buffer,
size_t count
)
{
80175c8: 37 9c ff ec addi sp,sp,-20
80175cc: 5b 8b 00 10 sw (sp+16),r11
80175d0: 5b 8c 00 0c sw (sp+12),r12
80175d4: 5b 8d 00 08 sw (sp+8),r13
80175d8: 5b 9d 00 04 sw (sp+4),ra
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
80175dc: 78 04 08 01 mvhi r4,0x801
80175e0: 38 84 90 10 ori r4,r4,0x9010
ssize_t read(
int fd,
void *buffer,
size_t count
)
{
80175e4: b8 40 68 00 mv r13,r2
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
80175e8: 28 82 00 00 lw r2,(r4+0)
80175ec: 54 41 00 02 bgu r2,r1,80175f4 <read+0x2c> <== ALWAYS TAKEN
80175f0: e0 00 00 0c bi 8017620 <read+0x58> <== NOT EXECUTED
iop = rtems_libio_iop( fd );
80175f4: 78 0b 08 01 mvhi r11,0x801
80175f8: 34 02 00 06 mvi r2,6
80175fc: 39 6b 97 e8 ori r11,r11,0x97e8
8017600: 5b 83 00 14 sw (sp+20),r3
8017604: fb ff fe 08 calli 8016e24 <__ashlsi3>
8017608: 29 6b 00 00 lw r11,(r11+0)
rtems_libio_check_is_open( iop );
801760c: 2b 83 00 14 lw r3,(sp+20)
{
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
8017610: b5 61 58 00 add r11,r11,r1
rtems_libio_check_is_open( iop );
8017614: 29 61 00 18 lw r1,(r11+24)
8017618: 20 22 01 00 andi r2,r1,0x100
801761c: 5c 40 00 04 bne r2,r0,801762c <read+0x64>
8017620: fb ff e7 94 calli 8011470 <__errno>
8017624: 34 02 00 09 mvi r2,9
8017628: e0 00 00 08 bi 8017648 <read+0x80>
rtems_libio_check_buffer( buffer );
801762c: 45 a0 00 05 be r13,r0,8017640 <read+0x78> <== NEVER TAKEN
rtems_libio_check_count( count );
8017630: 34 0c 00 00 mvi r12,0
8017634: 44 60 00 19 be r3,r0,8017698 <read+0xd0>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
8017638: 20 21 00 02 andi r1,r1,0x2
801763c: 5c 20 00 06 bne r1,r0,8017654 <read+0x8c>
8017640: fb ff e7 8c calli 8011470 <__errno>
8017644: 34 02 00 16 mvi r2,22
8017648: 58 22 00 00 sw (r1+0),r2
801764c: 34 0c ff ff mvi r12,-1
8017650: e0 00 00 12 bi 8017698 <read+0xd0>
/*
* Now process the read().
*/
rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count );
8017654: 29 61 00 24 lw r1,(r11+36)
8017658: b9 a0 10 00 mv r2,r13
801765c: 28 24 00 08 lw r4,(r1+8)
8017660: b9 60 08 00 mv r1,r11
8017664: d8 80 00 00 call r4
8017668: b8 20 60 00 mv r12,r1
if ( rc > 0 )
801766c: 4c 01 00 0b bge r0,r1,8017698 <read+0xd0>
iop->offset += rc;
8017670: 34 02 00 1f mvi r2,31
8017674: fb ff fe 13 calli 8016ec0 <__ashrsi3>
8017678: 29 62 00 14 lw r2,(r11+20)
801767c: 29 64 00 10 lw r4,(r11+16)
8017680: b5 82 10 00 add r2,r12,r2
8017684: f5 82 18 00 cmpgu r3,r12,r2
8017688: b4 24 08 00 add r1,r1,r4
801768c: b4 61 08 00 add r1,r3,r1
8017690: 59 61 00 10 sw (r11+16),r1
8017694: 59 62 00 14 sw (r11+20),r2
return rc;
}
8017698: b9 80 08 00 mv r1,r12
801769c: 2b 9d 00 04 lw ra,(sp+4)
80176a0: 2b 8b 00 10 lw r11,(sp+16)
80176a4: 2b 8c 00 0c lw r12,(sp+12)
80176a8: 2b 8d 00 08 lw r13,(sp+8)
80176ac: 37 9c 00 14 addi sp,sp,20
80176b0: c3 a0 00 00 ret
08004d98 <readlink>:
ssize_t readlink(
const char *pathname,
char *buf,
size_t bufsize
)
{
8004d98: 37 9c ff d8 addi sp,sp,-40
8004d9c: 5b 8b 00 14 sw (sp+20),r11
8004da0: 5b 8c 00 10 sw (sp+16),r12
8004da4: 5b 8d 00 0c sw (sp+12),r13
8004da8: 5b 8e 00 08 sw (sp+8),r14
8004dac: 5b 9d 00 04 sw (sp+4),ra
8004db0: b8 20 60 00 mv r12,r1
8004db4: b8 40 68 00 mv r13,r2
8004db8: b8 60 70 00 mv r14,r3
rtems_filesystem_location_info_t loc;
int result;
if (!buf)
8004dbc: 5c 40 00 06 bne r2,r0,8004dd4 <readlink+0x3c>
rtems_set_errno_and_return_minus_one( EFAULT );
8004dc0: f8 00 2b 89 calli 800fbe4 <__errno>
8004dc4: 34 02 00 0e mvi r2,14
8004dc8: 58 22 00 00 sw (r1+0),r2
8004dcc: 34 0c ff ff mvi r12,-1
8004dd0: e0 00 00 20 bi 8004e50 <readlink+0xb8>
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
8004dd4: f8 00 33 35 calli 8011aa8 <strlen>
8004dd8: 37 8b 00 18 addi r11,sp,24
8004ddc: b8 20 10 00 mv r2,r1
8004de0: 34 03 00 00 mvi r3,0
8004de4: b9 80 08 00 mv r1,r12
8004de8: b9 60 20 00 mv r4,r11
8004dec: 34 05 00 00 mvi r5,0
8004df0: fb ff fa e8 calli 8003990 <rtems_filesystem_evaluate_path>
0, &loc, false );
if ( result != 0 )
return -1;
8004df4: 34 0c ff ff mvi r12,-1
if (!buf)
rtems_set_errno_and_return_minus_one( EFAULT );
result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ),
0, &loc, false );
if ( result != 0 )
8004df8: 5c 20 00 16 bne r1,r0,8004e50 <readlink+0xb8> <== NEVER TAKEN
return -1;
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){
8004dfc: 2b 81 00 24 lw r1,(sp+36)
8004e00: 28 22 00 10 lw r2,(r1+16)
8004e04: b9 60 08 00 mv r1,r11
8004e08: d8 40 00 00 call r2
8004e0c: 34 02 00 04 mvi r2,4
8004e10: 44 22 00 07 be r1,r2,8004e2c <readlink+0x94>
rtems_filesystem_freenode( &loc );
8004e14: b9 60 08 00 mv r1,r11
8004e18: fb ff fb 26 calli 8003ab0 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EINVAL );
8004e1c: f8 00 2b 72 calli 800fbe4 <__errno>
8004e20: 34 02 00 16 mvi r2,22
8004e24: 58 22 00 00 sw (r1+0),r2
8004e28: e0 00 00 0a bi 8004e50 <readlink+0xb8>
}
result = (*loc.ops->readlink_h)( &loc, buf, bufsize );
8004e2c: 2b 81 00 24 lw r1,(sp+36)
8004e30: b9 a0 10 00 mv r2,r13
8004e34: b9 c0 18 00 mv r3,r14
8004e38: 28 24 00 3c lw r4,(r1+60)
8004e3c: b9 60 08 00 mv r1,r11
8004e40: d8 80 00 00 call r4
8004e44: b8 20 60 00 mv r12,r1
rtems_filesystem_freenode( &loc );
8004e48: b9 60 08 00 mv r1,r11
8004e4c: fb ff fb 19 calli 8003ab0 <rtems_filesystem_freenode>
return result;
}
8004e50: b9 80 08 00 mv r1,r12
8004e54: 2b 9d 00 04 lw ra,(sp+4)
8004e58: 2b 8b 00 14 lw r11,(sp+20)
8004e5c: 2b 8c 00 10 lw r12,(sp+16)
8004e60: 2b 8d 00 0c lw r13,(sp+12)
8004e64: 2b 8e 00 08 lw r14,(sp+8)
8004e68: 37 9c 00 28 addi sp,sp,40
8004e6c: c3 a0 00 00 ret
0800365c <readv>:
ssize_t readv(
int fd,
const struct iovec *iov,
int iovcnt
)
{
800365c: 37 9c ff e4 addi sp,sp,-28
8003660: 5b 8b 00 1c sw (sp+28),r11
8003664: 5b 8c 00 18 sw (sp+24),r12
8003668: 5b 8d 00 14 sw (sp+20),r13
800366c: 5b 8e 00 10 sw (sp+16),r14
8003670: 5b 8f 00 0c sw (sp+12),r15
8003674: 5b 90 00 08 sw (sp+8),r16
8003678: 5b 9d 00 04 sw (sp+4),ra
800367c: b8 60 78 00 mv r15,r3
int v;
int bytes;
rtems_libio_t *iop;
bool all_zeros;
rtems_libio_check_fd( fd );
8003680: 78 03 08 01 mvhi r3,0x801
8003684: 38 63 60 10 ori r3,r3,0x6010
ssize_t readv(
int fd,
const struct iovec *iov,
int iovcnt
)
{
8003688: b8 40 68 00 mv r13,r2
int v;
int bytes;
rtems_libio_t *iop;
bool all_zeros;
rtems_libio_check_fd( fd );
800368c: 28 62 00 00 lw r2,(r3+0)
8003690: 54 41 00 02 bgu r2,r1,8003698 <readv+0x3c>
8003694: e0 00 00 0a bi 80036bc <readv+0x60>
iop = rtems_libio_iop( fd );
8003698: 78 0b 08 01 mvhi r11,0x801
800369c: 34 02 00 06 mvi r2,6
80036a0: 39 6b 67 2c ori r11,r11,0x672c
80036a4: f8 00 3d d5 calli 8012df8 <__ashlsi3>
80036a8: 29 6c 00 00 lw r12,(r11+0)
80036ac: b5 81 60 00 add r12,r12,r1
rtems_libio_check_is_open( iop );
80036b0: 29 81 00 18 lw r1,(r12+24)
80036b4: 20 22 01 00 andi r2,r1,0x100
80036b8: 5c 40 00 04 bne r2,r0,80036c8 <readv+0x6c>
80036bc: f8 00 28 1d calli 800d730 <__errno>
80036c0: 34 02 00 09 mvi r2,9
80036c4: e0 00 00 16 bi 800371c <readv+0xc0>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ );
80036c8: 20 21 00 02 andi r1,r1,0x2
80036cc: 44 20 00 12 be r1,r0,8003714 <readv+0xb8> <== NEVER TAKEN
/*
* Argument validation on IO vector
*/
if ( !iov )
80036d0: 45 a0 00 11 be r13,r0,8003714 <readv+0xb8>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
80036d4: 49 e0 00 02 bg r15,r0,80036dc <readv+0x80>
80036d8: e0 00 00 0f bi 8003714 <readv+0xb8>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
80036dc: 34 01 04 00 mvi r1,1024
80036e0: 4c 2f 00 02 bge r1,r15,80036e8 <readv+0x8c> <== ALWAYS TAKEN
80036e4: e0 00 00 0c bi 8003714 <readv+0xb8> <== NOT EXECUTED
80036e8: b9 a0 08 00 mv r1,r13
80036ec: 34 02 00 01 mvi r2,1
80036f0: 34 04 00 00 mvi r4,0
80036f4: 34 03 00 00 mvi r3,0
80036f8: e0 00 00 02 bi 8003700 <readv+0xa4>
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
80036fc: b8 c0 18 00 mv r3,r6
/*
* iov[v].iov_len cannot be less than 0 because size_t is unsigned.
* So we only check for zero.
*/
if ( iov[v].iov_base == 0 )
8003700: 28 25 00 00 lw r5,(r1+0)
8003704: 44 a0 00 04 be r5,r0,8003714 <readv+0xb8>
rtems_set_errno_and_return_minus_one( EINVAL );
/* check for wrap */
old = total;
total += iov[v].iov_len;
8003708: 28 25 00 04 lw r5,(r1+4)
800370c: b4 65 30 00 add r6,r3,r5
if ( total < old )
8003710: 4c c3 00 05 bge r6,r3,8003724 <readv+0xc8>
rtems_set_errno_and_return_minus_one( EINVAL );
8003714: f8 00 28 07 calli 800d730 <__errno>
8003718: 34 02 00 16 mvi r2,22
800371c: 58 22 00 00 sw (r1+0),r2
8003720: e0 00 00 24 bi 80037b0 <readv+0x154>
if ( iov[v].iov_len )
all_zeros = false;
8003724: 64 a5 00 00 cmpei r5,r5,0
* are obvious errors in the iovec. So this extra loop ensures
* that we do not do anything if there is an argument error.
*/
all_zeros = true;
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003728: 34 84 00 01 addi r4,r4,1
total += iov[v].iov_len;
if ( total < old )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
800372c: c8 05 28 00 sub r5,r0,r5
8003730: a0 45 10 00 and r2,r2,r5
* are obvious errors in the iovec. So this extra loop ensures
* that we do not do anything if there is an argument error.
*/
all_zeros = true;
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003734: 34 21 00 08 addi r1,r1,8
8003738: 49 e4 ff f1 bg r15,r4,80036fc <readv+0xa0>
* A readv with all zeros logically has no effect. Even though
* OpenGroup didn't address this case as they did with writev(),
* we will handle it the same way for symmetry.
*/
if ( all_zeros == true ) {
return 0;
800373c: 34 0b 00 00 mvi r11,0
/*
* A readv with all zeros logically has no effect. Even though
* OpenGroup didn't address this case as they did with writev(),
* we will handle it the same way for symmetry.
*/
if ( all_zeros == true ) {
8003740: 5c 40 00 1d bne r2,r0,80037b4 <readv+0x158>
8003744: 34 10 00 00 mvi r16,0
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
bytes = (*iop->pathinfo.handlers->read_h)(
8003748: 29 81 00 24 lw r1,(r12+36)
800374c: 29 a2 00 00 lw r2,(r13+0)
8003750: 29 a3 00 04 lw r3,(r13+4)
8003754: 28 24 00 08 lw r4,(r1+8)
8003758: b9 80 08 00 mv r1,r12
800375c: d8 80 00 00 call r4
8003760: b8 20 70 00 mv r14,r1
iop,
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
8003764: 48 01 00 13 bg r0,r1,80037b0 <readv+0x154> <== NEVER TAKEN
return -1;
if ( bytes > 0 ) {
8003768: 44 20 00 0c be r1,r0,8003798 <readv+0x13c> <== NEVER TAKEN
iop->offset += bytes;
800376c: 34 02 00 1f mvi r2,31
8003770: f8 00 3d c9 calli 8012e94 <__ashrsi3>
8003774: 29 82 00 14 lw r2,(r12+20)
8003778: 29 84 00 10 lw r4,(r12+16)
total += bytes;
800377c: b5 6e 58 00 add r11,r11,r14
if ( bytes < 0 )
return -1;
if ( bytes > 0 ) {
iop->offset += bytes;
8003780: b5 c2 10 00 add r2,r14,r2
8003784: f5 c2 18 00 cmpgu r3,r14,r2
8003788: b4 24 08 00 add r1,r1,r4
800378c: b4 61 08 00 add r1,r3,r1
8003790: 59 81 00 10 sw (r12+16),r1
8003794: 59 82 00 14 sw (r12+20),r2
total += bytes;
}
if (bytes != iov[ v ].iov_len)
8003798: 29 a1 00 04 lw r1,(r13+4)
800379c: 5d c1 00 06 bne r14,r1,80037b4 <readv+0x158> <== NEVER TAKEN
}
/*
* Now process the readv().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
80037a0: 36 10 00 01 addi r16,r16,1
80037a4: 35 ad 00 08 addi r13,r13,8
80037a8: 49 f0 ff e8 bg r15,r16,8003748 <readv+0xec>
80037ac: e0 00 00 02 bi 80037b4 <readv+0x158>
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
return -1;
80037b0: 34 0b ff ff mvi r11,-1
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
80037b4: b9 60 08 00 mv r1,r11
80037b8: 2b 9d 00 04 lw ra,(sp+4)
80037bc: 2b 8b 00 1c lw r11,(sp+28)
80037c0: 2b 8c 00 18 lw r12,(sp+24)
80037c4: 2b 8d 00 14 lw r13,(sp+20)
80037c8: 2b 8e 00 10 lw r14,(sp+16)
80037cc: 2b 8f 00 0c lw r15,(sp+12)
80037d0: 2b 90 00 08 lw r16,(sp+8)
80037d4: 37 9c 00 1c addi sp,sp,28
80037d8: c3 a0 00 00 ret
08003688 <realloc>:
void *realloc(
void *ptr,
size_t size
)
{
8003688: 37 9c ff e8 addi sp,sp,-24
800368c: 5b 8b 00 14 sw (sp+20),r11
8003690: 5b 8c 00 10 sw (sp+16),r12
8003694: 5b 8d 00 0c sw (sp+12),r13
8003698: 5b 8e 00 08 sw (sp+8),r14
800369c: 5b 9d 00 04 sw (sp+4),ra
80036a0: b8 20 58 00 mv r11,r1
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
80036a4: 78 01 08 01 mvhi r1,0x801
80036a8: 38 21 98 00 ori r1,r1,0x9800
void *realloc(
void *ptr,
size_t size
)
{
80036ac: b8 40 60 00 mv r12,r2
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
80036b0: 28 22 00 10 lw r2,(r1+16)
80036b4: 34 42 00 01 addi r2,r2,1
80036b8: 58 22 00 10 sw (r1+16),r2
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
80036bc: 78 01 08 01 mvhi r1,0x801
80036c0: 38 21 9a 98 ori r1,r1,0x9a98
80036c4: 28 22 00 00 lw r2,(r1+0)
80036c8: 34 01 00 03 mvi r1,3
80036cc: 5c 41 00 09 bne r2,r1,80036f0 <realloc+0x68> <== NEVER TAKEN
if (_Thread_Dispatch_disable_level > 0)
80036d0: 78 01 08 01 mvhi r1,0x801
80036d4: 38 21 99 20 ori r1,r1,0x9920
80036d8: 28 22 00 00 lw r2,(r1+0)
80036dc: 5c 40 00 33 bne r2,r0,80037a8 <realloc+0x120> <== NEVER TAKEN
return (void *) 0;
if (_ISR_Nest_level > 0)
80036e0: 78 01 08 01 mvhi r1,0x801
80036e4: 38 21 9d f0 ori r1,r1,0x9df0
80036e8: 28 21 00 08 lw r1,(r1+8)
80036ec: 5c 22 00 2f bne r1,r2,80037a8 <realloc+0x120> <== NEVER TAKEN
}
/*
* Continue with realloc().
*/
if ( !ptr )
80036f0: 5d 60 00 05 bne r11,r0,8003704 <realloc+0x7c>
return malloc( size );
80036f4: b9 80 08 00 mv r1,r12
80036f8: fb ff fc ec calli 8002aa8 <malloc>
80036fc: b8 20 58 00 mv r11,r1
8003700: e0 00 00 2b bi 80037ac <realloc+0x124>
if ( !size ) {
8003704: 5d 80 00 04 bne r12,r0,8003714 <realloc+0x8c> <== ALWAYS TAKEN
free( ptr );
8003708: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800370c: fb ff fb ed calli 80026c0 <free> <== NOT EXECUTED
8003710: e0 00 00 26 bi 80037a8 <realloc+0x120> <== NOT EXECUTED
return (void *) 0;
}
if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) {
8003714: 78 0d 08 01 mvhi r13,0x801
8003718: 39 ad 90 1c ori r13,r13,0x901c
800371c: 29 a1 00 00 lw r1,(r13+0)
8003720: b9 60 10 00 mv r2,r11
8003724: 37 83 00 18 addi r3,sp,24
8003728: f8 00 0a 2c calli 8005fd8 <_Protected_heap_Get_block_size>
800372c: 5c 20 00 05 bne r1,r0,8003740 <realloc+0xb8>
errno = EINVAL;
8003730: f8 00 37 50 calli 8011470 <__errno>
8003734: 34 02 00 16 mvi r2,22
8003738: 58 22 00 00 sw (r1+0),r2
800373c: e0 00 00 1b bi 80037a8 <realloc+0x120>
}
/*
* Now resize it.
*/
if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) {
8003740: 29 a1 00 00 lw r1,(r13+0)
8003744: b9 60 10 00 mv r2,r11
8003748: b9 80 18 00 mv r3,r12
800374c: f8 00 0a 3d calli 8006040 <_Protected_heap_Resize_block>
8003750: b8 20 70 00 mv r14,r1
8003754: 5c 20 00 16 bne r1,r0,80037ac <realloc+0x124>
* 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 );
8003758: b9 80 08 00 mv r1,r12
800375c: fb ff fc d3 calli 8002aa8 <malloc>
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
8003760: 78 02 08 01 mvhi r2,0x801
8003764: 38 42 98 00 ori r2,r2,0x9800
* 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 );
8003768: b8 20 68 00 mv r13,r1
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
800376c: 28 41 00 04 lw r1,(r2+4)
8003770: 34 21 ff ff addi r1,r1,-1
8003774: 58 41 00 04 sw (r2+4),r1
if ( !new_area ) {
8003778: 45 ae 00 0c be r13,r14,80037a8 <realloc+0x120>
return (void *) 0;
}
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
800377c: 2b 81 00 18 lw r1,(sp+24)
8003780: b9 80 18 00 mv r3,r12
8003784: 50 2c 00 02 bgeu r1,r12,800378c <realloc+0x104> <== NEVER TAKEN
8003788: b8 20 18 00 mv r3,r1
800378c: b9 60 10 00 mv r2,r11
8003790: b9 a0 08 00 mv r1,r13
8003794: f8 00 39 ed calli 8011f48 <memcpy>
free( ptr );
8003798: b9 60 08 00 mv r1,r11
800379c: fb ff fb c9 calli 80026c0 <free>
return new_area;
80037a0: b9 a0 58 00 mv r11,r13
80037a4: e0 00 00 02 bi 80037ac <realloc+0x124>
new_area = malloc( size );
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
if ( !new_area ) {
return (void *) 0;
80037a8: 34 0b 00 00 mvi r11,0
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
free( ptr );
return new_area;
}
80037ac: b9 60 08 00 mv r1,r11
80037b0: 2b 9d 00 04 lw ra,(sp+4)
80037b4: 2b 8b 00 14 lw r11,(sp+20)
80037b8: 2b 8c 00 10 lw r12,(sp+16)
80037bc: 2b 8d 00 0c lw r13,(sp+12)
80037c0: 2b 8e 00 08 lw r14,(sp+8)
80037c4: 37 9c 00 18 addi sp,sp,24
80037c8: c3 a0 00 00 ret
0800281c <rmdir>:
#include <rtems/seterr.h>
int rmdir(
const char *pathname
)
{
800281c: 37 9c ff c0 addi sp,sp,-64
8002820: 5b 8b 00 14 sw (sp+20),r11
8002824: 5b 8c 00 10 sw (sp+16),r12
8002828: 5b 8d 00 0c sw (sp+12),r13
800282c: 5b 8e 00 08 sw (sp+8),r14
8002830: 5b 9d 00 04 sw (sp+4),ra
8002834: b8 20 70 00 mv r14,r1
/*
* Get the parent node of the node we wish to remove. Find the parent path.
*/
parentpathlen = rtems_filesystem_dirname ( pathname );
8002838: fb ff fb d2 calli 8001780 <rtems_filesystem_dirname>
800283c: b8 20 58 00 mv r11,r1
8002840: 37 84 00 2c addi r4,sp,44
if ( parentpathlen == 0 )
8002844: 5c 20 00 07 bne r1,r0,8002860 <rmdir+0x44>
rtems_filesystem_get_start_loc( pathname, &i, &parentloc );
8002848: b9 c0 08 00 mv r1,r14
800284c: 37 82 00 40 addi r2,sp,64
8002850: b8 80 18 00 mv r3,r4
8002854: f8 00 00 4e calli 800298c <rtems_filesystem_get_start_loc>
const char *name;
rtems_filesystem_location_info_t parentloc;
rtems_filesystem_location_info_t loc;
int i;
int result;
bool free_parentloc = false;
8002858: 34 0d 00 00 mvi r13,0
800285c: e0 00 00 09 bi 8002880 <rmdir+0x64>
parentpathlen = rtems_filesystem_dirname ( pathname );
if ( parentpathlen == 0 )
rtems_filesystem_get_start_loc( pathname, &i, &parentloc );
else {
result = rtems_filesystem_evaluate_path(pathname, parentpathlen,
8002860: b9 c0 08 00 mv r1,r14
8002864: b9 60 10 00 mv r2,r11
8002868: 34 03 00 02 mvi r3,2
800286c: 34 05 00 00 mvi r5,0
8002870: fb ff fb a9 calli 8001714 <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
return -1;
8002874: 34 0c ff ff mvi r12,-1
else {
result = rtems_filesystem_evaluate_path(pathname, parentpathlen,
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
8002878: 5c 20 00 3d bne r1,r0,800296c <rmdir+0x150> <== NEVER TAKEN
return -1;
free_parentloc = true;
800287c: 34 0d 00 01 mvi r13,1
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
8002880: 2b 81 00 2c lw r1,(sp+44)
name = pathname + parentpathlen;
8002884: b5 cb 58 00 add r11,r14,r11
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
8002888: 5b 81 00 18 sw (sp+24),r1
800288c: 2b 81 00 30 lw r1,(sp+48)
8002890: 5b 81 00 1c sw (sp+28),r1
8002894: 2b 81 00 34 lw r1,(sp+52)
8002898: 5b 81 00 20 sw (sp+32),r1
800289c: 2b 81 00 38 lw r1,(sp+56)
80028a0: 5b 81 00 24 sw (sp+36),r1
80028a4: 2b 81 00 3c lw r1,(sp+60)
80028a8: 5b 81 00 28 sw (sp+40),r1
name = pathname + parentpathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
80028ac: b9 60 08 00 mv r1,r11
80028b0: f8 00 2e 04 calli 800e0c0 <strlen>
80028b4: b8 20 10 00 mv r2,r1
80028b8: b9 60 08 00 mv r1,r11
80028bc: fb ff fb c5 calli 80017d0 <rtems_filesystem_prefix_separators>
80028c0: b5 61 60 00 add r12,r11,r1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
80028c4: b9 80 08 00 mv r1,r12
80028c8: f8 00 2d fe calli 800e0c0 <strlen>
80028cc: 37 8b 00 18 addi r11,sp,24
80028d0: b8 20 10 00 mv r2,r1
80028d4: 34 03 00 00 mvi r3,0
80028d8: b9 80 08 00 mv r1,r12
80028dc: b9 60 20 00 mv r4,r11
80028e0: 34 05 00 00 mvi r5,0
80028e4: fb ff fb 6a calli 800168c <rtems_filesystem_evaluate_relative_path>
0, &loc, false );
if ( result != 0 ) {
80028e8: 44 20 00 05 be r1,r0,80028fc <rmdir+0xe0>
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return -1;
80028ec: 34 0c ff ff mvi r12,-1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
80028f0: 37 81 00 2c addi r1,sp,44
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
80028f4: 45 a0 00 1e be r13,r0,800296c <rmdir+0x150>
80028f8: e0 00 00 1c bi 8002968 <rmdir+0x14c>
}
/*
* Verify you can remove this node as a directory.
*/
if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) {
80028fc: 2b 81 00 24 lw r1,(sp+36)
8002900: 28 22 00 10 lw r2,(r1+16)
8002904: b9 60 08 00 mv r1,r11
8002908: d8 40 00 00 call r2
800290c: 34 02 00 01 mvi r2,1
8002910: 44 22 00 0b be r1,r2,800293c <rmdir+0x120>
rtems_filesystem_freenode( &loc );
8002914: b9 60 08 00 mv r1,r11
8002918: fb ff fb c7 calli 8001834 <rtems_filesystem_freenode>
if ( free_parentloc )
800291c: 45 a0 00 03 be r13,r0,8002928 <rmdir+0x10c> <== NEVER TAKEN
rtems_filesystem_freenode( &parentloc );
8002920: 37 81 00 2c addi r1,sp,44
8002924: fb ff fb c4 calli 8001834 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( ENOTDIR );
8002928: f8 00 29 85 calli 800cf3c <__errno>
800292c: 34 02 00 14 mvi r2,20
8002930: 58 22 00 00 sw (r1+0),r2
8002934: 34 0c ff ff mvi r12,-1
8002938: e0 00 00 0d bi 800296c <rmdir+0x150>
/*
* Use the filesystems rmnod to remove the node.
*/
result = (*loc.handlers->rmnod_h)( &parentloc, &loc );
800293c: 2b 81 00 20 lw r1,(sp+32)
8002940: 37 8e 00 2c addi r14,sp,44
8002944: b9 60 10 00 mv r2,r11
8002948: 28 23 00 34 lw r3,(r1+52)
800294c: b9 c0 08 00 mv r1,r14
8002950: d8 60 00 00 call r3
8002954: b8 20 60 00 mv r12,r1
rtems_filesystem_freenode( &loc );
8002958: b9 60 08 00 mv r1,r11
800295c: fb ff fb b6 calli 8001834 <rtems_filesystem_freenode>
if ( free_parentloc )
8002960: 45 a0 00 03 be r13,r0,800296c <rmdir+0x150>
rtems_filesystem_freenode( &parentloc );
8002964: b9 c0 08 00 mv r1,r14
8002968: fb ff fb b3 calli 8001834 <rtems_filesystem_freenode>
return result;
}
800296c: b9 80 08 00 mv r1,r12
8002970: 2b 9d 00 04 lw ra,(sp+4)
8002974: 2b 8b 00 14 lw r11,(sp+20)
8002978: 2b 8c 00 10 lw r12,(sp+16)
800297c: 2b 8d 00 0c lw r13,(sp+12)
8002980: 2b 8e 00 08 lw r14,(sp+8)
8002984: 37 9c 00 40 addi sp,sp,64
8002988: c3 a0 00 00 ret
08004198 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
8004198: 37 9c ff bc addi sp,sp,-68
800419c: 5b 8b 00 20 sw (sp+32),r11
80041a0: 5b 8c 00 1c sw (sp+28),r12
80041a4: 5b 8d 00 18 sw (sp+24),r13
80041a8: 5b 8e 00 14 sw (sp+20),r14
80041ac: 5b 8f 00 10 sw (sp+16),r15
80041b0: 5b 90 00 0c sw (sp+12),r16
80041b4: 5b 91 00 08 sw (sp+8),r17
80041b8: 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);
80041bc: 78 0c 08 01 mvhi r12,0x801
80041c0: 39 8c 77 f8 ori r12,r12,0x77f8
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
80041c4: b8 20 58 00 mv r11,r1
struct sched_param param;
/* The queue should be initialized */
AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED);
result = pthread_mutex_lock (&aio_request_queue.mutex);
80041c8: b9 80 08 00 mv r1,r12
80041cc: f8 00 02 b2 calli 8004c94 <pthread_mutex_lock>
80041d0: b8 20 70 00 mv r14,r1
if (result != 0) {
80041d4: 44 20 00 04 be r1,r0,80041e4 <rtems_aio_enqueue+0x4c> <== ALWAYS TAKEN
free (req);
80041d8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80041dc: fb ff f7 e1 calli 8002160 <free> <== NOT EXECUTED
return result;
80041e0: e0 00 00 7a bi 80043c8 <rtems_aio_enqueue+0x230> <== NOT EXECUTED
}
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
80041e4: f8 00 05 47 calli 8005700 <pthread_self>
80041e8: 37 82 00 40 addi r2,sp,64
80041ec: 37 83 00 24 addi r3,sp,36
80041f0: f8 00 04 05 calli 8005204 <pthread_getschedparam>
req->caller_thread = pthread_self ();
80041f4: f8 00 05 43 calli 8005700 <pthread_self>
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
80041f8: 29 62 00 14 lw r2,(r11+20)
/* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined,
we can use aio_reqprio to lower the priority of the request */
pthread_getschedparam (pthread_self(), &policy, ¶m);
req->caller_thread = pthread_self ();
80041fc: 59 61 00 10 sw (r11+16),r1
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
8004200: 2b 83 00 24 lw r3,(sp+36)
8004204: 28 41 00 10 lw r1,(r2+16)
8004208: c8 61 08 00 sub r1,r3,r1
800420c: 59 61 00 0c sw (r11+12),r1
req->policy = policy;
8004210: 2b 81 00 40 lw r1,(sp+64)
8004214: 59 61 00 08 sw (r11+8),r1
req->aiocbp->error_code = EINPROGRESS;
8004218: 34 01 00 77 mvi r1,119
800421c: 58 41 00 2c sw (r2+44),r1
req->aiocbp->return_value = 0;
if ((aio_request_queue.idle_threads == 0) &&
8004220: 29 81 00 68 lw r1,(r12+104)
req->caller_thread = pthread_self ();
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
req->aiocbp->return_value = 0;
8004224: 58 40 00 30 sw (r2+48),r0
if ((aio_request_queue.idle_threads == 0) &&
8004228: 5c 2e 00 34 bne r1,r14,80042f8 <rtems_aio_enqueue+0x160>
800422c: 29 83 00 64 lw r3,(r12+100)
8004230: 34 01 00 04 mvi r1,4
8004234: 48 61 00 31 bg r3,r1,80042f8 <rtems_aio_enqueue+0x160>
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);
8004238: 28 42 00 00 lw r2,(r2+0)
800423c: 78 01 08 01 mvhi r1,0x801
8004240: 38 21 78 40 ori r1,r1,0x7840
8004244: 34 03 00 01 mvi r3,1
8004248: fb ff fe a6 calli 8003ce0 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
800424c: 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);
8004250: b8 20 68 00 mv r13,r1
8004254: 34 31 00 08 addi r17,r1,8
8004258: 34 2f 00 1c addi r15,r1,28
800425c: 34 30 00 20 addi r16,r1,32
if (r_chain->new_fd == 1) {
8004260: 34 01 00 01 mvi r1,1
8004264: 5c 41 00 1c bne r2,r1,80042d4 <rtems_aio_enqueue+0x13c>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
8004268: b9 60 10 00 mv r2,r11
800426c: ba 20 08 00 mv r1,r17
8004270: f8 00 08 7c calli 8006460 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
8004274: 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;
8004278: 59 a0 00 18 sw (r13+24),r0
pthread_mutex_init (&r_chain->mutex, NULL);
800427c: b9 e0 08 00 mv r1,r15
8004280: f8 00 02 28 calli 8004b20 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
8004284: 34 02 00 00 mvi r2,0
8004288: ba 00 08 00 mv r1,r16
800428c: f8 00 01 03 calli 8004698 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
8004290: 78 02 08 01 mvhi r2,0x801
8004294: 78 03 08 00 mvhi r3,0x800
8004298: 37 81 00 44 addi r1,sp,68
800429c: 38 42 78 00 ori r2,r2,0x7800
80042a0: 38 63 3d b8 ori r3,r3,0x3db8
80042a4: b9 a0 20 00 mv r4,r13
80042a8: f8 00 03 12 calli 8004ef0 <pthread_create>
80042ac: b8 20 58 00 mv r11,r1
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
80042b0: 44 20 00 05 be r1,r0,80042c4 <rtems_aio_enqueue+0x12c> <== ALWAYS TAKEN
pthread_mutex_unlock (&aio_request_queue.mutex);
80042b4: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
80042b8: f8 00 02 aa calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
return result;
80042bc: b9 60 70 00 mv r14,r11 <== NOT EXECUTED
80042c0: e0 00 00 42 bi 80043c8 <rtems_aio_enqueue+0x230> <== NOT EXECUTED
}
++aio_request_queue.active_threads;
80042c4: 29 81 00 64 lw r1,(r12+100)
80042c8: 34 21 00 01 addi r1,r1,1
80042cc: 59 81 00 64 sw (r12+100),r1
80042d0: e0 00 00 3b bi 80043bc <rtems_aio_enqueue+0x224>
}
else {
/* put request in the fd chain it belongs to */
pthread_mutex_lock (&r_chain->mutex);
80042d4: b9 e0 08 00 mv r1,r15
80042d8: f8 00 02 6f calli 8004c94 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
80042dc: ba 20 08 00 mv r1,r17
80042e0: b9 60 10 00 mv r2,r11
80042e4: fb ff ff 63 calli 8004070 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
80042e8: ba 00 08 00 mv r1,r16
80042ec: f8 00 01 26 calli 8004784 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
80042f0: b9 e0 08 00 mv r1,r15
80042f4: e0 00 00 11 bi 8004338 <rtems_aio_enqueue+0x1a0>
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,
80042f8: 28 42 00 00 lw r2,(r2+0)
80042fc: 78 01 08 01 mvhi r1,0x801
8004300: 38 21 78 40 ori r1,r1,0x7840
8004304: 34 03 00 00 mvi r3,0
8004308: fb ff fe 76 calli 8003ce0 <rtems_aio_search_fd>
800430c: b8 20 60 00 mv r12,r1
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
8004310: 44 20 00 0c be r1,r0,8004340 <rtems_aio_enqueue+0x1a8> <== ALWAYS TAKEN
{
pthread_mutex_lock (&r_chain->mutex);
8004314: 34 2d 00 1c addi r13,r1,28 <== NOT EXECUTED
8004318: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
800431c: f8 00 02 5e calli 8004c94 <pthread_mutex_lock> <== NOT EXECUTED
rtems_aio_insert_prio (&r_chain->perfd, req);
8004320: 35 81 00 08 addi r1,r12,8 <== NOT EXECUTED
8004324: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8004328: fb ff ff 52 calli 8004070 <rtems_aio_insert_prio> <== NOT EXECUTED
pthread_cond_signal (&r_chain->cond);
800432c: 35 81 00 20 addi r1,r12,32 <== NOT EXECUTED
8004330: f8 00 01 15 calli 8004784 <pthread_cond_signal> <== NOT EXECUTED
pthread_mutex_unlock (&r_chain->mutex);
8004334: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8004338: f8 00 02 8a calli 8004d60 <pthread_mutex_unlock>
800433c: e0 00 00 20 bi 80043bc <rtems_aio_enqueue+0x224>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
8004340: 29 62 00 14 lw r2,(r11+20)
8004344: 78 01 08 01 mvhi r1,0x801
8004348: 34 03 00 01 mvi r3,1
800434c: 28 42 00 00 lw r2,(r2+0)
8004350: 38 21 78 4c ori r1,r1,0x784c
8004354: fb ff fe 63 calli 8003ce0 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
8004358: 28 23 00 18 lw r3,(r1+24)
800435c: 34 02 00 01 mvi r2,1
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
8004360: b8 20 60 00 mv r12,r1
8004364: 34 21 00 08 addi r1,r1,8
if (r_chain->new_fd == 1) {
8004368: 5c 62 00 13 bne r3,r2,80043b4 <rtems_aio_enqueue+0x21c>
800436c: b9 60 10 00 mv r2,r11
8004370: f8 00 08 3c calli 8006460 <_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);
8004374: 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;
8004378: 59 80 00 18 sw (r12+24),r0
pthread_mutex_init (&r_chain->mutex, NULL);
800437c: 35 81 00 1c addi r1,r12,28
8004380: f8 00 01 e8 calli 8004b20 <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
8004384: 34 02 00 00 mvi r2,0
8004388: 35 81 00 20 addi r1,r12,32
800438c: f8 00 00 c3 calli 8004698 <pthread_cond_init>
pthread_cond_signal (&aio_request_queue.new_req);
8004390: 78 01 08 01 mvhi r1,0x801
8004394: 38 21 77 fc ori r1,r1,0x77fc
8004398: f8 00 00 fb calli 8004784 <pthread_cond_signal>
++aio_request_queue.idle_threads;
800439c: 78 02 08 01 mvhi r2,0x801
80043a0: 38 42 77 f8 ori r2,r2,0x77f8
80043a4: 28 41 00 68 lw r1,(r2+104)
80043a8: 34 21 00 01 addi r1,r1,1
80043ac: 58 41 00 68 sw (r2+104),r1
80043b0: e0 00 00 03 bi 80043bc <rtems_aio_enqueue+0x224>
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
80043b4: b9 60 10 00 mv r2,r11
80043b8: fb ff ff 2e calli 8004070 <rtems_aio_insert_prio>
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
80043bc: 78 01 08 01 mvhi r1,0x801
80043c0: 38 21 77 f8 ori r1,r1,0x77f8
80043c4: f8 00 02 67 calli 8004d60 <pthread_mutex_unlock>
return 0;
}
80043c8: b9 c0 08 00 mv r1,r14
80043cc: 2b 9d 00 04 lw ra,(sp+4)
80043d0: 2b 8b 00 20 lw r11,(sp+32)
80043d4: 2b 8c 00 1c lw r12,(sp+28)
80043d8: 2b 8d 00 18 lw r13,(sp+24)
80043dc: 2b 8e 00 14 lw r14,(sp+20)
80043e0: 2b 8f 00 10 lw r15,(sp+16)
80043e4: 2b 90 00 0c lw r16,(sp+12)
80043e8: 2b 91 00 08 lw r17,(sp+8)
80043ec: 37 9c 00 44 addi sp,sp,68
80043f0: c3 a0 00 00 ret
08003db8 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
8003db8: 37 9c ff a0 addi sp,sp,-96 <== NOT EXECUTED
8003dbc: 5b 8b 00 38 sw (sp+56),r11 <== NOT EXECUTED
8003dc0: 5b 8c 00 34 sw (sp+52),r12 <== NOT EXECUTED
8003dc4: 5b 8d 00 30 sw (sp+48),r13 <== NOT EXECUTED
8003dc8: 5b 8e 00 2c sw (sp+44),r14 <== NOT EXECUTED
8003dcc: 5b 8f 00 28 sw (sp+40),r15 <== NOT EXECUTED
8003dd0: 5b 90 00 24 sw (sp+36),r16 <== NOT EXECUTED
8003dd4: 5b 91 00 20 sw (sp+32),r17 <== NOT EXECUTED
8003dd8: 5b 92 00 1c sw (sp+28),r18 <== NOT EXECUTED
8003ddc: 5b 93 00 18 sw (sp+24),r19 <== NOT EXECUTED
8003de0: 5b 94 00 14 sw (sp+20),r20 <== NOT EXECUTED
8003de4: 5b 95 00 10 sw (sp+16),r21 <== NOT EXECUTED
8003de8: 5b 96 00 0c sw (sp+12),r22 <== NOT EXECUTED
8003dec: 5b 97 00 08 sw (sp+8),r23 <== NOT EXECUTED
8003df0: 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);
8003df4: 78 0b 08 01 mvhi r11,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)) {
8003df8: 78 12 08 01 mvhi r18,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,
8003dfc: 78 11 08 01 mvhi r17,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,
8003e00: 78 10 08 01 mvhi r16,0x801 <== NOT EXECUTED
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
8003e04: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
The fd chain is already unlocked */
struct timespec timeout;
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
8003e08: 39 6b 77 f8 ori r11,r11,0x77f8 <== NOT EXECUTED
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
8003e0c: 37 8e 00 58 addi r14,sp,88 <== 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) {
8003e10: 34 15 00 74 mvi r21,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)) {
8003e14: 3a 52 78 50 ori r18,r18,0x7850 <== 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,
8003e18: 3a 31 77 fc ori r17,r17,0x77fc <== 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,
8003e1c: 3a 10 78 40 ori r16,r16,0x7840 <== 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);
8003e20: 37 94 00 3c addi r20,sp,60 <== NOT EXECUTED
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
8003e24: 34 17 00 02 mvi r23,2 <== NOT EXECUTED
default:
result = -1;
}
if (result == -1) {
req->aiocbp->return_value = -1;
8003e28: 34 13 ff ff mvi r19,-1 <== NOT EXECUTED
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
switch (req->aiocbp->aio_lio_opcode) {
8003e2c: 34 16 00 03 mvi r22,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);
8003e30: 35 8f 00 1c addi r15,r12,28 <== NOT EXECUTED
8003e34: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
8003e38: f8 00 03 97 calli 8004c94 <pthread_mutex_lock> <== NOT EXECUTED
if (result != 0)
8003e3c: 5c 20 00 7c bne r1,r0,800402c <rtems_aio_handle+0x274> <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
8003e40: 29 8d 00 08 lw r13,(r12+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 );
8003e44: 35 81 00 0c addi r1,r12,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)) {
8003e48: 45 a1 00 2e be r13,r1,8003f00 <rtems_aio_handle+0x148> <== 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);
8003e4c: f8 00 06 2d calli 8005700 <pthread_self> <== NOT EXECUTED
8003e50: 37 82 00 60 addi r2,sp,96 <== NOT EXECUTED
8003e54: ba 80 18 00 mv r3,r20 <== NOT EXECUTED
8003e58: f8 00 04 eb calli 8005204 <pthread_getschedparam> <== NOT EXECUTED
param.sched_priority = req->priority;
8003e5c: 29 a1 00 0c lw r1,(r13+12) <== NOT EXECUTED
8003e60: 5b 81 00 3c sw (sp+60),r1 <== NOT EXECUTED
pthread_setschedparam (pthread_self(), req->policy, ¶m);
8003e64: f8 00 06 27 calli 8005700 <pthread_self> <== NOT EXECUTED
8003e68: 29 a2 00 08 lw r2,(r13+8) <== NOT EXECUTED
8003e6c: ba 80 18 00 mv r3,r20 <== NOT EXECUTED
8003e70: f8 00 06 29 calli 8005714 <pthread_setschedparam> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8003e74: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003e78: f8 00 09 61 calli 80063fc <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
8003e7c: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
8003e80: f8 00 03 b8 calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
switch (req->aiocbp->aio_lio_opcode) {
8003e84: 29 a4 00 14 lw r4,(r13+20) <== NOT EXECUTED
8003e88: 28 81 00 28 lw r1,(r4+40) <== NOT EXECUTED
8003e8c: 44 37 00 0a be r1,r23,8003eb4 <rtems_aio_handle+0xfc> <== NOT EXECUTED
8003e90: 44 36 00 0f be r1,r22,8003ecc <rtems_aio_handle+0x114> <== NOT EXECUTED
8003e94: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
8003e98: 5c 22 00 10 bne r1,r2,8003ed8 <rtems_aio_handle+0x120> <== NOT EXECUTED
case LIO_READ:
result = pread (req->aiocbp->aio_fildes,
8003e9c: 28 82 00 08 lw r2,(r4+8) <== NOT EXECUTED
8003ea0: 28 83 00 0c lw r3,(r4+12) <== NOT EXECUTED
8003ea4: 28 81 00 00 lw r1,(r4+0) <== NOT EXECUTED
8003ea8: 28 84 00 04 lw r4,(r4+4) <== NOT EXECUTED
8003eac: f8 00 31 47 calli 80103c8 <pread> <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
8003eb0: e0 00 00 09 bi 8003ed4 <rtems_aio_handle+0x11c> <== NOT EXECUTED
case LIO_WRITE:
result = pwrite (req->aiocbp->aio_fildes,
8003eb4: 28 82 00 08 lw r2,(r4+8) <== NOT EXECUTED
8003eb8: 28 83 00 0c lw r3,(r4+12) <== NOT EXECUTED
8003ebc: 28 81 00 00 lw r1,(r4+0) <== NOT EXECUTED
8003ec0: 28 84 00 04 lw r4,(r4+4) <== NOT EXECUTED
8003ec4: f8 00 31 85 calli 80104d8 <pwrite> <== NOT EXECUTED
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
8003ec8: e0 00 00 03 bi 8003ed4 <rtems_aio_handle+0x11c> <== NOT EXECUTED
case LIO_SYNC:
result = fsync (req->aiocbp->aio_fildes);
8003ecc: 28 81 00 00 lw r1,(r4+0) <== NOT EXECUTED
8003ed0: f8 00 1d 15 calli 800b324 <fsync> <== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
8003ed4: 5c 33 00 07 bne r1,r19,8003ef0 <rtems_aio_handle+0x138> <== NOT EXECUTED
req->aiocbp->return_value = -1;
8003ed8: 29 ad 00 14 lw r13,(r13+20) <== NOT EXECUTED
8003edc: 59 b3 00 30 sw (r13+48),r19 <== NOT EXECUTED
req->aiocbp->error_code = errno;
8003ee0: f8 00 2d 8b calli 800f50c <__errno> <== NOT EXECUTED
8003ee4: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED
8003ee8: 59 a1 00 2c sw (r13+44),r1 <== NOT EXECUTED
8003eec: e3 ff ff d1 bi 8003e30 <rtems_aio_handle+0x78> <== NOT EXECUTED
} else {
req->aiocbp->return_value = result;
8003ef0: 29 a2 00 14 lw r2,(r13+20) <== NOT EXECUTED
8003ef4: 58 41 00 30 sw (r2+48),r1 <== NOT EXECUTED
req->aiocbp->error_code = 0;
8003ef8: 58 40 00 2c sw (r2+44),r0 <== NOT EXECUTED
8003efc: e3 ff ff cd bi 8003e30 <rtems_aio_handle+0x78> <== 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);
8003f00: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
8003f04: f8 00 03 97 calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
pthread_mutex_lock (&aio_request_queue.mutex);
8003f08: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003f0c: f8 00 03 62 calli 8004c94 <pthread_mutex_lock> <== NOT EXECUTED
if (rtems_chain_is_empty (chain))
8003f10: 29 81 00 08 lw r1,(r12+8) <== NOT EXECUTED
8003f14: 5c 2d ff c7 bne r1,r13,8003e30 <rtems_aio_handle+0x78> <== NOT EXECUTED
{
clock_gettime (CLOCK_REALTIME, &timeout);
8003f18: b9 c0 10 00 mv r2,r14 <== NOT EXECUTED
8003f1c: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
8003f20: f8 00 01 88 calli 8004540 <clock_gettime> <== NOT EXECUTED
timeout.tv_sec += 3;
8003f24: 2b 81 00 58 lw r1,(sp+88) <== NOT EXECUTED
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
8003f28: 35 8d 00 20 addi r13,r12,32 <== NOT EXECUTED
8003f2c: b9 60 10 00 mv r2,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;
8003f30: 34 21 00 03 addi r1,r1,3 <== NOT EXECUTED
8003f34: 5b 81 00 58 sw (sp+88),r1 <== NOT EXECUTED
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
8003f38: b9 c0 18 00 mv r3,r14 <== NOT EXECUTED
8003f3c: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
timeout.tv_nsec = 0;
8003f40: 5b 80 00 5c sw (sp+92),r0 <== NOT EXECUTED
result = pthread_cond_timedwait (&r_chain->cond,
8003f44: f8 00 02 34 calli 8004814 <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) {
8003f48: 5c 35 ff ba bne r1,r21,8003e30 <rtems_aio_handle+0x78> <== NOT EXECUTED
8003f4c: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003f50: f8 00 09 2b calli 80063fc <_Chain_Extract> <== NOT EXECUTED
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
8003f54: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED
8003f58: f8 00 02 95 calli 80049ac <pthread_mutex_destroy> <== NOT EXECUTED
pthread_cond_destroy (&r_chain->cond);
8003f5c: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003f60: f8 00 01 94 calli 80045b0 <pthread_cond_destroy> <== NOT EXECUTED
free (r_chain);
8003f64: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003f68: fb ff f8 7e calli 8002160 <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)) {
8003f6c: 29 61 00 54 lw r1,(r11+84) <== NOT EXECUTED
8003f70: 5c 32 00 2c bne r1,r18,8004020 <rtems_aio_handle+0x268> <== NOT EXECUTED
++aio_request_queue.idle_threads;
8003f74: 29 61 00 68 lw r1,(r11+104) <== NOT EXECUTED
clock_gettime (CLOCK_REALTIME, &timeout);
8003f78: b9 c0 10 00 mv r2,r14 <== 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;
8003f7c: 34 21 00 01 addi r1,r1,1 <== NOT EXECUTED
8003f80: 59 61 00 68 sw (r11+104),r1 <== NOT EXECUTED
clock_gettime (CLOCK_REALTIME, &timeout);
8003f84: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
8003f88: f8 00 01 6e calli 8004540 <clock_gettime> <== NOT EXECUTED
timeout.tv_sec += 3;
8003f8c: 2b 81 00 58 lw r1,(sp+88) <== NOT EXECUTED
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
8003f90: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8003f94: b9 c0 18 00 mv r3,r14 <== 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;
8003f98: 34 21 00 03 addi r1,r1,3 <== NOT EXECUTED
8003f9c: 5b 81 00 58 sw (sp+88),r1 <== NOT EXECUTED
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
8003fa0: ba 20 08 00 mv r1,r17 <== NOT EXECUTED
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;
timeout.tv_nsec = 0;
8003fa4: 5b 80 00 5c sw (sp+92),r0 <== NOT EXECUTED
result = pthread_cond_timedwait (&aio_request_queue.new_req,
8003fa8: f8 00 02 1b calli 8004814 <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) {
8003fac: 5c 35 00 04 bne r1,r21,8003fbc <rtems_aio_handle+0x204> <== NOT EXECUTED
pthread_mutex_unlock (&aio_request_queue.mutex);
8003fb0: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8003fb4: f8 00 03 6b calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
return NULL;
8003fb8: e0 00 00 1d bi 800402c <rtems_aio_handle+0x274> <== NOT EXECUTED
}
/* Otherwise move this chain to the working chain and
start the loop all over again */
--aio_request_queue.idle_threads;
8003fbc: 29 61 00 68 lw r1,(r11+104) <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
8003fc0: 29 6d 00 54 lw r13,(r11+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;
8003fc4: 34 21 ff ff addi r1,r1,-1 <== NOT EXECUTED
8003fc8: 59 61 00 68 sw (r11+104),r1 <== NOT EXECUTED
8003fcc: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8003fd0: f8 00 09 0b calli 80063fc <_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,
8003fd4: 29 a2 00 14 lw r2,(r13+20) <== NOT EXECUTED
8003fd8: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8003fdc: ba 00 08 00 mv r1,r16 <== NOT EXECUTED
8003fe0: fb ff ff 40 calli 8003ce0 <rtems_aio_search_fd> <== NOT EXECUTED
8003fe4: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
((rtems_aio_request_chain *)node)->fildes,
1);
r_chain->new_fd = 0;
8003fe8: 58 20 00 18 sw (r1+24),r0 <== NOT EXECUTED
pthread_mutex_init (&r_chain->mutex, NULL);
8003fec: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
8003ff0: 34 21 00 1c addi r1,r1,28 <== NOT EXECUTED
8003ff4: f8 00 02 cb calli 8004b20 <pthread_mutex_init> <== NOT EXECUTED
pthread_cond_init (&r_chain->cond, NULL);
8003ff8: 34 02 00 00 mvi r2,0 <== NOT EXECUTED
8003ffc: 35 81 00 20 addi r1,r12,32 <== NOT EXECUTED
8004000: f8 00 01 a6 calli 8004698 <pthread_cond_init> <== NOT EXECUTED
r_chain->perfd = ((rtems_aio_request_chain *)node)->perfd;
8004004: 29 a2 00 08 lw r2,(r13+8) <== NOT EXECUTED
8004008: 29 a1 00 0c lw r1,(r13+12) <== NOT EXECUTED
800400c: 29 a3 00 10 lw r3,(r13+16) <== NOT EXECUTED
8004010: 59 82 00 08 sw (r12+8),r2 <== NOT EXECUTED
8004014: 59 81 00 0c sw (r12+12),r1 <== NOT EXECUTED
8004018: 59 83 00 10 sw (r12+16),r3 <== NOT EXECUTED
800401c: e3 ff ff 85 bi 8003e30 <rtems_aio_handle+0x78> <== NOT EXECUTED
}
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);
8004020: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004024: f8 00 03 4f calli 8004d60 <pthread_mutex_unlock> <== NOT EXECUTED
8004028: e3 ff ff 82 bi 8003e30 <rtems_aio_handle+0x78> <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
800402c: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8004030: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8004034: 2b 8b 00 38 lw r11,(sp+56) <== NOT EXECUTED
8004038: 2b 8c 00 34 lw r12,(sp+52) <== NOT EXECUTED
800403c: 2b 8d 00 30 lw r13,(sp+48) <== NOT EXECUTED
8004040: 2b 8e 00 2c lw r14,(sp+44) <== NOT EXECUTED
8004044: 2b 8f 00 28 lw r15,(sp+40) <== NOT EXECUTED
8004048: 2b 90 00 24 lw r16,(sp+36) <== NOT EXECUTED
800404c: 2b 91 00 20 lw r17,(sp+32) <== NOT EXECUTED
8004050: 2b 92 00 1c lw r18,(sp+28) <== NOT EXECUTED
8004054: 2b 93 00 18 lw r19,(sp+24) <== NOT EXECUTED
8004058: 2b 94 00 14 lw r20,(sp+20) <== NOT EXECUTED
800405c: 2b 95 00 10 lw r21,(sp+16) <== NOT EXECUTED
8004060: 2b 96 00 0c lw r22,(sp+12) <== NOT EXECUTED
8004064: 2b 97 00 08 lw r23,(sp+8) <== NOT EXECUTED
8004068: 37 9c 00 60 addi sp,sp,96 <== NOT EXECUTED
800406c: c3 a0 00 00 ret <== NOT EXECUTED
08003be8 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
8003be8: 37 9c ff f4 addi sp,sp,-12
8003bec: 5b 8b 00 0c sw (sp+12),r11
8003bf0: 5b 8c 00 08 sw (sp+8),r12
8003bf4: 5b 9d 00 04 sw (sp+4),ra
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
8003bf8: 78 0c 08 01 mvhi r12,0x801
8003bfc: 39 8c 78 00 ori r12,r12,0x7800
8003c00: b9 80 08 00 mv r1,r12
8003c04: f8 00 04 a4 calli 8004e94 <pthread_attr_init>
8003c08: b8 20 58 00 mv r11,r1
if (result != 0)
8003c0c: 5c 20 00 2f bne r1,r0,8003cc8 <rtems_aio_init+0xe0> <== NEVER TAKEN
return result;
result =
8003c10: b9 80 08 00 mv r1,r12
8003c14: 34 02 00 00 mvi r2,0
8003c18: f8 00 04 ac calli 8004ec8 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
8003c1c: 44 2b 00 03 be r1,r11,8003c28 <rtems_aio_init+0x40> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
8003c20: b9 80 08 00 mv r1,r12 <== NOT EXECUTED
8003c24: f8 00 04 94 calli 8004e74 <pthread_attr_destroy> <== NOT EXECUTED
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
8003c28: 78 01 08 01 mvhi r1,0x801
8003c2c: 38 21 77 f8 ori r1,r1,0x77f8
8003c30: 34 02 00 00 mvi r2,0
8003c34: f8 00 03 bb calli 8004b20 <pthread_mutex_init>
if (result != 0)
8003c38: 44 20 00 04 be r1,r0,8003c48 <rtems_aio_init+0x60> <== ALWAYS TAKEN
pthread_attr_destroy (&aio_request_queue.attr);
8003c3c: 78 01 08 01 mvhi r1,0x801
8003c40: 38 21 78 00 ori r1,r1,0x7800 <== NOT EXECUTED
8003c44: f8 00 04 8c calli 8004e74 <pthread_attr_destroy> <== NOT EXECUTED
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
8003c48: 78 01 08 01 mvhi r1,0x801
8003c4c: 38 21 77 fc ori r1,r1,0x77fc
8003c50: 34 02 00 00 mvi r2,0
8003c54: f8 00 02 91 calli 8004698 <pthread_cond_init>
8003c58: b8 20 58 00 mv r11,r1
if (result != 0) {
8003c5c: 44 20 00 07 be r1,r0,8003c78 <rtems_aio_init+0x90> <== ALWAYS TAKEN
pthread_mutex_destroy (&aio_request_queue.mutex);
8003c60: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003c64: 38 21 77 f8 ori r1,r1,0x77f8 <== NOT EXECUTED
8003c68: f8 00 03 51 calli 80049ac <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
8003c6c: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8003c70: 38 21 78 00 ori r1,r1,0x7800 <== NOT EXECUTED
8003c74: f8 00 04 80 calli 8004e74 <pthread_attr_destroy> <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8003c78: 78 02 08 01 mvhi r2,0x801
8003c7c: 78 01 08 01 mvhi r1,0x801
8003c80: 38 42 77 f8 ori r2,r2,0x77f8
8003c84: 38 21 78 44 ori r1,r1,0x7844
8003c88: 58 41 00 48 sw (r2+72),r1
head->previous = NULL;
tail->previous = head;
8003c8c: 78 01 08 01 mvhi r1,0x801
8003c90: 38 21 78 40 ori r1,r1,0x7840
8003c94: 58 41 00 50 sw (r2+80),r1
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
8003c98: 78 01 08 01 mvhi r1,0x801
8003c9c: 38 21 78 50 ori r1,r1,0x7850
8003ca0: 58 41 00 54 sw (r2+84),r1
head->previous = NULL;
tail->previous = head;
8003ca4: 78 01 08 01 mvhi r1,0x801
8003ca8: 38 21 78 4c ori r1,r1,0x784c
8003cac: 58 41 00 5c sw (r2+92),r1
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
aio_request_queue.idle_threads = 0;
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
8003cb0: 38 01 b0 0b mvu r1,0xb00b
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
8003cb4: 58 40 00 4c sw (r2+76),r0
8003cb8: 58 40 00 58 sw (r2+88),r0
}
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
8003cbc: 58 40 00 64 sw (r2+100),r0
aio_request_queue.idle_threads = 0;
8003cc0: 58 40 00 68 sw (r2+104),r0
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
8003cc4: 58 41 00 60 sw (r2+96),r1
return result;
}
8003cc8: b9 60 08 00 mv r1,r11
8003ccc: 2b 9d 00 04 lw ra,(sp+4)
8003cd0: 2b 8b 00 0c lw r11,(sp+12)
8003cd4: 2b 8c 00 08 lw r12,(sp+8)
8003cd8: 37 9c 00 0c addi sp,sp,12
8003cdc: c3 a0 00 00 ret
08004070 <rtems_aio_insert_prio>:
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
8004070: 37 9c ff fc addi sp,sp,-4
8004074: 5b 9d 00 04 sw (sp+4),ra
}
AIO_printf ("Thread finished\n");
return NULL;
}
8004078: 28 23 00 00 lw r3,(r1+0)
800407c: 34 25 00 04 addi r5,r1,4
* NONE
*/
void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
8004080: b8 40 20 00 mv r4,r2
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
8004084: 44 65 00 0d be r3,r5,80040b8 <rtems_aio_insert_prio+0x48> <== NEVER TAKEN
AIO_printf ("First in chain \n");
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
8004088: 28 61 00 14 lw r1,(r3+20)
while (req->aiocbp->aio_reqprio > prio &&
800408c: 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;
8004090: 28 21 00 10 lw r1,(r1+16)
while (req->aiocbp->aio_reqprio > prio &&
8004094: 28 42 00 10 lw r2,(r2+16)
8004098: e0 00 00 04 bi 80040a8 <rtems_aio_insert_prio+0x38>
}
AIO_printf ("Thread finished\n");
return NULL;
}
800409c: 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;
80040a0: 28 61 00 14 lw r1,(r3+20) <== NOT EXECUTED
80040a4: 28 21 00 10 lw r1,(r1+16) <== NOT EXECUTED
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
80040a8: 4c 22 00 02 bge r1,r2,80040b0 <rtems_aio_insert_prio+0x40> <== ALWAYS TAKEN
80040ac: 5c 65 ff fc bne r3,r5,800409c <rtems_aio_insert_prio+0x2c>
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
80040b0: 28 61 00 04 lw r1,(r3+4)
80040b4: b8 80 10 00 mv r2,r4
80040b8: f8 00 08 ea calli 8006460 <_Chain_Insert>
}
rtems_chain_insert (node->previous, &req->next_prio);
}
}
80040bc: 2b 9d 00 04 lw ra,(sp+4)
80040c0: 37 9c 00 04 addi sp,sp,4
80040c4: c3 a0 00 00 ret
080040c8 <rtems_aio_remove_fd>:
* Output parameters:
* NONE
*/
void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain)
{
80040c8: 37 9c ff ec addi sp,sp,-20 <== NOT EXECUTED
80040cc: 5b 8b 00 14 sw (sp+20),r11 <== NOT EXECUTED
80040d0: 5b 8c 00 10 sw (sp+16),r12 <== NOT EXECUTED
80040d4: 5b 8d 00 0c sw (sp+12),r13 <== NOT EXECUTED
80040d8: 5b 8e 00 08 sw (sp+8),r14 <== NOT EXECUTED
80040dc: 5b 9d 00 04 sw (sp+4),ra <== 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;
80040e0: 34 0d 00 8c mvi r13,140 <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
80040e4: 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));
80040e8: 34 2e 00 0c addi r14,r1,12 <== 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;
80040ec: 34 0c ff ff mvi r12,-1 <== NOT EXECUTED
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
80040f0: e0 00 00 08 bi 8004110 <rtems_aio_remove_fd+0x48> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
80040f4: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80040f8: f8 00 08 c1 calli 80063fc <_Chain_Extract> <== NOT EXECUTED
{
rtems_chain_extract (node);
rtems_aio_request *req = (rtems_aio_request *) node;
req->aiocbp->error_code = ECANCELED;
80040fc: 29 61 00 14 lw r1,(r11+20) <== NOT EXECUTED
8004100: 58 2d 00 2c sw (r1+44),r13 <== NOT EXECUTED
req->aiocbp->return_value = -1;
8004104: 58 2c 00 30 sw (r1+48),r12 <== NOT EXECUTED
free (req);
8004108: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800410c: fb ff f8 15 calli 8002160 <free> <== NOT EXECUTED
rtems_chain_node *node;
chain = &r_chain->perfd;
node = rtems_chain_first (chain);
while (!rtems_chain_is_tail (chain, node))
8004110: 5d 6e ff f9 bne r11,r14,80040f4 <rtems_aio_remove_fd+0x2c> <== NOT EXECUTED
rtems_aio_request *req = (rtems_aio_request *) node;
req->aiocbp->error_code = ECANCELED;
req->aiocbp->return_value = -1;
free (req);
}
}
8004114: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8004118: 2b 8b 00 14 lw r11,(sp+20) <== NOT EXECUTED
800411c: 2b 8c 00 10 lw r12,(sp+16) <== NOT EXECUTED
8004120: 2b 8d 00 0c lw r13,(sp+12) <== NOT EXECUTED
8004124: 2b 8e 00 08 lw r14,(sp+8) <== NOT EXECUTED
8004128: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED
800412c: c3 a0 00 00 ret <== NOT EXECUTED
08004130 <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)
{
8004130: 37 9c ff f8 addi sp,sp,-8 <== NOT EXECUTED
8004134: 5b 8b 00 08 sw (sp+8),r11 <== NOT EXECUTED
8004138: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
800413c: 28 2b 00 00 lw r11,(r1+0) <== NOT EXECUTED
8004140: 34 21 00 04 addi r1,r1,4 <== 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) {
8004144: e0 00 00 02 bi 800414c <rtems_aio_remove_req+0x1c> <== NOT EXECUTED
}
AIO_printf ("Thread finished\n");
return NULL;
}
8004148: 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) {
800414c: 45 61 00 0e be r11,r1,8004184 <rtems_aio_remove_req+0x54> <== NOT EXECUTED
8004150: 29 63 00 14 lw r3,(r11+20) <== NOT EXECUTED
8004154: 5c 62 ff fd bne r3,r2,8004148 <rtems_aio_remove_req+0x18> <== NOT EXECUTED
8004158: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
800415c: f8 00 08 a8 calli 80063fc <_Chain_Extract> <== NOT EXECUTED
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
8004160: 29 61 00 14 lw r1,(r11+20) <== NOT EXECUTED
8004164: 34 02 00 8c mvi r2,140 <== NOT EXECUTED
8004168: 58 22 00 2c sw (r1+44),r2 <== NOT EXECUTED
current->aiocbp->return_value = -1;
800416c: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
8004170: 58 22 00 30 sw (r1+48),r2 <== NOT EXECUTED
free (current);
8004174: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8004178: fb ff f7 fa calli 8002160 <free> <== NOT EXECUTED
}
return AIO_CANCELED;
800417c: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8004180: e0 00 00 02 bi 8004188 <rtems_aio_remove_req+0x58> <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
8004184: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
8004188: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
800418c: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED
8004190: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED
8004194: c3 a0 00 00 ret <== NOT EXECUTED
080036cc <rtems_chain_append_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
80036cc: 37 9c ff f4 addi sp,sp,-12
80036d0: 5b 8b 00 0c sw (sp+12),r11
80036d4: 5b 8c 00 08 sw (sp+8),r12
80036d8: 5b 9d 00 04 sw (sp+4),ra
80036dc: b8 60 60 00 mv r12,r3
80036e0: 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 );
80036e4: f8 00 01 a5 calli 8003d78 <_Chain_Append_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
80036e8: 34 05 00 00 mvi r5,0
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
80036ec: 44 20 00 05 be r1,r0,8003700 <rtems_chain_append_with_notification+0x34><== NEVER TAKEN
sc = rtems_event_send( task, events );
80036f0: b9 80 08 00 mv r1,r12
80036f4: b9 60 10 00 mv r2,r11
80036f8: f8 00 18 91 calli 800993c <rtems_event_send>
80036fc: b8 20 28 00 mv r5,r1
}
return sc;
}
8003700: b8 a0 08 00 mv r1,r5
8003704: 2b 9d 00 04 lw ra,(sp+4)
8003708: 2b 8b 00 0c lw r11,(sp+12)
800370c: 2b 8c 00 08 lw r12,(sp+8)
8003710: 37 9c 00 0c addi sp,sp,12
8003714: c3 a0 00 00 ret
08003768 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
8003768: 37 9c ff e4 addi sp,sp,-28
800376c: 5b 8b 00 18 sw (sp+24),r11
8003770: 5b 8c 00 14 sw (sp+20),r12
8003774: 5b 8d 00 10 sw (sp+16),r13
8003778: 5b 8e 00 0c sw (sp+12),r14
800377c: 5b 8f 00 08 sw (sp+8),r15
8003780: 5b 9d 00 04 sw (sp+4),ra
8003784: b8 20 78 00 mv r15,r1
8003788: b8 40 70 00 mv r14,r2
800378c: b8 60 68 00 mv r13,r3
8003790: b8 80 60 00 mv r12,r4
8003794: e0 00 00 08 bi 80037b4 <rtems_chain_get_with_wait+0x4c>
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
8003798: b9 c0 08 00 mv r1,r14
800379c: 34 02 00 00 mvi r2,0
80037a0: b9 a0 18 00 mv r3,r13
80037a4: 37 84 00 1c addi r4,sp,28
80037a8: fb ff fd d2 calli 8002ef0 <rtems_event_receive>
80037ac: b8 20 28 00 mv r5,r1
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
80037b0: 5c 2b 00 06 bne r1,r11,80037c8 <rtems_chain_get_with_wait+0x60><== ALWAYS TAKEN
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
80037b4: b9 e0 08 00 mv r1,r15
80037b8: f8 00 01 a6 calli 8003e50 <_Chain_Get>
80037bc: b8 20 58 00 mv r11,r1
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
80037c0: 44 20 ff f6 be r1,r0,8003798 <rtems_chain_get_with_wait+0x30>
80037c4: 34 05 00 00 mvi r5,0
}
*node_ptr = node;
return sc;
}
80037c8: b8 a0 08 00 mv r1,r5
timeout,
&out
);
}
*node_ptr = node;
80037cc: 59 8b 00 00 sw (r12+0),r11
return sc;
}
80037d0: 2b 9d 00 04 lw ra,(sp+4)
80037d4: 2b 8b 00 18 lw r11,(sp+24)
80037d8: 2b 8c 00 14 lw r12,(sp+20)
80037dc: 2b 8d 00 10 lw r13,(sp+16)
80037e0: 2b 8e 00 0c lw r14,(sp+12)
80037e4: 2b 8f 00 08 lw r15,(sp+8)
80037e8: 37 9c 00 1c addi sp,sp,28
80037ec: c3 a0 00 00 ret
080037f0 <rtems_chain_prepend_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
80037f0: 37 9c ff f4 addi sp,sp,-12
80037f4: 5b 8b 00 0c sw (sp+12),r11
80037f8: 5b 8c 00 08 sw (sp+8),r12
80037fc: 5b 9d 00 04 sw (sp+4),ra
8003800: b8 60 60 00 mv r12,r3
8003804: 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 );
8003808: f8 00 01 ac calli 8003eb8 <_Chain_Prepend_with_empty_check>
rtems_status_code sc = RTEMS_SUCCESSFUL;
800380c: 34 05 00 00 mvi r5,0
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
8003810: 44 20 00 05 be r1,r0,8003824 <rtems_chain_prepend_with_notification+0x34><== NEVER TAKEN
sc = rtems_event_send( task, events );
8003814: b9 80 08 00 mv r1,r12
8003818: b9 60 10 00 mv r2,r11
800381c: f8 00 18 48 calli 800993c <rtems_event_send>
8003820: b8 20 28 00 mv r5,r1
}
return sc;
}
8003824: b8 a0 08 00 mv r1,r5
8003828: 2b 9d 00 04 lw ra,(sp+4)
800382c: 2b 8b 00 0c lw r11,(sp+12)
8003830: 2b 8c 00 08 lw r12,(sp+8)
8003834: 37 9c 00 0c addi sp,sp,12
8003838: c3 a0 00 00 ret
08010a00 <rtems_clock_set_nanoseconds_extension>:
* error code - if unsuccessful
*/
rtems_status_code rtems_clock_set_nanoseconds_extension(
rtems_nanoseconds_extension_routine routine
)
{
8010a00: b8 20 18 00 mv r3,r1
if ( !routine )
return RTEMS_INVALID_ADDRESS;
8010a04: 34 01 00 09 mvi r1,9
*/
rtems_status_code rtems_clock_set_nanoseconds_extension(
rtems_nanoseconds_extension_routine routine
)
{
if ( !routine )
8010a08: 44 60 00 05 be r3,r0,8010a1c <rtems_clock_set_nanoseconds_extension+0x1c><== ALWAYS TAKEN
return RTEMS_INVALID_ADDRESS;
_Watchdog_Nanoseconds_since_tick_handler = routine;
8010a0c: 78 02 08 03 mvhi r2,0x803
8010a10: 38 42 fe 2c ori r2,r2,0xfe2c
8010a14: 58 43 00 00 sw (r2+0),r3 <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
8010a18: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
}
8010a1c: c3 a0 00 00 ret
08001a40 <rtems_cpu_usage_report_with_plugin>:
void rtems_cpu_usage_report_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
8001a40: 37 9c ff 84 addi sp,sp,-124
8001a44: 5b 8b 00 44 sw (sp+68),r11
8001a48: 5b 8c 00 40 sw (sp+64),r12
8001a4c: 5b 8d 00 3c sw (sp+60),r13
8001a50: 5b 8e 00 38 sw (sp+56),r14
8001a54: 5b 8f 00 34 sw (sp+52),r15
8001a58: 5b 90 00 30 sw (sp+48),r16
8001a5c: 5b 91 00 2c sw (sp+44),r17
8001a60: 5b 92 00 28 sw (sp+40),r18
8001a64: 5b 93 00 24 sw (sp+36),r19
8001a68: 5b 94 00 20 sw (sp+32),r20
8001a6c: 5b 95 00 1c sw (sp+28),r21
8001a70: 5b 96 00 18 sw (sp+24),r22
8001a74: 5b 97 00 14 sw (sp+20),r23
8001a78: 5b 98 00 10 sw (sp+16),r24
8001a7c: 5b 99 00 0c sw (sp+12),r25
8001a80: 5b 9b 00 08 sw (sp+8),fp
8001a84: 5b 9d 00 04 sw (sp+4),ra
8001a88: b8 20 70 00 mv r14,r1
8001a8c: b8 40 68 00 mv r13,r2
Timestamp_Control uptime, total, ran;
#else
uint32_t total_units = 0;
#endif
if ( !print )
8001a90: 44 40 00 60 be r2,r0,8001c10 <rtems_cpu_usage_report_with_plugin+0x1d0><== 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 );
8001a94: 37 8b 00 70 addi r11,sp,112
8001a98: b9 60 08 00 mv r1,r11
8001a9c: f8 00 0f 74 calli 800586c <_TOD_Get_uptime>
_Timestamp_Subtract( &CPU_usage_Uptime_at_last_reset, &uptime, &total );
8001aa0: 37 90 00 68 addi r16,sp,104
8001aa4: 78 01 08 02 mvhi r1,0x802
8001aa8: 38 21 9b f8 ori r1,r1,0x9bf8
8001aac: b9 60 10 00 mv r2,r11
8001ab0: ba 00 18 00 mv r3,r16
8001ab4: f8 00 1a 6d calli 8008468 <_Timespec_Subtract>
}
}
}
#endif
(*print)(
8001ab8: 78 02 08 01 mvhi r2,0x801
8001abc: b9 c0 08 00 mv r1,r14
8001ac0: 38 42 e4 f8 ori r2,r2,0xe4f8
8001ac4: 78 0c 08 02 mvhi r12,0x802
if ( !the_thread )
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
(*print)(
8001ac8: 78 13 08 01 mvhi r19,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 ) {
8001acc: 78 0f 08 02 mvhi r15,0x802
/*
* Print the information
*/
(*print)( context,
8001ad0: 78 12 08 01 mvhi r18,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(
8001ad4: 78 11 08 02 mvhi r17,0x802
}
}
}
#endif
(*print)(
8001ad8: d9 a0 00 00 call r13
8001adc: 39 8c 96 38 ori r12,r12,0x9638
the_thread = (Thread_Control *)information->local_table[ i ];
if ( !the_thread )
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
8001ae0: 37 98 00 48 addi r24,sp,72
(*print)(
8001ae4: 3a 73 e6 6c ori r19,r19,0xe66c
/*
* 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 ) {
8001ae8: 39 ef 9b a8 ori r15,r15,0x9ba8
_Timestamp_Subtract(
&_Thread_Time_of_last_context_switch, &uptime, &used
);
_Timestamp_Add_to( &ran, &used );
};
_Timestamp_Divide( &ran, &total, &ival, &fval );
8001aec: 37 97 00 60 addi r23,sp,96
8001af0: 37 9b 00 78 addi fp,sp,120
/*
* Print the information
*/
(*print)( context,
8001af4: 3a 52 e6 80 ori r18,r18,0xe680
* 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(
8001af8: 3a 31 97 64 ori r17,r17,0x9764
8001afc: b9 60 c8 00 mv r25,r11
8001b00: 37 96 00 58 addi r22,sp,88
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
8001b04: 29 81 00 00 lw r1,(r12+0)
if ( information ) {
8001b08: 34 15 00 04 mvi r21,4
8001b0c: 34 14 00 01 mvi r20,1
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
8001b10: 28 30 00 04 lw r16,(r1+4)
if ( information ) {
8001b14: 5e 00 00 2f bne r16,r0,8001bd0 <rtems_cpu_usage_report_with_plugin+0x190><== ALWAYS TAKEN
8001b18: e0 00 00 30 bi 8001bd8 <rtems_cpu_usage_report_with_plugin+0x198><== NOT EXECUTED
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
8001b1c: 2a 01 00 1c lw r1,(r16+28)
8001b20: b4 35 08 00 add r1,r1,r21
8001b24: 28 2b 00 00 lw r11,(r1+0)
if ( !the_thread )
8001b28: 45 60 00 28 be r11,r0,8001bc8 <rtems_cpu_usage_report_with_plugin+0x188><== NEVER TAKEN
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
8001b2c: 29 61 00 08 lw r1,(r11+8)
8001b30: 34 02 00 0d mvi r2,13
8001b34: bb 00 18 00 mv r3,r24
8001b38: f8 00 0a 02 calli 8004340 <rtems_object_get_name>
(*print)(
8001b3c: 29 63 00 08 lw r3,(r11+8)
8001b40: ba 60 10 00 mv r2,r19
8001b44: b9 c0 08 00 mv r1,r14
8001b48: bb 00 20 00 mv r4,r24
8001b4c: d9 a0 00 00 call r13
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
/*
* If this is the currently executing thread, account for time
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
8001b50: 29 61 00 84 lw r1,(r11+132)
8001b54: 5b 81 00 60 sw (sp+96),r1
8001b58: 29 61 00 88 lw r1,(r11+136)
8001b5c: 5b 81 00 64 sw (sp+100),r1
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
8001b60: 29 e1 00 0c lw r1,(r15+12)
8001b64: 28 22 00 08 lw r2,(r1+8)
8001b68: 29 61 00 08 lw r1,(r11+8)
8001b6c: 5c 41 00 08 bne r2,r1,8001b8c <rtems_cpu_usage_report_with_plugin+0x14c>
Timestamp_Control used;
_Timestamp_Subtract(
8001b70: ba 20 08 00 mv r1,r17
8001b74: bb 20 10 00 mv r2,r25
8001b78: ba c0 18 00 mv r3,r22
8001b7c: f8 00 1a 3b calli 8008468 <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch, &uptime, &used
);
_Timestamp_Add_to( &ran, &used );
8001b80: ba e0 08 00 mv r1,r23
8001b84: ba c0 10 00 mv r2,r22
8001b88: f8 00 19 c7 calli 80082a4 <_Timespec_Add_to>
};
_Timestamp_Divide( &ran, &total, &ival, &fval );
8001b8c: 37 83 00 7c addi r3,sp,124
8001b90: bb 60 20 00 mv r4,fp
8001b94: ba e0 08 00 mv r1,r23
8001b98: 37 82 00 68 addi r2,sp,104
8001b9c: f8 00 19 db calli 8008308 <_Timespec_Divide>
/*
* Print the information
*/
(*print)( context,
8001ba0: 2b 81 00 64 lw r1,(sp+100)
8001ba4: 34 02 03 e8 mvi r2,1000
8001ba8: f8 00 6c 9a calli 801ce10 <__udivsi3>
8001bac: 2b 83 00 60 lw r3,(sp+96)
8001bb0: 2b 85 00 7c lw r5,(sp+124)
8001bb4: 2b 86 00 78 lw r6,(sp+120)
8001bb8: b8 20 20 00 mv r4,r1
8001bbc: ba 40 10 00 mv r2,r18
8001bc0: b9 c0 08 00 mv r1,r14
8001bc4: d9 a0 00 00 call r13
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
if ( information ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
8001bc8: 36 94 00 01 addi r20,r20,1
8001bcc: 36 b5 00 04 addi r21,r21,4
8001bd0: 2e 01 00 10 lhu r1,(r16+16)
8001bd4: 50 34 ff d2 bgeu r1,r20,8001b1c <rtems_cpu_usage_report_with_plugin+0xdc>
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
8001bd8: 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++ ) {
8001bdc: 35 8c 00 04 addi r12,r12,4
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
8001be0: 38 21 96 44 ori r1,r1,0x9644
8001be4: 5d 81 ff c8 bne r12,r1,8001b04 <rtems_cpu_usage_report_with_plugin+0xc4>
}
}
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)(
8001be8: 2b 81 00 6c lw r1,(sp+108)
8001bec: 34 02 03 e8 mvi r2,1000
8001bf0: 78 0b 08 01 mvhi r11,0x801
8001bf4: f8 00 6c 87 calli 801ce10 <__udivsi3>
8001bf8: 2b 83 00 68 lw r3,(sp+104)
8001bfc: 39 6b e6 98 ori r11,r11,0xe698
8001c00: b8 20 20 00 mv r4,r1
8001c04: b9 60 10 00 mv r2,r11
8001c08: b9 c0 08 00 mv r1,r14
8001c0c: d9 a0 00 00 call r13
"-------------------------------------------------------------------------------\n",
_Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset,
total_units
);
#endif
}
8001c10: 2b 9d 00 04 lw ra,(sp+4)
8001c14: 2b 8b 00 44 lw r11,(sp+68)
8001c18: 2b 8c 00 40 lw r12,(sp+64)
8001c1c: 2b 8d 00 3c lw r13,(sp+60)
8001c20: 2b 8e 00 38 lw r14,(sp+56)
8001c24: 2b 8f 00 34 lw r15,(sp+52)
8001c28: 2b 90 00 30 lw r16,(sp+48)
8001c2c: 2b 91 00 2c lw r17,(sp+44)
8001c30: 2b 92 00 28 lw r18,(sp+40)
8001c34: 2b 93 00 24 lw r19,(sp+36)
8001c38: 2b 94 00 20 lw r20,(sp+32)
8001c3c: 2b 95 00 1c lw r21,(sp+28)
8001c40: 2b 96 00 18 lw r22,(sp+24)
8001c44: 2b 97 00 14 lw r23,(sp+20)
8001c48: 2b 98 00 10 lw r24,(sp+16)
8001c4c: 2b 99 00 0c lw r25,(sp+12)
8001c50: 2b 9b 00 08 lw fp,(sp+8)
8001c54: 37 9c 00 7c addi sp,sp,124
8001c58: c3 a0 00 00 ret
080112b0 <rtems_deviceio_errno>:
[RTEMS_IO_ERROR] = EIO,
[RTEMS_PROXY_BLOCKING] = EIO
};
int rtems_deviceio_errno(rtems_status_code sc)
{
80112b0: 37 9c ff f8 addi sp,sp,-8
80112b4: 5b 8b 00 08 sw (sp+8),r11
80112b8: 5b 9d 00 04 sw (sp+4),ra
if (sc == RTEMS_SUCCESSFUL) {
return 0;
80112bc: 34 02 00 00 mvi r2,0
[RTEMS_PROXY_BLOCKING] = EIO
};
int rtems_deviceio_errno(rtems_status_code sc)
{
if (sc == RTEMS_SUCCESSFUL) {
80112c0: 44 20 00 0d be r1,r0,80112f4 <rtems_deviceio_errno+0x44>
return 0;
} else {
int eno = EINVAL;
if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) {
80112c4: 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;
80112c8: 34 0b 00 16 mvi r11,22
if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) {
80112cc: 54 22 00 07 bgu r1,r2,80112e8 <rtems_deviceio_errno+0x38> <== NEVER TAKEN
eno = status_code_to_errno [sc];
80112d0: 78 0b 08 01 mvhi r11,0x801
80112d4: 34 02 00 02 mvi r2,2
80112d8: 39 6b 85 f4 ori r11,r11,0x85f4
80112dc: f8 00 16 d2 calli 8016e24 <__ashlsi3>
80112e0: b5 61 08 00 add r1,r11,r1
80112e4: 28 2b 00 00 lw r11,(r1+0)
}
errno = eno;
80112e8: f8 00 00 62 calli 8011470 <__errno>
80112ec: 58 2b 00 00 sw (r1+0),r11
return -1;
80112f0: 34 02 ff ff mvi r2,-1
}
}
80112f4: b8 40 08 00 mv r1,r2
80112f8: 2b 9d 00 04 lw ra,(sp+4)
80112fc: 2b 8b 00 08 lw r11,(sp+8)
8011300: 37 9c 00 08 addi sp,sp,8
8011304: c3 a0 00 00 ret
0800ca14 <rtems_filesystem_get_mount_handler>:
rtems_filesystem_fsmount_me_t
rtems_filesystem_get_mount_handler(
const char *type
)
{
800ca14: 37 9c ff f4 addi sp,sp,-12
800ca18: 5b 9d 00 04 sw (sp+4),ra
find_arg fa = {
800ca1c: 5b 81 00 08 sw (sp+8),r1
800ca20: 5b 80 00 0c sw (sp+12),r0
.type = type,
.mount_h = NULL
};
if ( type != NULL ) {
800ca24: 44 20 00 05 be r1,r0,800ca38 <rtems_filesystem_get_mount_handler+0x24><== NEVER TAKEN
rtems_filesystem_iterate( find_handler, &fa );
800ca28: 78 01 08 00 mvhi r1,0x800
800ca2c: 38 21 c8 b0 ori r1,r1,0xc8b0
800ca30: 37 82 00 08 addi r2,sp,8
800ca34: fb ff ff c7 calli 800c950 <rtems_filesystem_iterate>
}
return fa.mount_h;
}
800ca38: 2b 81 00 0c lw r1,(sp+12)
800ca3c: 2b 9d 00 04 lw ra,(sp+4)
800ca40: 37 9c 00 0c addi sp,sp,12
800ca44: c3 a0 00 00 ret
08002330 <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 )
{
8002330: 37 9c ff dc addi sp,sp,-36
8002334: 5b 8b 00 10 sw (sp+16),r11
8002338: 5b 8c 00 0c sw (sp+12),r12
800233c: 5b 8d 00 08 sw (sp+8),r13
8002340: 5b 9d 00 04 sw (sp+4),ra
/*
* Set the default umask to "022".
*/
rtems_filesystem_umask = 022;
8002344: 78 0b 08 01 mvhi r11,0x801
8002348: 39 6b 91 08 ori r11,r11,0x9108
800234c: 29 62 00 00 lw r2,(r11+0)
8002350: 34 01 00 12 mvi r1,18
8002354: 58 41 00 2c sw (r2+44),r1
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
8002358: 78 01 08 01 mvhi r1,0x801
800235c: 38 21 7d 40 ori r1,r1,0x7d40
8002360: 28 21 00 00 lw r1,(r1+0)
rtems_fatal_error_occurred( 0xABCD0001 );
8002364: 78 02 08 01 mvhi r2,0x801
8002368: 38 42 7e 54 ori r2,r2,0x7e54
rtems_filesystem_umask = 022;
/*
* mount the first filesystem.
*/
if ( rtems_filesystem_mount_table_size == 0 )
800236c: 44 20 00 0e be r1,r0,80023a4 <rtems_filesystem_initialize+0x74><== NEVER TAKEN
rtems_fatal_error_occurred( 0xABCD0001 );
mt = &rtems_filesystem_mount_table[0];
8002370: 78 01 08 01 mvhi r1,0x801
8002374: 38 21 90 18 ori r1,r1,0x9018
8002378: 28 24 00 00 lw r4,(r1+0)
status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL );
800237c: 34 05 00 00 mvi r5,0
8002380: 28 82 00 0c lw r2,(r4+12)
8002384: 28 81 00 08 lw r1,(r4+8)
8002388: 28 83 00 00 lw r3,(r4+0)
800238c: 28 84 00 04 lw r4,(r4+4)
8002390: f8 00 02 78 calli 8002d70 <mount>
if ( status == -1 )
8002394: 34 02 ff ff mvi r2,-1
8002398: 5c 22 00 05 bne r1,r2,80023ac <rtems_filesystem_initialize+0x7c><== ALWAYS TAKEN
rtems_fatal_error_occurred( 0xABCD0002 );
800239c: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED
80023a0: 38 42 7e 58 ori r2,r2,0x7e58 <== NOT EXECUTED
80023a4: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED
80023a8: f8 00 08 50 calli 80044e8 <rtems_fatal_error_occurred> <== NOT EXECUTED
rtems_filesystem_link_counts = 0;
80023ac: 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);
80023b0: 78 0c 08 01 mvhi r12,0x801
80023b4: 39 8c 7e 48 ori r12,r12,0x7e48
80023b8: 37 8d 00 14 addi r13,sp,20
status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL );
if ( status == -1 )
rtems_fatal_error_occurred( 0xABCD0002 );
rtems_filesystem_link_counts = 0;
80023bc: 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);
80023c0: 34 02 00 01 mvi r2,1
80023c4: 34 03 00 00 mvi r3,0
80023c8: b9 a0 20 00 mv r4,r13
80023cc: 34 05 00 00 mvi r5,0
80023d0: b9 80 08 00 mv r1,r12
80023d4: f8 00 00 6b calli 8002580 <rtems_filesystem_evaluate_path>
rtems_filesystem_root = loc;
80023d8: 29 61 00 00 lw r1,(r11+0)
80023dc: 2b 82 00 14 lw r2,(sp+20)
/* One more clone for the current node */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
80023e0: 34 03 00 00 mvi r3,0
80023e4: 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;
80023e8: 58 22 00 18 sw (r1+24),r2
80023ec: 2b 82 00 18 lw r2,(sp+24)
/* One more clone for the current node */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
80023f0: 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;
80023f4: 58 22 00 1c sw (r1+28),r2
80023f8: 2b 82 00 1c lw r2,(sp+28)
80023fc: 58 22 00 20 sw (r1+32),r2
8002400: 2b 82 00 20 lw r2,(sp+32)
8002404: 58 22 00 24 sw (r1+36),r2
8002408: 2b 82 00 24 lw r2,(sp+36)
800240c: 58 22 00 28 sw (r1+40),r2
/* One more clone for the current node */
rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0);
8002410: 34 02 00 01 mvi r2,1
8002414: b9 80 08 00 mv r1,r12
8002418: f8 00 00 5a calli 8002580 <rtems_filesystem_evaluate_path>
rtems_filesystem_current = loc;
800241c: 29 61 00 00 lw r1,(r11+0)
8002420: 2b 82 00 14 lw r2,(sp+20)
8002424: 58 22 00 04 sw (r1+4),r2
8002428: 2b 82 00 18 lw r2,(sp+24)
800242c: 58 22 00 08 sw (r1+8),r2
8002430: 2b 82 00 1c lw r2,(sp+28)
8002434: 58 22 00 0c sw (r1+12),r2
8002438: 2b 82 00 20 lw r2,(sp+32)
800243c: 58 22 00 10 sw (r1+16),r2
8002440: 2b 82 00 24 lw r2,(sp+36)
8002444: 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);
8002448: 78 01 08 01 mvhi r1,0x801
800244c: 34 02 01 ff mvi r2,511
8002450: 38 21 7e 4c ori r1,r1,0x7e4c
8002454: f8 00 01 d4 calli 8002ba4 <mkdir>
if ( status != 0 )
rtems_fatal_error_occurred( 0xABCD0003 );
8002458: 78 02 08 01 mvhi r2,0x801
800245c: 38 42 7e 5c ori r2,r2,0x7e5c
* NOTE: UNIX root is 755 and owned by root/root (0/0). It is actually
* created that way by the IMFS.
*/
status = mkdir( "/dev", 0777);
if ( status != 0 )
8002460: 5c 20 ff d1 bne r1,r0,80023a4 <rtems_filesystem_initialize+0x74><== 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.
*/
}
8002464: 2b 9d 00 04 lw ra,(sp+4)
8002468: 2b 8b 00 10 lw r11,(sp+16)
800246c: 2b 8c 00 0c lw r12,(sp+12)
8002470: 2b 8d 00 08 lw r13,(sp+8)
8002474: 37 9c 00 24 addi sp,sp,36
8002478: c3 a0 00 00 ret
0800c950 <rtems_filesystem_iterate>:
bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
800c950: 37 9c ff e8 addi sp,sp,-24
800c954: 5b 8b 00 18 sw (sp+24),r11
800c958: 5b 8c 00 14 sw (sp+20),r12
800c95c: 5b 8d 00 10 sw (sp+16),r13
800c960: 5b 8e 00 0c sw (sp+12),r14
800c964: 5b 8f 00 08 sw (sp+8),r15
800c968: 5b 9d 00 04 sw (sp+4),ra
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
800c96c: 78 0b 08 01 mvhi r11,0x801
bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
800c970: b8 20 70 00 mv r14,r1
800c974: b8 40 78 00 mv r15,r2
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
800c978: 34 03 00 00 mvi r3,0
bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
800c97c: 39 6b 7d 20 ori r11,r11,0x7d20
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
800c980: e0 00 00 06 bi 800c998 <rtems_filesystem_iterate+0x48>
stop = (*routine)( table_entry, routine_arg );
800c984: b9 60 08 00 mv r1,r11
800c988: b9 e0 10 00 mv r2,r15
800c98c: d9 c0 00 00 call r14
800c990: b8 20 18 00 mv r3,r1
++table_entry;
800c994: 35 6b 00 08 addi r11,r11,8
{
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
bool stop = false;
while ( table_entry->type && !stop ) {
800c998: 29 61 00 00 lw r1,(r11+0)
800c99c: 44 20 00 03 be r1,r0,800c9a8 <rtems_filesystem_iterate+0x58>
800c9a0: 44 60 ff f9 be r3,r0,800c984 <rtems_filesystem_iterate+0x34>
800c9a4: e0 00 00 13 bi 800c9f0 <rtems_filesystem_iterate+0xa0>
800c9a8: b8 60 58 00 mv r11,r3
stop = (*routine)( table_entry, routine_arg );
++table_entry;
}
if ( !stop ) {
800c9ac: 5c 23 00 11 bne r1,r3,800c9f0 <rtems_filesystem_iterate+0xa0>
rtems_libio_lock();
800c9b0: fb ff ff d4 calli 800c900 <rtems_libio_lock>
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
800c9b4: 78 03 08 01 mvhi r3,0x801
800c9b8: 38 63 91 48 ori r3,r3,0x9148
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
800c9bc: 78 0d 08 01 mvhi r13,0x801
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
800c9c0: 28 6c 00 00 lw r12,(r3+0)
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
800c9c4: 39 ad 91 4c ori r13,r13,0x914c
800c9c8: e0 00 00 06 bi 800c9e0 <rtems_filesystem_iterate+0x90>
!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 );
800c9cc: 35 81 00 08 addi r1,r12,8
800c9d0: b9 e0 10 00 mv r2,r15
800c9d4: d9 c0 00 00 call r14
}
}
rtems_libio_unlock();
rtems_set_errno_and_return_minus_one( ENOENT );
}
800c9d8: 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 );
800c9dc: b8 20 58 00 mv r11,r1
++table_entry;
}
if ( !stop ) {
rtems_libio_lock();
for (
800c9e0: 45 8d 00 02 be r12,r13,800c9e8 <rtems_filesystem_iterate+0x98>
node = rtems_chain_first( &filesystem_chain );
!rtems_chain_is_tail( &filesystem_chain, node ) && !stop;
800c9e4: 45 60 ff fa be r11,r0,800c9cc <rtems_filesystem_iterate+0x7c><== ALWAYS TAKEN
) {
const filesystem_node *fsn = (filesystem_node *) node;
stop = (*routine)( &fsn->entry, routine_arg );
}
rtems_libio_unlock();
800c9e8: fb ff ff d1 calli 800c92c <rtems_libio_unlock>
800c9ec: b9 60 18 00 mv r3,r11
}
return stop;
}
800c9f0: b8 60 08 00 mv r1,r3
800c9f4: 2b 9d 00 04 lw ra,(sp+4)
800c9f8: 2b 8b 00 18 lw r11,(sp+24)
800c9fc: 2b 8c 00 14 lw r12,(sp+20)
800ca00: 2b 8d 00 10 lw r13,(sp+16)
800ca04: 2b 8e 00 0c lw r14,(sp+12)
800ca08: 2b 8f 00 08 lw r15,(sp+8)
800ca0c: 37 9c 00 18 addi sp,sp,24
800ca10: c3 a0 00 00 ret
08002ce8 <rtems_filesystem_mount_iterate>:
bool rtems_filesystem_mount_iterate(
rtems_per_filesystem_mount_routine routine,
void *routine_arg
)
{
8002ce8: 37 9c ff e8 addi sp,sp,-24
8002cec: 5b 8b 00 18 sw (sp+24),r11
8002cf0: 5b 8c 00 14 sw (sp+20),r12
8002cf4: 5b 8d 00 10 sw (sp+16),r13
8002cf8: 5b 8e 00 0c sw (sp+12),r14
8002cfc: 5b 8f 00 08 sw (sp+8),r15
8002d00: 5b 9d 00 04 sw (sp+4),ra
8002d04: b8 20 78 00 mv r15,r1
8002d08: b8 40 70 00 mv r14,r2
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
8002d0c: fb ff ff e3 calli 8002c98 <rtems_libio_lock>
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
8002d10: 78 03 08 01 mvhi r3,0x801
8002d14: 38 63 90 fc ori r3,r3,0x90fc
{
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
for (
8002d18: 78 0d 08 01 mvhi r13,0x801
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
return stop;
}
8002d1c: 28 6b 00 00 lw r11,(r3+0)
rtems_per_filesystem_mount_routine routine,
void *routine_arg
)
{
rtems_chain_node *node = NULL;
bool stop = false;
8002d20: 34 0c 00 00 mvi r12,0
rtems_libio_lock();
for (
8002d24: 39 ad 91 00 ori r13,r13,0x9100
8002d28: e0 00 00 06 bi 8002d40 <rtems_filesystem_mount_iterate+0x58>
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 );
8002d2c: b9 60 08 00 mv r1,r11
8002d30: b9 c0 10 00 mv r2,r14
8002d34: d9 e0 00 00 call r15
}
rtems_libio_unlock();
return stop;
}
8002d38: 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 );
8002d3c: b8 20 60 00 mv r12,r1
{
rtems_chain_node *node = NULL;
bool stop = false;
rtems_libio_lock();
for (
8002d40: 45 6d 00 02 be r11,r13,8002d48 <rtems_filesystem_mount_iterate+0x60>
node = rtems_chain_first( &mount_chain );
!rtems_chain_is_tail( &mount_chain, node ) && !stop;
8002d44: 45 80 ff fa be r12,r0,8002d2c <rtems_filesystem_mount_iterate+0x44><== ALWAYS TAKEN
const rtems_filesystem_mount_table_entry_t *mt_entry =
(rtems_filesystem_mount_table_entry_t *) node;
stop = (*routine)( mt_entry, routine_arg );
}
rtems_libio_unlock();
8002d48: fb ff ff df calli 8002cc4 <rtems_libio_unlock>
return stop;
}
8002d4c: b9 80 08 00 mv r1,r12
8002d50: 2b 9d 00 04 lw ra,(sp+4)
8002d54: 2b 8b 00 18 lw r11,(sp+24)
8002d58: 2b 8c 00 14 lw r12,(sp+20)
8002d5c: 2b 8d 00 10 lw r13,(sp+16)
8002d60: 2b 8e 00 0c lw r14,(sp+12)
8002d64: 2b 8f 00 08 lw r15,(sp+8)
8002d68: 37 9c 00 18 addi sp,sp,24
8002d6c: c3 a0 00 00 ret
0800263c <rtems_filesystem_prefix_separators>:
int rtems_filesystem_prefix_separators(
const char *pathname,
int pathnamelen
)
{
800263c: 37 9c ff f0 addi sp,sp,-16
8002640: 5b 8b 00 10 sw (sp+16),r11
8002644: 5b 8c 00 0c sw (sp+12),r12
8002648: 5b 8d 00 08 sw (sp+8),r13
800264c: 5b 9d 00 04 sw (sp+4),ra
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
8002650: 34 0b 00 00 mvi r11,0
int rtems_filesystem_prefix_separators(
const char *pathname,
int pathnamelen
)
{
8002654: b8 20 68 00 mv r13,r1
8002658: 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 ) )
800265c: e0 00 00 02 bi 8002664 <rtems_filesystem_prefix_separators+0x28>
{
pathname++;
pathnamelen--;
stripped++;
8002660: 35 6b 00 01 addi r11,r11,1
}
return len;
}
int rtems_filesystem_prefix_separators(
8002664: b5 ab 08 00 add r1,r13,r11
{
/*
* Eat any separators at start of the path.
*/
int stripped = 0;
while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) )
8002668: 40 21 00 00 lbu r1,(r1+0)
800266c: fd 8b 18 00 cmpne r3,r12,r11
8002670: 7c 22 00 00 cmpnei r2,r1,0
8002674: a0 62 10 00 and r2,r3,r2
8002678: 44 40 00 03 be r2,r0,8002684 <rtems_filesystem_prefix_separators+0x48><== NEVER TAKEN
800267c: f8 00 04 7e calli 8003874 <rtems_filesystem_is_separator>
8002680: 5c 20 ff f8 bne r1,r0,8002660 <rtems_filesystem_prefix_separators+0x24>
pathname++;
pathnamelen--;
stripped++;
}
return stripped;
}
8002684: b9 60 08 00 mv r1,r11
8002688: 2b 9d 00 04 lw ra,(sp+4)
800268c: 2b 8b 00 10 lw r11,(sp+16)
8002690: 2b 8c 00 0c lw r12,(sp+12)
8002694: 2b 8d 00 08 lw r13,(sp+8)
8002698: 37 9c 00 10 addi sp,sp,16
800269c: c3 a0 00 00 ret
08001f10 <rtems_gxx_key_create>:
int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *))
{
8001f10: 37 9c ff f0 addi sp,sp,-16
8001f14: 5b 8b 00 10 sw (sp+16),r11
8001f18: 5b 8c 00 0c sw (sp+12),r12
8001f1c: 5b 8d 00 08 sw (sp+8),r13
8001f20: 5b 9d 00 04 sw (sp+4),ra
8001f24: b8 20 68 00 mv r13,r1
* pointer to the buffer that will hold the value of the key itself.
* We have to to this, because the others functions on this interface
* deal with the value of the key, as used with the POSIX API.
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
8001f28: 34 01 00 08 mvi r1,8
}
return 0;
}
int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *))
{
8001f2c: b8 40 60 00 mv r12,r2
* pointer to the buffer that will hold the value of the key itself.
* We have to to this, because the others functions on this interface
* deal with the value of the key, as used with the POSIX API.
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
8001f30: f8 00 01 4a calli 8002458 <malloc>
*key = new_key;
8001f34: 59 a1 00 00 sw (r13+0),r1
* pointer to the buffer that will hold the value of the key itself.
* We have to to this, because the others functions on this interface
* deal with the value of the key, as used with the POSIX API.
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
8001f38: b8 20 58 00 mv r11,r1
*key = new_key;
new_key->val = NULL;
8001f3c: 58 20 00 00 sw (r1+0),r0
new_key->dtor = dtor;
8001f40: 58 2c 00 04 sw (r1+4),r12
"gxx_wrappers: create key=%x, dtor=%x, new_key=%x\n", key, dtor, new_key
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor );
8001f44: b9 60 10 00 mv r2,r11
8001f48: 34 01 00 00 mvi r1,0
8001f4c: b9 80 18 00 mv r3,r12
8001f50: f8 00 07 59 calli 8003cb4 <rtems_task_variable_add>
if ( status == RTEMS_SUCCESSFUL )
return 0;
8001f54: 34 02 00 00 mvi r2,0
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor );
if ( status == RTEMS_SUCCESSFUL )
8001f58: 44 20 00 04 be r1,r0,8001f68 <rtems_gxx_key_create+0x58> <== ALWAYS TAKEN
return 0;
free( new_key );
8001f5c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
8001f60: fb ff ff 72 calli 8001d28 <free> <== NOT EXECUTED
return -1;
8001f64: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED
}
8001f68: b8 40 08 00 mv r1,r2
8001f6c: 2b 9d 00 04 lw ra,(sp+4)
8001f70: 2b 8b 00 10 lw r11,(sp+16)
8001f74: 2b 8c 00 0c lw r12,(sp+12)
8001f78: 2b 8d 00 08 lw r13,(sp+8)
8001f7c: 37 9c 00 10 addi sp,sp,16
8001f80: c3 a0 00 00 ret
08001f90 <rtems_gxx_key_delete>:
int rtems_gxx_key_delete (__gthread_key_t key)
{
8001f90: 37 9c ff f8 addi sp,sp,-8
8001f94: 5b 8b 00 08 sw (sp+8),r11
8001f98: 5b 9d 00 04 sw (sp+4),ra
8001f9c: b8 20 58 00 mv r11,r1
#ifdef DEBUG_GXX_WRAPPERS
printk( "gxx_wrappers: delete key=%x\n", key );
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_delete( RTEMS_SELF, (void **)key );
8001fa0: b9 60 10 00 mv r2,r11
8001fa4: 34 01 00 00 mvi r1,0
8001fa8: f8 00 07 72 calli 8003d70 <rtems_task_variable_delete>
if ( status == RTEMS_SUCCESSFUL ) {
8001fac: 5c 20 00 04 bne r1,r0,8001fbc <rtems_gxx_key_delete+0x2c> <== NEVER TAKEN
/* Hmm - hopefully all tasks using this key have gone away... */
if ( key ) free( *(void **)key );
8001fb0: 45 61 00 03 be r11,r1,8001fbc <rtems_gxx_key_delete+0x2c> <== NEVER TAKEN
8001fb4: 29 61 00 00 lw r1,(r11+0)
8001fb8: fb ff ff 5c calli 8001d28 <free>
return 0;
}
key = NULL;
return 0;
}
8001fbc: 34 01 00 00 mvi r1,0
8001fc0: 2b 9d 00 04 lw ra,(sp+4)
8001fc4: 2b 8b 00 08 lw r11,(sp+8)
8001fc8: 37 9c 00 08 addi sp,sp,8
8001fcc: c3 a0 00 00 ret
08001e90 <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))
{
8001e90: 37 9c ff e8 addi sp,sp,-24
8001e94: 5b 8b 00 14 sw (sp+20),r11
8001e98: 5b 8c 00 10 sw (sp+16),r12
8001e9c: 5b 8d 00 0c sw (sp+12),r13
8001ea0: 5b 8e 00 08 sw (sp+8),r14
8001ea4: 5b 9d 00 04 sw (sp+4),ra
#ifdef DEBUG_GXX_WRAPPERS
printk( "gxx_wrappers: once=%x, func=%x\n", *once, func );
#endif
if ( *(volatile __gthread_once_t *)once == 0 ) {
8001ea8: 28 2d 00 00 lw r13,(r1+0)
/* uncomment this if you need to debug this interface */
/*#define DEBUG_GXX_WRAPPERS 1*/
int rtems_gxx_once(__gthread_once_t *once, void (*func) (void))
{
8001eac: b8 20 58 00 mv r11,r1
8001eb0: b8 40 70 00 mv r14,r2
#ifdef DEBUG_GXX_WRAPPERS
printk( "gxx_wrappers: once=%x, func=%x\n", *once, func );
#endif
if ( *(volatile __gthread_once_t *)once == 0 ) {
8001eb4: 5d a0 00 0f bne r13,r0,8001ef0 <rtems_gxx_once+0x60>
rtems_mode saveMode;
__gthread_once_t o;
rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode);
8001eb8: 34 01 01 00 mvi r1,256
8001ebc: 34 02 01 00 mvi r2,256
8001ec0: 37 83 00 18 addi r3,sp,24
8001ec4: f8 00 06 f3 calli 8003a90 <rtems_task_mode>
if ( (o = *(volatile __gthread_once_t *)once) == 0 ) {
8001ec8: 29 6c 00 00 lw r12,(r11+0)
8001ecc: 5d 8d 00 03 bne r12,r13,8001ed8 <rtems_gxx_once+0x48> <== NEVER TAKEN
*(volatile __gthread_once_t *)once = 1;
8001ed0: 34 01 00 01 mvi r1,1
8001ed4: 59 61 00 00 sw (r11+0),r1
}
rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode);
8001ed8: 2b 81 00 18 lw r1,(sp+24)
8001edc: 34 02 01 00 mvi r2,256
8001ee0: 37 83 00 18 addi r3,sp,24
8001ee4: f8 00 06 eb calli 8003a90 <rtems_task_mode>
if ( o == 0 )
8001ee8: 5d 80 00 02 bne r12,r0,8001ef0 <rtems_gxx_once+0x60> <== NEVER TAKEN
(*func)();
8001eec: d9 c0 00 00 call r14
}
return 0;
}
8001ef0: 34 01 00 00 mvi r1,0
8001ef4: 2b 9d 00 04 lw ra,(sp+4)
8001ef8: 2b 8b 00 14 lw r11,(sp+20)
8001efc: 2b 8c 00 10 lw r12,(sp+16)
8001f00: 2b 8d 00 0c lw r13,(sp+12)
8001f04: 2b 8e 00 08 lw r14,(sp+8)
8001f08: 37 9c 00 18 addi sp,sp,24
8001f0c: c3 a0 00 00 ret
08002040 <rtems_gxx_setspecific>:
int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr)
{
8002040: 37 9c ff f4 addi sp,sp,-12
8002044: 5b 8b 00 0c sw (sp+12),r11
8002048: 5b 8c 00 08 sw (sp+8),r12
800204c: 5b 9d 00 04 sw (sp+4),ra
8002050: b8 20 58 00 mv r11,r1
rtems_task_self()
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor );
8002054: 29 63 00 04 lw r3,(r11+4)
#endif
return p;
}
int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr)
{
8002058: b8 40 60 00 mv r12,r2
rtems_task_self()
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor );
800205c: 34 01 00 00 mvi r1,0
8002060: b9 60 10 00 mv r2,r11
8002064: f8 00 07 14 calli 8003cb4 <rtems_task_variable_add>
if ( status == RTEMS_SUCCESSFUL ) {
/* now let's set the proper value */
key->val = (void *)ptr;
return 0;
}
return -1;
8002068: 34 03 ff ff mvi r3,-1
);
#endif
/* register with RTEMS the buffer that will hold the key values */
status = rtems_task_variable_add( RTEMS_SELF, (void **)key, key->dtor );
if ( status == RTEMS_SUCCESSFUL ) {
800206c: 5c 20 00 03 bne r1,r0,8002078 <rtems_gxx_setspecific+0x38> <== NEVER TAKEN
/* now let's set the proper value */
key->val = (void *)ptr;
8002070: 59 6c 00 00 sw (r11+0),r12
return 0;
8002074: 34 03 00 00 mvi r3,0
}
return -1;
}
8002078: b8 60 08 00 mv r1,r3
800207c: 2b 9d 00 04 lw ra,(sp+4)
8002080: 2b 8b 00 0c lw r11,(sp+12)
8002084: 2b 8c 00 08 lw r12,(sp+8)
8002088: 37 9c 00 0c addi sp,sp,12
800208c: c3 a0 00 00 ret
08006cac <rtems_heap_allocate_aligned_with_boundary>:
void *rtems_heap_allocate_aligned_with_boundary(
size_t size,
uintptr_t alignment,
uintptr_t boundary
)
{
8006cac: 37 9c ff f0 addi sp,sp,-16
8006cb0: 5b 8b 00 10 sw (sp+16),r11
8006cb4: 5b 8c 00 0c sw (sp+12),r12
8006cb8: 5b 8d 00 08 sw (sp+8),r13
8006cbc: 5b 9d 00 04 sw (sp+4),ra
if (
8006cc0: 78 05 08 02 mvhi r5,0x802
8006cc4: 38 a5 63 30 ori r5,r5,0x6330
void *rtems_heap_allocate_aligned_with_boundary(
size_t size,
uintptr_t alignment,
uintptr_t boundary
)
{
8006cc8: b8 40 60 00 mv r12,r2
if (
8006ccc: 28 a2 00 00 lw r2,(r5+0)
void *rtems_heap_allocate_aligned_with_boundary(
size_t size,
uintptr_t alignment,
uintptr_t boundary
)
{
8006cd0: b8 20 68 00 mv r13,r1
if (
8006cd4: 34 01 00 03 mvi r1,3
void *rtems_heap_allocate_aligned_with_boundary(
size_t size,
uintptr_t alignment,
uintptr_t boundary
)
{
8006cd8: b8 60 58 00 mv r11,r3
if (
8006cdc: 5c 41 00 04 bne r2,r1,8006cec <rtems_heap_allocate_aligned_with_boundary+0x40><== NEVER TAKEN
_System_state_Is_up( _System_state_Get() )
&& !malloc_is_system_state_OK()
8006ce0: fb ff fb 11 calli 8005924 <malloc_is_system_state_OK>
) {
return NULL;
8006ce4: 34 05 00 00 mvi r5,0
uintptr_t boundary
)
{
if (
_System_state_Is_up( _System_state_Get() )
&& !malloc_is_system_state_OK()
8006ce8: 44 20 00 0a be r1,r0,8006d10 <rtems_heap_allocate_aligned_with_boundary+0x64>
) {
return NULL;
}
malloc_deferred_frees_process();
8006cec: fb ff fb 20 calli 800596c <malloc_deferred_frees_process>
/* FIXME: Statistics, boundary checks */
return _Protected_heap_Allocate_aligned_with_boundary(
8006cf0: 78 05 08 02 mvhi r5,0x802
8006cf4: 38 a5 50 1c ori r5,r5,0x501c
8006cf8: 28 a1 00 00 lw r1,(r5+0)
8006cfc: b9 a0 10 00 mv r2,r13
8006d00: b9 80 18 00 mv r3,r12
8006d04: b9 60 20 00 mv r4,r11
8006d08: f8 00 0e 0e calli 800a540 <_Protected_heap_Allocate_aligned_with_boundary>
8006d0c: b8 20 28 00 mv r5,r1
RTEMS_Malloc_Heap,
size,
alignment,
boundary
);
}
8006d10: b8 a0 08 00 mv r1,r5
8006d14: 2b 9d 00 04 lw ra,(sp+4)
8006d18: 2b 8b 00 10 lw r11,(sp+16)
8006d1c: 2b 8c 00 0c lw r12,(sp+12)
8006d20: 2b 8d 00 08 lw r13,(sp+8)
8006d24: 37 9c 00 10 addi sp,sp,16
8006d28: c3 a0 00 00 ret
08006024 <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)
{
8006024: 37 9c ff e4 addi sp,sp,-28
8006028: 5b 8b 00 1c sw (sp+28),r11
800602c: 5b 8c 00 18 sw (sp+24),r12
8006030: 5b 8d 00 14 sw (sp+20),r13
8006034: 5b 8e 00 10 sw (sp+16),r14
8006038: 5b 8f 00 0c sw (sp+12),r15
800603c: 5b 90 00 08 sw (sp+8),r16
8006040: 5b 9d 00 04 sw (sp+4),ra
8006044: b8 20 78 00 mv r15,r1
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
8006048: 44 20 00 17 be r1,r0,80060a4 <rtems_iterate_over_all_threads+0x80><== NEVER TAKEN
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
800604c: 78 02 08 02 mvhi r2,0x802
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
8006050: 78 0b 08 02 mvhi r11,0x802
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
8006054: 38 42 96 34 ori r2,r2,0x9634
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
8006058: 39 6b 96 38 ori r11,r11,0x9638
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
800605c: 34 50 00 10 addi r16,r2,16
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
8006060: 29 61 00 00 lw r1,(r11+0)
if ( !information )
8006064: 34 0e 00 04 mvi r14,4
8006068: 34 0d 00 01 mvi r13,1
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
800606c: 28 2c 00 04 lw r12,(r1+4)
if ( !information )
8006070: 5d 80 00 09 bne r12,r0,8006094 <rtems_iterate_over_all_threads+0x70>
8006074: e0 00 00 0a bi 800609c <rtems_iterate_over_all_threads+0x78>
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
8006078: 29 81 00 1c lw r1,(r12+28)
800607c: b4 2e 08 00 add r1,r1,r14
8006080: 28 21 00 00 lw r1,(r1+0)
if ( !the_thread )
8006084: 44 20 00 02 be r1,r0,800608c <rtems_iterate_over_all_threads+0x68>
continue;
(*routine)(the_thread);
8006088: d9 e0 00 00 call r15
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
800608c: 35 ad 00 01 addi r13,r13,1
8006090: 35 ce 00 04 addi r14,r14,4
8006094: 2d 81 00 10 lhu r1,(r12+16)
8006098: 50 2d ff f8 bgeu r1,r13,8006078 <rtems_iterate_over_all_threads+0x54>
800609c: 35 6b 00 04 addi r11,r11,4
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
80060a0: 5d 70 ff f0 bne r11,r16,8006060 <rtems_iterate_over_all_threads+0x3c>
(*routine)(the_thread);
}
}
}
80060a4: 2b 9d 00 04 lw ra,(sp+4)
80060a8: 2b 8b 00 1c lw r11,(sp+28)
80060ac: 2b 8c 00 18 lw r12,(sp+24)
80060b0: 2b 8d 00 14 lw r13,(sp+20)
80060b4: 2b 8e 00 10 lw r14,(sp+16)
80060b8: 2b 8f 00 0c lw r15,(sp+12)
80060bc: 2b 90 00 08 lw r16,(sp+8)
80060c0: 37 9c 00 1c addi sp,sp,28
80060c4: c3 a0 00 00 ret
0800c768 <rtems_libio_free>:
*/
void rtems_libio_free(
rtems_libio_t *iop
)
{
800c768: 37 9c ff f8 addi sp,sp,-8
800c76c: 5b 8b 00 08 sw (sp+8),r11
800c770: 5b 9d 00 04 sw (sp+4),ra
800c774: b8 20 58 00 mv r11,r1
rtems_libio_lock();
800c778: fb ff ff 90 calli 800c5b8 <rtems_libio_lock>
if (iop->sem)
800c77c: 29 61 00 30 lw r1,(r11+48)
800c780: 44 20 00 02 be r1,r0,800c788 <rtems_libio_free+0x20> <== NEVER TAKEN
rtems_semaphore_delete(iop->sem);
800c784: fb ff dd fb calli 8003f70 <rtems_semaphore_delete>
iop->flags &= ~LIBIO_FLAGS_OPEN;
800c788: 29 62 00 18 lw r2,(r11+24)
800c78c: 34 01 fe ff mvi r1,-257
800c790: a0 41 08 00 and r1,r2,r1
800c794: 59 61 00 18 sw (r11+24),r1
iop->data1 = rtems_libio_iop_freelist;
800c798: 78 01 08 01 mvhi r1,0x801
800c79c: 38 21 97 ec ori r1,r1,0x97ec
800c7a0: 28 22 00 00 lw r2,(r1+0)
rtems_libio_iop_freelist = iop;
800c7a4: 58 2b 00 00 sw (r1+0),r11
if (iop->sem)
rtems_semaphore_delete(iop->sem);
iop->flags &= ~LIBIO_FLAGS_OPEN;
iop->data1 = rtems_libio_iop_freelist;
800c7a8: 59 62 00 38 sw (r11+56),r2
rtems_libio_iop_freelist = iop;
rtems_libio_unlock();
800c7ac: fb ff ff 8e calli 800c5e4 <rtems_libio_unlock>
}
800c7b0: 2b 9d 00 04 lw ra,(sp+4)
800c7b4: 2b 8b 00 08 lw r11,(sp+8)
800c7b8: 37 9c 00 08 addi sp,sp,8
800c7bc: c3 a0 00 00 ret
08002828 <rtems_libio_init>:
*
* Called by BSP startup code to initialize the libio subsystem.
*/
void rtems_libio_init( void )
{
8002828: 37 9c ff f4 addi sp,sp,-12
800282c: 5b 8b 00 0c sw (sp+12),r11
8002830: 5b 8c 00 08 sw (sp+8),r12
8002834: 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)
8002838: 78 01 08 01 mvhi r1,0x801
800283c: 38 21 90 10 ori r1,r1,0x9010
8002840: 28 2c 00 00 lw r12,(r1+0)
8002844: 45 80 00 19 be r12,r0,80028a8 <rtems_libio_init+0x80> <== NEVER TAKEN
{
rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
8002848: b9 80 08 00 mv r1,r12
800284c: 34 02 00 40 mvi r2,64
8002850: fb ff ff 0b calli 800247c <calloc>
8002854: b8 20 58 00 mv r11,r1
8002858: 78 01 08 01 mvhi r1,0x801
800285c: 38 21 97 e8 ori r1,r1,0x97e8
8002860: 58 2b 00 00 sw (r1+0),r11
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
8002864: 34 01 00 1a mvi r1,26
if (rtems_libio_number_iops > 0)
{
rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
8002868: 45 60 00 1b be r11,r0,80028d4 <rtems_libio_init+0xac>
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
800286c: 78 01 08 01 mvhi r1,0x801
8002870: 38 21 97 ec ori r1,r1,0x97ec
8002874: 58 2b 00 00 sw (r1+0),r11
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
8002878: 34 02 00 00 mvi r2,0
rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
800287c: b9 60 08 00 mv r1,r11
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
8002880: e0 00 00 02 bi 8002888 <rtems_libio_init+0x60>
iop->data1 = iop + 1;
8002884: 58 21 ff f8 sw (r1+-8),r1
sizeof(rtems_libio_t));
if (rtems_libio_iops == NULL)
rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
iop = rtems_libio_iop_freelist = rtems_libio_iops;
for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++)
8002888: 34 42 00 01 addi r2,r2,1
800288c: 34 21 00 40 addi r1,r1,64
8002890: 55 82 ff fd bgu r12,r2,8002884 <rtems_libio_init+0x5c>
iop->data1 = iop + 1;
iop->data1 = NULL;
8002894: b9 80 08 00 mv r1,r12
8002898: 34 02 00 06 mvi r2,6
800289c: f8 00 51 62 calli 8016e24 <__ashlsi3>
80028a0: b5 61 08 00 add r1,r11,r1
80028a4: 58 20 ff f8 sw (r1+-8),r0
/*
* Create the binary semaphore used to provide mutual exclusion
* on the IOP Table.
*/
rc = rtems_semaphore_create(
80028a8: 78 02 08 01 mvhi r2,0x801
80028ac: 38 42 7e 98 ori r2,r2,0x7e98
80028b0: 28 41 00 00 lw r1,(r2+0)
80028b4: 78 05 08 01 mvhi r5,0x801
80028b8: 34 03 00 54 mvi r3,84
80028bc: 34 02 00 01 mvi r2,1
80028c0: 34 04 00 00 mvi r4,0
80028c4: 38 a5 97 f0 ori r5,r5,0x97f0
80028c8: f8 00 05 2d calli 8003d7c <rtems_semaphore_create>
80028cc: 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 )
80028d0: 44 20 00 02 be r1,r0,80028d8 <rtems_libio_init+0xb0> <== ALWAYS TAKEN
rtems_fatal_error_occurred( rc );
80028d4: f8 00 07 05 calli 80044e8 <rtems_fatal_error_occurred>
/*
* Initialize the base file system infrastructure.
*/
if (rtems_fs_init_helper)
80028d8: 78 02 08 01 mvhi r2,0x801
80028dc: 38 42 90 0c ori r2,r2,0x900c
80028e0: 28 41 00 00 lw r1,(r2+0)
80028e4: 44 23 00 02 be r1,r3,80028ec <rtems_libio_init+0xc4> <== NEVER TAKEN
(* rtems_fs_init_helper)();
80028e8: d8 20 00 00 call r1
}
80028ec: 2b 9d 00 04 lw ra,(sp+4)
80028f0: 2b 8b 00 0c lw r11,(sp+12)
80028f4: 2b 8c 00 08 lw r12,(sp+8)
80028f8: 37 9c 00 0c addi sp,sp,12
80028fc: c3 a0 00 00 ret
08002a94 <rtems_libio_set_private_env>:
rtems_status_code rtems_libio_set_private_env(void)
{
8002a94: 37 9c ff c8 addi sp,sp,-56
8002a98: 5b 8b 00 10 sw (sp+16),r11
8002a9c: 5b 8c 00 0c sw (sp+12),r12
8002aa0: 5b 8d 00 08 sw (sp+8),r13
8002aa4: 5b 9d 00 04 sw (sp+4),ra
rtems_filesystem_location_info_t root_loc;
rtems_filesystem_location_info_t current_loc;
rtems_user_env_t *new_env = NULL;
int rv = 0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
8002aa8: 78 0b 08 01 mvhi r11,0x801
}
rtems_status_code rtems_libio_set_private_env(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_id task_id = rtems_task_self();
8002aac: f8 00 03 1a calli 8003714 <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);
8002ab0: 39 6b 31 5c ori r11,r11,0x315c
8002ab4: 34 02 00 01 mvi r2,1
}
rtems_status_code rtems_libio_set_private_env(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_id task_id = rtems_task_self();
8002ab8: b8 20 68 00 mv r13,r1
rtems_filesystem_location_info_t root_loc;
rtems_filesystem_location_info_t current_loc;
rtems_user_env_t *new_env = NULL;
int rv = 0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
8002abc: 34 03 00 00 mvi r3,0
8002ac0: b9 60 08 00 mv r1,r11
8002ac4: 37 84 00 28 addi r4,sp,40
8002ac8: 34 05 00 00 mvi r5,0
8002acc: fb ff fa d6 calli 8001624 <rtems_filesystem_evaluate_path>
8002ad0: b8 20 60 00 mv r12,r1
error_1:
rtems_filesystem_freenode(&root_loc);
error_0:
return RTEMS_NO_MEMORY;
8002ad4: 34 02 00 1a mvi r2,26
rtems_filesystem_location_info_t current_loc;
rtems_user_env_t *new_env = NULL;
int rv = 0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0);
if (rv != 0)
8002ad8: 5c 20 00 43 bne r1,r0,8002be4 <rtems_libio_set_private_env+0x150><== NEVER TAKEN
goto error_0;
rv = rtems_filesystem_evaluate_path("/", 1, 0, ¤t_loc, 0);
8002adc: b9 60 08 00 mv r1,r11
8002ae0: 34 02 00 01 mvi r2,1
8002ae4: 34 03 00 00 mvi r3,0
8002ae8: 37 84 00 14 addi r4,sp,20
8002aec: 34 05 00 00 mvi r5,0
8002af0: fb ff fa cd calli 8001624 <rtems_filesystem_evaluate_path>
if (rv != 0)
8002af4: 5c 2c 00 39 bne r1,r12,8002bd8 <rtems_libio_set_private_env+0x144><== NEVER TAKEN
* Bharath: I'm not sure if the check can be reduced to
* if( rtems_current_user_env->task_id != task_id ) {
*/
if (
rtems_current_user_env == &rtems_global_user_env
8002af8: 78 02 08 01 mvhi r2,0x801
8002afc: 38 42 41 08 ori r2,r2,0x4108
8002b00: 28 41 00 00 lw r1,(r2+0)
/*
* Bharath: I'm not sure if the check can be reduced to
* if( rtems_current_user_env->task_id != task_id ) {
*/
if (
8002b04: 78 02 08 01 mvhi r2,0x801
8002b08: 38 42 47 50 ori r2,r2,0x4750
8002b0c: 44 22 00 03 be r1,r2,8002b18 <rtems_libio_set_private_env+0x84>
rtems_current_user_env == &rtems_global_user_env
|| rtems_current_user_env->task_id != task_id
8002b10: 28 21 00 00 lw r1,(r1+0)
8002b14: 44 2d 00 0e be r1,r13,8002b4c <rtems_libio_set_private_env+0xb8>
) {
new_env = malloc(sizeof(rtems_user_env_t));
8002b18: 34 01 00 48 mvi r1,72
8002b1c: fb ff fc d5 calli 8001e70 <malloc>
8002b20: b8 20 60 00 mv r12,r1
if (new_env == NULL)
8002b24: 44 20 00 2b be r1,r0,8002bd0 <rtems_libio_set_private_env+0x13c>
#ifdef HAVE_USERENV_REFCNT
new_env->refcnt = 1;
#endif
sc = rtems_task_variable_add(
8002b28: 78 0b 08 01 mvhi r11,0x801
8002b2c: 39 6b 41 08 ori r11,r11,0x4108
8002b30: 78 03 08 00 mvhi r3,0x800
8002b34: 34 01 00 00 mvi r1,0
8002b38: b9 60 10 00 mv r2,r11
8002b3c: 38 63 2a 50 ori r3,r3,0x2a50
8002b40: f8 00 03 1a calli 80037a8 <rtems_task_variable_add>
RTEMS_SELF,
(void*)&rtems_current_user_env,
(void(*)(void *))free_user_env
);
if (sc != RTEMS_SUCCESSFUL)
8002b44: 5c 20 00 21 bne r1,r0,8002bc8 <rtems_libio_set_private_env+0x134>
goto error_3;
rtems_current_user_env = new_env;
8002b48: 59 6c 00 00 sw (r11+0),r12
}
/* Inherit the global values */
*rtems_current_user_env = rtems_global_user_env;
8002b4c: 78 02 08 01 mvhi r2,0x801
8002b50: 38 42 41 08 ori r2,r2,0x4108
8002b54: 28 4b 00 00 lw r11,(r2+0)
8002b58: 78 02 08 01 mvhi r2,0x801
8002b5c: 38 42 47 50 ori r2,r2,0x4750
8002b60: b9 60 08 00 mv r1,r11
8002b64: 34 03 00 48 mvi r3,72
8002b68: f8 00 2a a6 calli 800d600 <memcpy>
* Clone the pathlocs. In contrast to most other code we must _not_ free the
* original locs because what we are trying to do here is forking off clones.
* The reason is a pathloc can be allocated by the file system and needs to
* be freed when deleting the environment.
*/
rtems_filesystem_root = root_loc;
8002b6c: 2b 81 00 28 lw r1,(sp+40)
}
/* Inherit the global values */
*rtems_current_user_env = rtems_global_user_env;
rtems_current_user_env->task_id = task_id;
8002b70: 59 6d 00 00 sw (r11+0),r13
* be freed when deleting the environment.
*/
rtems_filesystem_root = root_loc;
rtems_filesystem_current = current_loc;
return RTEMS_SUCCESSFUL;
8002b74: 34 02 00 00 mvi r2,0
* Clone the pathlocs. In contrast to most other code we must _not_ free the
* original locs because what we are trying to do here is forking off clones.
* The reason is a pathloc can be allocated by the file system and needs to
* be freed when deleting the environment.
*/
rtems_filesystem_root = root_loc;
8002b78: 59 61 00 18 sw (r11+24),r1
8002b7c: 2b 81 00 2c lw r1,(sp+44)
8002b80: 59 61 00 1c sw (r11+28),r1
8002b84: 2b 81 00 30 lw r1,(sp+48)
8002b88: 59 61 00 20 sw (r11+32),r1
8002b8c: 2b 81 00 34 lw r1,(sp+52)
8002b90: 59 61 00 24 sw (r11+36),r1
8002b94: 2b 81 00 38 lw r1,(sp+56)
8002b98: 59 61 00 28 sw (r11+40),r1
rtems_filesystem_current = current_loc;
8002b9c: 2b 81 00 14 lw r1,(sp+20)
8002ba0: 59 61 00 04 sw (r11+4),r1
8002ba4: 2b 81 00 18 lw r1,(sp+24)
8002ba8: 59 61 00 08 sw (r11+8),r1
8002bac: 2b 81 00 1c lw r1,(sp+28)
8002bb0: 59 61 00 0c sw (r11+12),r1
8002bb4: 2b 81 00 20 lw r1,(sp+32)
8002bb8: 59 61 00 10 sw (r11+16),r1
8002bbc: 2b 81 00 24 lw r1,(sp+36)
8002bc0: 59 61 00 14 sw (r11+20),r1
return RTEMS_SUCCESSFUL;
8002bc4: e0 00 00 08 bi 8002be4 <rtems_libio_set_private_env+0x150>
error_3:
free(new_env);
8002bc8: b9 80 08 00 mv r1,r12
8002bcc: fb ff fa e6 calli 8001764 <free>
error_2:
rtems_filesystem_freenode(¤t_loc);
8002bd0: 37 81 00 14 addi r1,sp,20
8002bd4: fb ff fa dc calli 8001744 <rtems_filesystem_freenode>
error_1:
rtems_filesystem_freenode(&root_loc);
8002bd8: 37 81 00 28 addi r1,sp,40
8002bdc: fb ff fa da calli 8001744 <rtems_filesystem_freenode>
error_0:
return RTEMS_NO_MEMORY;
8002be0: 34 02 00 1a mvi r2,26
}
8002be4: b8 40 08 00 mv r1,r2
8002be8: 2b 9d 00 04 lw ra,(sp+4)
8002bec: 2b 8b 00 10 lw r11,(sp+16)
8002bf0: 2b 8c 00 0c lw r12,(sp+12)
8002bf4: 2b 8d 00 08 lw r13,(sp+8)
8002bf8: 37 9c 00 38 addi sp,sp,56
8002bfc: c3 a0 00 00 ret
08002c00 <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)
{
8002c00: 37 9c ff e8 addi sp,sp,-24
8002c04: 5b 8b 00 14 sw (sp+20),r11
8002c08: 5b 8c 00 10 sw (sp+16),r12
8002c0c: 5b 8d 00 0c sw (sp+12),r13
8002c10: 5b 8e 00 08 sw (sp+8),r14
8002c14: 5b 9d 00 04 sw (sp+4),ra
8002c18: b8 20 70 00 mv r14,r1
rtems_id current_task_id;
/*
* get current task id
*/
current_task_id = rtems_task_self();
8002c1c: f8 00 02 be calli 8003714 <rtems_task_self>
8002c20: b8 20 68 00 mv r13,r1
* If this was an attempt to share the task with self,
* if somebody wanted to do it... Lets tell them, its shared
*/
if( task_id == current_task_id )
return RTEMS_SUCCESSFUL;
8002c24: 34 0c 00 00 mvi r12,0
/*
* If this was an attempt to share the task with self,
* if somebody wanted to do it... Lets tell them, its shared
*/
if( task_id == current_task_id )
8002c28: 45 c1 00 11 be r14,r1,8002c6c <rtems_libio_share_private_env+0x6c><== NEVER TAKEN
return RTEMS_SUCCESSFUL;
/*
* Try to get the requested user environment
*/
sc = rtems_task_variable_get(
8002c2c: 78 0b 08 01 mvhi r11,0x801
8002c30: 39 6b 41 08 ori r11,r11,0x4108
8002c34: b9 c0 08 00 mv r1,r14
8002c38: b9 60 10 00 mv r2,r11
8002c3c: 37 83 00 18 addi r3,sp,24
8002c40: f8 00 03 09 calli 8003864 <rtems_task_variable_get>
8002c44: b8 20 60 00 mv r12,r1
(void*)&shared_user_env );
/*
* If it was not successful, return the error code
*/
if (sc != RTEMS_SUCCESSFUL)
8002c48: 5c 20 00 09 bne r1,r0,8002c6c <rtems_libio_share_private_env+0x6c>
* If we have a current environment in place, we need to
* free it, since we will be sharing the variable with the
* shared_user_env
*/
if (rtems_current_user_env->task_id==current_task_id) {
8002c4c: 29 61 00 00 lw r1,(r11+0)
8002c50: 28 22 00 00 lw r2,(r1+0)
8002c54: 5c 4d 00 02 bne r2,r13,8002c5c <rtems_libio_share_private_env+0x5c>
rtems_user_env_t *tmp = rtems_current_user_env;
free_user_env( tmp );
8002c58: fb ff ff 7e calli 8002a50 <free_user_env>
}
/* the current_user_env is the same pointer that remote env */
rtems_current_user_env = shared_user_env;
8002c5c: 2b 82 00 18 lw r2,(sp+24)
8002c60: 78 01 08 01 mvhi r1,0x801
8002c64: 38 21 41 08 ori r1,r1,0x4108
8002c68: 58 22 00 00 sw (r1+0),r2
#ifdef HAVE_USERENV_REFCNT
rtems_current_user_env->refcnt++;
#endif
return RTEMS_SUCCESSFUL;
}
8002c6c: b9 80 08 00 mv r1,r12
8002c70: 2b 9d 00 04 lw ra,(sp+4)
8002c74: 2b 8b 00 14 lw r11,(sp+20)
8002c78: 2b 8c 00 10 lw r12,(sp+16)
8002c7c: 2b 8d 00 0c lw r13,(sp+12)
8002c80: 2b 8e 00 08 lw r14,(sp+8)
8002c84: 37 9c 00 18 addi sp,sp,24
8002c88: c3 a0 00 00 ret
0800c660 <rtems_libio_to_fcntl_flags>:
uint32_t flags
)
{
uint32_t fcntl_flags = 0;
if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) {
800c660: 20 24 00 06 andi r4,r1,0x6
800c664: 34 03 00 06 mvi r3,6
fcntl_flags |= O_RDWR;
800c668: 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 ) {
800c66c: 44 83 00 06 be r4,r3,800c684 <rtems_libio_to_fcntl_flags+0x24>
fcntl_flags |= O_RDWR;
} else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) {
800c670: 20 23 00 02 andi r3,r1,0x2
fcntl_flags |= O_RDONLY;
800c674: 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) {
800c678: 5c 60 00 03 bne r3,r0,800c684 <rtems_libio_to_fcntl_flags+0x24><== ALWAYS TAKEN
fcntl_flags |= O_RDONLY;
} else if ( (flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) {
800c67c: 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;
800c680: 7c 42 00 00 cmpnei r2,r2,0 <== NOT EXECUTED
fcntl_flags |= O_RDONLY;
} else if ( (flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) {
fcntl_flags |= O_WRONLY;
}
if ( (flags & LIBIO_FLAGS_NO_DELAY) == LIBIO_FLAGS_NO_DELAY ) {
800c684: 20 23 00 01 andi r3,r1,0x1
800c688: 44 60 00 02 be r3,r0,800c690 <rtems_libio_to_fcntl_flags+0x30>
fcntl_flags |= O_NONBLOCK;
800c68c: 38 42 40 00 ori r2,r2,0x4000
}
if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) {
800c690: 20 23 02 00 andi r3,r1,0x200
800c694: 44 60 00 02 be r3,r0,800c69c <rtems_libio_to_fcntl_flags+0x3c>
fcntl_flags |= O_APPEND;
800c698: 38 42 00 08 ori r2,r2,0x8
}
if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) {
800c69c: 20 21 04 00 andi r1,r1,0x400
800c6a0: 44 20 00 02 be r1,r0,800c6a8 <rtems_libio_to_fcntl_flags+0x48>
fcntl_flags |= O_CREAT;
800c6a4: 38 42 02 00 ori r2,r2,0x200
}
return fcntl_flags;
}
800c6a8: b8 40 08 00 mv r1,r2
800c6ac: c3 a0 00 00 ret
08005e08 <rtems_malloc_statistics_at_free>:
* size and thus we skip updating the statistics.
*/
static void rtems_malloc_statistics_at_free(
void *pointer
)
{
8005e08: 37 9c ff f8 addi sp,sp,-8
8005e0c: 5b 9d 00 04 sw (sp+4),ra
uintptr_t size;
if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) {
8005e10: 78 03 08 02 mvhi r3,0x802
8005e14: 38 63 50 1c ori r3,r3,0x501c
* size and thus we skip updating the statistics.
*/
static void rtems_malloc_statistics_at_free(
void *pointer
)
{
8005e18: b8 20 10 00 mv r2,r1
uintptr_t size;
if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) {
8005e1c: 28 61 00 00 lw r1,(r3+0)
8005e20: 37 83 00 08 addi r3,sp,8
8005e24: f8 00 12 10 calli 800a664 <_Protected_heap_Get_block_size>
8005e28: 44 20 00 0b be r1,r0,8005e54 <rtems_malloc_statistics_at_free+0x4c><== NEVER TAKEN
MSBUMP(lifetime_freed, size);
8005e2c: 78 01 08 02 mvhi r1,0x802
8005e30: 38 21 60 58 ori r1,r1,0x6058
8005e34: 2b 83 00 08 lw r3,(sp+8)
8005e38: 28 22 00 2c lw r2,(r1+44)
8005e3c: 28 24 00 28 lw r4,(r1+40)
8005e40: b4 62 10 00 add r2,r3,r2
8005e44: f4 62 18 00 cmpgu r3,r3,r2
8005e48: 58 22 00 2c sw (r1+44),r2
8005e4c: b4 64 18 00 add r3,r3,r4
8005e50: 58 23 00 28 sw (r1+40),r3
}
}
8005e54: 2b 9d 00 04 lw ra,(sp+4)
8005e58: 37 9c 00 08 addi sp,sp,8
8005e5c: c3 a0 00 00 ret
08005e60 <rtems_malloc_statistics_at_malloc>:
}
static void rtems_malloc_statistics_at_malloc(
void *pointer
)
{
8005e60: 37 9c ff f8 addi sp,sp,-8
8005e64: 5b 9d 00 04 sw (sp+4),ra
uintptr_t actual_size = 0;
8005e68: 5b 80 00 08 sw (sp+8),r0
}
static void rtems_malloc_statistics_at_malloc(
void *pointer
)
{
8005e6c: b8 20 10 00 mv r2,r1
uintptr_t actual_size = 0;
uint32_t current_depth;
rtems_malloc_statistics_t *s = &rtems_malloc_statistics;
if ( !pointer )
8005e70: 44 20 00 15 be r1,r0,8005ec4 <rtems_malloc_statistics_at_malloc+0x64><== NEVER TAKEN
return;
_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size);
8005e74: 78 03 08 02 mvhi r3,0x802
8005e78: 38 63 50 1c ori r3,r3,0x501c
8005e7c: 28 61 00 00 lw r1,(r3+0)
8005e80: 37 83 00 08 addi r3,sp,8
8005e84: f8 00 11 f8 calli 800a664 <_Protected_heap_Get_block_size>
MSBUMP(lifetime_allocated, actual_size);
8005e88: 78 01 08 02 mvhi r1,0x802
8005e8c: 38 21 60 58 ori r1,r1,0x6058
8005e90: 2b 83 00 08 lw r3,(sp+8)
8005e94: 28 22 00 24 lw r2,(r1+36)
8005e98: 28 24 00 20 lw r4,(r1+32)
8005e9c: b4 62 10 00 add r2,r3,r2
8005ea0: f4 62 18 00 cmpgu r3,r3,r2
8005ea4: 58 22 00 24 sw (r1+36),r2
8005ea8: b4 64 18 00 add r3,r3,r4
8005eac: 58 23 00 20 sw (r1+32),r3
current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed);
8005eb0: 28 23 00 2c lw r3,(r1+44)
8005eb4: c8 43 10 00 sub r2,r2,r3
if (current_depth > s->max_depth)
8005eb8: 28 23 00 18 lw r3,(r1+24)
8005ebc: 50 62 00 02 bgeu r3,r2,8005ec4 <rtems_malloc_statistics_at_malloc+0x64>
s->max_depth = current_depth;
8005ec0: 58 22 00 18 sw (r1+24),r2
}
8005ec4: 2b 9d 00 04 lw ra,(sp+4)
8005ec8: 37 9c 00 08 addi sp,sp,8
8005ecc: c3 a0 00 00 ret
0800cbb8 <rtems_memalign>:
int rtems_memalign(
void **pointer,
size_t alignment,
size_t size
)
{
800cbb8: 37 9c ff ec addi sp,sp,-20
800cbbc: 5b 8b 00 14 sw (sp+20),r11
800cbc0: 5b 8c 00 10 sw (sp+16),r12
800cbc4: 5b 8d 00 0c sw (sp+12),r13
800cbc8: 5b 8e 00 08 sw (sp+8),r14
800cbcc: 5b 9d 00 04 sw (sp+4),ra
/*
* Parameter error checks
*/
if ( !pointer )
return EINVAL;
800cbd0: 34 0c 00 16 mvi r12,22
int rtems_memalign(
void **pointer,
size_t alignment,
size_t size
)
{
800cbd4: b8 20 58 00 mv r11,r1
800cbd8: b8 40 68 00 mv r13,r2
800cbdc: b8 60 70 00 mv r14,r3
void *return_this;
/*
* Parameter error checks
*/
if ( !pointer )
800cbe0: 44 20 00 1d be r1,r0,800cc54 <rtems_memalign+0x9c>
return EINVAL;
*pointer = NULL;
800cbe4: 58 20 00 00 sw (r1+0),r0
/*
* Do not attempt to allocate memory if not in correct system state.
*/
if ( _System_state_Is_up(_System_state_Get()) &&
800cbe8: 78 01 08 01 mvhi r1,0x801
800cbec: 38 21 9a 98 ori r1,r1,0x9a98
800cbf0: 28 22 00 00 lw r2,(r1+0)
800cbf4: 34 01 00 03 mvi r1,3
800cbf8: 5c 41 00 03 bne r2,r1,800cc04 <rtems_memalign+0x4c> <== NEVER TAKEN
!malloc_is_system_state_OK() )
800cbfc: fb ff d7 41 calli 8002900 <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()) &&
800cc00: 44 20 00 15 be r1,r0,800cc54 <rtems_memalign+0x9c> <== NEVER TAKEN
return EINVAL;
/*
* If some free's have been deferred, then do them now.
*/
malloc_deferred_frees_process();
800cc04: fb ff d7 51 calli 8002948 <malloc_deferred_frees_process>
Heap_Control *heap,
uintptr_t size,
uintptr_t alignment
)
{
return
800cc08: 78 01 08 01 mvhi r1,0x801
800cc0c: 38 21 90 1c ori r1,r1,0x901c
800cc10: 28 21 00 00 lw r1,(r1+0)
800cc14: b9 a0 18 00 mv r3,r13
800cc18: b9 c0 10 00 mv r2,r14
800cc1c: 34 04 00 00 mvi r4,0
800cc20: fb ff e4 be calli 8005f18 <_Protected_heap_Allocate_aligned_with_boundary>
800cc24: b8 20 68 00 mv r13,r1
RTEMS_Malloc_Heap,
size,
alignment
);
if ( !return_this )
return ENOMEM;
800cc28: 34 0c 00 0c mvi r12,12
return_this = _Protected_heap_Allocate_aligned(
RTEMS_Malloc_Heap,
size,
alignment
);
if ( !return_this )
800cc2c: 44 20 00 0a be r1,r0,800cc54 <rtems_memalign+0x9c>
return ENOMEM;
/*
* If configured, update the more involved statistics
*/
if ( rtems_malloc_statistics_helpers )
800cc30: 78 02 08 01 mvhi r2,0x801
800cc34: 38 42 96 80 ori r2,r2,0x9680
800cc38: 28 41 00 00 lw r1,(r2+0)
800cc3c: 44 20 00 04 be r1,r0,800cc4c <rtems_memalign+0x94>
(*rtems_malloc_statistics_helpers->at_malloc)(pointer);
800cc40: 28 22 00 04 lw r2,(r1+4)
800cc44: b9 60 08 00 mv r1,r11
800cc48: d8 40 00 00 call r2
*pointer = return_this;
800cc4c: 59 6d 00 00 sw (r11+0),r13
return 0;
800cc50: 34 0c 00 00 mvi r12,0
}
800cc54: b9 80 08 00 mv r1,r12
800cc58: 2b 9d 00 04 lw ra,(sp+4)
800cc5c: 2b 8b 00 14 lw r11,(sp+20)
800cc60: 2b 8c 00 10 lw r12,(sp+16)
800cc64: 2b 8d 00 0c lw r13,(sp+12)
800cc68: 2b 8e 00 08 lw r14,(sp+8)
800cc6c: 37 9c 00 14 addi sp,sp,20
800cc70: c3 a0 00 00 ret
0800ab54 <rtems_mkdir>:
return (retval);
}
int
rtems_mkdir(const char *path, mode_t mode)
{
800ab54: 37 9c ff 84 addi sp,sp,-124
800ab58: 5b 8b 00 34 sw (sp+52),r11
800ab5c: 5b 8c 00 30 sw (sp+48),r12
800ab60: 5b 8d 00 2c sw (sp+44),r13
800ab64: 5b 8e 00 28 sw (sp+40),r14
800ab68: 5b 8f 00 24 sw (sp+36),r15
800ab6c: 5b 90 00 20 sw (sp+32),r16
800ab70: 5b 91 00 1c sw (sp+28),r17
800ab74: 5b 92 00 18 sw (sp+24),r18
800ab78: 5b 93 00 14 sw (sp+20),r19
800ab7c: 5b 94 00 10 sw (sp+16),r20
800ab80: 5b 95 00 0c sw (sp+12),r21
800ab84: 5b 96 00 08 sw (sp+8),r22
800ab88: 5b 9d 00 04 sw (sp+4),ra
800ab8c: b8 40 b0 00 mv r22,r2
int success = 0;
char *dup_path = strdup(path);
800ab90: f8 00 12 b8 calli 800f670 <strdup>
800ab94: b8 20 60 00 mv r12,r1
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
}
return success != 0 ? 0 : -1;
800ab98: 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) {
800ab9c: 45 80 00 4d be r12,r0,800acd0 <rtems_mkdir+0x17c> <== NEVER TAKEN
char *p;
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
800aba0: 41 8b 00 00 lbu r11,(r12+0)
800aba4: 34 0e 00 00 mvi r14,0
800aba8: 34 01 00 01 mvi r1,1
++p;
800abac: 65 6b 00 2f cmpei r11,r11,47
retval = 0;
break;
}
}
if (!last)
*p = '/';
800abb0: 34 15 00 2f mvi r21,47
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
800abb4: b5 8b 58 00 add r11,r12,r11
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
if (errno == EEXIST || errno == EISDIR) {
800abb8: 34 14 00 11 mvi r20,17
if (stat(path, &sb) < 0) {
800abbc: 37 93 00 38 addi r19,sp,56
retval = 0;
break;
} else if (!S_ISDIR(sb.st_mode)) {
800abc0: 34 12 40 00 mvi r18,16384
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
if (errno == EEXIST || errno == EISDIR) {
800abc4: 34 11 00 15 mvi r17,21
*
* We change the user's umask and then restore it,
* instead of doing chmod's.
*/
oumask = umask(0);
numask = oumask & ~(S_IWUSR | S_IXUSR);
800abc8: 34 10 ff 3f mvi r16,-193
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
last = 1;
else if (p[0] != '/')
800abcc: 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')
800abd0: 41 64 00 00 lbu r4,(r11+0)
last = 1;
800abd4: 34 03 00 01 mvi r3,1
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
if (p[0] == '\0')
800abd8: 44 80 00 03 be r4,r0,800abe4 <rtems_mkdir+0x90>
last = 1;
else if (p[0] != '/')
800abdc: 5c 8f 00 33 bne r4,r15,800aca8 <rtems_mkdir+0x154>
800abe0: 34 03 00 00 mvi r3,0
continue;
*p = '\0';
800abe4: 31 60 00 00 sb (r11+0),r0
if (!last && p[1] == '\0')
800abe8: 34 0d 00 01 mvi r13,1
800abec: 5c 60 00 03 bne r3,r0,800abf8 <rtems_mkdir+0xa4>
800abf0: 41 6d 00 01 lbu r13,(r11+1)
800abf4: 65 ad 00 00 cmpei r13,r13,0
last = 1;
if (first) {
800abf8: 44 20 00 06 be r1,r0,800ac10 <rtems_mkdir+0xbc>
* mkdir [-m mode] dir
*
* We change the user's umask and then restore it,
* instead of doing chmod's.
*/
oumask = umask(0);
800abfc: 34 01 00 00 mvi r1,0
800ac00: f8 00 00 79 calli 800ade4 <umask>
800ac04: b8 20 70 00 mv r14,r1
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
800ac08: a0 30 08 00 and r1,r1,r16
800ac0c: f8 00 00 76 calli 800ade4 <umask>
first = 0;
}
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
800ac10: 34 03 01 ff mvi r3,511
oumask = umask(0);
numask = oumask & ~(S_IWUSR | S_IXUSR);
(void)umask(numask);
first = 0;
}
if (last)
800ac14: 45 a0 00 04 be r13,r0,800ac24 <rtems_mkdir+0xd0>
(void)umask(oumask);
800ac18: b9 c0 08 00 mv r1,r14
800ac1c: f8 00 00 72 calli 800ade4 <umask>
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
800ac20: ba c0 18 00 mv r3,r22
800ac24: b9 80 08 00 mv r1,r12
800ac28: b8 60 10 00 mv r2,r3
800ac2c: fb ff e1 18 calli 800308c <mkdir>
800ac30: 4c 20 00 1b bge r1,r0,800ac9c <rtems_mkdir+0x148>
if (errno == EEXIST || errno == EISDIR) {
800ac34: f8 00 0e 11 calli 800e478 <__errno>
800ac38: 28 21 00 00 lw r1,(r1+0)
800ac3c: 44 34 00 04 be r1,r20,800ac4c <rtems_mkdir+0xf8>
800ac40: f8 00 0e 0e calli 800e478 <__errno>
800ac44: 28 21 00 00 lw r1,(r1+0)
800ac48: 5c 31 00 1a bne r1,r17,800acb0 <rtems_mkdir+0x15c> <== ALWAYS TAKEN
if (stat(path, &sb) < 0) {
800ac4c: b9 80 08 00 mv r1,r12
800ac50: ba 60 10 00 mv r2,r19
800ac54: f8 00 00 32 calli 800ad1c <stat>
800ac58: 48 01 00 16 bg r0,r1,800acb0 <rtems_mkdir+0x15c> <== NEVER TAKEN
retval = 0;
break;
} else if (!S_ISDIR(sb.st_mode)) {
800ac5c: 2b 81 00 44 lw r1,(sp+68)
800ac60: 20 21 f0 00 andi r1,r1,0xf000
800ac64: 44 32 00 0c be r1,r18,800ac94 <rtems_mkdir+0x140>
if (last)
800ac68: 45 a0 00 06 be r13,r0,800ac80 <rtems_mkdir+0x12c>
errno = EEXIST;
800ac6c: f8 00 0e 03 calli 800e478 <__errno>
800ac70: 34 02 00 11 mvi r2,17
800ac74: 58 22 00 00 sw (r1+0),r2
else
errno = ENOTDIR;
retval = 0;
800ac78: 34 0b 00 00 mvi r11,0
800ac7c: e0 00 00 11 bi 800acc0 <rtems_mkdir+0x16c>
break;
} else if (!S_ISDIR(sb.st_mode)) {
if (last)
errno = EEXIST;
else
errno = ENOTDIR;
800ac80: f8 00 0d fe calli 800e478 <__errno>
800ac84: 34 02 00 14 mvi r2,20
800ac88: 58 22 00 00 sw (r1+0),r2
retval = 0;
800ac8c: 34 0b 00 00 mvi r11,0
800ac90: e0 00 00 0a bi 800acb8 <rtems_mkdir+0x164>
break;
}
if (last)
800ac94: 5d a0 00 1e bne r13,r0,800ad0c <rtems_mkdir+0x1b8>
800ac98: e0 00 00 02 bi 800aca0 <rtems_mkdir+0x14c>
} else {
retval = 0;
break;
}
}
if (!last)
800ac9c: 5d a0 00 1e bne r13,r0,800ad14 <rtems_mkdir+0x1c0>
*p = '/';
800aca0: 31 75 00 00 sb (r11+0),r21
800aca4: 34 01 00 00 mvi r1,0
p = path;
oumask = 0;
retval = 1;
if (p[0] == '/') /* Skip leading '/'. */
++p;
for (first = 1, last = 0; !last ; ++p) {
800aca8: 35 6b 00 01 addi r11,r11,1
800acac: e3 ff ff c9 bi 800abd0 <rtems_mkdir+0x7c>
if (last)
(void)umask(oumask);
if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) {
if (errno == EEXIST || errno == EISDIR) {
if (stat(path, &sb) < 0) {
retval = 0;
800acb0: 34 0b 00 00 mvi r11,0
}
}
if (!last)
*p = '/';
}
if (!first && !last)
800acb4: 5d a0 00 03 bne r13,r0,800acc0 <rtems_mkdir+0x16c> <== ALWAYS TAKEN
(void)umask(oumask);
800acb8: b9 c0 08 00 mv r1,r14
800acbc: f8 00 00 4a calli 800ade4 <umask>
int success = 0;
char *dup_path = strdup(path);
if (dup_path != NULL) {
success = build(dup_path, mode);
free(dup_path);
800acc0: b9 80 08 00 mv r1,r12
800acc4: fb ff de e6 calli 800285c <free>
}
return success != 0 ? 0 : -1;
800acc8: 7d 61 00 00 cmpnei r1,r11,0
800accc: 34 21 ff ff addi r1,r1,-1
}
800acd0: 2b 9d 00 04 lw ra,(sp+4)
800acd4: 2b 8b 00 34 lw r11,(sp+52)
800acd8: 2b 8c 00 30 lw r12,(sp+48)
800acdc: 2b 8d 00 2c lw r13,(sp+44)
800ace0: 2b 8e 00 28 lw r14,(sp+40)
800ace4: 2b 8f 00 24 lw r15,(sp+36)
800ace8: 2b 90 00 20 lw r16,(sp+32)
800acec: 2b 91 00 1c lw r17,(sp+28)
800acf0: 2b 92 00 18 lw r18,(sp+24)
800acf4: 2b 93 00 14 lw r19,(sp+20)
800acf8: 2b 94 00 10 lw r20,(sp+16)
800acfc: 2b 95 00 0c lw r21,(sp+12)
800ad00: 2b 96 00 08 lw r22,(sp+8)
800ad04: 37 9c 00 7c addi sp,sp,124
800ad08: c3 a0 00 00 ret
errno = ENOTDIR;
retval = 0;
break;
}
if (last)
retval = 2;
800ad0c: 34 0b 00 02 mvi r11,2
800ad10: e3 ff ff ec bi 800acc0 <rtems_mkdir+0x16c>
} else {
retval = 0;
break;
}
}
if (!last)
800ad14: 34 0b 00 01 mvi r11,1
800ad18: e3 ff ff ea bi 800acc0 <rtems_mkdir+0x16c>
0801191c <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
801191c: 37 9c ff d8 addi sp,sp,-40
8011920: 5b 8b 00 28 sw (sp+40),r11
8011924: 5b 8c 00 24 sw (sp+36),r12
8011928: 5b 8d 00 20 sw (sp+32),r13
801192c: 5b 8e 00 1c sw (sp+28),r14
8011930: 5b 8f 00 18 sw (sp+24),r15
8011934: 5b 90 00 14 sw (sp+20),r16
8011938: 5b 91 00 10 sw (sp+16),r17
801193c: 5b 92 00 0c sw (sp+12),r18
8011940: 5b 93 00 08 sw (sp+8),r19
8011944: 5b 9d 00 04 sw (sp+4),ra
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
8011948: 34 07 00 03 mvi r7,3
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
801194c: b8 20 88 00 mv r17,r1
8011950: b8 40 70 00 mv r14,r2
8011954: b8 60 78 00 mv r15,r3
8011958: b8 80 60 00 mv r12,r4
801195c: b8 a0 98 00 mv r19,r5
8011960: b8 c0 80 00 mv r16,r6
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
8011964: 44 20 00 36 be r1,r0,8011a3c <rtems_partition_create+0x120>
return RTEMS_INVALID_NAME;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
8011968: 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 )
801196c: 44 40 00 34 be r2,r0,8011a3c <rtems_partition_create+0x120>
return RTEMS_INVALID_ADDRESS;
if ( !id )
8011970: 44 c0 00 33 be r6,r0,8011a3c <rtems_partition_create+0x120><== NEVER TAKEN
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
8011974: 64 82 00 00 cmpei r2,r4,0
8011978: 64 61 00 00 cmpei r1,r3,0
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
801197c: 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 ||
8011980: b8 41 08 00 or r1,r2,r1
8011984: 5c 20 00 2e bne r1,r0,8011a3c <rtems_partition_create+0x120>
8011988: 54 83 00 2d bgu r4,r3,8011a3c <rtems_partition_create+0x120>
*/
RTEMS_INLINE_ROUTINE bool _Partition_Is_buffer_size_aligned (
uint32_t buffer_size
)
{
return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0);
801198c: 20 81 00 07 andi r1,r4,0x7
8011990: 5c 20 00 2b bne r1,r0,8011a3c <rtems_partition_create+0x120>
)
{
#if (CPU_ALIGNMENT == 0)
return true;
#else
return (((uintptr_t)address % CPU_ALIGNMENT) == 0);
8011994: 21 d2 00 07 andi r18,r14,0x7
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
8011998: 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 ) )
801199c: 5e 41 00 28 bne r18,r1,8011a3c <rtems_partition_create+0x120>
80119a0: 78 02 08 03 mvhi r2,0x803
80119a4: 38 42 fc b0 ori r2,r2,0xfcb0
80119a8: 28 41 00 00 lw r1,(r2+0)
80119ac: 34 21 00 01 addi r1,r1,1
80119b0: 58 41 00 00 sw (r2+0),r1
* This function allocates a partition control block from
* the inactive chain of free partition control blocks.
*/
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
{
return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
80119b4: 78 0d 08 03 mvhi r13,0x803
80119b8: 39 ad fb 08 ori r13,r13,0xfb08
80119bc: b9 a0 08 00 mv r1,r13
80119c0: f8 00 16 1b calli 801722c <_Objects_Allocate>
80119c4: b8 20 58 00 mv r11,r1
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
80119c8: 5c 32 00 04 bne r1,r18,80119d8 <rtems_partition_create+0xbc>
_Thread_Enable_dispatch();
80119cc: f8 00 1b 8b calli 80187f8 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
80119d0: 34 07 00 05 mvi r7,5
80119d4: e0 00 00 1a bi 8011a3c <rtems_partition_create+0x120>
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
80119d8: 58 2c 00 18 sw (r1+24),r12
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
length / buffer_size, buffer_size );
80119dc: b9 80 10 00 mv r2,r12
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
80119e0: 58 2e 00 10 sw (r1+16),r14
the_partition->length = length;
80119e4: 58 2f 00 14 sw (r1+20),r15
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
80119e8: 58 33 00 1c sw (r1+28),r19
the_partition->number_of_used_blocks = 0;
80119ec: 58 20 00 20 sw (r1+32),r0
_Chain_Initialize( &the_partition->Memory, starting_address,
80119f0: 34 32 00 24 addi r18,r1,36
length / buffer_size, buffer_size );
80119f4: b9 e0 08 00 mv r1,r15
80119f8: f8 00 7d 29 calli 8030e9c <__udivsi3>
80119fc: 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,
8011a00: b9 80 20 00 mv r4,r12
8011a04: ba 40 08 00 mv r1,r18
8011a08: b9 c0 10 00 mv r2,r14
8011a0c: f8 00 0f 00 calli 801560c <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8011a10: 29 6c 00 08 lw r12,(r11+8)
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8011a14: 29 ad 00 1c lw r13,(r13+28)
8011a18: 34 02 00 02 mvi r2,2
8011a1c: 21 81 ff ff andi r1,r12,0xffff
8011a20: fb ff f1 0d calli 800de54 <__ashlsi3>
8011a24: b5 a1 08 00 add r1,r13,r1
8011a28: 58 2b 00 00 sw (r1+0),r11
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
8011a2c: 59 71 00 0c sw (r11+12),r17
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
8011a30: 5a 0c 00 00 sw (r16+0),r12
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
8011a34: f8 00 1b 71 calli 80187f8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8011a38: 34 07 00 00 mvi r7,0
}
8011a3c: b8 e0 08 00 mv r1,r7
8011a40: 2b 9d 00 04 lw ra,(sp+4)
8011a44: 2b 8b 00 28 lw r11,(sp+40)
8011a48: 2b 8c 00 24 lw r12,(sp+36)
8011a4c: 2b 8d 00 20 lw r13,(sp+32)
8011a50: 2b 8e 00 1c lw r14,(sp+28)
8011a54: 2b 8f 00 18 lw r15,(sp+24)
8011a58: 2b 90 00 14 lw r16,(sp+20)
8011a5c: 2b 91 00 10 lw r17,(sp+16)
8011a60: 2b 92 00 0c lw r18,(sp+12)
8011a64: 2b 93 00 08 lw r19,(sp+8)
8011a68: 37 9c 00 28 addi sp,sp,40
8011a6c: c3 a0 00 00 ret
0800b808 <rtems_rate_monotonic_get_status>:
rtems_status_code rtems_rate_monotonic_get_status(
rtems_id id,
rtems_rate_monotonic_period_status *status
)
{
800b808: 37 9c ff e4 addi sp,sp,-28
800b80c: 5b 8b 00 08 sw (sp+8),r11
800b810: 5b 9d 00 04 sw (sp+4),ra
800b814: b8 20 18 00 mv r3,r1
800b818: b8 40 58 00 mv r11,r2
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
return RTEMS_INVALID_ADDRESS;
800b81c: 34 01 00 09 mvi r1,9
Objects_Locations location;
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
800b820: 44 40 00 26 be r2,r0,800b8b8 <rtems_rate_monotonic_get_status+0xb0><== NEVER TAKEN
800b824: 78 01 08 02 mvhi r1,0x802
800b828: b8 60 10 00 mv r2,r3
800b82c: 38 21 08 90 ori r1,r1,0x890
800b830: 37 83 00 1c addi r3,sp,28
800b834: fb ff ec 62 calli 80069bc <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
800b838: 2b 83 00 1c lw r3,(sp+28)
800b83c: 5c 60 00 1e bne r3,r0,800b8b4 <rtems_rate_monotonic_get_status+0xac>
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
800b840: 28 24 00 40 lw r4,(r1+64)
status->state = the_period->state;
800b844: 28 22 00 38 lw r2,(r1+56)
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
800b848: 28 84 00 08 lw r4,(r4+8)
status->state = the_period->state;
800b84c: 59 62 00 04 sw (r11+4),r2
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
800b850: 59 64 00 00 sw (r11+0),r4
status->state = the_period->state;
/*
* If the period is inactive, there is no information.
*/
if ( status->state == RATE_MONOTONIC_INACTIVE ) {
800b854: 5c 43 00 06 bne r2,r3,800b86c <rtems_rate_monotonic_get_status+0x64>
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timespec_Set_to_zero( &status->since_last_period );
800b858: 59 60 00 08 sw (r11+8),r0
800b85c: 59 60 00 0c sw (r11+12),r0
_Timespec_Set_to_zero( &status->executed_since_last_period );
800b860: 59 60 00 10 sw (r11+16),r0
800b864: 59 60 00 14 sw (r11+20),r0
800b868: e0 00 00 10 bi 800b8a8 <rtems_rate_monotonic_get_status+0xa0>
} else {
/*
* Grab the current status.
*/
valid_status =
800b86c: 37 82 00 0c addi r2,sp,12
800b870: 37 83 00 14 addi r3,sp,20
800b874: fb ff e1 76 calli 8003e4c <_Rate_monotonic_Get_status>
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
800b878: 5c 20 00 04 bne r1,r0,800b888 <rtems_rate_monotonic_get_status+0x80>
_Thread_Enable_dispatch();
800b87c: fb ff ef ac calli 800772c <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
800b880: 34 01 00 0b mvi r1,11
800b884: e0 00 00 0d bi 800b8b8 <rtems_rate_monotonic_get_status+0xb0>
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec(
800b888: 2b 81 00 0c lw r1,(sp+12)
800b88c: 59 61 00 08 sw (r11+8),r1
800b890: 2b 81 00 10 lw r1,(sp+16)
800b894: 59 61 00 0c sw (r11+12),r1
&since_last_period, &status->since_last_period
);
_Timestamp_To_timespec(
800b898: 2b 81 00 14 lw r1,(sp+20)
800b89c: 59 61 00 10 sw (r11+16),r1
800b8a0: 2b 81 00 18 lw r1,(sp+24)
800b8a4: 59 61 00 14 sw (r11+20),r1
status->since_last_period = since_last_period;
status->executed_since_last_period = executed;
#endif
}
_Thread_Enable_dispatch();
800b8a8: fb ff ef a1 calli 800772c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
800b8ac: 34 01 00 00 mvi r1,0
800b8b0: e0 00 00 02 bi 800b8b8 <rtems_rate_monotonic_get_status+0xb0>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
800b8b4: 34 01 00 04 mvi r1,4
}
800b8b8: 2b 9d 00 04 lw ra,(sp+4)
800b8bc: 2b 8b 00 08 lw r11,(sp+8)
800b8c0: 37 9c 00 1c addi sp,sp,28
800b8c4: c3 a0 00 00 ret
080040c4 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
80040c4: 37 9c ff e8 addi sp,sp,-24
80040c8: 5b 8b 00 14 sw (sp+20),r11
80040cc: 5b 8c 00 10 sw (sp+16),r12
80040d0: 5b 8d 00 0c sw (sp+12),r13
80040d4: 5b 8e 00 08 sw (sp+8),r14
80040d8: 5b 9d 00 04 sw (sp+4),ra
80040dc: b8 20 60 00 mv r12,r1
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
80040e0: 78 01 08 02 mvhi r1,0x802
80040e4: b8 40 68 00 mv r13,r2
80040e8: 38 21 08 90 ori r1,r1,0x890
80040ec: b9 80 10 00 mv r2,r12
80040f0: 37 83 00 18 addi r3,sp,24
80040f4: f8 00 0a 32 calli 80069bc <_Objects_Get>
80040f8: 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 ) {
80040fc: 2b 81 00 18 lw r1,(sp+24)
8004100: 5c 20 00 5f bne r1,r0,800427c <rtems_rate_monotonic_period+0x1b8>
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
8004104: 78 03 08 02 mvhi r3,0x802
8004108: 38 63 0e 88 ori r3,r3,0xe88
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
800410c: 29 62 00 40 lw r2,(r11+64)
8004110: 28 61 00 0c lw r1,(r3+12)
8004114: 44 41 00 04 be r2,r1,8004124 <rtems_rate_monotonic_period+0x60>
_Thread_Enable_dispatch();
8004118: f8 00 0d 85 calli 800772c <_Thread_Enable_dispatch>
return RTEMS_NOT_OWNER_OF_RESOURCE;
800411c: 34 0c 00 17 mvi r12,23
8004120: e0 00 00 58 bi 8004280 <rtems_rate_monotonic_period+0x1bc>
}
if ( length == RTEMS_PERIOD_STATUS ) {
8004124: 5d a0 00 0d bne r13,r0,8004158 <rtems_rate_monotonic_period+0x94>
switch ( the_period->state ) {
8004128: 29 61 00 38 lw r1,(r11+56)
800412c: 34 02 00 04 mvi r2,4
8004130: 34 0c 00 00 mvi r12,0
8004134: 54 22 00 07 bgu r1,r2,8004150 <rtems_rate_monotonic_period+0x8c><== NEVER TAKEN
8004138: 78 0b 08 01 mvhi r11,0x801
800413c: 34 02 00 02 mvi r2,2
8004140: fb ff f4 53 calli 800128c <__ashlsi3>
8004144: 39 6b e5 80 ori r11,r11,0xe580
8004148: b5 61 08 00 add r1,r11,r1
800414c: 28 2c 00 00 lw r12,(r1+0)
case RATE_MONOTONIC_ACTIVE:
default: /* unreached -- only to remove warnings */
return_value = RTEMS_SUCCESSFUL;
break;
}
_Thread_Enable_dispatch();
8004150: f8 00 0d 77 calli 800772c <_Thread_Enable_dispatch>
return( return_value );
8004154: e0 00 00 4b bi 8004280 <rtems_rate_monotonic_period+0x1bc>
}
_ISR_Disable( level );
8004158: 90 00 70 00 rcsr r14,IE
800415c: 34 01 ff fe mvi r1,-2
8004160: a1 c1 08 00 and r1,r14,r1
8004164: d0 01 00 00 wcsr IE,r1
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
8004168: 29 63 00 38 lw r3,(r11+56)
800416c: 5c 60 00 13 bne r3,r0,80041b8 <rtems_rate_monotonic_period+0xf4>
_ISR_Enable( level );
8004170: d0 0e 00 00 wcsr IE,r14
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
8004174: b9 60 08 00 mv r1,r11
8004178: fb ff ff 6e calli 8003f30 <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
800417c: 34 01 00 02 mvi r1,2
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
8004180: 78 03 08 00 mvhi r3,0x800
8004184: 59 61 00 38 sw (r11+56),r1
8004188: 38 63 46 04 ori r3,r3,0x4604
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800418c: 78 01 08 02 mvhi r1,0x802
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8004190: 59 60 00 18 sw (r11+24),r0
the_watchdog->routine = routine;
8004194: 59 63 00 2c sw (r11+44),r3
the_watchdog->id = id;
8004198: 59 6c 00 30 sw (r11+48),r12
the_watchdog->user_data = user_data;
800419c: 59 60 00 34 sw (r11+52),r0
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
80041a0: 59 6d 00 3c sw (r11+60),r13
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
80041a4: 59 6d 00 1c sw (r11+28),r13
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
80041a8: 38 21 0a 98 ori r1,r1,0xa98
80041ac: 35 62 00 10 addi r2,r11,16
80041b0: f8 00 12 3a calli 8008a98 <_Watchdog_Insert>
80041b4: e0 00 00 1f bi 8004230 <rtems_rate_monotonic_period+0x16c>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
80041b8: 34 01 00 02 mvi r1,2
80041bc: 5c 61 00 20 bne r3,r1,800423c <rtems_rate_monotonic_period+0x178>
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
80041c0: b9 60 08 00 mv r1,r11
80041c4: fb ff ff 80 calli 8003fc4 <_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;
80041c8: 34 01 00 01 mvi r1,1
80041cc: 59 61 00 38 sw (r11+56),r1
the_period->next_length = length;
80041d0: 59 6d 00 3c sw (r11+60),r13
_ISR_Enable( level );
80041d4: d0 0e 00 00 wcsr IE,r14
_Thread_Executing->Wait.id = the_period->Object.id;
80041d8: 78 01 08 02 mvhi r1,0x802
80041dc: 38 21 0e 88 ori r1,r1,0xe88
80041e0: 29 62 00 08 lw r2,(r11+8)
80041e4: 28 21 00 0c lw r1,(r1+12)
80041e8: 58 22 00 20 sw (r1+32),r2
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
80041ec: 34 02 40 00 mvi r2,16384
80041f0: f8 00 0f f1 calli 80081b4 <_Thread_Set_state>
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
80041f4: 90 00 08 00 rcsr r1,IE
80041f8: 34 02 ff fe mvi r2,-2
80041fc: a0 22 10 00 and r2,r1,r2
8004200: d0 02 00 00 wcsr IE,r2
local_state = the_period->state;
the_period->state = RATE_MONOTONIC_ACTIVE;
8004204: 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;
8004208: 29 62 00 38 lw r2,(r11+56)
the_period->state = RATE_MONOTONIC_ACTIVE;
800420c: 59 63 00 38 sw (r11+56),r3
_ISR_Enable( level );
8004210: 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 )
8004214: 34 01 00 03 mvi r1,3
8004218: 5c 41 00 06 bne r2,r1,8004230 <rtems_rate_monotonic_period+0x16c>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
800421c: 78 01 08 02 mvhi r1,0x802
8004220: 38 21 0e 88 ori r1,r1,0xe88
8004224: 28 21 00 0c lw r1,(r1+12)
8004228: 34 02 40 00 mvi r2,16384
800422c: f8 00 0c 7b calli 8007418 <_Thread_Clear_state>
_Thread_Enable_dispatch();
8004230: f8 00 0d 3f calli 800772c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8004234: 34 0c 00 00 mvi r12,0
8004238: e0 00 00 12 bi 8004280 <rtems_rate_monotonic_period+0x1bc>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
800423c: 34 0c 00 04 mvi r12,4
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
8004240: 5c 6c 00 10 bne r3,r12,8004280 <rtems_rate_monotonic_period+0x1bc><== NEVER TAKEN
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
8004244: b9 60 08 00 mv r1,r11
8004248: fb ff ff 5f calli 8003fc4 <_Rate_monotonic_Update_statistics>
_ISR_Enable( level );
800424c: d0 0e 00 00 wcsr IE,r14
the_period->state = RATE_MONOTONIC_ACTIVE;
8004250: 34 01 00 02 mvi r1,2
8004254: 59 61 00 38 sw (r11+56),r1
8004258: 78 01 08 02 mvhi r1,0x802
800425c: 38 21 0a 98 ori r1,r1,0xa98
8004260: 35 62 00 10 addi r2,r11,16
the_period->next_length = length;
8004264: 59 6d 00 3c sw (r11+60),r13
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8004268: 59 6d 00 1c sw (r11+28),r13
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
800426c: f8 00 12 0b calli 8008a98 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
8004270: 34 0c 00 06 mvi r12,6
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
8004274: f8 00 0d 2e calli 800772c <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
8004278: e0 00 00 02 bi 8004280 <rtems_rate_monotonic_period+0x1bc>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
800427c: 34 0c 00 04 mvi r12,4
}
8004280: b9 80 08 00 mv r1,r12
8004284: 2b 9d 00 04 lw ra,(sp+4)
8004288: 2b 8b 00 14 lw r11,(sp+20)
800428c: 2b 8c 00 10 lw r12,(sp+16)
8004290: 2b 8d 00 0c lw r13,(sp+12)
8004294: 2b 8e 00 08 lw r14,(sp+8)
8004298: 37 9c 00 18 addi sp,sp,24
800429c: c3 a0 00 00 ret
080042a0 <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
80042a0: 37 9c ff 5c addi sp,sp,-164
80042a4: 5b 8b 00 44 sw (sp+68),r11
80042a8: 5b 8c 00 40 sw (sp+64),r12
80042ac: 5b 8d 00 3c sw (sp+60),r13
80042b0: 5b 8e 00 38 sw (sp+56),r14
80042b4: 5b 8f 00 34 sw (sp+52),r15
80042b8: 5b 90 00 30 sw (sp+48),r16
80042bc: 5b 91 00 2c sw (sp+44),r17
80042c0: 5b 92 00 28 sw (sp+40),r18
80042c4: 5b 93 00 24 sw (sp+36),r19
80042c8: 5b 94 00 20 sw (sp+32),r20
80042cc: 5b 95 00 1c sw (sp+28),r21
80042d0: 5b 96 00 18 sw (sp+24),r22
80042d4: 5b 97 00 14 sw (sp+20),r23
80042d8: 5b 98 00 10 sw (sp+16),r24
80042dc: 5b 99 00 0c sw (sp+12),r25
80042e0: 5b 9b 00 08 sw (sp+8),fp
80042e4: 5b 9d 00 04 sw (sp+4),ra
80042e8: b8 20 60 00 mv r12,r1
80042ec: b8 40 58 00 mv r11,r2
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
80042f0: 44 40 00 72 be r2,r0,80044b8 <rtems_rate_monotonic_report_statistics_with_plugin+0x218><== NEVER TAKEN
return;
(*print)( context, "Period information by period\n" );
80042f4: 78 02 08 01 mvhi r2,0x801
80042f8: 38 42 e5 94 ori r2,r2,0xe594
80042fc: d9 60 00 00 call r11
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
8004300: 78 02 08 01 mvhi r2,0x801
8004304: 38 42 e5 b4 ori r2,r2,0xe5b4
8004308: b9 80 08 00 mv r1,r12
800430c: d9 60 00 00 call r11
(*print)( context, "--- Wall times are in seconds ---\n" );
8004310: 78 02 08 01 mvhi r2,0x801
8004314: 38 42 e5 d8 ori r2,r2,0xe5d8
8004318: b9 80 08 00 mv r1,r12
800431c: d9 60 00 00 call r11
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
8004320: 78 02 08 01 mvhi r2,0x801
8004324: 38 42 e5 fc ori r2,r2,0xe5fc
8004328: b9 80 08 00 mv r1,r12
800432c: d9 60 00 00 call r11
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
8004330: 78 02 08 01 mvhi r2,0x801
8004334: b9 80 08 00 mv r1,r12
8004338: 38 42 e6 48 ori r2,r2,0xe648
800433c: d9 60 00 00 call r11
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
8004340: 78 01 08 02 mvhi r1,0x802
8004344: 38 21 08 90 ori r1,r1,0x890
rtems_object_get_name( the_status.owner, sizeof(name), name );
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
8004348: 78 11 08 01 mvhi r17,0x801
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
(*print)( context,
800434c: 78 10 08 01 mvhi r16,0x801
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
(*print)( context,
8004350: 78 0f 08 01 mvhi r15,0x801
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
8004354: 78 0e 08 01 mvhi r14,0x801
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
8004358: 28 2d 00 08 lw r13,(r1+8)
id <= _Rate_monotonic_Information.maximum_id ;
800435c: b8 20 a0 00 mv r20,r1
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
8004360: 37 99 00 48 addi r25,sp,72
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
8004364: 37 98 00 80 addi r24,sp,128
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
8004368: 37 93 00 a0 addi r19,sp,160
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
800436c: 3a 31 e6 94 ori r17,r17,0xe694
{
#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;
8004370: 37 97 00 60 addi r23,sp,96
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
8004374: 37 92 00 98 addi r18,sp,152
(*print)( context,
8004378: 3a 10 e6 ac ori r16,r16,0xe6ac
{
#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;
800437c: 37 96 00 78 addi r22,sp,120
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
(*print)( context,
8004380: 39 ef e6 cc ori r15,r15,0xe6cc
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
8004384: 39 ce db d0 ori r14,r14,0xdbd0
/*
* 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 ;
8004388: e0 00 00 4a bi 80044b0 <rtems_rate_monotonic_report_statistics_with_plugin+0x210>
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
800438c: b9 a0 08 00 mv r1,r13
8004390: bb 20 10 00 mv r2,r25
8004394: f8 00 1c eb calli 800b740 <rtems_rate_monotonic_get_statistics>
8004398: b8 20 a8 00 mv r21,r1
if ( status != RTEMS_SUCCESSFUL )
800439c: 5c 20 00 44 bne r1,r0,80044ac <rtems_rate_monotonic_report_statistics_with_plugin+0x20c>
#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 );
80043a0: bb 00 10 00 mv r2,r24
80043a4: b9 a0 08 00 mv r1,r13
80043a8: f8 00 1d 18 calli 800b808 <rtems_rate_monotonic_get_status>
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
80043ac: 2b 81 00 80 lw r1,(sp+128)
80043b0: 34 02 00 05 mvi r2,5
80043b4: ba 60 18 00 mv r3,r19
80043b8: f8 00 00 c3 calli 80046c4 <rtems_object_get_name>
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
80043bc: 2b 85 00 48 lw r5,(sp+72)
80043c0: 2b 86 00 4c lw r6,(sp+76)
80043c4: ba 20 10 00 mv r2,r17
80043c8: b9 80 08 00 mv r1,r12
80043cc: b9 a0 18 00 mv r3,r13
80043d0: ba 60 20 00 mv r4,r19
80043d4: d9 60 00 00 call r11
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
80043d8: 2b 82 00 48 lw r2,(sp+72)
80043dc: 5c 55 00 05 bne r2,r21,80043f0 <rtems_rate_monotonic_report_statistics_with_plugin+0x150>
(*print)( context, "\n" );
80043e0: b9 80 08 00 mv r1,r12
80043e4: b9 c0 10 00 mv r2,r14
80043e8: d9 60 00 00 call r11
continue;
80043ec: e0 00 00 30 bi 80044ac <rtems_rate_monotonic_report_statistics_with_plugin+0x20c>
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 );
80043f0: ba 40 18 00 mv r3,r18
80043f4: ba e0 08 00 mv r1,r23
80043f8: f8 00 10 5e calli 8008570 <_Timespec_Divide_by_integer>
(*print)( context,
80043fc: 2b 81 00 54 lw r1,(sp+84)
8004400: 34 02 03 e8 mvi r2,1000
8004404: f8 00 60 ee calli 801c7bc <__divsi3>
8004408: b8 20 d8 00 mv fp,r1
800440c: 2b 81 00 5c lw r1,(sp+92)
8004410: 34 02 03 e8 mvi r2,1000
8004414: f8 00 60 ea calli 801c7bc <__divsi3>
8004418: b8 20 a8 00 mv r21,r1
800441c: 2b 81 00 9c lw r1,(sp+156)
8004420: 34 02 03 e8 mvi r2,1000
8004424: f8 00 60 e6 calli 801c7bc <__divsi3>
8004428: 2b 85 00 58 lw r5,(sp+88)
800442c: 2b 87 00 98 lw r7,(sp+152)
8004430: 2b 83 00 50 lw r3,(sp+80)
8004434: b8 20 40 00 mv r8,r1
8004438: bb 60 20 00 mv r4,fp
800443c: ba a0 30 00 mv r6,r21
8004440: ba 00 10 00 mv r2,r16
8004444: b9 80 08 00 mv r1,r12
8004448: d9 60 00 00 call r11
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
800444c: 2b 82 00 48 lw r2,(sp+72)
8004450: ba 40 18 00 mv r3,r18
8004454: ba c0 08 00 mv r1,r22
8004458: f8 00 10 46 calli 8008570 <_Timespec_Divide_by_integer>
(*print)( context,
800445c: 2b 81 00 6c lw r1,(sp+108)
8004460: 34 02 03 e8 mvi r2,1000
8004464: f8 00 60 d6 calli 801c7bc <__divsi3>
8004468: b8 20 d8 00 mv fp,r1
800446c: 2b 81 00 74 lw r1,(sp+116)
8004470: 34 02 03 e8 mvi r2,1000
8004474: f8 00 60 d2 calli 801c7bc <__divsi3>
8004478: b8 20 a8 00 mv r21,r1
800447c: 2b 81 00 9c lw r1,(sp+156)
8004480: 34 02 03 e8 mvi r2,1000
8004484: f8 00 60 ce calli 801c7bc <__divsi3>
8004488: 2b 83 00 68 lw r3,(sp+104)
800448c: 2b 85 00 70 lw r5,(sp+112)
8004490: 2b 87 00 98 lw r7,(sp+152)
8004494: b8 20 40 00 mv r8,r1
8004498: b9 e0 10 00 mv r2,r15
800449c: b9 80 08 00 mv r1,r12
80044a0: bb 60 20 00 mv r4,fp
80044a4: ba a0 30 00 mv r6,r21
80044a8: d9 60 00 00 call r11
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
80044ac: 35 ad 00 01 addi r13,r13,1
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
80044b0: 2a 81 00 0c lw r1,(r20+12)
80044b4: 50 2d ff b6 bgeu r1,r13,800438c <rtems_rate_monotonic_report_statistics_with_plugin+0xec>
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
80044b8: 2b 9d 00 04 lw ra,(sp+4)
80044bc: 2b 8b 00 44 lw r11,(sp+68)
80044c0: 2b 8c 00 40 lw r12,(sp+64)
80044c4: 2b 8d 00 3c lw r13,(sp+60)
80044c8: 2b 8e 00 38 lw r14,(sp+56)
80044cc: 2b 8f 00 34 lw r15,(sp+52)
80044d0: 2b 90 00 30 lw r16,(sp+48)
80044d4: 2b 91 00 2c lw r17,(sp+44)
80044d8: 2b 92 00 28 lw r18,(sp+40)
80044dc: 2b 93 00 24 lw r19,(sp+36)
80044e0: 2b 94 00 20 lw r20,(sp+32)
80044e4: 2b 95 00 1c lw r21,(sp+28)
80044e8: 2b 96 00 18 lw r22,(sp+24)
80044ec: 2b 97 00 14 lw r23,(sp+20)
80044f0: 2b 98 00 10 lw r24,(sp+16)
80044f4: 2b 99 00 0c lw r25,(sp+12)
80044f8: 2b 9b 00 08 lw fp,(sp+8)
80044fc: 37 9c 00 a4 addi sp,sp,164
8004500: c3 a0 00 00 ret
08013344 <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
8013344: 37 9c ff f4 addi sp,sp,-12
8013348: 5b 8b 00 08 sw (sp+8),r11
801334c: 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;
8013350: 34 03 00 0a mvi r3,10
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
8013354: 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 )
8013358: 44 40 00 29 be r2,r0,80133fc <rtems_signal_send+0xb8>
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
801335c: 37 82 00 0c addi r2,sp,12
8013360: f8 00 15 33 calli 801882c <_Thread_Get>
switch ( location ) {
8013364: 2b 82 00 0c lw r2,(sp+12)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8013368: 34 03 00 04 mvi r3,4
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
801336c: 5c 40 00 24 bne r2,r0,80133fc <rtems_signal_send+0xb8>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
8013370: 28 23 01 1c lw r3,(r1+284)
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
8013374: 28 64 00 0c lw r4,(r3+12)
8013378: 44 82 00 1f be r4,r2,80133f4 <rtems_signal_send+0xb0>
if ( asr->is_enabled ) {
801337c: 40 62 00 08 lbu r2,(r3+8)
8013380: 44 40 00 12 be r2,r0,80133c8 <rtems_signal_send+0x84>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
8013384: 90 00 10 00 rcsr r2,IE
8013388: 34 04 ff fe mvi r4,-2
801338c: a0 44 20 00 and r4,r2,r4
8013390: d0 04 00 00 wcsr IE,r4
*signal_set |= signals;
8013394: 28 64 00 14 lw r4,(r3+20)
8013398: b8 8b 58 00 or r11,r4,r11
801339c: 58 6b 00 14 sw (r3+20),r11
_ISR_Enable( _level );
80133a0: d0 02 00 00 wcsr IE,r2
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
80133a4: 78 02 08 04 mvhi r2,0x804
80133a8: 38 42 01 88 ori r2,r2,0x188
80133ac: 28 43 00 08 lw r3,(r2+8)
80133b0: 44 60 00 0e be r3,r0,80133e8 <rtems_signal_send+0xa4>
80133b4: 28 43 00 0c lw r3,(r2+12)
80133b8: 5c 23 00 0c bne r1,r3,80133e8 <rtems_signal_send+0xa4> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
80133bc: 34 01 00 01 mvi r1,1
80133c0: 30 41 00 18 sb (r2+24),r1
80133c4: e0 00 00 09 bi 80133e8 <rtems_signal_send+0xa4>
rtems_signal_set *signal_set
)
{
ISR_Level _level;
_ISR_Disable( _level );
80133c8: 90 00 08 00 rcsr r1,IE
80133cc: 34 02 ff fe mvi r2,-2
80133d0: a0 22 10 00 and r2,r1,r2
80133d4: d0 02 00 00 wcsr IE,r2
*signal_set |= signals;
80133d8: 28 62 00 18 lw r2,(r3+24)
80133dc: b8 4b 58 00 or r11,r2,r11
80133e0: 58 6b 00 18 sw (r3+24),r11
_ISR_Enable( _level );
80133e4: d0 01 00 00 wcsr IE,r1
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
80133e8: f8 00 15 04 calli 80187f8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80133ec: 34 03 00 00 mvi r3,0
80133f0: e0 00 00 03 bi 80133fc <rtems_signal_send+0xb8>
}
_Thread_Enable_dispatch();
80133f4: f8 00 15 01 calli 80187f8 <_Thread_Enable_dispatch>
return RTEMS_NOT_DEFINED;
80133f8: 34 03 00 0b mvi r3,11
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
80133fc: b8 60 08 00 mv r1,r3
8013400: 2b 9d 00 04 lw ra,(sp+4)
8013404: 2b 8b 00 08 lw r11,(sp+8)
8013408: 37 9c 00 0c addi sp,sp,12
801340c: c3 a0 00 00 ret
08001328 <rtems_stack_checker_begin_extension>:
Thread_Control *the_thread
)
{
Stack_check_Control *the_pattern;
if ( the_thread->Object.id == 0 ) /* skip system tasks */
8001328: 28 22 00 08 lw r2,(r1+8)
800132c: 44 40 00 0c be r2,r0,800135c <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;
8001330: 28 22 00 bc lw r2,(r1+188)
8001334: 78 01 08 01 mvhi r1,0x801
8001338: 38 21 77 50 ori r1,r1,0x7750
800133c: 28 25 00 00 lw r5,(r1+0)
8001340: 28 24 00 04 lw r4,(r1+4)
8001344: 28 23 00 08 lw r3,(r1+8)
8001348: 28 21 00 0c lw r1,(r1+12)
800134c: 58 45 00 08 sw (r2+8),r5
8001350: 58 44 00 0c sw (r2+12),r4
8001354: 58 43 00 10 sw (r2+16),r3
8001358: 58 41 00 14 sw (r2+20),r1
800135c: c3 a0 00 00 ret
080012ec <rtems_stack_checker_create_extension>:
*/
bool rtems_stack_checker_create_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *the_thread
)
{
80012ec: 37 9c ff f8 addi sp,sp,-8
80012f0: 5b 8b 00 08 sw (sp+8),r11
80012f4: 5b 9d 00 04 sw (sp+4),ra
80012f8: b8 40 58 00 mv r11,r2
Stack_check_Initialize();
80012fc: fb ff ff d0 calli 800123c <Stack_check_Initialize>
if (the_thread)
8001300: 45 60 00 05 be r11,r0,8001314 <rtems_stack_checker_create_extension+0x28><== NEVER TAKEN
Stack_check_Dope_stack(&the_thread->Start.Initial_stack);
8001304: 29 61 00 bc lw r1,(r11+188)
8001308: 29 63 00 b8 lw r3,(r11+184)
800130c: 34 02 00 a5 mvi r2,165
8001310: f8 00 3b 97 calli 801016c <memset>
return true;
}
8001314: 34 01 00 01 mvi r1,1
8001318: 2b 9d 00 04 lw ra,(sp+4)
800131c: 2b 8b 00 08 lw r11,(sp+8)
8001320: 37 9c 00 08 addi sp,sp,8
8001324: c3 a0 00 00 ret
08001490 <rtems_stack_checker_is_blown>:
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
{
8001490: 37 9c ff f4 addi sp,sp,-12
8001494: 5b 9b 00 08 sw (sp+8),fp
8001498: 34 1b 00 0c mvi fp,12
800149c: b7 7c d8 00 add fp,fp,sp
80014a0: 5b 8b 00 0c sw (sp+12),r11
80014a4: 5b 9d 00 04 sw (sp+4),ra
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
80014a8: 78 01 08 01 mvhi r1,0x801
80014ac: 38 21 7d dc ori r1,r1,0x7ddc
80014b0: 28 22 00 0c lw r2,(r1+12)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
return false;
80014b4: 34 0b 00 00 mvi r11,0
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
80014b8: 28 41 00 bc lw r1,(r2+188)
80014bc: 54 3b 00 04 bgu r1,fp,80014cc <rtems_stack_checker_is_blown+0x3c><== NEVER TAKEN
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
80014c0: 28 4b 00 b8 lw r11,(r2+184)
}
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
80014c4: b4 2b 58 00 add r11,r1,r11
80014c8: f1 7b 58 00 cmpgeu r11,r11,fp
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
80014cc: 78 02 08 01 mvhi r2,0x801
80014d0: 38 42 76 c4 ori r2,r2,0x76c4
80014d4: 28 43 00 00 lw r3,(r2+0)
*/
bool rtems_stack_checker_is_blown( void )
{
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
bool sp_ok;
bool pattern_ok = true;
80014d8: 34 02 00 01 mvi r2,1
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
80014dc: 44 60 00 07 be r3,r0,80014f8 <rtems_stack_checker_is_blown+0x68><== NEVER TAKEN
pattern_ok = (!memcmp(
80014e0: 78 02 08 01 mvhi r2,0x801
80014e4: 38 42 77 50 ori r2,r2,0x7750
80014e8: 34 21 00 08 addi r1,r1,8
80014ec: 34 03 00 10 mvi r3,16
80014f0: f8 00 3a bd calli 800ffe4 <memcmp>
80014f4: 64 22 00 00 cmpei r2,r1,0
/*
* Let's report as much as we can.
*/
if ( !sp_ok || !pattern_ok ) {
80014f8: 45 60 00 02 be r11,r0,8001500 <rtems_stack_checker_is_blown+0x70><== NEVER TAKEN
80014fc: 5c 40 00 05 bne r2,r0,8001510 <rtems_stack_checker_is_blown+0x80><== ALWAYS TAKEN
Stack_check_report_blown_task( _Thread_Executing, pattern_ok );
8001500: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED
8001504: 38 21 7d dc ori r1,r1,0x7ddc <== NOT EXECUTED
8001508: 28 21 00 0c lw r1,(r1+12) <== NOT EXECUTED
800150c: fb ff ff 95 calli 8001360 <Stack_check_report_blown_task> <== NOT EXECUTED
/*
* The Stack Pointer and the Pattern Area are OK so return false.
*/
return false;
}
8001510: 34 01 00 00 mvi r1,0
8001514: 2b 9d 00 04 lw ra,(sp+4)
8001518: 2b 8b 00 0c lw r11,(sp+12)
800151c: 2b 9b 00 08 lw fp,(sp+8)
8001520: 37 9c 00 0c addi sp,sp,12
8001524: c3 a0 00 00 ret
08001528 <rtems_stack_checker_report_usage_with_plugin>:
void rtems_stack_checker_report_usage_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
8001528: 37 9c ff ec addi sp,sp,-20
800152c: 5b 8b 00 14 sw (sp+20),r11
8001530: 5b 8c 00 10 sw (sp+16),r12
8001534: 5b 8d 00 0c sw (sp+12),r13
8001538: 5b 8e 00 08 sw (sp+8),r14
800153c: 5b 9d 00 04 sw (sp+4),ra
8001540: b8 20 70 00 mv r14,r1
8001544: b8 40 68 00 mv r13,r2
if ( !print )
8001548: 44 40 00 15 be r2,r0,800159c <rtems_stack_checker_report_usage_with_plugin+0x74><== NEVER TAKEN
return;
print_context = context;
print_handler = print;
800154c: 78 0b 08 01 mvhi r11,0x801
8001550: 39 6b 76 c0 ori r11,r11,0x76c0
)
{
if ( !print )
return;
print_context = context;
8001554: 78 0c 08 01 mvhi r12,0x801
8001558: 39 8c 76 bc ori r12,r12,0x76bc
print_handler = print;
800155c: 59 62 00 00 sw (r11+0),r2
(*print)( context, "Stack usage by thread\n");
8001560: 78 02 08 01 mvhi r2,0x801
8001564: 38 42 5f 4c ori r2,r2,0x5f4c
)
{
if ( !print )
return;
print_context = context;
8001568: 59 81 00 00 sw (r12+0),r1
print_handler = print;
(*print)( context, "Stack usage by thread\n");
800156c: d9 a0 00 00 call r13
(*print)( context,
8001570: 78 02 08 01 mvhi r2,0x801
8001574: 38 42 5f 64 ori r2,r2,0x5f64
8001578: b9 c0 08 00 mv r1,r14
800157c: d9 a0 00 00 call r13
" ID NAME LOW HIGH CURRENT AVAILABLE USED\n"
);
/* iterate over all threads and dump the usage */
rtems_iterate_over_all_threads( Stack_check_Dump_threads_usage );
8001580: 78 01 08 00 mvhi r1,0x800
8001584: 38 21 10 74 ori r1,r1,0x1074
8001588: f8 00 16 9f calli 8007004 <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);
800158c: 34 01 ff ff mvi r1,-1
8001590: fb ff fe b9 calli 8001074 <Stack_check_Dump_threads_usage>
#endif
print_context = NULL;
8001594: 59 80 00 00 sw (r12+0),r0
print_handler = NULL;
8001598: 59 60 00 00 sw (r11+0),r0
}
800159c: 2b 9d 00 04 lw ra,(sp+4)
80015a0: 2b 8b 00 14 lw r11,(sp+20)
80015a4: 2b 8c 00 10 lw r12,(sp+16)
80015a8: 2b 8d 00 0c lw r13,(sp+12)
80015ac: 2b 8e 00 08 lw r14,(sp+8)
80015b0: 37 9c 00 14 addi sp,sp,20
80015b4: c3 a0 00 00 ret
08001418 <rtems_stack_checker_switch_extension>:
*/
void rtems_stack_checker_switch_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *heir __attribute__((unused))
)
{
8001418: 37 9c ff f0 addi sp,sp,-16
800141c: 5b 9b 00 08 sw (sp+8),fp
8001420: 34 1b 00 10 mvi fp,16
8001424: b7 7c d8 00 add fp,fp,sp
8001428: 5b 8b 00 10 sw (sp+16),r11
800142c: 5b 8c 00 0c sw (sp+12),r12
8001430: 5b 9d 00 04 sw (sp+4),ra
Stack_Control *the_stack = &running->Start.Initial_stack;
void *pattern;
bool sp_ok;
bool pattern_ok = true;
pattern = Stack_check_Get_pattern_area(the_stack);
8001434: 28 22 00 bc lw r2,(r1+188)
*/
void rtems_stack_checker_switch_extension(
Thread_Control *running __attribute__((unused)),
Thread_Control *heir __attribute__((unused))
)
{
8001438: b8 20 58 00 mv r11,r1
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
return false;
800143c: 34 0c 00 00 mvi r12,0
Stack_Control *the_stack = &running->Start.Initial_stack;
void *pattern;
bool sp_ok;
bool pattern_ok = true;
pattern = Stack_check_Get_pattern_area(the_stack);
8001440: 34 41 00 08 addi r1,r2,8
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
8001444: 54 5b 00 04 bgu r2,fp,8001454 <rtems_stack_checker_switch_extension+0x3c><== NEVER TAKEN
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
8001448: 29 6c 00 b8 lw r12,(r11+184)
}
/*
* rtems_stack_checker_switch_extension
*/
void rtems_stack_checker_switch_extension(
800144c: b4 4c 10 00 add r2,r2,r12
8001450: f0 5b 60 00 cmpgeu r12,r2,fp
/*
* Check for an out of bounds stack pointer or an overwrite
*/
sp_ok = Stack_check_Frame_pointer_in_range( the_stack );
pattern_ok = (!memcmp( pattern,
8001454: 78 02 08 01 mvhi r2,0x801
8001458: 38 42 77 50 ori r2,r2,0x7750
800145c: 34 03 00 10 mvi r3,16
8001460: f8 00 3a e1 calli 800ffe4 <memcmp>
8001464: 64 22 00 00 cmpei r2,r1,0
(void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES));
if ( !sp_ok || !pattern_ok ) {
8001468: 45 80 00 02 be r12,r0,8001470 <rtems_stack_checker_switch_extension+0x58>
800146c: 5c 40 00 03 bne r2,r0,8001478 <rtems_stack_checker_switch_extension+0x60>
Stack_check_report_blown_task( running, pattern_ok );
8001470: b9 60 08 00 mv r1,r11
8001474: fb ff ff bb calli 8001360 <Stack_check_report_blown_task>
}
}
8001478: 2b 9d 00 04 lw ra,(sp+4)
800147c: 2b 8b 00 10 lw r11,(sp+16)
8001480: 2b 8c 00 0c lw r12,(sp+12)
8001484: 2b 9b 00 08 lw fp,(sp+8)
8001488: 37 9c 00 10 addi sp,sp,16
800148c: c3 a0 00 00 ret
08009024 <rtems_string_to_double>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009024: 37 9c ff e4 addi sp,sp,-28
8009028: 5b 8b 00 18 sw (sp+24),r11
800902c: 5b 8c 00 14 sw (sp+20),r12
8009030: 5b 8d 00 10 sw (sp+16),r13
8009034: 5b 8e 00 0c sw (sp+12),r14
8009038: 5b 8f 00 08 sw (sp+8),r15
800903c: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
8009040: 34 04 00 09 mvi r4,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009044: b8 20 70 00 mv r14,r1
8009048: b8 40 58 00 mv r11,r2
800904c: b8 60 78 00 mv r15,r3
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009050: 44 40 00 21 be r2,r0,80090d4 <rtems_string_to_double+0xb0>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009054: f8 00 11 08 calli 800d474 <__errno>
8009058: 58 20 00 00 sw (r1+0),r0
*n = 0;
800905c: 59 60 00 00 sw (r11+0),r0
8009060: 59 60 00 04 sw (r11+4),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
8009064: b9 c0 08 00 mv r1,r14
8009068: 37 82 00 1c addi r2,sp,28
800906c: f8 00 1c 10 calli 80100ac <strtod>
8009070: b8 20 68 00 mv r13,r1
8009074: b8 40 60 00 mv r12,r2
#elif defined(STRING_TO_INTEGER)
result = STRING_TO_METHOD( s, &end, base );
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009078: 45 e0 00 03 be r15,r0,8009084 <rtems_string_to_double+0x60>
*endptr = end;
800907c: 2b 81 00 1c lw r1,(sp+28)
8009080: 59 e1 00 00 sw (r15+0),r1
/* nothing was converted */
if ( end == s )
8009084: 2b 81 00 1c lw r1,(sp+28)
return RTEMS_NOT_DEFINED;
8009088: 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 )
800908c: 44 2e 00 12 be r1,r14,80090d4 <rtems_string_to_double+0xb0>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009090: 78 04 08 02 mvhi r4,0x802
8009094: 38 84 09 0c ori r4,r4,0x90c
8009098: 28 83 00 00 lw r3,(r4+0)
800909c: b9 a0 08 00 mv r1,r13
80090a0: b9 80 10 00 mv r2,r12
80090a4: 34 04 ff ff mvi r4,-1
80090a8: f8 00 49 a0 calli 801b728 <__gedf2>
80090ac: 48 20 00 02 bg r1,r0,80090b4 <rtems_string_to_double+0x90>
80090b0: e0 00 00 06 bi 80090c8 <rtems_string_to_double+0xa4>
80090b4: f8 00 10 f0 calli 800d474 <__errno>
80090b8: 28 22 00 00 lw r2,(r1+0)
80090bc: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
80090c0: 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))
80090c4: 44 41 00 04 be r2,r1,80090d4 <rtems_string_to_double+0xb0> <== ALWAYS TAKEN
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
80090c8: 59 6d 00 00 sw (r11+0),r13
80090cc: 59 6c 00 04 sw (r11+4),r12
#endif
return RTEMS_SUCCESSFUL;
80090d0: 34 04 00 00 mvi r4,0
}
80090d4: b8 80 08 00 mv r1,r4
80090d8: 2b 9d 00 04 lw ra,(sp+4)
80090dc: 2b 8b 00 18 lw r11,(sp+24)
80090e0: 2b 8c 00 14 lw r12,(sp+20)
80090e4: 2b 8d 00 10 lw r13,(sp+16)
80090e8: 2b 8e 00 0c lw r14,(sp+12)
80090ec: 2b 8f 00 08 lw r15,(sp+8)
80090f0: 37 9c 00 1c addi sp,sp,28
80090f4: c3 a0 00 00 ret
080090f8 <rtems_string_to_float>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80090f8: 37 9c ff e8 addi sp,sp,-24
80090fc: 5b 8b 00 14 sw (sp+20),r11
8009100: 5b 8c 00 10 sw (sp+16),r12
8009104: 5b 8d 00 0c sw (sp+12),r13
8009108: 5b 8e 00 08 sw (sp+8),r14
800910c: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
8009110: 34 04 00 09 mvi r4,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009114: b8 20 68 00 mv r13,r1
8009118: b8 40 58 00 mv r11,r2
800911c: b8 60 70 00 mv r14,r3
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009120: 44 40 00 1c be r2,r0,8009190 <rtems_string_to_float+0x98>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009124: f8 00 10 d4 calli 800d474 <__errno>
8009128: 58 20 00 00 sw (r1+0),r0
*n = 0;
800912c: 59 60 00 00 sw (r11+0),r0
#ifdef STRING_TO_FLOAT
result = STRING_TO_METHOD( s, &end );
8009130: b9 a0 08 00 mv r1,r13
8009134: 37 82 00 18 addi r2,sp,24
8009138: f8 00 1b e9 calli 80100dc <strtof>
800913c: 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 )
8009140: 45 c0 00 03 be r14,r0,800914c <rtems_string_to_float+0x54>
*endptr = end;
8009144: 2b 81 00 18 lw r1,(sp+24)
8009148: 59 c1 00 00 sw (r14+0),r1
/* nothing was converted */
if ( end == s )
800914c: 2b 81 00 18 lw r1,(sp+24)
return RTEMS_NOT_DEFINED;
8009150: 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 )
8009154: 44 2d 00 0f be r1,r13,8009190 <rtems_string_to_float+0x98>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009158: 78 03 08 02 mvhi r3,0x802
800915c: 38 63 09 10 ori r3,r3,0x910
8009160: 28 62 00 00 lw r2,(r3+0)
8009164: b9 80 08 00 mv r1,r12
8009168: f8 00 43 76 calli 8019f40 <__gesf2>
800916c: 48 20 00 02 bg r1,r0,8009174 <rtems_string_to_float+0x7c>
8009170: e0 00 00 06 bi 8009188 <rtems_string_to_float+0x90>
8009174: f8 00 10 c0 calli 800d474 <__errno>
8009178: 28 22 00 00 lw r2,(r1+0)
800917c: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
8009180: 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))
8009184: 44 41 00 03 be r2,r1,8009190 <rtems_string_to_float+0x98> <== ALWAYS TAKEN
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
8009188: 59 6c 00 00 sw (r11+0),r12
#endif
return RTEMS_SUCCESSFUL;
800918c: 34 04 00 00 mvi r4,0
}
8009190: b8 80 08 00 mv r1,r4
8009194: 2b 9d 00 04 lw ra,(sp+4)
8009198: 2b 8b 00 14 lw r11,(sp+20)
800919c: 2b 8c 00 10 lw r12,(sp+16)
80091a0: 2b 8d 00 0c lw r13,(sp+12)
80091a4: 2b 8e 00 08 lw r14,(sp+8)
80091a8: 37 9c 00 18 addi sp,sp,24
80091ac: c3 a0 00 00 ret
08009264 <rtems_string_to_long_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009264: 37 9c ff e4 addi sp,sp,-28
8009268: 5b 8b 00 18 sw (sp+24),r11
800926c: 5b 8c 00 14 sw (sp+20),r12
8009270: 5b 8d 00 10 sw (sp+16),r13
8009274: 5b 8e 00 0c sw (sp+12),r14
8009278: 5b 8f 00 08 sw (sp+8),r15
800927c: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
8009280: 34 05 00 09 mvi r5,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009284: b8 20 70 00 mv r14,r1
8009288: b8 40 58 00 mv r11,r2
800928c: b8 60 78 00 mv r15,r3
8009290: b8 80 60 00 mv r12,r4
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009294: 44 40 00 22 be r2,r0,800931c <rtems_string_to_long_long+0xb8>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009298: f8 00 10 77 calli 800d474 <__errno>
800929c: 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 );
80092a0: b9 80 18 00 mv r3,r12
if ( !n )
return RTEMS_INVALID_ADDRESS;
errno = 0;
*n = 0;
80092a4: 59 60 00 00 sw (r11+0),r0
80092a8: 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 );
80092ac: b9 c0 08 00 mv r1,r14
80092b0: 37 82 00 1c addi r2,sp,28
80092b4: f8 00 1c 4b calli 80103e0 <strtoll>
80092b8: b8 20 68 00 mv r13,r1
80092bc: b8 40 60 00 mv r12,r2
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
80092c0: 45 e0 00 03 be r15,r0,80092cc <rtems_string_to_long_long+0x68>
*endptr = end;
80092c4: 2b 81 00 1c lw r1,(sp+28)
80092c8: 59 e1 00 00 sw (r15+0),r1
/* nothing was converted */
if ( end == s )
80092cc: 2b 81 00 1c lw r1,(sp+28)
return RTEMS_NOT_DEFINED;
80092d0: 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 )
80092d4: 44 2e 00 12 be r1,r14,800931c <rtems_string_to_long_long+0xb8>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
80092d8: 78 02 08 02 mvhi r2,0x802
80092dc: 38 42 01 70 ori r2,r2,0x170
80092e0: 28 41 00 00 lw r1,(r2+0)
80092e4: 5d a1 00 03 bne r13,r1,80092f0 <rtems_string_to_long_long+0x8c>
80092e8: 34 01 ff ff mvi r1,-1
80092ec: 45 81 00 04 be r12,r1,80092fc <rtems_string_to_long_long+0x98><== ALWAYS TAKEN
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MIN
/* there was an underflow */
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
80092f0: 78 01 80 00 mvhi r1,0x8000
80092f4: 5d a1 00 07 bne r13,r1,8009310 <rtems_string_to_long_long+0xac>
80092f8: 5d 80 00 06 bne r12,r0,8009310 <rtems_string_to_long_long+0xac><== NEVER TAKEN
80092fc: f8 00 10 5e calli 800d474 <__errno>
8009300: 28 22 00 00 lw r2,(r1+0)
8009304: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
8009308: 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))
800930c: 44 41 00 04 be r2,r1,800931c <rtems_string_to_long_long+0xb8>
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
8009310: 59 6d 00 00 sw (r11+0),r13
8009314: 59 6c 00 04 sw (r11+4),r12
#endif
return RTEMS_SUCCESSFUL;
8009318: 34 05 00 00 mvi r5,0
}
800931c: b8 a0 08 00 mv r1,r5
8009320: 2b 9d 00 04 lw ra,(sp+4)
8009324: 2b 8b 00 18 lw r11,(sp+24)
8009328: 2b 8c 00 14 lw r12,(sp+20)
800932c: 2b 8d 00 10 lw r13,(sp+16)
8009330: 2b 8e 00 0c lw r14,(sp+12)
8009334: 2b 8f 00 08 lw r15,(sp+8)
8009338: 37 9c 00 1c addi sp,sp,28
800933c: c3 a0 00 00 ret
080093fc <rtems_string_to_pointer>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80093fc: 37 9c ff e8 addi sp,sp,-24
8009400: 5b 8b 00 14 sw (sp+20),r11
8009404: 5b 8c 00 10 sw (sp+16),r12
8009408: 5b 8d 00 0c sw (sp+12),r13
800940c: 5b 8e 00 08 sw (sp+8),r14
8009410: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
8009414: 34 04 00 09 mvi r4,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009418: b8 20 68 00 mv r13,r1
800941c: b8 40 58 00 mv r11,r2
8009420: b8 60 70 00 mv r14,r3
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009424: 44 40 00 18 be r2,r0,8009484 <rtems_string_to_pointer+0x88>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009428: f8 00 10 13 calli 800d474 <__errno>
800942c: 58 20 00 00 sw (r1+0),r0
*n = 0;
8009430: 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 );
8009434: b9 a0 08 00 mv r1,r13
8009438: 37 82 00 18 addi r2,sp,24
800943c: 34 03 00 10 mvi r3,16
8009440: f8 00 1d 53 calli 801098c <strtoul>
8009444: 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 )
8009448: 45 c0 00 03 be r14,r0,8009454 <rtems_string_to_pointer+0x58>
*endptr = end;
800944c: 2b 81 00 18 lw r1,(sp+24)
8009450: 59 c1 00 00 sw (r14+0),r1
/* nothing was converted */
if ( end == s )
8009454: 2b 81 00 18 lw r1,(sp+24)
return RTEMS_NOT_DEFINED;
8009458: 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 )
800945c: 44 2d 00 0a be r1,r13,8009484 <rtems_string_to_pointer+0x88>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009460: 34 01 ff ff mvi r1,-1
8009464: 5d 81 00 06 bne r12,r1,800947c <rtems_string_to_pointer+0x80><== ALWAYS TAKEN
8009468: f8 00 10 03 calli 800d474 <__errno> <== NOT EXECUTED
800946c: 28 22 00 00 lw r2,(r1+0) <== NOT EXECUTED
8009470: 34 01 00 22 mvi r1,34 <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
8009474: 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))
8009478: 44 41 00 03 be r2,r1,8009484 <rtems_string_to_pointer+0x88><== NOT EXECUTED
if ( (result == STRING_TO_MIN) && (errno == ERANGE))
return RTEMS_INVALID_NUMBER;
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
800947c: 59 6c 00 00 sw (r11+0),r12
#else
*n = (STRING_TO_TYPE) result;
#endif
return RTEMS_SUCCESSFUL;
8009480: 34 04 00 00 mvi r4,0
}
8009484: b8 80 08 00 mv r1,r4
8009488: 2b 9d 00 04 lw ra,(sp+4)
800948c: 2b 8b 00 14 lw r11,(sp+20)
8009490: 2b 8c 00 10 lw r12,(sp+16)
8009494: 2b 8d 00 0c lw r13,(sp+12)
8009498: 2b 8e 00 08 lw r14,(sp+8)
800949c: 37 9c 00 18 addi sp,sp,24
80094a0: c3 a0 00 00 ret
08009534 <rtems_string_to_unsigned_int>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009534: 37 9c ff e8 addi sp,sp,-24
8009538: 5b 8b 00 14 sw (sp+20),r11
800953c: 5b 8c 00 10 sw (sp+16),r12
8009540: 5b 8d 00 0c sw (sp+12),r13
8009544: 5b 8e 00 08 sw (sp+8),r14
8009548: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
800954c: 34 05 00 09 mvi r5,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009550: b8 20 68 00 mv r13,r1
8009554: b8 40 58 00 mv r11,r2
8009558: b8 60 70 00 mv r14,r3
800955c: b8 80 60 00 mv r12,r4
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009560: 44 40 00 18 be r2,r0,80095c0 <rtems_string_to_unsigned_int+0x8c>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009564: f8 00 0f c4 calli 800d474 <__errno>
8009568: 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 );
800956c: b9 80 18 00 mv r3,r12
if ( !n )
return RTEMS_INVALID_ADDRESS;
errno = 0;
*n = 0;
8009570: 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 );
8009574: b9 a0 08 00 mv r1,r13
8009578: 37 82 00 18 addi r2,sp,24
800957c: f8 00 1d 04 calli 801098c <strtoul>
8009580: b8 20 60 00 mv r12,r1
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
8009584: 45 c0 00 03 be r14,r0,8009590 <rtems_string_to_unsigned_int+0x5c>
*endptr = end;
8009588: 2b 81 00 18 lw r1,(sp+24)
800958c: 59 c1 00 00 sw (r14+0),r1
/* nothing was converted */
if ( end == s )
8009590: 2b 81 00 18 lw r1,(sp+24)
return RTEMS_NOT_DEFINED;
8009594: 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 )
8009598: 44 2d 00 0a be r1,r13,80095c0 <rtems_string_to_unsigned_int+0x8c>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
800959c: 34 01 ff ff mvi r1,-1
80095a0: 5d 81 00 06 bne r12,r1,80095b8 <rtems_string_to_unsigned_int+0x84>
80095a4: f8 00 0f b4 calli 800d474 <__errno>
80095a8: 28 22 00 00 lw r2,(r1+0)
80095ac: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
80095b0: 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))
80095b4: 44 41 00 03 be r2,r1,80095c0 <rtems_string_to_unsigned_int+0x8c><== ALWAYS TAKEN
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
80095b8: 59 6c 00 00 sw (r11+0),r12
#endif
return RTEMS_SUCCESSFUL;
80095bc: 34 05 00 00 mvi r5,0
}
80095c0: b8 a0 08 00 mv r1,r5
80095c4: 2b 9d 00 04 lw ra,(sp+4)
80095c8: 2b 8b 00 14 lw r11,(sp+20)
80095cc: 2b 8c 00 10 lw r12,(sp+16)
80095d0: 2b 8d 00 0c lw r13,(sp+12)
80095d4: 2b 8e 00 08 lw r14,(sp+8)
80095d8: 37 9c 00 18 addi sp,sp,24
80095dc: c3 a0 00 00 ret
080096a4 <rtems_string_to_unsigned_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80096a4: 37 9c ff e8 addi sp,sp,-24
80096a8: 5b 8b 00 14 sw (sp+20),r11
80096ac: 5b 8c 00 10 sw (sp+16),r12
80096b0: 5b 8d 00 0c sw (sp+12),r13
80096b4: 5b 8e 00 08 sw (sp+8),r14
80096b8: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
80096bc: 34 05 00 09 mvi r5,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80096c0: b8 20 68 00 mv r13,r1
80096c4: b8 40 58 00 mv r11,r2
80096c8: b8 60 70 00 mv r14,r3
80096cc: b8 80 60 00 mv r12,r4
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
80096d0: 44 40 00 18 be r2,r0,8009730 <rtems_string_to_unsigned_long+0x8c>
return RTEMS_INVALID_ADDRESS;
errno = 0;
80096d4: f8 00 0f 68 calli 800d474 <__errno>
80096d8: 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 );
80096dc: b9 80 18 00 mv r3,r12
if ( !n )
return RTEMS_INVALID_ADDRESS;
errno = 0;
*n = 0;
80096e0: 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 );
80096e4: b9 a0 08 00 mv r1,r13
80096e8: 37 82 00 18 addi r2,sp,24
80096ec: f8 00 1c a8 calli 801098c <strtoul>
80096f0: b8 20 60 00 mv r12,r1
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
80096f4: 45 c0 00 03 be r14,r0,8009700 <rtems_string_to_unsigned_long+0x5c>
*endptr = end;
80096f8: 2b 81 00 18 lw r1,(sp+24)
80096fc: 59 c1 00 00 sw (r14+0),r1
/* nothing was converted */
if ( end == s )
8009700: 2b 81 00 18 lw r1,(sp+24)
return RTEMS_NOT_DEFINED;
8009704: 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 )
8009708: 44 2d 00 0a be r1,r13,8009730 <rtems_string_to_unsigned_long+0x8c>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
800970c: 34 01 ff ff mvi r1,-1
8009710: 5d 81 00 06 bne r12,r1,8009728 <rtems_string_to_unsigned_long+0x84>
8009714: f8 00 0f 58 calli 800d474 <__errno>
8009718: 28 22 00 00 lw r2,(r1+0)
800971c: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
8009720: 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))
8009724: 44 41 00 03 be r2,r1,8009730 <rtems_string_to_unsigned_long+0x8c><== ALWAYS TAKEN
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
8009728: 59 6c 00 00 sw (r11+0),r12
#endif
return RTEMS_SUCCESSFUL;
800972c: 34 05 00 00 mvi r5,0
}
8009730: b8 a0 08 00 mv r1,r5
8009734: 2b 9d 00 04 lw ra,(sp+4)
8009738: 2b 8b 00 14 lw r11,(sp+20)
800973c: 2b 8c 00 10 lw r12,(sp+16)
8009740: 2b 8d 00 0c lw r13,(sp+12)
8009744: 2b 8e 00 08 lw r14,(sp+8)
8009748: 37 9c 00 18 addi sp,sp,24
800974c: c3 a0 00 00 ret
080095e0 <rtems_string_to_unsigned_long_long>:
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
80095e0: 37 9c ff e4 addi sp,sp,-28
80095e4: 5b 8b 00 18 sw (sp+24),r11
80095e8: 5b 8c 00 14 sw (sp+20),r12
80095ec: 5b 8d 00 10 sw (sp+16),r13
80095f0: 5b 8e 00 0c sw (sp+12),r14
80095f4: 5b 8f 00 08 sw (sp+8),r15
80095f8: 5b 9d 00 04 sw (sp+4),ra
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
return RTEMS_INVALID_ADDRESS;
80095fc: 34 05 00 09 mvi r5,9
#if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER)
,
int base
#endif
)
{
8009600: b8 20 70 00 mv r14,r1
8009604: b8 40 58 00 mv r11,r2
8009608: b8 60 78 00 mv r15,r3
800960c: b8 80 60 00 mv r12,r4
STRING_TO_INPUT_TYPE result;
char *end;
if ( !n )
8009610: 44 40 00 1c be r2,r0,8009680 <rtems_string_to_unsigned_long_long+0xa0>
return RTEMS_INVALID_ADDRESS;
errno = 0;
8009614: f8 00 0f 98 calli 800d474 <__errno>
8009618: 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 );
800961c: b9 80 18 00 mv r3,r12
if ( !n )
return RTEMS_INVALID_ADDRESS;
errno = 0;
*n = 0;
8009620: 59 60 00 00 sw (r11+0),r0
8009624: 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 );
8009628: b9 c0 08 00 mv r1,r14
800962c: 37 82 00 1c addi r2,sp,28
8009630: f8 00 1c e5 calli 80109c4 <strtoull>
8009634: b8 20 60 00 mv r12,r1
8009638: b8 40 68 00 mv r13,r2
#endif
/* If the user wants the end pointer back, then return it. */
if ( endptr )
800963c: 45 e0 00 03 be r15,r0,8009648 <rtems_string_to_unsigned_long_long+0x68>
*endptr = end;
8009640: 2b 81 00 1c lw r1,(sp+28)
8009644: 59 e1 00 00 sw (r15+0),r1
/* nothing was converted */
if ( end == s )
8009648: 2b 81 00 1c lw r1,(sp+28)
return RTEMS_NOT_DEFINED;
800964c: 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 )
8009650: 44 2e 00 0c be r1,r14,8009680 <rtems_string_to_unsigned_long_long+0xa0>
return RTEMS_INVALID_NUMBER;
#endif
#ifdef STRING_TO_MAX
/* there was an overflow */
if ( (result == STRING_TO_MAX) && (errno == ERANGE))
8009654: 34 01 ff ff mvi r1,-1
8009658: 5d 81 00 07 bne r12,r1,8009674 <rtems_string_to_unsigned_long_long+0x94>
800965c: 5d ac 00 06 bne r13,r12,8009674 <rtems_string_to_unsigned_long_long+0x94><== NEVER TAKEN
8009660: f8 00 0f 85 calli 800d474 <__errno>
8009664: 28 22 00 00 lw r2,(r1+0)
8009668: 34 01 00 22 mvi r1,34
return RTEMS_INVALID_NUMBER;
800966c: 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))
8009670: 44 41 00 04 be r2,r1,8009680 <rtems_string_to_unsigned_long_long+0xa0><== ALWAYS TAKEN
#endif
#if defined(STRING_TO_POINTER)
*n = (STRING_TO_TYPE) (uintptr_t)result;
#else
*n = (STRING_TO_TYPE) result;
8009674: 59 6c 00 00 sw (r11+0),r12
8009678: 59 6d 00 04 sw (r11+4),r13
#endif
return RTEMS_SUCCESSFUL;
800967c: 34 05 00 00 mvi r5,0
}
8009680: b8 a0 08 00 mv r1,r5
8009684: 2b 9d 00 04 lw ra,(sp+4)
8009688: 2b 8b 00 18 lw r11,(sp+24)
800968c: 2b 8c 00 14 lw r12,(sp+20)
8009690: 2b 8d 00 10 lw r13,(sp+16)
8009694: 2b 8e 00 0c lw r14,(sp+12)
8009698: 2b 8f 00 08 lw r15,(sp+8)
800969c: 37 9c 00 1c addi sp,sp,28
80096a0: c3 a0 00 00 ret
08000ec0 <rtems_tarfs_load>:
int rtems_tarfs_load(
char *mountpoint,
uint8_t *tar_image,
size_t tar_size
)
{
8000ec0: 37 9c fe 20 addi sp,sp,-480
8000ec4: 5b 8b 00 44 sw (sp+68),r11
8000ec8: 5b 8c 00 40 sw (sp+64),r12
8000ecc: 5b 8d 00 3c sw (sp+60),r13
8000ed0: 5b 8e 00 38 sw (sp+56),r14
8000ed4: 5b 8f 00 34 sw (sp+52),r15
8000ed8: 5b 90 00 30 sw (sp+48),r16
8000edc: 5b 91 00 2c sw (sp+44),r17
8000ee0: 5b 92 00 28 sw (sp+40),r18
8000ee4: 5b 93 00 24 sw (sp+36),r19
8000ee8: 5b 94 00 20 sw (sp+32),r20
8000eec: 5b 95 00 1c sw (sp+28),r21
8000ef0: 5b 96 00 18 sw (sp+24),r22
8000ef4: 5b 97 00 14 sw (sp+20),r23
8000ef8: 5b 98 00 10 sw (sp+16),r24
8000efc: 5b 99 00 0c sw (sp+12),r25
8000f00: 5b 9b 00 08 sw (sp+8),fp
8000f04: 5b 9d 00 04 sw (sp+4),ra
8000f08: b8 20 98 00 mv r19,r1
8000f0c: b8 40 a0 00 mv r20,r2
8000f10: 5b 83 00 50 sw (sp+80),r3
int offset;
unsigned long nblocks;
IMFS_jnode_t *node;
int status;
status = rtems_filesystem_evaluate_path(
8000f14: f8 00 43 49 calli 8011c38 <strlen>
8000f18: b8 20 10 00 mv r2,r1
8000f1c: 34 03 00 00 mvi r3,0
8000f20: ba 60 08 00 mv r1,r19
8000f24: 37 84 01 cc addi r4,sp,460
8000f28: 34 05 00 00 mvi r5,0
8000f2c: f8 00 03 3d calli 8001c20 <rtems_filesystem_evaluate_path>
8000f30: b8 20 60 00 mv r12,r1
strlen(mountpoint),
0,
&root_loc,
0
);
if (status != 0)
8000f34: 5c 20 00 71 bne r1,r0,80010f8 <rtems_tarfs_load+0x238>
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
8000f38: 2b 81 01 d8 lw r1,(sp+472)
8000f3c: 78 04 08 02 mvhi r4,0x802
8000f40: 38 84 0d d8 ori r4,r4,0xdd8
8000f44: 34 0b 00 00 mvi r11,0
8000f48: 44 24 00 08 be r1,r4,8000f68 <rtems_tarfs_load+0xa8>
8000f4c: 78 04 08 02 mvhi r4,0x802
8000f50: 38 84 16 50 ori r4,r4,0x1650
8000f54: b9 80 58 00 mv r11,r12
8000f58: 5c 24 00 68 bne r1,r4,80010f8 <rtems_tarfs_load+0x238> <== ALWAYS TAKEN
8000f5c: e0 00 00 03 bi 8000f68 <rtems_tarfs_load+0xa8> <== NOT EXECUTED
8000f60: b9 c0 58 00 mv r11,r14
8000f64: e0 00 00 0c bi 8000f94 <rtems_tarfs_load+0xd4>
/*
* Read a header.
*/
hdr_ptr = (char *) &tar_image[offset];
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
8000f68: 78 11 08 02 mvhi r17,0x802
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
strcpy(full_filename, mountpoint);
if (full_filename[strlen(full_filename)-1] != '/')
strcat(full_filename, "/");
8000f6c: 78 0f 08 01 mvhi r15,0x801
/*
* Read a header.
*/
hdr_ptr = (char *) &tar_image[offset];
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
8000f70: 3a 31 0e 20 ori r17,r17,0xe20
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
8000f74: 37 90 01 54 addi r16,sp,340
* IMFS_create_node was ONLY passed a NULL when we created the
* root node. We added a new IMFS_create_root_node() so this
* path no longer existed. The result was simpler code which
* should not have this path.
*/
else if (linkflag == REGTYPE) {
8000f78: 34 1b 00 30 mvi fp,48
const char *name;
loc = root_loc;
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
8000f7c: 37 92 01 b8 addi r18,sp,440
);
node->info.linearfile.size = file_size;
node->info.linearfile.direct = &tar_image[offset];
}
nblocks = (((file_size) + 511) & ~511) / 512;
8000f80: 34 19 fe 00 mvi r25,-512
* - For directories, just create directories as usual. IMFS
* will take care of the rest.
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
strcpy(full_filename, mountpoint);
8000f84: 37 8d 00 54 addi r13,sp,84
if (full_filename[strlen(full_filename)-1] != '/')
8000f88: 37 98 00 53 addi r24,sp,83
8000f8c: 34 17 00 2f mvi r23,47
strcat(full_filename, "/");
8000f90: 39 ef e2 74 ori r15,r15,0xe274
/*
* Create an IMFS node structure pointing to tar image memory.
*/
offset = 0;
while (1) {
if (offset + 512 > tar_size)
8000f94: 2b 81 00 50 lw r1,(sp+80)
8000f98: 35 6e 02 00 addi r14,r11,512
8000f9c: 55 c1 00 58 bgu r14,r1,80010fc <rtems_tarfs_load+0x23c> <== NEVER TAKEN
break;
/*
* Read a header.
*/
hdr_ptr = (char *) &tar_image[offset];
8000fa0: b6 8b 58 00 add r11,r20,r11
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
8000fa4: 35 61 01 01 addi r1,r11,257
8000fa8: ba 20 10 00 mv r2,r17
8000fac: 34 03 00 05 mvi r3,5
8000fb0: f8 00 43 51 calli 8011cf4 <strncmp>
8000fb4: 5c 20 00 52 bne r1,r0,80010fc <rtems_tarfs_load+0x23c> <== NEVER TAKEN
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
8000fb8: 34 03 00 63 mvi r3,99
8000fbc: b9 60 10 00 mv r2,r11
8000fc0: ba 00 08 00 mv r1,r16
8000fc4: f8 00 43 99 calli 8011e28 <strncpy>
filename[MAX_NAME_FIELD_SIZE] = '\0';
linkflag = hdr_ptr[156];
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
8000fc8: 34 02 00 08 mvi r2,8
offset += 512;
if (strncmp(&hdr_ptr[257], "ustar", 5))
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
filename[MAX_NAME_FIELD_SIZE] = '\0';
8000fcc: 33 80 01 b7 sb (sp+439),r0
linkflag = hdr_ptr[156];
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
8000fd0: 35 61 00 64 addi r1,r11,100
break;
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
filename[MAX_NAME_FIELD_SIZE] = '\0';
linkflag = hdr_ptr[156];
8000fd4: 41 76 00 9c lbu r22,(r11+156)
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
8000fd8: f8 00 1a 11 calli 800781c <_rtems_octal2ulong>
8000fdc: 5b 81 00 4c sw (sp+76),r1
file_size = _rtems_octal2ulong(&hdr_ptr[124], 12);
8000fe0: 34 02 00 0c mvi r2,12
8000fe4: 35 61 00 7c addi r1,r11,124
8000fe8: f8 00 1a 0d calli 800781c <_rtems_octal2ulong>
hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8);
8000fec: 34 02 00 08 mvi r2,8
strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE);
filename[MAX_NAME_FIELD_SIZE] = '\0';
linkflag = hdr_ptr[156];
file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8);
file_size = _rtems_octal2ulong(&hdr_ptr[124], 12);
8000ff0: b8 20 a8 00 mv r21,r1
hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8);
8000ff4: 35 61 00 94 addi r1,r11,148
8000ff8: f8 00 1a 09 calli 800781c <_rtems_octal2ulong>
8000ffc: b8 20 10 00 mv r2,r1
if (_rtems_tar_header_checksum(hdr_ptr) != hdr_chksum)
8001000: b9 60 08 00 mv r1,r11
8001004: 5b 82 00 48 sw (sp+72),r2
8001008: f8 00 1a 24 calli 8007898 <_rtems_tar_header_checksum>
800100c: 2b 82 00 48 lw r2,(sp+72)
8001010: 5c 22 00 3b bne r1,r2,80010fc <rtems_tarfs_load+0x23c> <== NEVER TAKEN
* Generate an IMFS node depending on the file type.
* - For directories, just create directories as usual. IMFS
* will take care of the rest.
* - For files, create a file node with special tarfs properties.
*/
if (linkflag == DIRTYPE) {
8001014: 34 01 00 35 mvi r1,53
8001018: 5e c1 00 13 bne r22,r1,8001064 <rtems_tarfs_load+0x1a4>
strcpy(full_filename, mountpoint);
800101c: ba 60 10 00 mv r2,r19
8001020: b9 a0 08 00 mv r1,r13
8001024: f8 00 41 d1 calli 8011768 <strcpy>
if (full_filename[strlen(full_filename)-1] != '/')
8001028: b9 a0 08 00 mv r1,r13
800102c: f8 00 43 03 calli 8011c38 <strlen>
8001030: b7 01 08 00 add r1,r24,r1
8001034: 40 21 00 00 lbu r1,(r1+0)
8001038: 44 37 00 04 be r1,r23,8001048 <rtems_tarfs_load+0x188> <== ALWAYS TAKEN
strcat(full_filename, "/");
800103c: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED
8001040: b9 e0 10 00 mv r2,r15 <== NOT EXECUTED
8001044: f8 00 41 72 calli 801160c <strcat> <== NOT EXECUTED
strcat(full_filename, filename);
8001048: ba 00 10 00 mv r2,r16
800104c: b9 a0 08 00 mv r1,r13
8001050: f8 00 41 6f calli 801160c <strcat>
mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO);
8001054: b9 a0 08 00 mv r1,r13
8001058: 34 02 01 ff mvi r2,511
800105c: f8 00 05 9b calli 80026c8 <mkdir>
8001060: e3 ff ff c0 bi 8000f60 <rtems_tarfs_load+0xa0>
* IMFS_create_node was ONLY passed a NULL when we created the
* root node. We added a new IMFS_create_root_node() so this
* path no longer existed. The result was simpler code which
* should not have this path.
*/
else if (linkflag == REGTYPE) {
8001064: 5e db ff bf bne r22,fp,8000f60 <rtems_tarfs_load+0xa0> <== NEVER TAKEN
const char *name;
loc = root_loc;
8001068: 2b 81 01 cc lw r1,(sp+460)
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
800106c: ba 40 10 00 mv r2,r18
8001070: 37 83 01 e0 addi r3,sp,480
* should not have this path.
*/
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
8001074: 5b 81 01 b8 sw (sp+440),r1
8001078: 2b 81 01 d0 lw r1,(sp+464)
800107c: 5b 81 01 bc sw (sp+444),r1
8001080: 2b 81 01 d4 lw r1,(sp+468)
8001084: 5b 81 01 c0 sw (sp+448),r1
8001088: 2b 81 01 d8 lw r1,(sp+472)
800108c: 5b 81 01 c4 sw (sp+452),r1
8001090: 2b 81 01 dc lw r1,(sp+476)
8001094: 5b 81 01 c8 sw (sp+456),r1
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
8001098: ba 00 08 00 mv r1,r16
800109c: f8 00 1d bc calli 800878c <IMFS_evaluate_for_make>
80010a0: 5c 20 00 0e bne r1,r0,80010d8 <rtems_tarfs_load+0x218> <== NEVER TAKEN
node = IMFS_create_node(
&loc,
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
80010a4: 2b 81 00 4c lw r1,(sp+76)
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
node = IMFS_create_node(
80010a8: 2b 83 01 e0 lw r3,(sp+480)
80010ac: 34 02 00 06 mvi r2,6
&loc,
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
80010b0: 20 24 01 ff andi r4,r1,0x1ff
else if (linkflag == REGTYPE) {
const char *name;
loc = root_loc;
if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) {
node = IMFS_create_node(
80010b4: 38 84 80 00 ori r4,r4,0x8000
80010b8: ba 40 08 00 mv r1,r18
80010bc: 34 05 00 00 mvi r5,0
80010c0: f8 00 1b c1 calli 8007fc4 <IMFS_create_node>
80010c4: b8 20 20 00 mv r4,r1
&loc,
IMFS_LINEAR_FILE, (char *)name,
(file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG,
NULL
);
node->info.linearfile.size = file_size;
80010c8: 58 20 00 50 sw (r1+80),r0
80010cc: 58 35 00 54 sw (r1+84),r21
node->info.linearfile.direct = &tar_image[offset];
80010d0: b6 8e 08 00 add r1,r20,r14
80010d4: 58 81 00 58 sw (r4+88),r1
}
nblocks = (((file_size) + 511) & ~511) / 512;
80010d8: 36 a1 01 ff addi r1,r21,511
80010dc: 34 02 00 09 mvi r2,9
80010e0: a0 39 08 00 and r1,r1,r25
80010e4: f8 00 71 c5 calli 801d7f8 <__lshrsi3>
offset += 512 * nblocks;
80010e8: 34 02 00 09 mvi r2,9
80010ec: f8 00 71 75 calli 801d6c0 <__ashlsi3>
80010f0: b4 2e 70 00 add r14,r1,r14
80010f4: e3 ff ff 9b bi 8000f60 <rtems_tarfs_load+0xa0>
);
if (status != 0)
return -1;
if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops)
return -1;
80010f8: 34 0c ff ff mvi r12,-1
nblocks = (((file_size) + 511) & ~511) / 512;
offset += 512 * nblocks;
}
}
return status;
}
80010fc: b9 80 08 00 mv r1,r12
8001100: 2b 9d 00 04 lw ra,(sp+4)
8001104: 2b 8b 00 44 lw r11,(sp+68)
8001108: 2b 8c 00 40 lw r12,(sp+64)
800110c: 2b 8d 00 3c lw r13,(sp+60)
8001110: 2b 8e 00 38 lw r14,(sp+56)
8001114: 2b 8f 00 34 lw r15,(sp+52)
8001118: 2b 90 00 30 lw r16,(sp+48)
800111c: 2b 91 00 2c lw r17,(sp+44)
8001120: 2b 92 00 28 lw r18,(sp+40)
8001124: 2b 93 00 24 lw r19,(sp+36)
8001128: 2b 94 00 20 lw r20,(sp+32)
800112c: 2b 95 00 1c lw r21,(sp+28)
8001130: 2b 96 00 18 lw r22,(sp+24)
8001134: 2b 97 00 14 lw r23,(sp+20)
8001138: 2b 98 00 10 lw r24,(sp+16)
800113c: 2b 99 00 0c lw r25,(sp+12)
8001140: 2b 9b 00 08 lw fp,(sp+8)
8001144: 37 9c 01 e0 addi sp,sp,480
8001148: c3 a0 00 00 ret
0800def0 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
800def0: 37 9c ff e0 addi sp,sp,-32
800def4: 5b 8b 00 20 sw (sp+32),r11
800def8: 5b 8c 00 1c sw (sp+28),r12
800defc: 5b 8d 00 18 sw (sp+24),r13
800df00: 5b 8e 00 14 sw (sp+20),r14
800df04: 5b 8f 00 10 sw (sp+16),r15
800df08: 5b 90 00 0c sw (sp+12),r16
800df0c: 5b 91 00 08 sw (sp+8),r17
800df10: 5b 9d 00 04 sw (sp+4),ra
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
800df14: 34 04 00 09 mvi r4,9
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
800df18: b8 20 68 00 mv r13,r1
800df1c: b8 40 70 00 mv r14,r2
800df20: b8 60 80 00 mv r16,r3
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
800df24: 44 60 00 51 be r3,r0,800e068 <rtems_task_mode+0x178>
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
800df28: 78 01 08 01 mvhi r1,0x801
800df2c: 38 21 9d f0 ori r1,r1,0x9df0
800df30: 28 2c 00 0c lw r12,(r1+12)
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
800df34: 41 8f 00 74 lbu r15,(r12+116)
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
800df38: 29 81 00 7c lw r1,(r12+124)
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
800df3c: 29 8b 01 1c lw r11,(r12+284)
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
800df40: 65 ef 00 00 cmpei r15,r15,0
800df44: c8 0f 78 00 sub r15,r0,r15
800df48: 21 ef 01 00 andi r15,r15,0x100
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
800df4c: 44 20 00 02 be r1,r0,800df54 <rtems_task_mode+0x64>
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
800df50: 39 ef 02 00 ori r15,r15,0x200
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
800df54: 41 71 00 08 lbu r17,(r11+8)
old_mode |= _ISR_Get_level();
800df58: fb ff e7 fd calli 8007f4c <_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;
800df5c: 66 31 00 00 cmpei r17,r17,0
800df60: c8 11 88 00 sub r17,r0,r17
800df64: 22 31 04 00 andi r17,r17,0x400
800df68: ba 21 08 00 or r1,r17,r1
old_mode |= _ISR_Get_level();
800df6c: b8 2f 78 00 or r15,r1,r15
*previous_mode_set = old_mode;
800df70: 5a 0f 00 00 sw (r16+0),r15
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
800df74: 21 c1 01 00 andi r1,r14,0x100
800df78: 44 20 00 04 be r1,r0,800df88 <rtems_task_mode+0x98>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_preempt (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT;
800df7c: 21 a1 01 00 andi r1,r13,0x100
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
800df80: 64 21 00 00 cmpei r1,r1,0
800df84: 31 81 00 74 sb (r12+116),r1
if ( mask & RTEMS_TIMESLICE_MASK ) {
800df88: 21 c1 02 00 andi r1,r14,0x200
800df8c: 44 20 00 0b be r1,r0,800dfb8 <rtems_task_mode+0xc8>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_timeslice (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE;
800df90: 21 a1 02 00 andi r1,r13,0x200
if ( _Modes_Is_timeslice(mode_set) ) {
800df94: 44 20 00 08 be r1,r0,800dfb4 <rtems_task_mode+0xc4>
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
800df98: 34 01 00 01 mvi r1,1
800df9c: 59 81 00 7c sw (r12+124),r1
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
800dfa0: 78 01 08 01 mvhi r1,0x801
800dfa4: 38 21 98 b8 ori r1,r1,0x98b8
800dfa8: 28 21 00 00 lw r1,(r1+0)
800dfac: 59 81 00 78 sw (r12+120),r1
800dfb0: e0 00 00 02 bi 800dfb8 <rtems_task_mode+0xc8>
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
800dfb4: 59 80 00 7c sw (r12+124),r0
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
800dfb8: 21 c1 00 01 andi r1,r14,0x1
800dfbc: 44 20 00 04 be r1,r0,800dfcc <rtems_task_mode+0xdc>
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
800dfc0: 21 a1 00 01 andi r1,r13,0x1
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
800dfc4: 64 21 00 00 cmpei r1,r1,0
800dfc8: 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 ) {
800dfcc: 21 ce 04 00 andi r14,r14,0x400
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
800dfd0: 34 03 00 00 mvi r3,0
if ( mask & RTEMS_ASR_MASK ) {
800dfd4: 45 c0 00 11 be r14,r0,800e018 <rtems_task_mode+0x128>
*/
RTEMS_INLINE_ROUTINE bool _Modes_Is_asr_disabled (
Modes_Control mode_set
)
{
return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR;
800dfd8: 21 ad 04 00 andi r13,r13,0x400
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
800dfdc: 41 61 00 08 lbu r1,(r11+8)
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
800dfe0: 65 ad 00 00 cmpei r13,r13,0
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
800dfe4: 44 2d 00 0d be r1,r13,800e018 <rtems_task_mode+0x128>
asr->is_enabled = is_asr_enabled;
800dfe8: 31 6d 00 08 sb (r11+8),r13
)
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
800dfec: 90 00 08 00 rcsr r1,IE
800dff0: 34 02 ff fe mvi r2,-2
800dff4: a0 22 10 00 and r2,r1,r2
800dff8: d0 02 00 00 wcsr IE,r2
_signals = information->signals_pending;
800dffc: 29 62 00 18 lw r2,(r11+24)
information->signals_pending = information->signals_posted;
800e000: 29 63 00 14 lw r3,(r11+20)
information->signals_posted = _signals;
800e004: 59 62 00 14 sw (r11+20),r2
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
_signals = information->signals_pending;
information->signals_pending = information->signals_posted;
800e008: 59 63 00 18 sw (r11+24),r3
information->signals_posted = _signals;
_ISR_Enable( _level );
800e00c: d0 01 00 00 wcsr IE,r1
_ASR_Swap_signals( asr );
if ( _ASR_Are_signals_pending( asr ) ) {
800e010: 29 63 00 14 lw r3,(r11+20)
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
800e014: 7c 63 00 00 cmpnei r3,r3,0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
800e018: 78 01 08 01 mvhi r1,0x801
800e01c: 38 21 9a 98 ori r1,r1,0x9a98
800e020: 28 22 00 00 lw r2,(r1+0)
800e024: 34 01 00 03 mvi r1,3
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
800e028: 34 04 00 00 mvi r4,0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
800e02c: 5c 41 00 0f bne r2,r1,800e068 <rtems_task_mode+0x178> <== NEVER TAKEN
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
800e030: 78 01 08 01 mvhi r1,0x801
800e034: 38 21 9d f0 ori r1,r1,0x9df0
800e038: 28 22 00 0c lw r2,(r1+12)
if ( are_signals_pending ||
800e03c: 5c 60 00 05 bne r3,r0,800e050 <rtems_task_mode+0x160>
800e040: 28 21 00 10 lw r1,(r1+16)
800e044: 44 41 00 09 be r2,r1,800e068 <rtems_task_mode+0x178>
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
800e048: 40 41 00 74 lbu r1,(r2+116)
800e04c: 44 20 00 07 be r1,r0,800e068 <rtems_task_mode+0x178> <== NEVER TAKEN
_Thread_Dispatch_necessary = true;
800e050: 78 01 08 01 mvhi r1,0x801
800e054: 38 21 9d f0 ori r1,r1,0x9df0
800e058: 34 02 00 01 mvi r2,1
800e05c: 30 22 00 18 sb (r1+24),r2
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
800e060: fb ff e1 d6 calli 80067b8 <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
800e064: 34 04 00 00 mvi r4,0
}
800e068: b8 80 08 00 mv r1,r4
800e06c: 2b 9d 00 04 lw ra,(sp+4)
800e070: 2b 8b 00 20 lw r11,(sp+32)
800e074: 2b 8c 00 1c lw r12,(sp+28)
800e078: 2b 8d 00 18 lw r13,(sp+24)
800e07c: 2b 8e 00 14 lw r14,(sp+20)
800e080: 2b 8f 00 10 lw r15,(sp+16)
800e084: 2b 90 00 0c lw r16,(sp+12)
800e088: 2b 91 00 08 lw r17,(sp+8)
800e08c: 37 9c 00 20 addi sp,sp,32
800e090: c3 a0 00 00 ret
080055b8 <rtems_task_set_note>:
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
80055b8: 37 9c ff ec addi sp,sp,-20
80055bc: 5b 8b 00 10 sw (sp+16),r11
80055c0: 5b 8c 00 0c sw (sp+12),r12
80055c4: 5b 8d 00 08 sw (sp+8),r13
80055c8: 5b 9d 00 04 sw (sp+4),ra
80055cc: b8 40 58 00 mv r11,r2
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
80055d0: 78 02 08 02 mvhi r2,0x802
80055d4: 38 42 50 8c ori r2,r2,0x508c
80055d8: 40 42 00 04 lbu r2,(r2+4)
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
80055dc: b8 60 60 00 mv r12,r3
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
80055e0: 34 04 00 16 mvi r4,22
{
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
80055e4: 44 40 00 21 be r2,r0,8005668 <rtems_task_set_note+0xb0> <== NEVER TAKEN
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
80055e8: 34 02 00 0f mvi r2,15
return RTEMS_INVALID_NUMBER;
80055ec: 34 04 00 0a mvi r4,10
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
80055f0: 55 62 00 1e bgu r11,r2,8005668 <rtems_task_set_note+0xb0>
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
80055f4: 44 20 00 06 be r1,r0,800560c <rtems_task_set_note+0x54>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
80055f8: 78 02 08 02 mvhi r2,0x802
80055fc: 38 42 60 58 ori r2,r2,0x6058
8005600: 28 42 00 0c lw r2,(r2+12)
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
8005604: 28 42 00 08 lw r2,(r2+8)
8005608: 5c 22 00 0b bne r1,r2,8005634 <rtems_task_set_note+0x7c>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
800560c: 78 01 08 02 mvhi r1,0x802
8005610: 38 21 60 58 ori r1,r1,0x6058
8005614: 28 21 00 0c lw r1,(r1+12)
api->Notepads[ notepad ] = note;
8005618: 34 02 00 02 mvi r2,2
800561c: 28 2d 01 1c lw r13,(r1+284)
8005620: 35 61 00 08 addi r1,r11,8
8005624: fb ff f3 45 calli 8002338 <__ashlsi3>
8005628: b5 a1 08 00 add r1,r13,r1
800562c: 58 2c 00 00 sw (r1+0),r12
8005630: e0 00 00 0d bi 8005664 <rtems_task_set_note+0xac>
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
8005634: 37 82 00 14 addi r2,sp,20
8005638: f8 00 0a a7 calli 80080d4 <_Thread_Get>
switch ( location ) {
800563c: 2b 82 00 14 lw r2,(sp+20)
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8005640: 34 04 00 04 mvi r4,4
api->Notepads[ notepad ] = note;
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
switch ( location ) {
8005644: 5c 40 00 09 bne r2,r0,8005668 <rtems_task_set_note+0xb0>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
8005648: 28 2d 01 1c lw r13,(r1+284)
800564c: 34 02 00 02 mvi r2,2
8005650: 35 61 00 08 addi r1,r11,8
8005654: fb ff f3 39 calli 8002338 <__ashlsi3>
8005658: b5 a1 08 00 add r1,r13,r1
800565c: 58 2c 00 00 sw (r1+0),r12
_Thread_Enable_dispatch();
8005660: f8 00 0a 90 calli 80080a0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8005664: 34 04 00 00 mvi r4,0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
8005668: b8 80 08 00 mv r1,r4
800566c: 2b 9d 00 04 lw ra,(sp+4)
8005670: 2b 8b 00 10 lw r11,(sp+16)
8005674: 2b 8c 00 0c lw r12,(sp+12)
8005678: 2b 8d 00 08 lw r13,(sp+8)
800567c: 37 9c 00 14 addi sp,sp,20
8005680: c3 a0 00 00 ret
08008480 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
8008480: 37 9c ff f0 addi sp,sp,-16
8008484: 5b 8b 00 0c sw (sp+12),r11
8008488: 5b 8c 00 08 sw (sp+8),r12
800848c: 5b 9d 00 04 sw (sp+4),ra
8008490: b8 40 58 00 mv r11,r2
8008494: b8 60 60 00 mv r12,r3
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
8008498: 44 40 00 06 be r2,r0,80084b0 <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 ) );
800849c: 78 02 08 01 mvhi r2,0x801
80084a0: 38 42 a0 c0 ori r2,r2,0xa0c0
80084a4: 40 43 00 00 lbu r3,(r2+0)
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
80084a8: 34 02 00 13 mvi r2,19
)
{
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
80084ac: 55 63 00 16 bgu r11,r3,8008504 <rtems_task_set_priority+0x84>
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
80084b0: 34 02 00 09 mvi r2,9
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
80084b4: 45 80 00 14 be r12,r0,8008504 <rtems_task_set_priority+0x84>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
80084b8: 37 82 00 10 addi r2,sp,16
80084bc: f8 00 0a 8b calli 800aee8 <_Thread_Get>
switch ( location ) {
80084c0: 2b 82 00 10 lw r2,(sp+16)
80084c4: 5c 40 00 0f bne r2,r0,8008500 <rtems_task_set_priority+0x80>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
80084c8: 28 23 00 14 lw r3,(r1+20)
80084cc: 59 83 00 00 sw (r12+0),r3
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
80084d0: 45 62 00 09 be r11,r2,80084f4 <rtems_task_set_priority+0x74>
the_thread->real_priority = new_priority;
if ( the_thread->resource_count == 0 ||
80084d4: 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;
80084d8: 58 2b 00 18 sw (r1+24),r11
if ( the_thread->resource_count == 0 ||
80084dc: 44 40 00 03 be r2,r0,80084e8 <rtems_task_set_priority+0x68>
80084e0: 28 22 00 14 lw r2,(r1+20)
80084e4: 51 62 00 04 bgeu r11,r2,80084f4 <rtems_task_set_priority+0x74><== ALWAYS TAKEN
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
80084e8: b9 60 10 00 mv r2,r11
80084ec: 34 03 00 00 mvi r3,0
80084f0: f8 00 09 22 calli 800a978 <_Thread_Change_priority>
}
_Thread_Enable_dispatch();
80084f4: f8 00 0a 70 calli 800aeb4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
80084f8: 34 02 00 00 mvi r2,0
80084fc: e0 00 00 02 bi 8008504 <rtems_task_set_priority+0x84>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8008500: 34 02 00 04 mvi r2,4
}
8008504: b8 40 08 00 mv r1,r2
8008508: 2b 9d 00 04 lw ra,(sp+4)
800850c: 2b 8b 00 0c lw r11,(sp+12)
8008510: 2b 8c 00 08 lw r12,(sp+8)
8008514: 37 9c 00 10 addi sp,sp,16
8008518: c3 a0 00 00 ret
080046c0 <rtems_termios_baud_to_index>:
#include <rtems/termiostypes.h>
int rtems_termios_baud_to_index(
rtems_termios_baud_t termios_baud
)
{
80046c0: b8 20 10 00 mv r2,r1
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
80046c4: 34 01 00 09 mvi r1,9
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
80046c8: 44 41 00 38 be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
80046cc: 48 41 00 19 bg r2,r1,8004730 <rtems_termios_baud_to_index+0x70>
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
80046d0: 34 01 00 04 mvi r1,4
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
80046d4: 44 41 00 35 be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
80046d8: 48 41 00 0c bg r2,r1,8004708 <rtems_termios_baud_to_index+0x48>
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
80046dc: 34 01 00 01 mvi r1,1
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
80046e0: 44 41 00 32 be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
80046e4: 48 41 00 04 bg r2,r1,80046f4 <rtems_termios_baud_to_index+0x34>
case B0: baud_index = 0; break;
80046e8: 34 01 00 00 mvi r1,0
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
80046ec: 5c 40 00 2e bne r2,r0,80047a4 <rtems_termios_baud_to_index+0xe4>
80046f0: c3 a0 00 00 ret
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
80046f4: 34 01 00 02 mvi r1,2
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
80046f8: 44 41 00 2c be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
80046fc: 34 01 00 03 mvi r1,3
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004700: 5c 41 00 29 bne r2,r1,80047a4 <rtems_termios_baud_to_index+0xe4><== NEVER TAKEN
8004704: c3 a0 00 00 ret
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
8004708: 34 01 00 06 mvi r1,6
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
800470c: 44 41 00 27 be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
8004710: 34 03 00 06 mvi r3,6
case B0: baud_index = 0; break;
case B50: baud_index = 1; break;
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
8004714: 34 01 00 05 mvi r1,5
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004718: 48 62 00 24 bg r3,r2,80047a8 <rtems_termios_baud_to_index+0xe8>
case B75: baud_index = 2; break;
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
800471c: 34 01 00 07 mvi r1,7
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004720: 44 41 00 22 be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
case B110: baud_index = 3; break;
case B134: baud_index = 4; break;
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
8004724: 34 01 00 08 mvi r1,8
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004728: 5c 41 00 1f bne r2,r1,80047a4 <rtems_termios_baud_to_index+0xe4><== NEVER TAKEN
800472c: c3 a0 00 00 ret
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
8004730: 34 01 00 0e mvi r1,14
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004734: 44 41 00 1d be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
8004738: 48 41 00 0b bg r2,r1,8004764 <rtems_termios_baud_to_index+0xa4>
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
800473c: 34 01 00 0b mvi r1,11
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004740: 44 41 00 1a be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
8004744: 34 03 00 0b mvi r3,11
case B150: baud_index = 5; break;
case B200: baud_index = 6; break;
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
8004748: 34 01 00 0a mvi r1,10
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
800474c: 48 62 00 17 bg r3,r2,80047a8 <rtems_termios_baud_to_index+0xe8>
case B300: baud_index = 7; break;
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
8004750: 34 01 00 0c mvi r1,12
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004754: 44 41 00 15 be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
case B600: baud_index = 8; break;
case B1200: baud_index = 9; break;
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
8004758: 34 01 00 0d mvi r1,13
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
800475c: 5c 41 00 12 bne r2,r1,80047a4 <rtems_termios_baud_to_index+0xe4><== NEVER TAKEN
8004760: c3 a0 00 00 ret
8004764: 34 03 10 02 mvi r3,4098
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
8004768: 34 01 00 11 mvi r1,17
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
800476c: 44 43 00 0f be r2,r3,80047a8 <rtems_termios_baud_to_index+0xe8>
8004770: 48 43 00 07 bg r2,r3,800478c <rtems_termios_baud_to_index+0xcc>
case B1800: baud_index = 10; break;
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
8004774: 34 01 00 0f mvi r1,15
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004778: 44 41 00 0c be r2,r1,80047a8 <rtems_termios_baud_to_index+0xe8>
800477c: 34 03 10 01 mvi r3,4097
case B2400: baud_index = 11; break;
case B4800: baud_index = 12; break;
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
8004780: 34 01 00 10 mvi r1,16
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004784: 5c 43 00 08 bne r2,r3,80047a4 <rtems_termios_baud_to_index+0xe4><== NEVER TAKEN
8004788: c3 a0 00 00 ret
800478c: 34 03 10 03 mvi r3,4099
case B9600: baud_index = 13; break;
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
8004790: 34 01 00 12 mvi r1,18
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
8004794: 44 43 00 05 be r2,r3,80047a8 <rtems_termios_baud_to_index+0xe8>
8004798: 34 03 10 04 mvi r3,4100
case B19200: baud_index = 14; break;
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
800479c: 34 01 00 13 mvi r1,19
rtems_termios_baud_t termios_baud
)
{
int baud_index;
switch (termios_baud) {
80047a0: 44 43 00 02 be r2,r3,80047a8 <rtems_termios_baud_to_index+0xe8><== ALWAYS TAKEN
case B38400: baud_index = 15; break;
case B57600: baud_index = 16; break;
case B115200: baud_index = 17; break;
case B230400: baud_index = 18; break;
case B460800: baud_index = 19; break;
default: baud_index = -1; break;
80047a4: 34 01 ff ff mvi r1,-1
}
return baud_index;
}
80047a8: c3 a0 00 00 ret
08004dcc <rtems_termios_close>:
}
}
rtems_status_code
rtems_termios_close (void *arg)
{
8004dcc: 37 9c ff ec addi sp,sp,-20
8004dd0: 5b 8b 00 14 sw (sp+20),r11
8004dd4: 5b 8c 00 10 sw (sp+16),r12
8004dd8: 5b 8d 00 0c sw (sp+12),r13
8004ddc: 5b 8e 00 08 sw (sp+8),r14
8004de0: 5b 9d 00 04 sw (sp+4),ra
8004de4: b8 20 70 00 mv r14,r1
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8004de8: 28 21 00 00 lw r1,(r1+0)
rtems_status_code sc;
sc = rtems_semaphore_obtain(
8004dec: 78 02 08 02 mvhi r2,0x802
8004df0: 38 42 3a e0 ori r2,r2,0x3ae0
rtems_status_code
rtems_termios_close (void *arg)
{
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8004df4: 28 2b 00 38 lw r11,(r1+56)
rtems_status_code sc;
sc = rtems_semaphore_obtain(
8004df8: 28 41 00 00 lw r1,(r2+0)
8004dfc: 34 03 00 00 mvi r3,0
8004e00: 34 02 00 00 mvi r2,0
8004e04: f8 00 08 c1 calli 8007108 <rtems_semaphore_obtain>
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
8004e08: 5c 20 00 25 bne r1,r0,8004e9c <rtems_termios_close+0xd0> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
if (--tty->refcount == 0) {
8004e0c: 29 6d 00 08 lw r13,(r11+8)
8004e10: 35 ad ff ff addi r13,r13,-1
8004e14: 59 6d 00 08 sw (r11+8),r13
8004e18: 5d a1 00 51 bne r13,r1,8004f5c <rtems_termios_close+0x190> <== NEVER TAKEN
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
8004e1c: 29 61 00 cc lw r1,(r11+204)
8004e20: 78 0c 08 02 mvhi r12,0x802
8004e24: 34 02 00 05 mvi r2,5
8004e28: 39 8c 39 14 ori r12,r12,0x3914
8004e2c: fb ff f3 5c calli 8001b9c <__ashlsi3>
8004e30: b5 81 08 00 add r1,r12,r1
8004e34: 28 2c 00 04 lw r12,(r1+4)
8004e38: 45 8d 00 04 be r12,r13,8004e48 <rtems_termios_close+0x7c>
/*
* call discipline-specific close
*/
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
8004e3c: b9 60 08 00 mv r1,r11
8004e40: d9 80 00 00 call r12
8004e44: e0 00 00 0a bi 8004e6c <rtems_termios_close+0xa0>
} else {
/*
* default: just flush output buffer
*/
sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8004e48: 29 61 00 18 lw r1,(r11+24)
8004e4c: 34 02 00 00 mvi r2,0
8004e50: 34 03 00 00 mvi r3,0
8004e54: f8 00 08 ad calli 8007108 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL) {
8004e58: 5d 81 00 11 bne r12,r1,8004e9c <rtems_termios_close+0xd0> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
}
drainOutput (tty);
8004e5c: b9 60 08 00 mv r1,r11
8004e60: fb ff fe 89 calli 8004884 <drainOutput>
rtems_semaphore_release (tty->osem);
8004e64: 29 61 00 18 lw r1,(r11+24)
8004e68: f8 00 08 f8 calli 8007248 <rtems_semaphore_release>
}
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
8004e6c: 29 62 00 b4 lw r2,(r11+180)
8004e70: 34 01 00 02 mvi r1,2
8004e74: 5c 41 00 0b bne r2,r1,8004ea0 <rtems_termios_close+0xd4>
/*
* send "terminate" to I/O tasks
*/
sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT );
8004e78: 29 61 00 c4 lw r1,(r11+196)
8004e7c: 34 02 00 01 mvi r2,1
8004e80: f8 00 07 56 calli 8006bd8 <rtems_event_send>
8004e84: b8 20 60 00 mv r12,r1
if (sc != RTEMS_SUCCESSFUL)
8004e88: 5c 20 00 05 bne r1,r0,8004e9c <rtems_termios_close+0xd0> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT );
8004e8c: 29 61 00 c8 lw r1,(r11+200)
8004e90: 34 02 00 01 mvi r2,1
8004e94: f8 00 07 51 calli 8006bd8 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
8004e98: 44 2c 00 02 be r1,r12,8004ea0 <rtems_termios_close+0xd4> <== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
8004e9c: f8 00 0a 7e calli 8007894 <rtems_fatal_error_occurred> <== NOT EXECUTED
}
if (tty->device.lastClose)
8004ea0: 29 64 00 9c lw r4,(r11+156)
8004ea4: 44 80 00 05 be r4,r0,8004eb8 <rtems_termios_close+0xec> <== ALWAYS TAKEN
(*tty->device.lastClose)(tty->major, tty->minor, arg);
8004ea8: 29 61 00 0c lw r1,(r11+12) <== NOT EXECUTED
8004eac: 29 62 00 10 lw r2,(r11+16) <== NOT EXECUTED
8004eb0: b9 c0 18 00 mv r3,r14 <== NOT EXECUTED
8004eb4: d8 80 00 00 call r4 <== NOT EXECUTED
if (tty->forw == NULL) {
8004eb8: 29 62 00 00 lw r2,(r11+0)
8004ebc: 29 61 00 04 lw r1,(r11+4)
8004ec0: 5c 40 00 07 bne r2,r0,8004edc <rtems_termios_close+0x110> <== NEVER TAKEN
rtems_termios_ttyTail = tty->back;
8004ec4: 78 03 08 02 mvhi r3,0x802
8004ec8: 38 63 3a e4 ori r3,r3,0x3ae4
8004ecc: 58 61 00 00 sw (r3+0),r1
if ( rtems_termios_ttyTail != NULL ) {
8004ed0: 44 22 00 04 be r1,r2,8004ee0 <rtems_termios_close+0x114> <== ALWAYS TAKEN
rtems_termios_ttyTail->forw = NULL;
8004ed4: 58 20 00 00 sw (r1+0),r0 <== NOT EXECUTED
8004ed8: e0 00 00 02 bi 8004ee0 <rtems_termios_close+0x114> <== NOT EXECUTED
}
} else {
tty->forw->back = tty->back;
8004edc: 58 41 00 04 sw (r2+4),r1 <== NOT EXECUTED
}
if (tty->back == NULL) {
8004ee0: 29 62 00 04 lw r2,(r11+4)
8004ee4: 29 61 00 00 lw r1,(r11+0)
8004ee8: 5c 40 00 07 bne r2,r0,8004f04 <rtems_termios_close+0x138> <== NEVER TAKEN
rtems_termios_ttyHead = tty->forw;
8004eec: 78 03 08 02 mvhi r3,0x802
8004ef0: 38 63 3a e8 ori r3,r3,0x3ae8
8004ef4: 58 61 00 00 sw (r3+0),r1
if ( rtems_termios_ttyHead != NULL ) {
8004ef8: 44 22 00 04 be r1,r2,8004f08 <rtems_termios_close+0x13c> <== ALWAYS TAKEN
rtems_termios_ttyHead->back = NULL;
8004efc: 58 20 00 04 sw (r1+4),r0 <== NOT EXECUTED
8004f00: e0 00 00 02 bi 8004f08 <rtems_termios_close+0x13c> <== NOT EXECUTED
}
} else {
tty->back->forw = tty->forw;
8004f04: 58 41 00 00 sw (r2+0),r1 <== NOT EXECUTED
}
rtems_semaphore_delete (tty->isem);
8004f08: 29 61 00 14 lw r1,(r11+20)
8004f0c: f8 00 08 50 calli 800704c <rtems_semaphore_delete>
rtems_semaphore_delete (tty->osem);
8004f10: 29 61 00 18 lw r1,(r11+24)
8004f14: f8 00 08 4e calli 800704c <rtems_semaphore_delete>
rtems_semaphore_delete (tty->rawOutBuf.Semaphore);
8004f18: 29 61 00 8c lw r1,(r11+140)
8004f1c: f8 00 08 4c calli 800704c <rtems_semaphore_delete>
if ((tty->device.pollRead == NULL) ||
8004f20: 29 61 00 a0 lw r1,(r11+160)
8004f24: 44 20 00 04 be r1,r0,8004f34 <rtems_termios_close+0x168>
8004f28: 29 62 00 b4 lw r2,(r11+180)
8004f2c: 34 01 00 02 mvi r1,2
8004f30: 5c 41 00 03 bne r2,r1,8004f3c <rtems_termios_close+0x170>
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
rtems_semaphore_delete (tty->rawInBuf.Semaphore);
8004f34: 29 61 00 68 lw r1,(r11+104)
8004f38: f8 00 08 45 calli 800704c <rtems_semaphore_delete>
free (tty->rawInBuf.theBuf);
8004f3c: 29 61 00 58 lw r1,(r11+88)
8004f40: fb ff f8 a3 calli 80031cc <free>
free (tty->rawOutBuf.theBuf);
8004f44: 29 61 00 7c lw r1,(r11+124)
8004f48: fb ff f8 a1 calli 80031cc <free>
free (tty->cbuf);
8004f4c: 29 61 00 1c lw r1,(r11+28)
8004f50: fb ff f8 9f calli 80031cc <free>
free (tty);
8004f54: b9 60 08 00 mv r1,r11
8004f58: fb ff f8 9d calli 80031cc <free>
}
rtems_semaphore_release (rtems_termios_ttyMutex);
8004f5c: 78 01 08 02 mvhi r1,0x802
8004f60: 38 21 3a e0 ori r1,r1,0x3ae0
8004f64: 28 21 00 00 lw r1,(r1+0)
8004f68: f8 00 08 b8 calli 8007248 <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
}
8004f6c: 34 01 00 00 mvi r1,0
8004f70: 2b 9d 00 04 lw ra,(sp+4)
8004f74: 2b 8b 00 14 lw r11,(sp+20)
8004f78: 2b 8c 00 10 lw r12,(sp+16)
8004f7c: 2b 8d 00 0c lw r13,(sp+12)
8004f80: 2b 8e 00 08 lw r14,(sp+8)
8004f84: 37 9c 00 14 addi sp,sp,20
8004f88: c3 a0 00 00 ret
08006590 <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)
{
8006590: 37 9c ff f8 addi sp,sp,-8
8006594: 5b 8b 00 08 sw (sp+8),r11
8006598: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code sc;
/*
* sum up character count already sent
*/
tty->t_dqlen += len;
800659c: 28 24 00 90 lw r4,(r1+144)
80065a0: b4 82 10 00 add r2,r4,r2
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
80065a4: 28 24 00 b4 lw r4,(r1+180)
rtems_status_code sc;
/*
* sum up character count already sent
*/
tty->t_dqlen += len;
80065a8: 58 22 00 90 sw (r1+144),r2
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
80065ac: 34 02 00 02 mvi r2,2
80065b0: 5c 82 00 06 bne r4,r2,80065c8 <rtems_termios_dequeue_characters+0x38>
/*
* send wake up to transmitter task
*/
sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT);
80065b4: 28 21 00 c8 lw r1,(r1+200)
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
return 0; /* nothing to output in IRQ... */
80065b8: 34 0b 00 00 mvi r11,0
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
/*
* send wake up to transmitter task
*/
sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT);
80065bc: f8 00 01 87 calli 8006bd8 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
80065c0: 44 20 00 0e be r1,r0,80065f8 <rtems_termios_dequeue_characters+0x68><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
80065c4: f8 00 04 b4 calli 8007894 <rtems_fatal_error_occurred> <== NOT EXECUTED
return 0; /* nothing to output in IRQ... */
}
if (tty->t_line == PPPDISC ) {
80065c8: 28 23 00 cc lw r3,(r1+204)
80065cc: 34 02 00 05 mvi r2,5
80065d0: 5c 62 00 08 bne r3,r2,80065f0 <rtems_termios_dequeue_characters+0x60>
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
80065d4: 78 02 08 02 mvhi r2,0x802
80065d8: 38 42 39 14 ori r2,r2,0x3914
80065dc: 28 42 00 b4 lw r2,(r2+180)
rtems_termios_linesw[tty->t_line].l_start(tty);
}
return 0; /* nothing to output in IRQ... */
80065e0: 34 0b 00 00 mvi r11,0
if (tty->t_line == PPPDISC ) {
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
80065e4: 44 40 00 05 be r2,r0,80065f8 <rtems_termios_dequeue_characters+0x68><== NEVER TAKEN
rtems_termios_linesw[tty->t_line].l_start(tty);
80065e8: d8 40 00 00 call r2
80065ec: e0 00 00 03 bi 80065f8 <rtems_termios_dequeue_characters+0x68>
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
80065f0: fb ff ff 4a calli 8006318 <rtems_termios_refill_transmitter>
80065f4: b8 20 58 00 mv r11,r1
}
80065f8: b9 60 08 00 mv r1,r11
80065fc: 2b 9d 00 04 lw ra,(sp+4)
8006600: 2b 8b 00 08 lw r11,(sp+8)
8006604: 37 9c 00 08 addi sp,sp,8
8006608: c3 a0 00 00 ret
08005f78 <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)
{
8005f78: 37 9c ff bc addi sp,sp,-68
8005f7c: 5b 8b 00 44 sw (sp+68),r11
8005f80: 5b 8c 00 40 sw (sp+64),r12
8005f84: 5b 8d 00 3c sw (sp+60),r13
8005f88: 5b 8e 00 38 sw (sp+56),r14
8005f8c: 5b 8f 00 34 sw (sp+52),r15
8005f90: 5b 90 00 30 sw (sp+48),r16
8005f94: 5b 91 00 2c sw (sp+44),r17
8005f98: 5b 92 00 28 sw (sp+40),r18
8005f9c: 5b 93 00 24 sw (sp+36),r19
8005fa0: 5b 94 00 20 sw (sp+32),r20
8005fa4: 5b 95 00 1c sw (sp+28),r21
8005fa8: 5b 96 00 18 sw (sp+24),r22
8005fac: 5b 97 00 14 sw (sp+20),r23
8005fb0: 5b 98 00 10 sw (sp+16),r24
8005fb4: 5b 99 00 0c sw (sp+12),r25
8005fb8: 5b 9b 00 08 sw (sp+8),fp
8005fbc: 5b 9d 00 04 sw (sp+4),ra
8005fc0: b8 20 58 00 mv r11,r1
char c;
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
8005fc4: 28 21 00 cc lw r1,(r1+204)
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len)
{
8005fc8: b8 40 68 00 mv r13,r2
char c;
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
8005fcc: 78 0c 08 02 mvhi r12,0x802
8005fd0: 34 02 00 05 mvi r2,5
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len)
{
8005fd4: b8 60 78 00 mv r15,r3
char c;
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
8005fd8: 39 8c 39 14 ori r12,r12,0x3914
8005fdc: fb ff ee f0 calli 8001b9c <__ashlsi3>
8005fe0: b5 81 08 00 add r1,r12,r1
8005fe4: 28 21 00 10 lw r1,(r1+16)
8005fe8: b9 e0 70 00 mv r14,r15
8005fec: 5c 20 00 17 bne r1,r0,8006048 <rtems_termios_enqueue_raw_characters+0xd0>
8005ff0: 34 12 00 00 mvi r18,0
8005ff4: 34 0c 00 00 mvi r12,0
flow_rcv = true;
}
}
if (flow_rcv) {
/* restart output according to FL_ORCVXOF flag */
if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
8005ff8: 34 1b 00 20 mvi fp,32
/* disable interrupts */
rtems_interrupt_disable(level);
8005ffc: 34 11 ff fe mvi r17,-2
tty->flow_ctrl &= ~FL_OSTOP;
8006000: 34 19 ff df mvi r25,-33
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
8006004: 35 78 00 30 addi r24,r11,48
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
% tty->rawInBuf.Size) > tty->highwater) &&
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
8006008: 34 17 04 00 mvi r23,1024
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
800600c: 34 16 01 00 mvi r22,256
if ((tty->flow_ctrl & FL_OSTOP) ||
(tty->rawOutBufState == rob_idle)) {
/* if tx is stopped due to XOFF or out of data */
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
8006010: 35 75 00 4a addi r21,r11,74
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
/* VSTART received */
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
8006014: 34 14 ff ef mvi r20,-17
8006018: e0 00 00 87 bi 8006234 <rtems_termios_enqueue_raw_characters+0x2bc>
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
c = *buf++;
rtems_termios_linesw[tty->t_line].l_rint(c,tty);
800601c: 29 61 00 cc lw r1,(r11+204)
8006020: 34 02 00 05 mvi r2,5
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
c = *buf++;
8006024: 41 af 00 00 lbu r15,(r13+0)
rtems_termios_linesw[tty->t_line].l_rint(c,tty);
8006028: fb ff ee dd calli 8001b9c <__ashlsi3>
800602c: b5 81 10 00 add r2,r12,r1
8006030: 28 43 00 10 lw r3,(r2+16)
8006034: b9 e0 08 00 mv r1,r15
8006038: b9 60 10 00 mv r2,r11
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
c = *buf++;
800603c: 35 ad 00 01 addi r13,r13,1
rtems_termios_linesw[tty->t_line].l_rint(c,tty);
8006040: d8 60 00 00 call r3
8006044: 35 ce ff ff addi r14,r14,-1
int dropped = 0;
bool flow_rcv = false; /* true, if flow control char received */
rtems_interrupt_level level;
if (rtems_termios_linesw[tty->t_line].l_rint != NULL) {
while (len--) {
8006048: 5d c0 ff f5 bne r14,r0,800601c <rtems_termios_enqueue_raw_characters+0xa4>
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
800604c: 29 61 00 e4 lw r1,(r11+228)
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
}
return 0;
8006050: 34 0c 00 00 mvi r12,0
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
8006054: 5c 2c 00 7e bne r1,r12,800624c <rtems_termios_enqueue_raw_characters+0x2d4><== NEVER TAKEN
8006058: 29 63 00 dc lw r3,(r11+220)
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
}
return 0;
800605c: b9 c0 60 00 mv r12,r14
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
8006060: 44 60 00 7b be r3,r0,800624c <rtems_termios_enqueue_raw_characters+0x2d4><== NEVER TAKEN
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
8006064: 29 62 00 e0 lw r2,(r11+224)
8006068: 35 61 00 30 addi r1,r11,48
800606c: d8 60 00 00 call r3
tty->tty_rcvwakeup = 1;
8006070: 34 01 00 01 mvi r1,1
8006074: 59 61 00 e4 sw (r11+228),r1
8006078: e0 00 00 75 bi 800624c <rtems_termios_enqueue_raw_characters+0x2d4>
while (len--) {
c = *buf++;
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
800607c: 29 61 00 b8 lw r1,(r11+184)
}
return 0;
}
while (len--) {
c = *buf++;
8006080: 41 b0 00 00 lbu r16,(r13+0)
8006084: 35 ad 00 01 addi r13,r13,1
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
8006088: 20 21 02 00 andi r1,r1,0x200
800608c: 44 20 00 11 be r1,r0,80060d0 <rtems_termios_enqueue_raw_characters+0x158>
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
8006090: 41 64 00 4a lbu r4,(r11+74)
8006094: 41 63 00 49 lbu r3,(r11+73)
8006098: 5c 90 00 0a bne r4,r16,80060c0 <rtems_termios_enqueue_raw_characters+0x148>
if (c == tty->termios.c_cc[VSTART]) {
800609c: 5c 64 00 04 bne r3,r4,80060ac <rtems_termios_enqueue_raw_characters+0x134><== ALWAYS TAKEN
/* received VSTOP and VSTART==VSTOP? */
/* then toggle "stop output" status */
tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF;
80060a0: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
80060a4: 18 21 00 10 xori r1,r1,0x10 <== NOT EXECUTED
80060a8: e0 00 00 03 bi 80060b4 <rtems_termios_enqueue_raw_characters+0x13c><== NOT EXECUTED
}
else {
/* VSTOP received (other code than VSTART) */
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
80060ac: 29 61 00 b8 lw r1,(r11+184)
80060b0: 38 21 00 10 ori r1,r1,0x10
80060b4: 59 61 00 b8 sw (r11+184),r1
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len)
{
80060b8: 34 12 00 01 mvi r18,1
80060bc: e0 00 00 06 bi 80060d4 <rtems_termios_enqueue_raw_characters+0x15c>
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
}
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
80060c0: 5c 70 00 04 bne r3,r16,80060d0 <rtems_termios_enqueue_raw_characters+0x158><== ALWAYS TAKEN
/* VSTART received */
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
80060c4: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
80060c8: a0 34 08 00 and r1,r1,r20 <== NOT EXECUTED
80060cc: e3 ff ff fa bi 80060b4 <rtems_termios_enqueue_raw_characters+0x13c><== NOT EXECUTED
flow_rcv = true;
}
}
if (flow_rcv) {
80060d0: 46 40 00 15 be r18,r0,8006124 <rtems_termios_enqueue_raw_characters+0x1ac><== ALWAYS TAKEN
/* restart output according to FL_ORCVXOF flag */
if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
80060d4: 29 61 00 b8 lw r1,(r11+184)
80060d8: 20 21 00 30 andi r1,r1,0x30
80060dc: 5c 3b 00 55 bne r1,fp,8006230 <rtems_termios_enqueue_raw_characters+0x2b8><== ALWAYS TAKEN
/* disable interrupts */
rtems_interrupt_disable(level);
80060e0: 90 00 70 00 rcsr r14,IE <== NOT EXECUTED
80060e4: a1 d1 08 00 and r1,r14,r17 <== NOT EXECUTED
80060e8: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
80060ec: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
80060f0: a0 39 08 00 and r1,r1,r25 <== NOT EXECUTED
80060f4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
80060f8: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED
80060fc: 44 20 00 08 be r1,r0,800611c <rtems_termios_enqueue_raw_characters+0x1a4><== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
8006100: 29 63 00 84 lw r3,(r11+132) <== NOT EXECUTED
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
8006104: 29 62 00 7c lw r2,(r11+124) <== NOT EXECUTED
8006108: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
800610c: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8006110: b4 43 10 00 add r2,r2,r3 <== NOT EXECUTED
8006114: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006118: d8 80 00 00 call r4 <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
800611c: d0 0e 00 00 wcsr IE,r14 <== NOT EXECUTED
8006120: e0 00 00 44 bi 8006230 <rtems_termios_enqueue_raw_characters+0x2b8><== NOT EXECUTED
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
8006124: 29 63 00 60 lw r3,(r11+96)
8006128: 29 62 00 64 lw r2,(r11+100)
800612c: 34 61 00 01 addi r1,r3,1
8006130: f8 00 62 b6 calli 801ec08 <__umodsi3>
8006134: b8 20 70 00 mv r14,r1
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
8006138: 90 00 98 00 rcsr r19,IE
800613c: a2 71 08 00 and r1,r19,r17
8006140: d0 01 00 00 wcsr IE,r1
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
8006144: 29 61 00 5c lw r1,(r11+92)
8006148: 29 63 00 64 lw r3,(r11+100)
% tty->rawInBuf.Size) > tty->highwater) &&
800614c: 29 62 00 64 lw r2,(r11+100)
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
8006150: c8 61 18 00 sub r3,r3,r1
% tty->rawInBuf.Size) > tty->highwater) &&
8006154: b4 6e 08 00 add r1,r3,r14
8006158: f8 00 62 ac calli 801ec08 <__umodsi3>
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
800615c: 29 62 00 c0 lw r2,(r11+192)
8006160: 50 41 00 22 bgeu r2,r1,80061e8 <rtems_termios_enqueue_raw_characters+0x270><== ALWAYS TAKEN
% tty->rawInBuf.Size) > tty->highwater) &&
!(tty->flow_ctrl & FL_IREQXOF)) {
8006164: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8006168: 20 21 00 01 andi r1,r1,0x1 <== NOT EXECUTED
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
% tty->rawInBuf.Size) > tty->highwater) &&
800616c: 5c 20 00 1f bne r1,r0,80061e8 <rtems_termios_enqueue_raw_characters+0x270><== NOT EXECUTED
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
8006170: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8006174: 38 21 00 01 ori r1,r1,0x1 <== NOT EXECUTED
8006178: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
800617c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8006180: 20 21 04 02 andi r1,r1,0x402 <== NOT EXECUTED
8006184: 5c 37 00 0f bne r1,r23,80061c0 <rtems_termios_enqueue_raw_characters+0x248><== NOT EXECUTED
== (FL_MDXOF ) ) {
if ((tty->flow_ctrl & FL_OSTOP) ||
8006188: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED
800618c: 20 63 00 20 andi r3,r3,0x20 <== NOT EXECUTED
8006190: 5c 60 00 03 bne r3,r0,800619c <rtems_termios_enqueue_raw_characters+0x224><== NOT EXECUTED
8006194: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED
8006198: 5c 23 00 14 bne r1,r3,80061e8 <rtems_termios_enqueue_raw_characters+0x270><== NOT EXECUTED
(tty->rawOutBufState == rob_idle)) {
/* if tx is stopped due to XOFF or out of data */
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
800619c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
(*tty->device.write)(tty->minor,
80061a0: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
80061a4: ba a0 10 00 mv r2,r21 <== NOT EXECUTED
== (FL_MDXOF ) ) {
if ((tty->flow_ctrl & FL_OSTOP) ||
(tty->rawOutBufState == rob_idle)) {
/* if tx is stopped due to XOFF or out of data */
/* call write function here */
tty->flow_ctrl |= FL_ISNTXOF;
80061a8: 38 21 00 02 ori r1,r1,0x2 <== NOT EXECUTED
80061ac: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
(*tty->device.write)(tty->minor,
80061b0: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
80061b4: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
80061b8: d8 80 00 00 call r4 <== NOT EXECUTED
80061bc: e0 00 00 0b bi 80061e8 <rtems_termios_enqueue_raw_characters+0x270><== NOT EXECUTED
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
80061c0: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
80061c4: 20 21 01 04 andi r1,r1,0x104 <== NOT EXECUTED
80061c8: 5c 36 00 08 bne r1,r22,80061e8 <rtems_termios_enqueue_raw_characters+0x270><== NOT EXECUTED
tty->flow_ctrl |= FL_IRTSOFF;
80061cc: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
/* deactivate RTS line */
if (tty->device.stopRemoteTx != NULL) {
80061d0: 29 63 00 ac lw r3,(r11+172) <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
(*tty->device.write)(tty->minor,
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
tty->flow_ctrl |= FL_IRTSOFF;
80061d4: 38 21 00 04 ori r1,r1,0x4 <== NOT EXECUTED
80061d8: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* deactivate RTS line */
if (tty->device.stopRemoteTx != NULL) {
80061dc: 44 60 00 03 be r3,r0,80061e8 <rtems_termios_enqueue_raw_characters+0x270><== NOT EXECUTED
tty->device.stopRemoteTx(tty->minor);
80061e0: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
80061e4: d8 60 00 00 call r3 <== NOT EXECUTED
}
}
}
/* reenable interrupts */
rtems_interrupt_enable(level);
80061e8: d0 13 00 00 wcsr IE,r19
if (newTail == tty->rawInBuf.Head) {
80061ec: 29 61 00 5c lw r1,(r11+92)
80061f0: 5d c1 00 03 bne r14,r1,80061fc <rtems_termios_enqueue_raw_characters+0x284><== ALWAYS TAKEN
dropped++;
80061f4: 35 8c 00 01 addi r12,r12,1 <== NOT EXECUTED
80061f8: e0 00 00 0e bi 8006230 <rtems_termios_enqueue_raw_characters+0x2b8><== NOT EXECUTED
} else {
tty->rawInBuf.theBuf[newTail] = c;
80061fc: 29 61 00 58 lw r1,(r11+88)
8006200: b4 2e 08 00 add r1,r1,r14
8006204: 30 30 00 00 sb (r1+0),r16
tty->rawInBuf.Tail = newTail;
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
8006208: 29 64 00 e4 lw r4,(r11+228)
if (newTail == tty->rawInBuf.Head) {
dropped++;
} else {
tty->rawInBuf.theBuf[newTail] = c;
tty->rawInBuf.Tail = newTail;
800620c: 59 6e 00 60 sw (r11+96),r14
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
8006210: 5c 80 00 08 bne r4,r0,8006230 <rtems_termios_enqueue_raw_characters+0x2b8><== NEVER TAKEN
8006214: 29 63 00 dc lw r3,(r11+220)
8006218: 44 64 00 06 be r3,r4,8006230 <rtems_termios_enqueue_raw_characters+0x2b8><== ALWAYS TAKEN
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
800621c: 29 62 00 e0 lw r2,(r11+224) <== NOT EXECUTED
8006220: bb 00 08 00 mv r1,r24 <== NOT EXECUTED
8006224: d8 60 00 00 call r3 <== NOT EXECUTED
tty->tty_rcvwakeup = 1;
8006228: 34 01 00 01 mvi r1,1 <== NOT EXECUTED
800622c: 59 61 00 e4 sw (r11+228),r1 <== NOT EXECUTED
8006230: 35 ef ff ff addi r15,r15,-1
tty->tty_rcvwakeup = 1;
}
return 0;
}
while (len--) {
8006234: 5d e0 ff 92 bne r15,r0,800607c <rtems_termios_enqueue_raw_characters+0x104>
}
}
}
}
tty->rawInBufDropped += dropped;
8006238: 29 61 00 78 lw r1,(r11+120)
800623c: b4 2c 08 00 add r1,r1,r12
8006240: 59 61 00 78 sw (r11+120),r1
rtems_semaphore_release (tty->rawInBuf.Semaphore);
8006244: 29 61 00 68 lw r1,(r11+104)
8006248: f8 00 04 00 calli 8007248 <rtems_semaphore_release>
return dropped;
}
800624c: b9 80 08 00 mv r1,r12
8006250: 2b 9d 00 04 lw ra,(sp+4)
8006254: 2b 8b 00 44 lw r11,(sp+68)
8006258: 2b 8c 00 40 lw r12,(sp+64)
800625c: 2b 8d 00 3c lw r13,(sp+60)
8006260: 2b 8e 00 38 lw r14,(sp+56)
8006264: 2b 8f 00 34 lw r15,(sp+52)
8006268: 2b 90 00 30 lw r16,(sp+48)
800626c: 2b 91 00 2c lw r17,(sp+44)
8006270: 2b 92 00 28 lw r18,(sp+40)
8006274: 2b 93 00 24 lw r19,(sp+36)
8006278: 2b 94 00 20 lw r20,(sp+32)
800627c: 2b 95 00 1c lw r21,(sp+28)
8006280: 2b 96 00 18 lw r22,(sp+24)
8006284: 2b 97 00 14 lw r23,(sp+20)
8006288: 2b 98 00 10 lw r24,(sp+16)
800628c: 2b 99 00 0c lw r25,(sp+12)
8006290: 2b 9b 00 08 lw fp,(sp+8)
8006294: 37 9c 00 44 addi sp,sp,68
8006298: c3 a0 00 00 ret
080047f0 <rtems_termios_initialize>:
struct rtems_termios_tty *rtems_termios_ttyTail;
rtems_id rtems_termios_ttyMutex;
void
rtems_termios_initialize (void)
{
80047f0: 37 9c ff f8 addi sp,sp,-8
80047f4: 5b 8b 00 08 sw (sp+8),r11
80047f8: 5b 9d 00 04 sw (sp+4),ra
rtems_status_code sc;
/*
* Create the mutex semaphore for the tty list
*/
if (!rtems_termios_ttyMutex) {
80047fc: 78 05 08 02 mvhi r5,0x802
8004800: 38 a5 3a e0 ori r5,r5,0x3ae0
8004804: 28 ab 00 00 lw r11,(r5+0)
8004808: 5d 60 00 0a bne r11,r0,8004830 <rtems_termios_initialize+0x40><== NEVER TAKEN
sc = rtems_semaphore_create (
800480c: 78 02 08 02 mvhi r2,0x802
8004810: 38 42 0f 24 ori r2,r2,0xf24
8004814: 28 41 00 00 lw r1,(r2+0)
8004818: 34 03 00 54 mvi r3,84
800481c: 34 02 00 01 mvi r2,1
8004820: 34 04 00 00 mvi r4,0
8004824: f8 00 09 8d calli 8006e58 <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)
8004828: 44 2b 00 02 be r1,r11,8004830 <rtems_termios_initialize+0x40><== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
800482c: f8 00 0c 1a calli 8007894 <rtems_fatal_error_occurred> <== NOT EXECUTED
}
}
8004830: 2b 9d 00 04 lw ra,(sp+4)
8004834: 2b 8b 00 08 lw r11,(sp+8)
8004838: 37 9c 00 08 addi sp,sp,8
800483c: c3 a0 00 00 ret
08004fb8 <rtems_termios_ioctl>:
}
}
rtems_status_code
rtems_termios_ioctl (void *arg)
{
8004fb8: 37 9c ff e8 addi sp,sp,-24
8004fbc: 5b 8b 00 18 sw (sp+24),r11
8004fc0: 5b 8c 00 14 sw (sp+20),r12
8004fc4: 5b 8d 00 10 sw (sp+16),r13
8004fc8: 5b 8e 00 0c sw (sp+12),r14
8004fcc: 5b 8f 00 08 sw (sp+8),r15
8004fd0: 5b 9d 00 04 sw (sp+4),ra
8004fd4: b8 20 60 00 mv r12,r1
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8004fd8: 28 21 00 00 lw r1,(r1+0)
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
rtems_status_code sc;
args->ioctl_return = 0;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8004fdc: 34 02 00 00 mvi r2,0
8004fe0: 34 03 00 00 mvi r3,0
rtems_status_code
rtems_termios_ioctl (void *arg)
{
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8004fe4: 28 2b 00 38 lw r11,(r1+56)
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
rtems_status_code sc;
args->ioctl_return = 0;
8004fe8: 59 80 00 0c sw (r12+12),r0
rtems_status_code
rtems_termios_ioctl (void *arg)
{
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
8004fec: 29 8e 00 08 lw r14,(r12+8)
rtems_status_code sc;
args->ioctl_return = 0;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8004ff0: 29 61 00 18 lw r1,(r11+24)
8004ff4: f8 00 08 45 calli 8007108 <rtems_semaphore_obtain>
8004ff8: b8 20 68 00 mv r13,r1
if (sc != RTEMS_SUCCESSFUL) {
8004ffc: 5c 20 00 da bne r1,r0,8005364 <rtems_termios_ioctl+0x3ac> <== NEVER TAKEN
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
8005000: 29 82 00 04 lw r2,(r12+4)
8005004: 34 01 00 04 mvi r1,4
8005008: 44 41 00 a6 be r2,r1,80052a0 <rtems_termios_ioctl+0x2e8> <== NEVER TAKEN
800500c: 54 41 00 07 bgu r2,r1,8005028 <rtems_termios_ioctl+0x70>
8005010: 34 01 00 02 mvi r1,2
8005014: 44 41 00 27 be r2,r1,80050b0 <rtems_termios_ioctl+0xf8>
8005018: 54 41 00 9a bgu r2,r1,8005280 <rtems_termios_ioctl+0x2c8>
800501c: 34 01 00 01 mvi r1,1
8005020: 5c 41 00 12 bne r2,r1,8005068 <rtems_termios_ioctl+0xb0> <== NEVER TAKEN
8005024: e0 00 00 1e bi 800509c <rtems_termios_ioctl+0xe4>
8005028: 78 03 08 02 mvhi r3,0x802
800502c: 38 63 0f 40 ori r3,r3,0xf40
8005030: 28 61 00 00 lw r1,(r3+0)
8005034: 44 41 00 be be r2,r1,800532c <rtems_termios_ioctl+0x374> <== NEVER TAKEN
8005038: 54 41 00 04 bgu r2,r1,8005048 <rtems_termios_ioctl+0x90>
800503c: 34 01 00 05 mvi r1,5
8005040: 5c 41 00 0a bne r2,r1,8005068 <rtems_termios_ioctl+0xb0>
8005044: e0 00 00 92 bi 800528c <rtems_termios_ioctl+0x2d4>
8005048: 78 03 08 02 mvhi r3,0x802
800504c: 38 63 0f 44 ori r3,r3,0xf44
8005050: 28 61 00 00 lw r1,(r3+0)
8005054: 44 41 00 b2 be r2,r1,800531c <rtems_termios_ioctl+0x364> <== NEVER TAKEN
8005058: 78 03 08 02 mvhi r3,0x802
800505c: 38 63 0f 48 ori r3,r3,0xf48
8005060: 28 61 00 00 lw r1,(r3+0)
8005064: 44 41 00 94 be r2,r1,80052b4 <rtems_termios_ioctl+0x2fc>
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
8005068: 29 61 00 cc lw r1,(r11+204)
800506c: 78 0d 08 02 mvhi r13,0x802
8005070: 34 02 00 05 mvi r2,5
8005074: 39 ad 39 14 ori r13,r13,0x3914
8005078: fb ff f2 c9 calli 8001b9c <__ashlsi3>
800507c: b5 a1 08 00 add r1,r13,r1
8005080: 28 23 00 18 lw r3,(r1+24)
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
}
else {
sc = RTEMS_INVALID_NUMBER;
8005084: 34 0d 00 0a mvi r13,10
args->ioctl_return = sc;
return sc;
}
switch (args->command) {
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
8005088: 44 60 00 b5 be r3,r0,800535c <rtems_termios_ioctl+0x3a4> <== NEVER TAKEN
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
800508c: b9 60 08 00 mv r1,r11
8005090: b9 80 10 00 mv r2,r12
8005094: d8 60 00 00 call r3
8005098: e0 00 00 9f bi 8005314 <rtems_termios_ioctl+0x35c>
sc = RTEMS_INVALID_NUMBER;
}
break;
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
800509c: 29 81 00 08 lw r1,(r12+8)
80050a0: 35 62 00 30 addi r2,r11,48
80050a4: 34 03 00 24 mvi r3,36
80050a8: f8 00 31 f4 calli 8011878 <memcpy>
break;
80050ac: e0 00 00 ac bi 800535c <rtems_termios_ioctl+0x3a4>
case RTEMS_IO_SET_ATTRIBUTES:
tty->termios = *(struct termios *)args->buffer;
80050b0: 29 82 00 08 lw r2,(r12+8)
80050b4: 35 61 00 30 addi r1,r11,48
80050b8: 34 03 00 24 mvi r3,36
80050bc: f8 00 31 ef calli 8011878 <memcpy>
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
80050c0: 29 61 00 b8 lw r1,(r11+184)
80050c4: 20 21 02 00 andi r1,r1,0x200
80050c8: 44 20 00 1d be r1,r0,800513c <rtems_termios_ioctl+0x184>
!(tty->termios.c_iflag & IXON)) {
80050cc: 29 61 00 30 lw r1,(r11+48)
80050d0: 20 21 04 00 andi r1,r1,0x400
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
80050d4: 5c 20 00 1a bne r1,r0,800513c <rtems_termios_ioctl+0x184> <== ALWAYS TAKEN
!(tty->termios.c_iflag & IXON)) {
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF);
80050d8: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
80050dc: 34 01 fd ef mvi r1,-529 <== NOT EXECUTED
80050e0: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
80050e4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* has output been stopped due to received XOFF? */
if (tty->flow_ctrl & FL_OSTOP) {
80050e8: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
80050ec: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED
80050f0: 44 20 00 13 be r1,r0,800513c <rtems_termios_ioctl+0x184> <== NOT EXECUTED
/* disable interrupts */
rtems_interrupt_disable(level);
80050f4: 90 00 70 00 rcsr r14,IE <== NOT EXECUTED
80050f8: 34 01 ff fe mvi r1,-2 <== NOT EXECUTED
80050fc: a1 c1 08 00 and r1,r14,r1 <== NOT EXECUTED
8005100: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
8005104: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
8005108: 34 01 ff df mvi r1,-33 <== NOT EXECUTED
800510c: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
8005110: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
8005114: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED
8005118: 44 20 00 08 be r1,r0,8005138 <rtems_termios_ioctl+0x180> <== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
800511c: 29 63 00 7c lw r3,(r11+124) <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
8005120: 29 62 00 84 lw r2,(r11+132) <== NOT EXECUTED
rtems_interrupt_disable(level);
tty->flow_ctrl &= ~FL_OSTOP;
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
/* if chars available, call write function... */
(*tty->device.write)(
8005124: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8005128: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
800512c: b4 62 10 00 add r2,r3,r2 <== NOT EXECUTED
8005130: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8005134: d8 80 00 00 call r4 <== NOT EXECUTED
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
}
/* reenable interrupts */
rtems_interrupt_enable(level);
8005138: d0 0e 00 00 wcsr IE,r14 <== NOT EXECUTED
}
}
/* check for incoming XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXOF) && !(tty->termios.c_iflag & IXOFF)) {
800513c: 29 61 00 b8 lw r1,(r11+184)
8005140: 20 21 04 00 andi r1,r1,0x400
8005144: 44 20 00 0c be r1,r0,8005174 <rtems_termios_ioctl+0x1bc> <== ALWAYS TAKEN
8005148: 29 61 00 30 lw r1,(r11+48) <== NOT EXECUTED
800514c: 20 21 10 00 andi r1,r1,0x1000 <== NOT EXECUTED
8005150: 5c 20 00 09 bne r1,r0,8005174 <rtems_termios_ioctl+0x1bc> <== NOT EXECUTED
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXOF);
8005154: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
8005158: 34 01 fb ff mvi r1,-1025 <== NOT EXECUTED
800515c: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
8005160: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* FIXME: what happens, if we had sent XOFF but not yet XON? */
tty->flow_ctrl &= ~(FL_ISNTXOF);
8005164: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
8005168: 34 01 ff fd mvi r1,-3 <== NOT EXECUTED
800516c: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
8005170: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
}
/* check for incoming RTS/CTS flow control switched off */
if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) {
8005174: 29 61 00 b8 lw r1,(r11+184)
8005178: 20 21 01 00 andi r1,r1,0x100
800517c: 44 20 00 12 be r1,r0,80051c4 <rtems_termios_ioctl+0x20c> <== ALWAYS TAKEN
8005180: 29 61 00 38 lw r1,(r11+56) <== NOT EXECUTED
8005184: 48 01 00 10 bg r0,r1,80051c4 <rtems_termios_ioctl+0x20c> <== NOT EXECUTED
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDRTS);
8005188: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
800518c: 34 01 fe ff mvi r1,-257 <== NOT EXECUTED
8005190: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
8005194: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* restart remote Tx, if it was stopped */
if ((tty->flow_ctrl & FL_IRTSOFF) && (tty->device.startRemoteTx != NULL)) {
8005198: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
800519c: 20 21 00 04 andi r1,r1,0x4 <== NOT EXECUTED
80051a0: 44 20 00 05 be r1,r0,80051b4 <rtems_termios_ioctl+0x1fc> <== NOT EXECUTED
80051a4: 29 62 00 b0 lw r2,(r11+176) <== NOT EXECUTED
80051a8: 44 40 00 03 be r2,r0,80051b4 <rtems_termios_ioctl+0x1fc> <== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
80051ac: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
80051b0: d8 40 00 00 call r2 <== NOT EXECUTED
}
tty->flow_ctrl &= ~(FL_IRTSOFF);
80051b4: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
80051b8: 34 01 ff fb mvi r1,-5 <== NOT EXECUTED
80051bc: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED
80051c0: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/*
* check for flow control options to be switched on
*/
/* check for incoming RTS/CTS flow control switched on */
if (tty->termios.c_cflag & CRTSCTS) {
80051c4: 29 61 00 38 lw r1,(r11+56)
80051c8: 4c 20 00 04 bge r1,r0,80051d8 <rtems_termios_ioctl+0x220> <== ALWAYS TAKEN
tty->flow_ctrl |= FL_MDRTS;
80051cc: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
80051d0: 38 21 01 00 ori r1,r1,0x100 <== NOT EXECUTED
80051d4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
}
/* check for incoming XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXOFF) {
80051d8: 29 61 00 30 lw r1,(r11+48)
80051dc: 20 22 10 00 andi r2,r1,0x1000
80051e0: 44 40 00 04 be r2,r0,80051f0 <rtems_termios_ioctl+0x238>
tty->flow_ctrl |= FL_MDXOF;
80051e4: 29 62 00 b8 lw r2,(r11+184)
80051e8: 38 42 04 00 ori r2,r2,0x400
80051ec: 59 62 00 b8 sw (r11+184),r2
}
/* check for outgoing XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXON) {
80051f0: 20 21 04 00 andi r1,r1,0x400
80051f4: 44 20 00 04 be r1,r0,8005204 <rtems_termios_ioctl+0x24c>
tty->flow_ctrl |= FL_MDXON;
80051f8: 29 61 00 b8 lw r1,(r11+184)
80051fc: 38 21 02 00 ori r1,r1,0x200
8005200: 59 61 00 b8 sw (r11+184),r1
tty->termios = *(struct termios *)args->buffer;
/* check for and process change in flow control options */
termios_set_flowctrl(tty);
if (tty->termios.c_lflag & ICANON) {
8005204: 29 6e 00 3c lw r14,(r11+60)
8005208: 21 ce 00 02 andi r14,r14,0x2
800520c: 5d c0 00 11 bne r14,r0,8005250 <rtems_termios_ioctl+0x298>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
8005210: 41 6f 00 46 lbu r15,(r11+70)
rtems_clock_get_ticks_per_second() / 10;
8005214: f8 00 05 e8 calli 80069b4 <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] *
8005218: b9 e0 10 00 mv r2,r15
800521c: f8 00 66 06 calli 801ea34 <__mulsi3>
rtems_clock_get_ticks_per_second() / 10;
8005220: 34 02 00 0a mvi r2,10
8005224: f8 00 66 69 calli 801ebc8 <__udivsi3>
if (tty->termios.c_cc[VTIME]) {
8005228: 41 62 00 46 lbu r2,(r11+70)
if (tty->termios.c_lflag & ICANON) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
800522c: 59 61 00 54 sw (r11+84),r1
8005230: 41 63 00 47 lbu r3,(r11+71)
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
8005234: 44 4e 00 06 be r2,r14,800524c <rtems_termios_ioctl+0x294>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
8005238: 59 60 00 6c sw (r11+108),r0
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
800523c: 59 61 00 70 sw (r11+112),r1
if (tty->termios.c_cc[VMIN])
8005240: 5c 60 00 06 bne r3,r0,8005258 <rtems_termios_ioctl+0x2a0>
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
else
tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks;
8005244: 59 61 00 74 sw (r11+116),r1
8005248: e0 00 00 08 bi 8005268 <rtems_termios_ioctl+0x2b0>
} else {
if (tty->termios.c_cc[VMIN]) {
800524c: 44 62 00 05 be r3,r2,8005260 <rtems_termios_ioctl+0x2a8> <== ALWAYS TAKEN
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
8005250: 59 60 00 6c sw (r11+108),r0
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
8005254: 59 60 00 70 sw (r11+112),r0
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
8005258: 59 60 00 74 sw (r11+116),r0
800525c: e0 00 00 03 bi 8005268 <rtems_termios_ioctl+0x2b0>
} else {
tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT;
8005260: 34 01 00 01 mvi r1,1
8005264: 59 61 00 6c sw (r11+108),r1
}
}
}
if (tty->device.setAttributes)
8005268: 29 63 00 a8 lw r3,(r11+168)
800526c: 44 60 00 3c be r3,r0,800535c <rtems_termios_ioctl+0x3a4> <== NEVER TAKEN
(*tty->device.setAttributes)(tty->minor, &tty->termios);
8005270: 29 61 00 10 lw r1,(r11+16)
8005274: 35 62 00 30 addi r2,r11,48
8005278: d8 60 00 00 call r3
800527c: e0 00 00 38 bi 800535c <rtems_termios_ioctl+0x3a4>
break;
case RTEMS_IO_TCDRAIN:
drainOutput (tty);
8005280: b9 60 08 00 mv r1,r11
8005284: fb ff fd 80 calli 8004884 <drainOutput>
break;
8005288: e0 00 00 35 bi 800535c <rtems_termios_ioctl+0x3a4>
case RTEMS_IO_SNDWAKEUP:
tty->tty_snd = *wakeup;
800528c: 29 c1 00 00 lw r1,(r14+0)
8005290: 59 61 00 d4 sw (r11+212),r1
8005294: 29 c1 00 04 lw r1,(r14+4)
8005298: 59 61 00 d8 sw (r11+216),r1
break;
800529c: e0 00 00 30 bi 800535c <rtems_termios_ioctl+0x3a4>
case RTEMS_IO_RCVWAKEUP:
tty->tty_rcv = *wakeup;
80052a0: 29 c1 00 00 lw r1,(r14+0)
80052a4: 59 61 00 dc sw (r11+220),r1
80052a8: 29 c1 00 04 lw r1,(r14+4)
80052ac: 59 61 00 e0 sw (r11+224),r1
break;
80052b0: e0 00 00 2b bi 800535c <rtems_termios_ioctl+0x3a4>
#if 1 /* FIXME */
case TIOCSETD:
/*
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
80052b4: 29 61 00 cc lw r1,(r11+204)
80052b8: 34 02 00 05 mvi r2,5
80052bc: 78 0e 08 02 mvhi r14,0x802
80052c0: fb ff f2 37 calli 8001b9c <__ashlsi3>
80052c4: 39 ce 39 14 ori r14,r14,0x3914
80052c8: b5 c1 08 00 add r1,r14,r1
80052cc: 28 22 00 04 lw r2,(r1+4)
80052d0: 44 40 00 04 be r2,r0,80052e0 <rtems_termios_ioctl+0x328>
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
80052d4: b9 60 08 00 mv r1,r11
80052d8: d8 40 00 00 call r2
80052dc: b8 20 68 00 mv r13,r1
}
tty->t_line=*(int*)(args->buffer);
80052e0: 29 81 00 08 lw r1,(r12+8)
tty->t_sc = NULL; /* ensure that no more valid data */
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
80052e4: 34 02 00 05 mvi r2,5
80052e8: 78 0e 08 02 mvhi r14,0x802
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
}
tty->t_line=*(int*)(args->buffer);
80052ec: 28 21 00 00 lw r1,(r1+0)
tty->t_sc = NULL; /* ensure that no more valid data */
80052f0: 59 60 00 d0 sw (r11+208),r0
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
80052f4: 39 ce 39 14 ori r14,r14,0x3914
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
}
tty->t_line=*(int*)(args->buffer);
80052f8: 59 61 00 cc sw (r11+204),r1
tty->t_sc = NULL; /* ensure that no more valid data */
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
80052fc: fb ff f2 28 calli 8001b9c <__ashlsi3>
8005300: b5 c1 08 00 add r1,r14,r1
8005304: 28 22 00 00 lw r2,(r1+0)
8005308: 44 40 00 15 be r2,r0,800535c <rtems_termios_ioctl+0x3a4> <== NEVER TAKEN
sc = rtems_termios_linesw[tty->t_line].l_open(tty);
800530c: b9 60 08 00 mv r1,r11
8005310: d8 40 00 00 call r2
8005314: b8 20 68 00 mv r13,r1
8005318: e0 00 00 11 bi 800535c <rtems_termios_ioctl+0x3a4>
}
break;
case TIOCGETD:
*(int*)(args->buffer)=tty->t_line;
800531c: 29 81 00 08 lw r1,(r12+8)
8005320: 29 62 00 cc lw r2,(r11+204)
8005324: 58 22 00 00 sw (r1+0),r2
break;
8005328: e0 00 00 0d bi 800535c <rtems_termios_ioctl+0x3a4>
#endif
case FIONREAD: {
int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head;
800532c: 29 62 00 60 lw r2,(r11+96) <== NOT EXECUTED
8005330: 29 61 00 5c lw r1,(r11+92) <== NOT EXECUTED
8005334: c8 41 08 00 sub r1,r2,r1 <== NOT EXECUTED
if ( rawnc < 0 )
8005338: 4c 20 00 03 bge r1,r0,8005344 <rtems_termios_ioctl+0x38c> <== NOT EXECUTED
rawnc += tty->rawInBuf.Size;
800533c: 29 62 00 64 lw r2,(r11+100) <== NOT EXECUTED
8005340: b4 22 08 00 add r1,r1,r2 <== NOT EXECUTED
/* Half guess that this is the right operation */
*(int *)args->buffer = tty->ccount - tty->cindex + rawnc;
8005344: 29 64 00 20 lw r4,(r11+32) <== NOT EXECUTED
8005348: 29 62 00 24 lw r2,(r11+36) <== NOT EXECUTED
800534c: 29 83 00 08 lw r3,(r12+8) <== NOT EXECUTED
8005350: c8 82 10 00 sub r2,r4,r2 <== NOT EXECUTED
8005354: b4 41 08 00 add r1,r2,r1 <== NOT EXECUTED
8005358: 58 61 00 00 sw (r3+0),r1 <== NOT EXECUTED
}
break;
}
rtems_semaphore_release (tty->osem);
800535c: 29 61 00 18 lw r1,(r11+24)
8005360: f8 00 07 ba calli 8007248 <rtems_semaphore_release>
args->ioctl_return = sc;
return sc;
}
8005364: b9 a0 08 00 mv r1,r13
}
break;
}
rtems_semaphore_release (tty->osem);
args->ioctl_return = sc;
8005368: 59 8d 00 0c sw (r12+12),r13
return sc;
}
800536c: 2b 9d 00 04 lw ra,(sp+4)
8005370: 2b 8b 00 18 lw r11,(sp+24)
8005374: 2b 8c 00 14 lw r12,(sp+20)
8005378: 2b 8d 00 10 lw r13,(sp+16)
800537c: 2b 8e 00 0c lw r14,(sp+12)
8005380: 2b 8f 00 08 lw r15,(sp+8)
8005384: 37 9c 00 18 addi sp,sp,24
8005388: c3 a0 00 00 ret
08004914 <rtems_termios_open>:
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
8004914: 37 9c ff d4 addi sp,sp,-44
8004918: 5b 8b 00 2c sw (sp+44),r11
800491c: 5b 8c 00 28 sw (sp+40),r12
8004920: 5b 8d 00 24 sw (sp+36),r13
8004924: 5b 8e 00 20 sw (sp+32),r14
8004928: 5b 8f 00 1c sw (sp+28),r15
800492c: 5b 90 00 18 sw (sp+24),r16
8004930: 5b 91 00 14 sw (sp+20),r17
8004934: 5b 92 00 10 sw (sp+16),r18
8004938: 5b 93 00 0c sw (sp+12),r19
800493c: 5b 94 00 08 sw (sp+8),r20
8004940: 5b 9d 00 04 sw (sp+4),ra
8004944: b8 20 88 00 mv r17,r1
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
8004948: 78 01 08 02 mvhi r1,0x802
800494c: 38 21 3a e0 ori r1,r1,0x3ae0
8004950: 28 21 00 00 lw r1,(r1+0)
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
8004954: b8 40 90 00 mv r18,r2
8004958: b8 60 a0 00 mv r20,r3
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
800495c: 34 02 00 00 mvi r2,0
8004960: 34 03 00 00 mvi r3,0
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg,
const rtems_termios_callbacks *callbacks
)
{
8004964: b8 80 68 00 mv r13,r4
struct rtems_termios_tty *tty;
/*
* See if the device has already been opened
*/
sc = rtems_semaphore_obtain(
8004968: f8 00 09 e8 calli 8007108 <rtems_semaphore_obtain>
800496c: b8 20 78 00 mv r15,r1
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
8004970: 5c 20 01 02 bne r1,r0,8004d78 <rtems_termios_open+0x464> <== NEVER TAKEN
return sc;
for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) {
8004974: 78 01 08 02 mvhi r1,0x802
8004978: 38 21 3a e8 ori r1,r1,0x3ae8
800497c: 28 2e 00 00 lw r14,(r1+0)
8004980: b9 c0 60 00 mv r12,r14
8004984: e0 00 00 06 bi 800499c <rtems_termios_open+0x88>
if ((tty->major == major) && (tty->minor == minor))
8004988: 29 81 00 0c lw r1,(r12+12) <== NOT EXECUTED
800498c: 5c 31 00 03 bne r1,r17,8004998 <rtems_termios_open+0x84> <== NOT EXECUTED
8004990: 29 81 00 10 lw r1,(r12+16) <== NOT EXECUTED
8004994: 44 32 00 d8 be r1,r18,8004cf4 <rtems_termios_open+0x3e0> <== NOT EXECUTED
sc = rtems_semaphore_obtain(
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
return sc;
for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) {
8004998: 29 8c 00 00 lw r12,(r12+0) <== NOT EXECUTED
800499c: 5d 80 ff fb bne r12,r0,8004988 <rtems_termios_open+0x74> <== NEVER TAKEN
80049a0: e0 00 01 04 bi 8004db0 <rtems_termios_open+0x49c>
return RTEMS_NO_MEMORY;
}
/*
* allocate raw input buffer
*/
tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE;
80049a4: 78 01 08 02 mvhi r1,0x802
80049a8: 38 21 33 44 ori r1,r1,0x3344
80049ac: 28 21 00 00 lw r1,(r1+0)
80049b0: 59 81 00 64 sw (r12+100),r1
tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size);
80049b4: 29 81 00 64 lw r1,(r12+100)
80049b8: fb ff fb c8 calli 80038d8 <malloc>
80049bc: 59 81 00 58 sw (r12+88),r1
80049c0: b8 20 80 00 mv r16,r1
if (tty->rawInBuf.theBuf == NULL) {
80049c4: 5c 20 00 09 bne r1,r0,80049e8 <rtems_termios_open+0xd4>
free(tty);
80049c8: b9 80 08 00 mv r1,r12
80049cc: fb ff fa 00 calli 80031cc <free>
rtems_semaphore_release (rtems_termios_ttyMutex);
80049d0: 78 01 08 02 mvhi r1,0x802
80049d4: 38 21 3a e0 ori r1,r1,0x3ae0
80049d8: 28 21 00 00 lw r1,(r1+0)
return RTEMS_NO_MEMORY;
80049dc: 34 0f 00 1a mvi r15,26
*/
tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE;
tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size);
if (tty->rawInBuf.theBuf == NULL) {
free(tty);
rtems_semaphore_release (rtems_termios_ttyMutex);
80049e0: f8 00 0a 1a calli 8007248 <rtems_semaphore_release>
return RTEMS_NO_MEMORY;
80049e4: e0 00 00 e5 bi 8004d78 <rtems_termios_open+0x464>
}
/*
* allocate raw output buffer
*/
tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE;
80049e8: 78 01 08 02 mvhi r1,0x802
80049ec: 38 21 33 48 ori r1,r1,0x3348
80049f0: 28 21 00 00 lw r1,(r1+0)
80049f4: 59 81 00 88 sw (r12+136),r1
tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size);
80049f8: 29 81 00 88 lw r1,(r12+136)
80049fc: fb ff fb b7 calli 80038d8 <malloc>
8004a00: 59 81 00 7c sw (r12+124),r1
8004a04: b8 20 98 00 mv r19,r1
if (tty->rawOutBuf.theBuf == NULL) {
8004a08: 44 20 00 09 be r1,r0,8004a2c <rtems_termios_open+0x118>
return RTEMS_NO_MEMORY;
}
/*
* allocate cooked buffer
*/
tty->cbuf = malloc (CBUFSIZE);
8004a0c: 78 01 08 02 mvhi r1,0x802
8004a10: 38 21 33 40 ori r1,r1,0x3340
8004a14: 28 21 00 00 lw r1,(r1+0)
8004a18: fb ff fb b0 calli 80038d8 <malloc>
8004a1c: 59 81 00 1c sw (r12+28),r1
if (tty->cbuf == NULL) {
8004a20: 5c 20 00 06 bne r1,r0,8004a38 <rtems_termios_open+0x124> <== ALWAYS TAKEN
free((void *)(tty->rawOutBuf.theBuf));
8004a24: ba 60 08 00 mv r1,r19 <== NOT EXECUTED
8004a28: fb ff f9 e9 calli 80031cc <free> <== NOT EXECUTED
free((void *)(tty->rawInBuf.theBuf));
8004a2c: ba 00 08 00 mv r1,r16
8004a30: fb ff f9 e7 calli 80031cc <free>
8004a34: e3 ff ff e5 bi 80049c8 <rtems_termios_open+0xb4>
return RTEMS_NO_MEMORY;
}
/*
* Initialize wakeup callbacks
*/
tty->tty_snd.sw_pfn = NULL;
8004a38: 59 80 00 d4 sw (r12+212),r0
tty->tty_snd.sw_arg = NULL;
8004a3c: 59 80 00 d8 sw (r12+216),r0
tty->tty_rcv.sw_pfn = NULL;
8004a40: 59 80 00 dc sw (r12+220),r0
tty->tty_rcv.sw_arg = NULL;
8004a44: 59 80 00 e0 sw (r12+224),r0
tty->tty_rcvwakeup = 0;
8004a48: 59 80 00 e4 sw (r12+228),r0
/*
* link tty
*/
tty->forw = rtems_termios_ttyHead;
8004a4c: 59 8e 00 00 sw (r12+0),r14
tty->back = NULL;
8004a50: 59 80 00 04 sw (r12+4),r0
if (rtems_termios_ttyHead != NULL)
8004a54: 45 c0 00 02 be r14,r0,8004a5c <rtems_termios_open+0x148> <== ALWAYS TAKEN
rtems_termios_ttyHead->back = tty;
8004a58: 59 cc 00 04 sw (r14+4),r12 <== NOT EXECUTED
rtems_termios_ttyHead = tty;
8004a5c: 78 01 08 02 mvhi r1,0x802
if (rtems_termios_ttyTail == NULL)
8004a60: 78 04 08 02 mvhi r4,0x802
*/
tty->forw = rtems_termios_ttyHead;
tty->back = NULL;
if (rtems_termios_ttyHead != NULL)
rtems_termios_ttyHead->back = tty;
rtems_termios_ttyHead = tty;
8004a64: 38 21 3a e8 ori r1,r1,0x3ae8
if (rtems_termios_ttyTail == NULL)
8004a68: 38 84 3a e4 ori r4,r4,0x3ae4
*/
tty->forw = rtems_termios_ttyHead;
tty->back = NULL;
if (rtems_termios_ttyHead != NULL)
rtems_termios_ttyHead->back = tty;
rtems_termios_ttyHead = tty;
8004a6c: 58 2b 00 00 sw (r1+0),r11
if (rtems_termios_ttyTail == NULL)
8004a70: 28 81 00 00 lw r1,(r4+0)
8004a74: 5c 20 00 02 bne r1,r0,8004a7c <rtems_termios_open+0x168> <== NEVER TAKEN
rtems_termios_ttyTail = tty;
8004a78: 58 8b 00 00 sw (r4+0),r11
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
rtems_build_name ('T', 'R', 'i', c),
8004a7c: 78 0e 08 02 mvhi r14,0x802
tty->major = major;
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
8004a80: 78 03 08 02 mvhi r3,0x802
8004a84: 38 63 0f 28 ori r3,r3,0xf28
rtems_build_name ('T', 'R', 'i', c),
8004a88: 39 ce 33 4c ori r14,r14,0x334c
8004a8c: 41 c2 00 00 lbu r2,(r14+0)
tty->major = major;
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
8004a90: 28 61 00 00 lw r1,(r3+0)
rtems_termios_ttyHead->back = tty;
rtems_termios_ttyHead = tty;
if (rtems_termios_ttyTail == NULL)
rtems_termios_ttyTail = tty;
tty->minor = minor;
8004a94: 59 72 00 10 sw (r11+16),r18
tty->major = major;
8004a98: 59 71 00 0c sw (r11+12),r17
/*
* Set up mutex semaphores
*/
sc = rtems_semaphore_create (
8004a9c: b8 41 08 00 or r1,r2,r1
8004aa0: 34 03 00 54 mvi r3,84
8004aa4: 34 02 00 01 mvi r2,1
8004aa8: 34 04 00 00 mvi r4,0
8004aac: 35 65 00 14 addi r5,r11,20
8004ab0: f8 00 08 ea calli 8006e58 <rtems_semaphore_create>
8004ab4: b8 20 80 00 mv r16,r1
rtems_build_name ('T', 'R', 'i', c),
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->isem);
if (sc != RTEMS_SUCCESSFUL)
8004ab8: 5c 20 00 ab bne r1,r0,8004d64 <rtems_termios_open+0x450> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
8004abc: 78 03 08 02 mvhi r3,0x802
8004ac0: 38 63 0f 2c ori r3,r3,0xf2c
rtems_build_name ('T', 'R', 'o', c),
8004ac4: 41 c2 00 00 lbu r2,(r14+0)
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->isem);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
8004ac8: 28 61 00 00 lw r1,(r3+0)
8004acc: 34 04 00 00 mvi r4,0
8004ad0: 34 03 00 54 mvi r3,84
8004ad4: b8 41 08 00 or r1,r2,r1
8004ad8: 35 65 00 18 addi r5,r11,24
8004adc: 34 02 00 01 mvi r2,1
8004ae0: f8 00 08 de calli 8006e58 <rtems_semaphore_create>
8004ae4: b8 20 98 00 mv r19,r1
rtems_build_name ('T', 'R', 'o', c),
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->osem);
if (sc != RTEMS_SUCCESSFUL)
8004ae8: 5c 30 00 9f bne r1,r16,8004d64 <rtems_termios_open+0x450> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
8004aec: 78 03 08 02 mvhi r3,0x802
8004af0: 38 63 0f 30 ori r3,r3,0xf30
rtems_build_name ('T', 'R', 'x', c),
8004af4: 41 c2 00 00 lbu r2,(r14+0)
RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
RTEMS_NO_PRIORITY,
&tty->osem);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_semaphore_create (
8004af8: 28 61 00 00 lw r1,(r3+0)
8004afc: 34 04 00 00 mvi r4,0
8004b00: 34 03 00 20 mvi r3,32
8004b04: b8 41 08 00 or r1,r2,r1
8004b08: 35 65 00 8c addi r5,r11,140
8004b0c: 34 02 00 00 mvi r2,0
8004b10: f8 00 08 d2 calli 8006e58 <rtems_semaphore_create>
8004b14: b8 20 80 00 mv r16,r1
rtems_build_name ('T', 'R', 'x', c),
0,
RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO,
RTEMS_NO_PRIORITY,
&tty->rawOutBuf.Semaphore);
if (sc != RTEMS_SUCCESSFUL)
8004b18: 5c 33 00 93 bne r1,r19,8004d64 <rtems_termios_open+0x450> <== NEVER TAKEN
tty->rawOutBufState = rob_idle;
/*
* Set callbacks
*/
tty->device = *callbacks;
8004b1c: 29 a2 00 18 lw r2,(r13+24)
8004b20: 29 a8 00 00 lw r8,(r13+0)
8004b24: 29 a7 00 04 lw r7,(r13+4)
8004b28: 29 a6 00 08 lw r6,(r13+8)
8004b2c: 29 a5 00 0c lw r5,(r13+12)
8004b30: 29 a4 00 10 lw r4,(r13+16)
8004b34: 29 a3 00 14 lw r3,(r13+20)
8004b38: 29 a1 00 1c lw r1,(r13+28)
RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO,
RTEMS_NO_PRIORITY,
&tty->rawOutBuf.Semaphore);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
tty->rawOutBufState = rob_idle;
8004b3c: 59 60 00 94 sw (r11+148),r0
/*
* Set callbacks
*/
tty->device = *callbacks;
8004b40: 59 62 00 b0 sw (r11+176),r2
8004b44: 59 68 00 98 sw (r11+152),r8
8004b48: 59 67 00 9c sw (r11+156),r7
8004b4c: 59 66 00 a0 sw (r11+160),r6
8004b50: 59 65 00 a4 sw (r11+164),r5
8004b54: 59 64 00 a8 sw (r11+168),r4
8004b58: 59 63 00 ac sw (r11+172),r3
8004b5c: 59 61 00 b4 sw (r11+180),r1
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
8004b60: 34 02 00 02 mvi r2,2
8004b64: 5c 22 00 1a bne r1,r2,8004bcc <rtems_termios_open+0x2b8>
sc = rtems_task_create (
8004b68: 78 03 08 02 mvhi r3,0x802
8004b6c: 38 63 0f 34 ori r3,r3,0xf34
rtems_build_name ('T', 'x', 'T', c),
8004b70: 41 c2 00 00 lbu r2,(r14+0)
/*
* Create I/O tasks
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
sc = rtems_task_create (
8004b74: 28 61 00 00 lw r1,(r3+0)
8004b78: 34 04 05 00 mvi r4,1280
8004b7c: 34 03 04 00 mvi r3,1024
8004b80: b8 41 08 00 or r1,r2,r1
8004b84: 34 05 00 00 mvi r5,0
8004b88: 34 02 00 0a mvi r2,10
8004b8c: 35 66 00 c8 addi r6,r11,200
8004b90: f8 00 09 ec calli 8007340 <rtems_task_create>
8004b94: b8 20 68 00 mv r13,r1
TERMIOS_TXTASK_STACKSIZE,
RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE |
RTEMS_NO_ASR,
RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
&tty->txTaskId);
if (sc != RTEMS_SUCCESSFUL)
8004b98: 5c 30 00 73 bne r1,r16,8004d64 <rtems_termios_open+0x450> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_create (
8004b9c: 78 03 08 02 mvhi r3,0x802
8004ba0: 38 63 0f 38 ori r3,r3,0xf38
rtems_build_name ('R', 'x', 'T', c),
8004ba4: 41 c2 00 00 lbu r2,(r14+0)
RTEMS_NO_ASR,
RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL,
&tty->txTaskId);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
sc = rtems_task_create (
8004ba8: 28 61 00 00 lw r1,(r3+0)
8004bac: 34 04 05 00 mvi r4,1280
8004bb0: 34 03 04 00 mvi r3,1024
8004bb4: b8 41 08 00 or r1,r2,r1
8004bb8: 34 05 00 00 mvi r5,0
8004bbc: 34 02 00 09 mvi r2,9
8004bc0: 35 66 00 c4 addi r6,r11,196
8004bc4: f8 00 09 df calli 8007340 <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)
8004bc8: 5c 2d 00 67 bne r1,r13,8004d64 <rtems_termios_open+0x450> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
8004bcc: 29 61 00 a0 lw r1,(r11+160)
8004bd0: 44 20 00 04 be r1,r0,8004be0 <rtems_termios_open+0x2cc>
8004bd4: 29 62 00 b4 lw r2,(r11+180)
8004bd8: 34 01 00 02 mvi r1,2
8004bdc: 5c 41 00 0e bne r2,r1,8004c14 <rtems_termios_open+0x300>
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
rtems_build_name ('T', 'R', 'r', c),
8004be0: 78 01 08 02 mvhi r1,0x802
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
8004be4: 78 03 08 02 mvhi r3,0x802
rtems_build_name ('T', 'R', 'r', c),
8004be8: 38 21 33 4c ori r1,r1,0x334c
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
8004bec: 38 63 0f 3c ori r3,r3,0xf3c
rtems_build_name ('T', 'R', 'r', c),
8004bf0: 40 22 00 00 lbu r2,(r1+0)
rtems_fatal_error_occurred (sc);
}
if ((tty->device.pollRead == NULL) ||
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){
sc = rtems_semaphore_create (
8004bf4: 28 61 00 00 lw r1,(r3+0)
8004bf8: 34 04 00 00 mvi r4,0
8004bfc: 34 03 00 24 mvi r3,36
8004c00: b8 41 08 00 or r1,r2,r1
8004c04: 35 65 00 68 addi r5,r11,104
8004c08: 34 02 00 00 mvi r2,0
8004c0c: f8 00 08 93 calli 8006e58 <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)
8004c10: 5c 20 00 55 bne r1,r0,8004d64 <rtems_termios_open+0x450> <== NEVER TAKEN
}
/*
* Set default parameters
*/
tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL;
8004c14: 34 01 25 02 mvi r1,9474
8004c18: 59 61 00 30 sw (r11+48),r1
tty->termios.c_oflag = OPOST | ONLCR | XTABS;
8004c1c: 34 01 18 05 mvi r1,6149
8004c20: 59 61 00 34 sw (r11+52),r1
tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL;
8004c24: 34 01 08 bd mvi r1,2237
8004c28: 59 61 00 38 sw (r11+56),r1
tty->termios.c_lflag =
8004c2c: 34 21 79 7e addi r1,r1,31102
8004c30: 59 61 00 3c sw (r11+60),r1
ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL;
tty->termios.c_cc[VINTR] = '\003';
8004c34: 34 01 00 03 mvi r1,3
8004c38: 31 61 00 41 sb (r11+65),r1
tty->termios.c_cc[VQUIT] = '\034';
8004c3c: 34 01 00 1c mvi r1,28
8004c40: 31 61 00 42 sb (r11+66),r1
tty->termios.c_cc[VERASE] = '\177';
8004c44: 34 01 00 7f mvi r1,127
8004c48: 31 61 00 43 sb (r11+67),r1
tty->termios.c_cc[VKILL] = '\025';
8004c4c: 34 01 00 15 mvi r1,21
8004c50: 31 61 00 44 sb (r11+68),r1
tty->termios.c_cc[VEOF] = '\004';
8004c54: 34 01 00 04 mvi r1,4
8004c58: 31 61 00 45 sb (r11+69),r1
tty->termios.c_cc[VEOL] = '\000';
tty->termios.c_cc[VEOL2] = '\000';
tty->termios.c_cc[VSTART] = '\021';
8004c5c: 34 01 00 11 mvi r1,17
8004c60: 31 61 00 49 sb (r11+73),r1
tty->termios.c_cc[VSTOP] = '\023';
8004c64: 34 01 00 13 mvi r1,19
8004c68: 31 61 00 4a sb (r11+74),r1
tty->termios.c_cc[VSUSP] = '\032';
8004c6c: 34 01 00 1a mvi r1,26
8004c70: 31 61 00 4b sb (r11+75),r1
tty->termios.c_cc[VREPRINT] = '\022';
8004c74: 34 01 00 12 mvi r1,18
8004c78: 31 61 00 4d sb (r11+77),r1
tty->termios.c_cc[VDISCARD] = '\017';
8004c7c: 34 01 00 0f mvi r1,15
8004c80: 31 61 00 4e sb (r11+78),r1
tty->termios.c_cc[VWERASE] = '\027';
8004c84: 34 01 00 17 mvi r1,23
8004c88: 31 61 00 4f sb (r11+79),r1
tty->termios.c_cc[VLNEXT] = '\026';
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
8004c8c: 59 60 00 b8 sw (r11+184),r0
tty->termios.c_cc[VSTOP] = '\023';
tty->termios.c_cc[VSUSP] = '\032';
tty->termios.c_cc[VREPRINT] = '\022';
tty->termios.c_cc[VDISCARD] = '\017';
tty->termios.c_cc[VWERASE] = '\027';
tty->termios.c_cc[VLNEXT] = '\026';
8004c90: 34 01 00 16 mvi r1,22
8004c94: 31 61 00 50 sb (r11+80),r1
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
8004c98: 29 61 00 64 lw r1,(r11+100)
8004c9c: 34 02 00 01 mvi r2,1
tty->termios.c_cc[VINTR] = '\003';
tty->termios.c_cc[VQUIT] = '\034';
tty->termios.c_cc[VERASE] = '\177';
tty->termios.c_cc[VKILL] = '\025';
tty->termios.c_cc[VEOF] = '\004';
tty->termios.c_cc[VEOL] = '\000';
8004ca0: 31 60 00 4c sb (r11+76),r0
tty->termios.c_cc[VEOL2] = '\000';
8004ca4: 31 60 00 51 sb (r11+81),r0
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
8004ca8: f8 00 67 3c calli 801e998 <__lshrsi3>
tty->highwater = tty->rawInBuf.Size * 3/4;
8004cac: 29 6d 00 64 lw r13,(r11+100)
/* start with no flow control, clear flow control flags */
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
8004cb0: 59 61 00 bc sw (r11+188),r1
tty->highwater = tty->rawInBuf.Size * 3/4;
8004cb4: 34 02 00 01 mvi r2,1
8004cb8: b9 a0 08 00 mv r1,r13
8004cbc: fb ff f3 b8 calli 8001b9c <__ashlsi3>
8004cc0: 34 02 00 02 mvi r2,2
8004cc4: b4 2d 08 00 add r1,r1,r13
8004cc8: f8 00 67 34 calli 801e998 <__lshrsi3>
/*
* Bump name characer
*/
if (c++ == 'z')
8004ccc: 78 04 08 02 mvhi r4,0x802
8004cd0: 38 84 33 4c ori r4,r4,0x334c
tty->flow_ctrl = 0;
/*
* set low/highwater mark for XON/XOFF support
*/
tty->lowwater = tty->rawInBuf.Size * 1/2;
tty->highwater = tty->rawInBuf.Size * 3/4;
8004cd4: 59 61 00 c0 sw (r11+192),r1
/*
* Bump name characer
*/
if (c++ == 'z')
8004cd8: 40 81 00 00 lbu r1,(r4+0)
8004cdc: 34 22 00 01 addi r2,r1,1
8004ce0: 30 82 00 00 sb (r4+0),r2
8004ce4: 34 02 00 7a mvi r2,122
8004ce8: 5c 22 00 03 bne r1,r2,8004cf4 <rtems_termios_open+0x3e0>
c = 'a';
8004cec: 34 01 00 61 mvi r1,97
8004cf0: 30 81 00 00 sb (r4+0),r1
}
args->iop->data1 = tty;
8004cf4: 2a 81 00 00 lw r1,(r20+0)
if (!tty->refcount++) {
8004cf8: 29 82 00 08 lw r2,(r12+8)
*/
if (c++ == 'z')
c = 'a';
}
args->iop->data1 = tty;
8004cfc: 58 2c 00 38 sw (r1+56),r12
if (!tty->refcount++) {
8004d00: 34 41 00 01 addi r1,r2,1
8004d04: 59 81 00 08 sw (r12+8),r1
8004d08: 5c 40 00 18 bne r2,r0,8004d68 <rtems_termios_open+0x454> <== NEVER TAKEN
if (tty->device.firstOpen)
8004d0c: 29 84 00 98 lw r4,(r12+152)
8004d10: 44 82 00 05 be r4,r2,8004d24 <rtems_termios_open+0x410> <== ALWAYS TAKEN
(*tty->device.firstOpen)(major, minor, arg);
8004d14: ba 20 08 00 mv r1,r17 <== NOT EXECUTED
8004d18: ba 40 10 00 mv r2,r18 <== NOT EXECUTED
8004d1c: ba 80 18 00 mv r3,r20 <== NOT EXECUTED
8004d20: d8 80 00 00 call r4 <== NOT EXECUTED
/*
* start I/O tasks, if needed
*/
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
8004d24: 29 82 00 b4 lw r2,(r12+180)
8004d28: 34 01 00 02 mvi r1,2
8004d2c: 5c 41 00 0f bne r2,r1,8004d68 <rtems_termios_open+0x454>
sc = rtems_task_start(
8004d30: 29 81 00 c4 lw r1,(r12+196)
8004d34: 78 02 08 00 mvhi r2,0x800
8004d38: 38 42 62 9c ori r2,r2,0x629c
8004d3c: b9 80 18 00 mv r3,r12
8004d40: f8 00 0a 28 calli 80075e0 <rtems_task_start>
8004d44: b8 20 58 00 mv r11,r1
tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
8004d48: 5c 20 00 07 bne r1,r0,8004d64 <rtems_termios_open+0x450> <== NEVER TAKEN
rtems_fatal_error_occurred (sc);
sc = rtems_task_start(
8004d4c: 29 81 00 c8 lw r1,(r12+200)
8004d50: 78 02 08 00 mvhi r2,0x800
8004d54: 38 42 65 1c ori r2,r2,0x651c
8004d58: b9 80 18 00 mv r3,r12
8004d5c: f8 00 0a 21 calli 80075e0 <rtems_task_start>
tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty);
if (sc != RTEMS_SUCCESSFUL)
8004d60: 44 2b 00 02 be r1,r11,8004d68 <rtems_termios_open+0x454> <== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
8004d64: f8 00 0a cc calli 8007894 <rtems_fatal_error_occurred> <== NOT EXECUTED
}
}
rtems_semaphore_release (rtems_termios_ttyMutex);
8004d68: 78 01 08 02 mvhi r1,0x802
8004d6c: 38 21 3a e0 ori r1,r1,0x3ae0
8004d70: 28 21 00 00 lw r1,(r1+0)
8004d74: f8 00 09 35 calli 8007248 <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
}
8004d78: b9 e0 08 00 mv r1,r15
8004d7c: 2b 9d 00 04 lw ra,(sp+4)
8004d80: 2b 8b 00 2c lw r11,(sp+44)
8004d84: 2b 8c 00 28 lw r12,(sp+40)
8004d88: 2b 8d 00 24 lw r13,(sp+36)
8004d8c: 2b 8e 00 20 lw r14,(sp+32)
8004d90: 2b 8f 00 1c lw r15,(sp+28)
8004d94: 2b 90 00 18 lw r16,(sp+24)
8004d98: 2b 91 00 14 lw r17,(sp+20)
8004d9c: 2b 92 00 10 lw r18,(sp+16)
8004da0: 2b 93 00 0c lw r19,(sp+12)
8004da4: 2b 94 00 08 lw r20,(sp+8)
8004da8: 37 9c 00 2c addi sp,sp,44
8004dac: c3 a0 00 00 ret
static char c = 'a';
/*
* Create a new device
*/
tty = calloc (1, sizeof (struct rtems_termios_tty));
8004db0: 34 01 00 01 mvi r1,1
8004db4: 34 02 00 e8 mvi r2,232
8004db8: fb ff f7 5d calli 8002b2c <calloc>
8004dbc: b8 20 60 00 mv r12,r1
8004dc0: b8 20 58 00 mv r11,r1
if (tty == NULL) {
8004dc4: 5c 20 fe f8 bne r1,r0,80049a4 <rtems_termios_open+0x90>
8004dc8: e3 ff ff 02 bi 80049d0 <rtems_termios_open+0xbc>
0800538c <rtems_termios_puts>:
* Send characters to device-specific code
*/
void
rtems_termios_puts (
const void *_buf, int len, struct rtems_termios_tty *tty)
{
800538c: 37 9c ff dc addi sp,sp,-36
8005390: 5b 8b 00 24 sw (sp+36),r11
8005394: 5b 8c 00 20 sw (sp+32),r12
8005398: 5b 8d 00 1c sw (sp+28),r13
800539c: 5b 8e 00 18 sw (sp+24),r14
80053a0: 5b 8f 00 14 sw (sp+20),r15
80053a4: 5b 90 00 10 sw (sp+16),r16
80053a8: 5b 91 00 0c sw (sp+12),r17
80053ac: 5b 92 00 08 sw (sp+8),r18
80053b0: 5b 9d 00 04 sw (sp+4),ra
80053b4: b8 20 20 00 mv r4,r1
const unsigned char *buf = _buf;
80053b8: b8 20 68 00 mv r13,r1
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
80053bc: 28 61 00 b4 lw r1,(r3+180)
* Send characters to device-specific code
*/
void
rtems_termios_puts (
const void *_buf, int len, struct rtems_termios_tty *tty)
{
80053c0: b8 40 70 00 mv r14,r2
80053c4: b8 60 58 00 mv r11,r3
const unsigned char *buf = _buf;
unsigned int newHead;
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
80053c8: 5c 20 00 07 bne r1,r0,80053e4 <rtems_termios_puts+0x58>
(*tty->device.write)(tty->minor, (void *)buf, len);
80053cc: 28 65 00 a4 lw r5,(r3+164)
80053d0: 28 61 00 10 lw r1,(r3+16)
80053d4: b8 80 10 00 mv r2,r4
80053d8: b9 c0 18 00 mv r3,r14
80053dc: d8 a0 00 00 call r5
return;
80053e0: e0 00 00 36 bi 80054b8 <rtems_termios_puts+0x12c>
}
newHead = tty->rawOutBuf.Head;
80053e4: 28 6c 00 80 lw r12,(r3+128)
*
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
rtems_interrupt_disable (level);
80053e8: 34 10 ff fe mvi r16,-2
while (newHead == tty->rawOutBuf.Tail) {
tty->rawOutBufState = rob_wait;
80053ec: 34 12 00 02 mvi r18,2
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
} else {
/* remember that output has been stopped due to flow ctrl*/
tty->flow_ctrl |= FL_OSTOP;
}
tty->rawOutBufState = rob_busy;
80053f0: 34 11 00 01 mvi r17,1
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
(*tty->device.write)(tty->minor, (void *)buf, len);
return;
}
newHead = tty->rawOutBuf.Head;
while (len) {
80053f4: e0 00 00 30 bi 80054b4 <rtems_termios_puts+0x128>
* len -= ncopy
*
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
80053f8: 29 62 00 88 lw r2,(r11+136)
80053fc: 35 81 00 01 addi r1,r12,1
8005400: f8 00 66 02 calli 801ec08 <__umodsi3>
8005404: b8 20 60 00 mv r12,r1
rtems_interrupt_disable (level);
8005408: 90 00 78 00 rcsr r15,IE
800540c: a1 f0 08 00 and r1,r15,r16
8005410: d0 01 00 00 wcsr IE,r1
while (newHead == tty->rawOutBuf.Tail) {
8005414: e0 00 00 0c bi 8005444 <rtems_termios_puts+0xb8>
tty->rawOutBufState = rob_wait;
8005418: 59 72 00 94 sw (r11+148),r18
rtems_interrupt_enable (level);
800541c: d0 0f 00 00 wcsr IE,r15
sc = rtems_semaphore_obtain(
8005420: 29 61 00 8c lw r1,(r11+140)
8005424: 34 02 00 00 mvi r2,0
8005428: 34 03 00 00 mvi r3,0
800542c: f8 00 07 37 calli 8007108 <rtems_semaphore_obtain>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
8005430: 44 20 00 02 be r1,r0,8005438 <rtems_termios_puts+0xac> <== ALWAYS TAKEN
rtems_fatal_error_occurred (sc);
8005434: f8 00 09 18 calli 8007894 <rtems_fatal_error_occurred> <== NOT EXECUTED
rtems_interrupt_disable (level);
8005438: 90 00 78 00 rcsr r15,IE
800543c: a1 f0 08 00 and r1,r15,r16
8005440: d0 01 00 00 wcsr IE,r1
* To minimize latency, the memcpy should be done
* with interrupts enabled.
*/
newHead = (newHead + 1) % tty->rawOutBuf.Size;
rtems_interrupt_disable (level);
while (newHead == tty->rawOutBuf.Tail) {
8005444: 29 61 00 84 lw r1,(r11+132)
8005448: 45 81 ff f4 be r12,r1,8005418 <rtems_termios_puts+0x8c>
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
800544c: 29 61 00 80 lw r1,(r11+128)
8005450: 29 62 00 7c lw r2,(r11+124)
8005454: b4 41 08 00 add r1,r2,r1
8005458: 41 a2 00 00 lbu r2,(r13+0)
800545c: 35 ad 00 01 addi r13,r13,1
8005460: 30 22 00 00 sb (r1+0),r2
tty->rawOutBuf.Head = newHead;
if (tty->rawOutBufState == rob_idle) {
8005464: 29 61 00 94 lw r1,(r11+148)
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
tty->rawOutBuf.Head = newHead;
8005468: 59 6c 00 80 sw (r11+128),r12
if (tty->rawOutBufState == rob_idle) {
800546c: 5c 20 00 10 bne r1,r0,80054ac <rtems_termios_puts+0x120>
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
8005470: 29 62 00 b8 lw r2,(r11+184)
8005474: 20 42 00 10 andi r2,r2,0x10
8005478: 5c 41 00 09 bne r2,r1,800549c <rtems_termios_puts+0x110> <== NEVER TAKEN
(*tty->device.write)(tty->minor,
800547c: 29 63 00 7c lw r3,(r11+124)
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
8005480: 29 62 00 84 lw r2,(r11+132)
tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++;
tty->rawOutBuf.Head = newHead;
if (tty->rawOutBufState == rob_idle) {
/* check, whether XOFF has been received */
if (!(tty->flow_ctrl & FL_ORCVXOF)) {
(*tty->device.write)(tty->minor,
8005484: 29 64 00 a4 lw r4,(r11+164)
8005488: 29 61 00 10 lw r1,(r11+16)
800548c: b4 62 10 00 add r2,r3,r2
8005490: 34 03 00 01 mvi r3,1
8005494: d8 80 00 00 call r4
8005498: e0 00 00 04 bi 80054a8 <rtems_termios_puts+0x11c>
(char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
} else {
/* remember that output has been stopped due to flow ctrl*/
tty->flow_ctrl |= FL_OSTOP;
800549c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
80054a0: 38 21 00 20 ori r1,r1,0x20 <== NOT EXECUTED
80054a4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
}
tty->rawOutBufState = rob_busy;
80054a8: 59 71 00 94 sw (r11+148),r17
}
rtems_interrupt_enable (level);
80054ac: d0 0f 00 00 wcsr IE,r15
len--;
80054b0: 35 ce ff ff addi r14,r14,-1
if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) {
(*tty->device.write)(tty->minor, (void *)buf, len);
return;
}
newHead = tty->rawOutBuf.Head;
while (len) {
80054b4: 5d c0 ff d1 bne r14,r0,80053f8 <rtems_termios_puts+0x6c> <== NEVER TAKEN
tty->rawOutBufState = rob_busy;
}
rtems_interrupt_enable (level);
len--;
}
}
80054b8: 2b 9d 00 04 lw ra,(sp+4)
80054bc: 2b 8b 00 24 lw r11,(sp+36)
80054c0: 2b 8c 00 20 lw r12,(sp+32)
80054c4: 2b 8d 00 1c lw r13,(sp+28)
80054c8: 2b 8e 00 18 lw r14,(sp+24)
80054cc: 2b 8f 00 14 lw r15,(sp+20)
80054d0: 2b 90 00 10 lw r16,(sp+16)
80054d4: 2b 91 00 0c lw r17,(sp+12)
80054d8: 2b 92 00 08 lw r18,(sp+8)
80054dc: 37 9c 00 24 addi sp,sp,36
80054e0: c3 a0 00 00 ret
08005c04 <rtems_termios_read>:
return RTEMS_SUCCESSFUL;
}
rtems_status_code
rtems_termios_read (void *arg)
{
8005c04: 37 9c ff cc addi sp,sp,-52
8005c08: 5b 8b 00 34 sw (sp+52),r11
8005c0c: 5b 8c 00 30 sw (sp+48),r12
8005c10: 5b 8d 00 2c sw (sp+44),r13
8005c14: 5b 8e 00 28 sw (sp+40),r14
8005c18: 5b 8f 00 24 sw (sp+36),r15
8005c1c: 5b 90 00 20 sw (sp+32),r16
8005c20: 5b 91 00 1c sw (sp+28),r17
8005c24: 5b 92 00 18 sw (sp+24),r18
8005c28: 5b 93 00 14 sw (sp+20),r19
8005c2c: 5b 94 00 10 sw (sp+16),r20
8005c30: 5b 95 00 0c sw (sp+12),r21
8005c34: 5b 96 00 08 sw (sp+8),r22
8005c38: 5b 9d 00 04 sw (sp+4),ra
8005c3c: b8 20 60 00 mv r12,r1
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8005c40: 28 21 00 00 lw r1,(r1+0)
uint32_t count = args->count;
char *buffer = args->buffer;
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8005c44: 34 02 00 00 mvi r2,0
8005c48: 34 03 00 00 mvi r3,0
rtems_status_code
rtems_termios_read (void *arg)
{
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8005c4c: 28 2b 00 38 lw r11,(r1+56)
uint32_t count = args->count;
8005c50: 29 8f 00 14 lw r15,(r12+20)
char *buffer = args->buffer;
8005c54: 29 91 00 10 lw r17,(r12+16)
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8005c58: 29 61 00 14 lw r1,(r11+20)
8005c5c: f8 00 05 2b calli 8007108 <rtems_semaphore_obtain>
8005c60: b8 20 70 00 mv r14,r1
if (sc != RTEMS_SUCCESSFUL)
8005c64: 5c 20 00 ad bne r1,r0,8005f18 <rtems_termios_read+0x314> <== NEVER TAKEN
return sc;
if (rtems_termios_linesw[tty->t_line].l_read != NULL) {
8005c68: 29 61 00 cc lw r1,(r11+204)
8005c6c: 78 0d 08 02 mvhi r13,0x802
8005c70: 34 02 00 05 mvi r2,5
8005c74: fb ff ef ca calli 8001b9c <__ashlsi3>
8005c78: 39 ad 39 14 ori r13,r13,0x3914
8005c7c: b5 a1 08 00 add r1,r13,r1
8005c80: 28 23 00 08 lw r3,(r1+8)
8005c84: 44 6e 00 06 be r3,r14,8005c9c <rtems_termios_read+0x98>
sc = rtems_termios_linesw[tty->t_line].l_read(tty,args);
8005c88: b9 60 08 00 mv r1,r11
8005c8c: b9 80 10 00 mv r2,r12
8005c90: d8 60 00 00 call r3
8005c94: b8 20 70 00 mv r14,r1
8005c98: e0 00 00 9d bi 8005f0c <rtems_termios_read+0x308>
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
return sc;
}
if (tty->cindex == tty->ccount) {
8005c9c: 29 62 00 24 lw r2,(r11+36)
8005ca0: 29 61 00 20 lw r1,(r11+32)
8005ca4: 5c 41 00 93 bne r2,r1,8005ef0 <rtems_termios_read+0x2ec> <== NEVER TAKEN
tty->cindex = tty->ccount = 0;
tty->read_start_column = tty->column;
8005ca8: 29 61 00 28 lw r1,(r11+40)
rtems_semaphore_release (tty->isem);
return sc;
}
if (tty->cindex == tty->ccount) {
tty->cindex = tty->ccount = 0;
8005cac: 59 60 00 20 sw (r11+32),r0
8005cb0: 59 60 00 24 sw (r11+36),r0
tty->read_start_column = tty->column;
8005cb4: 59 61 00 2c sw (r11+44),r1
if (tty->device.pollRead != NULL &&
8005cb8: 29 61 00 a0 lw r1,(r11+160)
8005cbc: 44 20 00 31 be r1,r0,8005d80 <rtems_termios_read+0x17c>
8005cc0: 29 61 00 b4 lw r1,(r11+180)
8005cc4: 5c 20 00 2f bne r1,r0,8005d80 <rtems_termios_read+0x17c>
static rtems_status_code
fillBufferPoll (struct rtems_termios_tty *tty)
{
int n;
if (tty->termios.c_lflag & ICANON) {
8005cc8: 29 61 00 3c lw r1,(r11+60)
8005ccc: 20 21 00 02 andi r1,r1,0x2
8005cd0: 44 20 00 0d be r1,r0,8005d04 <rtems_termios_read+0x100>
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
8005cd4: 29 62 00 a0 lw r2,(r11+160)
8005cd8: 29 61 00 10 lw r1,(r11+16)
8005cdc: d8 40 00 00 call r2
if (n < 0) {
8005ce0: 4c 20 00 04 bge r1,r0,8005cf0 <rtems_termios_read+0xec>
rtems_task_wake_after (1);
8005ce4: 34 01 00 01 mvi r1,1
8005ce8: f8 00 06 5e calli 8007660 <rtems_task_wake_after>
8005cec: e3 ff ff fa bi 8005cd4 <rtems_termios_read+0xd0>
} else {
if (siproc (n, tty))
8005cf0: 20 21 00 ff andi r1,r1,0xff
8005cf4: b9 60 10 00 mv r2,r11
8005cf8: fb ff ff 6b calli 8005aa4 <siproc>
8005cfc: 44 20 ff f6 be r1,r0,8005cd4 <rtems_termios_read+0xd0>
8005d00: e0 00 00 7c bi 8005ef0 <rtems_termios_read+0x2ec>
}
}
} else {
rtems_interval then, now;
then = rtems_clock_get_ticks_since_boot();
8005d04: f8 00 03 38 calli 80069e4 <rtems_clock_get_ticks_since_boot>
8005d08: b8 20 68 00 mv r13,r1
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
8005d0c: 29 62 00 a0 lw r2,(r11+160)
8005d10: 29 61 00 10 lw r1,(r11+16)
8005d14: d8 40 00 00 call r2
if (n < 0) {
8005d18: 4c 20 00 10 bge r1,r0,8005d58 <rtems_termios_read+0x154>
if (tty->termios.c_cc[VMIN]) {
8005d1c: 41 61 00 47 lbu r1,(r11+71)
8005d20: 41 62 00 46 lbu r2,(r11+70)
8005d24: 44 20 00 05 be r1,r0,8005d38 <rtems_termios_read+0x134> <== NEVER TAKEN
if (tty->termios.c_cc[VTIME] && tty->ccount) {
8005d28: 44 40 00 09 be r2,r0,8005d4c <rtems_termios_read+0x148> <== NEVER TAKEN
8005d2c: 29 61 00 20 lw r1,(r11+32)
8005d30: 44 20 00 07 be r1,r0,8005d4c <rtems_termios_read+0x148>
8005d34: e0 00 00 02 bi 8005d3c <rtems_termios_read+0x138>
if ((now - then) > tty->vtimeTicks) {
break;
}
}
} else {
if (!tty->termios.c_cc[VTIME])
8005d38: 44 41 00 6e be r2,r1,8005ef0 <rtems_termios_read+0x2ec> <== NOT EXECUTED
break;
now = rtems_clock_get_ticks_since_boot();
8005d3c: f8 00 03 2a calli 80069e4 <rtems_clock_get_ticks_since_boot>
if ((now - then) > tty->vtimeTicks) {
8005d40: 29 62 00 54 lw r2,(r11+84)
8005d44: c8 2d 08 00 sub r1,r1,r13
8005d48: 54 22 00 6a bgu r1,r2,8005ef0 <rtems_termios_read+0x2ec>
break;
}
}
rtems_task_wake_after (1);
8005d4c: 34 01 00 01 mvi r1,1
8005d50: f8 00 06 44 calli 8007660 <rtems_task_wake_after>
8005d54: e3 ff ff ee bi 8005d0c <rtems_termios_read+0x108>
} else {
siproc (n, tty);
8005d58: b9 60 10 00 mv r2,r11
8005d5c: 20 21 00 ff andi r1,r1,0xff
8005d60: fb ff ff 51 calli 8005aa4 <siproc>
if (tty->ccount >= tty->termios.c_cc[VMIN])
8005d64: 41 61 00 47 lbu r1,(r11+71)
8005d68: 29 62 00 20 lw r2,(r11+32)
8005d6c: 4c 41 00 61 bge r2,r1,8005ef0 <rtems_termios_read+0x2ec> <== NEVER TAKEN
break;
if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME])
8005d70: 44 20 ff e7 be r1,r0,8005d0c <rtems_termios_read+0x108> <== NEVER TAKEN
8005d74: 41 61 00 46 lbu r1,(r11+70)
8005d78: 44 20 ff e5 be r1,r0,8005d0c <rtems_termios_read+0x108> <== NEVER TAKEN
8005d7c: e3 ff ff e2 bi 8005d04 <rtems_termios_read+0x100>
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
(tty->ccount < (CBUFSIZE-1))) {
8005d80: 78 10 08 02 mvhi r16,0x802
* Fill the input buffer from the raw input queue
*/
static rtems_status_code
fillBufferQueue (struct rtems_termios_tty *tty)
{
rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
8005d84: 29 72 00 74 lw r18,(r11+116)
rtems_status_code sc;
int wait = (int)1;
8005d88: 34 0d 00 01 mvi r13,1
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
(tty->ccount < (CBUFSIZE-1))) {
8005d8c: 3a 10 33 40 ori r16,r16,0x3340
c = tty->rawInBuf.theBuf[newHead];
tty->rawInBuf.Head = newHead;
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
% tty->rawInBuf.Size)
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
8005d90: 34 16 ff fe mvi r22,-2
/* if tx stopped and XON should be sent... */
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
8005d94: 34 15 02 02 mvi r21,514
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
tty->flow_ctrl &= ~FL_IRTSOFF;
8005d98: 34 14 ff fb mvi r20,-5
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
== (FL_MDXON | FL_ISNTXOF))
&& ((tty->rawOutBufState == rob_idle)
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
8005d9c: 35 73 00 49 addi r19,r11,73
8005da0: e0 00 00 3e bi 8005e98 <rtems_termios_read+0x294>
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
(tty->ccount < (CBUFSIZE-1))) {
unsigned char c;
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
8005da4: 29 61 00 5c lw r1,(r11+92)
8005da8: 29 62 00 64 lw r2,(r11+100)
8005dac: 34 21 00 01 addi r1,r1,1
8005db0: f8 00 63 96 calli 801ec08 <__umodsi3>
8005db4: b8 20 18 00 mv r3,r1
c = tty->rawInBuf.theBuf[newHead];
8005db8: 29 61 00 58 lw r1,(r11+88)
8005dbc: b4 23 08 00 add r1,r1,r3
8005dc0: 40 32 00 00 lbu r18,(r1+0)
tty->rawInBuf.Head = newHead;
8005dc4: 59 63 00 5c sw (r11+92),r3
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
8005dc8: 29 61 00 60 lw r1,(r11+96)
8005dcc: 29 64 00 64 lw r4,(r11+100)
% tty->rawInBuf.Size)
8005dd0: 29 62 00 64 lw r2,(r11+100)
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
c = tty->rawInBuf.theBuf[newHead];
tty->rawInBuf.Head = newHead;
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
8005dd4: b4 81 08 00 add r1,r4,r1
% tty->rawInBuf.Size)
8005dd8: c8 23 08 00 sub r1,r1,r3
8005ddc: f8 00 63 8b calli 801ec08 <__umodsi3>
unsigned int newHead;
newHead = (tty->rawInBuf.Head + 1) % tty->rawInBuf.Size;
c = tty->rawInBuf.theBuf[newHead];
tty->rawInBuf.Head = newHead;
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
8005de0: 29 62 00 bc lw r2,(r11+188)
8005de4: 50 22 00 1c bgeu r1,r2,8005e54 <rtems_termios_read+0x250> <== NEVER TAKEN
% tty->rawInBuf.Size)
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
8005de8: 29 61 00 b8 lw r1,(r11+184)
8005dec: a0 36 08 00 and r1,r1,r22
8005df0: 59 61 00 b8 sw (r11+184),r1
/* if tx stopped and XON should be sent... */
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
8005df4: 29 61 00 b8 lw r1,(r11+184)
8005df8: 20 21 02 02 andi r1,r1,0x202
8005dfc: 5c 35 00 0c bne r1,r21,8005e2c <rtems_termios_read+0x228> <== ALWAYS TAKEN
== (FL_MDXON | FL_ISNTXOF))
&& ((tty->rawOutBufState == rob_idle)
8005e00: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED
8005e04: 44 20 00 04 be r1,r0,8005e14 <rtems_termios_read+0x210> <== NOT EXECUTED
|| (tty->flow_ctrl & FL_OSTOP))) {
8005e08: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
8005e0c: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED
8005e10: 44 20 00 07 be r1,r0,8005e2c <rtems_termios_read+0x228> <== NOT EXECUTED
/* XON should be sent now... */
(*tty->device.write)(
8005e14: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8005e18: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8005e1c: ba 60 10 00 mv r2,r19 <== NOT EXECUTED
8005e20: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8005e24: d8 80 00 00 call r4 <== NOT EXECUTED
8005e28: e0 00 00 0b bi 8005e54 <rtems_termios_read+0x250> <== NOT EXECUTED
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
8005e2c: 29 61 00 b8 lw r1,(r11+184)
8005e30: 20 21 01 00 andi r1,r1,0x100
8005e34: 44 20 00 08 be r1,r0,8005e54 <rtems_termios_read+0x250> <== ALWAYS TAKEN
tty->flow_ctrl &= ~FL_IRTSOFF;
8005e38: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED
/* activate RTS line */
if (tty->device.startRemoteTx != NULL) {
8005e3c: 29 63 00 b0 lw r3,(r11+176) <== NOT EXECUTED
|| (tty->flow_ctrl & FL_OSTOP))) {
/* XON should be sent now... */
(*tty->device.write)(
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
tty->flow_ctrl &= ~FL_IRTSOFF;
8005e40: a0 34 08 00 and r1,r1,r20 <== NOT EXECUTED
8005e44: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED
/* activate RTS line */
if (tty->device.startRemoteTx != NULL) {
8005e48: 44 60 00 03 be r3,r0,8005e54 <rtems_termios_read+0x250> <== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
8005e4c: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8005e50: d8 60 00 00 call r3 <== NOT EXECUTED
}
}
}
/* continue processing new character */
if (tty->termios.c_lflag & ICANON) {
8005e54: 29 61 00 3c lw r1,(r11+60)
8005e58: 20 21 00 02 andi r1,r1,0x2
8005e5c: 44 20 00 06 be r1,r0,8005e74 <rtems_termios_read+0x270> <== NEVER TAKEN
if (siproc (c, tty))
8005e60: ba 40 08 00 mv r1,r18
8005e64: b9 60 10 00 mv r2,r11
8005e68: fb ff ff 0f calli 8005aa4 <siproc>
wait = 0;
8005e6c: 64 21 00 00 cmpei r1,r1,0
8005e70: e0 00 00 07 bi 8005e8c <rtems_termios_read+0x288>
} else {
siproc (c, tty);
8005e74: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8005e78: ba 40 08 00 mv r1,r18 <== NOT EXECUTED
8005e7c: fb ff ff 0a calli 8005aa4 <siproc> <== NOT EXECUTED
if (tty->ccount >= tty->termios.c_cc[VMIN])
8005e80: 41 61 00 47 lbu r1,(r11+71) <== NOT EXECUTED
8005e84: 29 62 00 20 lw r2,(r11+32) <== NOT EXECUTED
wait = 0;
8005e88: e8 22 08 00 cmpg r1,r1,r2 <== NOT EXECUTED
}
timeout = tty->rawInBufSemaphoreTimeout;
8005e8c: 29 72 00 70 lw r18,(r11+112)
if (siproc (c, tty))
wait = 0;
} else {
siproc (c, tty);
if (tty->ccount >= tty->termios.c_cc[VMIN])
wait = 0;
8005e90: c8 01 08 00 sub r1,r0,r1
8005e94: a1 a1 68 00 and r13,r13,r1
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8005e98: 29 62 00 5c lw r2,(r11+92)
8005e9c: 29 61 00 60 lw r1,(r11+96)
8005ea0: 44 41 00 05 be r2,r1,8005eb4 <rtems_termios_read+0x2b0>
(tty->ccount < (CBUFSIZE-1))) {
8005ea4: 2a 01 00 00 lw r1,(r16+0)
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8005ea8: 29 62 00 20 lw r2,(r11+32)
(tty->ccount < (CBUFSIZE-1))) {
8005eac: 34 21 ff ff addi r1,r1,-1
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
8005eb0: 48 22 ff bd bg r1,r2,8005da4 <rtems_termios_read+0x1a0> <== ALWAYS TAKEN
}
/*
* Wait for characters
*/
if ( wait ) {
8005eb4: 45 a0 00 0f be r13,r0,8005ef0 <rtems_termios_read+0x2ec>
sc = rtems_semaphore_obtain(
8005eb8: 29 61 00 68 lw r1,(r11+104)
8005ebc: 29 62 00 6c lw r2,(r11+108)
8005ec0: ba 40 18 00 mv r3,r18
8005ec4: f8 00 04 91 calli 8007108 <rtems_semaphore_obtain>
tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout);
if (sc != RTEMS_SUCCESSFUL)
8005ec8: 44 20 ff f4 be r1,r0,8005e98 <rtems_termios_read+0x294> <== ALWAYS TAKEN
8005ecc: e0 00 00 09 bi 8005ef0 <rtems_termios_read+0x2ec> <== NOT EXECUTED
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
*buffer++ = tty->cbuf[tty->cindex++];
8005ed0: 29 62 00 1c lw r2,(r11+28)
count--;
8005ed4: 35 ef ff ff addi r15,r15,-1
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
*buffer++ = tty->cbuf[tty->cindex++];
8005ed8: b4 41 10 00 add r2,r2,r1
8005edc: 40 42 00 00 lbu r2,(r2+0)
8005ee0: 34 21 00 01 addi r1,r1,1
8005ee4: 32 22 00 00 sb (r17+0),r2
8005ee8: 59 61 00 24 sw (r11+36),r1
8005eec: 36 31 00 01 addi r17,r17,1
sc = fillBufferQueue (tty);
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
8005ef0: 45 e0 00 04 be r15,r0,8005f00 <rtems_termios_read+0x2fc>
8005ef4: 29 61 00 24 lw r1,(r11+36)
8005ef8: 29 62 00 20 lw r2,(r11+32)
8005efc: 48 41 ff f5 bg r2,r1,8005ed0 <rtems_termios_read+0x2cc>
*buffer++ = tty->cbuf[tty->cindex++];
count--;
}
args->bytes_moved = args->count - count;
8005f00: 29 81 00 14 lw r1,(r12+20)
8005f04: c8 2f 78 00 sub r15,r1,r15
8005f08: 59 8f 00 1c sw (r12+28),r15
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
8005f0c: 29 61 00 14 lw r1,(r11+20)
while (count && (tty->cindex < tty->ccount)) {
*buffer++ = tty->cbuf[tty->cindex++];
count--;
}
args->bytes_moved = args->count - count;
tty->tty_rcvwakeup = 0;
8005f10: 59 60 00 e4 sw (r11+228),r0
rtems_semaphore_release (tty->isem);
8005f14: f8 00 04 cd calli 8007248 <rtems_semaphore_release>
return sc;
}
8005f18: b9 c0 08 00 mv r1,r14
8005f1c: 2b 9d 00 04 lw ra,(sp+4)
8005f20: 2b 8b 00 34 lw r11,(sp+52)
8005f24: 2b 8c 00 30 lw r12,(sp+48)
8005f28: 2b 8d 00 2c lw r13,(sp+44)
8005f2c: 2b 8e 00 28 lw r14,(sp+40)
8005f30: 2b 8f 00 24 lw r15,(sp+36)
8005f34: 2b 90 00 20 lw r16,(sp+32)
8005f38: 2b 91 00 1c lw r17,(sp+28)
8005f3c: 2b 92 00 18 lw r18,(sp+24)
8005f40: 2b 93 00 14 lw r19,(sp+20)
8005f44: 2b 94 00 10 lw r20,(sp+16)
8005f48: 2b 95 00 0c lw r21,(sp+12)
8005f4c: 2b 96 00 08 lw r22,(sp+8)
8005f50: 37 9c 00 34 addi sp,sp,52
8005f54: c3 a0 00 00 ret
08006318 <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)
{
8006318: 37 9c ff f0 addi sp,sp,-16
800631c: 5b 8b 00 10 sw (sp+16),r11
8006320: 5b 8c 00 0c sw (sp+12),r12
8006324: 5b 8d 00 08 sw (sp+8),r13
8006328: 5b 9d 00 04 sw (sp+4),ra
int nToSend;
rtems_interrupt_level level;
int len;
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
800632c: 28 22 00 b8 lw r2,(r1+184)
* in task-driven mode, this function is called in Tx task context
* in interrupt-driven mode, this function is called in TxIRQ context
*/
int
rtems_termios_refill_transmitter (struct rtems_termios_tty *tty)
{
8006330: b8 20 58 00 mv r11,r1
int nToSend;
rtems_interrupt_level level;
int len;
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
8006334: 34 01 04 01 mvi r1,1025
8006338: 20 42 04 03 andi r2,r2,0x403
800633c: 5c 41 00 12 bne r2,r1,8006384 <rtems_termios_refill_transmitter+0x6c><== ALWAYS TAKEN
== (FL_MDXOF | FL_IREQXOF)) {
/* XOFF should be sent now... */
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1);
8006340: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8006344: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
8006348: 35 62 00 4a addi r2,r11,74 <== NOT EXECUTED
800634c: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
8006350: d8 80 00 00 call r4 <== NOT EXECUTED
rtems_interrupt_disable(level);
8006354: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED
8006358: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED
800635c: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED
8006360: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
tty->t_dqlen--;
8006364: 29 62 00 90 lw r2,(r11+144) <== NOT EXECUTED
8006368: 34 42 ff ff addi r2,r2,-1 <== NOT EXECUTED
800636c: 59 62 00 90 sw (r11+144),r2 <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
8006370: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
8006374: 38 42 00 02 ori r2,r2,0x2 <== NOT EXECUTED
8006378: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED
rtems_interrupt_enable(level);
800637c: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
8006380: e0 00 00 16 bi 80063d8 <rtems_termios_refill_transmitter+0xc0><== NOT EXECUTED
nToSend = 1;
} else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) {
8006384: 29 62 00 b8 lw r2,(r11+184)
8006388: 34 01 00 02 mvi r1,2
800638c: 20 42 00 03 andi r2,r2,0x3
8006390: 5c 41 00 14 bne r2,r1,80063e0 <rtems_termios_refill_transmitter+0xc8><== ALWAYS TAKEN
* FIXME: this .write call will generate another
* dequeue callback. This will advance the "Tail" in the data
* buffer, although the corresponding data is not yet out!
* Therefore the dequeue "length" should be reduced by 1
*/
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
8006394: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED
8006398: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED
800639c: 35 62 00 49 addi r2,r11,73 <== NOT EXECUTED
80063a0: 34 03 00 01 mvi r3,1 <== NOT EXECUTED
80063a4: d8 80 00 00 call r4 <== NOT EXECUTED
rtems_interrupt_disable(level);
80063a8: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED
80063ac: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED
80063b0: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED
80063b4: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
tty->t_dqlen--;
80063b8: 29 62 00 90 lw r2,(r11+144) <== NOT EXECUTED
tty->flow_ctrl &= ~FL_ISNTXOF;
80063bc: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED
* Therefore the dequeue "length" should be reduced by 1
*/
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
rtems_interrupt_disable(level);
tty->t_dqlen--;
80063c0: 34 42 ff ff addi r2,r2,-1 <== NOT EXECUTED
80063c4: 59 62 00 90 sw (r11+144),r2 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_ISNTXOF;
80063c8: 34 02 ff fd mvi r2,-3 <== NOT EXECUTED
80063cc: a0 62 10 00 and r2,r3,r2 <== NOT EXECUTED
80063d0: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED
rtems_interrupt_enable(level);
80063d4: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
nToSend = 1;
80063d8: 34 0c 00 01 mvi r12,1 <== NOT EXECUTED
80063dc: e0 00 00 49 bi 8006500 <rtems_termios_refill_transmitter+0x1e8><== NOT EXECUTED
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
80063e0: 29 63 00 80 lw r3,(r11+128)
80063e4: 29 62 00 84 lw r2,(r11+132)
80063e8: 5c 62 00 07 bne r3,r2,8006404 <rtems_termios_refill_transmitter+0xec>
/*
* buffer was empty
*/
if (tty->rawOutBufState == rob_wait) {
80063ec: 29 62 00 94 lw r2,(r11+148)
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
return 0;
80063f0: 34 0c 00 00 mvi r12,0
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
/*
* buffer was empty
*/
if (tty->rawOutBufState == rob_wait) {
80063f4: 5c 41 00 43 bne r2,r1,8006500 <rtems_termios_refill_transmitter+0x1e8>
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
80063f8: 29 61 00 8c lw r1,(r11+140) <== NOT EXECUTED
80063fc: f8 00 03 93 calli 8007248 <rtems_semaphore_release> <== NOT EXECUTED
8006400: e0 00 00 40 bi 8006500 <rtems_termios_refill_transmitter+0x1e8><== NOT EXECUTED
}
return 0;
}
rtems_interrupt_disable(level);
8006404: 90 00 10 00 rcsr r2,IE
8006408: 34 01 ff fe mvi r1,-2
800640c: a0 41 08 00 and r1,r2,r1
8006410: d0 01 00 00 wcsr IE,r1
len = tty->t_dqlen;
8006414: 29 63 00 90 lw r3,(r11+144)
tty->t_dqlen = 0;
8006418: 59 60 00 90 sw (r11+144),r0
rtems_interrupt_enable(level);
800641c: d0 02 00 00 wcsr IE,r2
newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size;
8006420: 29 61 00 84 lw r1,(r11+132)
8006424: 29 62 00 88 lw r2,(r11+136)
8006428: b4 61 08 00 add r1,r3,r1
800642c: f8 00 61 f7 calli 801ec08 <__umodsi3>
tty->rawOutBuf.Tail = newTail;
if (tty->rawOutBufState == rob_wait) {
8006430: 29 62 00 94 lw r2,(r11+148)
rtems_interrupt_disable(level);
len = tty->t_dqlen;
tty->t_dqlen = 0;
rtems_interrupt_enable(level);
newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size;
8006434: b8 20 68 00 mv r13,r1
tty->rawOutBuf.Tail = newTail;
8006438: 59 61 00 84 sw (r11+132),r1
if (tty->rawOutBufState == rob_wait) {
800643c: 34 01 00 02 mvi r1,2
8006440: 5c 41 00 03 bne r2,r1,800644c <rtems_termios_refill_transmitter+0x134>
/*
* wake up any pending writer task
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
8006444: 29 61 00 8c lw r1,(r11+140)
8006448: f8 00 03 80 calli 8007248 <rtems_semaphore_release>
}
if (newTail == tty->rawOutBuf.Head) {
800644c: 29 61 00 80 lw r1,(r11+128)
8006450: 5d a1 00 09 bne r13,r1,8006474 <rtems_termios_refill_transmitter+0x15c>
nToSend = 0;
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
8006454: 29 63 00 d4 lw r3,(r11+212)
if (newTail == tty->rawOutBuf.Head) {
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
8006458: 59 60 00 94 sw (r11+148),r0
nToSend = 0;
800645c: 34 0c 00 00 mvi r12,0
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
8006460: 44 60 00 27 be r3,r0,80064fc <rtems_termios_refill_transmitter+0x1e4><== ALWAYS TAKEN
(*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
8006464: 29 62 00 d8 lw r2,(r11+216) <== NOT EXECUTED
8006468: 35 61 00 30 addi r1,r11,48 <== NOT EXECUTED
800646c: d8 60 00 00 call r3 <== NOT EXECUTED
8006470: e0 00 00 23 bi 80064fc <rtems_termios_refill_transmitter+0x1e4><== NOT EXECUTED
}
}
/* check, whether output should stop due to received XOFF */
else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF))
8006474: 29 62 00 b8 lw r2,(r11+184)
8006478: 34 01 02 10 mvi r1,528
800647c: 20 42 02 10 andi r2,r2,0x210
8006480: 5c 41 00 0d bne r2,r1,80064b4 <rtems_termios_refill_transmitter+0x19c><== ALWAYS TAKEN
== (FL_MDXON | FL_ORCVXOF)) {
/* Buffer not empty, but output stops due to XOFF */
/* set flag, that output has been stopped */
rtems_interrupt_disable(level);
8006484: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED
8006488: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED
800648c: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED
8006490: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED
tty->flow_ctrl |= FL_OSTOP;
8006494: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED
8006498: 38 42 00 20 ori r2,r2,0x20 <== NOT EXECUTED
800649c: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED
tty->rawOutBufState = rob_busy; /*apm*/
80064a0: 34 02 00 01 mvi r2,1 <== NOT EXECUTED
80064a4: 59 62 00 94 sw (r11+148),r2 <== NOT EXECUTED
rtems_interrupt_enable(level);
80064a8: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED
nToSend = 0;
80064ac: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED
80064b0: e0 00 00 13 bi 80064fc <rtems_termios_refill_transmitter+0x1e4><== NOT EXECUTED
} else {
/*
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
80064b4: 29 61 00 80 lw r1,(r11+128)
80064b8: 50 2d 00 03 bgeu r1,r13,80064c4 <rtems_termios_refill_transmitter+0x1ac>
nToSend = tty->rawOutBuf.Size - newTail;
80064bc: 29 6c 00 88 lw r12,(r11+136)
80064c0: e0 00 00 02 bi 80064c8 <rtems_termios_refill_transmitter+0x1b0>
else
nToSend = tty->rawOutBuf.Head - newTail;
80064c4: 29 6c 00 80 lw r12,(r11+128)
/* when flow control XON or XOF, don't send blocks of data */
/* to allow fast reaction on incoming flow ctrl and low latency*/
/* for outgoing flow control */
if (tty->flow_ctrl & (FL_MDXON | FL_MDXOF)) {
80064c8: 29 61 00 b8 lw r1,(r11+184)
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
nToSend = tty->rawOutBuf.Size - newTail;
else
nToSend = tty->rawOutBuf.Head - newTail;
80064cc: c9 8d 60 00 sub r12,r12,r13
/* when flow control XON or XOF, don't send blocks of data */
/* to allow fast reaction on incoming flow ctrl and low latency*/
/* for outgoing flow control */
if (tty->flow_ctrl & (FL_MDXON | FL_MDXOF)) {
80064d0: 20 21 06 00 andi r1,r1,0x600
80064d4: 44 20 00 02 be r1,r0,80064dc <rtems_termios_refill_transmitter+0x1c4>
nToSend = 1;
80064d8: 34 0c 00 01 mvi r12,1
}
tty->rawOutBufState = rob_busy; /*apm*/
80064dc: 34 01 00 01 mvi r1,1
(*tty->device.write)(
80064e0: 29 62 00 7c lw r2,(r11+124)
/* to allow fast reaction on incoming flow ctrl and low latency*/
/* for outgoing flow control */
if (tty->flow_ctrl & (FL_MDXON | FL_MDXOF)) {
nToSend = 1;
}
tty->rawOutBufState = rob_busy; /*apm*/
80064e4: 59 61 00 94 sw (r11+148),r1
(*tty->device.write)(
80064e8: 29 64 00 a4 lw r4,(r11+164)
80064ec: 29 61 00 10 lw r1,(r11+16)
80064f0: b4 4d 10 00 add r2,r2,r13
80064f4: b9 80 18 00 mv r3,r12
80064f8: d8 80 00 00 call r4
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
80064fc: 59 6d 00 84 sw (r11+132),r13
}
return nToSend;
}
8006500: b9 80 08 00 mv r1,r12
8006504: 2b 9d 00 04 lw ra,(sp+4)
8006508: 2b 8b 00 10 lw r11,(sp+16)
800650c: 2b 8c 00 0c lw r12,(sp+12)
8006510: 2b 8d 00 08 lw r13,(sp+8)
8006514: 37 9c 00 10 addi sp,sp,16
8006518: c3 a0 00 00 ret
0800629c <rtems_termios_rxdaemon>:
/*
* this task actually processes any receive events
*/
static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument)
{
800629c: 37 9c ff e4 addi sp,sp,-28
80062a0: 5b 8b 00 14 sw (sp+20),r11
80062a4: 5b 8c 00 10 sw (sp+16),r12
80062a8: 5b 8d 00 0c sw (sp+12),r13
80062ac: 5b 8e 00 08 sw (sp+8),r14
80062b0: 5b 9d 00 04 sw (sp+4),ra
/*
* do something
*/
c = tty->device.pollRead(tty->minor);
if (c != EOF) {
80062b4: 34 0d ff ff mvi r13,-1
/*
* this task actually processes any receive events
*/
static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument)
{
80062b8: b8 20 58 00 mv r11,r1
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
80062bc: 37 8e 00 18 addi r14,sp,24
if (c != EOF) {
/*
* pollRead did call enqueue on its own
*/
c_buf = c;
rtems_termios_enqueue_raw_characters ( tty,&c_buf,1);
80062c0: 37 8c 00 1f addi r12,sp,31
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
80062c4: 34 01 00 03 mvi r1,3
80062c8: 34 02 00 02 mvi r2,2
80062cc: 34 03 00 00 mvi r3,0
80062d0: b9 c0 20 00 mv r4,r14
80062d4: f8 00 01 dd calli 8006a48 <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) {
80062d8: 2b 81 00 18 lw r1,(sp+24)
80062dc: 20 21 00 01 andi r1,r1,0x1
80062e0: 44 20 00 04 be r1,r0,80062f0 <rtems_termios_rxdaemon+0x54> <== ALWAYS TAKEN
tty->rxTaskId = 0;
80062e4: 59 60 00 c4 sw (r11+196),r0 <== NOT EXECUTED
rtems_task_delete(RTEMS_SELF);
80062e8: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
80062ec: f8 00 04 6c calli 800749c <rtems_task_delete> <== NOT EXECUTED
}
/*
* do something
*/
c = tty->device.pollRead(tty->minor);
80062f0: 29 62 00 a0 lw r2,(r11+160)
80062f4: 29 61 00 10 lw r1,(r11+16)
80062f8: d8 40 00 00 call r2
if (c != EOF) {
80062fc: 44 2d ff f2 be r1,r13,80062c4 <rtems_termios_rxdaemon+0x28>
/*
* pollRead did call enqueue on its own
*/
c_buf = c;
8006300: 33 81 00 1f sb (sp+31),r1
rtems_termios_enqueue_raw_characters ( tty,&c_buf,1);
8006304: b9 80 10 00 mv r2,r12
8006308: b9 60 08 00 mv r1,r11
800630c: 34 03 00 01 mvi r3,1
8006310: fb ff ff 1a calli 8005f78 <rtems_termios_enqueue_raw_characters>
8006314: e3 ff ff ec bi 80062c4 <rtems_termios_rxdaemon+0x28>
0800651c <rtems_termios_txdaemon>:
/*
* this task actually processes any transmit events
*/
static rtems_task rtems_termios_txdaemon(rtems_task_argument argument)
{
800651c: 37 9c ff f0 addi sp,sp,-16
8006520: 5b 8b 00 0c sw (sp+12),r11
8006524: 5b 8c 00 08 sw (sp+8),r12
8006528: 5b 9d 00 04 sw (sp+4),ra
}
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
800652c: 78 0c 08 02 mvhi r12,0x802
/*
* this task actually processes any transmit events
*/
static rtems_task rtems_termios_txdaemon(rtems_task_argument argument)
{
8006530: b8 20 58 00 mv r11,r1
}
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
8006534: 39 8c 39 14 ori r12,r12,0x3914
while (1) {
/*
* wait for rtems event
*/
rtems_event_receive(
8006538: 34 01 00 03 mvi r1,3
800653c: 34 02 00 02 mvi r2,2
8006540: 34 03 00 00 mvi r3,0
8006544: 37 84 00 10 addi r4,sp,16
8006548: f8 00 01 40 calli 8006a48 <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) {
800654c: 2b 81 00 10 lw r1,(sp+16)
8006550: 20 21 00 01 andi r1,r1,0x1
8006554: 44 20 00 04 be r1,r0,8006564 <rtems_termios_txdaemon+0x48> <== ALWAYS TAKEN
tty->txTaskId = 0;
8006558: 59 60 00 c8 sw (r11+200),r0 <== NOT EXECUTED
rtems_task_delete(RTEMS_SELF);
800655c: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8006560: f8 00 03 cf calli 800749c <rtems_task_delete> <== NOT EXECUTED
}
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
8006564: 29 61 00 cc lw r1,(r11+204)
8006568: 34 02 00 05 mvi r2,5
800656c: fb ff ed 8c calli 8001b9c <__ashlsi3>
8006570: b5 81 08 00 add r1,r12,r1
8006574: 28 22 00 14 lw r2,(r1+20)
8006578: 44 40 00 03 be r2,r0,8006584 <rtems_termios_txdaemon+0x68> <== ALWAYS TAKEN
rtems_termios_linesw[tty->t_line].l_start(tty);
800657c: b9 60 08 00 mv r1,r11
8006580: d8 40 00 00 call r2 <== NOT EXECUTED
}
/*
* try to push further characters to device
*/
rtems_termios_refill_transmitter(tty);
8006584: b9 60 08 00 mv r1,r11
8006588: fb ff ff 64 calli 8006318 <rtems_termios_refill_transmitter>
}
800658c: e3 ff ff eb bi 8006538 <rtems_termios_txdaemon+0x1c>
08005b18 <rtems_termios_write>:
rtems_termios_puts (&c, 1, tty);
}
rtems_status_code
rtems_termios_write (void *arg)
{
8005b18: 37 9c ff e8 addi sp,sp,-24
8005b1c: 5b 8b 00 18 sw (sp+24),r11
8005b20: 5b 8c 00 14 sw (sp+20),r12
8005b24: 5b 8d 00 10 sw (sp+16),r13
8005b28: 5b 8e 00 0c sw (sp+12),r14
8005b2c: 5b 8f 00 08 sw (sp+8),r15
8005b30: 5b 9d 00 04 sw (sp+4),ra
8005b34: b8 20 58 00 mv r11,r1
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8005b38: 28 21 00 00 lw r1,(r1+0)
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8005b3c: 34 02 00 00 mvi r2,0
8005b40: 34 03 00 00 mvi r3,0
rtems_status_code
rtems_termios_write (void *arg)
{
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
8005b44: 28 2c 00 38 lw r12,(r1+56)
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8005b48: 29 81 00 18 lw r1,(r12+24)
8005b4c: f8 00 05 6f calli 8007108 <rtems_semaphore_obtain>
8005b50: b8 20 68 00 mv r13,r1
if (sc != RTEMS_SUCCESSFUL)
8005b54: 5c 20 00 23 bne r1,r0,8005be0 <rtems_termios_write+0xc8> <== NEVER TAKEN
return sc;
if (rtems_termios_linesw[tty->t_line].l_write != NULL) {
8005b58: 29 81 00 cc lw r1,(r12+204)
8005b5c: 78 0e 08 02 mvhi r14,0x802
8005b60: 34 02 00 05 mvi r2,5
8005b64: fb ff f0 0e calli 8001b9c <__ashlsi3>
8005b68: 39 ce 39 14 ori r14,r14,0x3914
8005b6c: b5 c1 08 00 add r1,r14,r1
8005b70: 28 23 00 0c lw r3,(r1+12)
8005b74: 44 6d 00 06 be r3,r13,8005b8c <rtems_termios_write+0x74>
sc = rtems_termios_linesw[tty->t_line].l_write(tty,args);
8005b78: b9 80 08 00 mv r1,r12
8005b7c: b9 60 10 00 mv r2,r11
8005b80: d8 60 00 00 call r3
8005b84: b8 20 68 00 mv r13,r1
8005b88: e0 00 00 14 bi 8005bd8 <rtems_termios_write+0xc0>
rtems_semaphore_release (tty->osem);
return sc;
}
if (tty->termios.c_oflag & OPOST) {
8005b8c: 29 83 00 34 lw r3,(r12+52)
8005b90: 29 62 00 14 lw r2,(r11+20)
8005b94: 29 61 00 10 lw r1,(r11+16)
8005b98: 20 63 00 01 andi r3,r3,0x1
uint32_t count = args->count;
8005b9c: b8 40 78 00 mv r15,r2
char *buffer = args->buffer;
8005ba0: b8 20 70 00 mv r14,r1
if (rtems_termios_linesw[tty->t_line].l_write != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_write(tty,args);
rtems_semaphore_release (tty->osem);
return sc;
}
if (tty->termios.c_oflag & OPOST) {
8005ba4: 5c 60 00 07 bne r3,r0,8005bc0 <rtems_termios_write+0xa8> <== ALWAYS TAKEN
8005ba8: e0 00 00 08 bi 8005bc8 <rtems_termios_write+0xb0> <== NOT EXECUTED
uint32_t count = args->count;
char *buffer = args->buffer;
while (count--)
oproc (*buffer++, tty);
8005bac: 41 c1 00 00 lbu r1,(r14+0)
8005bb0: b9 80 10 00 mv r2,r12
8005bb4: 35 ce 00 01 addi r14,r14,1
8005bb8: fb ff fe 4b calli 80054e4 <oproc>
8005bbc: 35 ef ff ff addi r15,r15,-1
return sc;
}
if (tty->termios.c_oflag & OPOST) {
uint32_t count = args->count;
char *buffer = args->buffer;
while (count--)
8005bc0: 5d e0 ff fb bne r15,r0,8005bac <rtems_termios_write+0x94>
8005bc4: e0 00 00 03 bi 8005bd0 <rtems_termios_write+0xb8>
oproc (*buffer++, tty);
args->bytes_moved = args->count;
} else {
rtems_termios_puts (args->buffer, args->count, tty);
8005bc8: b9 80 18 00 mv r3,r12 <== NOT EXECUTED
8005bcc: fb ff fd f0 calli 800538c <rtems_termios_puts> <== NOT EXECUTED
args->bytes_moved = args->count;
8005bd0: 29 61 00 14 lw r1,(r11+20)
8005bd4: 59 61 00 1c sw (r11+28),r1
}
rtems_semaphore_release (tty->osem);
8005bd8: 29 81 00 18 lw r1,(r12+24)
8005bdc: f8 00 05 9b calli 8007248 <rtems_semaphore_release>
return sc;
}
8005be0: b9 a0 08 00 mv r1,r13
8005be4: 2b 9d 00 04 lw ra,(sp+4)
8005be8: 2b 8b 00 18 lw r11,(sp+24)
8005bec: 2b 8c 00 14 lw r12,(sp+20)
8005bf0: 2b 8d 00 10 lw r13,(sp+16)
8005bf4: 2b 8e 00 0c lw r14,(sp+12)
8005bf8: 2b 8f 00 08 lw r15,(sp+8)
8005bfc: 37 9c 00 18 addi sp,sp,24
8005c00: c3 a0 00 00 ret
08013e74 <rtems_timer_cancel>:
*/
rtems_status_code rtems_timer_cancel(
rtems_id id
)
{
8013e74: 37 9c ff f8 addi sp,sp,-8
8013e78: 5b 9d 00 04 sw (sp+4),ra
8013e7c: b8 20 10 00 mv r2,r1
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
8013e80: 78 01 08 04 mvhi r1,0x804
8013e84: 38 21 05 bc ori r1,r1,0x5bc
8013e88: 37 83 00 08 addi r3,sp,8
8013e8c: f8 00 0e a2 calli 8017914 <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
8013e90: 2b 82 00 08 lw r2,(sp+8)
8013e94: 5c 40 00 09 bne r2,r0,8013eb8 <rtems_timer_cancel+0x44>
case OBJECTS_LOCAL:
if ( !_Timer_Is_dormant_class( the_timer->the_class ) )
8013e98: 28 23 00 38 lw r3,(r1+56)
8013e9c: 34 02 00 04 mvi r2,4
8013ea0: 44 62 00 03 be r3,r2,8013eac <rtems_timer_cancel+0x38> <== NEVER TAKEN
(void) _Watchdog_Remove( &the_timer->Ticker );
8013ea4: 34 21 00 10 addi r1,r1,16
8013ea8: f8 00 18 41 calli 8019fac <_Watchdog_Remove>
_Thread_Enable_dispatch();
8013eac: f8 00 12 53 calli 80187f8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8013eb0: 34 01 00 00 mvi r1,0
8013eb4: e0 00 00 02 bi 8013ebc <rtems_timer_cancel+0x48>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8013eb8: 34 01 00 04 mvi r1,4
}
8013ebc: 2b 9d 00 04 lw ra,(sp+4)
8013ec0: 37 9c 00 08 addi sp,sp,8
8013ec4: c3 a0 00 00 ret
08014490 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
8014490: 37 9c ff dc addi sp,sp,-36
8014494: 5b 8b 00 20 sw (sp+32),r11
8014498: 5b 8c 00 1c sw (sp+28),r12
801449c: 5b 8d 00 18 sw (sp+24),r13
80144a0: 5b 8e 00 14 sw (sp+20),r14
80144a4: 5b 8f 00 10 sw (sp+16),r15
80144a8: 5b 90 00 0c sw (sp+12),r16
80144ac: 5b 91 00 08 sw (sp+8),r17
80144b0: 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;
80144b4: 78 05 08 04 mvhi r5,0x804
80144b8: 38 a5 05 fc ori r5,r5,0x5fc
80144bc: 28 ad 00 00 lw r13,(r5+0)
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
80144c0: b8 20 78 00 mv r15,r1
80144c4: b8 40 60 00 mv r12,r2
80144c8: b8 60 80 00 mv r16,r3
80144cc: 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;
80144d0: 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 )
80144d4: 45 a0 00 2e be r13,r0,801458c <rtems_timer_server_fire_when+0xfc>
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
80144d8: 78 05 08 03 mvhi r5,0x803
80144dc: 38 a5 fc c0 ori r5,r5,0xfcc0
80144e0: 40 a1 00 00 lbu r1,(r5+0)
return RTEMS_NOT_DEFINED;
80144e4: 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 )
80144e8: 44 20 00 29 be r1,r0,801458c <rtems_timer_server_fire_when+0xfc><== NEVER TAKEN
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
80144ec: 34 0b 00 09 mvi r11,9
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
80144f0: 44 60 00 27 be r3,r0,801458c <rtems_timer_server_fire_when+0xfc>
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
80144f4: b8 40 08 00 mv r1,r2
80144f8: fb ff f1 c1 calli 8010bfc <_TOD_Validate>
return RTEMS_INVALID_CLOCK;
80144fc: 34 0b 00 14 mvi r11,20
return RTEMS_NOT_DEFINED;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
8014500: 44 20 00 23 be r1,r0,801458c <rtems_timer_server_fire_when+0xfc>
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
8014504: b9 80 08 00 mv r1,r12
if ( seconds <= _TOD_Seconds_since_epoch() )
8014508: 78 0c 08 03 mvhi r12,0x803
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
801450c: fb ff f1 7c calli 8010afc <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
8014510: 39 8c fd 58 ori r12,r12,0xfd58
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
8014514: b8 20 70 00 mv r14,r1
if ( seconds <= _TOD_Seconds_since_epoch() )
8014518: 29 81 00 00 lw r1,(r12+0)
801451c: 50 2e 00 1c bgeu r1,r14,801458c <rtems_timer_server_fire_when+0xfc>
8014520: 78 01 08 04 mvhi r1,0x804
8014524: 38 21 05 bc ori r1,r1,0x5bc
8014528: b9 e0 10 00 mv r2,r15
801452c: 37 83 00 24 addi r3,sp,36
8014530: f8 00 0c f9 calli 8017914 <_Objects_Get>
8014534: b8 20 58 00 mv r11,r1
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
8014538: 2b 81 00 24 lw r1,(sp+36)
801453c: 5c 20 00 13 bne r1,r0,8014588 <rtems_timer_server_fire_when+0xf8>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
8014540: 35 61 00 10 addi r1,r11,16
8014544: f8 00 16 9a calli 8019fac <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
8014548: 34 01 00 03 mvi r1,3
801454c: 59 61 00 38 sw (r11+56),r1
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
8014550: 29 81 00 00 lw r1,(r12+0)
(*timer_server->schedule_operation)( timer_server, the_timer );
8014554: 29 a3 00 04 lw r3,(r13+4)
8014558: b9 60 10 00 mv r2,r11
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
801455c: c9 c1 70 00 sub r14,r14,r1
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8014560: 59 60 00 18 sw (r11+24),r0
the_watchdog->routine = routine;
8014564: 59 70 00 2c sw (r11+44),r16
the_watchdog->id = id;
8014568: 59 6f 00 30 sw (r11+48),r15
the_watchdog->user_data = user_data;
801456c: 59 71 00 34 sw (r11+52),r17
8014570: 59 6e 00 1c sw (r11+28),r14
(*timer_server->schedule_operation)( timer_server, the_timer );
8014574: b9 a0 08 00 mv r1,r13
8014578: d8 60 00 00 call r3
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
801457c: 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();
8014580: f8 00 10 9e calli 80187f8 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
8014584: e0 00 00 02 bi 801458c <rtems_timer_server_fire_when+0xfc>
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
8014588: 34 0b 00 04 mvi r11,4
}
801458c: b9 60 08 00 mv r1,r11
8014590: 2b 9d 00 04 lw ra,(sp+4)
8014594: 2b 8b 00 20 lw r11,(sp+32)
8014598: 2b 8c 00 1c lw r12,(sp+28)
801459c: 2b 8d 00 18 lw r13,(sp+24)
80145a0: 2b 8e 00 14 lw r14,(sp+20)
80145a4: 2b 8f 00 10 lw r15,(sp+16)
80145a8: 2b 90 00 0c lw r16,(sp+12)
80145ac: 2b 91 00 08 lw r17,(sp+8)
80145b0: 37 9c 00 24 addi sp,sp,36
80145b4: c3 a0 00 00 ret
080069d8 <rtems_verror>:
static int rtems_verror(
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
80069d8: 37 9c ff e4 addi sp,sp,-28
80069dc: 5b 8b 00 1c sw (sp+28),r11
80069e0: 5b 8c 00 18 sw (sp+24),r12
80069e4: 5b 8d 00 14 sw (sp+20),r13
80069e8: 5b 8e 00 10 sw (sp+16),r14
80069ec: 5b 8f 00 0c sw (sp+12),r15
80069f0: 5b 90 00 08 sw (sp+8),r16
80069f4: 5b 9d 00 04 sw (sp+4),ra
80069f8: b8 20 60 00 mv r12,r1
int local_errno = 0;
int chars_written = 0;
rtems_status_code status;
if (error_flag & RTEMS_ERROR_PANIC) {
80069fc: 78 01 20 00 mvhi r1,0x2000
8006a00: a1 81 08 00 and r1,r12,r1
static int rtems_verror(
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
8006a04: b8 40 80 00 mv r16,r2
8006a08: 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) {
8006a0c: 44 20 00 12 be r1,r0,8006a54 <rtems_verror+0x7c>
if (rtems_panic_in_progress++)
8006a10: 78 04 08 02 mvhi r4,0x802
8006a14: 38 84 98 a4 ori r4,r4,0x98a4
8006a18: 28 81 00 00 lw r1,(r4+0)
8006a1c: 34 22 00 01 addi r2,r1,1
8006a20: 58 82 00 00 sw (r4+0),r2
8006a24: 44 20 00 06 be r1,r0,8006a3c <rtems_verror+0x64> <== ALWAYS TAKEN
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8006a28: 78 04 08 02 mvhi r4,0x802 <== NOT EXECUTED
8006a2c: 38 84 9a 20 ori r4,r4,0x9a20 <== NOT EXECUTED
8006a30: 28 81 00 00 lw r1,(r4+0) <== NOT EXECUTED
8006a34: 34 21 00 01 addi r1,r1,1 <== NOT EXECUTED
8006a38: 58 81 00 00 sw (r4+0),r1 <== NOT EXECUTED
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
8006a3c: 78 01 08 02 mvhi r1,0x802
8006a40: 38 21 98 a4 ori r1,r1,0x98a4
8006a44: 28 22 00 00 lw r2,(r1+0)
8006a48: 34 01 00 02 mvi r1,2
return 0;
8006a4c: 34 0b 00 00 mvi r11,0
if (error_flag & RTEMS_ERROR_PANIC) {
if (rtems_panic_in_progress++)
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
8006a50: 48 41 00 48 bg r2,r1,8006b70 <rtems_verror+0x198> <== NEVER TAKEN
return 0;
}
(void) fflush(stdout); /* in case stdout/stderr same */
8006a54: 78 01 08 02 mvhi r1,0x802
8006a58: 38 21 92 38 ori r1,r1,0x9238
8006a5c: 28 21 00 00 lw r1,(r1+0)
8006a60: 28 21 00 08 lw r1,(r1+8)
8006a64: f8 00 32 6a calli 801340c <fflush>
status = error_flag & ~RTEMS_ERROR_MASK;
8006a68: 78 01 08 02 mvhi r1,0x802
8006a6c: 38 21 67 20 ori r1,r1,0x6720
8006a70: 28 2e 00 00 lw r14,(r1+0)
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
8006a74: 78 01 40 00 mvhi r1,0x4000
8006a78: a1 81 08 00 and r1,r12,r1
return 0;
}
(void) fflush(stdout); /* in case stdout/stderr same */
status = error_flag & ~RTEMS_ERROR_MASK;
8006a7c: a1 8e 70 00 and r14,r12,r14
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
int local_errno = 0;
8006a80: 34 0c 00 00 mvi r12,0
}
(void) fflush(stdout); /* in case stdout/stderr same */
status = error_flag & ~RTEMS_ERROR_MASK;
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
8006a84: 44 20 00 03 be r1,r0,8006a90 <rtems_verror+0xb8>
local_errno = errno;
8006a88: f8 00 31 60 calli 8013008 <__errno>
8006a8c: 28 2c 00 00 lw r12,(r1+0)
#if defined(RTEMS_MULTIPROCESSING)
if (_System_state_Is_multiprocessing)
fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
8006a90: 78 0d 08 02 mvhi r13,0x802
8006a94: 39 ad 92 38 ori r13,r13,0x9238
8006a98: 29 a1 00 00 lw r1,(r13+0)
8006a9c: ba 00 10 00 mv r2,r16
8006aa0: b9 e0 18 00 mv r3,r15
8006aa4: 28 21 00 0c lw r1,(r1+12)
8006aa8: f8 00 49 0e calli 8018ee0 <vfprintf>
8006aac: b8 20 58 00 mv r11,r1
if (status)
8006ab0: 45 c0 00 0b be r14,r0,8006adc <rtems_verror+0x104>
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
8006ab4: 29 a1 00 00 lw r1,(r13+0)
8006ab8: 28 2d 00 0c lw r13,(r1+12)
8006abc: b9 c0 08 00 mv r1,r14
8006ac0: fb ff ff bd calli 80069b4 <rtems_status_text>
8006ac4: 78 02 08 02 mvhi r2,0x802
8006ac8: b8 20 18 00 mv r3,r1
8006acc: 38 42 63 dc ori r2,r2,0x63dc
8006ad0: b9 a0 08 00 mv r1,r13
8006ad4: f8 00 33 86 calli 80138ec <fprintf>
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
if (status)
chars_written +=
8006ad8: b5 61 58 00 add r11,r11,r1
fprintf(stderr, " (status: %s)", rtems_status_text(status));
if (local_errno) {
8006adc: 45 80 00 1a be r12,r0,8006b44 <rtems_verror+0x16c>
if ((local_errno > 0) && *strerror(local_errno))
8006ae0: 4c 0c 00 10 bge r0,r12,8006b20 <rtems_verror+0x148>
8006ae4: b9 80 08 00 mv r1,r12
8006ae8: f8 00 37 21 calli 801476c <strerror>
8006aec: 40 21 00 00 lbu r1,(r1+0)
8006af0: 44 20 00 0c be r1,r0,8006b20 <rtems_verror+0x148> <== NEVER TAKEN
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
8006af4: 78 01 08 02 mvhi r1,0x802
8006af8: 38 21 92 38 ori r1,r1,0x9238
8006afc: 28 21 00 00 lw r1,(r1+0)
8006b00: 28 2d 00 0c lw r13,(r1+12)
8006b04: b9 80 08 00 mv r1,r12
8006b08: f8 00 37 19 calli 801476c <strerror>
8006b0c: 78 02 08 02 mvhi r2,0x802
8006b10: b8 20 18 00 mv r3,r1
8006b14: 38 42 63 ec ori r2,r2,0x63ec
8006b18: b9 a0 08 00 mv r1,r13
8006b1c: e0 00 00 08 bi 8006b3c <rtems_verror+0x164>
else
chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
8006b20: 78 01 08 02 mvhi r1,0x802
8006b24: 38 21 92 38 ori r1,r1,0x9238
8006b28: 28 21 00 00 lw r1,(r1+0)
8006b2c: 78 02 08 02 mvhi r2,0x802
8006b30: 38 42 63 fc ori r2,r2,0x63fc
8006b34: 28 21 00 0c lw r1,(r1+12)
8006b38: b9 80 18 00 mv r3,r12
8006b3c: f8 00 33 6c calli 80138ec <fprintf>
8006b40: b5 61 58 00 add r11,r11,r1
}
chars_written += fprintf(stderr, "\n");
8006b44: 78 0c 08 02 mvhi r12,0x802
8006b48: 39 8c 92 38 ori r12,r12,0x9238
8006b4c: 29 81 00 00 lw r1,(r12+0)
8006b50: 78 02 08 02 mvhi r2,0x802
8006b54: 38 42 5b 48 ori r2,r2,0x5b48
8006b58: 28 21 00 0c lw r1,(r1+12)
8006b5c: f8 00 33 64 calli 80138ec <fprintf>
8006b60: b4 2b 58 00 add r11,r1,r11
(void) fflush(stderr);
8006b64: 29 81 00 00 lw r1,(r12+0)
8006b68: 28 21 00 0c lw r1,(r1+12)
8006b6c: f8 00 32 28 calli 801340c <fflush>
return chars_written;
}
8006b70: b9 60 08 00 mv r1,r11
8006b74: 2b 9d 00 04 lw ra,(sp+4)
8006b78: 2b 8b 00 1c lw r11,(sp+28)
8006b7c: 2b 8c 00 18 lw r12,(sp+24)
8006b80: 2b 8d 00 14 lw r13,(sp+20)
8006b84: 2b 8e 00 10 lw r14,(sp+16)
8006b88: 2b 8f 00 0c lw r15,(sp+12)
8006b8c: 2b 90 00 08 lw r16,(sp+8)
8006b90: 37 9c 00 1c addi sp,sp,28
8006b94: c3 a0 00 00 ret
08001b04 <scanInt>:
/*
* Extract an integer value from the database
*/
static int
scanInt(FILE *fp, int *val)
{
8001b04: 37 9c ff d4 addi sp,sp,-44
8001b08: 5b 8b 00 2c sw (sp+44),r11
8001b0c: 5b 8c 00 28 sw (sp+40),r12
8001b10: 5b 8d 00 24 sw (sp+36),r13
8001b14: 5b 8e 00 20 sw (sp+32),r14
8001b18: 5b 8f 00 1c sw (sp+28),r15
8001b1c: 5b 90 00 18 sw (sp+24),r16
8001b20: 5b 91 00 14 sw (sp+20),r17
8001b24: 5b 92 00 10 sw (sp+16),r18
8001b28: 5b 93 00 0c sw (sp+12),r19
8001b2c: 5b 94 00 08 sw (sp+8),r20
8001b30: 5b 9d 00 04 sw (sp+4),ra
8001b34: b8 20 58 00 mv r11,r1
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
8001b38: 78 01 08 01 mvhi r1,0x801
8001b3c: 38 21 4a 3c ori r1,r1,0x4a3c
8001b40: 28 2e 00 00 lw r14,(r1+0)
int sign = 0;
int d;
for (;;) {
c = getc(fp);
8001b44: 78 11 08 01 mvhi r17,0x801
limit++;
continue;
}
sign = 1;
}
if (!isdigit(c))
8001b48: 78 10 08 01 mvhi r16,0x801
/*
* Extract an integer value from the database
*/
static int
scanInt(FILE *fp, int *val)
{
8001b4c: b8 40 90 00 mv r18,r2
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
int sign = 0;
8001b50: 34 0d 00 00 mvi r13,0
*/
static int
scanInt(FILE *fp, int *val)
{
int c;
unsigned int i = 0;
8001b54: 34 0c 00 00 mvi r12,0
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
8001b58: 3a 31 61 c0 ori r17,r17,0x61c0
if (c == ':')
8001b5c: 34 14 00 3a mvi r20,58
limit++;
continue;
}
sign = 1;
}
if (!isdigit(c))
8001b60: 3a 10 61 b8 ori r16,r16,0x61b8
for (;;) {
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
8001b64: 34 13 00 2d mvi r19,45
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
8001b68: 29 61 00 04 lw r1,(r11+4)
8001b6c: 34 21 ff ff addi r1,r1,-1
8001b70: 59 61 00 04 sw (r11+4),r1
8001b74: 4c 20 00 06 bge r1,r0,8001b8c <scanInt+0x88> <== ALWAYS TAKEN
8001b78: 2a 21 00 00 lw r1,(r17+0) <== NOT EXECUTED
8001b7c: b9 60 10 00 mv r2,r11 <== NOT EXECUTED
8001b80: f8 00 37 20 calli 800f800 <__srget_r> <== NOT EXECUTED
8001b84: b8 20 78 00 mv r15,r1 <== NOT EXECUTED
8001b88: e0 00 00 05 bi 8001b9c <scanInt+0x98> <== NOT EXECUTED
8001b8c: 29 61 00 00 lw r1,(r11+0)
8001b90: 40 2f 00 00 lbu r15,(r1+0)
8001b94: 34 21 00 01 addi r1,r1,1
8001b98: 59 61 00 00 sw (r11+0),r1
if (c == ':')
8001b9c: 45 f4 00 1f be r15,r20,8001c18 <scanInt+0x114>
break;
if (sign == 0) {
8001ba0: 5d a0 00 06 bne r13,r0,8001bb8 <scanInt+0xb4>
if (c == '-') {
sign = -1;
limit++;
continue;
}
sign = 1;
8001ba4: 34 0d 00 01 mvi r13,1
for (;;) {
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
8001ba8: 5d f3 00 04 bne r15,r19,8001bb8 <scanInt+0xb4>
sign = -1;
limit++;
8001bac: 35 ce 00 01 addi r14,r14,1
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
sign = -1;
8001bb0: 34 0d ff ff mvi r13,-1
limit++;
continue;
8001bb4: e3 ff ff ed bi 8001b68 <scanInt+0x64>
}
sign = 1;
}
if (!isdigit(c))
8001bb8: 2a 01 00 00 lw r1,(r16+0)
8001bbc: b4 2f 08 00 add r1,r1,r15
8001bc0: 40 21 00 01 lbu r1,(r1+1)
8001bc4: 20 21 00 04 andi r1,r1,0x4
8001bc8: 44 20 00 1c be r1,r0,8001c38 <scanInt+0x134>
return 0;
d = c - '0';
if ((i > (limit / 10))
8001bcc: b9 c0 08 00 mv r1,r14
8001bd0: 34 02 00 0a mvi r2,10
8001bd4: f8 00 47 30 calli 8013894 <__udivsi3>
8001bd8: 55 81 00 18 bgu r12,r1,8001c38 <scanInt+0x134>
}
sign = 1;
}
if (!isdigit(c))
return 0;
d = c - '0';
8001bdc: 35 ef ff d0 addi r15,r15,-48
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
8001be0: 5d 81 00 05 bne r12,r1,8001bf4 <scanInt+0xf0>
8001be4: b9 c0 08 00 mv r1,r14
8001be8: 34 02 00 0a mvi r2,10
8001bec: f8 00 47 3a calli 80138d4 <__umodsi3>
8001bf0: 55 e1 00 12 bgu r15,r1,8001c38 <scanInt+0x134> <== ALWAYS TAKEN
return 0;
i = i * 10 + d;
8001bf4: b9 80 08 00 mv r1,r12
8001bf8: 34 02 00 01 mvi r2,1
8001bfc: f8 00 46 4c calli 801352c <__ashlsi3>
8001c00: 34 02 00 02 mvi r2,2
8001c04: b8 20 60 00 mv r12,r1
8001c08: f8 00 46 49 calli 801352c <__ashlsi3>
8001c0c: b5 81 08 00 add r1,r12,r1
8001c10: b5 e1 60 00 add r12,r15,r1
8001c14: e3 ff ff d5 bi 8001b68 <scanInt+0x64>
}
if (sign == 0)
return 0;
8001c18: 34 03 00 00 mvi r3,0
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
i = i * 10 + d;
}
if (sign == 0)
8001c1c: 45 a0 00 08 be r13,r0,8001c3c <scanInt+0x138> <== NEVER TAKEN
return 0;
*val = i * sign;
8001c20: b9 a0 08 00 mv r1,r13
8001c24: b9 80 10 00 mv r2,r12
8001c28: f8 00 46 b6 calli 8013700 <__mulsi3>
8001c2c: 5a 41 00 00 sw (r18+0),r1
return 1;
8001c30: 34 03 00 01 mvi r3,1
8001c34: e0 00 00 02 bi 8001c3c <scanInt+0x138>
if (!isdigit(c))
return 0;
d = c - '0';
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
8001c38: 34 03 00 00 mvi r3,0
}
if (sign == 0)
return 0;
*val = i * sign;
return 1;
}
8001c3c: b8 60 08 00 mv r1,r3
8001c40: 2b 9d 00 04 lw ra,(sp+4)
8001c44: 2b 8b 00 2c lw r11,(sp+44)
8001c48: 2b 8c 00 28 lw r12,(sp+40)
8001c4c: 2b 8d 00 24 lw r13,(sp+36)
8001c50: 2b 8e 00 20 lw r14,(sp+32)
8001c54: 2b 8f 00 1c lw r15,(sp+28)
8001c58: 2b 90 00 18 lw r16,(sp+24)
8001c5c: 2b 91 00 14 lw r17,(sp+20)
8001c60: 2b 92 00 10 lw r18,(sp+16)
8001c64: 2b 93 00 0c lw r19,(sp+12)
8001c68: 2b 94 00 08 lw r20,(sp+8)
8001c6c: 37 9c 00 2c addi sp,sp,44
8001c70: c3 a0 00 00 ret
08001dac <scangr>:
FILE *fp,
struct group *grp,
char *buffer,
size_t bufsize
)
{
8001dac: 37 9c ff d8 addi sp,sp,-40
8001db0: 5b 8b 00 18 sw (sp+24),r11
8001db4: 5b 8c 00 14 sw (sp+20),r12
8001db8: 5b 8d 00 10 sw (sp+16),r13
8001dbc: 5b 8e 00 0c sw (sp+12),r14
8001dc0: 5b 8f 00 08 sw (sp+8),r15
8001dc4: 5b 9d 00 04 sw (sp+4),ra
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
8001dc8: 37 8e 00 20 addi r14,sp,32
8001dcc: 37 8d 00 1c addi r13,sp,28
FILE *fp,
struct group *grp,
char *buffer,
size_t bufsize
)
{
8001dd0: 5b 83 00 20 sw (sp+32),r3
8001dd4: 5b 84 00 1c sw (sp+28),r4
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
8001dd8: b9 c0 18 00 mv r3,r14
8001ddc: b9 a0 20 00 mv r4,r13
8001de0: 34 05 00 00 mvi r5,0
FILE *fp,
struct group *grp,
char *buffer,
size_t bufsize
)
{
8001de4: b8 20 78 00 mv r15,r1
8001de8: b8 40 58 00 mv r11,r2
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
8001dec: fb ff ff a2 calli 8001c74 <scanString>
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
|| !scanInt(fp, &grgid)
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
return 0;
8001df0: 34 0c 00 00 mvi r12,0
{
int grgid;
char *grmem, *cp;
int memcount;
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
8001df4: 44 20 00 43 be r1,r0,8001f00 <scangr+0x154>
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
8001df8: b9 e0 08 00 mv r1,r15
8001dfc: 35 62 00 04 addi r2,r11,4
8001e00: b9 c0 18 00 mv r3,r14
8001e04: b9 a0 20 00 mv r4,r13
8001e08: 34 05 00 00 mvi r5,0
8001e0c: fb ff ff 9a calli 8001c74 <scanString>
8001e10: 44 20 00 3c be r1,r0,8001f00 <scangr+0x154> <== NEVER TAKEN
|| !scanInt(fp, &grgid)
8001e14: b9 e0 08 00 mv r1,r15
8001e18: 37 82 00 28 addi r2,sp,40
8001e1c: fb ff ff 3a calli 8001b04 <scanInt>
8001e20: 44 20 00 38 be r1,r0,8001f00 <scangr+0x154> <== NEVER TAKEN
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
8001e24: b9 e0 08 00 mv r1,r15
8001e28: 37 82 00 24 addi r2,sp,36
8001e2c: b9 c0 18 00 mv r3,r14
8001e30: b9 a0 20 00 mv r4,r13
8001e34: 34 05 00 01 mvi r5,1
8001e38: fb ff ff 8f calli 8001c74 <scanString>
8001e3c: 44 20 00 31 be r1,r0,8001f00 <scangr+0x154> <== NEVER TAKEN
return 0;
grp->gr_gid = grgid;
8001e40: 2b 81 00 28 lw r1,(sp+40)
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8001e44: 2b 8d 00 24 lw r13,(sp+36)
if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0)
|| !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0)
|| !scanInt(fp, &grgid)
|| !scanString(fp, &grmem, &buffer, &bufsize, 1))
return 0;
grp->gr_gid = grgid;
8001e48: 0d 61 00 08 sh (r11+8),r1
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8001e4c: b9 a0 10 00 mv r2,r13
8001e50: 34 01 00 01 mvi r1,1
8001e54: e0 00 00 04 bi 8001e64 <scangr+0xb8>
if(*cp == ',')
memcount++;
8001e58: 64 63 00 2c cmpei r3,r3,44
grp->gr_gid = grgid;
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8001e5c: 34 42 00 01 addi r2,r2,1
if(*cp == ',')
memcount++;
8001e60: b4 23 08 00 add r1,r1,r3
grp->gr_gid = grgid;
/*
* Determine number of members
*/
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8001e64: 40 43 00 00 lbu r3,(r2+0)
8001e68: 5c 60 ff fc bne r3,r0,8001e58 <scangr+0xac>
}
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
8001e6c: 34 02 00 02 mvi r2,2
8001e70: 34 21 00 01 addi r1,r1,1
8001e74: f8 00 45 ae calli 801352c <__ashlsi3>
8001e78: 2b 82 00 1c lw r2,(sp+28)
8001e7c: 34 21 00 0f addi r1,r1,15
return 0;
8001e80: 34 0c 00 00 mvi r12,0
}
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
8001e84: 54 22 00 1f bgu r1,r2,8001f00 <scangr+0x154> <== NEVER TAKEN
return 0;
grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15);
8001e88: 2b 81 00 20 lw r1,(sp+32)
8001e8c: 34 02 ff f0 mvi r2,-16
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
if(*cp == ',') {
8001e90: 34 0e 00 2c mvi r14,44
/*
* Hack to produce (hopefully) a suitably-aligned array of pointers
*/
if (bufsize < (((memcount+1)*sizeof(char *)) + 15))
return 0;
grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15);
8001e94: 34 21 00 0f addi r1,r1,15
8001e98: a0 22 08 00 and r1,r1,r2
8001e9c: 59 61 00 0c sw (r11+12),r1
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
8001ea0: 58 2d 00 00 sw (r1+0),r13
}
/*
* Extract a single group record from the database
*/
static int scangr(
8001ea4: 2b 8c 00 24 lw r12,(sp+36)
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8001ea8: 34 0d 00 01 mvi r13,1
}
/*
* Extract a single group record from the database
*/
static int scangr(
8001eac: 35 8c 00 01 addi r12,r12,1
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8001eb0: e0 00 00 0b bi 8001edc <scangr+0x130>
if(*cp == ',') {
8001eb4: 5c 2e 00 09 bne r1,r14,8001ed8 <scangr+0x12c>
*cp = '\0';
8001eb8: 31 80 ff ff sb (r12+-1),r0
grp->gr_mem[memcount++] = cp + 1;
8001ebc: 29 6f 00 0c lw r15,(r11+12)
8001ec0: b9 a0 08 00 mv r1,r13
8001ec4: 34 02 00 02 mvi r2,2
8001ec8: f8 00 45 99 calli 801352c <__ashlsi3>
8001ecc: b5 e1 08 00 add r1,r15,r1
8001ed0: 58 2c 00 00 sw (r1+0),r12
8001ed4: 35 ad 00 01 addi r13,r13,1
8001ed8: 35 8c 00 01 addi r12,r12,1
/*
* Fill in pointer array
*/
grp->gr_mem[0] = grmem;
for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) {
8001edc: 41 81 ff ff lbu r1,(r12+-1)
8001ee0: 5c 20 ff f5 bne r1,r0,8001eb4 <scangr+0x108>
if(*cp == ',') {
*cp = '\0';
grp->gr_mem[memcount++] = cp + 1;
}
}
grp->gr_mem[memcount] = NULL;
8001ee4: 29 6b 00 0c lw r11,(r11+12)
8001ee8: b9 a0 08 00 mv r1,r13
8001eec: 34 02 00 02 mvi r2,2
8001ef0: f8 00 45 8f calli 801352c <__ashlsi3>
8001ef4: b5 61 08 00 add r1,r11,r1
8001ef8: 58 20 00 00 sw (r1+0),r0
return 1;
8001efc: 34 0c 00 01 mvi r12,1
}
8001f00: b9 80 08 00 mv r1,r12
8001f04: 2b 9d 00 04 lw ra,(sp+4)
8001f08: 2b 8b 00 18 lw r11,(sp+24)
8001f0c: 2b 8c 00 14 lw r12,(sp+20)
8001f10: 2b 8d 00 10 lw r13,(sp+16)
8001f14: 2b 8e 00 0c lw r14,(sp+12)
8001f18: 2b 8f 00 08 lw r15,(sp+8)
8001f1c: 37 9c 00 28 addi sp,sp,40
8001f20: c3 a0 00 00 ret
08001f24 <scanpw>:
FILE *fp,
struct passwd *pwd,
char *buffer,
size_t bufsize
)
{
8001f24: 37 9c ff d8 addi sp,sp,-40
8001f28: 5b 8b 00 18 sw (sp+24),r11
8001f2c: 5b 8c 00 14 sw (sp+20),r12
8001f30: 5b 8d 00 10 sw (sp+16),r13
8001f34: 5b 8e 00 0c sw (sp+12),r14
8001f38: 5b 8f 00 08 sw (sp+8),r15
8001f3c: 5b 9d 00 04 sw (sp+4),ra
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
8001f40: 37 8e 00 20 addi r14,sp,32
8001f44: 37 8d 00 1c addi r13,sp,28
FILE *fp,
struct passwd *pwd,
char *buffer,
size_t bufsize
)
{
8001f48: 5b 83 00 20 sw (sp+32),r3
8001f4c: 5b 84 00 1c sw (sp+28),r4
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
8001f50: b9 c0 18 00 mv r3,r14
8001f54: b9 a0 20 00 mv r4,r13
8001f58: 34 05 00 00 mvi r5,0
FILE *fp,
struct passwd *pwd,
char *buffer,
size_t bufsize
)
{
8001f5c: b8 20 60 00 mv r12,r1
8001f60: b8 40 58 00 mv r11,r2
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
8001f64: fb ff ff 44 calli 8001c74 <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;
8001f68: 34 0f 00 00 mvi r15,0
size_t bufsize
)
{
int pwuid, pwgid;
if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0)
8001f6c: 44 20 00 31 be r1,r0,8002030 <scanpw+0x10c>
|| !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0)
8001f70: b9 80 08 00 mv r1,r12
8001f74: 35 62 00 04 addi r2,r11,4
8001f78: b9 c0 18 00 mv r3,r14
8001f7c: b9 a0 20 00 mv r4,r13
8001f80: 34 05 00 00 mvi r5,0
8001f84: fb ff ff 3c calli 8001c74 <scanString>
8001f88: 44 20 00 2a be r1,r0,8002030 <scanpw+0x10c> <== NEVER TAKEN
|| !scanInt(fp, &pwuid)
8001f8c: b9 80 08 00 mv r1,r12
8001f90: 37 82 00 28 addi r2,sp,40
8001f94: fb ff fe dc calli 8001b04 <scanInt>
8001f98: 44 20 00 26 be r1,r0,8002030 <scanpw+0x10c>
|| !scanInt(fp, &pwgid)
8001f9c: b9 80 08 00 mv r1,r12
8001fa0: 37 82 00 24 addi r2,sp,36
8001fa4: fb ff fe d8 calli 8001b04 <scanInt>
8001fa8: 44 20 00 22 be r1,r0,8002030 <scanpw+0x10c>
|| !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
8001fac: b9 80 08 00 mv r1,r12
8001fb0: 35 62 00 0c addi r2,r11,12
8001fb4: b9 c0 18 00 mv r3,r14
8001fb8: b9 a0 20 00 mv r4,r13
8001fbc: 34 05 00 00 mvi r5,0
8001fc0: fb ff ff 2d calli 8001c74 <scanString>
8001fc4: 44 20 00 1b be r1,r0,8002030 <scanpw+0x10c> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
8001fc8: b9 80 08 00 mv r1,r12
8001fcc: 35 62 00 10 addi r2,r11,16
8001fd0: b9 c0 18 00 mv r3,r14
8001fd4: b9 a0 20 00 mv r4,r13
8001fd8: 34 05 00 00 mvi r5,0
8001fdc: fb ff ff 26 calli 8001c74 <scanString>
8001fe0: 44 20 00 14 be r1,r0,8002030 <scanpw+0x10c> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
8001fe4: b9 80 08 00 mv r1,r12
8001fe8: 35 62 00 14 addi r2,r11,20
8001fec: b9 c0 18 00 mv r3,r14
8001ff0: b9 a0 20 00 mv r4,r13
8001ff4: 34 05 00 00 mvi r5,0
8001ff8: fb ff ff 1f calli 8001c74 <scanString>
8001ffc: 44 20 00 0d be r1,r0,8002030 <scanpw+0x10c> <== NEVER TAKEN
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
8002000: b9 80 08 00 mv r1,r12
8002004: 35 62 00 18 addi r2,r11,24
8002008: b9 c0 18 00 mv r3,r14
800200c: b9 a0 20 00 mv r4,r13
8002010: 34 05 00 01 mvi r5,1
8002014: fb ff ff 18 calli 8001c74 <scanString>
8002018: 44 20 00 06 be r1,r0,8002030 <scanpw+0x10c>
return 0;
pwd->pw_uid = pwuid;
800201c: 2b 81 00 28 lw r1,(sp+40)
pwd->pw_gid = pwgid;
return 1;
8002020: 34 0f 00 01 mvi r15,1
|| !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0)
|| !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1))
return 0;
pwd->pw_uid = pwuid;
8002024: 0d 61 00 08 sh (r11+8),r1
pwd->pw_gid = pwgid;
8002028: 2b 81 00 24 lw r1,(sp+36)
800202c: 0d 61 00 0a sh (r11+10),r1
return 1;
}
8002030: b9 e0 08 00 mv r1,r15
8002034: 2b 9d 00 04 lw ra,(sp+4)
8002038: 2b 8b 00 18 lw r11,(sp+24)
800203c: 2b 8c 00 14 lw r12,(sp+20)
8002040: 2b 8d 00 10 lw r13,(sp+16)
8002044: 2b 8e 00 0c lw r14,(sp+12)
8002048: 2b 8f 00 08 lw r15,(sp+8)
800204c: 37 9c 00 28 addi sp,sp,40
8002050: c3 a0 00 00 ret
08003948 <sched_get_priority_max>:
#include <rtems/posix/priority.h>
int sched_get_priority_max(
int policy
)
{
8003948: 37 9c ff fc addi sp,sp,-4
800394c: 5b 9d 00 04 sw (sp+4),ra
switch ( policy ) {
8003950: 48 01 00 05 bg r0,r1,8003964 <sched_get_priority_max+0x1c>
8003954: 34 02 00 02 mvi r2,2
8003958: 4c 41 00 08 bge r2,r1,8003978 <sched_get_priority_max+0x30>
800395c: 34 02 00 04 mvi r2,4
8003960: 44 22 00 06 be r1,r2,8003978 <sched_get_priority_max+0x30> <== ALWAYS TAKEN
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8003964: f8 00 26 80 calli 800d364 <__errno>
8003968: 34 02 00 16 mvi r2,22
800396c: 58 22 00 00 sw (r1+0),r2
8003970: 34 01 ff ff mvi r1,-1
8003974: e0 00 00 05 bi 8003988 <sched_get_priority_max+0x40>
}
return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
8003978: 78 01 08 01 mvhi r1,0x801
800397c: 38 21 f0 e4 ori r1,r1,0xf0e4
8003980: 40 21 00 00 lbu r1,(r1+0)
8003984: 34 21 ff ff addi r1,r1,-1
}
8003988: 2b 9d 00 04 lw ra,(sp+4)
800398c: 37 9c 00 04 addi sp,sp,4
8003990: c3 a0 00 00 ret
08003994 <sched_get_priority_min>:
#include <rtems/posix/priority.h>
int sched_get_priority_min(
int policy
)
{
8003994: 37 9c ff fc addi sp,sp,-4
8003998: 5b 9d 00 04 sw (sp+4),ra
switch ( policy ) {
800399c: 48 01 00 05 bg r0,r1,80039b0 <sched_get_priority_min+0x1c>
80039a0: 34 02 00 02 mvi r2,2
80039a4: 4c 41 00 08 bge r2,r1,80039c4 <sched_get_priority_min+0x30><== ALWAYS TAKEN
80039a8: 34 02 00 04 mvi r2,4
80039ac: 44 22 00 06 be r1,r2,80039c4 <sched_get_priority_min+0x30>
case SCHED_RR:
case SCHED_SPORADIC:
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
80039b0: f8 00 26 6d calli 800d364 <__errno>
80039b4: 34 02 00 16 mvi r2,22
80039b8: 58 22 00 00 sw (r1+0),r2
80039bc: 34 01 ff ff mvi r1,-1
80039c0: e0 00 00 02 bi 80039c8 <sched_get_priority_min+0x34>
}
return POSIX_SCHEDULER_MINIMUM_PRIORITY;
80039c4: 34 01 00 01 mvi r1,1
}
80039c8: 2b 9d 00 04 lw ra,(sp+4)
80039cc: 37 9c 00 04 addi sp,sp,4
80039d0: c3 a0 00 00 ret
080039d4 <sched_rr_get_interval>:
int sched_rr_get_interval(
pid_t pid,
struct timespec *interval
)
{
80039d4: 37 9c ff f4 addi sp,sp,-12
80039d8: 5b 8b 00 08 sw (sp+8),r11
80039dc: 5b 9d 00 04 sw (sp+4),ra
80039e0: b8 20 58 00 mv r11,r1
/*
* Only supported for the "calling process" (i.e. this node).
*/
if ( pid && pid != getpid() )
80039e4: 44 20 00 08 be r1,r0,8003a04 <sched_rr_get_interval+0x30> <== NEVER TAKEN
80039e8: 5b 82 00 0c sw (sp+12),r2
80039ec: fb ff f8 b0 calli 8001cac <getpid>
80039f0: 2b 82 00 0c lw r2,(sp+12)
80039f4: 45 61 00 04 be r11,r1,8003a04 <sched_rr_get_interval+0x30>
rtems_set_errno_and_return_minus_one( ESRCH );
80039f8: f8 00 26 5b calli 800d364 <__errno>
80039fc: 34 02 00 03 mvi r2,3
8003a00: e0 00 00 04 bi 8003a10 <sched_rr_get_interval+0x3c>
if ( !interval )
8003a04: 5c 40 00 06 bne r2,r0,8003a1c <sched_rr_get_interval+0x48>
rtems_set_errno_and_return_minus_one( EINVAL );
8003a08: f8 00 26 57 calli 800d364 <__errno>
8003a0c: 34 02 00 16 mvi r2,22
8003a10: 58 22 00 00 sw (r1+0),r2
8003a14: 34 01 ff ff mvi r1,-1
8003a18: e0 00 00 06 bi 8003a30 <sched_rr_get_interval+0x5c>
_Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval );
8003a1c: 78 01 08 01 mvhi r1,0x801
8003a20: 38 21 f7 f0 ori r1,r1,0xf7f0
8003a24: 28 21 00 00 lw r1,(r1+0)
8003a28: f8 00 0e 22 calli 80072b0 <_Timespec_From_ticks>
return 0;
8003a2c: 34 01 00 00 mvi r1,0
}
8003a30: 2b 9d 00 04 lw ra,(sp+4)
8003a34: 2b 8b 00 08 lw r11,(sp+8)
8003a38: 37 9c 00 0c addi sp,sp,12
8003a3c: c3 a0 00 00 ret
08006130 <sem_open>:
int oflag,
...
/* mode_t mode, */
/* unsigned int value */
)
{
8006130: 37 9c ff c0 addi sp,sp,-64
8006134: 5b 8b 00 18 sw (sp+24),r11
8006138: 5b 8c 00 14 sw (sp+20),r12
800613c: 5b 8d 00 10 sw (sp+16),r13
8006140: 5b 8e 00 0c sw (sp+12),r14
8006144: 5b 8f 00 08 sw (sp+8),r15
8006148: 5b 9d 00 04 sw (sp+4),ra
800614c: 5b 83 00 2c sw (sp+44),r3
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8006150: 78 03 08 02 mvhi r3,0x802
8006154: 5b 82 00 28 sw (sp+40),r2
8006158: 5b 84 00 30 sw (sp+48),r4
800615c: 5b 85 00 34 sw (sp+52),r5
8006160: 5b 86 00 38 sw (sp+56),r6
8006164: 5b 87 00 3c sw (sp+60),r7
8006168: 5b 88 00 40 sw (sp+64),r8
800616c: 38 63 4a 50 ori r3,r3,0x4a50
8006170: b8 20 60 00 mv r12,r1
8006174: 28 61 00 00 lw r1,(r3+0)
8006178: b8 40 70 00 mv r14,r2
800617c: 34 21 00 01 addi r1,r1,1
8006180: 58 61 00 00 sw (r3+0),r1
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
8006184: 20 4f 02 00 andi r15,r2,0x200
/* unsigned int value */
)
{
va_list arg;
mode_t mode;
unsigned int value = 0;
8006188: 34 0d 00 00 mvi r13,0
POSIX_Semaphore_Control *the_semaphore;
Objects_Locations location;
_Thread_Disable_dispatch();
if ( oflag & O_CREAT ) {
800618c: 45 e0 00 02 be r15,r0,8006194 <sem_open+0x64>
va_start(arg, oflag);
mode = (mode_t) va_arg( arg, unsigned int );
value = va_arg( arg, unsigned int );
8006190: 2b 8d 00 30 lw r13,(sp+48)
va_end(arg);
}
status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
8006194: b9 80 08 00 mv r1,r12
8006198: 37 82 00 24 addi r2,sp,36
800619c: f8 00 1b 07 calli 800cdb8 <_POSIX_Semaphore_Name_to_id>
80061a0: 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 ) {
80061a4: 44 20 00 08 be r1,r0,80061c4 <sem_open+0x94>
/*
* 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) ) ) {
80061a8: 34 01 00 02 mvi r1,2
80061ac: 5d 61 00 02 bne r11,r1,80061b4 <sem_open+0x84> <== NEVER TAKEN
80061b0: 5d e0 00 1a bne r15,r0,8006218 <sem_open+0xe8>
_Thread_Enable_dispatch();
80061b4: f8 00 0a bb calli 8008ca0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
80061b8: f8 00 2a 55 calli 8010b0c <__errno>
80061bc: 58 2b 00 00 sw (r1+0),r11
80061c0: e0 00 00 08 bi 80061e0 <sem_open+0xb0>
/*
* Check for existence with creation.
*/
if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
80061c4: 21 ce 0a 00 andi r14,r14,0xa00
80061c8: 34 01 0a 00 mvi r1,2560
80061cc: 5d c1 00 07 bne r14,r1,80061e8 <sem_open+0xb8>
_Thread_Enable_dispatch();
80061d0: f8 00 0a b4 calli 8008ca0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
80061d4: f8 00 2a 4e calli 8010b0c <__errno>
80061d8: 34 02 00 11 mvi r2,17
80061dc: 58 22 00 00 sw (r1+0),r2
80061e0: 34 01 ff ff mvi r1,-1
80061e4: e0 00 00 18 bi 8006244 <sem_open+0x114>
80061e8: 2b 82 00 24 lw r2,(sp+36)
80061ec: 78 01 08 02 mvhi r1,0x802
80061f0: 37 83 00 1c addi r3,sp,28
80061f4: 38 21 4c a8 ori r1,r1,0x4ca8
80061f8: f8 00 07 5e calli 8007f70 <_Objects_Get>
}
the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
the_semaphore->open_count += 1;
80061fc: 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 );
8006200: 5b 81 00 20 sw (sp+32),r1
the_semaphore->open_count += 1;
8006204: 34 42 00 01 addi r2,r2,1
8006208: 58 22 00 18 sw (r1+24),r2
_Thread_Enable_dispatch();
800620c: f8 00 0a a5 calli 8008ca0 <_Thread_Enable_dispatch>
_Thread_Enable_dispatch();
8006210: f8 00 0a a4 calli 8008ca0 <_Thread_Enable_dispatch>
goto return_id;
8006214: e0 00 00 0a bi 800623c <sem_open+0x10c>
/*
* 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(
8006218: 34 02 00 00 mvi r2,0
800621c: b9 a0 18 00 mv r3,r13
8006220: 37 84 00 20 addi r4,sp,32
8006224: b9 80 08 00 mv r1,r12
8006228: f8 00 1a 80 calli 800cc28 <_POSIX_Semaphore_Create_support>
800622c: b8 20 58 00 mv r11,r1
/*
* errno was set by Create_support, so don't set it again.
*/
_Thread_Enable_dispatch();
8006230: f8 00 0a 9c calli 8008ca0 <_Thread_Enable_dispatch>
if ( status == -1 )
return SEM_FAILED;
8006234: 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 )
8006238: 45 61 00 03 be r11,r1,8006244 <sem_open+0x114>
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;
800623c: 2b 81 00 20 lw r1,(sp+32)
8006240: 34 21 00 08 addi r1,r1,8
#endif
return id;
}
8006244: 2b 9d 00 04 lw ra,(sp+4)
8006248: 2b 8b 00 18 lw r11,(sp+24)
800624c: 2b 8c 00 14 lw r12,(sp+20)
8006250: 2b 8d 00 10 lw r13,(sp+16)
8006254: 2b 8e 00 0c lw r14,(sp+12)
8006258: 2b 8f 00 08 lw r15,(sp+8)
800625c: 37 9c 00 40 addi sp,sp,64
8006260: c3 a0 00 00 ret
08003848 <sigaction>:
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
8003848: 37 9c ff ec addi sp,sp,-20
800384c: 5b 8b 00 14 sw (sp+20),r11
8003850: 5b 8c 00 10 sw (sp+16),r12
8003854: 5b 8d 00 0c sw (sp+12),r13
8003858: 5b 8e 00 08 sw (sp+8),r14
800385c: 5b 9d 00 04 sw (sp+4),ra
8003860: b8 20 58 00 mv r11,r1
8003864: b8 40 60 00 mv r12,r2
8003868: b8 60 68 00 mv r13,r3
ISR_Level level;
if ( oact )
800386c: 44 60 00 0f be r3,r0,80038a8 <sigaction+0x60>
*oact = _POSIX_signals_Vectors[ sig ];
8003870: 34 02 00 01 mvi r2,1
8003874: f8 00 65 9b calli 801cee0 <__ashlsi3>
8003878: 34 02 00 02 mvi r2,2
800387c: 78 0e 08 02 mvhi r14,0x802
8003880: b4 2b 08 00 add r1,r1,r11
8003884: f8 00 65 97 calli 801cee0 <__ashlsi3>
8003888: 39 ce 0d d8 ori r14,r14,0xdd8
800388c: b5 c1 08 00 add r1,r14,r1
8003890: 28 23 00 00 lw r3,(r1+0)
8003894: 28 22 00 04 lw r2,(r1+4)
8003898: 28 21 00 08 lw r1,(r1+8)
800389c: 59 a3 00 00 sw (r13+0),r3
80038a0: 59 a2 00 04 sw (r13+4),r2
80038a4: 59 a1 00 08 sw (r13+8),r1
if ( !sig )
80038a8: 45 60 00 07 be r11,r0,80038c4 <sigaction+0x7c>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
80038ac: 35 61 ff ff addi r1,r11,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
80038b0: 34 02 00 1f mvi r2,31
80038b4: 50 41 00 02 bgeu r2,r1,80038bc <sigaction+0x74>
80038b8: e0 00 00 03 bi 80038c4 <sigaction+0x7c>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
80038bc: 34 01 00 09 mvi r1,9
80038c0: 5d 61 00 06 bne r11,r1,80038d8 <sigaction+0x90>
rtems_set_errno_and_return_minus_one( EINVAL );
80038c4: f8 00 27 fb calli 800d8b0 <__errno>
80038c8: 34 02 00 16 mvi r2,22
80038cc: 58 22 00 00 sw (r1+0),r2
80038d0: 34 01 ff ff mvi r1,-1
80038d4: e0 00 00 2d bi 8003988 <sigaction+0x140>
* 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;
80038d8: 34 01 00 00 mvi r1,0
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
80038dc: 45 80 00 2b be r12,r0,8003988 <sigaction+0x140> <== 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 );
80038e0: 90 00 70 00 rcsr r14,IE
80038e4: 34 01 ff fe mvi r1,-2
80038e8: a1 c1 08 00 and r1,r14,r1
80038ec: d0 01 00 00 wcsr IE,r1
if ( act->sa_handler == SIG_DFL ) {
80038f0: 29 81 00 08 lw r1,(r12+8)
80038f4: 78 0d 08 02 mvhi r13,0x802
80038f8: 39 ad 0d d8 ori r13,r13,0xdd8
80038fc: 5c 20 00 12 bne r1,r0,8003944 <sigaction+0xfc>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
8003900: 34 02 00 01 mvi r2,1
8003904: b9 60 08 00 mv r1,r11
8003908: f8 00 65 76 calli 801cee0 <__ashlsi3>
800390c: 34 02 00 02 mvi r2,2
8003910: b4 2b 08 00 add r1,r1,r11
8003914: f8 00 65 73 calli 801cee0 <__ashlsi3>
8003918: 78 02 08 01 mvhi r2,0x801
800391c: 38 42 e8 e4 ori r2,r2,0xe8e4
8003920: b5 a1 68 00 add r13,r13,r1
8003924: b4 41 08 00 add r1,r2,r1
8003928: 28 23 00 00 lw r3,(r1+0)
800392c: 28 22 00 04 lw r2,(r1+4)
8003930: 28 21 00 08 lw r1,(r1+8)
8003934: 59 a3 00 00 sw (r13+0),r3
8003938: 59 a2 00 04 sw (r13+4),r2
800393c: 59 a1 00 08 sw (r13+8),r1
8003940: e0 00 00 10 bi 8003980 <sigaction+0x138>
} else {
_POSIX_signals_Clear_process_signals( sig );
8003944: b9 60 08 00 mv r1,r11
8003948: f8 00 18 99 calli 8009bac <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
800394c: 34 02 00 01 mvi r2,1
8003950: b9 60 08 00 mv r1,r11
8003954: f8 00 65 63 calli 801cee0 <__ashlsi3>
8003958: 34 02 00 02 mvi r2,2
800395c: b4 2b 08 00 add r1,r1,r11
8003960: f8 00 65 60 calli 801cee0 <__ashlsi3>
8003964: 29 83 00 00 lw r3,(r12+0)
8003968: 29 82 00 04 lw r2,(r12+4)
800396c: 29 84 00 08 lw r4,(r12+8)
8003970: b5 a1 08 00 add r1,r13,r1
8003974: 58 23 00 00 sw (r1+0),r3
8003978: 58 22 00 04 sw (r1+4),r2
800397c: 58 24 00 08 sw (r1+8),r4
}
_ISR_Enable( level );
8003980: d0 0e 00 00 wcsr IE,r14
* now (signals not posted when SIG_IGN).
* + If we are now ignoring a signal that was previously pending,
* we clear the pending signal indicator.
*/
return 0;
8003984: 34 01 00 00 mvi r1,0
}
8003988: 2b 9d 00 04 lw ra,(sp+4)
800398c: 2b 8b 00 14 lw r11,(sp+20)
8003990: 2b 8c 00 10 lw r12,(sp+16)
8003994: 2b 8d 00 0c lw r13,(sp+12)
8003998: 2b 8e 00 08 lw r14,(sp+8)
800399c: 37 9c 00 14 addi sp,sp,20
80039a0: c3 a0 00 00 ret
08003e34 <sigtimedwait>:
int sigtimedwait(
const sigset_t *set,
siginfo_t *info,
const struct timespec *timeout
)
{
8003e34: 37 9c ff dc addi sp,sp,-36
8003e38: 5b 8b 00 18 sw (sp+24),r11
8003e3c: 5b 8c 00 14 sw (sp+20),r12
8003e40: 5b 8d 00 10 sw (sp+16),r13
8003e44: 5b 8e 00 0c sw (sp+12),r14
8003e48: 5b 8f 00 08 sw (sp+8),r15
8003e4c: 5b 9d 00 04 sw (sp+4),ra
8003e50: b8 20 68 00 mv r13,r1
8003e54: b8 40 58 00 mv r11,r2
8003e58: b8 60 60 00 mv r12,r3
ISR_Level level;
/*
* Error check parameters before disabling interrupts.
*/
if ( !set )
8003e5c: 44 20 00 09 be r1,r0,8003e80 <sigtimedwait+0x4c>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
if ( timeout ) {
8003e60: 44 60 00 0b be r3,r0,8003e8c <sigtimedwait+0x58>
if ( !_Timespec_Is_valid( timeout ) )
8003e64: b8 60 08 00 mv r1,r3
8003e68: f8 00 0e 4a calli 8007790 <_Timespec_Is_valid>
8003e6c: 44 20 00 05 be r1,r0,8003e80 <sigtimedwait+0x4c>
rtems_set_errno_and_return_minus_one( EINVAL );
interval = _Timespec_To_ticks( timeout );
8003e70: b9 80 08 00 mv r1,r12
8003e74: f8 00 0e 65 calli 8007808 <_Timespec_To_ticks>
8003e78: b8 20 10 00 mv r2,r1
if ( !interval )
8003e7c: 5c 20 00 05 bne r1,r0,8003e90 <sigtimedwait+0x5c> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
8003e80: f8 00 28 58 calli 800dfe0 <__errno>
8003e84: 34 02 00 16 mvi r2,22
8003e88: e0 00 00 61 bi 800400c <sigtimedwait+0x1d8>
/* NOTE: This is very specifically a RELATIVE not ABSOLUTE time
* in the Open Group specification.
*/
interval = 0;
8003e8c: 34 02 00 00 mvi r2,0
/*
* Initialize local variables.
*/
the_info = ( info ) ? info : &signal_information;
8003e90: 5d 60 00 02 bne r11,r0,8003e98 <sigtimedwait+0x64>
8003e94: 37 8b 00 1c addi r11,sp,28
the_thread = _Thread_Executing;
8003e98: 78 01 08 02 mvhi r1,0x802
8003e9c: 38 21 0d 88 ori r1,r1,0xd88
8003ea0: 28 23 00 0c lw r3,(r1+12)
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
8003ea4: 28 6e 01 20 lw r14,(r3+288)
* What if they are already pending?
*/
/* API signals pending? */
_ISR_Disable( level );
8003ea8: 90 00 78 00 rcsr r15,IE
8003eac: 34 01 ff fe mvi r1,-2
8003eb0: a1 e1 08 00 and r1,r15,r1
8003eb4: d0 01 00 00 wcsr IE,r1
if ( *set & api->signals_pending ) {
8003eb8: 29 a5 00 00 lw r5,(r13+0)
8003ebc: 29 c1 00 d4 lw r1,(r14+212)
8003ec0: a0 a1 20 00 and r4,r5,r1
8003ec4: 44 80 00 0f be r4,r0,8003f00 <sigtimedwait+0xcc>
/* XXX real info later */
the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending );
8003ec8: fb ff ff bc calli 8003db8 <_POSIX_signals_Get_lowest>
8003ecc: b8 20 10 00 mv r2,r1
8003ed0: 59 61 00 00 sw (r11+0),r1
_POSIX_signals_Clear_signals(
8003ed4: b9 60 18 00 mv r3,r11
8003ed8: b9 c0 08 00 mv r1,r14
8003edc: 34 04 00 00 mvi r4,0
8003ee0: 34 05 00 00 mvi r5,0
8003ee4: f8 00 19 b5 calli 800a5b8 <_POSIX_signals_Clear_signals>
the_info->si_signo,
the_info,
false,
false
);
_ISR_Enable( level );
8003ee8: d0 0f 00 00 wcsr IE,r15
the_info->si_code = SI_USER;
8003eec: 34 01 00 01 mvi r1,1
8003ef0: 59 61 00 04 sw (r11+4),r1
the_info->si_value.sival_int = 0;
8003ef4: 59 60 00 08 sw (r11+8),r0
return the_info->si_signo;
8003ef8: 29 6c 00 00 lw r12,(r11+0)
8003efc: e0 00 00 46 bi 8004014 <sigtimedwait+0x1e0>
}
/* Process pending signals? */
if ( *set & _POSIX_signals_Pending ) {
8003f00: 78 01 08 02 mvhi r1,0x802
8003f04: 38 21 0f cc ori r1,r1,0xfcc
8003f08: 28 21 00 00 lw r1,(r1+0)
8003f0c: a0 a1 28 00 and r5,r5,r1
8003f10: 44 a4 00 0f be r5,r4,8003f4c <sigtimedwait+0x118>
signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending );
8003f14: fb ff ff a9 calli 8003db8 <_POSIX_signals_Get_lowest>
8003f18: b8 20 60 00 mv r12,r1
_POSIX_signals_Clear_signals( api, signo, the_info, true, false );
8003f1c: b9 80 10 00 mv r2,r12
8003f20: b9 c0 08 00 mv r1,r14
8003f24: b9 60 18 00 mv r3,r11
8003f28: 34 04 00 01 mvi r4,1
8003f2c: 34 05 00 00 mvi r5,0
8003f30: f8 00 19 a2 calli 800a5b8 <_POSIX_signals_Clear_signals>
_ISR_Enable( level );
8003f34: d0 0f 00 00 wcsr IE,r15
the_info->si_signo = signo;
the_info->si_code = SI_USER;
8003f38: 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;
8003f3c: 59 6c 00 00 sw (r11+0),r12
the_info->si_code = SI_USER;
8003f40: 59 61 00 04 sw (r11+4),r1
the_info->si_value.sival_int = 0;
8003f44: 59 60 00 08 sw (r11+8),r0
return signo;
8003f48: e0 00 00 33 bi 8004014 <sigtimedwait+0x1e0>
}
the_info->si_signo = -1;
8003f4c: 34 01 ff ff mvi r1,-1
8003f50: 59 61 00 00 sw (r11+0),r1
8003f54: 78 01 08 02 mvhi r1,0x802
8003f58: 38 21 08 b8 ori r1,r1,0x8b8
8003f5c: 28 24 00 00 lw r4,(r1+0)
8003f60: 34 84 00 01 addi r4,r4,1
8003f64: 58 24 00 00 sw (r1+0),r4
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
the_thread->Wait.return_code = EINTR;
8003f68: 34 04 00 04 mvi r4,4
8003f6c: 58 64 00 34 sw (r3+52),r4
the_thread->Wait.option = *set;
8003f70: 29 a4 00 00 lw r4,(r13+0)
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
8003f74: 78 01 08 02 mvhi r1,0x802
8003f78: 38 21 0f 64 ori r1,r1,0xf64
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
8003f7c: 58 64 00 30 sw (r3+48),r4
the_thread->Wait.return_argument = the_info;
8003f80: 58 6b 00 28 sw (r3+40),r11
}
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
8003f84: 58 61 00 44 sw (r3+68),r1
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
8003f88: 34 03 00 01 mvi r3,1
8003f8c: 58 23 00 30 sw (r1+48),r3
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
the_thread->Wait.return_argument = the_info;
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
8003f90: d0 0f 00 00 wcsr IE,r15
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
8003f94: 78 01 08 02 mvhi r1,0x802
8003f98: 78 03 08 00 mvhi r3,0x800
8003f9c: 38 21 0f 64 ori r1,r1,0xf64
8003fa0: 38 63 73 cc ori r3,r3,0x73cc
8003fa4: f8 00 0b e0 calli 8006f24 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
8003fa8: f8 00 0a af calli 8006a64 <_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 );
8003fac: 29 62 00 00 lw r2,(r11+0)
8003fb0: b9 c0 08 00 mv r1,r14
8003fb4: b9 60 18 00 mv r3,r11
8003fb8: 34 04 00 00 mvi r4,0
8003fbc: 34 05 00 00 mvi r5,0
8003fc0: f8 00 19 7e calli 800a5b8 <_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)
8003fc4: 78 01 08 02 mvhi r1,0x802
8003fc8: 38 21 0d 88 ori r1,r1,0xd88
8003fcc: 28 21 00 0c lw r1,(r1+12)
8003fd0: 28 22 00 34 lw r2,(r1+52)
8003fd4: 34 01 00 04 mvi r1,4
8003fd8: 5c 41 00 08 bne r2,r1,8003ff8 <sigtimedwait+0x1c4>
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
8003fdc: 29 6c 00 00 lw r12,(r11+0)
8003fe0: 34 01 00 01 mvi r1,1
8003fe4: 35 82 ff ff addi r2,r12,-1
8003fe8: f8 00 65 73 calli 801d5b4 <__ashlsi3>
8003fec: 29 a2 00 00 lw r2,(r13+0)
8003ff0: a0 22 08 00 and r1,r1,r2
8003ff4: 5c 20 00 08 bne r1,r0,8004014 <sigtimedwait+0x1e0>
errno = _Thread_Executing->Wait.return_code;
8003ff8: f8 00 27 fa calli 800dfe0 <__errno>
8003ffc: 78 02 08 02 mvhi r2,0x802
8004000: 38 42 0d 88 ori r2,r2,0xd88
8004004: 28 42 00 0c lw r2,(r2+12)
8004008: 28 42 00 34 lw r2,(r2+52)
800400c: 58 22 00 00 sw (r1+0),r2
return -1;
8004010: 34 0c ff ff mvi r12,-1
}
return the_info->si_signo;
}
8004014: b9 80 08 00 mv r1,r12
8004018: 2b 9d 00 04 lw ra,(sp+4)
800401c: 2b 8b 00 18 lw r11,(sp+24)
8004020: 2b 8c 00 14 lw r12,(sp+20)
8004024: 2b 8d 00 10 lw r13,(sp+16)
8004028: 2b 8e 00 0c lw r14,(sp+12)
800402c: 2b 8f 00 08 lw r15,(sp+8)
8004030: 37 9c 00 24 addi sp,sp,36
8004034: c3 a0 00 00 ret
080062c8 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
80062c8: 37 9c ff f8 addi sp,sp,-8
80062cc: 5b 8b 00 08 sw (sp+8),r11
80062d0: 5b 9d 00 04 sw (sp+4),ra
int status;
status = sigtimedwait( set, NULL, NULL );
80062d4: 34 03 00 00 mvi r3,0
int sigwait(
const sigset_t *set,
int *sig
)
{
80062d8: b8 40 58 00 mv r11,r2
int status;
status = sigtimedwait( set, NULL, NULL );
80062dc: 34 02 00 00 mvi r2,0
80062e0: fb ff ff 72 calli 80060a8 <sigtimedwait>
80062e4: b8 20 18 00 mv r3,r1
if ( status != -1 ) {
80062e8: 34 01 ff ff mvi r1,-1
80062ec: 44 61 00 05 be r3,r1,8006300 <sigwait+0x38>
if ( sig )
*sig = status;
return 0;
80062f0: 34 01 00 00 mvi r1,0
int status;
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
80062f4: 45 60 00 05 be r11,r0,8006308 <sigwait+0x40> <== NEVER TAKEN
*sig = status;
80062f8: 59 63 00 00 sw (r11+0),r3
80062fc: e0 00 00 03 bi 8006308 <sigwait+0x40>
return 0;
}
return errno;
8006300: f8 00 26 c2 calli 800fe08 <__errno>
8006304: 28 21 00 00 lw r1,(r1+0)
}
8006308: 2b 9d 00 04 lw ra,(sp+4)
800630c: 2b 8b 00 08 lw r11,(sp+8)
8006310: 37 9c 00 08 addi sp,sp,8
8006314: c3 a0 00 00 ret
08005aa4 <siproc>:
/*
* Process input character, with semaphore.
*/
static int
siproc (unsigned char c, struct rtems_termios_tty *tty)
{
8005aa4: 37 9c ff f4 addi sp,sp,-12
8005aa8: 5b 8b 00 0c sw (sp+12),r11
8005aac: 5b 8c 00 08 sw (sp+8),r12
8005ab0: 5b 9d 00 04 sw (sp+4),ra
8005ab4: b8 20 60 00 mv r12,r1
int i;
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
8005ab8: 28 41 00 3c lw r1,(r2+60)
/*
* Process input character, with semaphore.
*/
static int
siproc (unsigned char c, struct rtems_termios_tty *tty)
{
8005abc: b8 40 58 00 mv r11,r2
int i;
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
8005ac0: 20 21 0e 78 andi r1,r1,0xe78
8005ac4: 44 20 00 0c be r1,r0,8005af4 <siproc+0x50> <== NEVER TAKEN
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
8005ac8: 28 41 00 18 lw r1,(r2+24)
8005acc: 34 03 00 00 mvi r3,0
8005ad0: 34 02 00 00 mvi r2,0
8005ad4: f8 00 05 8d calli 8007108 <rtems_semaphore_obtain>
i = iproc (c, tty);
8005ad8: b9 80 08 00 mv r1,r12
8005adc: b9 60 10 00 mv r2,r11
8005ae0: fb ff ff 84 calli 80058f0 <iproc>
8005ae4: b8 20 60 00 mv r12,r1
rtems_semaphore_release (tty->osem);
8005ae8: 29 61 00 18 lw r1,(r11+24)
8005aec: f8 00 05 d7 calli 8007248 <rtems_semaphore_release>
8005af0: e0 00 00 04 bi 8005b00 <siproc+0x5c>
}
else {
i = iproc (c, tty);
8005af4: b9 80 08 00 mv r1,r12
8005af8: fb ff ff 7e calli 80058f0 <iproc> <== NOT EXECUTED
8005afc: b8 20 60 00 mv r12,r1 <== NOT EXECUTED
}
return i;
}
8005b00: b9 80 08 00 mv r1,r12
8005b04: 2b 9d 00 04 lw ra,(sp+4)
8005b08: 2b 8b 00 0c lw r11,(sp+12)
8005b0c: 2b 8c 00 08 lw r12,(sp+8)
8005b10: 37 9c 00 0c addi sp,sp,12
8005b14: c3 a0 00 00 ret
080020c8 <stat>:
int _STAT_NAME(
const char *path,
struct stat *buf
)
{
80020c8: 37 9c ff dc addi sp,sp,-36
80020cc: 5b 8b 00 10 sw (sp+16),r11
80020d0: 5b 8c 00 0c sw (sp+12),r12
80020d4: 5b 8d 00 08 sw (sp+8),r13
80020d8: 5b 9d 00 04 sw (sp+4),ra
80020dc: b8 20 58 00 mv r11,r1
80020e0: b8 40 68 00 mv r13,r2
/*
* Check to see if we were passed a valid pointer.
*/
if ( !buf )
80020e4: 5c 40 00 06 bne r2,r0,80020fc <stat+0x34> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EFAULT );
80020e8: f8 00 20 c5 calli 800a3fc <__errno>
80020ec: 34 02 00 0e mvi r2,14
80020f0: 58 22 00 00 sw (r1+0),r2
80020f4: 34 0b ff ff mvi r11,-1
80020f8: e0 00 00 17 bi 8002154 <stat+0x8c>
status = rtems_filesystem_evaluate_path( path, strlen( path ),
80020fc: f8 00 24 da calli 800b464 <strlen>
8002100: 37 8c 00 14 addi r12,sp,20
8002104: b8 20 10 00 mv r2,r1
8002108: 34 03 00 00 mvi r3,0
800210c: b9 60 08 00 mv r1,r11
8002110: b9 80 20 00 mv r4,r12
8002114: 34 05 00 01 mvi r5,1
8002118: fb ff fc 63 calli 80012a4 <rtems_filesystem_evaluate_path>
0, &loc, _STAT_FOLLOW_LINKS );
if ( status != 0 )
return -1;
800211c: 34 0b ff ff mvi r11,-1
if ( !buf )
rtems_set_errno_and_return_minus_one( EFAULT );
status = rtems_filesystem_evaluate_path( path, strlen( path ),
0, &loc, _STAT_FOLLOW_LINKS );
if ( status != 0 )
8002120: 5c 20 00 0d bne r1,r0,8002154 <stat+0x8c>
/*
* Zero out the stat structure so the various support
* versions of stat don't have to.
*/
memset( buf, 0, sizeof(struct stat) );
8002124: 34 02 00 00 mvi r2,0
8002128: 34 03 00 48 mvi r3,72
800212c: b9 a0 08 00 mv r1,r13
8002130: f8 00 23 aa calli 800afd8 <memset>
status = (*loc.handlers->fstat_h)( &loc, buf );
8002134: 2b 81 00 1c lw r1,(sp+28)
8002138: b9 a0 10 00 mv r2,r13
800213c: 28 23 00 18 lw r3,(r1+24)
8002140: b9 80 08 00 mv r1,r12
8002144: d8 60 00 00 call r3
8002148: b8 20 58 00 mv r11,r1
rtems_filesystem_freenode( &loc );
800214c: b9 80 08 00 mv r1,r12
8002150: fb ff fc 9d calli 80013c4 <rtems_filesystem_freenode>
return status;
}
8002154: b9 60 08 00 mv r1,r11
8002158: 2b 9d 00 04 lw ra,(sp+4)
800215c: 2b 8b 00 10 lw r11,(sp+16)
8002160: 2b 8c 00 0c lw r12,(sp+12)
8002164: 2b 8d 00 08 lw r13,(sp+8)
8002168: 37 9c 00 24 addi sp,sp,36
800216c: c3 a0 00 00 ret
080050a8 <statvfs>:
#include <sys/statvfs.h>
int
statvfs (const char *path, struct statvfs *sb)
{
80050a8: 37 9c ff dc addi sp,sp,-36
80050ac: 5b 8b 00 10 sw (sp+16),r11
80050b0: 5b 8c 00 0c sw (sp+12),r12
80050b4: 5b 8d 00 08 sw (sp+8),r13
80050b8: 5b 9d 00 04 sw (sp+4),ra
80050bc: b8 20 58 00 mv r11,r1
80050c0: b8 40 68 00 mv r13,r2
* The root node of the mounted filesytem.
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
80050c4: 37 8c 00 14 addi r12,sp,20
80050c8: f8 00 32 78 calli 8011aa8 <strlen>
80050cc: b8 20 10 00 mv r2,r1
80050d0: 34 03 00 00 mvi r3,0
80050d4: b9 60 08 00 mv r1,r11
80050d8: b9 80 20 00 mv r4,r12
80050dc: 34 05 00 01 mvi r5,1
80050e0: fb ff fa 2c calli 8003990 <rtems_filesystem_evaluate_path>
return -1;
80050e4: 34 0b ff ff mvi r11,-1
* The root node of the mounted filesytem.
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
80050e8: 5c 20 00 0e bne r1,r0,8005120 <statvfs+0x78> <== NEVER TAKEN
return -1;
mt_entry = loc.mt_entry;
80050ec: 2b 8b 00 24 lw r11,(sp+36)
fs_mount_root = &mt_entry->mt_fs_root;
memset (sb, 0, sizeof (struct statvfs));
80050f0: 34 02 00 00 mvi r2,0
80050f4: 34 03 00 38 mvi r3,56
80050f8: b9 a0 08 00 mv r1,r13
80050fc: f8 00 2d c9 calli 8010820 <memset>
result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb );
8005100: 29 61 00 28 lw r1,(r11+40)
8005104: b9 a0 10 00 mv r2,r13
8005108: 28 23 00 44 lw r3,(r1+68)
800510c: 35 61 00 1c addi r1,r11,28
8005110: d8 60 00 00 call r3
8005114: b8 20 58 00 mv r11,r1
rtems_filesystem_freenode( &loc );
8005118: b9 80 08 00 mv r1,r12
800511c: fb ff fa 65 calli 8003ab0 <rtems_filesystem_freenode>
return result;
}
8005120: b9 60 08 00 mv r1,r11
8005124: 2b 9d 00 04 lw ra,(sp+4)
8005128: 2b 8b 00 10 lw r11,(sp+16)
800512c: 2b 8c 00 0c lw r12,(sp+12)
8005130: 2b 8d 00 08 lw r13,(sp+8)
8005134: 37 9c 00 24 addi sp,sp,36
8005138: c3 a0 00 00 ret
080039b4 <sync_per_thread>:
fdatasync(fn);
}
/* iterate over all FILE *'s for this thread */
static void sync_per_thread(Thread_Control *t)
{
80039b4: 37 9c ff f4 addi sp,sp,-12
80039b8: 5b 8b 00 0c sw (sp+12),r11
80039bc: 5b 8c 00 08 sw (sp+8),r12
80039c0: 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;
80039c4: 28 22 01 18 lw r2,(r1+280)
if ( this_reent ) {
80039c8: 44 40 00 0c be r2,r0,80039f8 <sync_per_thread+0x44> <== NEVER TAKEN
current_reent = _Thread_Executing->libc_reent;
80039cc: 78 0b 08 01 mvhi r11,0x801
80039d0: 39 6b 6d 38 ori r11,r11,0x6d38
80039d4: 29 63 00 0c lw r3,(r11+12)
80039d8: 28 6c 01 18 lw r12,(r3+280)
_Thread_Executing->libc_reent = this_reent;
80039dc: 58 62 01 18 sw (r3+280),r2
_fwalk (t->libc_reent, sync_wrapper);
80039e0: 28 21 01 18 lw r1,(r1+280)
80039e4: 78 02 08 00 mvhi r2,0x800
80039e8: 38 42 3a 0c ori r2,r2,0x3a0c
80039ec: f8 00 2b c4 calli 800e8fc <_fwalk>
_Thread_Executing->libc_reent = current_reent;
80039f0: 29 61 00 0c lw r1,(r11+12)
80039f4: 58 2c 01 18 sw (r1+280),r12
}
}
80039f8: 2b 9d 00 04 lw ra,(sp+4)
80039fc: 2b 8b 00 0c lw r11,(sp+12)
8003a00: 2b 8c 00 08 lw r12,(sp+8)
8003a04: 37 9c 00 0c addi sp,sp,12
8003a08: c3 a0 00 00 ret
0800226c <tcflow>:
int tcflow (
int fd __attribute__((unused)),
int action
)
{
800226c: 37 9c ff fc addi sp,sp,-4 <== NOT EXECUTED
8002270: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
case TCOOFF:
case TCOON:
case TCIOFF:
case TCION:
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8002274: f8 00 1f f9 calli 800a258 <__errno> <== NOT EXECUTED
8002278: 34 02 00 16 mvi r2,22 <== NOT EXECUTED
800227c: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
/* fd is not validated */
/* When this is supported, implement it here */
rtems_set_errno_and_return_minus_one( ENOTSUP );
}
8002280: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
8002284: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
8002288: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED
800228c: c3 a0 00 00 ret <== NOT EXECUTED
08002290 <tcflush>:
int tcflush (
int fd __attribute__((unused)),
int queue
)
{
8002290: 37 9c ff fc addi sp,sp,-4 <== NOT EXECUTED
8002294: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
switch (queue) {
case TCIFLUSH:
case TCOFLUSH:
case TCIOFLUSH:
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8002298: f8 00 1f f0 calli 800a258 <__errno> <== NOT EXECUTED
800229c: 34 02 00 16 mvi r2,22 <== NOT EXECUTED
80022a0: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED
/* fd is not validated */
/* When this is supported, implement it here */
rtems_set_errno_and_return_minus_one( ENOTSUP );
return 0;
}
80022a4: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED
80022a8: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80022ac: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED
80022b0: c3 a0 00 00 ret <== NOT EXECUTED
080022b4 <tcgetpgrp>:
#include <sys/types.h>
#include <unistd.h>
pid_t tcgetpgrp(int fd __attribute__((unused)))
{
80022b4: 37 9c ff fc addi sp,sp,-4 <== NOT EXECUTED
80022b8: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED
return getpid();
80022bc: fb ff fc 7e calli 80014b4 <getpid> <== NOT EXECUTED
}
80022c0: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED
80022c4: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED
80022c8: c3 a0 00 00 ret <== NOT EXECUTED
080022cc <tcsendbreak>:
int tcsendbreak (
int fd __attribute__((unused)),
int duration __attribute__((unused)) )
{
return 0;
}
80022cc: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
80022d0: c3 a0 00 00 ret <== NOT EXECUTED
08004648 <tcsetattr>:
int tcsetattr(
int fd,
int opt,
struct termios *tp
)
{
8004648: 37 9c ff f4 addi sp,sp,-12
800464c: 5b 8b 00 0c sw (sp+12),r11
8004650: 5b 8c 00 08 sw (sp+8),r12
8004654: 5b 9d 00 04 sw (sp+4),ra
8004658: b8 20 60 00 mv r12,r1
800465c: b8 60 58 00 mv r11,r3
switch (opt) {
8004660: 44 40 00 0d be r2,r0,8004694 <tcsetattr+0x4c>
8004664: 34 03 00 01 mvi r3,1
8004668: 44 43 00 06 be r2,r3,8004680 <tcsetattr+0x38>
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
800466c: f8 00 31 ab calli 8010d18 <__errno>
8004670: 34 02 00 86 mvi r2,134
8004674: 58 22 00 00 sw (r1+0),r2
8004678: 34 02 ff ff mvi r2,-1
800467c: e0 00 00 0b bi 80046a8 <tcsetattr+0x60>
case TCSADRAIN:
if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0)
8004680: 34 02 00 03 mvi r2,3
8004684: 34 03 00 00 mvi r3,0
8004688: f8 00 21 e7 calli 800ce24 <ioctl>
return -1;
800468c: 34 02 ff ff mvi r2,-1
switch (opt) {
default:
rtems_set_errno_and_return_minus_one( ENOTSUP );
case TCSADRAIN:
if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0)
8004690: 48 01 00 06 bg r0,r1,80046a8 <tcsetattr+0x60> <== NEVER TAKEN
return -1;
/*
* Fall through to....
*/
case TCSANOW:
return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp );
8004694: 34 02 00 02 mvi r2,2
8004698: b9 80 08 00 mv r1,r12
800469c: b9 60 18 00 mv r3,r11
80046a0: f8 00 21 e1 calli 800ce24 <ioctl>
80046a4: b8 20 10 00 mv r2,r1
}
}
80046a8: b8 40 08 00 mv r1,r2
80046ac: 2b 9d 00 04 lw ra,(sp+4)
80046b0: 2b 8b 00 0c lw r11,(sp+12)
80046b4: 2b 8c 00 08 lw r12,(sp+8)
80046b8: 37 9c 00 0c addi sp,sp,12
80046bc: c3 a0 00 00 ret
080022d4 <tcsetpgrp>:
int tcsetpgrp(
int fd __attribute__((unused)),
pid_t pid __attribute__((unused)) )
{
return 0;
}
80022d4: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
80022d8: c3 a0 00 00 ret <== NOT EXECUTED
08002e30 <timer_create>:
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
8002e30: 37 9c ff ec addi sp,sp,-20
8002e34: 5b 8b 00 14 sw (sp+20),r11
8002e38: 5b 8c 00 10 sw (sp+16),r12
8002e3c: 5b 8d 00 0c sw (sp+12),r13
8002e40: 5b 8e 00 08 sw (sp+8),r14
8002e44: 5b 9d 00 04 sw (sp+4),ra
8002e48: b8 40 60 00 mv r12,r2
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
8002e4c: 34 02 00 01 mvi r2,1
int timer_create(
clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid
)
{
8002e50: b8 60 68 00 mv r13,r3
POSIX_Timer_Control *ptimer;
if ( clock_id != CLOCK_REALTIME )
8002e54: 5c 22 00 0c bne r1,r2,8002e84 <timer_create+0x54>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !timerid )
8002e58: 44 60 00 0b be r3,r0,8002e84 <timer_create+0x54>
/*
* The data of the structure evp are checked in order to verify if they
* are coherent.
*/
if (evp != NULL) {
8002e5c: 45 80 00 0d be r12,r0,8002e90 <timer_create+0x60>
/* The structure has data */
if ( ( evp->sigev_notify != SIGEV_NONE ) &&
8002e60: 29 82 00 00 lw r2,(r12+0)
8002e64: 34 42 ff ff addi r2,r2,-1
8002e68: 50 22 00 02 bgeu r1,r2,8002e70 <timer_create+0x40> <== ALWAYS TAKEN
8002e6c: e0 00 00 06 bi 8002e84 <timer_create+0x54> <== NOT EXECUTED
( evp->sigev_notify != SIGEV_SIGNAL ) ) {
/* The value of the field sigev_notify is not valid */
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !evp->sigev_signo )
8002e70: 29 81 00 04 lw r1,(r12+4)
8002e74: 44 20 00 04 be r1,r0,8002e84 <timer_create+0x54> <== NEVER TAKEN
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
8002e78: 34 21 ff ff addi r1,r1,-1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(evp->sigev_signo) )
8002e7c: 34 02 00 1f mvi r2,31
8002e80: 50 41 00 04 bgeu r2,r1,8002e90 <timer_create+0x60> <== ALWAYS TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
8002e84: f8 00 29 d2 calli 800d5cc <__errno>
8002e88: 34 02 00 16 mvi r2,22
8002e8c: e0 00 00 0e bi 8002ec4 <timer_create+0x94>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
8002e90: 78 01 08 01 mvhi r1,0x801
8002e94: 38 21 f8 b8 ori r1,r1,0xf8b8
8002e98: 28 22 00 00 lw r2,(r1+0)
8002e9c: 34 42 00 01 addi r2,r2,1
8002ea0: 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 );
8002ea4: 78 01 08 01 mvhi r1,0x801
8002ea8: 38 21 fb 50 ori r1,r1,0xfb50
8002eac: f8 00 07 13 calli 8004af8 <_Objects_Allocate>
8002eb0: b8 20 58 00 mv r11,r1
/*
* Allocate a timer
*/
ptimer = _POSIX_Timer_Allocate();
if ( !ptimer ) {
8002eb4: 5c 20 00 07 bne r1,r0,8002ed0 <timer_create+0xa0>
_Thread_Enable_dispatch();
8002eb8: f8 00 0b 6f calli 8005c74 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( EAGAIN );
8002ebc: f8 00 29 c4 calli 800d5cc <__errno>
8002ec0: 34 02 00 0b mvi r2,11
8002ec4: 58 22 00 00 sw (r1+0),r2
8002ec8: 34 01 ff ff mvi r1,-1
8002ecc: e0 00 00 25 bi 8002f60 <timer_create+0x130>
}
/* The data of the created timer are stored to use them later */
ptimer->state = POSIX_TIMER_STATE_CREATE_NEW;
8002ed0: 34 01 00 02 mvi r1,2
8002ed4: 31 61 00 3c sb (r11+60),r1
ptimer->thread_id = _Thread_Executing->Object.id;
8002ed8: 78 01 08 01 mvhi r1,0x801
8002edc: 38 21 fd 88 ori r1,r1,0xfd88
8002ee0: 28 21 00 0c lw r1,(r1+12)
8002ee4: 28 21 00 08 lw r1,(r1+8)
8002ee8: 59 61 00 38 sw (r11+56),r1
if ( evp != NULL ) {
8002eec: 45 80 00 07 be r12,r0,8002f08 <timer_create+0xd8>
ptimer->inf.sigev_notify = evp->sigev_notify;
8002ef0: 29 81 00 00 lw r1,(r12+0)
8002ef4: 59 61 00 40 sw (r11+64),r1
ptimer->inf.sigev_signo = evp->sigev_signo;
8002ef8: 29 81 00 04 lw r1,(r12+4)
8002efc: 59 61 00 44 sw (r11+68),r1
ptimer->inf.sigev_value = evp->sigev_value;
8002f00: 29 81 00 08 lw r1,(r12+8)
8002f04: 59 61 00 48 sw (r11+72),r1
uint32_t name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
8002f08: 29 6c 00 08 lw r12,(r11+8)
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
_Thread_Enable_dispatch();
return 0;
}
8002f0c: 78 01 08 01 mvhi r1,0x801
8002f10: 38 21 fb 50 ori r1,r1,0xfb50
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
8002f14: 28 2e 00 1c lw r14,(r1+28)
8002f18: 34 02 00 02 mvi r2,2
ptimer->inf.sigev_notify = evp->sigev_notify;
ptimer->inf.sigev_signo = evp->sigev_signo;
ptimer->inf.sigev_value = evp->sigev_value;
}
ptimer->overrun = 0;
8002f1c: 59 60 00 68 sw (r11+104),r0
ptimer->timer_data.it_value.tv_sec = 0;
8002f20: 59 60 00 5c sw (r11+92),r0
ptimer->timer_data.it_value.tv_nsec = 0;
8002f24: 59 60 00 60 sw (r11+96),r0
ptimer->timer_data.it_interval.tv_sec = 0;
8002f28: 59 60 00 54 sw (r11+84),r0
ptimer->timer_data.it_interval.tv_nsec = 0;
8002f2c: 59 60 00 58 sw (r11+88),r0
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8002f30: 59 60 00 18 sw (r11+24),r0
the_watchdog->routine = routine;
8002f34: 59 60 00 2c sw (r11+44),r0
the_watchdog->id = id;
8002f38: 59 60 00 30 sw (r11+48),r0
the_watchdog->user_data = user_data;
8002f3c: 59 60 00 34 sw (r11+52),r0
8002f40: 21 81 ff ff andi r1,r12,0xffff
8002f44: f8 00 61 8d calli 801b578 <__ashlsi3>
8002f48: b5 c1 08 00 add r1,r14,r1
8002f4c: 58 2b 00 00 sw (r1+0),r11
_Objects_Get_index( the_object->id ),
the_object
);
/* ASSERT: information->is_string == false */
the_object->name.name_u32 = name;
8002f50: 59 60 00 0c sw (r11+12),r0
_Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL );
_Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0);
*timerid = ptimer->Object.id;
8002f54: 59 ac 00 00 sw (r13+0),r12
_Thread_Enable_dispatch();
8002f58: f8 00 0b 47 calli 8005c74 <_Thread_Enable_dispatch>
return 0;
8002f5c: 34 01 00 00 mvi r1,0
}
8002f60: 2b 9d 00 04 lw ra,(sp+4)
8002f64: 2b 8b 00 14 lw r11,(sp+20)
8002f68: 2b 8c 00 10 lw r12,(sp+16)
8002f6c: 2b 8d 00 0c lw r13,(sp+12)
8002f70: 2b 8e 00 08 lw r14,(sp+8)
8002f74: 37 9c 00 14 addi sp,sp,20
8002f78: c3 a0 00 00 ret
08002f7c <timer_settime>:
timer_t timerid,
int flags,
const struct itimerspec *value,
struct itimerspec *ovalue
)
{
8002f7c: 37 9c ff cc addi sp,sp,-52
8002f80: 5b 8b 00 18 sw (sp+24),r11
8002f84: 5b 8c 00 14 sw (sp+20),r12
8002f88: 5b 8d 00 10 sw (sp+16),r13
8002f8c: 5b 8e 00 0c sw (sp+12),r14
8002f90: 5b 8f 00 08 sw (sp+8),r15
8002f94: 5b 9d 00 04 sw (sp+4),ra
8002f98: b8 20 78 00 mv r15,r1
8002f9c: b8 40 58 00 mv r11,r2
8002fa0: b8 60 60 00 mv r12,r3
8002fa4: b8 80 68 00 mv r13,r4
Objects_Locations location;
bool activated;
uint32_t initial_period;
struct itimerspec normalize;
if ( !value )
8002fa8: 44 60 00 69 be r3,r0,800314c <timer_settime+0x1d0> <== 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) ) ) {
8002fac: 34 61 00 08 addi r1,r3,8
8002fb0: f8 00 0e b4 calli 8006a80 <_Timespec_Is_valid>
8002fb4: 44 20 00 66 be r1,r0,800314c <timer_settime+0x1d0>
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( !_Timespec_Is_valid( &(value->it_interval) ) ) {
8002fb8: b9 80 08 00 mv r1,r12
8002fbc: f8 00 0e b1 calli 8006a80 <_Timespec_Is_valid>
8002fc0: 44 20 00 63 be r1,r0,800314c <timer_settime+0x1d0> <== NEVER TAKEN
rtems_set_errno_and_return_minus_one( EINVAL );
}
if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) {
8002fc4: 7d 62 00 00 cmpnei r2,r11,0
8002fc8: 7d 61 00 04 cmpnei r1,r11,4
8002fcc: a0 41 08 00 and r1,r2,r1
8002fd0: 5c 20 00 5f bne r1,r0,800314c <timer_settime+0x1d0>
rtems_set_errno_and_return_minus_one( EINVAL );
}
normalize = *value;
8002fd4: 29 81 00 0c lw r1,(r12+12)
8002fd8: 29 84 00 00 lw r4,(r12+0)
8002fdc: 29 83 00 04 lw r3,(r12+4)
8002fe0: 29 82 00 08 lw r2,(r12+8)
8002fe4: 5b 81 00 28 sw (sp+40),r1
8002fe8: 5b 84 00 1c sw (sp+28),r4
8002fec: 5b 83 00 20 sw (sp+32),r3
8002ff0: 5b 82 00 24 sw (sp+36),r2
/* Convert absolute to relative time */
if (flags == TIMER_ABSTIME) {
8002ff4: 34 01 00 04 mvi r1,4
8002ff8: 5d 61 00 0d bne r11,r1,800302c <timer_settime+0xb0>
struct timespec now;
_TOD_Get( &now );
8002ffc: 37 8b 00 2c addi r11,sp,44
8003000: b9 60 08 00 mv r1,r11
8003004: f8 00 04 f4 calli 80043d4 <_TOD_Get>
/* Check for seconds in the past */
if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
8003008: 37 8e 00 24 addi r14,sp,36
800300c: b9 60 08 00 mv r1,r11
8003010: b9 c0 10 00 mv r2,r14
8003014: f8 00 0e 90 calli 8006a54 <_Timespec_Greater_than>
8003018: 5c 20 00 4d bne r1,r0,800314c <timer_settime+0x1d0>
rtems_set_errno_and_return_minus_one( EINVAL );
_Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value );
800301c: b9 60 08 00 mv r1,r11
8003020: b9 c0 10 00 mv r2,r14
8003024: b9 c0 18 00 mv r3,r14
8003028: f8 00 0e a2 calli 8006ab0 <_Timespec_Subtract>
timer_t id,
Objects_Locations *location
)
{
return (POSIX_Timer_Control *)
_Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location );
800302c: 78 03 08 01 mvhi r3,0x801
8003030: b8 60 08 00 mv r1,r3
8003034: b9 e0 10 00 mv r2,r15
8003038: 38 21 fb 50 ori r1,r1,0xfb50
800303c: 37 83 00 34 addi r3,sp,52
8003040: f8 00 07 fd calli 8005034 <_Objects_Get>
* something with the structure of times of the timer: to stop, start
* or start it again
*/
ptimer = _POSIX_Timer_Get( timerid, &location );
switch ( location ) {
8003044: 2b 82 00 34 lw r2,(sp+52)
8003048: b8 20 58 00 mv r11,r1
800304c: 5c 40 00 40 bne r2,r0,800314c <timer_settime+0x1d0>
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 ) {
8003050: 2b 81 00 24 lw r1,(sp+36)
8003054: 5c 22 00 19 bne r1,r2,80030b8 <timer_settime+0x13c>
8003058: 2b 8e 00 28 lw r14,(sp+40)
800305c: 5d c1 00 17 bne r14,r1,80030b8 <timer_settime+0x13c>
/* Stop the timer */
(void) _Watchdog_Remove( &ptimer->Timer );
8003060: 35 61 00 10 addi r1,r11,16
8003064: f8 00 10 08 calli 8007084 <_Watchdog_Remove>
/* The old data of the timer are returned */
if ( ovalue )
8003068: 45 ae 00 09 be r13,r14,800308c <timer_settime+0x110>
*ovalue = ptimer->timer_data;
800306c: 29 64 00 54 lw r4,(r11+84)
8003070: 29 63 00 58 lw r3,(r11+88)
8003074: 29 62 00 5c lw r2,(r11+92)
8003078: 29 61 00 60 lw r1,(r11+96)
800307c: 59 a4 00 00 sw (r13+0),r4
8003080: 59 a3 00 04 sw (r13+4),r3
8003084: 59 a2 00 08 sw (r13+8),r2
8003088: 59 a1 00 0c sw (r13+12),r1
/* The new data are set */
ptimer->timer_data = normalize;
800308c: 2b 81 00 1c lw r1,(sp+28)
8003090: 59 61 00 54 sw (r11+84),r1
8003094: 2b 81 00 20 lw r1,(sp+32)
8003098: 59 61 00 58 sw (r11+88),r1
800309c: 2b 81 00 24 lw r1,(sp+36)
80030a0: 59 61 00 5c sw (r11+92),r1
80030a4: 2b 81 00 28 lw r1,(sp+40)
80030a8: 59 61 00 60 sw (r11+96),r1
/* Indicates that the timer is created and stopped */
ptimer->state = POSIX_TIMER_STATE_CREATE_STOP;
80030ac: 34 01 00 04 mvi r1,4
80030b0: 31 61 00 3c sb (r11+60),r1
80030b4: e0 00 00 23 bi 8003140 <timer_settime+0x1c4>
_Thread_Enable_dispatch();
return 0;
}
/* Convert from seconds and nanoseconds to ticks */
ptimer->ticks = _Timespec_To_ticks( &value->it_interval );
80030b8: b9 80 08 00 mv r1,r12
80030bc: f8 00 0e 8f calli 8006af8 <_Timespec_To_ticks>
80030c0: 59 61 00 64 sw (r11+100),r1
initial_period = _Timespec_To_ticks( &normalize.it_value );
80030c4: 37 81 00 24 addi r1,sp,36
80030c8: f8 00 0e 8c calli 8006af8 <_Timespec_To_ticks>
activated = _POSIX_Timer_Insert_helper(
80030cc: 29 63 00 08 lw r3,(r11+8)
80030d0: 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 );
80030d4: b8 20 10 00 mv r2,r1
activated = _POSIX_Timer_Insert_helper(
80030d8: 38 84 31 7c ori r4,r4,0x317c
80030dc: 35 61 00 10 addi r1,r11,16
80030e0: b9 60 28 00 mv r5,r11
80030e4: f8 00 1a a6 calli 8009b7c <_POSIX_Timer_Insert_helper>
initial_period,
ptimer->Object.id,
_POSIX_Timer_TSR,
ptimer
);
if ( !activated ) {
80030e8: 44 20 00 16 be r1,r0,8003140 <timer_settime+0x1c4>
/*
* The timer has been started and is running. So we return the
* old ones in "ovalue"
*/
if ( ovalue )
80030ec: 45 a0 00 09 be r13,r0,8003110 <timer_settime+0x194>
*ovalue = ptimer->timer_data;
80030f0: 29 64 00 54 lw r4,(r11+84)
80030f4: 29 63 00 58 lw r3,(r11+88)
80030f8: 29 62 00 5c lw r2,(r11+92)
80030fc: 29 61 00 60 lw r1,(r11+96)
8003100: 59 a4 00 00 sw (r13+0),r4
8003104: 59 a3 00 04 sw (r13+4),r3
8003108: 59 a2 00 08 sw (r13+8),r2
800310c: 59 a1 00 0c sw (r13+12),r1
ptimer->timer_data = normalize;
8003110: 2b 81 00 1c lw r1,(sp+28)
8003114: 59 61 00 54 sw (r11+84),r1
8003118: 2b 81 00 20 lw r1,(sp+32)
800311c: 59 61 00 58 sw (r11+88),r1
8003120: 2b 81 00 24 lw r1,(sp+36)
8003124: 59 61 00 5c sw (r11+92),r1
8003128: 2b 81 00 28 lw r1,(sp+40)
800312c: 59 61 00 60 sw (r11+96),r1
/* Indicate that the time is running */
ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
8003130: 34 01 00 03 mvi r1,3
8003134: 31 61 00 3c sb (r11+60),r1
_TOD_Get( &ptimer->time );
8003138: 35 61 00 6c addi r1,r11,108
800313c: f8 00 04 a6 calli 80043d4 <_TOD_Get>
_Thread_Enable_dispatch();
8003140: f8 00 0a cd calli 8005c74 <_Thread_Enable_dispatch>
return 0;
8003144: 34 01 00 00 mvi r1,0
8003148: e0 00 00 05 bi 800315c <timer_settime+0x1e0>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( EINVAL );
800314c: f8 00 29 20 calli 800d5cc <__errno>
8003150: 34 02 00 16 mvi r2,22
8003154: 58 22 00 00 sw (r1+0),r2
8003158: 34 01 ff ff mvi r1,-1
}
800315c: 2b 9d 00 04 lw ra,(sp+4)
8003160: 2b 8b 00 18 lw r11,(sp+24)
8003164: 2b 8c 00 14 lw r12,(sp+20)
8003168: 2b 8d 00 10 lw r13,(sp+16)
800316c: 2b 8e 00 0c lw r14,(sp+12)
8003170: 2b 8f 00 08 lw r15,(sp+8)
8003174: 37 9c 00 34 addi sp,sp,52
8003178: c3 a0 00 00 ret
08002d34 <ualarm>:
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
8002d34: 37 9c ff e8 addi sp,sp,-24
8002d38: 5b 8b 00 10 sw (sp+16),r11
8002d3c: 5b 8c 00 0c sw (sp+12),r12
8002d40: 5b 8d 00 08 sw (sp+8),r13
8002d44: 5b 9d 00 04 sw (sp+4),ra
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
8002d48: 78 0b 08 01 mvhi r11,0x801
8002d4c: 39 6b 71 60 ori r11,r11,0x7160
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
8002d50: b8 20 68 00 mv r13,r1
/*
* Initialize the timer used to implement alarm().
*/
if ( !the_timer->routine ) {
8002d54: 29 61 00 1c lw r1,(r11+28)
8002d58: 5c 20 00 09 bne r1,r0,8002d7c <ualarm+0x48>
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
8002d5c: 78 01 08 00 mvhi r1,0x800
8002d60: 38 21 2c ec ori r1,r1,0x2cec
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
8002d64: 59 60 00 08 sw (r11+8),r0
the_watchdog->routine = routine;
8002d68: 59 61 00 1c sw (r11+28),r1
the_watchdog->id = id;
8002d6c: 59 60 00 20 sw (r11+32),r0
the_watchdog->user_data = user_data;
8002d70: 59 60 00 24 sw (r11+36),r0
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
8002d74: 34 0c 00 00 mvi r12,0
8002d78: e0 00 00 18 bi 8002dd8 <ualarm+0xa4>
if ( !the_timer->routine ) {
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
8002d7c: b9 60 08 00 mv r1,r11
8002d80: f8 00 0f 27 calli 8006a1c <_Watchdog_Remove>
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
8002d84: 34 21 ff fe addi r1,r1,-2
8002d88: 34 02 00 01 mvi r2,1
useconds_t ualarm(
useconds_t useconds,
useconds_t interval
)
{
useconds_t remaining = 0;
8002d8c: 34 0c 00 00 mvi r12,0
_Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL );
} else {
Watchdog_States state;
state = _Watchdog_Remove( the_timer );
if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) {
8002d90: 54 22 00 12 bgu r1,r2,8002dd8 <ualarm+0xa4> <== 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);
8002d94: 29 61 00 0c lw r1,(r11+12)
8002d98: 29 62 00 14 lw r2,(r11+20)
8002d9c: b4 41 10 00 add r2,r2,r1
8002da0: 29 61 00 18 lw r1,(r11+24)
/* remaining is now in ticks */
_Timespec_From_ticks( ticks, &tp );
8002da4: c8 41 08 00 sub r1,r2,r1
8002da8: 37 82 00 14 addi r2,sp,20
8002dac: f8 00 0d 54 calli 80062fc <_Timespec_From_ticks>
remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND;
8002db0: 78 03 08 01 mvhi r3,0x801
8002db4: 38 63 4d 68 ori r3,r3,0x4d68
8002db8: 28 62 00 00 lw r2,(r3+0)
8002dbc: 2b 81 00 14 lw r1,(sp+20)
8002dc0: f8 00 43 32 calli 8013a88 <__mulsi3>
8002dc4: b8 20 60 00 mv r12,r1
remaining += tp.tv_nsec / 1000;
8002dc8: 2b 81 00 18 lw r1,(sp+24)
8002dcc: 34 02 03 e8 mvi r2,1000
8002dd0: f8 00 43 3a calli 8013ab8 <__divsi3>
8002dd4: b4 2c 60 00 add r12,r1,r12
/*
* If useconds is non-zero, then the caller wants to schedule
* the alarm repeatedly at that interval. If the interval is
* less than a single clock tick, then fudge it to a clock tick.
*/
if ( useconds ) {
8002dd8: 45 a0 00 1a be r13,r0,8002e40 <ualarm+0x10c>
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
8002ddc: 78 03 08 01 mvhi r3,0x801
8002de0: 38 63 4d 68 ori r3,r3,0x4d68
8002de4: 28 62 00 00 lw r2,(r3+0)
8002de8: b9 a0 08 00 mv r1,r13
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
ticks = _Timespec_To_ticks( &tp );
8002dec: 37 8b 00 14 addi r11,sp,20
* less than a single clock tick, then fudge it to a clock tick.
*/
if ( useconds ) {
Watchdog_Interval ticks;
tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND;
8002df0: f8 00 43 8b calli 8013c1c <__udivsi3>
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
8002df4: 78 03 08 01 mvhi r3,0x801
8002df8: 38 63 4d 68 ori r3,r3,0x4d68
8002dfc: 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;
8002e00: 5b 81 00 14 sw (sp+20),r1
tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000;
8002e04: b9 a0 08 00 mv r1,r13
8002e08: f8 00 43 95 calli 8013c5c <__umodsi3>
8002e0c: 34 02 03 e8 mvi r2,1000
8002e10: f8 00 43 1e calli 8013a88 <__mulsi3>
8002e14: 5b 81 00 18 sw (sp+24),r1
ticks = _Timespec_To_ticks( &tp );
8002e18: b9 60 08 00 mv r1,r11
8002e1c: f8 00 0d 66 calli 80063b4 <_Timespec_To_ticks>
if ( ticks == 0 )
ticks = 1;
_Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) );
8002e20: b9 60 08 00 mv r1,r11
8002e24: f8 00 0d 64 calli 80063b4 <_Timespec_To_ticks>
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
8002e28: 78 02 08 01 mvhi r2,0x801
8002e2c: 38 42 71 60 ori r2,r2,0x7160
8002e30: 58 41 00 0c sw (r2+12),r1
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
8002e34: 78 01 08 01 mvhi r1,0x801
8002e38: 38 21 69 a8 ori r1,r1,0x69a8
8002e3c: f8 00 0e 9b calli 80068a8 <_Watchdog_Insert>
}
return remaining;
}
8002e40: b9 80 08 00 mv r1,r12
8002e44: 2b 9d 00 04 lw ra,(sp+4)
8002e48: 2b 8b 00 10 lw r11,(sp+16)
8002e4c: 2b 8c 00 0c lw r12,(sp+12)
8002e50: 2b 8d 00 08 lw r13,(sp+8)
8002e54: 37 9c 00 18 addi sp,sp,24
8002e58: c3 a0 00 00 ret
08003894 <unlink>:
#include <rtems/seterr.h>
int unlink(
const char *path
)
{
8003894: 37 9c ff c0 addi sp,sp,-64
8003898: 5b 8b 00 14 sw (sp+20),r11
800389c: 5b 8c 00 10 sw (sp+16),r12
80038a0: 5b 8d 00 0c sw (sp+12),r13
80038a4: 5b 8e 00 08 sw (sp+8),r14
80038a8: 5b 9d 00 04 sw (sp+4),ra
80038ac: b8 20 70 00 mv r14,r1
/*
* Get the node to be unlinked. Find the parent path first.
*/
parentpathlen = rtems_filesystem_dirname ( path );
80038b0: fb ff fb 4f calli 80025ec <rtems_filesystem_dirname>
80038b4: b8 20 58 00 mv r11,r1
80038b8: 37 84 00 2c addi r4,sp,44
if ( parentpathlen == 0 )
80038bc: 5c 20 00 07 bne r1,r0,80038d8 <unlink+0x44>
rtems_filesystem_get_start_loc( path, &i, &parentloc );
80038c0: b9 c0 08 00 mv r1,r14
80038c4: 37 82 00 40 addi r2,sp,64
80038c8: b8 80 18 00 mv r3,r4
80038cc: fb ff ff c0 calli 80037cc <rtems_filesystem_get_start_loc>
const char *name;
rtems_filesystem_location_info_t parentloc;
rtems_filesystem_location_info_t loc;
int i;
int result;
bool free_parentloc = false;
80038d0: 34 0d 00 00 mvi r13,0
80038d4: e0 00 00 09 bi 80038f8 <unlink+0x64>
parentpathlen = rtems_filesystem_dirname ( path );
if ( parentpathlen == 0 )
rtems_filesystem_get_start_loc( path, &i, &parentloc );
else {
result = rtems_filesystem_evaluate_path( path, parentpathlen,
80038d8: b9 c0 08 00 mv r1,r14
80038dc: b9 60 10 00 mv r2,r11
80038e0: 34 03 00 02 mvi r3,2
80038e4: 34 05 00 00 mvi r5,0
80038e8: fb ff fb 26 calli 8002580 <rtems_filesystem_evaluate_path>
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
return -1;
80038ec: 34 0c ff ff mvi r12,-1
else {
result = rtems_filesystem_evaluate_path( path, parentpathlen,
RTEMS_LIBIO_PERMS_WRITE,
&parentloc,
false );
if ( result != 0 )
80038f0: 5c 20 00 3d bne r1,r0,80039e4 <unlink+0x150> <== NEVER TAKEN
return -1;
free_parentloc = true;
80038f4: 34 0d 00 01 mvi r13,1
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
80038f8: 2b 81 00 2c lw r1,(sp+44)
name = path + parentpathlen;
80038fc: b5 cb 58 00 add r11,r14,r11
/*
* Start from the parent to find the node that should be under it.
*/
loc = parentloc;
8003900: 5b 81 00 18 sw (sp+24),r1
8003904: 2b 81 00 30 lw r1,(sp+48)
8003908: 5b 81 00 1c sw (sp+28),r1
800390c: 2b 81 00 34 lw r1,(sp+52)
8003910: 5b 81 00 20 sw (sp+32),r1
8003914: 2b 81 00 38 lw r1,(sp+56)
8003918: 5b 81 00 24 sw (sp+36),r1
800391c: 2b 81 00 3c lw r1,(sp+60)
8003920: 5b 81 00 28 sw (sp+40),r1
name = path + parentpathlen;
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
8003924: b9 60 08 00 mv r1,r11
8003928: f8 00 3b 33 calli 80125f4 <strlen>
800392c: b8 20 10 00 mv r2,r1
8003930: b9 60 08 00 mv r1,r11
8003934: fb ff fb 42 calli 800263c <rtems_filesystem_prefix_separators>
8003938: b5 61 60 00 add r12,r11,r1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
800393c: b9 80 08 00 mv r1,r12
8003940: f8 00 3b 2d calli 80125f4 <strlen>
8003944: 37 8b 00 18 addi r11,sp,24
8003948: b8 20 10 00 mv r2,r1
800394c: 34 03 00 00 mvi r3,0
8003950: b9 80 08 00 mv r1,r12
8003954: b9 60 20 00 mv r4,r11
8003958: 34 05 00 00 mvi r5,0
800395c: fb ff fa e7 calli 80024f8 <rtems_filesystem_evaluate_relative_path>
0, &loc, false );
if ( result != 0 ) {
8003960: 44 20 00 05 be r1,r0,8003974 <unlink+0xe0>
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
return -1;
8003964: 34 0c ff ff mvi r12,-1
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
rtems_filesystem_freenode( &parentloc );
8003968: 37 81 00 2c addi r1,sp,44
name += rtems_filesystem_prefix_separators( name, strlen( name ) );
result = rtems_filesystem_evaluate_relative_path( name , strlen( name ),
0, &loc, false );
if ( result != 0 ) {
if ( free_parentloc )
800396c: 45 a0 00 1e be r13,r0,80039e4 <unlink+0x150> <== NEVER TAKEN
8003970: e0 00 00 1c bi 80039e0 <unlink+0x14c>
rtems_filesystem_freenode( &parentloc );
return -1;
}
if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) {
8003974: 2b 81 00 24 lw r1,(sp+36)
8003978: 28 22 00 10 lw r2,(r1+16)
800397c: b9 60 08 00 mv r1,r11
8003980: d8 40 00 00 call r2
8003984: 34 02 00 01 mvi r2,1
8003988: 5c 22 00 0b bne r1,r2,80039b4 <unlink+0x120>
rtems_filesystem_freenode( &loc );
800398c: b9 60 08 00 mv r1,r11
8003990: fb ff fb 44 calli 80026a0 <rtems_filesystem_freenode>
if ( free_parentloc )
8003994: 45 a0 00 03 be r13,r0,80039a0 <unlink+0x10c>
rtems_filesystem_freenode( &parentloc );
8003998: 37 81 00 2c addi r1,sp,44
800399c: fb ff fb 41 calli 80026a0 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EISDIR );
80039a0: f8 00 36 b4 calli 8011470 <__errno>
80039a4: 34 02 00 15 mvi r2,21
80039a8: 58 22 00 00 sw (r1+0),r2
80039ac: 34 0c ff ff mvi r12,-1
80039b0: e0 00 00 0d bi 80039e4 <unlink+0x150>
}
result = (*loc.ops->unlink_h)( &parentloc, &loc );
80039b4: 2b 81 00 24 lw r1,(sp+36)
80039b8: 37 8e 00 2c addi r14,sp,44
80039bc: b9 60 10 00 mv r2,r11
80039c0: 28 23 00 0c lw r3,(r1+12)
80039c4: b9 c0 08 00 mv r1,r14
80039c8: d8 60 00 00 call r3
80039cc: b8 20 60 00 mv r12,r1
rtems_filesystem_freenode( &loc );
80039d0: b9 60 08 00 mv r1,r11
80039d4: fb ff fb 33 calli 80026a0 <rtems_filesystem_freenode>
if ( free_parentloc )
80039d8: 45 a0 00 03 be r13,r0,80039e4 <unlink+0x150>
rtems_filesystem_freenode( &parentloc );
80039dc: b9 c0 08 00 mv r1,r14
80039e0: fb ff fb 30 calli 80026a0 <rtems_filesystem_freenode>
return result;
}
80039e4: b9 80 08 00 mv r1,r12
80039e8: 2b 9d 00 04 lw ra,(sp+4)
80039ec: 2b 8b 00 14 lw r11,(sp+20)
80039f0: 2b 8c 00 10 lw r12,(sp+16)
80039f4: 2b 8d 00 0c lw r13,(sp+12)
80039f8: 2b 8e 00 08 lw r14,(sp+8)
80039fc: 37 9c 00 40 addi sp,sp,64
8003a00: c3 a0 00 00 ret
08003910 <unmount>:
*/
int unmount(
const char *path
)
{
8003910: 37 9c ff dc addi sp,sp,-36
8003914: 5b 8b 00 10 sw (sp+16),r11
8003918: 5b 8c 00 0c sw (sp+12),r12
800391c: 5b 8d 00 08 sw (sp+8),r13
8003920: 5b 9d 00 04 sw (sp+4),ra
8003924: b8 20 58 00 mv r11,r1
* The root node of the mounted filesytem.
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
8003928: 37 8c 00 14 addi r12,sp,20
800392c: f8 00 2c 96 calli 800eb84 <strlen>
8003930: b8 20 10 00 mv r2,r1
8003934: 34 03 00 00 mvi r3,0
8003938: b9 60 08 00 mv r1,r11
800393c: b9 80 20 00 mv r4,r12
8003940: 34 05 00 01 mvi r5,1
8003944: fb ff fa 1d calli 80021b8 <rtems_filesystem_evaluate_path>
8003948: 5c 20 00 41 bne r1,r0,8003a4c <unmount+0x13c>
return -1;
mt_entry = loc.mt_entry;
800394c: 2b 8b 00 24 lw r11,(sp+36)
/*
* Verify this is the root node for the file system to be unmounted.
*/
if ( fs_root_loc->node_access != loc.node_access ){
8003950: 2b 81 00 14 lw r1,(sp+20)
8003954: 29 62 00 1c lw r2,(r11+28)
8003958: 44 41 00 06 be r2,r1,8003970 <unmount+0x60>
rtems_filesystem_freenode( &loc );
800395c: b9 80 08 00 mv r1,r12
8003960: fb ff fa 5e calli 80022d8 <rtems_filesystem_freenode>
rtems_set_errno_and_return_minus_one( EACCES );
8003964: f8 00 26 eb calli 800d510 <__errno>
8003968: 34 02 00 0d mvi r2,13
800396c: e0 00 00 13 bi 80039b8 <unmount+0xa8>
/*
* Free the loc node and just use the nodes from the mt_entry .
*/
rtems_filesystem_freenode( &loc );
8003970: b9 80 08 00 mv r1,r12
8003974: fb ff fa 59 calli 80022d8 <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 )
8003978: 78 01 08 01 mvhi r1,0x801
800397c: 38 21 71 a4 ori r1,r1,0x71a4
8003980: 28 21 00 00 lw r1,(r1+0)
8003984: 28 21 00 14 lw r1,(r1+20)
8003988: 44 2b 00 0a be r1,r11,80039b0 <unmount+0xa0>
/*
* Verify there are no file systems below the path specified
*/
if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point,
800398c: 29 62 00 2c lw r2,(r11+44)
8003990: 78 01 08 00 mvhi r1,0x800
8003994: 38 21 39 04 ori r1,r1,0x3904
8003998: fb ff fc ea calli 8002d40 <rtems_filesystem_mount_iterate>
800399c: 5c 20 00 05 bne r1,r0,80039b0 <unmount+0xa0>
* Run the file descriptor table to determine if there are any file
* descriptors that are currently active and reference nodes in the
* file system that we are trying to unmount
*/
if ( rtems_libio_is_open_files_in_fs( mt_entry ) == 1 )
80039a0: b9 60 08 00 mv r1,r11
80039a4: fb ff fb 67 calli 8002740 <rtems_libio_is_open_files_in_fs>
80039a8: 34 02 00 01 mvi r2,1
80039ac: 5c 22 00 05 bne r1,r2,80039c0 <unmount+0xb0>
rtems_set_errno_and_return_minus_one( EBUSY );
80039b0: f8 00 26 d8 calli 800d510 <__errno>
80039b4: 34 02 00 10 mvi r2,16
80039b8: 58 22 00 00 sw (r1+0),r2
80039bc: e0 00 00 24 bi 8003a4c <unmount+0x13c>
* Allow the file system being unmounted on to do its cleanup.
* If it fails it will set the errno to the approprate value
* and the fileystem will not be modified.
*/
if (( fs_mount_loc->ops->unmount_h )( mt_entry ) != 0 )
80039c0: 29 61 00 14 lw r1,(r11+20)
return -1;
80039c4: 34 0c ff ff mvi r12,-1
* Allow the file system being unmounted on to do its cleanup.
* If it fails it will set the errno to the approprate value
* and the fileystem will not be modified.
*/
if (( fs_mount_loc->ops->unmount_h )( mt_entry ) != 0 )
80039c8: 28 22 00 28 lw r2,(r1+40)
80039cc: b9 60 08 00 mv r1,r11
80039d0: d8 40 00 00 call r2
80039d4: b8 20 68 00 mv r13,r1
80039d8: 5c 20 00 1e bne r1,r0,8003a50 <unmount+0x140> <== NEVER TAKEN
* NOTE: Fatal error is called in a case which should never happen
* This was response was questionable but the best we could
* come up with.
*/
if ((fs_root_loc->ops->fsunmount_me_h )( mt_entry ) != 0){
80039dc: 29 61 00 28 lw r1,(r11+40)
80039e0: 28 22 00 2c lw r2,(r1+44)
80039e4: b9 60 08 00 mv r1,r11
80039e8: d8 40 00 00 call r2
80039ec: 44 2d 00 08 be r1,r13,8003a0c <unmount+0xfc> <== ALWAYS TAKEN
if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 )
80039f0: 29 61 00 14 lw r1,(r11+20) <== NOT EXECUTED
80039f4: 28 22 00 20 lw r2,(r1+32) <== NOT EXECUTED
80039f8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED
80039fc: d8 40 00 00 call r2 <== NOT EXECUTED
8003a00: 44 20 00 14 be r1,r0,8003a50 <unmount+0x140> <== NOT EXECUTED
rtems_fatal_error_occurred( 0 );
8003a04: 34 01 00 00 mvi r1,0 <== NOT EXECUTED
8003a08: f8 00 02 cb calli 8004534 <rtems_fatal_error_occurred> <== NOT EXECUTED
rtems_status_code rtems_libio_set_private_env(void);
rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ;
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
8003a0c: 78 0c 08 01 mvhi r12,0x801
8003a10: 39 8c 78 50 ori r12,r12,0x7850
8003a14: 29 81 00 00 lw r1,(r12+0)
8003a18: 34 02 00 00 mvi r2,0
8003a1c: 34 03 00 00 mvi r3,0
8003a20: f8 00 01 96 calli 8004078 <rtems_semaphore_obtain>
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
8003a24: b9 60 08 00 mv r1,r11
8003a28: f8 00 03 ca calli 8004950 <_Chain_Extract>
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
8003a2c: 29 81 00 00 lw r1,(r12+0)
*/
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
8003a30: 34 0c 00 00 mvi r12,0
8003a34: f8 00 01 e1 calli 80041b8 <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 );
8003a38: 35 61 00 08 addi r1,r11,8
8003a3c: fb ff fa 27 calli 80022d8 <rtems_filesystem_freenode>
free( mt_entry );
8003a40: b9 60 08 00 mv r1,r11
8003a44: fb ff fa 2d calli 80022f8 <free>
return 0;
8003a48: e0 00 00 02 bi 8003a50 <unmount+0x140>
* The node for the directory that the fileystem is mounted on.
* The mount entry that is being refered to.
*/
if ( rtems_filesystem_evaluate_path( path, strlen( path ), 0x0, &loc, true ) )
return -1;
8003a4c: 34 0c ff ff mvi r12,-1
rtems_filesystem_freenode( fs_mount_loc );
free( mt_entry );
return 0;
}
8003a50: b9 80 08 00 mv r1,r12
8003a54: 2b 9d 00 04 lw ra,(sp+4)
8003a58: 2b 8b 00 10 lw r11,(sp+16)
8003a5c: 2b 8c 00 0c lw r12,(sp+12)
8003a60: 2b 8d 00 08 lw r13,(sp+8)
8003a64: 37 9c 00 24 addi sp,sp,36
8003a68: c3 a0 00 00 ret
0801775c <write>:
ssize_t write(
int fd,
const void *buffer,
size_t count
)
{
801775c: 37 9c ff ec addi sp,sp,-20
8017760: 5b 8b 00 10 sw (sp+16),r11
8017764: 5b 8c 00 0c sw (sp+12),r12
8017768: 5b 8d 00 08 sw (sp+8),r13
801776c: 5b 9d 00 04 sw (sp+4),ra
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
8017770: 78 04 08 01 mvhi r4,0x801
8017774: 38 84 90 10 ori r4,r4,0x9010
ssize_t write(
int fd,
const void *buffer,
size_t count
)
{
8017778: b8 40 68 00 mv r13,r2
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
801777c: 28 82 00 00 lw r2,(r4+0)
8017780: 54 41 00 02 bgu r2,r1,8017788 <write+0x2c>
8017784: e0 00 00 0c bi 80177b4 <write+0x58>
iop = rtems_libio_iop( fd );
8017788: 78 0b 08 01 mvhi r11,0x801
801778c: 34 02 00 06 mvi r2,6
8017790: 39 6b 97 e8 ori r11,r11,0x97e8
8017794: 5b 83 00 14 sw (sp+20),r3
8017798: fb ff fd a3 calli 8016e24 <__ashlsi3>
801779c: 29 6b 00 00 lw r11,(r11+0)
rtems_libio_check_is_open( iop );
80177a0: 2b 83 00 14 lw r3,(sp+20)
{
ssize_t rc;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
80177a4: b5 61 58 00 add r11,r11,r1
rtems_libio_check_is_open( iop );
80177a8: 29 61 00 18 lw r1,(r11+24)
80177ac: 20 22 01 00 andi r2,r1,0x100
80177b0: 5c 40 00 04 bne r2,r0,80177c0 <write+0x64>
80177b4: fb ff e7 2f calli 8011470 <__errno>
80177b8: 34 02 00 09 mvi r2,9
80177bc: e0 00 00 08 bi 80177dc <write+0x80>
rtems_libio_check_buffer( buffer );
80177c0: 45 a0 00 05 be r13,r0,80177d4 <write+0x78> <== NEVER TAKEN
rtems_libio_check_count( count );
80177c4: 34 0c 00 00 mvi r12,0
80177c8: 44 60 00 19 be r3,r0,801782c <write+0xd0>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
80177cc: 20 21 00 04 andi r1,r1,0x4
80177d0: 5c 20 00 06 bne r1,r0,80177e8 <write+0x8c>
80177d4: fb ff e7 27 calli 8011470 <__errno>
80177d8: 34 02 00 16 mvi r2,22
80177dc: 58 22 00 00 sw (r1+0),r2
80177e0: 34 0c ff ff mvi r12,-1
80177e4: e0 00 00 12 bi 801782c <write+0xd0>
/*
* Now process the write() request.
*/
rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count );
80177e8: 29 61 00 24 lw r1,(r11+36)
80177ec: b9 a0 10 00 mv r2,r13
80177f0: 28 24 00 0c lw r4,(r1+12)
80177f4: b9 60 08 00 mv r1,r11
80177f8: d8 80 00 00 call r4
80177fc: b8 20 60 00 mv r12,r1
if ( rc > 0 )
8017800: 4c 01 00 0b bge r0,r1,801782c <write+0xd0>
iop->offset += rc;
8017804: 34 02 00 1f mvi r2,31
8017808: fb ff fd ae calli 8016ec0 <__ashrsi3>
801780c: 29 62 00 14 lw r2,(r11+20)
8017810: 29 64 00 10 lw r4,(r11+16)
8017814: b5 82 10 00 add r2,r12,r2
8017818: f5 82 18 00 cmpgu r3,r12,r2
801781c: b4 24 08 00 add r1,r1,r4
8017820: b4 61 08 00 add r1,r3,r1
8017824: 59 61 00 10 sw (r11+16),r1
8017828: 59 62 00 14 sw (r11+20),r2
return rc;
}
801782c: b9 80 08 00 mv r1,r12
8017830: 2b 9d 00 04 lw ra,(sp+4)
8017834: 2b 8b 00 10 lw r11,(sp+16)
8017838: 2b 8c 00 0c lw r12,(sp+12)
801783c: 2b 8d 00 08 lw r13,(sp+8)
8017840: 37 9c 00 14 addi sp,sp,20
8017844: c3 a0 00 00 ret
08003cec <writev>:
ssize_t writev(
int fd,
const struct iovec *iov,
int iovcnt
)
{
8003cec: 37 9c ff e4 addi sp,sp,-28
8003cf0: 5b 8b 00 1c sw (sp+28),r11
8003cf4: 5b 8c 00 18 sw (sp+24),r12
8003cf8: 5b 8d 00 14 sw (sp+20),r13
8003cfc: 5b 8e 00 10 sw (sp+16),r14
8003d00: 5b 8f 00 0c sw (sp+12),r15
8003d04: 5b 90 00 08 sw (sp+8),r16
8003d08: 5b 9d 00 04 sw (sp+4),ra
8003d0c: b8 60 78 00 mv r15,r3
int bytes;
rtems_libio_t *iop;
ssize_t old;
bool all_zeros;
rtems_libio_check_fd( fd );
8003d10: 78 03 08 01 mvhi r3,0x801
8003d14: 38 63 60 10 ori r3,r3,0x6010
ssize_t writev(
int fd,
const struct iovec *iov,
int iovcnt
)
{
8003d18: b8 40 68 00 mv r13,r2
int bytes;
rtems_libio_t *iop;
ssize_t old;
bool all_zeros;
rtems_libio_check_fd( fd );
8003d1c: 28 62 00 00 lw r2,(r3+0)
8003d20: 54 41 00 02 bgu r2,r1,8003d28 <writev+0x3c>
8003d24: e0 00 00 0a bi 8003d4c <writev+0x60>
iop = rtems_libio_iop( fd );
8003d28: 78 0b 08 01 mvhi r11,0x801
8003d2c: 34 02 00 06 mvi r2,6
8003d30: 39 6b 67 2c ori r11,r11,0x672c
8003d34: f8 00 3c 31 calli 8012df8 <__ashlsi3>
8003d38: 29 6c 00 00 lw r12,(r11+0)
8003d3c: b5 81 60 00 add r12,r12,r1
rtems_libio_check_is_open( iop );
8003d40: 29 81 00 18 lw r1,(r12+24)
8003d44: 20 22 01 00 andi r2,r1,0x100
8003d48: 5c 40 00 04 bne r2,r0,8003d58 <writev+0x6c>
8003d4c: f8 00 26 79 calli 800d730 <__errno>
8003d50: 34 02 00 09 mvi r2,9
8003d54: e0 00 00 1c bi 8003dc4 <writev+0xd8>
rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE );
8003d58: 20 21 00 04 andi r1,r1,0x4
8003d5c: 44 20 00 18 be r1,r0,8003dbc <writev+0xd0> <== NEVER TAKEN
/*
* Argument validation on IO vector
*/
if ( !iov )
8003d60: 45 a0 00 17 be r13,r0,8003dbc <writev+0xd0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt <= 0 )
8003d64: 49 e0 00 02 bg r15,r0,8003d6c <writev+0x80>
8003d68: e0 00 00 15 bi 8003dbc <writev+0xd0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iovcnt > IOV_MAX )
8003d6c: 34 01 04 00 mvi r1,1024
8003d70: 4c 2f 00 02 bge r1,r15,8003d78 <writev+0x8c> <== ALWAYS TAKEN
8003d74: e0 00 00 12 bi 8003dbc <writev+0xd0> <== NOT EXECUTED
8003d78: b9 a0 08 00 mv r1,r13
8003d7c: 34 02 00 01 mvi r2,1
8003d80: 34 04 00 00 mvi r4,0
8003d84: 34 03 00 00 mvi r3,0
8003d88: e0 00 00 02 bi 8003d90 <writev+0xa4>
if ( iov[v].iov_len )
all_zeros = false;
/* check for wrap */
old = total;
total += iov[v].iov_len;
8003d8c: b8 a0 18 00 mv r3,r5
/*
* iov[v].iov_len cannot be less than 0 because size_t is unsigned.
* So we only check for zero.
*/
if ( iov[v].iov_base == 0 )
8003d90: 28 25 00 00 lw r5,(r1+0)
8003d94: 44 a0 00 0a be r5,r0,8003dbc <writev+0xd0>
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
8003d98: 28 25 00 04 lw r5,(r1+4)
all_zeros = false;
8003d9c: 64 a6 00 00 cmpei r6,r5,0
/* check for wrap */
old = total;
total += iov[v].iov_len;
8003da0: b4 65 28 00 add r5,r3,r5
*/
if ( iov[v].iov_base == 0 )
rtems_set_errno_and_return_minus_one( EINVAL );
if ( iov[v].iov_len )
all_zeros = false;
8003da4: c8 06 30 00 sub r6,r0,r6
8003da8: a0 46 10 00 and r2,r2,r6
/* check for wrap */
old = total;
total += iov[v].iov_len;
if ( total < old || total > SSIZE_MAX )
8003dac: e8 65 18 00 cmpg r3,r3,r5
8003db0: 68 a6 7f ff cmpgi r6,r5,32767
8003db4: b8 c3 18 00 or r3,r6,r3
8003db8: 44 60 00 05 be r3,r0,8003dcc <writev+0xe0>
rtems_set_errno_and_return_minus_one( EINVAL );
8003dbc: f8 00 26 5d calli 800d730 <__errno>
8003dc0: 34 02 00 16 mvi r2,22
8003dc4: 58 22 00 00 sw (r1+0),r2
8003dc8: e0 00 00 22 bi 8003e50 <writev+0x164>
* 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++ ) {
8003dcc: 34 84 00 01 addi r4,r4,1
8003dd0: 34 21 00 08 addi r1,r1,8
8003dd4: 49 e4 ff ee bg r15,r4,8003d8c <writev+0xa0>
/*
* A writev with all zeros is supposed to have no effect per OpenGroup.
*/
if ( all_zeros == true ) {
return 0;
8003dd8: 34 0b 00 00 mvi r11,0
}
/*
* A writev with all zeros is supposed to have no effect per OpenGroup.
*/
if ( all_zeros == true ) {
8003ddc: 5c 40 00 1e bne r2,r0,8003e54 <writev+0x168>
8003de0: 34 10 00 00 mvi r16,0
/*
* Now process the writev().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
/* all zero lengths has no effect */
if ( iov[v].iov_len == 0 )
8003de4: 29 a3 00 04 lw r3,(r13+4)
8003de8: 44 60 00 16 be r3,r0,8003e40 <writev+0x154> <== NEVER TAKEN
continue;
bytes = (*iop->pathinfo.handlers->write_h)(
8003dec: 29 81 00 24 lw r1,(r12+36)
8003df0: 29 a2 00 00 lw r2,(r13+0)
8003df4: 28 24 00 0c lw r4,(r1+12)
8003df8: b9 80 08 00 mv r1,r12
8003dfc: d8 80 00 00 call r4
8003e00: b8 20 70 00 mv r14,r1
iop,
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
8003e04: 48 01 00 13 bg r0,r1,8003e50 <writev+0x164> <== NEVER TAKEN
return -1;
if ( bytes > 0 ) {
8003e08: 44 20 00 0c be r1,r0,8003e38 <writev+0x14c> <== NEVER TAKEN
iop->offset += bytes;
8003e0c: 34 02 00 1f mvi r2,31
8003e10: f8 00 3c 21 calli 8012e94 <__ashrsi3>
8003e14: 29 82 00 14 lw r2,(r12+20)
8003e18: 29 84 00 10 lw r4,(r12+16)
total += bytes;
8003e1c: b5 6e 58 00 add r11,r11,r14
if ( bytes < 0 )
return -1;
if ( bytes > 0 ) {
iop->offset += bytes;
8003e20: b5 c2 10 00 add r2,r14,r2
8003e24: f5 c2 18 00 cmpgu r3,r14,r2
8003e28: b4 24 08 00 add r1,r1,r4
8003e2c: b4 61 08 00 add r1,r3,r1
8003e30: 59 81 00 10 sw (r12+16),r1
8003e34: 59 82 00 14 sw (r12+20),r2
total += bytes;
}
if (bytes != iov[ v ].iov_len)
8003e38: 29 a1 00 04 lw r1,(r13+4)
8003e3c: 5d c1 00 06 bne r14,r1,8003e54 <writev+0x168> <== NEVER TAKEN
}
/*
* Now process the writev().
*/
for ( total=0, v=0 ; v < iovcnt ; v++ ) {
8003e40: 36 10 00 01 addi r16,r16,1
8003e44: 35 ad 00 08 addi r13,r13,8
8003e48: 49 f0 ff e7 bg r15,r16,8003de4 <writev+0xf8>
8003e4c: e0 00 00 02 bi 8003e54 <writev+0x168>
iov[v].iov_base,
iov[v].iov_len
);
if ( bytes < 0 )
return -1;
8003e50: 34 0b ff ff mvi r11,-1
if (bytes != iov[ v ].iov_len)
break;
}
return total;
}
8003e54: b9 60 08 00 mv r1,r11
8003e58: 2b 9d 00 04 lw ra,(sp+4)
8003e5c: 2b 8b 00 1c lw r11,(sp+28)
8003e60: 2b 8c 00 18 lw r12,(sp+24)
8003e64: 2b 8d 00 14 lw r13,(sp+20)
8003e68: 2b 8e 00 10 lw r14,(sp+16)
8003e6c: 2b 8f 00 0c lw r15,(sp+12)
8003e70: 2b 90 00 08 lw r16,(sp+8)
8003e74: 37 9c 00 1c addi sp,sp,28
8003e78: c3 a0 00 00 ret