RTEMS 4.11Annotated Report
Thu Dec 20 20:05:16 2012
00004318 <IMFS_dump_directory>:
*/
static void IMFS_dump_directory(
IMFS_jnode_t *the_directory,
int level
)
{
4318: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
431c: e59f513c ldr r5, [pc, #316] ; 4460 <IMFS_dump_directory+0x148>
4320: e1a06000 mov r6, r0
4324: e1a07001 mov r7, r1
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
4328: e5904050 ldr r4, [r0, #80] ; 0x50
432c: e1a08005 mov r8, r5
IMFS_assert( level >= 0 );
IMFS_assert( IMFS_is_directory( the_directory ) );
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
4330: ea000046 b 4450 <IMFS_dump_directory+0x138>
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
fprintf(stdout, "...." );
4334: e5953000 ldr r3, [r5]
4338: e59f0124 ldr r0, [pc, #292] ; 4464 <IMFS_dump_directory+0x14c>
433c: e5931008 ldr r1, [r3, #8]
4340: eb003515 bl 1179c <fputs>
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
4344: e28aa001 add sl, sl, #1
4348: ea000000 b 4350 <IMFS_dump_directory+0x38>
IMFS_assert( level >= 0 );
IMFS_assert( IMFS_is_directory( the_directory ) );
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
434c: e3a0a000 mov sl, #0
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
4350: e15a0007 cmp sl, r7
4354: dafffff6 ble 4334 <IMFS_dump_directory+0x1c>
IMFS_jnode_t *the_jnode
)
{
IMFS_assert( the_jnode );
fprintf(stdout, "%s", the_jnode->name );
4358: e5983000 ldr r3, [r8]
435c: e284000c add r0, r4, #12
4360: e5931008 ldr r1, [r3, #8]
4364: eb00350c bl 1179c <fputs>
rtems_chain_extract_unprotected( &node->Node );
}
static inline IMFS_jnode_types_t IMFS_type( const IMFS_jnode_t *node )
{
return node->control->imfs_type;
4368: e594304c ldr r3, [r4, #76] ; 0x4c
436c: e5932000 ldr r2, [r3]
switch( IMFS_type( the_jnode ) ) {
4370: e3520006 cmp r2, #6
4374: 979ff102 ldrls pc, [pc, r2, lsl #2]
4378: ea000026 b 4418 <IMFS_dump_directory+0x100> <== NOT EXECUTED
437c: 00004398 .word 0x00004398 <== NOT EXECUTED
4380: 000043ac .word 0x000043ac <== NOT EXECUTED
4384: 000043f8 .word 0x000043f8 <== NOT EXECUTED
4388: 000043f8 .word 0x000043f8 <== NOT EXECUTED
438c: 000043e0 .word 0x000043e0 <== NOT EXECUTED
4390: 000043c4 .word 0x000043c4 <== NOT EXECUTED
4394: 00004404 .word 0x00004404 <== NOT EXECUTED
case IMFS_DIRECTORY:
fprintf(stdout, "/" );
4398: e5953000 ldr r3, [r5]
439c: e3a0002f mov r0, #47 ; 0x2f
43a0: e5931008 ldr r1, [r3, #8]
43a4: eb0034c7 bl 116c8 <fputc>
43a8: ea00001f b 442c <IMFS_dump_directory+0x114>
break;
case IMFS_DEVICE:
fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")",
43ac: e5953000 ldr r3, [r5]
43b0: e2842050 add r2, r4, #80 ; 0x50
43b4: e5930008 ldr r0, [r3, #8]
43b8: e59f10a8 ldr r1, [pc, #168] ; 4468 <IMFS_dump_directory+0x150>
43bc: e892000c ldm r2, {r2, r3}
43c0: ea000004 b 43d8 <IMFS_dump_directory+0xc0>
the_jnode->info.device.major, the_jnode->info.device.minor );
break;
case IMFS_LINEAR_FILE:
fprintf(stdout, " (file %" PRId32 " %p)",
43c4: e5953000 ldr r3, [r5]
43c8: e59f109c ldr r1, [pc, #156] ; 446c <IMFS_dump_directory+0x154>
43cc: e5930008 ldr r0, [r3, #8]
43d0: e5942050 ldr r2, [r4, #80] ; 0x50
43d4: e5943058 ldr r3, [r4, #88] ; 0x58
43d8: eb00349a bl 11648 <fprintf>
43dc: ea000012 b 442c <IMFS_dump_directory+0x114>
the_jnode->info.file.indirect,
the_jnode->info.file.doubly_indirect,
the_jnode->info.file.triply_indirect
);
#else
fprintf(stdout, " (file %" PRId32 ")",
43e0: e5953000 ldr r3, [r5]
43e4: e59f1084 ldr r1, [pc, #132] ; 4470 <IMFS_dump_directory+0x158>
43e8: e5930008 ldr r0, [r3, #8]
43ec: e5942050 ldr r2, [r4, #80] ; 0x50
43f0: eb003494 bl 11648 <fprintf>
43f4: ea00000c b 442c <IMFS_dump_directory+0x114>
case IMFS_HARD_LINK:
fprintf(stdout, " links not printed\n" );
return;
case IMFS_SYM_LINK:
fprintf(stdout, " links not printed\n" );
43f8: e5953000 ldr r3, [r5]
43fc: e59f0070 ldr r0, [pc, #112] ; 4474 <IMFS_dump_directory+0x15c>
4400: ea000001 b 440c <IMFS_dump_directory+0xf4>
return;
case IMFS_FIFO:
fprintf(stdout, " FIFO not printed\n" );
4404: e5953000 ldr r3, [r5]
4408: e59f0068 ldr r0, [pc, #104] ; 4478 <IMFS_dump_directory+0x160>
440c: e5931008 ldr r1, [r3, #8]
4410: eb0034e1 bl 1179c <fputs>
4414: ea000006 b 4434 <IMFS_dump_directory+0x11c>
return;
default:
fprintf(stdout, " bad type %d\n", IMFS_type( the_jnode ) );
4418: e5953000 ldr r3, [r5] <== NOT EXECUTED
441c: e59f1058 ldr r1, [pc, #88] ; 447c <IMFS_dump_directory+0x164><== NOT EXECUTED
4420: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
4424: eb003487 bl 11648 <fprintf> <== NOT EXECUTED
4428: ea000001 b 4434 <IMFS_dump_directory+0x11c> <== NOT EXECUTED
return;
}
puts("");
442c: e59f004c ldr r0, [pc, #76] ; 4480 <IMFS_dump_directory+0x168>
4430: eb003b9e bl 132b0 <puts>
}
static inline bool IMFS_is_directory( const IMFS_jnode_t *node )
{
return node->control->imfs_type == IMFS_DIRECTORY;
4434: e594304c ldr r3, [r4, #76] ; 0x4c
the_jnode = (IMFS_jnode_t *) the_node;
for ( i=0 ; i<=level ; i++ )
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
if ( IMFS_is_directory( the_jnode ) )
4438: e5933000 ldr r3, [r3]
443c: e3530000 cmp r3, #0
IMFS_dump_directory( the_jnode, level + 1 );
4440: 01a00004 moveq r0, r4
4444: 02871001 addeq r1, r7, #1
4448: 0bffffb2 bleq 4318 <IMFS_dump_directory>
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
!rtems_chain_is_tail( the_chain, the_node );
the_node = the_node->next ) {
444c: e5944000 ldr r4, [r4]
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
const Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Immutable_tail( the_chain ));
4450: e2863054 add r3, r6, #84 ; 0x54
IMFS_assert( level >= 0 );
IMFS_assert( IMFS_is_directory( the_directory ) );
the_chain = &the_directory->info.directory.Entries;
for ( the_node = rtems_chain_first( the_chain );
4454: e1540003 cmp r4, r3
4458: 1affffbb bne 434c <IMFS_dump_directory+0x34>
fprintf(stdout, "...." );
IMFS_print_jnode( the_jnode );
if ( IMFS_is_directory( the_jnode ) )
IMFS_dump_directory( the_jnode, level + 1 );
}
}
445c: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
0000352c <IMFS_make_generic_node>:
const char *path,
mode_t mode,
const IMFS_node_control *node_control,
void *context
)
{
352c: e92d40f0 push {r4, r5, r6, r7, lr}
3530: e1a07003 mov r7, r3
int rv = 0;
mode &= ~rtems_filesystem_umask;
3534: e59f3100 ldr r3, [pc, #256] ; 363c <IMFS_make_generic_node+0x110>
3538: e5933000 ldr r3, [r3]
353c: e5936008 ldr r6, [r3, #8]
3540: e1c16006 bic r6, r1, r6
switch (mode & S_IFMT) {
3544: e2063a0f and r3, r6, #61440 ; 0xf000
3548: e3530a02 cmp r3, #8192 ; 0x2000
const char *path,
mode_t mode,
const IMFS_node_control *node_control,
void *context
)
{
354c: e24dd05c sub sp, sp, #92 ; 0x5c
3550: e1a0c000 mov ip, r0
3554: e1a05002 mov r5, r2
int rv = 0;
mode &= ~rtems_filesystem_umask;
switch (mode & S_IFMT) {
3558: 0a000006 beq 3578 <IMFS_make_generic_node+0x4c>
355c: 8a000001 bhi 3568 <IMFS_make_generic_node+0x3c>
3560: e3530a01 cmp r3, #4096 ; 0x1000 <== NOT EXECUTED
3564: ea000002 b 3574 <IMFS_make_generic_node+0x48> <== NOT EXECUTED
3568: e3530a06 cmp r3, #24576 ; 0x6000
356c: 0a000001 beq 3578 <IMFS_make_generic_node+0x4c>
3570: e3530902 cmp r3, #32768 ; 0x8000
3574: 1a000029 bne 3620 <IMFS_make_generic_node+0xf4>
rv = -1;
break;
}
if ( rv == 0 ) {
if ( node_control->imfs_type == IMFS_GENERIC ) {
3578: e5953000 ldr r3, [r5]
357c: e3530007 cmp r3, #7
3580: 1a000026 bne 3620 <IMFS_make_generic_node+0xf4>
rtems_filesystem_eval_path_context_t ctx;
int eval_flags = RTEMS_FS_FOLLOW_LINK
| RTEMS_FS_MAKE
| RTEMS_FS_EXCLUSIVE;
const rtems_filesystem_location_info_t *currentloc =
3584: e1a0100c mov r1, ip
3588: e3a02078 mov r2, #120 ; 0x78
358c: e28d0008 add r0, sp, #8
3590: eb0007b3 bl 5464 <rtems_filesystem_eval_path_start>
3594: e1a04000 mov r4, r0
rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
if ( IMFS_is_imfs_instance( currentloc ) ) {
3598: ebffffd1 bl 34e4 <IMFS_is_imfs_instance>
359c: e3500000 cmp r0, #0
35a0: 0a000017 beq 3604 <IMFS_make_generic_node+0xd8>
IMFS_types_union info;
IMFS_jnode_t *new_node;
info.generic.context = context;
35a4: e28d305c add r3, sp, #92 ; 0x5c
35a8: e523701c str r7, [r3, #-28]!
new_node = IMFS_create_node_with_control(
35ac: e58d6000 str r6, [sp]
35b0: e58d3004 str r3, [sp, #4]
35b4: e28d2010 add r2, sp, #16
35b8: e1a00004 mov r0, r4
35bc: e1a01005 mov r1, r5
35c0: e892000c ldm r2, {r2, r3}
35c4: eb002a63 bl df58 <IMFS_create_node_with_control>
rtems_filesystem_eval_path_get_tokenlen( &ctx ),
mode,
&info
);
if ( new_node != NULL ) {
35c8: e3500000 cmp r0, #0
35cc: 0a00000f beq 3610 <IMFS_make_generic_node+0xe4>
IMFS_jnode_t *parent = currentloc->node_access;
IMFS_update_ctime( parent );
35d0: e3a01000 mov r1, #0
35d4: e28d0054 add r0, sp, #84 ; 0x54
mode,
&info
);
if ( new_node != NULL ) {
IMFS_jnode_t *parent = currentloc->node_access;
35d8: e5944008 ldr r4, [r4, #8]
IMFS_update_ctime( parent );
35dc: eb00024d bl 3f18 <gettimeofday>
35e0: e59d3054 ldr r3, [sp, #84] ; 0x54
IMFS_update_mtime( parent );
35e4: e28d0054 add r0, sp, #84 ; 0x54
);
if ( new_node != NULL ) {
IMFS_jnode_t *parent = currentloc->node_access;
IMFS_update_ctime( parent );
35e8: e5843048 str r3, [r4, #72] ; 0x48
IMFS_update_mtime( parent );
35ec: e3a01000 mov r1, #0
35f0: eb000248 bl 3f18 <gettimeofday>
35f4: e59d3054 ldr r3, [sp, #84] ; 0x54
35f8: e5843044 str r3, [r4, #68] ; 0x44
35fc: e3a04000 mov r4, #0
3600: ea000003 b 3614 <IMFS_make_generic_node+0xe8>
} else {
rv = -1;
}
} else {
rtems_filesystem_eval_path_error( &ctx, ENOTSUP );
3604: e28d0008 add r0, sp, #8
3608: e3a01086 mov r1, #134 ; 0x86
360c: eb0006df bl 5190 <rtems_filesystem_eval_path_error>
IMFS_jnode_t *parent = currentloc->node_access;
IMFS_update_ctime( parent );
IMFS_update_mtime( parent );
} else {
rv = -1;
3610: e3e04000 mvn r4, #0
} else {
rtems_filesystem_eval_path_error( &ctx, ENOTSUP );
rv = -1;
}
rtems_filesystem_eval_path_cleanup( &ctx );
3614: e28d0008 add r0, sp, #8
3618: eb000799 bl 5484 <rtems_filesystem_eval_path_cleanup>
361c: ea000003 b 3630 <IMFS_make_generic_node+0x104>
} else {
errno = EINVAL;
3620: eb003987 bl 11c44 <__errno>
3624: e3a03016 mov r3, #22
3628: e5803000 str r3, [r0]
rv = -1;
362c: e3e04000 mvn r4, #0
}
}
return rv;
}
3630: e1a00004 mov r0, r4
3634: e28dd05c add sp, sp, #92 ; 0x5c
3638: e8bd80f0 pop {r4, r5, r6, r7, pc}
0000c038 <IMFS_memfile_get_block_pointer>:
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
c038: e59f31e4 ldr r3, [pc, #484] ; c224 <IMFS_memfile_get_block_pointer+0x1ec>
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
c03c: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
c040: e5935000 ldr r5, [r3]
c044: e1a05125 lsr r5, r5, #2
c048: e2453001 sub r3, r5, #1
c04c: e1510003 cmp r1, r3
#endif
IMFS_jnode_t *the_jnode,
unsigned int block,
int malloc_it
)
{
c050: e1a04000 mov r4, r0
c054: e1a06001 mov r6, r1
c058: e1a08002 mov r8, r2
my_block = block;
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
c05c: 8a00000e bhi c09c <IMFS_memfile_get_block_pointer+0x64>
p = info->indirect;
if ( malloc_it ) {
c060: e3520000 cmp r2, #0
/*
* Is the block number in the simple indirect portion?
*/
if ( my_block <= LAST_INDIRECT ) {
p = info->indirect;
c064: e5900058 ldr r0, [r0, #88] ; 0x58
if ( malloc_it ) {
c068: 0a000007 beq c08c <IMFS_memfile_get_block_pointer+0x54>
if ( !p ) {
c06c: e3500000 cmp r0, #0
c070: 1a000003 bne c084 <IMFS_memfile_get_block_pointer+0x4c>
p = memfile_alloc_block();
c074: ebffffe2 bl c004 <memfile_alloc_block>
if ( !p )
c078: e3500000 cmp r0, #0
c07c: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
info->indirect = p;
c080: e5840058 str r0, [r4, #88] ; 0x58
}
return &info->indirect[ my_block ];
c084: e5940058 ldr r0, [r4, #88] ; 0x58
c088: ea000001 b c094 <IMFS_memfile_get_block_pointer+0x5c>
}
if ( !p )
c08c: e3500000 cmp r0, #0
c090: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
return &info->indirect[ my_block ];
c094: e0800106 add r0, r0, r6, lsl #2
c098: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
/*
* Is the block number in the doubly indirect portion?
*/
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
c09c: e2853001 add r3, r5, #1
c0a0: e0030395 mul r3, r5, r3
c0a4: e2432001 sub r2, r3, #1
c0a8: e1510002 cmp r1, r2
c0ac: 8a000021 bhi c138 <IMFS_memfile_get_block_pointer+0x100>
my_block -= FIRST_DOUBLY_INDIRECT;
c0b0: e0656001 rsb r6, r5, r1
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
c0b4: e1a00006 mov r0, r6
c0b8: e1a01005 mov r1, r5
c0bc: eb0029d3 bl 16810 <__umodsi3>
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
c0c0: e1a01005 mov r1, r5
*/
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
my_block -= FIRST_DOUBLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
c0c4: e1a07000 mov r7, r0
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
c0c8: e1a00006 mov r0, r6
c0cc: eb002989 bl 166f8 <__aeabi_uidiv>
p = info->doubly_indirect;
if ( malloc_it ) {
c0d0: e3580000 cmp r8, #0
if ( my_block <= LAST_DOUBLY_INDIRECT ) {
my_block -= FIRST_DOUBLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
c0d4: e1a05000 mov r5, r0
p = info->doubly_indirect;
c0d8: e594005c ldr r0, [r4, #92] ; 0x5c
if ( malloc_it ) {
c0dc: 0a00000e beq c11c <IMFS_memfile_get_block_pointer+0xe4>
if ( !p ) {
c0e0: e3500000 cmp r0, #0
c0e4: 1a000003 bne c0f8 <IMFS_memfile_get_block_pointer+0xc0>
p = memfile_alloc_block();
c0e8: ebffffc5 bl c004 <memfile_alloc_block>
if ( !p )
c0ec: e3500000 cmp r0, #0
c0f0: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
info->doubly_indirect = p;
c0f4: e584005c str r0, [r4, #92] ; 0x5c
}
p1 = (block_p *)p[ doubly ];
c0f8: e0804105 add r4, r0, r5, lsl #2
c0fc: e7900105 ldr r0, [r0, r5, lsl #2]
if ( !p1 ) {
c100: e3500000 cmp r0, #0
c104: 1a000009 bne c130 <IMFS_memfile_get_block_pointer+0xf8>
p1 = memfile_alloc_block();
c108: ebffffbd bl c004 <memfile_alloc_block>
if ( !p1 )
c10c: e3500000 cmp r0, #0
return 0;
p[ doubly ] = (block_p) p1;
c110: 15840000 strne r0, [r4]
}
p1 = (block_p *)p[ doubly ];
if ( !p1 ) {
p1 = memfile_alloc_block();
if ( !p1 )
c114: 1a000005 bne c130 <IMFS_memfile_get_block_pointer+0xf8>
c118: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
}
return (block_p *)&p1[ singly ];
}
if ( !p )
c11c: e3500000 cmp r0, #0
c120: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
p = (block_p *)p[ doubly ];
c124: e7900105 ldr r0, [r0, r5, lsl #2]
if ( !p )
c128: e3500000 cmp r0, #0
c12c: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
return (block_p *)&p[ singly ];
c130: e0800107 add r0, r0, r7, lsl #2
c134: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
}
/*
* Is the block number in the triply indirect portion?
*/
if ( my_block <= LAST_TRIPLY_INDIRECT ) {
c138: e2832001 add r2, r3, #1
c13c: e0020295 mul r2, r5, r2
c140: e2422001 sub r2, r2, #1
c144: e1510002 cmp r1, r2
c148: 8a000033 bhi c21c <IMFS_memfile_get_block_pointer+0x1e4>
my_block -= FIRST_TRIPLY_INDIRECT;
c14c: e0636001 rsb r6, r3, r1
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
c150: e1a00006 mov r0, r6
c154: e1a01005 mov r1, r5
c158: eb0029ac bl 16810 <__umodsi3>
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
c15c: e1a01005 mov r1, r5
* 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;
c160: e1a0a000 mov sl, r0
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
c164: e1a00006 mov r0, r6
c168: eb002962 bl 166f8 <__aeabi_uidiv>
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
c16c: e1a01005 mov r1, r5
*/
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;
c170: e1a06000 mov r6, r0
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
c174: eb00295f bl 166f8 <__aeabi_uidiv>
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
c178: e1a01005 mov r1, r5
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;
c17c: e1a07000 mov r7, r0
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
c180: e1a00006 mov r0, r6
c184: eb0029a1 bl 16810 <__umodsi3>
p = info->triply_indirect;
if ( malloc_it ) {
c188: e3580000 cmp r8, #0
my_block -= FIRST_TRIPLY_INDIRECT;
singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS;
doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS;
triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS;
doubly %= IMFS_MEMFILE_BLOCK_SLOTS;
c18c: e1a05000 mov r5, r0
p = info->triply_indirect;
c190: e5940060 ldr r0, [r4, #96] ; 0x60
if ( malloc_it ) {
c194: 0a000016 beq c1f4 <IMFS_memfile_get_block_pointer+0x1bc>
if ( !p ) {
c198: e3500000 cmp r0, #0
c19c: 1a000003 bne c1b0 <IMFS_memfile_get_block_pointer+0x178>
p = memfile_alloc_block();
c1a0: ebffff97 bl c004 <memfile_alloc_block>
if ( !p )
c1a4: e3500000 cmp r0, #0
c1a8: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
info->triply_indirect = p;
c1ac: e5840060 str r0, [r4, #96] ; 0x60
}
p1 = (block_p *) p[ triply ];
c1b0: e0804107 add r4, r0, r7, lsl #2
c1b4: e7900107 ldr r0, [r0, r7, lsl #2]
if ( !p1 ) {
c1b8: e3500000 cmp r0, #0
c1bc: 1a000003 bne c1d0 <IMFS_memfile_get_block_pointer+0x198>
p1 = memfile_alloc_block();
c1c0: ebffff8f bl c004 <memfile_alloc_block>
if ( !p1 )
c1c4: e3500000 cmp r0, #0
c1c8: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
p[ triply ] = (block_p) p1;
c1cc: e5840000 str r0, [r4]
}
p2 = (block_p *)p1[ doubly ];
c1d0: e0804105 add r4, r0, r5, lsl #2
c1d4: e7900105 ldr r0, [r0, r5, lsl #2]
if ( !p2 ) {
c1d8: e3500000 cmp r0, #0
c1dc: 1a00000c bne c214 <IMFS_memfile_get_block_pointer+0x1dc>
p2 = memfile_alloc_block();
c1e0: ebffff87 bl c004 <memfile_alloc_block>
if ( !p2 )
c1e4: e3500000 cmp r0, #0
return 0;
p1[ doubly ] = (block_p) p2;
c1e8: 15840000 strne r0, [r4]
}
p2 = (block_p *)p1[ doubly ];
if ( !p2 ) {
p2 = memfile_alloc_block();
if ( !p2 )
c1ec: 1a000008 bne c214 <IMFS_memfile_get_block_pointer+0x1dc>
c1f0: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
p1[ doubly ] = (block_p) p2;
}
return (block_p *)&p2[ singly ];
}
if ( !p )
c1f4: e3500000 cmp r0, #0
c1f8: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
p1 = (block_p *) p[ triply ];
c1fc: e7900107 ldr r0, [r0, r7, lsl #2]
if ( !p1 )
c200: e3500000 cmp r0, #0
c204: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
p2 = (block_p *)p1[ doubly ];
c208: e7900105 ldr r0, [r0, r5, lsl #2]
if ( !p2 )
c20c: e3500000 cmp r0, #0
c210: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return 0;
return (block_p *)&p2[ singly ];
c214: e080010a add r0, r0, sl, lsl #2
c218: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
}
/*
* This means the requested block number is out of range.
*/
return 0;
c21c: e3a00000 mov r0, #0 <== NOT EXECUTED
}
c220: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
00001d30 <IMFS_mount>:
#include "imfs.h"
int IMFS_mount( rtems_filesystem_mount_table_entry_t *mt_entry )
{
int rv = 0;
IMFS_jnode_t *node = mt_entry->mt_point_node->location.node_access;
1d30: e5903020 ldr r3, [r0, #32]
1d34: e5933008 ldr r3, [r3, #8]
return node->control->imfs_type;
}
static inline bool IMFS_is_directory( const IMFS_jnode_t *node )
{
return node->control->imfs_type == IMFS_DIRECTORY;
1d38: e593204c ldr r2, [r3, #76] ; 0x4c
if ( IMFS_is_directory( node ) ) {
1d3c: e5922000 ldr r2, [r2]
1d40: e3520000 cmp r2, #0
#endif
#include "imfs.h"
int IMFS_mount( rtems_filesystem_mount_table_entry_t *mt_entry )
{
1d44: e52de004 push {lr} ; (str lr, [sp, #-4]!)
int rv = 0;
IMFS_jnode_t *node = mt_entry->mt_point_node->location.node_access;
if ( IMFS_is_directory( node ) ) {
1d48: 1a000009 bne 1d74 <IMFS_mount+0x44>
if ( node->info.directory.mt_fs == NULL ) {
1d4c: e593205c ldr r2, [r3, #92] ; 0x5c
1d50: e3520000 cmp r2, #0
node->info.directory.mt_fs = mt_entry;
1d54: 0583005c streq r0, [r3, #92] ; 0x5c
#include "imfs.h"
int IMFS_mount( rtems_filesystem_mount_table_entry_t *mt_entry )
{
int rv = 0;
1d58: 01a00002 moveq r0, r2
IMFS_jnode_t *node = mt_entry->mt_point_node->location.node_access;
if ( IMFS_is_directory( node ) ) {
if ( node->info.directory.mt_fs == NULL ) {
1d5c: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
node->info.directory.mt_fs = mt_entry;
} else {
errno = EBUSY;
1d60: eb002e73 bl d734 <__errno> <== NOT EXECUTED
1d64: e3a03010 mov r3, #16 <== NOT EXECUTED
1d68: e5803000 str r3, [r0] <== NOT EXECUTED
rv = -1;
1d6c: e3e00000 mvn r0, #0 <== NOT EXECUTED
1d70: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
}
} else {
errno = ENOTDIR;
1d74: eb002e6e bl d734 <__errno>
1d78: e3a03014 mov r3, #20
1d7c: e5803000 str r3, [r0]
rv = -1;
1d80: e3e00000 mvn r0, #0
}
return rv;
}
1d84: e49df004 pop {pc} ; (ldr pc, [sp], #4)
00009fec <IMFS_node_remove_directory>:
static IMFS_jnode_t *IMFS_node_remove_directory(
IMFS_jnode_t *node
)
{
if ( !rtems_chain_is_empty( &node->info.directory.Entries ) ) {
9fec: e5902050 ldr r2, [r0, #80] ; 0x50
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
9ff0: e2803054 add r3, r0, #84 ; 0x54
9ff4: e1520003 cmp r2, r3
}
static IMFS_jnode_t *IMFS_node_remove_directory(
IMFS_jnode_t *node
)
{
9ff8: e52de004 push {lr} ; (str lr, [sp, #-4]!)
if ( !rtems_chain_is_empty( &node->info.directory.Entries ) ) {
9ffc: 0a000004 beq a014 <IMFS_node_remove_directory+0x28>
errno = ENOTEMPTY;
a000: eb000dcb bl d734 <__errno>
a004: e3a0305a mov r3, #90 ; 0x5a
a008: e5803000 str r3, [r0]
node = NULL;
a00c: e3a00000 mov r0, #0
a010: e49df004 pop {pc} ; (ldr pc, [sp], #4)
} else if ( IMFS_is_mount_point( node ) ) {
a014: e590305c ldr r3, [r0, #92] ; 0x5c
a018: e3530000 cmp r3, #0
a01c: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
errno = EBUSY;
a020: eb000dc3 bl d734 <__errno> <== NOT EXECUTED
a024: e3a03010 mov r3, #16 <== NOT EXECUTED
a028: e5803000 str r3, [r0] <== NOT EXECUTED
a02c: e3a00000 mov r0, #0 <== NOT EXECUTED
node = NULL;
}
return node;
}
a030: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
00001de8 <IMFS_rename>:
const rtems_filesystem_location_info_t *oldloc,
const rtems_filesystem_location_info_t *newparentloc,
const char *name,
size_t namelen
)
{
1de8: e92d40f3 push {r0, r1, r4, r5, r6, r7, lr}
int rv = 0;
IMFS_jnode_t *node = oldloc->node_access;
1dec: e5914008 ldr r4, [r1, #8]
IMFS_jnode_t *new_parent = newparentloc->node_access;
1df0: e5925008 ldr r5, [r2, #8]
/*
* FIXME: Due to insufficient checks we can create inaccessible nodes with
* this operation.
*/
if ( node->Parent != NULL ) {
1df4: e5942008 ldr r2, [r4, #8]
1df8: e3520000 cmp r2, #0
const rtems_filesystem_location_info_t *oldloc,
const rtems_filesystem_location_info_t *newparentloc,
const char *name,
size_t namelen
)
{
1dfc: e59d601c ldr r6, [sp, #28]
/*
* FIXME: Due to insufficient checks we can create inaccessible nodes with
* this operation.
*/
if ( node->Parent != NULL ) {
1e00: 0a00001c beq 1e78 <IMFS_rename+0x90>
if ( namelen < IMFS_NAME_MAX ) {
1e04: e356001f cmp r6, #31
1e08: 8a000017 bhi 1e6c <IMFS_rename+0x84>
memcpy( node->name, name, namelen );
1e0c: e1a01003 mov r1, r3
1e10: e1a02006 mov r2, r6
node->name [namelen] = '\0';
1e14: e3a07000 mov r7, #0
* this operation.
*/
if ( node->Parent != NULL ) {
if ( namelen < IMFS_NAME_MAX ) {
memcpy( node->name, name, namelen );
1e18: e284000c add r0, r4, #12
node->name [namelen] = '\0';
1e1c: e0846006 add r6, r4, r6
* this operation.
*/
if ( node->Parent != NULL ) {
if ( namelen < IMFS_NAME_MAX ) {
memcpy( node->name, name, namelen );
1e20: eb00307d bl e01c <memcpy>
node->name [namelen] = '\0';
1e24: e5c6700c strb r7, [r6, #12]
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
1e28: e894000c ldm r4, {r2, r3}
next->previous = previous;
1e2c: e5823004 str r3, [r2, #4]
previous->next = next;
1e30: e5832000 str r2, [r3]
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
1e34: e5953058 ldr r3, [r5, #88] ; 0x58
RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
1e38: e2852054 add r2, r5, #84 ; 0x54
static inline void IMFS_add_to_directory(
IMFS_jnode_t *dir,
IMFS_jnode_t *node
)
{
node->Parent = dir;
1e3c: e5845008 str r5, [r4, #8]
Chain_Node *old_last = tail->previous;
the_node->next = tail;
1e40: e5842000 str r2, [r4]
tail->previous = the_node;
1e44: e5854058 str r4, [r5, #88] ; 0x58
old_last->next = the_node;
1e48: e5834000 str r4, [r3]
the_node->previous = old_last;
1e4c: e5843004 str r3, [r4, #4]
IMFS_remove_from_directory( node );
IMFS_add_to_directory( new_parent, node );
IMFS_update_ctime( node );
1e50: e1a0000d mov r0, sp
1e54: e1a01007 mov r1, r7
1e58: eb00015b bl 23cc <gettimeofday>
1e5c: e59d3000 ldr r3, [sp]
const rtems_filesystem_location_info_t *newparentloc,
const char *name,
size_t namelen
)
{
int rv = 0;
1e60: e1a00007 mov r0, r7
memcpy( node->name, name, namelen );
node->name [namelen] = '\0';
IMFS_remove_from_directory( node );
IMFS_add_to_directory( new_parent, node );
IMFS_update_ctime( node );
1e64: e5843048 str r3, [r4, #72] ; 0x48
1e68: ea000006 b 1e88 <IMFS_rename+0xa0>
} else {
errno = ENAMETOOLONG;
1e6c: eb002e30 bl d734 <__errno> <== NOT EXECUTED
1e70: e3a0305b mov r3, #91 ; 0x5b <== NOT EXECUTED
1e74: ea000001 b 1e80 <IMFS_rename+0x98> <== NOT EXECUTED
rv = -1;
}
} else {
errno = EINVAL;
1e78: eb002e2d bl d734 <__errno> <== NOT EXECUTED
1e7c: e3a03016 mov r3, #22 <== NOT EXECUTED
1e80: e5803000 str r3, [r0] <== NOT EXECUTED
rv = -1;
1e84: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return rv;
}
1e88: e8bd80fc pop {r2, r3, r4, r5, r6, r7, pc}
00001f6c <IMFS_unmount>:
#include "imfs.h"
int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry )
{
int rv = 0;
IMFS_jnode_t *node = mt_entry->mt_point_node->location.node_access;
1f6c: e5903020 ldr r3, [r0, #32]
1f70: e5932008 ldr r2, [r3, #8]
return node->control->imfs_type;
}
static inline bool IMFS_is_directory( const IMFS_jnode_t *node )
{
return node->control->imfs_type == IMFS_DIRECTORY;
1f74: e592304c ldr r3, [r2, #76] ; 0x4c
if ( IMFS_is_directory( node ) ) {
1f78: e5933000 ldr r3, [r3]
1f7c: e3530000 cmp r3, #0
#endif
#include "imfs.h"
int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry )
{
1f80: e52de004 push {lr} ; (str lr, [sp, #-4]!)
int rv = 0;
IMFS_jnode_t *node = mt_entry->mt_point_node->location.node_access;
if ( IMFS_is_directory( node ) ) {
1f84: 1a000009 bne 1fb0 <IMFS_unmount+0x44>
if ( node->info.directory.mt_fs == mt_entry ) {
1f88: e592105c ldr r1, [r2, #92] ; 0x5c
1f8c: e1510000 cmp r1, r0
node->info.directory.mt_fs = NULL;
1f90: 0582305c streq r3, [r2, #92] ; 0x5c
#include "imfs.h"
int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry )
{
int rv = 0;
1f94: 01a00003 moveq r0, r3
IMFS_jnode_t *node = mt_entry->mt_point_node->location.node_access;
if ( IMFS_is_directory( node ) ) {
if ( node->info.directory.mt_fs == mt_entry ) {
1f98: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
node->info.directory.mt_fs = NULL;
} else {
errno = EINVAL;
1f9c: eb002de4 bl d734 <__errno> <== NOT EXECUTED
1fa0: e3a03016 mov r3, #22 <== NOT EXECUTED
1fa4: e5803000 str r3, [r0] <== NOT EXECUTED
rv = -1;
1fa8: e3e00000 mvn r0, #0 <== NOT EXECUTED
1fac: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
}
} else {
errno = ENOTDIR;
1fb0: eb002ddf bl d734 <__errno> <== NOT EXECUTED
1fb4: e3a03014 mov r3, #20 <== NOT EXECUTED
1fb8: e5803000 str r3, [r0] <== NOT EXECUTED
rv = -1;
1fbc: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return rv;
}
1fc0: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
0001eecc <Stack_check_Dump_threads_usage>:
static rtems_printk_plugin_t print_handler;
static void Stack_check_Dump_threads_usage(
Thread_Control *the_thread
)
{
1eecc: e92d4fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
}
low = Stack_check_usable_stack_start(stack);
size = Stack_check_usable_stack_size(stack);
1eed0: e59060b4 ldr r6, [r0, #180] ; 0xb4
{
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
}
low = Stack_check_usable_stack_start(stack);
1eed4: e59030b8 ldr r3, [r0, #184] ; 0xb8
size = Stack_check_usable_stack_size(stack);
1eed8: e2466010 sub r6, r6, #16
/*
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
1eedc: e2838020 add r8, r3, #32
for (ebase = base + length; base < ebase; base++)
1eee0: e3c61003 bic r1, r6, #3
static rtems_printk_plugin_t print_handler;
static void Stack_check_Dump_threads_usage(
Thread_Control *the_thread
)
{
1eee4: e1a05000 mov r5, r0
current = 0;
} else
#endif
{
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
1eee8: e590b0e4 ldr fp, [r0, #228] ; 0xe4
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
1eeec: e0881001 add r1, r8, r1
if (*base != U32_PATTERN)
1eef0: e59f20bc ldr r2, [pc, #188] ; 1efb4 <Stack_check_Dump_threads_usage+0xe8>
1eef4: ea000003 b 1ef08 <Stack_check_Dump_threads_usage+0x3c>
1eef8: e5980000 ldr r0, [r8]
1eefc: e1500002 cmp r0, r2
1ef00: 1a000004 bne 1ef18 <Stack_check_Dump_threads_usage+0x4c>
* start at lower memory and find first word that does not
* match pattern
*/
base += PATTERN_SIZE_WORDS;
for (ebase = base + length; base < ebase; base++)
1ef04: e2888004 add r8, r8, #4
1ef08: e1580001 cmp r8, r1
1ef0c: 3afffff9 bcc 1eef8 <Stack_check_Dump_threads_usage+0x2c>
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;
1ef10: e3a08000 mov r8, #0 <== NOT EXECUTED
1ef14: ea000003 b 1ef28 <Stack_check_Dump_threads_usage+0x5c> <== NOT EXECUTED
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 )
1ef18: e3580000 cmp r8, #0
{
stack = &the_thread->Start.Initial_stack;
current = (void *)_CPU_Context_Get_SP( &the_thread->Registers );
}
low = Stack_check_usable_stack_start(stack);
1ef1c: 12833010 addne r3, r3, #16
size = Stack_check_usable_stack_size(stack);
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 );
1ef20: 10833006 addne r3, r3, r6
1ef24: 10688003 rsbne r8, r8, r3
#if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE)
if ( the_thread )
#endif
{
(*print_handler)(
1ef28: e595a008 ldr sl, [r5, #8]
1ef2c: e59f4084 ldr r4, [pc, #132] ; 1efb8 <Stack_check_Dump_threads_usage+0xec>
1ef30: e3a01005 mov r1, #5
1ef34: e28d2008 add r2, sp, #8
1ef38: e1a0000a mov r0, sl
1ef3c: e8940280 ldm r4, {r7, r9}
1ef40: ebffbb2f bl dc04 <rtems_object_get_name>
1ef44: e59f1070 ldr r1, [pc, #112] ; 1efbc <Stack_check_Dump_threads_usage+0xf0>
1ef48: e1a03000 mov r3, r0
1ef4c: e1a0200a mov r2, sl
1ef50: e1a00009 mov r0, r9
1ef54: e1a0e00f mov lr, pc
1ef58: e12fff17 bx r7
(*print_handler)(
print_context,
" %010p - %010p %010p %8" PRId32 " ",
stack->area,
stack->area + stack->size - 1,
1ef5c: e59530b4 ldr r3, [r5, #180] ; 0xb4
1ef60: e59520b8 ldr r2, [r5, #184] ; 0xb8
1ef64: e2433001 sub r3, r3, #1
else {
(*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 );
}
#endif
(*print_handler)(
1ef68: e0823003 add r3, r2, r3
1ef6c: e58db000 str fp, [sp]
1ef70: e58d6004 str r6, [sp, #4]
1ef74: e5940004 ldr r0, [r4, #4]
1ef78: e59f1040 ldr r1, [pc, #64] ; 1efc0 <Stack_check_Dump_threads_usage+0xf4>
1ef7c: e1a0e00f mov lr, pc
1ef80: e594f000 ldr pc, [r4]
current,
size
);
if (Stack_check_Initialized == 0) {
(*print_handler)( print_context, "Unavailable\n" );
1ef84: e9940009 ldmib r4, {r0, r3}
stack->area + stack->size - 1,
current,
size
);
if (Stack_check_Initialized == 0) {
1ef88: e3530000 cmp r3, #0
1ef8c: 1a000003 bne 1efa0 <Stack_check_Dump_threads_usage+0xd4>
(*print_handler)( print_context, "Unavailable\n" );
1ef90: e59f102c ldr r1, [pc, #44] ; 1efc4 <Stack_check_Dump_threads_usage+0xf8><== NOT EXECUTED
1ef94: e1a0e00f mov lr, pc <== NOT EXECUTED
1ef98: e594f000 ldr pc, [r4] <== NOT EXECUTED
1ef9c: ea000003 b 1efb0 <Stack_check_Dump_threads_usage+0xe4> <== NOT EXECUTED
} else {
(*print_handler)( print_context, "%8" PRId32 "\n", used );
1efa0: e59f1020 ldr r1, [pc, #32] ; 1efc8 <Stack_check_Dump_threads_usage+0xfc>
1efa4: e1a02008 mov r2, r8
1efa8: e1a0e00f mov lr, pc
1efac: e594f000 ldr pc, [r4]
}
}
1efb0: e8bd8fff pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
000072fc <_Internal_error_Occurred>:
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
72fc: e92d4007 push {r0, r1, r2, lr}
7300: e20160ff and r6, r1, #255 ; 0xff
7304: e1a04000 mov r4, r0
Internal_errors_Source source,
bool is_internal,
Internal_errors_t error
)
{
User_extensions_Fatal_context ctx = { source, is_internal, error };
7308: e58d0000 str r0, [sp]
_User_extensions_Iterate( &ctx, _User_extensions_Fatal_visitor );
730c: e59f1040 ldr r1, [pc, #64] ; 7354 <_Internal_error_Occurred+0x58>
7310: e1a0000d mov r0, sp
7314: e1a05002 mov r5, r2
Internal_errors_Source source,
bool is_internal,
Internal_errors_t error
)
{
User_extensions_Fatal_context ctx = { source, is_internal, error };
7318: e58d2008 str r2, [sp, #8]
731c: e5cd6004 strb r6, [sp, #4]
_User_extensions_Iterate( &ctx, _User_extensions_Fatal_visitor );
7320: eb00076e bl 90e0 <_User_extensions_Iterate>
_User_extensions_Fatal( the_source, is_internal, the_error );
_Internal_errors_What_happened.the_source = the_source;
7324: e59f302c ldr r3, [pc, #44] ; 7358 <_Internal_error_Occurred+0x5c><== NOT EXECUTED
7328: e5834000 str r4, [r3] <== NOT EXECUTED
_Internal_errors_What_happened.is_internal = is_internal;
732c: e5c36004 strb r6, [r3, #4] <== NOT EXECUTED
_Internal_errors_What_happened.the_error = the_error;
7330: e5835008 str r5, [r3, #8] <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
7334: e59f3020 ldr r3, [pc, #32] ; 735c <_Internal_error_Occurred+0x60><== NOT EXECUTED
7338: e3a02005 mov r2, #5 <== NOT EXECUTED
733c: e5832000 str r2, [r3] <== NOT EXECUTED
uint32_t level;
#if defined(ARM_MULTILIB_ARCH_V4)
uint32_t arm_switch_reg;
__asm__ volatile (
7340: e10f2000 mrs r2, CPSR <== NOT EXECUTED
7344: e3823080 orr r3, r2, #128 ; 0x80 <== NOT EXECUTED
7348: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
734c: e1a00005 mov r0, r5 <== NOT EXECUTED
7350: eafffffe b 7350 <_Internal_error_Occurred+0x54> <== NOT EXECUTED
0000d018 <_POSIX_Keys_Run_destructors>:
*/
void _POSIX_Keys_Run_destructors(
Thread_Control *thread
)
{
d018: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
Objects_Maximum thread_index = _Objects_Get_index( thread->Object.id );
d01c: e5906008 ldr r6, [r0, #8]
*
* Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.
*/
while ( !done ) {
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
d020: e59f5080 ldr r5, [pc, #128] ; d0a8 <_POSIX_Keys_Run_destructors+0x90>
d024: e1a07c26 lsr r7, r6, #24
for ( index = 1 ; index <= max ; ++index ) {
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
void *value = key->Values [ thread_api ][ thread_index ];
d028: e1a06806 lsl r6, r6, #16
d02c: e2077007 and r7, r7, #7
d030: e1a06726 lsr r6, r6, #14
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
d034: e3a04001 mov r4, #1
*
* Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.
*/
while ( !done ) {
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
d038: e1d5a1b0 ldrh sl, [r5, #16]
done = true;
d03c: e1a02004 mov r2, r4
if ( key != NULL && key->destructor != NULL ) {
void *value = key->Values [ thread_api ][ thread_index ];
if ( value != NULL ) {
key->Values [ thread_api ][ thread_index ] = NULL;
d040: e3a08000 mov r8, #0
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
d044: ea000012 b d094 <_POSIX_Keys_Run_destructors+0x7c>
POSIX_Keys_Control *key = (POSIX_Keys_Control *)
d048: e595301c ldr r3, [r5, #28]
d04c: e7933104 ldr r3, [r3, r4, lsl #2]
_POSIX_Keys_Information.local_table [ index ];
if ( key != NULL && key->destructor != NULL ) {
d050: e3530000 cmp r3, #0
d054: 0a00000b beq d088 <_POSIX_Keys_Run_destructors+0x70>
d058: e5931010 ldr r1, [r3, #16]
d05c: e3510000 cmp r1, #0
d060: 0a000008 beq d088 <_POSIX_Keys_Run_destructors+0x70>
void *value = key->Values [ thread_api ][ thread_index ];
d064: e2871005 add r1, r7, #5
d068: e7931101 ldr r1, [r3, r1, lsl #2]
d06c: e7910006 ldr r0, [r1, r6]
if ( value != NULL ) {
d070: e3500000 cmp r0, #0
d074: 0a000003 beq d088 <_POSIX_Keys_Run_destructors+0x70>
key->Values [ thread_api ][ thread_index ] = NULL;
d078: e7818006 str r8, [r1, r6] <== NOT EXECUTED
(*key->destructor)( value );
d07c: e1a0e00f mov lr, pc <== NOT EXECUTED
d080: e593f010 ldr pc, [r3, #16] <== NOT EXECUTED
done = false;
d084: e3a02000 mov r2, #0 <== NOT EXECUTED
Objects_Maximum index = 0;
Objects_Maximum max = _POSIX_Keys_Information.maximum;
done = true;
for ( index = 1 ; index <= max ; ++index ) {
d088: e2844001 add r4, r4, #1
d08c: e1a04804 lsl r4, r4, #16
d090: e1a04824 lsr r4, r4, #16
d094: e154000a cmp r4, sl
d098: 9affffea bls d048 <_POSIX_Keys_Run_destructors+0x30>
* number of iterations. An infinite loop may happen if destructors set
* thread specific data. This can be considered dubious.
*
* Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.
*/
while ( !done ) {
d09c: e3520000 cmp r2, #0
d0a0: 0affffe3 beq d034 <_POSIX_Keys_Run_destructors+0x1c>
done = false;
}
}
}
}
}
d0a4: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
0000ce60 <_POSIX_Semaphore_Create_support>:
POSIX_Semaphore_Control *the_semaphore;
CORE_semaphore_Attributes *the_sem_attr;
char *name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
ce60: e3520000 cmp r2, #0
size_t name_len,
int pshared,
unsigned int value,
POSIX_Semaphore_Control **the_sem
)
{
ce64: e92d40f0 push {r4, r5, r6, r7, lr}
ce68: e1a04000 mov r4, r0
ce6c: e1a06001 mov r6, r1
ce70: e1a07003 mov r7, r3
POSIX_Semaphore_Control *the_semaphore;
CORE_semaphore_Attributes *the_sem_attr;
char *name;
/* Sharing semaphores among processes is not currently supported */
if (pshared != 0)
ce74: 0a000002 beq ce84 <_POSIX_Semaphore_Create_support+0x24>
rtems_set_errno_and_return_minus_one( ENOSYS );
ce78: eb00099c bl f4f0 <__errno>
ce7c: e3a03058 mov r3, #88 ; 0x58
ce80: ea000018 b cee8 <_POSIX_Semaphore_Create_support+0x88>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
ce84: e59f30d8 ldr r3, [pc, #216] ; cf64 <_POSIX_Semaphore_Create_support+0x104>
ce88: e5932000 ldr r2, [r3]
++level;
ce8c: e2822001 add r2, r2, #1
_Thread_Dispatch_disable_level = level;
ce90: e5832000 str r2, [r3]
* _POSIX_Semaphore_Allocate
*/
RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
{
return (POSIX_Semaphore_Control *)
ce94: e59f00cc ldr r0, [pc, #204] ; cf68 <_POSIX_Semaphore_Create_support+0x108>
ce98: ebffeffe bl 8e98 <_Objects_Allocate>
_Thread_Disable_dispatch();
the_semaphore = _POSIX_Semaphore_Allocate();
if ( !the_semaphore ) {
ce9c: e2505000 subs r5, r0, #0
cea0: 1a000003 bne ceb4 <_POSIX_Semaphore_Create_support+0x54>
_Thread_Enable_dispatch();
cea4: ebfff4c1 bl a1b0 <_Thread_Enable_dispatch>
rtems_set_errno_and_return_minus_one( ENOSPC );
cea8: eb000990 bl f4f0 <__errno>
ceac: e3a0301c mov r3, #28
ceb0: ea00000c b cee8 <_POSIX_Semaphore_Create_support+0x88>
/*
* Make a copy of the user's string for name just in case it was
* dynamically constructed.
*/
if ( name_arg != NULL ) {
ceb4: e3540000 cmp r4, #0
ceb8: 0a00000d beq cef4 <_POSIX_Semaphore_Create_support+0x94>
name = _Workspace_String_duplicate( name_arg, name_len );
cebc: e1a00004 mov r0, r4
cec0: e1a01006 mov r1, r6
cec4: eb000431 bl df90 <_Workspace_String_duplicate>
if ( !name ) {
cec8: e2504000 subs r4, r0, #0
cecc: 1a000008 bne cef4 <_POSIX_Semaphore_Create_support+0x94>
RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
POSIX_Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_POSIX_Semaphore_Information, &the_semaphore->Object );
ced0: e59f0090 ldr r0, [pc, #144] ; cf68 <_POSIX_Semaphore_Create_support+0x108><== NOT EXECUTED
ced4: e1a01005 mov r1, r5 <== NOT EXECUTED
ced8: ebfff0bd bl 91d4 <_Objects_Free> <== NOT EXECUTED
_POSIX_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
cedc: ebfff4b3 bl a1b0 <_Thread_Enable_dispatch> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( ENOMEM );
cee0: eb000982 bl f4f0 <__errno> <== NOT EXECUTED
cee4: e3a0300c mov r3, #12 <== NOT EXECUTED
cee8: e5803000 str r3, [r0]
ceec: e3e00000 mvn r0, #0
cef0: e8bd80f0 pop {r4, r5, r6, r7, pc}
}
} else {
name = NULL;
}
the_semaphore->process_shared = pshared;
cef4: e3a03000 mov r3, #0
if ( name ) {
cef8: e1540003 cmp r4, r3
}
} else {
name = NULL;
}
the_semaphore->process_shared = pshared;
cefc: e5853010 str r3, [r5, #16]
if ( name ) {
the_semaphore->named = true;
cf00: 13a03001 movne r3, #1
cf04: 15c53014 strbne r3, [r5, #20]
the_semaphore->open_count = 1;
cf08: 15853018 strne r3, [r5, #24]
the_semaphore->linked = true;
cf0c: 15c53015 strbne r3, [r5, #21]
* blocking tasks on this semaphore should be. It could somehow
* be derived from the current scheduling policy. One
* thing is certain, no matter what we decide, it won't be
* the same as all other POSIX implementations. :)
*/
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
cf10: e3a06000 mov r6, #0
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
cf14: e3e03000 mvn r3, #0
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
cf18: e285001c add r0, r5, #28
if ( name ) {
the_semaphore->named = true;
the_semaphore->open_count = 1;
the_semaphore->linked = true;
} else {
the_semaphore->named = false;
cf1c: 05c54014 strbeq r4, [r5, #20]
the_semaphore->open_count = 0;
cf20: 05854018 streq r4, [r5, #24]
the_semaphore->linked = false;
cf24: 05c54015 strbeq r4, [r5, #21]
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
cf28: e585305c str r3, [r5, #92] ; 0x5c
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
cf2c: e285105c add r1, r5, #92 ; 0x5c
cf30: e1a02007 mov r2, r7
* blocking tasks on this semaphore should be. It could somehow
* be derived from the current scheduling policy. One
* thing is certain, no matter what we decide, it won't be
* the same as all other POSIX implementations. :)
*/
the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
cf34: e5856060 str r6, [r5, #96] ; 0x60
/*
* This effectively disables limit checking.
*/
the_sem_attr->maximum_count = 0xFFFFFFFF;
_CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value );
cf38: ebffee57 bl 889c <_CORE_semaphore_Initialize>
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
cf3c: e59f3024 ldr r3, [pc, #36] ; cf68 <_POSIX_Semaphore_Create_support+0x108>
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
_Objects_Set_local_object(
cf40: e1d520b8 ldrh r2, [r5, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
cf44: e593301c ldr r3, [r3, #28]
cf48: e7835102 str r5, [r3, r2, lsl #2]
&_POSIX_Semaphore_Information,
&the_semaphore->Object,
name
);
*the_sem = the_semaphore;
cf4c: e59d3014 ldr r3, [sp, #20]
the_object
);
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
/* ASSERT: information->is_string */
the_object->name.name_p = name;
cf50: e585400c str r4, [r5, #12]
cf54: e5835000 str r5, [r3]
_Thread_Enable_dispatch();
cf58: ebfff494 bl a1b0 <_Thread_Enable_dispatch>
return 0;
cf5c: e1a00006 mov r0, r6
}
cf60: e8bd80f0 pop {r4, r5, r6, r7, pc}
0000ae28 <_POSIX_Threads_Delete_extension>:
*/
static void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
ae28: e92d40f0 push {r4, r5, r6, r7, lr}
api = deleted->API_Extensions[ THREAD_API_POSIX ];
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
ae2c: e1a00001 mov r0, r1
*/
static void _POSIX_Threads_Delete_extension(
Thread_Control *executing __attribute__((unused)),
Thread_Control *deleted
)
{
ae30: e1a04001 mov r4, r1
Thread_Control *the_thread;
POSIX_API_Control *api;
void **value_ptr;
api = deleted->API_Extensions[ THREAD_API_POSIX ];
ae34: e59150f4 ldr r5, [r1, #244] ; 0xf4
/*
* Run the POSIX cancellation handlers
*/
_POSIX_Threads_cancel_run( deleted );
ae38: eb00085f bl cfbc <_POSIX_Threads_cancel_run>
/*
* Run all the key destructors
*/
_POSIX_Keys_Run_destructors( deleted );
ae3c: e1a00004 mov r0, r4
ae40: eb000874 bl d018 <_POSIX_Keys_Run_destructors>
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
ae44: e2856044 add r6, r5, #68 ; 0x44
_POSIX_Keys_Run_destructors( deleted );
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
ae48: e5947028 ldr r7, [r4, #40] ; 0x28
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
ae4c: ea000001 b ae58 <_POSIX_Threads_Delete_extension+0x30>
*(void **)the_thread->Wait.return_argument = value_ptr;
ae50: e5903028 ldr r3, [r0, #40] ; 0x28 <== NOT EXECUTED
ae54: e5837000 str r7, [r3] <== NOT EXECUTED
/*
* Wakeup all the tasks which joined with this one
*/
value_ptr = (void **) deleted->Wait.return_argument;
while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
ae58: e1a00006 mov r0, r6
ae5c: ebfff6c9 bl 8988 <_Thread_queue_Dequeue>
ae60: e3500000 cmp r0, #0
ae64: 1afffff9 bne ae50 <_POSIX_Threads_Delete_extension+0x28>
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
ae68: e5953084 ldr r3, [r5, #132] ; 0x84
ae6c: e3530004 cmp r3, #4
(void) _Watchdog_Remove( &api->Sporadic_timer );
ae70: 028500a8 addeq r0, r5, #168 ; 0xa8
ae74: 0bfff932 bleq 9344 <_Watchdog_Remove>
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
ae78: e3a03000 mov r3, #0
_Workspace_Free( api );
ae7c: e1a00005 mov r0, r5
*(void **)the_thread->Wait.return_argument = value_ptr;
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
ae80: e58430f4 str r3, [r4, #244] ; 0xf4
_Workspace_Free( api );
}
ae84: e8bd40f0 pop {r4, r5, r6, r7, lr}
if ( api->schedpolicy == SCHED_SPORADIC )
(void) _Watchdog_Remove( &api->Sporadic_timer );
deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
_Workspace_Free( api );
ae88: eafff9bd b 9584 <_Workspace_Free>
000086f0 <_RBTree_Sibling>:
*/
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
86f0: e2502000 subs r2, r0, #0
86f4: 01a00002 moveq r0, r2
86f8: 012fff1e bxeq lr
if(!(the_node->parent)) return NULL;
86fc: e5923000 ldr r3, [r2]
8700: e3530000 cmp r3, #0
8704: 0a000006 beq 8724 <_RBTree_Sibling+0x34>
if(!(the_node->parent->parent)) return NULL;
8708: e5930000 ldr r0, [r3]
870c: e3500000 cmp r0, #0
8710: 012fff1e bxeq lr
if(the_node == the_node->parent->child[RBT_LEFT])
8714: e5930004 ldr r0, [r3, #4]
8718: e1520000 cmp r2, r0
return the_node->parent->child[RBT_RIGHT];
871c: 05930008 ldreq r0, [r3, #8]
8720: e12fff1e bx lr
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Sibling(
const RBTree_Node *the_node
)
{
if(!the_node) return NULL;
if(!(the_node->parent)) return NULL;
8724: e1a00003 mov r0, r3 <== NOT EXECUTED
if(the_node == the_node->parent->child[RBT_LEFT])
return the_node->parent->child[RBT_RIGHT];
else
return the_node->parent->child[RBT_LEFT];
}
8728: e12fff1e bx lr <== NOT EXECUTED
00009484 <_Scheduler_CBS_Create_server>:
)
{
unsigned int i;
Scheduler_CBS_Server *the_server;
if ( params->budget <= 0 ||
9484: e5903004 ldr r3, [r0, #4]
9488: e3530000 cmp r3, #0
int _Scheduler_CBS_Create_server (
Scheduler_CBS_Parameters *params,
Scheduler_CBS_Budget_overrun budget_overrun_callback,
rtems_id *server_id
)
{
948c: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
9490: e1a04000 mov r4, r0
9494: e1a05001 mov r5, r1
9498: e1a0a002 mov sl, r2
unsigned int i;
Scheduler_CBS_Server *the_server;
if ( params->budget <= 0 ||
949c: da000023 ble 9530 <_Scheduler_CBS_Create_server+0xac>
94a0: e5903000 ldr r3, [r0]
94a4: e3530000 cmp r3, #0
94a8: da000020 ble 9530 <_Scheduler_CBS_Create_server+0xac>
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
94ac: e59f308c ldr r3, [pc, #140] ; 9540 <_Scheduler_CBS_Create_server+0xbc>
94b0: e5932000 ldr r2, [r3]
94b4: e59f3088 ldr r3, [pc, #136] ; 9544 <_Scheduler_CBS_Create_server+0xc0>
if ( !_Scheduler_CBS_Server_list[i] )
94b8: e3a06000 mov r6, #0
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
94bc: e5933000 ldr r3, [r3]
94c0: ea00000f b 9504 <_Scheduler_CBS_Create_server+0x80>
if ( !_Scheduler_CBS_Server_list[i] )
94c4: e4937004 ldr r7, [r3], #4
94c8: e3570000 cmp r7, #0
94cc: 1a00000b bne 9500 <_Scheduler_CBS_Create_server+0x7c>
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
94d0: e59f806c ldr r8, [pc, #108] ; 9544 <_Scheduler_CBS_Create_server+0xc0>
}
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
94d4: e58a6000 str r6, [sl]
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
94d8: e3a00010 mov r0, #16
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
94dc: e5989000 ldr r9, [r8]
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
94e0: eb00072f bl b1a4 <_Workspace_Allocate>
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
94e4: e7890106 str r0, [r9, r6, lsl #2]
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
94e8: e59a2000 ldr r2, [sl]
94ec: e5983000 ldr r3, [r8]
94f0: e7933102 ldr r3, [r3, r2, lsl #2]
if ( !the_server )
94f4: e3530000 cmp r3, #0
94f8: 1a000005 bne 9514 <_Scheduler_CBS_Create_server+0x90>
94fc: ea00000d b 9538 <_Scheduler_CBS_Create_server+0xb4> <== NOT EXECUTED
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
for ( i = 0; i<_Scheduler_CBS_Maximum_servers; i++ ) {
9500: e2866001 add r6, r6, #1
9504: e1560002 cmp r6, r2
9508: 1affffed bne 94c4 <_Scheduler_CBS_Create_server+0x40>
if ( !_Scheduler_CBS_Server_list[i] )
break;
}
if ( i == _Scheduler_CBS_Maximum_servers )
return SCHEDULER_CBS_ERROR_FULL;
950c: e3e00019 mvn r0, #25
9510: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
9514: e8940003 ldm r4, {r0, r1}
the_server->task_id = -1;
9518: e3e02000 mvn r2, #0
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
the_server->parameters = *params;
951c: e9830003 stmib r3, {r0, r1}
the_server->task_id = -1;
9520: e5832000 str r2, [r3]
the_server->cbs_budget_overrun = budget_overrun_callback;
9524: e583500c str r5, [r3, #12]
return SCHEDULER_CBS_OK;
9528: e1a00007 mov r0, r7
952c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
if ( params->budget <= 0 ||
params->deadline <= 0 ||
params->budget >= SCHEDULER_EDF_PRIO_MSB ||
params->deadline >= SCHEDULER_EDF_PRIO_MSB )
return SCHEDULER_CBS_ERROR_INVALID_PARAMETER;
9530: e3e00011 mvn r0, #17
9534: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
*server_id = i;
_Scheduler_CBS_Server_list[*server_id] = (Scheduler_CBS_Server *)
_Workspace_Allocate( sizeof(Scheduler_CBS_Server) );
the_server = _Scheduler_CBS_Server_list[*server_id];
if ( !the_server )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
9538: e3e00010 mvn r0, #16 <== NOT EXECUTED
the_server->parameters = *params;
the_server->task_id = -1;
the_server->cbs_budget_overrun = budget_overrun_callback;
return SCHEDULER_CBS_OK;
}
953c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} <== NOT EXECUTED
000098b0 <_Scheduler_CBS_Initialize>:
int _Scheduler_CBS_Initialize(void)
{
98b0: e92d4010 push {r4, lr}
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
98b4: e59f4050 ldr r4, [pc, #80] ; 990c <_Scheduler_CBS_Initialize+0x5c>
98b8: e5940000 ldr r0, [r4]
98bc: e1a00100 lsl r0, r0, #2
98c0: eb000637 bl b1a4 <_Workspace_Allocate>
98c4: e59f3044 ldr r3, [pc, #68] ; 9910 <_Scheduler_CBS_Initialize+0x60>
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
98c8: e3500000 cmp r0, #0
}
int _Scheduler_CBS_Initialize(void)
{
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
98cc: e5830000 str r0, [r3]
98d0: e1a00003 mov r0, r3
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
98d4: 13a03000 movne r3, #0
98d8: 15941000 ldrne r1, [r4]
98dc: 11a02003 movne r2, r3
int _Scheduler_CBS_Initialize(void)
{
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
98e0: 1a000003 bne 98f4 <_Scheduler_CBS_Initialize+0x44>
98e4: ea000006 b 9904 <_Scheduler_CBS_Initialize+0x54> <== NOT EXECUTED
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
_Scheduler_CBS_Server_list[i] = NULL;
98e8: e590c000 ldr ip, [r0]
98ec: e78c2103 str r2, [ip, r3, lsl #2]
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
98f0: e2833001 add r3, r3, #1
98f4: e1530001 cmp r3, r1
98f8: 1afffffa bne 98e8 <_Scheduler_CBS_Initialize+0x38>
_Scheduler_CBS_Server_list[i] = NULL;
}
return SCHEDULER_CBS_OK;
98fc: e3a00000 mov r0, #0
9900: e8bd8010 pop {r4, pc}
{
unsigned int i;
_Scheduler_CBS_Server_list = (Scheduler_CBS_Server **) _Workspace_Allocate(
_Scheduler_CBS_Maximum_servers * sizeof(Scheduler_CBS_Server*) );
if ( !_Scheduler_CBS_Server_list )
return SCHEDULER_CBS_ERROR_NO_MEMORY;
9904: e3e00010 mvn r0, #16 <== NOT EXECUTED
for (i = 0; i<_Scheduler_CBS_Maximum_servers; i++) {
_Scheduler_CBS_Server_list[i] = NULL;
}
return SCHEDULER_CBS_OK;
}
9908: e8bd8010 pop {r4, pc} <== NOT EXECUTED
00008b88 <_Thread_queue_Enqueue_priority>:
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 );
8b88: e281c03c add ip, r1, #60 ; 0x3c
head->next = tail;
8b8c: e581c038 str ip, [r1, #56] ; 0x38
head->previous = NULL;
8b90: e3a0c000 mov ip, #0
8b94: e581c03c str ip, [r1, #60] ; 0x3c
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
8b98: e591c014 ldr ip, [r1, #20]
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
8b9c: e2813038 add r3, r1, #56 ; 0x38
Thread_blocking_operation_States _Thread_queue_Enqueue_priority (
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
ISR_Level *level_p
)
{
8ba0: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
head->next = tail;
head->previous = NULL;
tail->previous = head;
8ba4: e5813040 str r3, [r1, #64] ; 0x40
_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 ];
8ba8: e3a0500c mov r5, #12
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
8bac: e1a0332c lsr r3, ip, #6
block_state = the_thread_queue->state;
if ( _Thread_queue_Is_reverse_search( priority ) )
8bb0: e31c0020 tst ip, #32
_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 ];
8bb4: e0250593 mla r5, r3, r5, r0
block_state = the_thread_queue->state;
8bb8: e5908038 ldr r8, [r0, #56] ; 0x38
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
8bbc: 159fa150 ldrne sl, [pc, #336] ; 8d14 <_Thread_queue_Enqueue_priority+0x18c>
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 ) )
8bc0: 1a000022 bne 8c50 <_Thread_queue_Enqueue_priority+0xc8>
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
const Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Immutable_tail( the_chain ));
8bc4: e285a004 add sl, r5, #4
uint32_t level;
#if defined(ARM_MULTILIB_ARCH_V4)
uint32_t arm_switch_reg;
__asm__ volatile (
8bc8: e10f4000 mrs r4, CPSR
8bcc: e3843080 orr r3, r4, #128 ; 0x80
8bd0: e129f003 msr CPSR_fc, r3
8bd4: e1a06004 mov r6, r4
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
8bd8: e3e07000 mvn r7, #0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
8bdc: e5953000 ldr r3, [r5]
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_First( header );
while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
8be0: ea00000b b 8c14 <_Thread_queue_Enqueue_priority+0x8c>
search_priority = search_thread->current_priority;
8be4: e5937014 ldr r7, [r3, #20]
if ( priority <= search_priority )
8be8: e15c0007 cmp ip, r7
8bec: 9a00000a bls 8c1c <_Thread_queue_Enqueue_priority+0x94>
static inline void arm_interrupt_flash( uint32_t level )
{
#if defined(ARM_MULTILIB_ARCH_V4)
uint32_t arm_switch_reg;
__asm__ volatile (
8bf0: e10f9000 mrs r9, CPSR
8bf4: e129f004 msr CPSR_fc, r4
8bf8: e129f009 msr CPSR_fc, r9
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
8bfc: e5939010 ldr r9, [r3, #16]
search_priority = search_thread->current_priority;
if ( priority <= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
8c00: e1180009 tst r8, r9
8c04: 1a000001 bne 8c10 <_Thread_queue_Enqueue_priority+0x88>
static inline void arm_interrupt_enable( uint32_t level )
{
#if defined(ARM_MULTILIB_ARCH_V4)
ARM_SWITCH_REGISTERS;
__asm__ volatile (
8c08: e129f004 msr CPSR_fc, r4
8c0c: eaffffed b 8bc8 <_Thread_queue_Enqueue_priority+0x40>
_ISR_Enable( level );
goto restart_forward_search;
}
search_thread =
8c10: e5933000 ldr r3, [r3]
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 ) ) {
8c14: e153000a cmp r3, sl
8c18: 1afffff1 bne 8be4 <_Thread_queue_Enqueue_priority+0x5c>
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
8c1c: e5905030 ldr r5, [r0, #48] ; 0x30
8c20: e3550001 cmp r5, #1
8c24: 1a000037 bne 8d08 <_Thread_queue_Enqueue_priority+0x180>
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
8c28: e3a02000 mov r2, #0
if ( priority == search_priority )
8c2c: e15c0007 cmp ip, r7
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
8c30: e5802030 str r2, [r0, #48] ; 0x30
if ( priority == search_priority )
8c34: 0a000029 beq 8ce0 <_Thread_queue_Enqueue_priority+0x158>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
8c38: e5932004 ldr r2, [r3, #4]
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
8c3c: e5813000 str r3, [r1]
the_node->previous = previous_node;
8c40: e5812004 str r2, [r1, #4]
previous_node->next = the_node;
8c44: e5821000 str r1, [r2]
search_node->previous = the_node;
8c48: e5831004 str r1, [r3, #4]
8c4c: ea000020 b 8cd4 <_Thread_queue_Enqueue_priority+0x14c>
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
8c50: e5da7000 ldrb r7, [sl]
8c54: e2877001 add r7, r7, #1
uint32_t level;
#if defined(ARM_MULTILIB_ARCH_V4)
uint32_t arm_switch_reg;
__asm__ volatile (
8c58: e10f4000 mrs r4, CPSR
8c5c: e3843080 orr r3, r4, #128 ; 0x80
8c60: e129f003 msr CPSR_fc, r3
8c64: e1a06004 mov r6, r4
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Last(
Chain_Control *the_chain
)
{
return _Chain_Tail( the_chain )->previous;
8c68: e5953008 ldr r3, [r5, #8]
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
8c6c: ea00000b b 8ca0 <_Thread_queue_Enqueue_priority+0x118>
search_priority = search_thread->current_priority;
8c70: e5937014 ldr r7, [r3, #20]
if ( priority >= search_priority )
8c74: e15c0007 cmp ip, r7
8c78: 2a00000a bcs 8ca8 <_Thread_queue_Enqueue_priority+0x120>
static inline void arm_interrupt_flash( uint32_t level )
{
#if defined(ARM_MULTILIB_ARCH_V4)
uint32_t arm_switch_reg;
__asm__ volatile (
8c7c: e10f9000 mrs r9, CPSR
8c80: e129f004 msr CPSR_fc, r4
8c84: e129f009 msr CPSR_fc, r9
8c88: e5939010 ldr r9, [r3, #16]
search_priority = search_thread->current_priority;
if ( priority >= search_priority )
break;
#endif
_ISR_Flash( level );
if ( !_States_Are_set( search_thread->current_state, block_state) ) {
8c8c: e1180009 tst r8, r9
8c90: 1a000001 bne 8c9c <_Thread_queue_Enqueue_priority+0x114>
static inline void arm_interrupt_enable( uint32_t level )
{
#if defined(ARM_MULTILIB_ARCH_V4)
ARM_SWITCH_REGISTERS;
__asm__ volatile (
8c94: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED
8c98: eaffffec b 8c50 <_Thread_queue_Enqueue_priority+0xc8> <== NOT EXECUTED
_ISR_Enable( level );
goto restart_reverse_search;
}
search_thread = (Thread_Control *)
8c9c: e5933004 ldr r3, [r3, #4]
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
8ca0: e1530005 cmp r3, r5
8ca4: 1afffff1 bne 8c70 <_Thread_queue_Enqueue_priority+0xe8>
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
8ca8: e5905030 ldr r5, [r0, #48] ; 0x30
8cac: e3550001 cmp r5, #1
8cb0: 1a000014 bne 8d08 <_Thread_queue_Enqueue_priority+0x180>
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
8cb4: e3a02000 mov r2, #0
if ( priority == search_priority )
8cb8: e15c0007 cmp ip, r7
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
8cbc: e5802030 str r2, [r0, #48] ; 0x30
if ( priority == search_priority )
8cc0: 0a000006 beq 8ce0 <_Thread_queue_Enqueue_priority+0x158>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
8cc4: e5932000 ldr r2, [r3]
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
the_node->previous = search_node;
8cc8: e881000c stm r1, {r2, r3}
search_node->next = the_node;
8ccc: e5831000 str r1, [r3]
next_node->previous = the_node;
8cd0: e5821004 str r1, [r2, #4]
the_thread->Wait.queue = the_thread_queue;
8cd4: e5810044 str r0, [r1, #68] ; 0x44
8cd8: e129f004 msr CPSR_fc, r4
8cdc: ea000007 b 8d00 <_Thread_queue_Enqueue_priority+0x178>
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
equal_priority: /* add at end of priority group */
search_node = _Chain_Tail( &search_thread->Wait.Block2n );
previous_node = search_node->previous;
8ce0: e5932040 ldr r2, [r3, #64] ; 0x40
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 );
8ce4: e283c03c add ip, r3, #60 ; 0x3c
previous_node = search_node->previous;
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
8ce8: e581c000 str ip, [r1]
the_node->previous = previous_node;
8cec: e5812004 str r2, [r1, #4]
previous_node->next = the_node;
8cf0: e5821000 str r1, [r2]
search_node->previous = the_node;
8cf4: e5831040 str r1, [r3, #64] ; 0x40
the_thread->Wait.queue = the_thread_queue;
8cf8: e5810044 str r0, [r1, #68] ; 0x44
8cfc: e129f006 msr CPSR_fc, r6
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
8d00: e3a00001 mov r0, #1
8d04: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
* 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;
8d08: e5826000 str r6, [r2]
return the_thread_queue->sync_state;
8d0c: e5900030 ldr r0, [r0, #48] ; 0x30
}
8d10: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
00014f84 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
14f84: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
14f88: e24dd01c sub sp, sp, #28
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
14f8c: e28d8004 add r8, sp, #4
14f90: e28d5010 add r5, sp, #16
head->previous = NULL;
14f94: e3a03000 mov r3, #0
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
14f98: e2889004 add r9, r8, #4
14f9c: e2856004 add r6, r5, #4
14fa0: e58d9004 str r9, [sp, #4]
head->previous = NULL;
14fa4: e58d3008 str r3, [sp, #8]
tail->previous = head;
14fa8: e58d800c str r8, [sp, #12]
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
14fac: e58d6010 str r6, [sp, #16]
head->previous = NULL;
14fb0: e58d3014 str r3, [sp, #20]
tail->previous = head;
14fb4: e58d5018 str r5, [sp, #24]
14fb8: e1a04000 mov r4, r0
{
/*
* 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;
14fbc: e5848078 str r8, [r4, #120] ; 0x78
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
14fc0: e59f7174 ldr r7, [pc, #372] ; 1513c <_Timer_server_Body+0x1b8>
14fc4: e5973000 ldr r3, [r7]
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
14fc8: e594103c ldr r1, [r4, #60] ; 0x3c
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
14fcc: e2840030 add r0, r4, #48 ; 0x30
14fd0: e0611003 rsb r1, r1, r3
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
14fd4: e584303c str r3, [r4, #60] ; 0x3c
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
14fd8: e1a02005 mov r2, r5
14fdc: eb0010d5 bl 19338 <_Watchdog_Adjust_to_chain>
14fe0: e59f3158 ldr r3, [pc, #344] ; 15140 <_Timer_server_Body+0x1bc>
14fe4: e59f2158 ldr r2, [pc, #344] ; 15144 <_Timer_server_Body+0x1c0>
14fe8: e8930003 ldm r3, {r0, r1}
14fec: e3a03000 mov r3, #0
14ff0: eb004ee7 bl 28b94 <__divdi3>
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
14ff4: e5942074 ldr r2, [r4, #116] ; 0x74
/*
* 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 ) {
14ff8: e1500002 cmp r0, r2
14ffc: e1a0a000 mov sl, r0
15000: 9a000004 bls 15018 <_Timer_server_Body+0x94>
/*
* 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 );
15004: e062100a rsb r1, r2, sl
15008: e2840068 add r0, r4, #104 ; 0x68
1500c: e1a02005 mov r2, r5
15010: eb0010c8 bl 19338 <_Watchdog_Adjust_to_chain>
15014: ea000003 b 15028 <_Timer_server_Body+0xa4>
/*
* 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 );
15018: 32840068 addcc r0, r4, #104 ; 0x68
1501c: 33a01001 movcc r1, #1
15020: 306a2002 rsbcc r2, sl, r2
15024: 3b00109b blcc 19298 <_Watchdog_Adjust>
}
watchdogs->last_snapshot = snapshot;
15028: e584a074 str sl, [r4, #116] ; 0x74
)
{
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 ) {
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
1502c: e284b068 add fp, r4, #104 ; 0x68
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
15030: e284a030 add sl, r4, #48 ; 0x30
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
15034: e5940078 ldr r0, [r4, #120] ; 0x78
15038: eb0002bd bl 15b34 <_Chain_Get>
if ( timer == NULL ) {
1503c: e2501000 subs r1, r0, #0
15040: 0a000009 beq 1506c <_Timer_server_Body+0xe8>
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
15044: e5913038 ldr r3, [r1, #56] ; 0x38
15048: e3530001 cmp r3, #1
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
1504c: 01a0000a moveq r0, sl
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
15050: 0a000002 beq 15060 <_Timer_server_Body+0xdc>
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
15054: e3530003 cmp r3, #3
15058: 1afffff5 bne 15034 <_Timer_server_Body+0xb0>
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
1505c: e1a0000b mov r0, fp
15060: e2811010 add r1, r1, #16
15064: eb0010d8 bl 193cc <_Watchdog_Insert>
15068: eafffff1 b 15034 <_Timer_server_Body+0xb0>
* of zero it will be processed in the next iteration of the timer server
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
1506c: e58d1000 str r1, [sp]
15070: ebffff97 bl 14ed4 <arm_interrupt_disable>
if ( _Chain_Is_empty( insert_chain ) ) {
15074: e59d3004 ldr r3, [sp, #4]
15078: e1530009 cmp r3, r9
1507c: e59d1000 ldr r1, [sp]
15080: 1a000006 bne 150a0 <_Timer_server_Body+0x11c>
ts->insert_chain = NULL;
15084: e5841078 str r1, [r4, #120] ; 0x78
15088: e129f000 msr CPSR_fc, r0
_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 ) ) {
1508c: e59d3010 ldr r3, [sp, #16]
15090: e1530006 cmp r3, r6
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
15094: 13a07000 movne r7, #0
_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 ) ) {
15098: 1a000002 bne 150a8 <_Timer_server_Body+0x124>
1509c: ea000011 b 150e8 <_Timer_server_Body+0x164>
150a0: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
150a4: eaffffc6 b 14fc4 <_Timer_server_Body+0x40> <== NOT EXECUTED
/*
* It is essential that interrupts are disable here since an interrupt
* service routine may remove a watchdog from the chain.
*/
_ISR_Disable( level );
150a8: ebffff89 bl 14ed4 <arm_interrupt_disable>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
150ac: e59d3010 ldr r3, [sp, #16]
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
150b0: e1530006 cmp r3, r6
150b4: 0a000009 beq 150e0 <_Timer_server_Body+0x15c>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
150b8: e5932000 ldr r2, [r3]
head->next = new_first;
new_first->previous = head;
150bc: e5825004 str r5, [r2, #4]
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
150c0: e58d2010 str r2, [sp, #16]
watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain );
if ( watchdog != NULL ) {
watchdog->state = WATCHDOG_INACTIVE;
150c4: e5837008 str r7, [r3, #8]
150c8: e129f000 msr CPSR_fc, r0
/*
* 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 );
150cc: e2830020 add r0, r3, #32
150d0: e8900003 ldm r0, {r0, r1}
150d4: e1a0e00f mov lr, pc
150d8: e593f01c ldr pc, [r3, #28]
}
150dc: eafffff1 b 150a8 <_Timer_server_Body+0x124>
150e0: e129f000 msr CPSR_fc, r0
150e4: eaffffb4 b 14fbc <_Timer_server_Body+0x38>
} else {
ts->active = false;
150e8: e3a03000 mov r3, #0
150ec: e5c4307c strb r3, [r4, #124] ; 0x7c
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
150f0: e59f3050 ldr r3, [pc, #80] ; 15148 <_Timer_server_Body+0x1c4>
150f4: e5932000 ldr r2, [r3]
++level;
150f8: e2822001 add r2, r2, #1
_Thread_Dispatch_disable_level = level;
150fc: e5832000 str r2, [r3]
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
15100: e3a01008 mov r1, #8
15104: e5940000 ldr r0, [r4]
15108: eb000f88 bl 18f30 <_Thread_Set_state>
_Timer_server_Reset_interval_system_watchdog( ts );
1510c: e1a00004 mov r0, r4
15110: ebffff73 bl 14ee4 <_Timer_server_Reset_interval_system_watchdog>
_Timer_server_Reset_tod_system_watchdog( ts );
15114: e1a00004 mov r0, r4
15118: ebffff85 bl 14f34 <_Timer_server_Reset_tod_system_watchdog>
_Thread_Enable_dispatch();
1511c: eb000d54 bl 18674 <_Thread_Enable_dispatch>
ts->active = true;
15120: e3a03001 mov r3, #1
15124: e5c4307c strb r3, [r4, #124] ; 0x7c
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
15128: e2840008 add r0, r4, #8
1512c: eb0010fd bl 19528 <_Watchdog_Remove>
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
15130: e2840040 add r0, r4, #64 ; 0x40
15134: eb0010fb bl 19528 <_Watchdog_Remove>
15138: eaffff9f b 14fbc <_Timer_server_Body+0x38>
00010e00 <_fat_block_read>:
uint32_t start,
uint32_t offset,
uint32_t count,
void *buff
)
{
10e00: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
10e04: e59db028 ldr fp, [sp, #40] ; 0x28
10e08: e1a08000 mov r8, r0
10e0c: e1a05003 mov r5, r3
int rc = RC_OK;
ssize_t cmpltd = 0;
uint32_t sec_num = start;
uint32_t ofs = offset;
10e10: e1a07002 mov r7, r2
void *buff
)
{
int rc = RC_OK;
ssize_t cmpltd = 0;
uint32_t sec_num = start;
10e14: e1a06001 mov r6, r1
uint32_t count,
void *buff
)
{
int rc = RC_OK;
ssize_t cmpltd = 0;
10e18: e3a04000 mov r4, #0
uint32_t sec_num = start;
uint32_t ofs = offset;
uint8_t *sec_buf;
uint32_t c = 0;
while (count > 0)
10e1c: ea000013 b 10e70 <_fat_block_read+0x70>
{
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_READ, &sec_buf);
10e20: e1a00008 mov r0, r8
10e24: e1a01006 mov r1, r6
10e28: e3a02001 mov r2, #1
10e2c: e1a0300d mov r3, sp
10e30: ebffffc7 bl 10d54 <fat_buf_access>
if (rc != RC_OK)
10e34: e2509000 subs r9, r0, #0
10e38: 1a00000f bne 10e7c <_fat_block_read+0x7c>
return -1;
c = MIN(count, (fs_info->vol.bps - ofs));
10e3c: e1d8a0b0 ldrh sl, [r8]
memcpy((buff + cmpltd), (sec_buf + ofs), c);
10e40: e59d1000 ldr r1, [sp]
{
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_READ, &sec_buf);
if (rc != RC_OK)
return -1;
c = MIN(count, (fs_info->vol.bps - ofs));
10e44: e067a00a rsb sl, r7, sl
10e48: e15a0005 cmp sl, r5
10e4c: 21a0a005 movcs sl, r5
memcpy((buff + cmpltd), (sec_buf + ofs), c);
10e50: e08b0004 add r0, fp, r4
10e54: e0811007 add r1, r1, r7
10e58: e1a0200a mov r2, sl
10e5c: eb002128 bl 19304 <memcpy>
count -= c;
10e60: e06a5005 rsb r5, sl, r5
cmpltd += c;
10e64: e08a4004 add r4, sl, r4
sec_num++;
10e68: e2866001 add r6, r6, #1
ofs = 0;
10e6c: e1a07009 mov r7, r9
uint32_t sec_num = start;
uint32_t ofs = offset;
uint8_t *sec_buf;
uint32_t c = 0;
while (count > 0)
10e70: e3550000 cmp r5, #0
10e74: 1affffe9 bne 10e20 <_fat_block_read+0x20>
10e78: ea000000 b 10e80 <_fat_block_read+0x80>
{
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_READ, &sec_buf);
if (rc != RC_OK)
return -1;
10e7c: e3e04000 mvn r4, #0 <== NOT EXECUTED
cmpltd += c;
sec_num++;
ofs = 0;
}
return cmpltd;
}
10e80: e1a00004 mov r0, r4
10e84: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
00010004 <_hash_search>:
rtems_chain_control *hash,
uint32_t key1,
uint32_t key2,
fat_file_fd_t **ret
)
{
10004: e92d41f0 push {r4, r5, r6, r7, r8, lr}
10008: e1a05002 mov r5, r2
1000c: e1a07003 mov r7, r3
uint32_t mod = (key1) % FAT_HASH_MODULE;
10010: e2023001 and r3, r2, #1
rtems_chain_node *the_node = rtems_chain_first(hash + mod);
10014: e3a0200c mov r2, #12
10018: e0030392 mul r3, r2, r3
1001c: e0818003 add r8, r1, r3
rtems_chain_control *hash,
uint32_t key1,
uint32_t key2,
fat_file_fd_t **ret
)
{
10020: e1a04000 mov r4, r0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
10024: e7916003 ldr r6, [r1, r3]
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
const Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Immutable_tail( the_chain ));
10028: e2888004 add r8, r8, #4
uint32_t mod = (key1) % FAT_HASH_MODULE;
rtems_chain_node *the_node = rtems_chain_first(hash + mod);
for ( ; !rtems_chain_is_tail((hash) + mod, the_node) ; )
1002c: ea00000e b 1006c <_hash_search+0x68>
{
fat_file_fd_t *ffd = (fat_file_fd_t *)the_node;
uint32_t ck = fat_construct_key(fs_info, &ffd->dir_pos.sname);
10030: e1a00004 mov r0, r4
10034: e2861020 add r1, r6, #32
10038: ebffffe2 bl ffc8 <fat_construct_key>
if ( (key1) == ck)
1003c: e1550000 cmp r5, r0
10040: 1a000008 bne 10068 <_hash_search+0x64>
{
if ( ((key2) == 0) || ((key2) == ffd->ino) )
10044: e3570000 cmp r7, #0
10048: 0a000002 beq 10058 <_hash_search+0x54>
1004c: e596300c ldr r3, [r6, #12] <== NOT EXECUTED
10050: e1570003 cmp r7, r3 <== NOT EXECUTED
10054: 1a000003 bne 10068 <_hash_search+0x64> <== NOT EXECUTED
{
*ret = (void *)the_node;
10058: e59d3018 ldr r3, [sp, #24]
return 0;
1005c: e3a00000 mov r0, #0
if ( (key1) == ck)
{
if ( ((key2) == 0) || ((key2) == ffd->ino) )
{
*ret = (void *)the_node;
10060: e5836000 str r6, [r3]
return 0;
10064: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
}
}
the_node = the_node->next;
10068: e5966000 ldr r6, [r6]
)
{
uint32_t mod = (key1) % FAT_HASH_MODULE;
rtems_chain_node *the_node = rtems_chain_first(hash + mod);
for ( ; !rtems_chain_is_tail((hash) + mod, the_node) ; )
1006c: e1560008 cmp r6, r8
10070: 1affffee bne 10030 <_hash_search+0x2c>
return 0;
}
}
the_node = the_node->next;
}
return -1;
10074: e3e00000 mvn r0, #0
}
10078: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
00002d68 <_lstat_r>:
struct _reent *ptr __attribute__((unused)),
const char *path,
struct stat *buf
)
{
return _STAT_NAME( path, buf );
2d68: e1a00001 mov r0, r1 <== NOT EXECUTED
2d6c: e1a01002 mov r1, r2 <== NOT EXECUTED
2d70: eaffffe4 b 2d08 <lstat> <== NOT EXECUTED
00003238 <_stat_r>:
struct _reent *ptr __attribute__((unused)),
const char *path,
struct stat *buf
)
{
return _STAT_NAME( path, buf );
3238: e1a00001 mov r0, r1 <== NOT EXECUTED
323c: e1a01002 mov r1, r2 <== NOT EXECUTED
3240: eaffffe4 b 31d8 <stat> <== NOT EXECUTED
000062c0 <aio_fsync>:
)
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
62c0: e3500a02 cmp r0, #8192 ; 0x2000
int aio_fsync(
int op,
struct aiocb *aiocbp
)
{
62c4: e92d4030 push {r4, r5, lr}
62c8: e1a04001 mov r4, r1
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
62cc: 13a05016 movne r5, #22
)
{
rtems_aio_request *req;
int mode;
if (op != O_SYNC)
62d0: 1a00000c bne 6308 <aio_fsync+0x48>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
62d4: e5910000 ldr r0, [r1]
62d8: e3a01003 mov r1, #3
62dc: eb0018bf bl c5e0 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
62e0: e2000003 and r0, r0, #3
62e4: e2400001 sub r0, r0, #1
62e8: e3500001 cmp r0, #1
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
62ec: 83a05009 movhi r5, #9
if (op != O_SYNC)
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
62f0: 8a000004 bhi 6308 <aio_fsync+0x48>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
req = malloc (sizeof (rtems_aio_request));
62f4: e3a00018 mov r0, #24
62f8: ebfff289 bl 2d24 <malloc>
if (req == NULL)
62fc: e2503000 subs r3, r0, #0
6300: 1a000007 bne 6324 <aio_fsync+0x64>
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
6304: e3a0500b mov r5, #11 <== NOT EXECUTED
6308: e3e03000 mvn r3, #0
630c: e5845030 str r5, [r4, #48] ; 0x30
6310: e5843034 str r3, [r4, #52] ; 0x34
6314: eb002574 bl f8ec <__errno>
6318: e5805000 str r5, [r0]
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
}
631c: e3e00000 mvn r0, #0
6320: e8bd8030 pop {r4, r5, pc}
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
6324: e5834014 str r4, [r3, #20]
req->aiocbp->aio_lio_opcode = LIO_SYNC;
6328: e3a03003 mov r3, #3
632c: e584302c str r3, [r4, #44] ; 0x2c
return rtems_aio_enqueue (req);
}
6330: e8bd4030 pop {r4, r5, lr}
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_SYNC;
return rtems_aio_enqueue (req);
6334: ea000135 b 6810 <rtems_aio_enqueue>
00006a10 <aio_read>:
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
6a10: e92d4030 push {r4, r5, lr}
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
6a14: e3a01003 mov r1, #3
* 0 - otherwise
*/
int
aio_read (struct aiocb *aiocbp)
{
6a18: e1a04000 mov r4, r0
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
6a1c: e5900000 ldr r0, [r0]
6a20: eb0016ee bl c5e0 <fcntl>
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
6a24: e2000003 and r0, r0, #3
6a28: e3500002 cmp r0, #2
6a2c: 13500000 cmpne r0, #0
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
6a30: 13a05009 movne r5, #9
{
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR)))
6a34: 1a00000d bne 6a70 <aio_read+0x60>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
6a38: e5943014 ldr r3, [r4, #20]
6a3c: e3530000 cmp r3, #0
6a40: 1a000003 bne 6a54 <aio_read+0x44>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
6a44: e994000c ldmib r4, {r2, r3}
6a48: e3520000 cmp r2, #0
6a4c: e2d31000 sbcs r1, r3, #0
6a50: aa000001 bge 6a5c <aio_read+0x4c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
6a54: e3a05016 mov r5, #22
6a58: ea000004 b 6a70 <aio_read+0x60>
req = malloc (sizeof (rtems_aio_request));
6a5c: e3a00018 mov r0, #24
6a60: ebfff0af bl 2d24 <malloc>
if (req == NULL)
6a64: e2503000 subs r3, r0, #0
6a68: 1a000007 bne 6a8c <aio_read+0x7c>
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
6a6c: e3a0500b mov r5, #11 <== NOT EXECUTED
6a70: e3e03000 mvn r3, #0
6a74: e5845030 str r5, [r4, #48] ; 0x30
6a78: e5843034 str r3, [r4, #52] ; 0x34
6a7c: eb00239a bl f8ec <__errno>
6a80: e5805000 str r5, [r0]
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
}
6a84: e3e00000 mvn r0, #0
6a88: e8bd8030 pop {r4, r5, pc}
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
6a8c: e5834014 str r4, [r3, #20]
req->aiocbp->aio_lio_opcode = LIO_READ;
6a90: e3a03001 mov r3, #1
6a94: e584302c str r3, [r4, #44] ; 0x2c
return rtems_aio_enqueue (req);
}
6a98: e8bd4030 pop {r4, r5, lr}
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_READ;
return rtems_aio_enqueue (req);
6a9c: eaffff5b b 6810 <rtems_aio_enqueue>
00006aa8 <aio_write>:
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
6aa8: e92d4030 push {r4, r5, lr}
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
6aac: e3a01003 mov r1, #3
* 0 - otherwise
*/
int
aio_write (struct aiocb *aiocbp)
{
6ab0: e1a04000 mov r4, r0
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
6ab4: e5900000 ldr r0, [r0]
6ab8: eb0016c8 bl c5e0 <fcntl>
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
6abc: e2000003 and r0, r0, #3
6ac0: e2400001 sub r0, r0, #1
6ac4: e3500001 cmp r0, #1
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
6ac8: 83a05009 movhi r5, #9
{
rtems_aio_request *req;
int mode;
mode = fcntl (aiocbp->aio_fildes, F_GETFL);
if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR)))
6acc: 8a00000d bhi 6b08 <aio_write+0x60>
rtems_aio_set_errno_return_minus_one (EBADF, aiocbp);
if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX)
6ad0: e5943014 ldr r3, [r4, #20]
6ad4: e3530000 cmp r3, #0
6ad8: 1a000003 bne 6aec <aio_write+0x44>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
if (aiocbp->aio_offset < 0)
6adc: e994000c ldmib r4, {r2, r3}
6ae0: e3520000 cmp r2, #0
6ae4: e2d31000 sbcs r1, r3, #0
6ae8: aa000001 bge 6af4 <aio_write+0x4c>
rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp);
6aec: e3a05016 mov r5, #22
6af0: ea000004 b 6b08 <aio_write+0x60>
req = malloc (sizeof (rtems_aio_request));
6af4: e3a00018 mov r0, #24
6af8: ebfff089 bl 2d24 <malloc>
if (req == NULL)
6afc: e2503000 subs r3, r0, #0
6b00: 1a000007 bne 6b24 <aio_write+0x7c>
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
6b04: e3a0500b mov r5, #11 <== NOT EXECUTED
6b08: e3e03000 mvn r3, #0
6b0c: e5845030 str r5, [r4, #48] ; 0x30
6b10: e5843034 str r3, [r4, #52] ; 0x34
6b14: eb002374 bl f8ec <__errno>
6b18: e5805000 str r5, [r0]
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
}
6b1c: e3e00000 mvn r0, #0
6b20: e8bd8030 pop {r4, r5, pc}
req = malloc (sizeof (rtems_aio_request));
if (req == NULL)
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
6b24: e5834014 str r4, [r3, #20]
req->aiocbp->aio_lio_opcode = LIO_WRITE;
6b28: e3a03002 mov r3, #2
6b2c: e584302c str r3, [r4, #44] ; 0x2c
return rtems_aio_enqueue (req);
}
6b30: e8bd4030 pop {r4, r5, lr}
rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp);
req->aiocbp = aiocbp;
req->aiocbp->aio_lio_opcode = LIO_WRITE;
return rtems_aio_enqueue (req);
6b34: eaffff35 b 6810 <rtems_aio_enqueue>
00002398 <create_disk>:
dev_t dev,
const char *name,
rtems_disk_device **dd_ptr,
char **alloc_name_ptr
)
{
2398: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
239c: e58d3000 str r3, [sp]
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
rtems_filesystem_split_dev_t(dev, major, minor);
if (major >= disktab_size) {
23a0: e59f3168 ldr r3, [pc, #360] ; 2510 <create_disk+0x178>
23a4: e593a000 ldr sl, [r3]
23a8: e150000a cmp r0, sl
dev_t dev,
const char *name,
rtems_disk_device **dd_ptr,
char **alloc_name_ptr
)
{
23ac: e1a04000 mov r4, r0
23b0: e1a05001 mov r5, r1
23b4: e1a06002 mov r6, r2
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
rtems_filesystem_split_dev_t(dev, major, minor);
if (major >= disktab_size) {
23b8: 3a00000e bcc 23f8 <create_disk+0x60>
rtems_disk_device_table *table = disktab;
rtems_device_major_number old_size = disktab_size;
rtems_device_major_number new_size = 2 * old_size;
23bc: e1a0708a lsl r7, sl, #1
if (major >= new_size) {
23c0: e1540007 cmp r4, r7
new_size = major + 1;
23c4: 22847001 addcs r7, r4, #1
rtems_device_minor_number minor = 0;
rtems_filesystem_split_dev_t(dev, major, minor);
if (major >= disktab_size) {
rtems_disk_device_table *table = disktab;
23c8: e5930004 ldr r0, [r3, #4]
if (major >= new_size) {
new_size = major + 1;
}
table = realloc(table, new_size * sizeof(*table));
23cc: e1a01187 lsl r1, r7, #3
23d0: eb0007dc bl 4348 <realloc>
if (table == NULL) {
23d4: e2508000 subs r8, r0, #0
23d8: 0a000043 beq 24ec <create_disk+0x154>
return NULL;
}
memset(table + old_size, 0, (new_size - old_size) * sizeof(*table));
23dc: e06a2007 rsb r2, sl, r7 <== NOT EXECUTED
23e0: e088018a add r0, r8, sl, lsl #3 <== NOT EXECUTED
23e4: e3a01000 mov r1, #0 <== NOT EXECUTED
23e8: e1a02182 lsl r2, r2, #3 <== NOT EXECUTED
23ec: eb003f11 bl 12038 <memset> <== NOT EXECUTED
disktab = table;
23f0: e59f3118 ldr r3, [pc, #280] ; 2510 <create_disk+0x178> <== NOT EXECUTED
disktab_size = new_size;
23f4: e8830180 stm r3, {r7, r8} <== NOT EXECUTED
}
if (disktab [major].minor == NULL || minor >= disktab[major].size) {
23f8: e59f3110 ldr r3, [pc, #272] ; 2510 <create_disk+0x178>
23fc: e5938004 ldr r8, [r3, #4]
2400: e7980184 ldr r0, [r8, r4, lsl #3]
2404: e0889184 add r9, r8, r4, lsl #3
2408: e3500000 cmp r0, #0
240c: e599b004 ldr fp, [r9, #4]
2410: 0a000001 beq 241c <create_disk+0x84>
2414: e155000b cmp r5, fp
2418: 3a00000f bcc 245c <create_disk+0xc4>
rtems_disk_device **table = disktab [major].minor;
rtems_device_minor_number old_size = disktab [major].size;
rtems_device_minor_number new_size = 0;
if (old_size == 0) {
241c: e35b0000 cmp fp, #0
new_size = DISKTAB_INITIAL_SIZE;
} else {
new_size = 2 * old_size;
2420: 11a0708b lslne r7, fp, #1
rtems_disk_device **table = disktab [major].minor;
rtems_device_minor_number old_size = disktab [major].size;
rtems_device_minor_number new_size = 0;
if (old_size == 0) {
new_size = DISKTAB_INITIAL_SIZE;
2424: 03a07008 moveq r7, #8
} else {
new_size = 2 * old_size;
}
if (minor >= new_size) {
2428: e1550007 cmp r5, r7
new_size = minor + 1;
242c: 22857001 addcs r7, r5, #1
}
table = realloc(table, new_size * sizeof(*table));
2430: e1a01107 lsl r1, r7, #2
2434: eb0007c3 bl 4348 <realloc>
if (table == NULL) {
2438: e250a000 subs sl, r0, #0
243c: 0a00002a beq 24ec <create_disk+0x154>
return NULL;
}
memset(table + old_size, 0, (new_size - old_size) * sizeof(*table));
2440: e06b2007 rsb r2, fp, r7
2444: e08a010b add r0, sl, fp, lsl #2
2448: e3a01000 mov r1, #0
244c: e1a02102 lsl r2, r2, #2
2450: eb003ef8 bl 12038 <memset>
disktab [major].minor = table;
2454: e788a184 str sl, [r8, r4, lsl #3]
disktab [major].size = new_size;
2458: e5897004 str r7, [r9, #4]
}
return disktab [major].minor + minor;
245c: e7987184 ldr r7, [r8, r4, lsl #3]
2460: e0873105 add r3, r7, r5, lsl #2
{
rtems_disk_device **dd_entry = create_disk_table_entry(dev);
rtems_disk_device *dd = NULL;
char *alloc_name = NULL;
if (dd_entry == NULL) {
2464: e3530000 cmp r3, #0
2468: 0a00001f beq 24ec <create_disk+0x154>
return RTEMS_NO_MEMORY;
}
if (*dd_entry != NULL) {
246c: e7973105 ldr r3, [r7, r5, lsl #2]
2470: e3530000 cmp r3, #0
return RTEMS_RESOURCE_IN_USE;
2474: 13a0000c movne r0, #12
if (dd_entry == NULL) {
return RTEMS_NO_MEMORY;
}
if (*dd_entry != NULL) {
2478: 1a00001c bne 24f0 <create_disk+0x158>
return RTEMS_RESOURCE_IN_USE;
}
dd = malloc(sizeof(*dd));
247c: e3a00074 mov r0, #116 ; 0x74
2480: eb000518 bl 38e8 <malloc>
if (dd == NULL) {
2484: e2508000 subs r8, r0, #0
2488: 0a000017 beq 24ec <create_disk+0x154>
return RTEMS_NO_MEMORY;
}
if (name != NULL) {
248c: e3560000 cmp r6, #0
2490: 0a00000d beq 24cc <create_disk+0x134>
alloc_name = strdup(name);
2494: e1a00006 mov r0, r6
2498: eb00409a bl 12708 <strdup>
if (alloc_name == NULL) {
249c: e250a000 subs sl, r0, #0
if (dd == NULL) {
return RTEMS_NO_MEMORY;
}
if (name != NULL) {
alloc_name = strdup(name);
24a0: e1a06000 mov r6, r0
if (alloc_name == NULL) {
24a4: 1a000012 bne 24f4 <create_disk+0x15c>
free(dd);
24a8: e1a00008 mov r0, r8 <== NOT EXECUTED
24ac: eb0003df bl 3430 <free> <== NOT EXECUTED
24b0: ea00000d b 24ec <create_disk+0x154> <== NOT EXECUTED
}
}
if (name != NULL) {
if (mknod(alloc_name, 0777 | S_IFBLK, dev) < 0) {
free(alloc_name);
24b4: e1a00006 mov r0, r6 <== NOT EXECUTED
24b8: eb0003dc bl 3430 <free> <== NOT EXECUTED
free(dd);
24bc: e1a00008 mov r0, r8 <== NOT EXECUTED
24c0: eb0003da bl 3430 <free> <== NOT EXECUTED
return RTEMS_UNSATISFIED;
24c4: e3a0000d mov r0, #13 <== NOT EXECUTED
24c8: ea000008 b 24f0 <create_disk+0x158> <== NOT EXECUTED
char **alloc_name_ptr
)
{
rtems_disk_device **dd_entry = create_disk_table_entry(dev);
rtems_disk_device *dd = NULL;
char *alloc_name = NULL;
24cc: e1a0a006 mov sl, r6
return RTEMS_UNSATISFIED;
}
}
*dd_entry = dd;
*dd_ptr = dd;
24d0: e59d3000 ldr r3, [sp]
free(dd);
return RTEMS_UNSATISFIED;
}
}
*dd_entry = dd;
24d4: e7878105 str r8, [r7, r5, lsl #2]
*dd_ptr = dd;
24d8: e5838000 str r8, [r3]
*alloc_name_ptr = alloc_name;
24dc: e59d3028 ldr r3, [sp, #40] ; 0x28
return RTEMS_SUCCESSFUL;
24e0: e3a00000 mov r0, #0
}
}
*dd_entry = dd;
*dd_ptr = dd;
*alloc_name_ptr = alloc_name;
24e4: e583a000 str sl, [r3]
return RTEMS_SUCCESSFUL;
24e8: ea000000 b 24f0 <create_disk+0x158>
return RTEMS_RESOURCE_IN_USE;
}
dd = malloc(sizeof(*dd));
if (dd == NULL) {
return RTEMS_NO_MEMORY;
24ec: e3a0001a mov r0, #26
*dd_entry = dd;
*dd_ptr = dd;
*alloc_name_ptr = alloc_name;
return RTEMS_SUCCESSFUL;
}
24f0: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
return RTEMS_NO_MEMORY;
}
}
if (name != NULL) {
if (mknod(alloc_name, 0777 | S_IFBLK, dev) < 0) {
24f4: e59f1018 ldr r1, [pc, #24] ; 2514 <create_disk+0x17c>
24f8: e1a02004 mov r2, r4
24fc: e1a03005 mov r3, r5
2500: eb000554 bl 3a58 <mknod>
2504: e3500000 cmp r0, #0
2508: aafffff0 bge 24d0 <create_disk+0x138>
250c: eaffffe8 b 24b4 <create_disk+0x11c> <== NOT EXECUTED
0000a9d8 <devFS_eval_path>:
static inline const devFS_data *devFS_get_data(
const rtems_filesystem_location_info_t *loc
)
{
return (const devFS_data *) loc->mt_entry->immutable_fs_info;
a9d8: e590302c ldr r3, [r0, #44] ; 0x2c
a9dc: e5933010 ldr r3, [r3, #16]
}
void devFS_eval_path(
rtems_filesystem_eval_path_context_t *ctx
)
{
a9e0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
{
size_t i = 0;
size_t n = data->count;
devFS_node *nodes = data->nodes;
devFS_node *node = NULL;
devFS_node *free_node = NULL;
a9e4: e3a05000 mov r5, #0
}
void devFS_eval_path(
rtems_filesystem_eval_path_context_t *ctx
)
{
a9e8: e1a04000 mov r4, r0
static inline const char *rtems_filesystem_eval_path_get_path(
rtems_filesystem_eval_path_context_t *ctx
)
{
return ctx->path;
a9ec: e5909000 ldr r9, [r0]
static inline size_t rtems_filesystem_eval_path_get_pathlen(
rtems_filesystem_eval_path_context_t *ctx
)
{
return ctx->pathlen;
a9f0: e5908004 ldr r8, [r0, #4]
size_t pathlen,
devFS_node **free_node_ptr
)
{
size_t i = 0;
size_t n = data->count;
a9f4: e8930880 ldm r3, {r7, fp}
devFS_node *nodes = data->nodes;
devFS_node *node = NULL;
a9f8: e1a06005 mov r6, r5
devFS_node *free_node = NULL;
for (i = 0; (free_node == NULL || node == NULL) && i < n; ++i) {
a9fc: e1a0a005 mov sl, r5
aa00: ea000010 b aa48 <devFS_eval_path+0x70>
devFS_node *current = nodes + i;
if (current->name != NULL) {
aa04: e5970000 ldr r0, [r7]
aa08: e3500000 cmp r0, #0
devFS_node *nodes = data->nodes;
devFS_node *node = NULL;
devFS_node *free_node = NULL;
for (i = 0; (free_node == NULL || node == NULL) && i < n; ++i) {
devFS_node *current = nodes + i;
aa0c: e1a03007 mov r3, r7
if (current->name != NULL) {
aa10: 0a000009 beq aa3c <devFS_eval_path+0x64>
if (
aa14: e5973004 ldr r3, [r7, #4]
aa18: e1530008 cmp r3, r8
aa1c: 11a03005 movne r3, r5
aa20: 1a000005 bne aa3c <devFS_eval_path+0x64>
current->namelen == pathlen
&& memcmp(current->name, path, pathlen) == 0
aa24: e1a01009 mov r1, r9
aa28: e1a02008 mov r2, r8
aa2c: eb000cca bl dd5c <memcmp>
aa30: e3500000 cmp r0, #0
aa34: e1a03005 mov r3, r5
aa38: 01a06007 moveq r6, r7
size_t n = data->count;
devFS_node *nodes = data->nodes;
devFS_node *node = NULL;
devFS_node *free_node = NULL;
for (i = 0; (free_node == NULL || node == NULL) && i < n; ++i) {
aa3c: e28aa001 add sl, sl, #1
aa40: e2877014 add r7, r7, #20
aa44: e1a05003 mov r5, r3
aa48: e3550000 cmp r5, #0
aa4c: 13560000 cmpne r6, #0
aa50: 1a000001 bne aa5c <devFS_eval_path+0x84>
aa54: e15a000b cmp sl, fp
aa58: 1affffe9 bne aa04 <devFS_eval_path+0x2c>
rtems_filesystem_eval_path_get_pathlen(ctx),
&free_node
);
int eval_flags = rtems_filesystem_eval_path_get_flags(ctx);
if (node != NULL) {
aa5c: e3560000 cmp r6, #0
static inline int rtems_filesystem_eval_path_get_flags(
const rtems_filesystem_eval_path_context_t *ctx
)
{
return ctx->flags;
aa60: e5943010 ldr r3, [r4, #16]
aa64: 0a000006 beq aa84 <devFS_eval_path+0xac>
if ((eval_flags & RTEMS_FS_EXCLUSIVE) == 0) {
aa68: e2133040 ands r3, r3, #64 ; 0x40
currentloc->node_access = node;
aa6c: 05846020 streq r6, [r4, #32]
static inline void rtems_filesystem_eval_path_clear_path(
rtems_filesystem_eval_path_context_t *ctx
)
{
ctx->pathlen = 0;
aa70: 05843004 streq r3, [r4, #4]
rtems_filesystem_eval_path_clear_path(ctx);
} else {
rtems_filesystem_eval_path_error(ctx, EEXIST);
aa74: 11a00004 movne r0, r4
aa78: 13a01011 movne r1, #17
&free_node
);
int eval_flags = rtems_filesystem_eval_path_get_flags(ctx);
if (node != NULL) {
if ((eval_flags & RTEMS_FS_EXCLUSIVE) == 0) {
aa7c: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
aa80: ea00000f b aac4 <devFS_eval_path+0xec>
rtems_filesystem_eval_path_clear_path(ctx);
} else {
rtems_filesystem_eval_path_error(ctx, EEXIST);
}
} else {
if ((eval_flags & RTEMS_FS_MAKE) != 0) {
aa84: e3130020 tst r3, #32
aa88: 0a00000b beq aabc <devFS_eval_path+0xe4>
if (free_node != NULL) {
aa8c: e3550000 cmp r5, #0
aa90: 0a000006 beq aab0 <devFS_eval_path+0xd8>
free_node->mode = S_IRWXU | S_IRWXG | S_IRWXO;
aa94: e59f3030 ldr r3, [pc, #48] ; aacc <devFS_eval_path+0xf4>
aa98: e5853010 str r3, [r5, #16]
currentloc->node_access = free_node;
aa9c: e5845020 str r5, [r4, #32]
rtems_filesystem_eval_path_context_t *ctx,
const char *token,
size_t tokenlen
)
{
ctx->token = token;
aaa0: e5849008 str r9, [r4, #8]
ctx->tokenlen = tokenlen;
aaa4: e584800c str r8, [r4, #12]
static inline void rtems_filesystem_eval_path_clear_path(
rtems_filesystem_eval_path_context_t *ctx
)
{
ctx->pathlen = 0;
aaa8: e5846004 str r6, [r4, #4]
aaac: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
rtems_filesystem_eval_path_get_path(ctx),
rtems_filesystem_eval_path_get_pathlen(ctx)
);
rtems_filesystem_eval_path_clear_path(ctx);
} else {
rtems_filesystem_eval_path_error(ctx, ENOSPC);
aab0: e1a00004 mov r0, r4
aab4: e3a0101c mov r1, #28
aab8: ea000001 b aac4 <devFS_eval_path+0xec>
}
} else {
rtems_filesystem_eval_path_error(ctx, ENOENT);
aabc: e1a00004 mov r0, r4 <== NOT EXECUTED
aac0: e3a01002 mov r1, #2 <== NOT EXECUTED
}
}
}
aac4: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_filesystem_eval_path_clear_path(ctx);
} else {
rtems_filesystem_eval_path_error(ctx, ENOSPC);
}
} else {
rtems_filesystem_eval_path_error(ctx, ENOENT);
aac8: eaffe5fb b 42bc <rtems_filesystem_eval_path_error>
00002368 <disk_unlock>:
static void
disk_unlock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
diskdevs_protected = false;
2368: e59f3020 ldr r3, [pc, #32] ; 2390 <disk_unlock+0x28>
236c: e3a02000 mov r2, #0
}
}
static void
disk_unlock(void)
{
2370: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_status_code sc = RTEMS_SUCCESSFUL;
diskdevs_protected = false;
sc = rtems_semaphore_release(diskdevs_mutex);
2374: e5930008 ldr r0, [r3, #8]
static void
disk_unlock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
diskdevs_protected = false;
2378: e5c3200c strb r2, [r3, #12]
sc = rtems_semaphore_release(diskdevs_mutex);
237c: eb001403 bl 7390 <rtems_semaphore_release>
if (sc != RTEMS_SUCCESSFUL) {
2380: e3500000 cmp r0, #0
2384: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
/* FIXME: Error number */
rtems_fatal_error_occurred(0xdeadbeef);
2388: e59f0004 ldr r0, [pc, #4] ; 2394 <disk_unlock+0x2c> <== NOT EXECUTED
238c: eb00156b bl 7940 <rtems_fatal_error_occurred> <== NOT EXECUTED
00003d9c <drainOutput.part.0>:
/*
* Drain output queue
*/
static void
drainOutput (struct rtems_termios_tty *tty)
3d9c: e92d4030 push {r4, r5, lr}
3da0: e1a04000 mov r4, r0
{
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
rtems_interrupt_disable (level);
3da4: ebffff6e bl 3b64 <arm_interrupt_disable>
while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) {
tty->rawOutBufState = rob_wait;
3da8: e3a05002 mov r5, #2
3dac: ea000008 b 3dd4 <drainOutput.part.0+0x38>
3db0: e5845094 str r5, [r4, #148] ; 0x94 <== NOT EXECUTED
3db4: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
rtems_interrupt_enable (level);
sc = rtems_semaphore_obtain(
3db8: e3a01000 mov r1, #0 <== NOT EXECUTED
3dbc: e594008c ldr r0, [r4, #140] ; 0x8c <== NOT EXECUTED
3dc0: e1a02001 mov r2, r1 <== NOT EXECUTED
3dc4: eb000876 bl 5fa4 <rtems_semaphore_obtain> <== NOT EXECUTED
tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
3dc8: e3500000 cmp r0, #0 <== NOT EXECUTED
rtems_fatal_error_occurred (sc);
3dcc: 1b000a3f blne 66d0 <rtems_fatal_error_occurred> <== NOT EXECUTED
rtems_interrupt_disable (level);
3dd0: ebffff63 bl 3b64 <arm_interrupt_disable> <== 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) {
3dd4: e5942084 ldr r2, [r4, #132] ; 0x84
3dd8: e5943080 ldr r3, [r4, #128] ; 0x80
3ddc: e1520003 cmp r2, r3
3de0: 1afffff2 bne 3db0 <drainOutput.part.0+0x14>
3de4: e129f000 msr CPSR_fc, r0
rtems_fatal_error_occurred (sc);
rtems_interrupt_disable (level);
}
rtems_interrupt_enable (level);
}
}
3de8: e8bd8030 pop {r4, r5, pc}
00004af0 <erase>:
* FIXME: Some of the tests should check for IEXTEN, too.
*/
static void
erase (struct rtems_termios_tty *tty, int lineFlag)
{
if (tty->ccount == 0)
4af0: e5903020 ldr r3, [r0, #32]
4af4: e3530000 cmp r3, #0
* 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)
{
4af8: e92d41f0 push {r4, r5, r6, r7, r8, lr}
4afc: e1a04000 mov r4, r0
4b00: e1a07001 mov r7, r1
if (tty->ccount == 0)
4b04: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc}
return;
if (lineFlag) {
4b08: e3510000 cmp r1, #0
4b0c: 0a000060 beq 4c94 <erase+0x1a4>
if (!(tty->termios.c_lflag & ECHO)) {
4b10: e590303c ldr r3, [r0, #60] ; 0x3c
4b14: e2132008 ands r2, r3, #8
tty->ccount = 0;
4b18: 05802020 streq r2, [r0, #32]
erase (struct rtems_termios_tty *tty, int lineFlag)
{
if (tty->ccount == 0)
return;
if (lineFlag) {
if (!(tty->termios.c_lflag & ECHO)) {
4b1c: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc}
tty->ccount = 0;
return;
}
if (!(tty->termios.c_lflag & ECHOE)) {
4b20: e2133010 ands r3, r3, #16
4b24: 1a00005a bne 4c94 <erase+0x1a4>
tty->ccount = 0;
4b28: e5803020 str r3, [r0, #32] <== NOT EXECUTED
echo (tty->termios.c_cc[VKILL], tty);
4b2c: e1a01004 mov r1, r4 <== NOT EXECUTED
4b30: e5d00044 ldrb r0, [r0, #68] ; 0x44 <== NOT EXECUTED
4b34: ebffffca bl 4a64 <echo> <== NOT EXECUTED
if (tty->termios.c_lflag & ECHOK)
4b38: e594303c ldr r3, [r4, #60] ; 0x3c <== NOT EXECUTED
4b3c: e3130020 tst r3, #32 <== NOT EXECUTED
echo ('\n', tty);
4b40: 13a0000a movne r0, #10 <== NOT EXECUTED
return;
}
if (!(tty->termios.c_lflag & ECHOE)) {
tty->ccount = 0;
echo (tty->termios.c_cc[VKILL], tty);
if (tty->termios.c_lflag & ECHOK)
4b44: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
4b48: ea00000b b 4b7c <erase+0x8c> <== NOT EXECUTED
return;
}
}
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
4b4c: e2411001 sub r1, r1, #1
if (tty->termios.c_lflag & ECHO) {
4b50: e594303c ldr r3, [r4, #60] ; 0x3c
return;
}
}
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
4b54: e594001c ldr r0, [r4, #28]
4b58: e5841020 str r1, [r4, #32]
if (tty->termios.c_lflag & ECHO) {
4b5c: e3130008 tst r3, #8
return;
}
}
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
4b60: e7d05001 ldrb r5, [r0, r1]
if (tty->termios.c_lflag & ECHO) {
4b64: 0a000047 beq 4c88 <erase+0x198>
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
4b68: e3570000 cmp r7, #0
4b6c: 1a000005 bne 4b88 <erase+0x98>
4b70: e3130010 tst r3, #16
4b74: 1a000003 bne 4b88 <erase+0x98>
echo (tty->termios.c_cc[VERASE], tty);
4b78: e5d40043 ldrb r0, [r4, #67] ; 0x43 <== NOT EXECUTED
4b7c: e1a01004 mov r1, r4 <== NOT EXECUTED
}
}
if (!lineFlag)
break;
}
}
4b80: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
while (tty->ccount) {
unsigned char c = tty->cbuf[--tty->ccount];
if (tty->termios.c_lflag & ECHO) {
if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) {
echo (tty->termios.c_cc[VERASE], tty);
4b84: eaffffb6 b 4a64 <echo> <== NOT EXECUTED
} else if (c == '\t') {
4b88: e3550009 cmp r5, #9
4b8c: 1a00001f bne 4c10 <erase+0x120>
int col = tty->read_start_column;
4b90: e594502c ldr r5, [r4, #44] ; 0x2c
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
if (c == '\t') {
col = (col | 7) + 1;
} else if (iscntrl (c)) {
4b94: e5968000 ldr r8, [r6]
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;
4b98: e3a02000 mov r2, #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)
4b9c: e2033c02 and r3, r3, #512 ; 0x200
4ba0: ea00000c b 4bd8 <erase+0xe8>
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
4ba4: e7d0c002 ldrb ip, [r0, r2]
if (c == '\t') {
4ba8: e35c0009 cmp ip, #9
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
4bac: e2822001 add r2, r2, #1
if (c == '\t') {
col = (col | 7) + 1;
4bb0: 03855007 orreq r5, r5, #7
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
c = tty->cbuf[i++];
if (c == '\t') {
4bb4: 0a000006 beq 4bd4 <erase+0xe4>
col = (col | 7) + 1;
} else if (iscntrl (c)) {
4bb8: e088c00c add ip, r8, ip
4bbc: e5dcc001 ldrb ip, [ip, #1]
4bc0: e31c0020 tst ip, #32
4bc4: 0a000002 beq 4bd4 <erase+0xe4>
if (tty->termios.c_lflag & ECHOCTL)
4bc8: e3530000 cmp r3, #0 <== NOT EXECUTED
col += 2;
4bcc: 12855002 addne r5, r5, #2 <== NOT EXECUTED
4bd0: ea000000 b 4bd8 <erase+0xe8> <== NOT EXECUTED
} else {
col++;
4bd4: e2855001 add r5, r5, #1
int i = 0;
/*
* Find the character before the tab
*/
while (i != tty->ccount) {
4bd8: e1520001 cmp r2, r1
4bdc: 1afffff0 bne 4ba4 <erase+0xb4>
4be0: ea000006 b 4c00 <erase+0x110>
/*
* Back up over the tab
*/
while (tty->column > col) {
rtems_termios_puts ("\b", 1, tty);
4be4: e59f00bc ldr r0, [pc, #188] ; 4ca8 <erase+0x1b8>
4be8: e3a01001 mov r1, #1
4bec: e1a02004 mov r2, r4
4bf0: ebffff0a bl 4820 <rtems_termios_puts>
tty->column--;
4bf4: e5943028 ldr r3, [r4, #40] ; 0x28
4bf8: e2433001 sub r3, r3, #1
4bfc: e5843028 str r3, [r4, #40] ; 0x28
}
/*
* Back up over the tab
*/
while (tty->column > col) {
4c00: e5943028 ldr r3, [r4, #40] ; 0x28
4c04: e1530005 cmp r3, r5
4c08: cafffff5 bgt 4be4 <erase+0xf4>
4c0c: ea00001d b 4c88 <erase+0x198>
rtems_termios_puts ("\b", 1, tty);
tty->column--;
}
}
else {
if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) {
4c10: e5962000 ldr r2, [r6]
4c14: e2855001 add r5, r5, #1
4c18: e7d22005 ldrb r2, [r2, r5]
4c1c: e3120020 tst r2, #32
4c20: 0a000009 beq 4c4c <erase+0x15c>
4c24: e3130c02 tst r3, #512 ; 0x200 <== NOT EXECUTED
4c28: 0a000007 beq 4c4c <erase+0x15c> <== NOT EXECUTED
rtems_termios_puts ("\b \b", 3, tty);
4c2c: e59f0078 ldr r0, [pc, #120] ; 4cac <erase+0x1bc> <== NOT EXECUTED
4c30: e3a01003 mov r1, #3 <== NOT EXECUTED
4c34: e1a02004 mov r2, r4 <== NOT EXECUTED
4c38: ebfffef8 bl 4820 <rtems_termios_puts> <== NOT EXECUTED
if (tty->column)
4c3c: e5943028 ldr r3, [r4, #40] ; 0x28 <== NOT EXECUTED
4c40: e3530000 cmp r3, #0 <== NOT EXECUTED
tty->column--;
4c44: 12433001 subne r3, r3, #1 <== NOT EXECUTED
4c48: 15843028 strne r3, [r4, #40] ; 0x28 <== NOT EXECUTED
}
if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) {
4c4c: e5963000 ldr r3, [r6]
4c50: e7d33005 ldrb r3, [r3, r5]
4c54: e3130020 tst r3, #32
4c58: 0a000002 beq 4c68 <erase+0x178>
4c5c: e594303c ldr r3, [r4, #60] ; 0x3c <== NOT EXECUTED
4c60: e3130c02 tst r3, #512 ; 0x200 <== NOT EXECUTED
4c64: 0a000007 beq 4c88 <erase+0x198> <== NOT EXECUTED
rtems_termios_puts ("\b \b", 3, tty);
4c68: e59f003c ldr r0, [pc, #60] ; 4cac <erase+0x1bc>
4c6c: e3a01003 mov r1, #3
4c70: e1a02004 mov r2, r4
4c74: ebfffee9 bl 4820 <rtems_termios_puts>
if (tty->column)
4c78: e5943028 ldr r3, [r4, #40] ; 0x28
4c7c: e3530000 cmp r3, #0
tty->column--;
4c80: 12433001 subne r3, r3, #1
4c84: 15843028 strne r3, [r4, #40] ; 0x28
}
}
}
if (!lineFlag)
4c88: e3570000 cmp r7, #0
4c8c: 1a000001 bne 4c98 <erase+0x1a8>
4c90: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
4c94: e59f6014 ldr r6, [pc, #20] ; 4cb0 <erase+0x1c0>
echo ('\n', tty);
return;
}
}
while (tty->ccount) {
4c98: e5941020 ldr r1, [r4, #32]
4c9c: e3510000 cmp r1, #0
4ca0: 1affffa9 bne 4b4c <erase+0x5c>
4ca4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
00010d54 <fat_buf_access>:
int
fat_buf_access(fat_fs_info_t *fs_info,
const uint32_t sec_num,
const int op_type,
uint8_t **sec_buf)
{
10d54: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
10d58: e1a0a003 mov sl, r3
static inline uint32_t
fat_sector_num_to_block_num (const fat_fs_info_t *fs_info,
const uint32_t sector_number)
{
return sector_number >> (fs_info->vol.bytes_per_block_log2 - fs_info->vol.sec_log2);
10d5c: e5d07002 ldrb r7, [r0, #2]
10d60: e5d0800c ldrb r8, [r0, #12]
sec_num);
uint32_t blk_ofs = fat_sector_offset_to_block_offset (fs_info,
sec_num,
0);
if (fs_info->c.state == FAT_CACHE_EMPTY || fs_info->c.blk_num != sec_num)
10d64: e5d03089 ldrb r3, [r0, #137] ; 0x89
10d68: e0678008 rsb r8, r7, r8
10d6c: e3530000 cmp r3, #0
int
fat_buf_access(fat_fs_info_t *fs_info,
const uint32_t sec_num,
const int op_type,
uint8_t **sec_buf)
{
10d70: e1a04000 mov r4, r0
10d74: e1a05001 mov r5, r1
10d78: e1a09002 mov r9, r2
10d7c: e1a06831 lsr r6, r1, r8
sec_num);
uint32_t blk_ofs = fat_sector_offset_to_block_offset (fs_info,
sec_num,
0);
if (fs_info->c.state == FAT_CACHE_EMPTY || fs_info->c.blk_num != sec_num)
10d80: 0a000002 beq 10d90 <fat_buf_access+0x3c>
10d84: e5903084 ldr r3, [r0, #132] ; 0x84
10d88: e1530001 cmp r3, r1
10d8c: 0a000014 beq 10de4 <fat_buf_access+0x90>
{
fat_buf_release(fs_info);
10d90: e1a00004 mov r0, r4
10d94: ebffff8b bl 10bc8 <fat_buf_release>
if (op_type == FAT_OP_TYPE_READ)
10d98: e3590001 cmp r9, #1
sc = rtems_bdbuf_read(fs_info->vol.dd, blk, &fs_info->c.buf);
10d9c: e5940064 ldr r0, [r4, #100] ; 0x64
10da0: e1a01006 mov r1, r6
10da4: e284208c add r2, r4, #140 ; 0x8c
if (fs_info->c.state == FAT_CACHE_EMPTY || fs_info->c.blk_num != sec_num)
{
fat_buf_release(fs_info);
if (op_type == FAT_OP_TYPE_READ)
10da8: 1a000001 bne 10db4 <fat_buf_access+0x60>
sc = rtems_bdbuf_read(fs_info->vol.dd, blk, &fs_info->c.buf);
10dac: ebfff829 bl ee58 <rtems_bdbuf_read>
10db0: ea000000 b 10db8 <fat_buf_access+0x64>
else
sc = rtems_bdbuf_get(fs_info->vol.dd, blk, &fs_info->c.buf);
10db4: ebfff7f6 bl ed94 <rtems_bdbuf_get>
if (sc != RTEMS_SUCCESSFUL)
10db8: e3500000 cmp r0, #0
10dbc: 0a000004 beq 10dd4 <fat_buf_access+0x80>
rtems_set_errno_and_return_minus_one(EIO);
10dc0: eb001ea8 bl 18868 <__errno> <== NOT EXECUTED
10dc4: e3a03005 mov r3, #5 <== NOT EXECUTED
10dc8: e5803000 str r3, [r0] <== NOT EXECUTED
10dcc: e3e00000 mvn r0, #0 <== NOT EXECUTED
10dd0: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} <== NOT EXECUTED
fs_info->c.blk_num = sec_num;
fs_info->c.modified = 0;
fs_info->c.state = FAT_CACHE_ACTUAL;
10dd4: e3a03001 mov r3, #1
sc = rtems_bdbuf_read(fs_info->vol.dd, blk, &fs_info->c.buf);
else
sc = rtems_bdbuf_get(fs_info->vol.dd, blk, &fs_info->c.buf);
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
fs_info->c.blk_num = sec_num;
10dd8: e5845084 str r5, [r4, #132] ; 0x84
fs_info->c.modified = 0;
10ddc: e5c40088 strb r0, [r4, #136] ; 0x88
fs_info->c.state = FAT_CACHE_ACTUAL;
10de0: e5c43089 strb r3, [r4, #137] ; 0x89
fat_sector_offset_to_block_offset (const fat_fs_info_t *fs_info,
const uint32_t sector,
const uint32_t sector_offset)
{
return sector_offset +
((sector -
10de4: e0455816 sub r5, r5, r6, lsl r8
}
*sec_buf = &fs_info->c.buf->buffer[blk_ofs];
10de8: e594308c ldr r3, [r4, #140] ; 0x8c
10dec: e593301c ldr r3, [r3, #28]
10df0: e0837715 add r7, r3, r5, lsl r7
return RC_OK;
10df4: e3a00000 mov r0, #0
rtems_set_errno_and_return_minus_one(EIO);
fs_info->c.blk_num = sec_num;
fs_info->c.modified = 0;
fs_info->c.state = FAT_CACHE_ACTUAL;
}
*sec_buf = &fs_info->c.buf->buffer[blk_ofs];
10df8: e58a7000 str r7, [sl]
return RC_OK;
}
10dfc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
00010bc8 <fat_buf_release>:
return RC_OK;
}
int
fat_buf_release(fat_fs_info_t *fs_info)
{
10bc8: e92d4071 push {r0, r4, r5, r6, lr}
10bcc: e1a04000 mov r4, r0
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (fs_info->c.state == FAT_CACHE_EMPTY)
10bd0: e5d00089 ldrb r0, [r0, #137] ; 0x89
10bd4: e3500000 cmp r0, #0
10bd8: 0a00005c beq 10d50 <fat_buf_release+0x188>
return RC_OK;
if (fs_info->c.modified)
10bdc: e5d43088 ldrb r3, [r4, #136] ; 0x88
10be0: e3530000 cmp r3, #0
10be4: 0a00004e beq 10d24 <fat_buf_release+0x15c>
{
uint32_t sec_num = fs_info->c.blk_num;
10be8: e5942084 ldr r2, [r4, #132] ; 0x84
bool sec_of_fat = ((sec_num >= fs_info->vol.fat_loc) &&
10bec: e1d431b8 ldrh r3, [r4, #24]
10bf0: e1520003 cmp r2, r3
10bf4: 33a05000 movcc r5, #0
10bf8: 3a000003 bcc 10c0c <fat_buf_release+0x44>
10bfc: e5945020 ldr r5, [r4, #32]
10c00: e1520005 cmp r2, r5
10c04: 23a05000 movcs r5, #0
10c08: 33a05001 movcc r5, #1
uint32_t blk = fat_sector_num_to_block_num(fs_info, sec_num);
uint32_t blk_ofs = fat_sector_offset_to_block_offset(fs_info,
sec_num,
0);
if (sec_of_fat && !fs_info->vol.mirror)
10c0c: e21550ff ands r5, r5, #255 ; 0xff
uint32_t ino
)
{
return (ino >= fs_info->uino_base);
}
10c10: e5d43002 ldrb r3, [r4, #2]
10c14: e5d4100c ldrb r1, [r4, #12]
uint32_t blk = fat_sector_num_to_block_num(fs_info, sec_num);
uint32_t blk_ofs = fat_sector_offset_to_block_offset(fs_info,
sec_num,
0);
if (sec_of_fat && !fs_info->vol.mirror)
10c18: 0a00000b beq 10c4c <fat_buf_release+0x84>
10c1c: e5d40054 ldrb r0, [r4, #84] ; 0x54
10c20: e3500000 cmp r0, #0
10c24: 1a000008 bne 10c4c <fat_buf_release+0x84>
10c28: e0631001 rsb r1, r3, r1
10c2c: e1a0c132 lsr ip, r2, r1
fat_sector_offset_to_block_offset (const fat_fs_info_t *fs_info,
const uint32_t sector,
const uint32_t sector_offset)
{
return sector_offset +
((sector -
10c30: e042111c sub r1, r2, ip, lsl r1
memcpy(fs_info->sec_buf,
fs_info->c.buf->buffer + blk_ofs,
10c34: e594008c ldr r0, [r4, #140] ; 0x8c
uint32_t blk_ofs = fat_sector_offset_to_block_offset(fs_info,
sec_num,
0);
if (sec_of_fat && !fs_info->vol.mirror)
memcpy(fs_info->sec_buf,
10c38: e590201c ldr r2, [r0, #28]
10c3c: e5940090 ldr r0, [r4, #144] ; 0x90
10c40: e0821311 add r1, r2, r1, lsl r3
10c44: e1d420b0 ldrh r2, [r4]
10c48: eb0021ad bl 19304 <memcpy>
fs_info->c.buf->buffer + blk_ofs,
fs_info->vol.bps);
sc = rtems_bdbuf_release_modified(fs_info->c.buf);
10c4c: e594008c ldr r0, [r4, #140] ; 0x8c
10c50: ebfff923 bl f0e4 <rtems_bdbuf_release_modified>
if (sc != RTEMS_SUCCESSFUL)
10c54: e3500000 cmp r0, #0
10c58: 1a000035 bne 10d34 <fat_buf_release+0x16c>
rtems_set_errno_and_return_minus_one(EIO);
fs_info->c.modified = 0;
if (sec_of_fat && !fs_info->vol.mirror)
10c5c: e3550000 cmp r5, #0
fs_info->vol.bps);
sc = rtems_bdbuf_release_modified(fs_info->c.buf);
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
fs_info->c.modified = 0;
10c60: e5c40088 strb r0, [r4, #136] ; 0x88
if (sec_of_fat && !fs_info->vol.mirror)
10c64: 0a000037 beq 10d48 <fat_buf_release+0x180>
10c68: e5d43054 ldrb r3, [r4, #84] ; 0x54
10c6c: e3530000 cmp r3, #0
10c70: 03a05001 moveq r5, #1
10c74: 0a000026 beq 10d14 <fat_buf_release+0x14c>
10c78: ea000032 b 10d48 <fat_buf_release+0x180> <== NOT EXECUTED
for (i = 1; i < fs_info->vol.fats; i++)
{
rtems_bdbuf_buffer *bd;
sec_num = fs_info->c.blk_num + fs_info->vol.fat_length * i,
10c7c: e5943084 ldr r3, [r4, #132] ; 0x84
10c80: e594601c ldr r6, [r4, #28]
10c84: e0263695 mla r6, r5, r6, r3
static inline uint32_t
fat_sector_num_to_block_num (const fat_fs_info_t *fs_info,
const uint32_t sector_number)
{
return sector_number >> (fs_info->vol.bytes_per_block_log2 - fs_info->vol.sec_log2);
10c88: e5d4200c ldrb r2, [r4, #12]
10c8c: e5d43002 ldrb r3, [r4, #2]
10c90: e0632002 rsb r2, r3, r2
10c94: e1a01236 lsr r1, r6, r2
fat_sector_offset_to_block_offset (const fat_fs_info_t *fs_info,
const uint32_t sector,
const uint32_t sector_offset)
{
return sector_offset +
((sector -
10c98: e0466211 sub r6, r6, r1, lsl r2
blk = fat_sector_num_to_block_num(fs_info, sec_num);
blk_ofs = fat_sector_offset_to_block_offset(fs_info,
sec_num,
0);
if (blk_ofs == 0
10c9c: e1b06316 lsls r6, r6, r3
10ca0: 1a000007 bne 10cc4 <fat_buf_release+0xfc>
&& fs_info->vol.bps == fs_info->vol.bytes_per_block)
10ca4: e1d420b0 ldrh r2, [r4]
10ca8: e1d430ba ldrh r3, [r4, #10]
10cac: e1520003 cmp r2, r3
10cb0: 1a000003 bne 10cc4 <fat_buf_release+0xfc>
{
sc = rtems_bdbuf_get(fs_info->vol.dd, blk, &bd);
10cb4: e5940064 ldr r0, [r4, #100] ; 0x64
10cb8: e1a0200d mov r2, sp
10cbc: ebfff834 bl ed94 <rtems_bdbuf_get>
10cc0: ea000002 b 10cd0 <fat_buf_release+0x108>
}
else
{
sc = rtems_bdbuf_read(fs_info->vol.dd, blk, &bd);
10cc4: e5940064 ldr r0, [r4, #100] ; 0x64
10cc8: e1a0200d mov r2, sp
10ccc: ebfff861 bl ee58 <rtems_bdbuf_read>
}
if ( sc != RTEMS_SUCCESSFUL)
10cd0: e3500000 cmp r0, #0
10cd4: 1a000009 bne 10d00 <fat_buf_release+0x138>
rtems_set_errno_and_return_minus_one(ENOMEM);
memcpy(bd->buffer + blk_ofs, fs_info->sec_buf, fs_info->vol.bps);
10cd8: e59d3000 ldr r3, [sp]
10cdc: e593001c ldr r0, [r3, #28]
10ce0: e5941090 ldr r1, [r4, #144] ; 0x90
10ce4: e1d420b0 ldrh r2, [r4]
10ce8: e0800006 add r0, r0, r6
10cec: eb002184 bl 19304 <memcpy>
sc = rtems_bdbuf_release_modified(bd);
10cf0: e59d0000 ldr r0, [sp]
10cf4: ebfff8fa bl f0e4 <rtems_bdbuf_release_modified>
if ( sc != RTEMS_SUCCESSFUL)
10cf8: e3500000 cmp r0, #0
10cfc: 0a000002 beq 10d0c <fat_buf_release+0x144>
rtems_set_errno_and_return_minus_one(ENOMEM);
10d00: eb001ed8 bl 18868 <__errno> <== NOT EXECUTED
10d04: e3a0300c mov r3, #12 <== NOT EXECUTED
10d08: ea00000b b 10d3c <fat_buf_release+0x174> <== NOT EXECUTED
if (sec_of_fat && !fs_info->vol.mirror)
{
uint8_t i;
for (i = 1; i < fs_info->vol.fats; i++)
10d0c: e2855001 add r5, r5, #1
10d10: e20550ff and r5, r5, #255 ; 0xff
10d14: e5d4300d ldrb r3, [r4, #13]
10d18: e1530005 cmp r3, r5
10d1c: 8affffd6 bhi 10c7c <fat_buf_release+0xb4>
10d20: ea000008 b 10d48 <fat_buf_release+0x180>
}
}
}
else
{
sc = rtems_bdbuf_release(fs_info->c.buf);
10d24: e594008c ldr r0, [r4, #140] ; 0x8c
10d28: ebfff8bf bl f02c <rtems_bdbuf_release>
if (sc != RTEMS_SUCCESSFUL)
10d2c: e3500000 cmp r0, #0
10d30: 0a000004 beq 10d48 <fat_buf_release+0x180>
rtems_set_errno_and_return_minus_one(EIO);
10d34: eb001ecb bl 18868 <__errno> <== NOT EXECUTED
10d38: e3a03005 mov r3, #5 <== NOT EXECUTED
10d3c: e5803000 str r3, [r0] <== NOT EXECUTED
10d40: e3e00000 mvn r0, #0 <== NOT EXECUTED
10d44: ea000001 b 10d50 <fat_buf_release+0x188> <== NOT EXECUTED
}
fs_info->c.state = FAT_CACHE_EMPTY;
10d48: e3a00000 mov r0, #0
10d4c: e5c40089 strb r0, [r4, #137] ; 0x89
return RC_OK;
}
10d50: e8bd8078 pop {r3, r4, r5, r6, pc}
000104f0 <fat_file_close>:
/*
* if links_num field of fat-file descriptor is greater than 1
* decrement the count of links and return
*/
if (fat_fd->links_num > 1)
104f0: e5913008 ldr r3, [r1, #8]
104f4: e3530001 cmp r3, #1
int
fat_file_close(
fat_fs_info_t *fs_info,
fat_file_fd_t *fat_fd
)
{
104f8: e92d4070 push {r4, r5, r6, lr}
104fc: e1a05000 mov r5, r0
10500: e1a04001 mov r4, r1
/*
* if links_num field of fat-file descriptor is greater than 1
* decrement the count of links and return
*/
if (fat_fd->links_num > 1)
10504: 9a000003 bls 10518 <fat_file_close+0x28>
{
fat_fd->links_num--;
10508: e2433001 sub r3, r3, #1
1050c: e5813008 str r3, [r1, #8]
return rc;
10510: e3a00000 mov r0, #0
10514: e8bd8070 pop {r4, r5, r6, pc}
}
key = fat_construct_key(fs_info, &fat_fd->dir_pos.sname);
if (fat_fd->flags & FAT_FILE_REMOVED)
10518: e5d16030 ldrb r6, [r1, #48] ; 0x30
1051c: e2166001 ands r6, r6, #1
10520: 0a00000e beq 10560 <fat_file_close+0x70>
{
rc = fat_file_truncate(fs_info, fat_fd, 0);
10524: e3a02000 mov r2, #0
10528: ebffffb4 bl 10400 <fat_file_truncate>
if ( rc != RC_OK )
1052c: e3500000 cmp r0, #0
10530: 18bd8070 popne {r4, r5, r6, pc}
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
10534: e1a00004 mov r0, r4
10538: eb000d8a bl 13b68 <_Chain_Extract>
return rc;
_hash_delete(fs_info->rhash, key, fat_fd->ino, fat_fd);
if ( fat_ino_is_unique(fs_info, fat_fd->ino) )
1053c: e1a00005 mov r0, r5
10540: e594100c ldr r1, [r4, #12]
10544: eb00054c bl 11a7c <fat_ino_is_unique>
10548: e3500000 cmp r0, #0
1054c: 0a00000a beq 1057c <fat_file_close+0x8c>
fat_free_unique_ino(fs_info, fat_fd->ino);
10550: e1a00005 mov r0, r5 <== NOT EXECUTED
10554: e594100c ldr r1, [r4, #12] <== NOT EXECUTED
10558: eb00053e bl 11a58 <fat_free_unique_ino> <== NOT EXECUTED
1055c: ea000006 b 1057c <fat_file_close+0x8c> <== NOT EXECUTED
free(fat_fd);
}
else
{
if (fat_ino_is_unique(fs_info, fat_fd->ino))
10560: e591100c ldr r1, [r1, #12]
10564: eb000544 bl 11a7c <fat_ino_is_unique>
10568: e3500000 cmp r0, #0
{
fat_fd->links_num = 0;
1056c: 15846008 strne r6, [r4, #8]
free(fat_fd);
}
else
{
if (fat_ino_is_unique(fs_info, fat_fd->ino))
10570: 1a000003 bne 10584 <fat_file_close+0x94>
10574: e1a00004 mov r0, r4
10578: eb000d7a bl 13b68 <_Chain_Extract>
fat_fd->links_num = 0;
}
else
{
_hash_delete(fs_info->vhash, key, fat_fd->ino, fat_fd);
free(fat_fd);
1057c: e1a00004 mov r0, r4
10580: ebffcea5 bl 401c <free>
}
}
/*
* flush any modified "cached" buffer back to disk
*/
rc = fat_buf_release(fs_info);
10584: e1a00005 mov r0, r5
return rc;
}
10588: e8bd4070 pop {r4, r5, r6, lr}
}
}
/*
* flush any modified "cached" buffer back to disk
*/
rc = fat_buf_release(fs_info);
1058c: ea00018d b 10bc8 <fat_buf_release>
00010644 <fat_file_extend>:
fat_file_fd_t *fat_fd,
bool zero_fill,
uint32_t new_length,
uint32_t *a_length
)
{
10644: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
10648: e24dd01c sub sp, sp, #28
1064c: e1a07003 mov r7, r3
uint32_t last_cl = 0;
uint32_t bytes_remain = 0;
uint32_t cls_added;
ssize_t bytes_written;
*a_length = new_length;
10650: e59d3040 ldr r3, [sp, #64] ; 0x40
10654: e5837000 str r7, [r3]
if (new_length <= fat_fd->fat_file_size)
10658: e5913018 ldr r3, [r1, #24]
uint32_t new_length,
uint32_t *a_length
)
{
int rc = RC_OK;
uint32_t chain = 0;
1065c: e3a06000 mov r6, #0
uint32_t cls_added;
ssize_t bytes_written;
*a_length = new_length;
if (new_length <= fat_fd->fat_file_size)
10660: e1570003 cmp r7, r3
fat_file_fd_t *fat_fd,
bool zero_fill,
uint32_t new_length,
uint32_t *a_length
)
{
10664: e1a04000 mov r4, r0
10668: e1a05001 mov r5, r1
1066c: e202b0ff and fp, r2, #255 ; 0xff
int rc = RC_OK;
uint32_t chain = 0;
10670: e58d6008 str r6, [sp, #8]
uint32_t bytes2add = 0;
uint32_t cls2add = 0;
uint32_t old_last_cl;
uint32_t last_cl = 0;
10674: e58d6010 str r6, [sp, #16]
uint32_t cls_added;
ssize_t bytes_written;
*a_length = new_length;
if (new_length <= fat_fd->fat_file_size)
10678: 9a000078 bls 10860 <fat_file_extend+0x21c>
return RC_OK;
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
1067c: e5912020 ldr r2, [r1, #32]
10680: e3520001 cmp r2, #1
10684: 1a000005 bne 106a0 <fat_file_extend+0x5c>
10688: e5912024 ldr r2, [r1, #36] ; 0x24
1068c: e1520006 cmp r2, r6
10690: 1a000002 bne 106a0 <fat_file_extend+0x5c>
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
10694: e5d0200e ldrb r2, [r0, #14]
*a_length = new_length;
if (new_length <= fat_fd->fat_file_size)
return RC_OK;
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
10698: e3120003 tst r2, #3
1069c: 1a00002f bne 10760 <fat_file_extend+0x11c>
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
rtems_set_errno_and_return_minus_one( ENOSPC );
bytes_remain = (fs_info->vol.bpc -
106a0: e1d480b6 ldrh r8, [r4, #6]
(fat_fd->fat_file_size & (fs_info->vol.bpc - 1))) &
106a4: e2482001 sub r2, r8, #1
106a8: e0029003 and r9, r2, r3
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
rtems_set_errno_and_return_minus_one( ENOSPC );
bytes_remain = (fs_info->vol.bpc -
106ac: e0698008 rsb r8, r9, r8
(fat_fd->fat_file_size & (fs_info->vol.bpc - 1))) &
(fs_info->vol.bpc - 1);
bytes2add = new_length - fat_fd->fat_file_size;
106b0: e063a007 rsb sl, r3, r7
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
rtems_set_errno_and_return_minus_one( ENOSPC );
bytes_remain = (fs_info->vol.bpc -
106b4: e0088002 and r8, r8, r2
(fat_fd->fat_file_size & (fs_info->vol.bpc - 1))) &
(fs_info->vol.bpc - 1);
bytes2add = new_length - fat_fd->fat_file_size;
if (bytes2add > bytes_remain)
106b8: e15a0008 cmp sl, r8
bytes2add -= bytes_remain;
106bc: 8068a00a rsbhi sl, r8, sl
else
bytes2add = 0;
106c0: 93a0a000 movls sl, #0
if (zero_fill && bytes_remain > 0) {
106c4: e35b0000 cmp fp, #0
106c8: 0a000011 beq 10714 <fat_file_extend+0xd0>
106cc: e3580000 cmp r8, #0
106d0: 0a00000f beq 10714 <fat_file_extend+0xd0>
uint32_t start = fat_fd->fat_file_size;
uint32_t cl_start = start >> fs_info->vol.bpc_log2;
106d4: e5d42008 ldrb r2, [r4, #8]
uint32_t ofs = start & (fs_info->vol.bpc - 1);
uint32_t cur_cln;
rc = fat_file_lseek(fs_info, fat_fd, cl_start, &cur_cln);
106d8: e1a00004 mov r0, r4
106dc: e1a02233 lsr r2, r3, r2
106e0: e1a01005 mov r1, r5
106e4: e28d3018 add r3, sp, #24
106e8: ebfffe63 bl 1007c <fat_file_lseek>
if (rc != RC_OK)
106ec: e2506000 subs r6, r0, #0
106f0: 1a00005a bne 10860 <fat_file_extend+0x21c>
return rc;
bytes_written = fat_cluster_set (fs_info, cur_cln, ofs, bytes_remain, 0);
106f4: e1a00004 mov r0, r4
106f8: e59d1018 ldr r1, [sp, #24]
106fc: e1a02009 mov r2, r9
10700: e1a03008 mov r3, r8
10704: e58d6000 str r6, [sp]
10708: eb000206 bl 10f28 <fat_cluster_set>
if (bytes_remain != bytes_written)
1070c: e1580000 cmp r8, r0
10710: 1a000051 bne 1085c <fat_file_extend+0x218>
/*
* if in last cluster allocated for the file there is enough room to
* handle extention (hence we don't need to add even one cluster to the
* file ) - return
*/
if (bytes2add == 0)
10714: e35a0000 cmp sl, #0
return RC_OK;
10718: 01a0600a moveq r6, sl
/*
* if in last cluster allocated for the file there is enough room to
* handle extention (hence we don't need to add even one cluster to the
* file ) - return
*/
if (bytes2add == 0)
1071c: 0a00004f beq 10860 <fat_file_extend+0x21c>
return RC_OK;
cls2add = ((bytes2add - 1) >> fs_info->vol.bpc_log2) + 1;
10720: e5d43008 ldrb r3, [r4, #8]
10724: e24a9001 sub r9, sl, #1
10728: e1a09339 lsr r9, r9, r3
rc = fat_scan_fat_for_free_clusters(fs_info, &chain, cls2add,
1072c: e28d3010 add r3, sp, #16
* file ) - return
*/
if (bytes2add == 0)
return RC_OK;
cls2add = ((bytes2add - 1) >> fs_info->vol.bpc_log2) + 1;
10730: e2899001 add r9, r9, #1
rc = fat_scan_fat_for_free_clusters(fs_info, &chain, cls2add,
10734: e88d0808 stm sp, {r3, fp}
10738: e1a00004 mov r0, r4
1073c: e28d1008 add r1, sp, #8
10740: e1a02009 mov r2, r9
10744: e28d3014 add r3, sp, #20
10748: eb0019cd bl 16e84 <fat_scan_fat_for_free_clusters>
&cls_added, &last_cl, zero_fill);
/* this means that low level I/O error occured */
if (rc != RC_OK)
1074c: e2506000 subs r6, r0, #0
10750: 1a000042 bne 10860 <fat_file_extend+0x21c>
return rc;
/* this means that no space left on device */
if ((cls_added == 0) && (bytes_remain == 0))
10754: e59d3014 ldr r3, [sp, #20]
10758: e1988003 orrs r8, r8, r3
1075c: 1a000003 bne 10770 <fat_file_extend+0x12c>
rtems_set_errno_and_return_minus_one(ENOSPC);
10760: eb002040 bl 18868 <__errno>
10764: e3a0301c mov r3, #28
10768: e5803000 str r3, [r0]
1076c: ea00003a b 1085c <fat_file_extend+0x218>
/* check wether we satisfied request for 'cls2add' clusters */
if (cls2add != cls_added)
10770: e1590003 cmp r9, r3
10774: 0a000006 beq 10794 <fat_file_extend+0x150>
{
new_length -= bytes2add & (fs_info->vol.bpc - 1);
10778: e1d420b6 ldrh r2, [r4, #6] <== NOT EXECUTED
1077c: e2422001 sub r2, r2, #1 <== NOT EXECUTED
10780: e00aa002 and sl, sl, r2 <== NOT EXECUTED
new_length -= (cls2add - cls_added) << fs_info->vol.bpc_log2;
10784: e5d42008 ldrb r2, [r4, #8] <== NOT EXECUTED
rtems_set_errno_and_return_minus_one(ENOSPC);
/* check wether we satisfied request for 'cls2add' clusters */
if (cls2add != cls_added)
{
new_length -= bytes2add & (fs_info->vol.bpc - 1);
10788: e06a7007 rsb r7, sl, r7 <== NOT EXECUTED
new_length -= (cls2add - cls_added) << fs_info->vol.bpc_log2;
1078c: e0639009 rsb r9, r3, r9 <== NOT EXECUTED
10790: e0477219 sub r7, r7, r9, lsl r2 <== NOT EXECUTED
}
/* add new chain to the end of existed */
if ( fat_fd->fat_file_size == 0 )
10794: e5953018 ldr r3, [r5, #24]
10798: e3530000 cmp r3, #0
{
fat_fd->map.disk_cln = fat_fd->cln = chain;
1079c: 059d2008 ldreq r2, [sp, #8]
fat_fd->map.file_cln = 0;
107a0: 05853034 streq r3, [r5, #52] ; 0x34
}
/* add new chain to the end of existed */
if ( fat_fd->fat_file_size == 0 )
{
fat_fd->map.disk_cln = fat_fd->cln = chain;
107a4: 0585201c streq r2, [r5, #28]
107a8: 05852038 streq r2, [r5, #56] ; 0x38
107ac: 0a000014 beq 10804 <fat_file_extend+0x1c0>
fat_fd->map.file_cln = 0;
}
else
{
if (fat_fd->map.last_cln != FAT_UNDEFINED_VALUE)
107b0: e595203c ldr r2, [r5, #60] ; 0x3c
107b4: e3720001 cmn r2, #1
{
old_last_cl = fat_fd->map.last_cln;
107b8: 158d200c strne r2, [sp, #12]
fat_fd->map.disk_cln = fat_fd->cln = chain;
fat_fd->map.file_cln = 0;
}
else
{
if (fat_fd->map.last_cln != FAT_UNDEFINED_VALUE)
107bc: 1a000008 bne 107e4 <fat_file_extend+0x1a0>
{
old_last_cl = fat_fd->map.last_cln;
}
else
{
rc = fat_file_ioctl(fs_info, fat_fd, F_CLU_NUM,
107c0: e28d200c add r2, sp, #12 <== NOT EXECUTED
107c4: e58d2000 str r2, [sp] <== NOT EXECUTED
107c8: e1a00004 mov r0, r4 <== NOT EXECUTED
107cc: e1a01005 mov r1, r5 <== NOT EXECUTED
107d0: e3a02001 mov r2, #1 <== NOT EXECUTED
107d4: e2433001 sub r3, r3, #1 <== NOT EXECUTED
107d8: ebffff6c bl 10590 <fat_file_ioctl> <== NOT EXECUTED
(fat_fd->fat_file_size - 1), &old_last_cl);
if ( rc != RC_OK )
107dc: e2508000 subs r8, r0, #0 <== NOT EXECUTED
107e0: 1a000014 bne 10838 <fat_file_extend+0x1f4> <== NOT EXECUTED
fat_free_fat_clusters_chain(fs_info, chain);
return rc;
}
}
rc = fat_set_fat_cluster(fs_info, old_last_cl, chain);
107e4: e1a00004 mov r0, r4
107e8: e59d100c ldr r1, [sp, #12]
107ec: e59d2008 ldr r2, [sp, #8]
107f0: eb0018f4 bl 16bc8 <fat_set_fat_cluster>
if ( rc != RC_OK )
107f4: e2508000 subs r8, r0, #0
{
fat_free_fat_clusters_chain(fs_info, chain);
107f8: e1a00004 mov r0, r4
return rc;
}
}
rc = fat_set_fat_cluster(fs_info, old_last_cl, chain);
if ( rc != RC_OK )
107fc: 1a00000e bne 1083c <fat_file_extend+0x1f8>
{
fat_free_fat_clusters_chain(fs_info, chain);
return rc;
}
fat_buf_release(fs_info);
10800: eb0000f0 bl 10bc8 <fat_buf_release>
}
/* update number of the last cluster of the file if it changed */
if (cls_added != 0)
10804: e59d3014 ldr r3, [sp, #20]
10808: e3530000 cmp r3, #0
1080c: 0a00000e beq 1084c <fat_file_extend+0x208>
{
fat_fd->map.last_cln = last_cl;
10810: e59d3010 ldr r3, [sp, #16]
10814: e585303c str r3, [r5, #60] ; 0x3c
if (fat_fd->fat_file_type == FAT_DIRECTORY)
10818: e5953010 ldr r3, [r5, #16]
1081c: e3530000 cmp r3, #0
10820: 1a000009 bne 1084c <fat_file_extend+0x208>
{
rc = fat_init_clusters_chain(fs_info, chain);
10824: e1a00004 mov r0, r4
10828: e59d1008 ldr r1, [sp, #8]
1082c: eb00043e bl 1192c <fat_init_clusters_chain>
if ( rc != RC_OK )
10830: e2508000 subs r8, r0, #0
10834: 0a000004 beq 1084c <fat_file_extend+0x208>
{
fat_free_fat_clusters_chain(fs_info, chain);
10838: e1a00004 mov r0, r4 <== NOT EXECUTED
1083c: e59d1008 ldr r1, [sp, #8] <== NOT EXECUTED
10840: eb001962 bl 16dd0 <fat_free_fat_clusters_chain> <== NOT EXECUTED
return rc;
10844: e1a06008 mov r6, r8 <== NOT EXECUTED
10848: ea000004 b 10860 <fat_file_extend+0x21c> <== NOT EXECUTED
}
}
}
*a_length = new_length;
1084c: e59d3040 ldr r3, [sp, #64] ; 0x40
10850: e5837000 str r7, [r3]
fat_fd->fat_file_size = new_length;
10854: e5857018 str r7, [r5, #24]
return RC_OK;
10858: ea000000 b 10860 <fat_file_extend+0x21c>
if (rc != RC_OK)
return rc;
bytes_written = fat_cluster_set (fs_info, cur_cln, ofs, bytes_remain, 0);
if (bytes_remain != bytes_written)
return -1;
1085c: e3e06000 mvn r6, #0
*a_length = new_length;
fat_fd->fat_file_size = new_length;
return RC_OK;
}
10860: e1a00006 mov r0, r6
10864: e28dd01c add sp, sp, #28
10868: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00010590 <fat_file_ioctl>:
fat_file_ioctl(
fat_fs_info_t *fs_info,
fat_file_fd_t *fat_fd,
int cmd,
...)
{
10590: e92d000c push {r2, r3}
10594: e92d4013 push {r0, r1, r4, lr}
int rc = RC_OK;
uint32_t cur_cln = 0;
10598: e3a03000 mov r3, #0
1059c: e58d3000 str r3, [sp]
uint32_t *ret;
va_list ap;
va_start(ap, cmd);
switch (cmd)
105a0: e59d3010 ldr r3, [sp, #16]
uint32_t cl_start = 0;
uint32_t pos = 0;
uint32_t *ret;
va_list ap;
va_start(ap, cmd);
105a4: e28d2014 add r2, sp, #20
switch (cmd)
105a8: e3530001 cmp r3, #1
uint32_t cl_start = 0;
uint32_t pos = 0;
uint32_t *ret;
va_list ap;
va_start(ap, cmd);
105ac: e58d2004 str r2, [sp, #4]
switch (cmd)
105b0: 1a00001c bne 10628 <fat_file_ioctl+0x98>
{
case F_CLU_NUM:
pos = va_arg(ap, uint32_t);
105b4: e1a0c002 mov ip, r2
105b8: e49c3008 ldr r3, [ip], #8
ret = va_arg(ap, uint32_t *);
/* sanity check */
if ( pos >= fat_fd->fat_file_size ) {
105bc: e5912018 ldr r2, [r1, #24]
105c0: e1530002 cmp r3, r2
switch (cmd)
{
case F_CLU_NUM:
pos = va_arg(ap, uint32_t);
ret = va_arg(ap, uint32_t *);
105c4: e58dc004 str ip, [sp, #4]
105c8: e59d4018 ldr r4, [sp, #24]
/* sanity check */
if ( pos >= fat_fd->fat_file_size ) {
105cc: 3a000002 bcc 105dc <fat_file_ioctl+0x4c>
va_end(ap);
rtems_set_errno_and_return_minus_one( EIO );
105d0: eb0020a4 bl 18868 <__errno> <== NOT EXECUTED
105d4: e3a03005 mov r3, #5 <== NOT EXECUTED
105d8: ea000014 b 10630 <fat_file_ioctl+0xa0> <== NOT EXECUTED
}
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
105dc: e5912020 ldr r2, [r1, #32]
105e0: e3520001 cmp r2, #1
105e4: 1a000007 bne 10608 <fat_file_ioctl+0x78>
105e8: e5912024 ldr r2, [r1, #36] ; 0x24
105ec: e3520000 cmp r2, #0
105f0: 1a000004 bne 10608 <fat_file_ioctl+0x78>
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
105f4: e5d0c00e ldrb ip, [r0, #14]
if ( pos >= fat_fd->fat_file_size ) {
va_end(ap);
rtems_set_errno_and_return_minus_one( EIO );
}
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
105f8: e31c0003 tst ip, #3
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
{
/* cluster 0 (zero) reserved for root dir */
*ret = 0;
105fc: 15842000 strne r2, [r4]
rc = RC_OK;
10600: 11a00002 movne r0, r2
if ( pos >= fat_fd->fat_file_size ) {
va_end(ap);
rtems_set_errno_and_return_minus_one( EIO );
}
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
10604: 1a00000b bne 10638 <fat_file_ioctl+0xa8>
*ret = 0;
rc = RC_OK;
break;
}
cl_start = pos >> fs_info->vol.bpc_log2;
10608: e5d02008 ldrb r2, [r0, #8]
rc = fat_file_lseek(fs_info, fat_fd, cl_start, &cur_cln);
1060c: e1a02233 lsr r2, r3, r2
10610: e1a0300d mov r3, sp
10614: ebfffe98 bl 1007c <fat_file_lseek>
if ( rc != RC_OK )
10618: e3500000 cmp r0, #0
break;
*ret = cur_cln;
1061c: 059d3000 ldreq r3, [sp]
10620: 05843000 streq r3, [r4]
10624: ea000003 b 10638 <fat_file_ioctl+0xa8>
break;
default:
errno = EINVAL;
10628: eb00208e bl 18868 <__errno> <== NOT EXECUTED
1062c: e3a03016 mov r3, #22 <== NOT EXECUTED
10630: e5803000 str r3, [r0] <== NOT EXECUTED
rc = -1;
10634: e3e00000 mvn r0, #0 <== NOT EXECUTED
break;
}
va_end(ap);
return rc;
}
10638: e8bd401c pop {r2, r3, r4, lr}
1063c: e28dd008 add sp, sp, #8
10640: e12fff1e bx lr
00010108 <fat_file_open>:
fat_file_open(
fat_fs_info_t *fs_info,
fat_dir_pos_t *dir_pos,
fat_file_fd_t **fat_fd
)
{
10108: e92d47f3 push {r0, r1, r4, r5, r6, r7, r8, r9, sl, lr}
int rc = RC_OK;
fat_file_fd_t *lfat_fd = NULL;
1010c: e3a07000 mov r7, #0
10110: e28d4008 add r4, sp, #8
10114: e5247004 str r7, [r4, #-4]!
fat_file_open(
fat_fs_info_t *fs_info,
fat_dir_pos_t *dir_pos,
fat_file_fd_t **fat_fd
)
{
10118: e1a05000 mov r5, r0
1011c: e1a09001 mov r9, r1
10120: e1a08002 mov r8, r2
int rc = RC_OK;
fat_file_fd_t *lfat_fd = NULL;
uint32_t key = 0;
/* construct key */
key = fat_construct_key(fs_info, &dir_pos->sname);
10124: ebffffa7 bl ffc8 <fat_construct_key>
10128: e1a06000 mov r6, r0
/* access "valid" hash table */
rc = _hash_search(fs_info, fs_info->vhash, key, 0, &lfat_fd);
1012c: e595106c ldr r1, [r5, #108] ; 0x6c
10130: e1a00005 mov r0, r5
10134: e1a02006 mov r2, r6
10138: e1a03007 mov r3, r7
1013c: e58d4000 str r4, [sp]
10140: ebffffaf bl 10004 <_hash_search>
if ( rc == RC_OK )
10144: e3500000 cmp r0, #0
10148: 1a000005 bne 10164 <fat_file_open+0x5c>
{
/* return pointer to fat_file_descriptor allocated before */
(*fat_fd) = lfat_fd;
1014c: e59d3004 ldr r3, [sp, #4]
lfat_fd->links_num++;
10150: e5932008 ldr r2, [r3, #8]
10154: e2822001 add r2, r2, #1
/* access "valid" hash table */
rc = _hash_search(fs_info, fs_info->vhash, key, 0, &lfat_fd);
if ( rc == RC_OK )
{
/* return pointer to fat_file_descriptor allocated before */
(*fat_fd) = lfat_fd;
10158: e5883000 str r3, [r8]
lfat_fd->links_num++;
1015c: e5832008 str r2, [r3, #8]
return rc;
10160: ea000037 b 10244 <fat_file_open+0x13c>
}
/* access "removed-but-still-open" hash table */
rc = _hash_search(fs_info, fs_info->rhash, key, key, &lfat_fd);
10164: e5951070 ldr r1, [r5, #112] ; 0x70
10168: e1a02006 mov r2, r6
1016c: e1a03006 mov r3, r6
10170: e1a00005 mov r0, r5
10174: e58d4000 str r4, [sp]
10178: ebffffa1 bl 10004 <_hash_search>
1017c: e1a0a000 mov sl, r0
lfat_fd = (*fat_fd) = (fat_file_fd_t*)malloc(sizeof(fat_file_fd_t));
10180: e3a00044 mov r0, #68 ; 0x44
10184: ebffd0d9 bl 44f0 <malloc>
if ( lfat_fd == NULL )
10188: e3500000 cmp r0, #0
}
/* access "removed-but-still-open" hash table */
rc = _hash_search(fs_info, fs_info->rhash, key, key, &lfat_fd);
lfat_fd = (*fat_fd) = (fat_file_fd_t*)malloc(sizeof(fat_file_fd_t));
1018c: e1a04000 mov r4, r0
10190: e5880000 str r0, [r8]
10194: e58d0004 str r0, [sp, #4]
if ( lfat_fd == NULL )
10198: 1a000004 bne 101b0 <fat_file_open+0xa8>
rtems_set_errno_and_return_minus_one( ENOMEM );
1019c: eb0021b1 bl 18868 <__errno> <== NOT EXECUTED
101a0: e3a0300c mov r3, #12 <== NOT EXECUTED
101a4: e5803000 str r3, [r0] <== NOT EXECUTED
101a8: e3e00000 mvn r0, #0 <== NOT EXECUTED
101ac: ea000024 b 10244 <fat_file_open+0x13c> <== NOT EXECUTED
memset(lfat_fd, 0, sizeof(fat_file_fd_t));
101b0: e1a01007 mov r1, r7
101b4: e3a02044 mov r2, #68 ; 0x44
101b8: eb002487 bl 193dc <memset>
lfat_fd->links_num = 1;
101bc: e3a03001 mov r3, #1
101c0: e5843008 str r3, [r4, #8]
lfat_fd->flags &= ~FAT_FILE_REMOVED;
101c4: e5d43030 ldrb r3, [r4, #48] ; 0x30
lfat_fd->map.last_cln = FAT_UNDEFINED_VALUE;
101c8: e3e07000 mvn r7, #0
rtems_set_errno_and_return_minus_one( ENOMEM );
memset(lfat_fd, 0, sizeof(fat_file_fd_t));
lfat_fd->links_num = 1;
lfat_fd->flags &= ~FAT_FILE_REMOVED;
101cc: e3c33001 bic r3, r3, #1
101d0: e5c43030 strb r3, [r4, #48] ; 0x30
lfat_fd->map.last_cln = FAT_UNDEFINED_VALUE;
101d4: e584703c str r7, [r4, #60] ; 0x3c
lfat_fd->dir_pos = *dir_pos;
101d8: e899000f ldm r9, {r0, r1, r2, r3}
101dc: e284c020 add ip, r4, #32
if ( rc != RC_OK )
101e0: e35a0000 cmp sl, #0
lfat_fd->links_num = 1;
lfat_fd->flags &= ~FAT_FILE_REMOVED;
lfat_fd->map.last_cln = FAT_UNDEFINED_VALUE;
lfat_fd->dir_pos = *dir_pos;
101e4: e88c000f stm ip, {r0, r1, r2, r3}
if ( rc != RC_OK )
lfat_fd->ino = key;
101e8: 1584600c strne r6, [r4, #12]
lfat_fd->flags &= ~FAT_FILE_REMOVED;
lfat_fd->map.last_cln = FAT_UNDEFINED_VALUE;
lfat_fd->dir_pos = *dir_pos;
if ( rc != RC_OK )
101ec: 1a00000d bne 10228 <fat_file_open+0x120>
lfat_fd->ino = key;
else
{
lfat_fd->ino = fat_get_unique_ino(fs_info);
101f0: e1a00005 mov r0, r5 <== NOT EXECUTED
101f4: eb0005ea bl 119a4 <fat_get_unique_ino> <== NOT EXECUTED
if ( lfat_fd->ino == 0 )
101f8: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
if ( rc != RC_OK )
lfat_fd->ino = key;
else
{
lfat_fd->ino = fat_get_unique_ino(fs_info);
101fc: e584000c str r0, [r4, #12] <== NOT EXECUTED
if ( lfat_fd->ino == 0 )
10200: e593300c ldr r3, [r3, #12] <== NOT EXECUTED
10204: e3530000 cmp r3, #0 <== NOT EXECUTED
10208: 1a000006 bne 10228 <fat_file_open+0x120> <== NOT EXECUTED
{
free((*fat_fd));
1020c: e5980000 ldr r0, [r8] <== NOT EXECUTED
10210: ebffcf81 bl 401c <free> <== NOT EXECUTED
/*
* XXX: kernel resource is unsufficient, but not the memory,
* but there is no suitable errno :(
*/
rtems_set_errno_and_return_minus_one( ENOMEM );
10214: eb002193 bl 18868 <__errno> <== NOT EXECUTED
10218: e3a0300c mov r3, #12 <== NOT EXECUTED
1021c: e5803000 str r3, [r0] <== NOT EXECUTED
10220: e1a00007 mov r0, r7 <== NOT EXECUTED
10224: ea000006 b 10244 <fat_file_open+0x13c> <== NOT EXECUTED
*/
static inline void
_hash_insert(rtems_chain_control *hash, uint32_t key1, uint32_t key2,
fat_file_fd_t *el)
{
rtems_chain_append((hash) + ((key1) % FAT_HASH_MODULE), &(el)->link);
10228: e595306c ldr r3, [r5, #108] ; 0x6c
1022c: e2066001 and r6, r6, #1
RTEMS_INLINE_ROUTINE void rtems_chain_append(
rtems_chain_control *the_chain,
rtems_chain_node *the_node
)
{
_Chain_Append( the_chain, the_node );
10230: e3a0000c mov r0, #12
10234: e0203096 mla r0, r6, r0, r3
10238: e59d1004 ldr r1, [sp, #4]
1023c: ebffe22a bl 8aec <_Chain_Append>
/*
* other fields of fat-file descriptor will be initialized on upper
* level
*/
return RC_OK;
10240: e3a00000 mov r0, #0
}
10244: e8bd87fc pop {r2, r3, r4, r5, r6, r7, r8, r9, sl, pc}
0001025c <fat_file_read>:
fat_file_fd_t *fat_fd,
uint32_t start,
uint32_t count,
uint8_t *buf
)
{
1025c: e92d4fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
int rc = RC_OK;
ssize_t ret = 0;
uint32_t cmpltd = 0;
uint32_t cur_cln = 0;
10260: e3a0a000 mov sl, #0
uint32_t sec = 0;
uint32_t byte = 0;
uint32_t c = 0;
/* it couldn't be removed - otherwise cache update will be broken */
if (count == 0)
10264: e2535000 subs r5, r3, #0
)
{
int rc = RC_OK;
ssize_t ret = 0;
uint32_t cmpltd = 0;
uint32_t cur_cln = 0;
10268: e58da00c str sl, [sp, #12]
fat_file_fd_t *fat_fd,
uint32_t start,
uint32_t count,
uint8_t *buf
)
{
1026c: e1a04000 mov r4, r0
10270: e1a06001 mov r6, r1
10274: e1a08002 mov r8, r2
uint32_t byte = 0;
uint32_t c = 0;
/* it couldn't be removed - otherwise cache update will be broken */
if (count == 0)
return cmpltd;
10278: 01a0a005 moveq sl, r5
uint32_t sec = 0;
uint32_t byte = 0;
uint32_t c = 0;
/* it couldn't be removed - otherwise cache update will be broken */
if (count == 0)
1027c: 0a00005c beq 103f4 <fat_file_read+0x198>
/*
* >= because start is offset and computed from 0 and file_size
* computed from 1
*/
if ( start >= fat_fd->fat_file_size )
10280: e5913018 ldr r3, [r1, #24]
10284: e1520003 cmp r2, r3
10288: 2a000059 bcs 103f4 <fat_file_read+0x198>
return FAT_EOF;
if ((count > fat_fd->fat_file_size) ||
1028c: e1550003 cmp r5, r3
10290: 8a000002 bhi 102a0 <fat_file_read+0x44>
(start > fat_fd->fat_file_size - count))
10294: e0652003 rsb r2, r5, r3
* computed from 1
*/
if ( start >= fat_fd->fat_file_size )
return FAT_EOF;
if ((count > fat_fd->fat_file_size) ||
10298: e1580002 cmp r8, r2
1029c: 9a000000 bls 102a4 <fat_file_read+0x48>
(start > fat_fd->fat_file_size - count))
count = fat_fd->fat_file_size - start;
102a0: e0685003 rsb r5, r8, r3
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
102a4: e5963020 ldr r3, [r6, #32]
102a8: e3530001 cmp r3, #1
102ac: 1a000014 bne 10304 <fat_file_read+0xa8>
102b0: e5963024 ldr r3, [r6, #36] ; 0x24
102b4: e3530000 cmp r3, #0
102b8: 1a000011 bne 10304 <fat_file_read+0xa8>
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
102bc: e5d4300e ldrb r3, [r4, #14]
if ((count > fat_fd->fat_file_size) ||
(start > fat_fd->fat_file_size - count))
count = fat_fd->fat_file_size - start;
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
102c0: e3130003 tst r3, #3
102c4: 0a00000e beq 10304 <fat_file_read+0xa8>
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
{
sec = fat_cluster_num_to_sector_num(fs_info, fat_fd->cln);
102c8: e596101c ldr r1, [r6, #28]
102cc: e1a00004 mov r0, r4
102d0: ebffff31 bl ff9c <fat_cluster_num_to_sector_num>
sec += (start >> fs_info->vol.sec_log2);
102d4: e5d41002 ldrb r1, [r4, #2]
byte = start & (fs_info->vol.bps - 1);
102d8: e1d420b0 ldrh r2, [r4]
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
{
sec = fat_cluster_num_to_sector_num(fs_info, fat_fd->cln);
sec += (start >> fs_info->vol.sec_log2);
102dc: e0801138 add r1, r0, r8, lsr r1
byte = start & (fs_info->vol.bps - 1);
ret = _fat_block_read(fs_info, sec, byte, count, buf);
102e0: e59d0034 ldr r0, [sp, #52] ; 0x34
if ((FAT_FD_OF_ROOT_DIR(fat_fd)) &&
(fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)))
{
sec = fat_cluster_num_to_sector_num(fs_info, fat_fd->cln);
sec += (start >> fs_info->vol.sec_log2);
byte = start & (fs_info->vol.bps - 1);
102e4: e2422001 sub r2, r2, #1
ret = _fat_block_read(fs_info, sec, byte, count, buf);
102e8: e58d0000 str r0, [sp]
102ec: e0082002 and r2, r8, r2
102f0: e1a00004 mov r0, r4
102f4: e1a03005 mov r3, r5
102f8: eb0002c0 bl 10e00 <_fat_block_read>
if ( ret < 0 )
return -1;
102fc: e180afc0 orr sl, r0, r0, asr #31
10300: ea00003b b 103f4 <fat_file_read+0x198>
return ret;
}
cl_start = start >> fs_info->vol.bpc_log2;
10304: e5d43008 ldrb r3, [r4, #8]
10308: e1a03338 lsr r3, r8, r3
save_ofs = ofs = start & (fs_info->vol.bpc - 1);
rc = fat_file_lseek(fs_info, fat_fd, cl_start, &cur_cln);
1030c: e28dc00c add ip, sp, #12
return -1;
return ret;
}
cl_start = start >> fs_info->vol.bpc_log2;
10310: e58d3008 str r3, [sp, #8]
save_ofs = ofs = start & (fs_info->vol.bpc - 1);
rc = fat_file_lseek(fs_info, fat_fd, cl_start, &cur_cln);
10314: e1a02003 mov r2, r3
10318: e1a00004 mov r0, r4
1031c: e1a01006 mov r1, r6
10320: e1a0300c mov r3, ip
return ret;
}
cl_start = start >> fs_info->vol.bpc_log2;
save_ofs = ofs = start & (fs_info->vol.bpc - 1);
10324: e1d470b6 ldrh r7, [r4, #6]
rc = fat_file_lseek(fs_info, fat_fd, cl_start, &cur_cln);
10328: e58dc004 str ip, [sp, #4]
1032c: ebffff52 bl 1007c <fat_file_lseek>
if (rc != RC_OK)
10330: e250a000 subs sl, r0, #0
10334: 1a00002e bne 103f4 <fat_file_read+0x198>
return ret;
}
cl_start = start >> fs_info->vol.bpc_log2;
save_ofs = ofs = start & (fs_info->vol.bpc - 1);
10338: e2477001 sub r7, r7, #1
1033c: e0088007 and r8, r8, r7
10340: e1a0b008 mov fp, r8
10344: e1a0900a mov r9, sl
10348: ea00001c b 103c0 <fat_file_read+0x164>
while (count > 0)
{
c = MIN(count, (fs_info->vol.bpc - ofs));
sec = fat_cluster_num_to_sector_num(fs_info, cur_cln);
1034c: e59d100c ldr r1, [sp, #12]
10350: e1a00004 mov r0, r4
10354: ebffff10 bl ff9c <fat_cluster_num_to_sector_num>
sec += (ofs >> fs_info->vol.sec_log2);
10358: e5d41002 ldrb r1, [r4, #2]
if (rc != RC_OK)
return rc;
while (count > 0)
{
c = MIN(count, (fs_info->vol.bpc - ofs));
1035c: e1d470b6 ldrh r7, [r4, #6]
sec = fat_cluster_num_to_sector_num(fs_info, cur_cln);
sec += (ofs >> fs_info->vol.sec_log2);
10360: e080113b add r1, r0, fp, lsr r1
byte = ofs & (fs_info->vol.bps - 1);
10364: e1d420b0 ldrh r2, [r4]
ret = _fat_block_read(fs_info, sec, byte, c, buf + cmpltd);
10368: e59d0034 ldr r0, [sp, #52] ; 0x34
if (rc != RC_OK)
return rc;
while (count > 0)
{
c = MIN(count, (fs_info->vol.bpc - ofs));
1036c: e06b7007 rsb r7, fp, r7
sec = fat_cluster_num_to_sector_num(fs_info, cur_cln);
sec += (ofs >> fs_info->vol.sec_log2);
byte = ofs & (fs_info->vol.bps - 1);
ret = _fat_block_read(fs_info, sec, byte, c, buf + cmpltd);
10370: e080300a add r3, r0, sl
if (rc != RC_OK)
return rc;
while (count > 0)
{
c = MIN(count, (fs_info->vol.bpc - ofs));
10374: e1570005 cmp r7, r5
10378: 21a07005 movcs r7, r5
sec = fat_cluster_num_to_sector_num(fs_info, cur_cln);
sec += (ofs >> fs_info->vol.sec_log2);
byte = ofs & (fs_info->vol.bps - 1);
1037c: e2422001 sub r2, r2, #1
ret = _fat_block_read(fs_info, sec, byte, c, buf + cmpltd);
10380: e58d3000 str r3, [sp]
10384: e1a00004 mov r0, r4
10388: e00b2002 and r2, fp, r2
1038c: e1a03007 mov r3, r7
10390: eb00029a bl 10e00 <_fat_block_read>
if ( ret < 0 )
10394: e3500000 cmp r0, #0
10398: ba000012 blt 103e8 <fat_file_read+0x18c>
return -1;
count -= c;
cmpltd += c;
save_cln = cur_cln;
1039c: e59d900c ldr r9, [sp, #12]
rc = fat_get_fat_cluster(fs_info, cur_cln, &cur_cln);
103a0: e1a00004 mov r0, r4
103a4: e1a01009 mov r1, r9
103a8: e28d200c add r2, sp, #12
103ac: eb0019b1 bl 16a78 <fat_get_fat_cluster>
if ( rc != RC_OK )
103b0: e250b000 subs fp, r0, #0
ret = _fat_block_read(fs_info, sec, byte, c, buf + cmpltd);
if ( ret < 0 )
return -1;
count -= c;
103b4: e0675005 rsb r5, r7, r5
cmpltd += c;
103b8: e08aa007 add sl, sl, r7
save_cln = cur_cln;
rc = fat_get_fat_cluster(fs_info, cur_cln, &cur_cln);
if ( rc != RC_OK )
103bc: 1a00000b bne 103f0 <fat_file_read+0x194>
rc = fat_file_lseek(fs_info, fat_fd, cl_start, &cur_cln);
if (rc != RC_OK)
return rc;
while (count > 0)
103c0: e3550000 cmp r5, #0
103c4: 1affffe0 bne 1034c <fat_file_read+0xf0>
}
/* update cache */
/* XXX: check this - I'm not sure :( */
fat_fd->map.file_cln = cl_start +
((save_ofs + cmpltd - 1) >> fs_info->vol.bpc_log2);
103c8: e5d43008 ldrb r3, [r4, #8]
103cc: e2488001 sub r8, r8, #1
ofs = 0;
}
/* update cache */
/* XXX: check this - I'm not sure :( */
fat_fd->map.file_cln = cl_start +
103d0: e59d2008 ldr r2, [sp, #8]
((save_ofs + cmpltd - 1) >> fs_info->vol.bpc_log2);
103d4: e088800a add r8, r8, sl
ofs = 0;
}
/* update cache */
/* XXX: check this - I'm not sure :( */
fat_fd->map.file_cln = cl_start +
103d8: e0828338 add r8, r2, r8, lsr r3
((save_ofs + cmpltd - 1) >> fs_info->vol.bpc_log2);
fat_fd->map.disk_cln = save_cln;
103dc: e5869038 str r9, [r6, #56] ; 0x38
ofs = 0;
}
/* update cache */
/* XXX: check this - I'm not sure :( */
fat_fd->map.file_cln = cl_start +
103e0: e5868034 str r8, [r6, #52] ; 0x34
((save_ofs + cmpltd - 1) >> fs_info->vol.bpc_log2);
fat_fd->map.disk_cln = save_cln;
return cmpltd;
103e4: ea000002 b 103f4 <fat_file_read+0x198>
sec += (ofs >> fs_info->vol.sec_log2);
byte = ofs & (fs_info->vol.bps - 1);
ret = _fat_block_read(fs_info, sec, byte, c, buf + cmpltd);
if ( ret < 0 )
return -1;
103e8: e3e0a000 mvn sl, #0 <== NOT EXECUTED
103ec: ea000000 b 103f4 <fat_file_read+0x198> <== NOT EXECUTED
count -= c;
cmpltd += c;
save_cln = cur_cln;
rc = fat_get_fat_cluster(fs_info, cur_cln, &cur_cln);
103f0: e1a0a00b mov sl, fp <== NOT EXECUTED
fat_fd->map.file_cln = cl_start +
((save_ofs + cmpltd - 1) >> fs_info->vol.bpc_log2);
fat_fd->map.disk_cln = save_cln;
return cmpltd;
}
103f4: e1a0000a mov r0, sl
103f8: e28dd010 add sp, sp, #16
103fc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0001086c <fat_file_write>:
fat_file_fd_t *fat_fd,
uint32_t start,
uint32_t count,
const uint8_t *buf
)
{
1086c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
ssize_t ret;
uint32_t cmpltd = 0;
uint32_t byte;
uint32_t c = 0;
bool zero_fill = start > fat_fd->fat_file_size;
uint32_t file_cln_initial = fat_fd->map.file_cln;
10870: e591c034 ldr ip, [r1, #52] ; 0x34
fat_file_fd_t *fat_fd,
uint32_t start,
uint32_t count,
const uint8_t *buf
)
{
10874: e24dd020 sub sp, sp, #32
10878: e1a08002 mov r8, r2
bool zero_fill = start > fat_fd->fat_file_size;
uint32_t file_cln_initial = fat_fd->map.file_cln;
uint32_t cln;
if ( count == 0 )
1087c: e3530000 cmp r3, #0
{
int rc = RC_OK;
ssize_t ret;
uint32_t cmpltd = 0;
uint32_t byte;
uint32_t c = 0;
10880: e3a02000 mov r2, #0
fat_file_fd_t *fat_fd,
uint32_t start,
uint32_t count,
const uint8_t *buf
)
{
10884: e1a05000 mov r5, r0
int rc = RC_OK;
ssize_t ret;
uint32_t cmpltd = 0;
uint32_t byte;
uint32_t c = 0;
10888: e58d2018 str r2, [sp, #24]
fat_file_fd_t *fat_fd,
uint32_t start,
uint32_t count,
const uint8_t *buf
)
{
1088c: e1a04001 mov r4, r1
int rc = RC_OK;
ssize_t ret;
uint32_t cmpltd = 0;
uint32_t byte;
uint32_t c = 0;
bool zero_fill = start > fat_fd->fat_file_size;
10890: e5912018 ldr r2, [r1, #24]
uint32_t file_cln_initial = fat_fd->map.file_cln;
10894: e58dc010 str ip, [sp, #16]
uint32_t cln;
if ( count == 0 )
return cmpltd;
10898: 01a00003 moveq r0, r3
bool zero_fill = start > fat_fd->fat_file_size;
uint32_t file_cln_initial = fat_fd->map.file_cln;
uint32_t cln;
if ( count == 0 )
1089c: 0a00006b beq 10a50 <fat_file_write+0x1e4>
return cmpltd;
if (start >= fat_fd->size_limit)
108a0: e5916014 ldr r6, [r1, #20]
108a4: e1580006 cmp r8, r6
108a8: 3a000003 bcc 108bc <fat_file_write+0x50>
rtems_set_errno_and_return_minus_one(EFBIG);
108ac: eb001fed bl 18868 <__errno> <== NOT EXECUTED
108b0: e3a0301b mov r3, #27 <== NOT EXECUTED
108b4: e5803000 str r3, [r0] <== NOT EXECUTED
108b8: ea000063 b 10a4c <fat_file_write+0x1e0> <== NOT EXECUTED
if (count > fat_fd->size_limit - start)
108bc: e0686006 rsb r6, r8, r6
if ( count == 0 )
return cmpltd;
if (start >= fat_fd->size_limit)
rtems_set_errno_and_return_minus_one(EFBIG);
108c0: e1560003 cmp r6, r3
108c4: 21a06003 movcs r6, r3
if (count > fat_fd->size_limit - start)
count = fat_fd->size_limit - start;
rc = fat_file_extend(fs_info, fat_fd, zero_fill, start + count, &c);
108c8: e0867008 add r7, r6, r8
108cc: e1580002 cmp r8, r2
108d0: e28d3018 add r3, sp, #24
108d4: e58d3000 str r3, [sp]
108d8: 93a02000 movls r2, #0
108dc: 83a02001 movhi r2, #1
108e0: e1a03007 mov r3, r7
108e4: ebffff56 bl 10644 <fat_file_extend>
if (RC_OK == rc)
108e8: e3500000 cmp r0, #0
108ec: 1a000057 bne 10a50 <fat_file_write+0x1e4>
{
/*
* check whether there was enough room on device to locate
* file of 'start + count' bytes
*/
if (c != (start + count))
108f0: e59d3018 ldr r3, [sp, #24]
*/
static bool
fat_is_fat12_or_fat16_root_dir (const fat_file_fd_t *fat_fd,
const uint8_t volume_type)
{
return (FAT_FD_OF_ROOT_DIR(fat_fd)) && (volume_type & (FAT_FAT12 | FAT_FAT16));
108f4: e5942020 ldr r2, [r4, #32]
{
/*
* check whether there was enough room on device to locate
* file of 'start + count' bytes
*/
if (c != (start + count))
108f8: e1530007 cmp r3, r7
count = c - start;
108fc: 10686003 rsbne r6, r8, r3
*/
static bool
fat_is_fat12_or_fat16_root_dir (const fat_file_fd_t *fat_fd,
const uint8_t volume_type)
{
return (FAT_FD_OF_ROOT_DIR(fat_fd)) && (volume_type & (FAT_FAT12 | FAT_FAT16));
10900: e3520001 cmp r2, #1
*/
if (c != (start + count))
count = c - start;
/* for the root directory of FAT12 and FAT16 we need this special handling */
if (fat_is_fat12_or_fat16_root_dir(fat_fd, fs_info->vol.type))
10904: e5d5300e ldrb r3, [r5, #14]
*/
static bool
fat_is_fat12_or_fat16_root_dir (const fat_file_fd_t *fat_fd,
const uint8_t volume_type)
{
return (FAT_FD_OF_ROOT_DIR(fat_fd)) && (volume_type & (FAT_FAT12 | FAT_FAT16));
10908: 1a000052 bne 10a58 <fat_file_write+0x1ec>
1090c: e5940024 ldr r0, [r4, #36] ; 0x24
10910: e3500000 cmp r0, #0
10914: 1a00004f bne 10a58 <fat_file_write+0x1ec>
10918: e3130003 tst r3, #3
1091c: 0a00004d beq 10a58 <fat_file_write+0x1ec>
/* for the root directory of FAT12 and FAT16 we need this special handling */
if (fat_is_fat12_or_fat16_root_dir(fat_fd, fs_info->vol.type))
{
cln = fat_fd->cln;
cln += (start >> fs_info->vol.bpc_log2);
byte = start & (fs_info->vol.bpc -1);
10920: e1d520b6 ldrh r2, [r5, #6]
count = c - start;
/* for the root directory of FAT12 and FAT16 we need this special handling */
if (fat_is_fat12_or_fat16_root_dir(fat_fd, fs_info->vol.type))
{
cln = fat_fd->cln;
10924: e594301c ldr r3, [r4, #28]
cln += (start >> fs_info->vol.bpc_log2);
10928: e5d51008 ldrb r1, [r5, #8]
byte = start & (fs_info->vol.bpc -1);
ret = fat_cluster_write(fs_info,
1092c: e59dc044 ldr ip, [sp, #68] ; 0x44
/* for the root directory of FAT12 and FAT16 we need this special handling */
if (fat_is_fat12_or_fat16_root_dir(fat_fd, fs_info->vol.type))
{
cln = fat_fd->cln;
cln += (start >> fs_info->vol.bpc_log2);
byte = start & (fs_info->vol.bpc -1);
10930: e2422001 sub r2, r2, #1
ret = fat_cluster_write(fs_info,
10934: e58d0004 str r0, [sp, #4]
10938: e0831138 add r1, r3, r8, lsr r1
1093c: e1a00005 mov r0, r5
10940: e0082002 and r2, r8, r2
10944: e1a03006 mov r3, r6
10948: e58dc000 str ip, [sp]
1094c: eb0001b3 bl 11020 <fat_cluster_write>
cln,
byte,
count,
buf,
false);
if (0 > ret)
10950: e3500000 cmp r0, #0
10954: ea00003b b 10a48 <fat_file_write+0x1dc>
int rc = RC_OK;
uint32_t cmpltd = 0;
uint32_t cur_cln = 0;
uint32_t save_cln = 0; /* FIXME: This might be incorrect, cf. below */
uint32_t start_cln = start >> fs_info->vol.bpc_log2;
uint32_t ofs_cln = start - (start_cln << fs_info->vol.bpc_log2);
10958: e59dc008 ldr ip, [sp, #8]
1095c: e048871c sub r8, r8, ip, lsl r7
bool overwrite_cluster = false;
rc = fat_file_lseek(fs_info, fat_fd, start_cln, &cur_cln);
if (RC_OK == rc)
{
file_cln_cnt = cur_cln - fat_fd->cln;
10960: e594301c ldr r3, [r4, #28]
int rc = RC_OK;
uint32_t cmpltd = 0;
uint32_t cur_cln = 0;
uint32_t save_cln = 0; /* FIXME: This might be incorrect, cf. below */
uint32_t start_cln = start >> fs_info->vol.bpc_log2;
uint32_t ofs_cln = start - (start_cln << fs_info->vol.bpc_log2);
10964: e58d800c str r8, [sp, #12]
bool overwrite_cluster = false;
rc = fat_file_lseek(fs_info, fat_fd, start_cln, &cur_cln);
if (RC_OK == rc)
{
file_cln_cnt = cur_cln - fat_fd->cln;
10968: e59d801c ldr r8, [sp, #28]
1096c: e58d4014 str r4, [sp, #20]
10970: e0638008 rsb r8, r3, r8
int rc = RC_OK;
uint32_t cmpltd = 0;
uint32_t cur_cln = 0;
uint32_t save_cln = 0; /* FIXME: This might be incorrect, cf. below */
uint32_t start_cln = start >> fs_info->vol.bpc_log2;
uint32_t ofs_cln = start - (start_cln << fs_info->vol.bpc_log2);
10974: e59d700c ldr r7, [sp, #12]
uint32_t ofs_cln_save = ofs_cln;
uint32_t bytes_to_write = count;
uint32_t file_cln_cnt;
ssize_t ret;
uint32_t c;
bool overwrite_cluster = false;
10978: e1a0b000 mov fp, r0
const uint32_t count,
const uint8_t *buf,
const uint32_t file_cln_initial)
{
int rc = RC_OK;
uint32_t cmpltd = 0;
1097c: e1a0a000 mov sl, r0
10980: e1a04000 mov r4, r0
10984: ea00001c b 109fc <fat_file_write+0x190>
&& (bytes_to_write > 0))
{
c = MIN(bytes_to_write, (fs_info->vol.bpc - ofs_cln));
if (file_cln_initial < file_cln_cnt)
overwrite_cluster = true;
10988: e59dc010 ldr ip, [sp, #16]
{
file_cln_cnt = cur_cln - fat_fd->cln;
while ( (RC_OK == rc)
&& (bytes_to_write > 0))
{
c = MIN(bytes_to_write, (fs_info->vol.bpc - ofs_cln));
1098c: e1d530b6 ldrh r3, [r5, #6]
if (file_cln_initial < file_cln_cnt)
overwrite_cluster = true;
10990: e15c0008 cmp ip, r8
ret = fat_cluster_write(fs_info,
10994: e59dc044 ldr ip, [sp, #68] ; 0x44
&& (bytes_to_write > 0))
{
c = MIN(bytes_to_write, (fs_info->vol.bpc - ofs_cln));
if (file_cln_initial < file_cln_cnt)
overwrite_cluster = true;
10998: 33a0b001 movcc fp, #1
ret = fat_cluster_write(fs_info,
1099c: e08c200a add r2, ip, sl
{
file_cln_cnt = cur_cln - fat_fd->cln;
while ( (RC_OK == rc)
&& (bytes_to_write > 0))
{
c = MIN(bytes_to_write, (fs_info->vol.bpc - ofs_cln));
109a0: e0673003 rsb r3, r7, r3
if (file_cln_initial < file_cln_cnt)
overwrite_cluster = true;
ret = fat_cluster_write(fs_info,
109a4: e88d0804 stm sp, {r2, fp}
109a8: e1530006 cmp r3, r6
109ac: 21a03006 movcs r3, r6
109b0: e1a00005 mov r0, r5
109b4: e59d101c ldr r1, [sp, #28]
109b8: e1a02007 mov r2, r7
109bc: eb000197 bl 11020 <fat_cluster_write>
cur_cln,
ofs_cln,
c,
&buf[cmpltd],
overwrite_cluster);
if (0 > ret)
109c0: e3500000 cmp r0, #0
109c4: b3e00000 mvnlt r0, #0
109c8: ba00000b blt 109fc <fat_file_write+0x190>
{
++file_cln_cnt;
bytes_to_write -= ret;
cmpltd += ret;
save_cln = cur_cln;
if (0 < bytes_to_write)
109cc: e0566000 subs r6, r6, r0
if (RC_OK == rc)
{
++file_cln_cnt;
bytes_to_write -= ret;
cmpltd += ret;
109d0: e08aa000 add sl, sl, r0
if (0 > ret)
rc = -1;
if (RC_OK == rc)
{
++file_cln_cnt;
109d4: e2888001 add r8, r8, #1
bytes_to_write -= ret;
cmpltd += ret;
save_cln = cur_cln;
109d8: e59d401c ldr r4, [sp, #28]
if (0 < bytes_to_write)
109dc: 01a00006 moveq r0, r6
rc = fat_get_fat_cluster(fs_info, cur_cln, &cur_cln);
ofs_cln = 0;
109e0: 01a07006 moveq r7, r6
{
++file_cln_cnt;
bytes_to_write -= ret;
cmpltd += ret;
save_cln = cur_cln;
if (0 < bytes_to_write)
109e4: 0a000004 beq 109fc <fat_file_write+0x190>
rc = fat_get_fat_cluster(fs_info, cur_cln, &cur_cln);
109e8: e1a00005 mov r0, r5
109ec: e1a01004 mov r1, r4
109f0: e1a02009 mov r2, r9
109f4: eb00181f bl 16a78 <fat_get_fat_cluster>
ofs_cln = 0;
109f8: e3a07000 mov r7, #0
rc = fat_file_lseek(fs_info, fat_fd, start_cln, &cur_cln);
if (RC_OK == rc)
{
file_cln_cnt = cur_cln - fat_fd->cln;
while ( (RC_OK == rc)
109fc: e2963000 adds r3, r6, #0
10a00: 13a03001 movne r3, #1
10a04: e3500000 cmp r0, #0
10a08: 13a03000 movne r3, #0
10a0c: e3530000 cmp r3, #0
10a10: 1affffdc bne 10988 <fat_file_write+0x11c>
}
/* update cache */
/* XXX: check this - I'm not sure :( */
fat_fd->map.file_cln = start_cln +
((ofs_cln_save + cmpltd - 1) >> fs_info->vol.bpc_log2);
10a14: e59d100c ldr r1, [sp, #12]
10a18: e5d53008 ldrb r3, [r5, #8]
10a1c: e2417001 sub r7, r1, #1
}
}
/* update cache */
/* XXX: check this - I'm not sure :( */
fat_fd->map.file_cln = start_cln +
10a20: e59d2008 ldr r2, [sp, #8]
((ofs_cln_save + cmpltd - 1) >> fs_info->vol.bpc_log2);
10a24: e087700a add r7, r7, sl
}
}
/* update cache */
/* XXX: check this - I'm not sure :( */
fat_fd->map.file_cln = start_cln +
10a28: e0827337 add r7, r2, r7, lsr r3
10a2c: e1a0c004 mov ip, r4
10a30: e59d4014 ldr r4, [sp, #20]
}
if (RC_OK != rc)
return rc;
else
return cmpltd;
10a34: e3500000 cmp r0, #0
}
}
/* update cache */
/* XXX: check this - I'm not sure :( */
fat_fd->map.file_cln = start_cln +
10a38: e5847034 str r7, [r4, #52] ; 0x34
((ofs_cln_save + cmpltd - 1) >> fs_info->vol.bpc_log2);
fat_fd->map.disk_cln = save_cln;
10a3c: e584c038 str ip, [r4, #56] ; 0x38
}
if (RC_OK != rc)
return rc;
else
return cmpltd;
10a40: 01a0000a moveq r0, sl
fat_fd,
start,
count,
buf,
file_cln_initial);
if (0 > ret)
10a44: e3500000 cmp r0, #0
10a48: aa000000 bge 10a50 <fat_file_write+0x1e4>
rc = -1;
10a4c: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
if (RC_OK != rc)
return rc;
else
return cmpltd;
}
10a50: e28dd020 add sp, sp, #32
10a54: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
{
int rc = RC_OK;
uint32_t cmpltd = 0;
uint32_t cur_cln = 0;
uint32_t save_cln = 0; /* FIXME: This might be incorrect, cf. below */
uint32_t start_cln = start >> fs_info->vol.bpc_log2;
10a58: e5d57008 ldrb r7, [r5, #8]
10a5c: e1a0c738 lsr ip, r8, r7
const uint8_t *buf,
const uint32_t file_cln_initial)
{
int rc = RC_OK;
uint32_t cmpltd = 0;
uint32_t cur_cln = 0;
10a60: e28d9020 add r9, sp, #32
10a64: e3a03000 mov r3, #0
10a68: e5293004 str r3, [r9, #-4]!
uint32_t file_cln_cnt;
ssize_t ret;
uint32_t c;
bool overwrite_cluster = false;
rc = fat_file_lseek(fs_info, fat_fd, start_cln, &cur_cln);
10a6c: e1a00005 mov r0, r5
10a70: e1a01004 mov r1, r4
10a74: e1a0200c mov r2, ip
10a78: e1a03009 mov r3, r9
{
int rc = RC_OK;
uint32_t cmpltd = 0;
uint32_t cur_cln = 0;
uint32_t save_cln = 0; /* FIXME: This might be incorrect, cf. below */
uint32_t start_cln = start >> fs_info->vol.bpc_log2;
10a7c: e58dc008 str ip, [sp, #8]
uint32_t file_cln_cnt;
ssize_t ret;
uint32_t c;
bool overwrite_cluster = false;
rc = fat_file_lseek(fs_info, fat_fd, start_cln, &cur_cln);
10a80: ebfffd7d bl 1007c <fat_file_lseek>
if (RC_OK == rc)
10a84: e3500000 cmp r0, #0
10a88: 0affffb2 beq 10958 <fat_file_write+0xec>
10a8c: eaffffec b 10a44 <fat_file_write+0x1d8> <== NOT EXECUTED
00016dd0 <fat_free_fat_clusters_chain>:
int
fat_free_fat_clusters_chain(
fat_fs_info_t *fs_info,
uint32_t chain
)
{
16dd0: e92d47f1 push {r0, r4, r5, r6, r7, r8, r9, sl, lr}
int rc = RC_OK, rc1 = RC_OK;
uint32_t cur_cln = chain;
uint32_t next_cln = 0;
16dd4: e3a05000 mov r5, #0
16dd8: e28d8004 add r8, sp, #4
int
fat_free_fat_clusters_chain(
fat_fs_info_t *fs_info,
uint32_t chain
)
{
16ddc: e1a04000 mov r4, r0
16de0: e1a0a001 mov sl, r1
int rc = RC_OK, rc1 = RC_OK;
uint32_t cur_cln = chain;
uint32_t next_cln = 0;
16de4: e5285004 str r5, [r8, #-4]!
fat_fs_info_t *fs_info,
uint32_t chain
)
{
int rc = RC_OK, rc1 = RC_OK;
uint32_t cur_cln = chain;
16de8: e1a06001 mov r6, r1
fat_free_fat_clusters_chain(
fat_fs_info_t *fs_info,
uint32_t chain
)
{
int rc = RC_OK, rc1 = RC_OK;
16dec: e1a07005 mov r7, r5
uint32_t cur_cln = chain;
uint32_t next_cln = 0;
uint32_t freed_cls_cnt = 0;
while ((cur_cln & fs_info->vol.mask) < fs_info->vol.eoc_val)
16df0: ea000014 b 16e48 <fat_free_fat_clusters_chain+0x78>
{
rc = fat_get_fat_cluster(fs_info, cur_cln, &next_cln);
16df4: e1a00004 mov r0, r4
16df8: e1a01006 mov r1, r6
16dfc: e1a0200d mov r2, sp
16e00: ebffff1c bl 16a78 <fat_get_fat_cluster>
if ( rc != RC_OK )
16e04: e2509000 subs r9, r0, #0
16e08: 0a000006 beq 16e28 <fat_free_fat_clusters_chain+0x58>
{
if(fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
16e0c: e5943044 ldr r3, [r4, #68] ; 0x44 <== NOT EXECUTED
16e10: e3730001 cmn r3, #1 <== NOT EXECUTED
fs_info->vol.free_cls += freed_cls_cnt;
16e14: 10855003 addne r5, r5, r3 <== NOT EXECUTED
16e18: 15845044 strne r5, [r4, #68] ; 0x44 <== NOT EXECUTED
fat_buf_release(fs_info);
16e1c: e1a00004 mov r0, r4 <== NOT EXECUTED
16e20: ebffe768 bl 10bc8 <fat_buf_release> <== NOT EXECUTED
return rc;
16e24: ea000014 b 16e7c <fat_free_fat_clusters_chain+0xac> <== NOT EXECUTED
}
rc = fat_set_fat_cluster(fs_info, cur_cln, FAT_GENFAT_FREE);
16e28: e1a01006 mov r1, r6
16e2c: e1a00004 mov r0, r4
16e30: e1a02009 mov r2, r9
16e34: ebffff63 bl 16bc8 <fat_set_fat_cluster>
if ( rc != RC_OK )
rc1 = rc;
freed_cls_cnt++;
cur_cln = next_cln;
16e38: e59d6000 ldr r6, [sp]
fat_buf_release(fs_info);
return rc;
}
rc = fat_set_fat_cluster(fs_info, cur_cln, FAT_GENFAT_FREE);
if ( rc != RC_OK )
16e3c: e3500000 cmp r0, #0
16e40: 11a07000 movne r7, r0
rc1 = rc;
freed_cls_cnt++;
16e44: e2855001 add r5, r5, #1
int rc = RC_OK, rc1 = RC_OK;
uint32_t cur_cln = chain;
uint32_t next_cln = 0;
uint32_t freed_cls_cnt = 0;
while ((cur_cln & fs_info->vol.mask) < fs_info->vol.eoc_val)
16e48: e5942010 ldr r2, [r4, #16]
16e4c: e5943014 ldr r3, [r4, #20]
16e50: e0062002 and r2, r6, r2
16e54: e1520003 cmp r2, r3
16e58: 3affffe5 bcc 16df4 <fat_free_fat_clusters_chain+0x24>
freed_cls_cnt++;
cur_cln = next_cln;
}
fs_info->vol.next_cl = chain;
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
16e5c: e5943044 ldr r3, [r4, #68] ; 0x44
16e60: e3730001 cmn r3, #1
fs_info->vol.free_cls += freed_cls_cnt;
16e64: 10855003 addne r5, r5, r3
freed_cls_cnt++;
cur_cln = next_cln;
}
fs_info->vol.next_cl = chain;
16e68: e584a04c str sl, [r4, #76] ; 0x4c
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
fs_info->vol.free_cls += freed_cls_cnt;
16e6c: 15845044 strne r5, [r4, #68] ; 0x44
fat_buf_release(fs_info);
16e70: e1a00004 mov r0, r4
16e74: ebffe753 bl 10bc8 <fat_buf_release>
16e78: e1a09007 mov r9, r7
if (rc1 != RC_OK)
return rc1;
return RC_OK;
}
16e7c: e1a00009 mov r0, r9
16e80: e8bd87f8 pop {r3, r4, r5, r6, r7, r8, r9, sl, pc}
00011a58 <fat_free_unique_ino>:
fat_free_unique_ino(
fat_fs_info_t *fs_info,
uint32_t ino
)
{
FAT_SET_UNIQ_INO_FREE((ino - fs_info->uino_base), fs_info->uino);
11a58: e5903080 ldr r3, [r0, #128] ; 0x80 <== NOT EXECUTED
11a5c: e5902074 ldr r2, [r0, #116] ; 0x74 <== NOT EXECUTED
11a60: e0633001 rsb r3, r3, r1 <== NOT EXECUTED
11a64: e7d201a3 ldrb r0, [r2, r3, lsr #3] <== NOT EXECUTED
11a68: e2031007 and r1, r3, #7 <== NOT EXECUTED
11a6c: e3a0c001 mov ip, #1 <== NOT EXECUTED
11a70: e1c0111c bic r1, r0, ip, lsl r1 <== NOT EXECUTED
11a74: e7c211a3 strb r1, [r2, r3, lsr #3] <== NOT EXECUTED
}
11a78: e12fff1e bx lr <== NOT EXECUTED
00016a78 <fat_get_fat_cluster>:
uint8_t *sec_buf;
uint32_t sec = 0;
uint32_t ofs = 0;
/* sanity check */
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
16a78: e3510001 cmp r1, #1
fat_get_fat_cluster(
fat_fs_info_t *fs_info,
uint32_t cln,
uint32_t *ret_val
)
{
16a7c: e92d47f1 push {r0, r4, r5, r6, r7, r8, r9, sl, lr}
16a80: e1a06000 mov r6, r0
16a84: e1a04001 mov r4, r1
16a88: e1a05002 mov r5, r2
uint8_t *sec_buf;
uint32_t sec = 0;
uint32_t ofs = 0;
/* sanity check */
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
16a8c: 9a000045 bls 16ba8 <fat_get_fat_cluster+0x130>
16a90: e5903038 ldr r3, [r0, #56] ; 0x38
16a94: e2833001 add r3, r3, #1
16a98: e1510003 cmp r1, r3
16a9c: 8a000041 bhi 16ba8 <fat_get_fat_cluster+0x130>
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
16aa0: e5d0300e ldrb r3, [r0, #14]
16aa4: e2131001 ands r1, r3, #1
16aa8: 108420a4 addne r2, r4, r4, lsr #1
16aac: 1a000002 bne 16abc <fat_get_fat_cluster+0x44>
16ab0: e3130002 tst r3, #2
16ab4: 11a02084 lslne r2, r4, #1
16ab8: 01a02104 lsleq r2, r4, #2
16abc: e5d69002 ldrb r9, [r6, #2]
16ac0: e5960058 ldr r0, [r6, #88] ; 0x58
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16ac4: e3510000 cmp r1, #0
/* sanity check */
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
16ac8: e0809932 add r9, r0, r2, lsr r9
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16acc: 1084a0a4 addne sl, r4, r4, lsr #1
16ad0: 1a000002 bne 16ae0 <fat_get_fat_cluster+0x68>
16ad4: e3130002 tst r3, #2
16ad8: 11a0a084 lslne sl, r4, #1
16adc: 01a0a104 lsleq sl, r4, #2
rc = fat_buf_access(fs_info, sec, FAT_OP_TYPE_READ, &sec_buf);
16ae0: e1a00006 mov r0, r6
16ae4: e1a01009 mov r1, r9
16ae8: e3a02001 mov r2, #1
16aec: e1a0300d mov r3, sp
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16af0: e1d670b0 ldrh r7, [r6]
rc = fat_buf_access(fs_info, sec, FAT_OP_TYPE_READ, &sec_buf);
16af4: ebffe896 bl 10d54 <fat_buf_access>
if (rc != RC_OK)
16af8: e2508000 subs r8, r0, #0
16afc: 1a00002f bne 16bc0 <fat_get_fat_cluster+0x148>
return rc;
switch ( fs_info->vol.type )
16b00: e5d6200e ldrb r2, [r6, #14]
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16b04: e2477001 sub r7, r7, #1
rc = fat_buf_access(fs_info, sec, FAT_OP_TYPE_READ, &sec_buf);
if (rc != RC_OK)
return rc;
switch ( fs_info->vol.type )
16b08: e3520002 cmp r2, #2
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16b0c: e00aa007 and sl, sl, r7
rc = fat_buf_access(fs_info, sec, FAT_OP_TYPE_READ, &sec_buf);
if (rc != RC_OK)
return rc;
switch ( fs_info->vol.type )
16b10: 0a00001d beq 16b8c <fat_get_fat_cluster+0x114>
16b14: e3520004 cmp r2, #4
16b18: 0a00001e beq 16b98 <fat_get_fat_cluster+0x120>
16b1c: e3520001 cmp r2, #1
16b20: 1a000020 bne 16ba8 <fat_get_fat_cluster+0x130>
case FAT_FAT12:
/*
* we are enforced in complex computations for FAT12 to escape CPU
* align problems for some architectures
*/
*ret_val = (*(sec_buf + ofs));
16b24: e59d7000 ldr r7, [sp]
if ( ofs == (fs_info->vol.bps - 1) )
16b28: e1d610b0 ldrh r1, [r6]
case FAT_FAT12:
/*
* we are enforced in complex computations for FAT12 to escape CPU
* align problems for some architectures
*/
*ret_val = (*(sec_buf + ofs));
16b2c: e7d7300a ldrb r3, [r7, sl]
if ( ofs == (fs_info->vol.bps - 1) )
16b30: e2411001 sub r1, r1, #1
16b34: e15a0001 cmp sl, r1
case FAT_FAT12:
/*
* we are enforced in complex computations for FAT12 to escape CPU
* align problems for some architectures
*/
*ret_val = (*(sec_buf + ofs));
16b38: e5853000 str r3, [r5]
*ret_val |= *sec_buf << 8;
}
else
{
*ret_val |= *(sec_buf + ofs + 1) << 8;
16b3c: 1087a00a addne sl, r7, sl
16b40: 15da2001 ldrbne r2, [sl, #1]
/*
* we are enforced in complex computations for FAT12 to escape CPU
* align problems for some architectures
*/
*ret_val = (*(sec_buf + ofs));
if ( ofs == (fs_info->vol.bps - 1) )
16b44: 1a000008 bne 16b6c <fat_get_fat_cluster+0xf4>
{
rc = fat_buf_access(fs_info, sec + 1, FAT_OP_TYPE_READ,
16b48: e1a0300d mov r3, sp <== NOT EXECUTED
16b4c: e1a00006 mov r0, r6 <== NOT EXECUTED
16b50: e2891001 add r1, r9, #1 <== NOT EXECUTED
16b54: ebffe87e bl 10d54 <fat_buf_access> <== NOT EXECUTED
&sec_buf);
if (rc != RC_OK)
16b58: e3500000 cmp r0, #0 <== NOT EXECUTED
return rc;
*ret_val |= *sec_buf << 8;
16b5c: 059d3000 ldreq r3, [sp] <== NOT EXECUTED
16b60: 05d32000 ldrbeq r2, [r3] <== NOT EXECUTED
16b64: 05953000 ldreq r3, [r5] <== NOT EXECUTED
*ret_val = (*(sec_buf + ofs));
if ( ofs == (fs_info->vol.bps - 1) )
{
rc = fat_buf_access(fs_info, sec + 1, FAT_OP_TYPE_READ,
&sec_buf);
if (rc != RC_OK)
16b68: 1a000013 bne 16bbc <fat_get_fat_cluster+0x144> <== NOT EXECUTED
*ret_val |= *sec_buf << 8;
}
else
{
*ret_val |= *(sec_buf + ofs + 1) << 8;
16b6c: e1833402 orr r3, r3, r2, lsl #8
16b70: e5853000 str r3, [r5]
16b74: e5953000 ldr r3, [r5]
}
if ( FAT_CLUSTER_IS_ODD(cln) )
16b78: e3140001 tst r4, #1
*ret_val = (*ret_val) >> FAT12_SHIFT;
else
*ret_val = (*ret_val) & FAT_FAT12_MASK;
16b7c: 01a03a03 lsleq r3, r3, #20
{
*ret_val |= *(sec_buf + ofs + 1) << 8;
}
if ( FAT_CLUSTER_IS_ODD(cln) )
*ret_val = (*ret_val) >> FAT12_SHIFT;
16b80: 11a03223 lsrne r3, r3, #4
else
*ret_val = (*ret_val) & FAT_FAT12_MASK;
16b84: 01a03a23 lsreq r3, r3, #20
16b88: ea000004 b 16ba0 <fat_get_fat_cluster+0x128>
break;
case FAT_FAT16:
*ret_val = *((uint16_t *)(sec_buf + ofs));
16b8c: e59d3000 ldr r3, [sp]
16b90: e19330ba ldrh r3, [r3, sl]
16b94: ea000001 b 16ba0 <fat_get_fat_cluster+0x128>
*ret_val = CF_LE_W(*ret_val);
break;
case FAT_FAT32:
*ret_val = *((uint32_t *)(sec_buf + ofs));
16b98: e59d3000 ldr r3, [sp]
16b9c: e793300a ldr r3, [r3, sl]
16ba0: e5853000 str r3, [r5]
*ret_val = CF_LE_L(*ret_val);
break;
16ba4: ea000005 b 16bc0 <fat_get_fat_cluster+0x148>
default:
rtems_set_errno_and_return_minus_one(EIO);
16ba8: eb00072e bl 18868 <__errno> <== NOT EXECUTED
16bac: e3a03005 mov r3, #5 <== NOT EXECUTED
16bb0: e5803000 str r3, [r0] <== NOT EXECUTED
16bb4: e3e08000 mvn r8, #0 <== NOT EXECUTED
16bb8: ea000000 b 16bc0 <fat_get_fat_cluster+0x148> <== NOT EXECUTED
*ret_val = (*(sec_buf + ofs));
if ( ofs == (fs_info->vol.bps - 1) )
{
rc = fat_buf_access(fs_info, sec + 1, FAT_OP_TYPE_READ,
&sec_buf);
if (rc != RC_OK)
16bbc: e1a08000 mov r8, r0 <== NOT EXECUTED
rtems_set_errno_and_return_minus_one(EIO);
break;
}
return RC_OK;
}
16bc0: e1a00008 mov r0, r8
16bc4: e8bd87f8 pop {r3, r4, r5, r6, r7, r8, r9, sl, pc}
000119a4 <fat_get_unique_ino>:
* 0 means FAILED !!!
*
*/
uint32_t
fat_get_unique_ino(fat_fs_info_t *fs_info)
{
119a4: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED
119a8: e1a04000 mov r4, r0 <== NOT EXECUTED
uint32_t j = 0;
bool resrc_unsuff = false;
while (!resrc_unsuff)
{
for (j = 0; j < fs_info->uino_pool_size; j++)
119ac: e3a05000 mov r5, #0 <== NOT EXECUTED
fat_get_unique_ino(fat_fs_info_t *fs_info)
{
uint32_t j = 0;
bool resrc_unsuff = false;
while (!resrc_unsuff)
119b0: ea000023 b 11a44 <fat_get_unique_ino+0xa0> <== NOT EXECUTED
{
for (j = 0; j < fs_info->uino_pool_size; j++)
{
if (!FAT_UNIQ_INO_IS_BUSY(fs_info->index, fs_info->uino))
119b4: e2840074 add r0, r4, #116 ; 0x74 <== NOT EXECUTED
119b8: e8900009 ldm r0, {r0, r3} <== NOT EXECUTED
119bc: e08061a3 add r6, r0, r3, lsr #3 <== NOT EXECUTED
119c0: e7d001a3 ldrb r0, [r0, r3, lsr #3] <== NOT EXECUTED
119c4: e203c007 and ip, r3, #7 <== NOT EXECUTED
119c8: e1a07c50 asr r7, r0, ip <== NOT EXECUTED
119cc: e3170001 tst r7, #1 <== NOT EXECUTED
119d0: 1a000006 bne 119f0 <fat_get_unique_ino+0x4c> <== NOT EXECUTED
{
FAT_SET_UNIQ_INO_BUSY(fs_info->index, fs_info->uino);
119d4: e3a03001 mov r3, #1 <== NOT EXECUTED
119d8: e1800c13 orr r0, r0, r3, lsl ip <== NOT EXECUTED
119dc: e5c60000 strb r0, [r6] <== NOT EXECUTED
return (fs_info->uino_base + fs_info->index);
119e0: e5940078 ldr r0, [r4, #120] ; 0x78 <== NOT EXECUTED
119e4: e5943080 ldr r3, [r4, #128] ; 0x80 <== NOT EXECUTED
119e8: e0800003 add r0, r0, r3 <== NOT EXECUTED
119ec: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
}
fs_info->index++;
119f0: e2833001 add r3, r3, #1 <== NOT EXECUTED
if (fs_info->index >= fs_info->uino_pool_size)
119f4: e1530002 cmp r3, r2 <== NOT EXECUTED
fs_info->index = 0;
119f8: 21a03005 movcs r3, r5 <== NOT EXECUTED
119fc: e5843078 str r3, [r4, #120] ; 0x78 <== NOT EXECUTED
uint32_t j = 0;
bool resrc_unsuff = false;
while (!resrc_unsuff)
{
for (j = 0; j < fs_info->uino_pool_size; j++)
11a00: e2811001 add r1, r1, #1 <== NOT EXECUTED
11a04: e1510002 cmp r1, r2 <== NOT EXECUTED
11a08: 1affffe9 bne 119b4 <fat_get_unique_ino+0x10> <== NOT EXECUTED
fs_info->index++;
if (fs_info->index >= fs_info->uino_pool_size)
fs_info->index = 0;
}
if ((fs_info->uino_pool_size << 1) < (0x0FFFFFFF - fs_info->uino_base))
11a0c: e5942080 ldr r2, [r4, #128] ; 0x80 <== NOT EXECUTED
11a10: e3e0320f mvn r3, #-268435456 ; 0xf0000000 <== NOT EXECUTED
11a14: e1a01081 lsl r1, r1, #1 <== NOT EXECUTED
11a18: e0623003 rsb r3, r2, r3 <== NOT EXECUTED
11a1c: e1510003 cmp r1, r3 <== NOT EXECUTED
11a20: 2a00000a bcs 11a50 <fat_get_unique_ino+0xac> <== NOT EXECUTED
{
fs_info->uino_pool_size <<= 1;
11a24: e584107c str r1, [r4, #124] ; 0x7c <== NOT EXECUTED
fs_info->uino = realloc(fs_info->uino, fs_info->uino_pool_size);
11a28: e5940074 ldr r0, [r4, #116] ; 0x74 <== NOT EXECUTED
11a2c: ebffcd47 bl 4f50 <realloc> <== NOT EXECUTED
if (fs_info->uino != NULL)
11a30: e3500000 cmp r0, #0 <== NOT EXECUTED
}
if ((fs_info->uino_pool_size << 1) < (0x0FFFFFFF - fs_info->uino_base))
{
fs_info->uino_pool_size <<= 1;
fs_info->uino = realloc(fs_info->uino, fs_info->uino_pool_size);
11a34: e5840074 str r0, [r4, #116] ; 0x74 <== NOT EXECUTED
if (fs_info->uino != NULL)
11a38: 08bd80f0 popeq {r4, r5, r6, r7, pc} <== NOT EXECUTED
fs_info->index = fs_info->uino_pool_size;
11a3c: e594307c ldr r3, [r4, #124] ; 0x7c <== NOT EXECUTED
11a40: e5843078 str r3, [r4, #120] ; 0x78 <== NOT EXECUTED
uint32_t j = 0;
bool resrc_unsuff = false;
while (!resrc_unsuff)
{
for (j = 0; j < fs_info->uino_pool_size; j++)
11a44: e594207c ldr r2, [r4, #124] ; 0x7c <== NOT EXECUTED
11a48: e3a01000 mov r1, #0 <== NOT EXECUTED
11a4c: eaffffec b 11a04 <fat_get_unique_ino+0x60> <== NOT EXECUTED
resrc_unsuff = true;
}
else
resrc_unsuff = true;
}
return 0;
11a50: e3a00000 mov r0, #0 <== NOT EXECUTED
}
11a54: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
0001192c <fat_init_clusters_chain>:
int
fat_init_clusters_chain(
fat_fs_info_t *fs_info,
uint32_t start_cln
)
{
1192c: e92d4073 push {r0, r1, r4, r5, r6, lr}
int rc = RC_OK;
ssize_t ret = 0;
uint32_t cur_cln = start_cln;
11930: e28d5008 add r5, sp, #8
int
fat_init_clusters_chain(
fat_fs_info_t *fs_info,
uint32_t start_cln
)
{
11934: e1a04000 mov r4, r0
int rc = RC_OK;
ssize_t ret = 0;
uint32_t cur_cln = start_cln;
11938: e5251004 str r1, [r5, #-4]!
1193c: e3a06000 mov r6, #0
while ((cur_cln & fs_info->vol.mask) < fs_info->vol.eoc_val)
11940: ea00000d b 1197c <fat_init_clusters_chain+0x50>
{
ret = fat_cluster_set(fs_info, cur_cln, 0, fs_info->vol.bpc, 0);
11944: e1d430b6 ldrh r3, [r4, #6]
11948: e1a00004 mov r0, r4
1194c: e3a02000 mov r2, #0
11950: e58d6000 str r6, [sp]
11954: ebfffd73 bl 10f28 <fat_cluster_set>
if ( ret != fs_info->vol.bpc )
11958: e1d430b6 ldrh r3, [r4, #6]
1195c: e1500003 cmp r0, r3
11960: 1a00000d bne 1199c <fat_init_clusters_chain+0x70>
{
return -1;
}
rc = fat_get_fat_cluster(fs_info, cur_cln, &cur_cln);
11964: e1a00004 mov r0, r4
11968: e59d1004 ldr r1, [sp, #4]
1196c: e1a02005 mov r2, r5
11970: eb001440 bl 16a78 <fat_get_fat_cluster>
if ( rc != RC_OK )
11974: e3500000 cmp r0, #0
11978: 1a000008 bne 119a0 <fat_init_clusters_chain+0x74>
{
int rc = RC_OK;
ssize_t ret = 0;
uint32_t cur_cln = start_cln;
while ((cur_cln & fs_info->vol.mask) < fs_info->vol.eoc_val)
1197c: e59d1004 ldr r1, [sp, #4]
11980: e5942010 ldr r2, [r4, #16]
11984: e5943014 ldr r3, [r4, #20]
11988: e0012002 and r2, r1, r2
1198c: e1520003 cmp r2, r3
11990: 3affffeb bcc 11944 <fat_init_clusters_chain+0x18>
return rc;
}
}
return rc;
11994: e3a00000 mov r0, #0
11998: ea000000 b 119a0 <fat_init_clusters_chain+0x74>
while ((cur_cln & fs_info->vol.mask) < fs_info->vol.eoc_val)
{
ret = fat_cluster_set(fs_info, cur_cln, 0, fs_info->vol.bpc, 0);
if ( ret != fs_info->vol.bpc )
{
return -1;
1199c: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
}
return rc;
}
119a0: e8bd807c pop {r2, r3, r4, r5, r6, pc}
00011128 <fat_init_volume_info>:
* RC_OK on success, or -1 if error occured
* and errno set appropriately
*/
int
fat_init_volume_info(fat_fs_info_t *fs_info, const char *device)
{
11128: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
char boot_rec[FAT_MAX_BPB_SIZE];
char fs_info_sector[FAT_USEFUL_INFO_SIZE];
ssize_t ret = 0;
struct stat stat_buf;
int i = 0;
rtems_bdbuf_buffer *block = NULL;
1112c: e3a03000 mov r3, #0
* RC_OK on success, or -1 if error occured
* and errno set appropriately
*/
int
fat_init_volume_info(fat_fs_info_t *fs_info, const char *device)
{
11130: e24dd0ac sub sp, sp, #172 ; 0xac
11134: e1a04000 mov r4, r0
ssize_t ret = 0;
struct stat stat_buf;
int i = 0;
rtems_bdbuf_buffer *block = NULL;
vol->fd = open(device, O_RDWR);
11138: e1a00001 mov r0, r1
1113c: e3a01002 mov r1, #2
char boot_rec[FAT_MAX_BPB_SIZE];
char fs_info_sector[FAT_USEFUL_INFO_SIZE];
ssize_t ret = 0;
struct stat stat_buf;
int i = 0;
rtems_bdbuf_buffer *block = NULL;
11140: e58d30a8 str r3, [sp, #168] ; 0xa8
vol->fd = open(device, O_RDWR);
11144: ebffcefd bl 4d40 <open>
if (vol->fd < 0)
11148: e3500000 cmp r0, #0
ssize_t ret = 0;
struct stat stat_buf;
int i = 0;
rtems_bdbuf_buffer *block = NULL;
vol->fd = open(device, O_RDWR);
1114c: e5840060 str r0, [r4, #96] ; 0x60
if (vol->fd < 0)
11150: ba000005 blt 1116c <fat_init_volume_info+0x44>
{
rtems_set_errno_and_return_minus_one(ENXIO);
}
rc = fstat(vol->fd, &stat_buf);
11154: e28d1054 add r1, sp, #84 ; 0x54
11158: ebffcbd8 bl 40c0 <fstat>
if (rc != 0)
1115c: e3500000 cmp r0, #0
11160: 0a000006 beq 11180 <fat_init_volume_info+0x58>
{
close(vol->fd);
11164: e5940060 ldr r0, [r4, #96] ; 0x60 <== NOT EXECUTED
11168: ebffcb09 bl 3d94 <close> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one(ENXIO);
1116c: eb001dbd bl 18868 <__errno> <== NOT EXECUTED
11170: e3a03006 mov r3, #6 <== NOT EXECUTED
11174: e5803000 str r3, [r0] <== NOT EXECUTED
11178: e3e00000 mvn r0, #0 <== NOT EXECUTED
1117c: ea000189 b 117a8 <fat_init_volume_info+0x680> <== NOT EXECUTED
}
/* Must be a block device. */
if (!S_ISBLK(stat_buf.st_mode))
11180: e59d3060 ldr r3, [sp, #96] ; 0x60
11184: e2033a0f and r3, r3, #61440 ; 0xf000
11188: e3530a06 cmp r3, #24576 ; 0x6000
{
close(vol->fd);
1118c: e5940060 ldr r0, [r4, #96] ; 0x60
close(vol->fd);
rtems_set_errno_and_return_minus_one(ENXIO);
}
/* Must be a block device. */
if (!S_ISBLK(stat_buf.st_mode))
11190: 1afffff4 bne 11168 <fat_init_volume_info+0x40>
static inline int rtems_disk_fd_get_disk_device(
int fd,
rtems_disk_device **dd_ptr
)
{
return ioctl(fd, RTEMS_BLKIO_GETDISKDEV, dd_ptr);
11194: e59f1614 ldr r1, [pc, #1556] ; 117b0 <fat_init_volume_info+0x688>
11198: e2842064 add r2, r4, #100 ; 0x64
1119c: eb000516 bl 125fc <ioctl>
rtems_set_errno_and_return_minus_one(ENXIO);
}
/* check that device is registred as block device and lock it */
rc = rtems_disk_fd_get_disk_device(vol->fd, &vol->dd);
if (rc != 0) {
111a0: e2501000 subs r1, r0, #0
111a4: 1affffee bne 11164 <fat_init_volume_info+0x3c>
rtems_set_errno_and_return_minus_one(ENXIO);
}
/* Read boot record */
/* FIXME: Asserts FAT_MAX_BPB_SIZE < bdbuf block size */
sc = rtems_bdbuf_read( vol->dd, 0, &block);
111a8: e5940064 ldr r0, [r4, #100] ; 0x64
111ac: e28d20a8 add r2, sp, #168 ; 0xa8
111b0: ebfff728 bl ee58 <rtems_bdbuf_read>
if (sc != RTEMS_SUCCESSFUL)
111b4: e3500000 cmp r0, #0
111b8: 1a000033 bne 1128c <fat_init_volume_info+0x164>
{
close(vol->fd);
rtems_set_errno_and_return_minus_one( EIO);
}
memcpy( boot_rec, block->buffer, FAT_MAX_BPB_SIZE);
111bc: e59d00a8 ldr r0, [sp, #168] ; 0xa8
111c0: e590201c ldr r2, [r0, #28]
111c4: e5d2c013 ldrb ip, [r2, #19]
111c8: e58dc00c str ip, [sp, #12]
111cc: e5d2c014 ldrb ip, [r2, #20]
111d0: e58dc010 str ip, [sp, #16]
111d4: e5d2c016 ldrb ip, [r2, #22]
111d8: e58dc014 str ip, [sp, #20]
111dc: e5d2c017 ldrb ip, [r2, #23]
111e0: e58dc018 str ip, [sp, #24]
111e4: e5d2c020 ldrb ip, [r2, #32]
111e8: e58dc040 str ip, [sp, #64] ; 0x40
111ec: e5d2c021 ldrb ip, [r2, #33] ; 0x21
111f0: e58dc044 str ip, [sp, #68] ; 0x44
111f4: e5d2c022 ldrb ip, [r2, #34] ; 0x22
111f8: e58dc048 str ip, [sp, #72] ; 0x48
111fc: e5d2c023 ldrb ip, [r2, #35] ; 0x23
11200: e58dc04c str ip, [sp, #76] ; 0x4c
11204: e5d2c024 ldrb ip, [r2, #36] ; 0x24
11208: e58dc050 str ip, [sp, #80] ; 0x50
1120c: e5d2c025 ldrb ip, [r2, #37] ; 0x25
11210: e58dc034 str ip, [sp, #52] ; 0x34
11214: e5d2c026 ldrb ip, [r2, #38] ; 0x26
11218: e58dc038 str ip, [sp, #56] ; 0x38
1121c: e5d2c027 ldrb ip, [r2, #39] ; 0x27
11220: e5d2100c ldrb r1, [r2, #12]
11224: e5d2300f ldrb r3, [r2, #15]
11228: e5d2600b ldrb r6, [r2, #11]
1122c: e5d2500d ldrb r5, [r2, #13]
11230: e5d2800e ldrb r8, [r2, #14]
11234: e5d2a010 ldrb sl, [r2, #16]
11238: e5d29011 ldrb r9, [r2, #17]
1123c: e5d2b012 ldrb fp, [r2, #18]
11240: e58dc03c str ip, [sp, #60] ; 0x3c
11244: e5d2c02c ldrb ip, [r2, #44] ; 0x2c
11248: e58dc02c str ip, [sp, #44] ; 0x2c
1124c: e5d2c02d ldrb ip, [r2, #45] ; 0x2d
11250: e58dc030 str ip, [sp, #48] ; 0x30
11254: e5d2c02e ldrb ip, [r2, #46] ; 0x2e
11258: e58dc01c str ip, [sp, #28]
1125c: e5d2c02f ldrb ip, [r2, #47] ; 0x2f
11260: e5d27028 ldrb r7, [r2, #40] ; 0x28
11264: e58dc020 str ip, [sp, #32]
11268: e5d2c030 ldrb ip, [r2, #48] ; 0x30
1126c: e5d22031 ldrb r2, [r2, #49] ; 0x31
11270: e58dc024 str ip, [sp, #36] ; 0x24
sc = rtems_bdbuf_release( block);
11274: e98d000a stmib sp, {r1, r3}
{
close(vol->fd);
rtems_set_errno_and_return_minus_one( EIO);
}
memcpy( boot_rec, block->buffer, FAT_MAX_BPB_SIZE);
11278: e58d2028 str r2, [sp, #40] ; 0x28
sc = rtems_bdbuf_release( block);
1127c: ebfff76a bl f02c <rtems_bdbuf_release>
if (sc != RTEMS_SUCCESSFUL)
11280: e3500000 cmp r0, #0
11284: e99d000a ldmib sp, {r1, r3}
11288: 0a000004 beq 112a0 <fat_init_volume_info+0x178>
{
close(vol->fd);
1128c: e5940060 ldr r0, [r4, #96] ; 0x60 <== NOT EXECUTED
11290: ebffcabf bl 3d94 <close> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EIO );
11294: eb001d73 bl 18868 <__errno> <== NOT EXECUTED
11298: e3a03005 mov r3, #5 <== NOT EXECUTED
1129c: eaffffb4 b 11174 <fat_init_volume_info+0x4c> <== NOT EXECUTED
}
/* Evaluate boot record */
vol->bps = FAT_GET_BR_BYTES_PER_SECTOR(boot_rec);
112a0: e1861401 orr r1, r6, r1, lsl #8
if ( (vol->bps != 512) &&
112a4: e3510b01 cmp r1, #1024 ; 0x400
112a8: 13510c02 cmpne r1, #512 ; 0x200
close(vol->fd);
rtems_set_errno_and_return_minus_one( EIO );
}
/* Evaluate boot record */
vol->bps = FAT_GET_BR_BYTES_PER_SECTOR(boot_rec);
112ac: e1c410b0 strh r1, [r4]
if ( (vol->bps != 512) &&
112b0: 0a000003 beq 112c4 <fat_init_volume_info+0x19c>
(vol->bps != 1024) &&
112b4: e3510b02 cmp r1, #2048 ; 0x800 <== NOT EXECUTED
112b8: 0a000001 beq 112c4 <fat_init_volume_info+0x19c> <== NOT EXECUTED
(vol->bps != 2048) &&
112bc: e3510a01 cmp r1, #4096 ; 0x1000 <== NOT EXECUTED
112c0: 1a0000a1 bne 1154c <fat_init_volume_info+0x424> <== NOT EXECUTED
(vol->bps != 4096))
{
close(vol->fd);
rtems_set_errno_and_return_minus_one( EINVAL );
}
for (vol->sec_mul = 0, i = (vol->bps >> FAT_SECTOR512_BITS); (i & 1) == 0;
112c4: e3a02000 mov r2, #0
112c8: e5c42003 strb r2, [r4, #3]
112cc: e1a024a1 lsr r2, r1, #9
112d0: ea000003 b 112e4 <fat_init_volume_info+0x1bc>
i >>= 1, vol->sec_mul++);
112d4: e5d40003 ldrb r0, [r4, #3] <== NOT EXECUTED
112d8: e2800001 add r0, r0, #1 <== NOT EXECUTED
112dc: e5c40003 strb r0, [r4, #3] <== NOT EXECUTED
112e0: e1a020c2 asr r2, r2, #1 <== NOT EXECUTED
(vol->bps != 4096))
{
close(vol->fd);
rtems_set_errno_and_return_minus_one( EINVAL );
}
for (vol->sec_mul = 0, i = (vol->bps >> FAT_SECTOR512_BITS); (i & 1) == 0;
112e4: e3120001 tst r2, #1
112e8: 0afffff9 beq 112d4 <fat_init_volume_info+0x1ac>
i >>= 1, vol->sec_mul++);
for (vol->sec_log2 = 0, i = vol->bps; (i & 1) == 0;
112ec: e3a02000 mov r2, #0
112f0: e5c42002 strb r2, [r4, #2]
112f4: e1a02001 mov r2, r1
112f8: ea000002 b 11308 <fat_init_volume_info+0x1e0>
i >>= 1, vol->sec_log2++);
112fc: e2866001 add r6, r6, #1
11300: e5c46002 strb r6, [r4, #2]
11304: e1a020c2 asr r2, r2, #1
close(vol->fd);
rtems_set_errno_and_return_minus_one( EINVAL );
}
for (vol->sec_mul = 0, i = (vol->bps >> FAT_SECTOR512_BITS); (i & 1) == 0;
i >>= 1, vol->sec_mul++);
for (vol->sec_log2 = 0, i = vol->bps; (i & 1) == 0;
11308: e3120001 tst r2, #1
1130c: e5d46002 ldrb r6, [r4, #2]
11310: 0afffff9 beq 112fc <fat_init_volume_info+0x1d4>
i >>= 1, vol->sec_log2++);
vol->bytes_per_block = vol->bps;
vol->bytes_per_block_log2 = vol->sec_log2;
vol->sectors_per_block = 1;
11314: e3a02001 mov r2, #1
vol->spc = FAT_GET_BR_SECTORS_PER_CLUSTER(boot_rec);
/*
* "sectors per cluster" of zero is invalid
* (and would hang the following loop)
*/
if (vol->spc == 0)
11318: e3550000 cmp r5, #0
for (vol->sec_log2 = 0, i = vol->bps; (i & 1) == 0;
i >>= 1, vol->sec_log2++);
vol->bytes_per_block = vol->bps;
vol->bytes_per_block_log2 = vol->sec_log2;
vol->sectors_per_block = 1;
1131c: e5c42009 strb r2, [r4, #9]
{
close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
for (vol->spc_log2 = 0, i = vol->spc; (i & 1) == 0;
11320: 13a02000 movne r2, #0
for (vol->sec_mul = 0, i = (vol->bps >> FAT_SECTOR512_BITS); (i & 1) == 0;
i >>= 1, vol->sec_mul++);
for (vol->sec_log2 = 0, i = vol->bps; (i & 1) == 0;
i >>= 1, vol->sec_log2++);
vol->bytes_per_block = vol->bps;
11324: e1c410ba strh r1, [r4, #10]
vol->bytes_per_block_log2 = vol->sec_log2;
11328: e5c4600c strb r6, [r4, #12]
vol->sectors_per_block = 1;
vol->spc = FAT_GET_BR_SECTORS_PER_CLUSTER(boot_rec);
1132c: e5c45004 strb r5, [r4, #4]
{
close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
for (vol->spc_log2 = 0, i = vol->spc; (i & 1) == 0;
11330: 15c42005 strbne r2, [r4, #5]
11334: 11a00005 movne r0, r5
vol->spc = FAT_GET_BR_SECTORS_PER_CLUSTER(boot_rec);
/*
* "sectors per cluster" of zero is invalid
* (and would hang the following loop)
*/
if (vol->spc == 0)
11338: 1a000003 bne 1134c <fat_init_volume_info+0x224>
1133c: ea000082 b 1154c <fat_init_volume_info+0x424> <== NOT EXECUTED
close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
for (vol->spc_log2 = 0, i = vol->spc; (i & 1) == 0;
i >>= 1, vol->spc_log2++);
11340: e2822001 add r2, r2, #1
11344: e5c42005 strb r2, [r4, #5]
11348: e1a000c0 asr r0, r0, #1
{
close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
for (vol->spc_log2 = 0, i = vol->spc; (i & 1) == 0;
1134c: e3100001 tst r0, #1
11350: e5d42005 ldrb r2, [r4, #5]
11354: 0afffff9 beq 11340 <fat_init_volume_info+0x218>
i >>= 1, vol->spc_log2++);
/*
* "bytes per cluster" value greater than 32K is invalid
*/
if ((vol->bpc = vol->bps << vol->spc_log2) > MS_BYTES_PER_CLUSTER_LIMIT)
11358: e1a02211 lsl r2, r1, r2
1135c: e1a02802 lsl r2, r2, #16
11360: e1a02822 lsr r2, r2, #16
11364: e3520902 cmp r2, #32768 ; 0x8000
11368: e1c420b6 strh r2, [r4, #6]
{
close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
for (vol->bpc_log2 = 0, i = vol->bpc; (i & 1) == 0;
1136c: 93a00000 movls r0, #0
i >>= 1, vol->spc_log2++);
/*
* "bytes per cluster" value greater than 32K is invalid
*/
if ((vol->bpc = vol->bps << vol->spc_log2) > MS_BYTES_PER_CLUSTER_LIMIT)
11370: 9a000003 bls 11384 <fat_init_volume_info+0x25c>
11374: ea000074 b 1154c <fat_init_volume_info+0x424> <== NOT EXECUTED
close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
for (vol->bpc_log2 = 0, i = vol->bpc; (i & 1) == 0;
i >>= 1, vol->bpc_log2++);
11378: e5d40008 ldrb r0, [r4, #8]
1137c: e1a020c2 asr r2, r2, #1
11380: e2800001 add r0, r0, #1
{
close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
for (vol->bpc_log2 = 0, i = vol->bpc; (i & 1) == 0;
11384: e3120001 tst r2, #1
i >>= 1, vol->bpc_log2++);
11388: e5c40008 strb r0, [r4, #8]
{
close(vol->fd);
rtems_set_errno_and_return_minus_one(EINVAL);
}
for (vol->bpc_log2 = 0, i = vol->bpc; (i & 1) == 0;
1138c: 0afffff9 beq 11378 <fat_init_volume_info+0x250>
i >>= 1, vol->bpc_log2++);
vol->fats = FAT_GET_BR_FAT_NUM(boot_rec);
vol->fat_loc = FAT_GET_BR_RESERVED_SECTORS_NUM(boot_rec);
11390: e1888403 orr r8, r8, r3, lsl #8
vol->rdir_entrs = FAT_GET_BR_FILES_PER_ROOT_DIR(boot_rec);
/* calculate the count of sectors occupied by the root directory */
vol->rdir_secs = ((vol->rdir_entrs * FAT_DIRENTRY_SIZE) + (vol->bps - 1)) /
11394: e2410001 sub r0, r1, #1
i >>= 1, vol->bpc_log2++);
vol->fats = FAT_GET_BR_FAT_NUM(boot_rec);
vol->fat_loc = FAT_GET_BR_RESERVED_SECTORS_NUM(boot_rec);
vol->rdir_entrs = FAT_GET_BR_FILES_PER_ROOT_DIR(boot_rec);
11398: e189940b orr r9, r9, fp, lsl #8
for (vol->bpc_log2 = 0, i = vol->bpc; (i & 1) == 0;
i >>= 1, vol->bpc_log2++);
vol->fats = FAT_GET_BR_FAT_NUM(boot_rec);
vol->fat_loc = FAT_GET_BR_RESERVED_SECTORS_NUM(boot_rec);
1139c: e1c481b8 strh r8, [r4, #24]
}
for (vol->bpc_log2 = 0, i = vol->bpc; (i & 1) == 0;
i >>= 1, vol->bpc_log2++);
vol->fats = FAT_GET_BR_FAT_NUM(boot_rec);
113a0: e5c4a00d strb sl, [r4, #13]
vol->fat_loc = FAT_GET_BR_RESERVED_SECTORS_NUM(boot_rec);
vol->rdir_entrs = FAT_GET_BR_FILES_PER_ROOT_DIR(boot_rec);
113a4: e1c492b4 strh r9, [r4, #36] ; 0x24
/* calculate the count of sectors occupied by the root directory */
vol->rdir_secs = ((vol->rdir_entrs * FAT_DIRENTRY_SIZE) + (vol->bps - 1)) /
113a8: e0800289 add r0, r0, r9, lsl #5
113ac: eb005334 bl 26084 <__aeabi_idiv>
vol->bps;
vol->rdir_size = vol->rdir_secs << vol->sec_log2;
113b0: e1a06610 lsl r6, r0, r6
if ( (FAT_GET_BR_SECTORS_PER_FAT(boot_rec)) != 0)
113b4: e28d2014 add r2, sp, #20
113b8: e8921004 ldm r2, {r2, ip}
113bc: e192340c orrs r3, r2, ip, lsl #8
vol->fat_length = FAT_GET_BR_SECTORS_PER_FAT(boot_rec);
else
vol->fat_length = FAT_GET_BR_SECTORS_PER_FAT32(boot_rec);
113c0: 059d2038 ldreq r2, [sp, #56] ; 0x38
113c4: 059dc034 ldreq ip, [sp, #52] ; 0x34
113c8: 01a03802 lsleq r3, r2, #16
113cc: 059d2050 ldreq r2, [sp, #80] ; 0x50
113d0: 0183340c orreq r3, r3, ip, lsl #8
113d4: 059dc03c ldreq ip, [sp, #60] ; 0x3c
113d8: 01833002 orreq r3, r3, r2
113dc: 01833c0c orreq r3, r3, ip, lsl #24
113e0: e584301c str r3, [r4, #28]
vol->data_fsec = vol->fat_loc + vol->fats * vol->fat_length +
113e4: e594301c ldr r3, [r4, #28]
113e8: e0288a93 mla r8, r3, sl, r8
vol->rdir_secs;
/* for FAT12/16 root dir starts at(sector) */
vol->rdir_loc = vol->fat_loc + vol->fats * vol->fat_length;
if ( (FAT_GET_BR_TOTAL_SECTORS_NUM16(boot_rec)) != 0)
113ec: e28d200c add r2, sp, #12
113f0: e8921004 ldm r2, {r2, ip}
113f4: e192340c orrs r3, r2, ip, lsl #8
vol->tot_secs = FAT_GET_BR_TOTAL_SECTORS_NUM16(boot_rec);
else
vol->tot_secs = FAT_GET_BR_TOTAL_SECTORS_NUM32(boot_rec);
113f8: 059d2048 ldreq r2, [sp, #72] ; 0x48
113fc: 059dc044 ldreq ip, [sp, #68] ; 0x44
11400: 01a03802 lsleq r3, r2, #16
11404: 059d2040 ldreq r2, [sp, #64] ; 0x40
11408: 0183340c orreq r3, r3, ip, lsl #8
1140c: 059dc04c ldreq ip, [sp, #76] ; 0x4c
11410: 01833002 orreq r3, r3, r2
11414: 01833c0c orreq r3, r3, ip, lsl #24
11418: e5843030 str r3, [r4, #48] ; 0x30
data_secs = vol->tot_secs - vol->data_fsec;
1141c: e5943030 ldr r3, [r4, #48] ; 0x30
vol->fat_loc = FAT_GET_BR_RESERVED_SECTORS_NUM(boot_rec);
vol->rdir_entrs = FAT_GET_BR_FILES_PER_ROOT_DIR(boot_rec);
/* calculate the count of sectors occupied by the root directory */
vol->rdir_secs = ((vol->rdir_entrs * FAT_DIRENTRY_SIZE) + (vol->bps - 1)) /
11420: e5840028 str r0, [r4, #40] ; 0x28
if ( (FAT_GET_BR_SECTORS_PER_FAT(boot_rec)) != 0)
vol->fat_length = FAT_GET_BR_SECTORS_PER_FAT(boot_rec);
else
vol->fat_length = FAT_GET_BR_SECTORS_PER_FAT32(boot_rec);
vol->data_fsec = vol->fat_loc + vol->fats * vol->fat_length +
11424: e0800008 add r0, r0, r8
11428: e5840034 str r0, [r4, #52] ; 0x34
/* calculate the count of sectors occupied by the root directory */
vol->rdir_secs = ((vol->rdir_entrs * FAT_DIRENTRY_SIZE) + (vol->bps - 1)) /
vol->bps;
vol->rdir_size = vol->rdir_secs << vol->sec_log2;
1142c: e584602c str r6, [r4, #44] ; 0x2c
else
vol->tot_secs = FAT_GET_BR_TOTAL_SECTORS_NUM32(boot_rec);
data_secs = vol->tot_secs - vol->data_fsec;
vol->data_cls = data_secs / vol->spc;
11430: e0600003 rsb r0, r0, r3
vol->data_fsec = vol->fat_loc + vol->fats * vol->fat_length +
vol->rdir_secs;
/* for FAT12/16 root dir starts at(sector) */
vol->rdir_loc = vol->fat_loc + vol->fats * vol->fat_length;
11434: e5848020 str r8, [r4, #32]
else
vol->tot_secs = FAT_GET_BR_TOTAL_SECTORS_NUM32(boot_rec);
data_secs = vol->tot_secs - vol->data_fsec;
vol->data_cls = data_secs / vol->spc;
11438: e1a01005 mov r1, r5
1143c: ebffc207 bl 1c60 <__aeabi_uidiv>
/* determine FAT type at least */
if ( vol->data_cls < FAT_FAT12_MAX_CLN)
11440: e59f336c ldr r3, [pc, #876] ; 117b4 <fat_init_volume_info+0x68c>
11444: e1500003 cmp r0, r3
else
vol->tot_secs = FAT_GET_BR_TOTAL_SECTORS_NUM32(boot_rec);
data_secs = vol->tot_secs - vol->data_fsec;
vol->data_cls = data_secs / vol->spc;
11448: e5840038 str r0, [r4, #56] ; 0x38
/* determine FAT type at least */
if ( vol->data_cls < FAT_FAT12_MAX_CLN)
{
vol->type = FAT_FAT12;
1144c: 93a03001 movls r3, #1
11450: 95c4300e strbls r3, [r4, #14]
vol->mask = FAT_FAT12_MASK;
11454: 959f335c ldrls r3, [pc, #860] ; 117b8 <fat_init_volume_info+0x690>
11458: 9a000005 bls 11474 <fat_init_volume_info+0x34c>
vol->eoc_val = FAT_FAT12_EOC;
}
else
{
if ( vol->data_cls < FAT_FAT16_MAX_CLN)
1145c: e59f3358 ldr r3, [pc, #856] ; 117bc <fat_init_volume_info+0x694>
11460: e1500003 cmp r0, r3
11464: 8a000005 bhi 11480 <fat_init_volume_info+0x358>
{
vol->type = FAT_FAT16;
11468: e3a03002 mov r3, #2
1146c: e5c4300e strb r3, [r4, #14]
vol->mask = FAT_FAT16_MASK;
11470: e59f3348 ldr r3, [pc, #840] ; 117c0 <fat_init_volume_info+0x698>
11474: e5843010 str r3, [r4, #16]
vol->eoc_val = FAT_FAT16_EOC;
11478: e2433007 sub r3, r3, #7
1147c: ea000004 b 11494 <fat_init_volume_info+0x36c>
}
else
{
vol->type = FAT_FAT32;
11480: e3a03004 mov r3, #4
11484: e5c4300e strb r3, [r4, #14]
vol->mask = FAT_FAT32_MASK;
11488: e3e0320f mvn r3, #-268435456 ; 0xf0000000
1148c: e5843010 str r3, [r4, #16]
vol->eoc_val = FAT_FAT32_EOC;
11490: e3e0327f mvn r3, #-268435449 ; 0xf0000007
11494: e5843014 str r3, [r4, #20]
}
}
if (vol->type == FAT_FAT32)
11498: e5d4300e ldrb r3, [r4, #14]
1149c: e3530004 cmp r3, #4
114a0: 1a00004f bne 115e4 <fat_init_volume_info+0x4bc>
{
vol->rdir_cl = FAT_GET_BR_FAT32_ROOT_CLUSTER(boot_rec);
114a4: e59d201c ldr r2, [sp, #28]
114a8: e59dc030 ldr ip, [sp, #48] ; 0x30
114ac: e1a03802 lsl r3, r2, #16
114b0: e59d202c ldr r2, [sp, #44] ; 0x2c
114b4: e183340c orr r3, r3, ip, lsl #8
114b8: e59dc020 ldr ip, [sp, #32]
114bc: e1833002 orr r3, r3, r2
114c0: e1833c0c orr r3, r3, ip, lsl #24
114c4: e584303c str r3, [r4, #60] ; 0x3c
vol->mirror = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_MIRROR;
114c8: e2073080 and r3, r7, #128 ; 0x80
if (vol->mirror)
114cc: e3530000 cmp r3, #0
vol->afat = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_FAT_NUM;
else
vol->afat = 0;
vol->info_sec = FAT_GET_BR_FAT32_FS_INFO_SECTOR(boot_rec);
114d0: e28d2024 add r2, sp, #36 ; 0x24
vol->mirror = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_MIRROR;
if (vol->mirror)
vol->afat = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_FAT_NUM;
else
vol->afat = 0;
114d4: 05c4305c strbeq r3, [r4, #92] ; 0x5c
if (vol->type == FAT_FAT32)
{
vol->rdir_cl = FAT_GET_BR_FAT32_ROOT_CLUSTER(boot_rec);
vol->mirror = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_MIRROR;
114d8: e5c43054 strb r3, [r4, #84] ; 0x54
if (vol->mirror)
vol->afat = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_FAT_NUM;
else
vol->afat = 0;
vol->info_sec = FAT_GET_BR_FAT32_FS_INFO_SECTOR(boot_rec);
114dc: e892000c ldm r2, {r2, r3}
{
vol->rdir_cl = FAT_GET_BR_FAT32_ROOT_CLUSTER(boot_rec);
vol->mirror = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_MIRROR;
if (vol->mirror)
vol->afat = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_FAT_NUM;
114e0: 1207700f andne r7, r7, #15
else
vol->afat = 0;
vol->info_sec = FAT_GET_BR_FAT32_FS_INFO_SECTOR(boot_rec);
114e4: e1821403 orr r1, r2, r3, lsl #8
{
vol->rdir_cl = FAT_GET_BR_FAT32_ROOT_CLUSTER(boot_rec);
vol->mirror = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_MIRROR;
if (vol->mirror)
vol->afat = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_FAT_NUM;
114e8: 15c4705c strbne r7, [r4, #92] ; 0x5c
else
vol->afat = 0;
vol->info_sec = FAT_GET_BR_FAT32_FS_INFO_SECTOR(boot_rec);
if( vol->info_sec == 0 )
114ec: e3510000 cmp r1, #0
if (vol->mirror)
vol->afat = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_FAT_NUM;
else
vol->afat = 0;
vol->info_sec = FAT_GET_BR_FAT32_FS_INFO_SECTOR(boot_rec);
114f0: e1c414b0 strh r1, [r4, #64] ; 0x40
if( vol->info_sec == 0 )
114f4: 0a000014 beq 1154c <fat_init_volume_info+0x424>
rtems_set_errno_and_return_minus_one( EINVAL );
}
else
{
ret = _fat_block_read(fs_info, vol->info_sec , 0,
FAT_FSI_LEADSIG_SIZE, fs_info_sector);
114f8: e28d509c add r5, sp, #156 ; 0x9c
close(vol->fd);
rtems_set_errno_and_return_minus_one( EINVAL );
}
else
{
ret = _fat_block_read(fs_info, vol->info_sec , 0,
114fc: e1a00004 mov r0, r4
11500: e3a02000 mov r2, #0
11504: e3a03004 mov r3, #4
11508: e58d5000 str r5, [sp]
1150c: ebfffe3b bl 10e00 <_fat_block_read>
FAT_FSI_LEADSIG_SIZE, fs_info_sector);
if ( ret < 0 )
11510: e3500000 cmp r0, #0
11514: ba00001b blt 11588 <fat_init_volume_info+0x460>
{
close(vol->fd);
return -1;
}
if (FAT_GET_FSINFO_LEAD_SIGNATURE(fs_info_sector) !=
11518: e5dd209e ldrb r2, [sp, #158] ; 0x9e
1151c: e5dd309d ldrb r3, [sp, #157] ; 0x9d
11520: e1a02802 lsl r2, r2, #16
11524: e1822403 orr r2, r2, r3, lsl #8
11528: e5dd309c ldrb r3, [sp, #156] ; 0x9c
1152c: e1822003 orr r2, r2, r3
11530: e5dd309f ldrb r3, [sp, #159] ; 0x9f
11534: e1822c03 orr r2, r2, r3, lsl #24
11538: e59f3284 ldr r3, [pc, #644] ; 117c4 <fat_init_volume_info+0x69c>
1153c: e1520003 cmp r2, r3
11540: 0a000006 beq 11560 <fat_init_volume_info+0x438>
* 0 on success, or -1 if error occured and errno set appropriately
*/
int
_fat_block_release(fat_fs_info_t *fs_info)
{
return fat_buf_release(fs_info);
11544: e1a00004 mov r0, r4 <== NOT EXECUTED
11548: ebfffd9e bl 10bc8 <fat_buf_release> <== NOT EXECUTED
if (FAT_GET_FSINFO_LEAD_SIGNATURE(fs_info_sector) !=
FAT_FSINFO_LEAD_SIGNATURE_VALUE)
{
_fat_block_release(fs_info);
close(vol->fd);
1154c: e5940060 ldr r0, [r4, #96] ; 0x60 <== NOT EXECUTED
11550: ebffca0f bl 3d94 <close> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EINVAL );
11554: eb001cc3 bl 18868 <__errno> <== NOT EXECUTED
11558: e3a03016 mov r3, #22 <== NOT EXECUTED
1155c: eaffff04 b 11174 <fat_init_volume_info+0x4c> <== NOT EXECUTED
}
else
{
ret = _fat_block_read(fs_info, vol->info_sec , FAT_FSI_INFO,
11560: e1d414b0 ldrh r1, [r4, #64] ; 0x40
11564: e1a00004 mov r0, r4
11568: e3a02f79 mov r2, #484 ; 0x1e4
1156c: e3a0300c mov r3, #12
11570: e58d5000 str r5, [sp]
11574: ebfffe21 bl 10e00 <_fat_block_read>
FAT_USEFUL_INFO_SIZE, fs_info_sector);
if ( ret < 0 )
11578: e3500000 cmp r0, #0
1157c: aa000004 bge 11594 <fat_init_volume_info+0x46c>
* 0 on success, or -1 if error occured and errno set appropriately
*/
int
_fat_block_release(fat_fs_info_t *fs_info)
{
return fat_buf_release(fs_info);
11580: e1a00004 mov r0, r4 <== NOT EXECUTED
11584: ebfffd8f bl 10bc8 <fat_buf_release> <== NOT EXECUTED
ret = _fat_block_read(fs_info, vol->info_sec , FAT_FSI_INFO,
FAT_USEFUL_INFO_SIZE, fs_info_sector);
if ( ret < 0 )
{
_fat_block_release(fs_info);
close(vol->fd);
11588: e5940060 ldr r0, [r4, #96] ; 0x60 <== NOT EXECUTED
1158c: ebffca00 bl 3d94 <close> <== NOT EXECUTED
11590: eafffef8 b 11178 <fat_init_volume_info+0x50> <== NOT EXECUTED
return -1;
}
vol->free_cls_in_fs_info =
FAT_GET_FSINFO_FREE_CLUSTER_COUNT(fs_info_sector);
11594: e5dd30a2 ldrb r3, [sp, #162] ; 0xa2
11598: e5dd20a1 ldrb r2, [sp, #161] ; 0xa1
1159c: e1a03803 lsl r3, r3, #16
115a0: e1833402 orr r3, r3, r2, lsl #8
115a4: e5dd20a0 ldrb r2, [sp, #160] ; 0xa0
115a8: e1833002 orr r3, r3, r2
115ac: e5dd20a3 ldrb r2, [sp, #163] ; 0xa3
115b0: e1833c02 orr r3, r3, r2, lsl #24
_fat_block_release(fs_info);
close(vol->fd);
return -1;
}
vol->free_cls_in_fs_info =
115b4: e5843048 str r3, [r4, #72] ; 0x48
FAT_GET_FSINFO_FREE_CLUSTER_COUNT(fs_info_sector);
vol->free_cls = vol->free_cls_in_fs_info;
115b8: e5843044 str r3, [r4, #68] ; 0x44
vol->next_cl_in_fs_info =
FAT_GET_FSINFO_NEXT_FREE_CLUSTER(fs_info_sector);
115bc: e5dd30a6 ldrb r3, [sp, #166] ; 0xa6
115c0: e5dd20a5 ldrb r2, [sp, #165] ; 0xa5
115c4: e1a03803 lsl r3, r3, #16
115c8: e1833402 orr r3, r3, r2, lsl #8
115cc: e5dd20a4 ldrb r2, [sp, #164] ; 0xa4
115d0: e1833002 orr r3, r3, r2
115d4: e5dd20a7 ldrb r2, [sp, #167] ; 0xa7
115d8: e1833c02 orr r3, r3, r2, lsl #24
}
vol->free_cls_in_fs_info =
FAT_GET_FSINFO_FREE_CLUSTER_COUNT(fs_info_sector);
vol->free_cls = vol->free_cls_in_fs_info;
vol->next_cl_in_fs_info =
115dc: e5843050 str r3, [r4, #80] ; 0x50
115e0: ea000005 b 115fc <fat_init_volume_info+0x4d4>
}
}
}
else
{
vol->rdir_cl = 0;
115e4: e3a03000 mov r3, #0
115e8: e584303c str r3, [r4, #60] ; 0x3c
vol->mirror = 0;
115ec: e5c43054 strb r3, [r4, #84] ; 0x54
vol->afat = 0;
115f0: e5c4305c strb r3, [r4, #92] ; 0x5c
vol->free_cls = FAT_UNDEFINED_VALUE;
115f4: e3e03000 mvn r3, #0
115f8: e5843044 str r3, [r4, #68] ; 0x44
vol->next_cl = FAT_UNDEFINED_VALUE;
115fc: e584304c str r3, [r4, #76] ; 0x4c
* 0 on success, or -1 if error occured and errno set appropriately
*/
int
_fat_block_release(fat_fs_info_t *fs_info)
{
return fat_buf_release(fs_info);
11600: e1a00004 mov r0, r4
11604: ebfffd6f bl 10bc8 <fat_buf_release>
vol->next_cl = FAT_UNDEFINED_VALUE;
}
_fat_block_release(fs_info);
vol->afat_loc = vol->fat_loc + vol->fat_length * vol->afat;
11608: e594101c ldr r1, [r4, #28]
1160c: e5d4305c ldrb r3, [r4, #92] ; 0x5c
11610: e1d421b8 ldrh r2, [r4, #24]
11614: e0232391 mla r3, r1, r3, r2
/* set up collection of fat-files fd */
fs_info->vhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
11618: e3a00002 mov r0, #2
vol->next_cl = FAT_UNDEFINED_VALUE;
}
_fat_block_release(fs_info);
vol->afat_loc = vol->fat_loc + vol->fat_length * vol->afat;
1161c: e5843058 str r3, [r4, #88] ; 0x58
/* set up collection of fat-files fd */
fs_info->vhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
11620: e3a0100c mov r1, #12
11624: ebffc9c8 bl 3d4c <calloc>
if ( fs_info->vhash == NULL )
11628: e3500000 cmp r0, #0
_fat_block_release(fs_info);
vol->afat_loc = vol->fat_loc + vol->fat_length * vol->afat;
/* set up collection of fat-files fd */
fs_info->vhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
1162c: e584006c str r0, [r4, #108] ; 0x6c
if ( fs_info->vhash == NULL )
11630: 0a000010 beq 11678 <fat_init_volume_info+0x550>
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 );
11634: e2803004 add r3, r0, #4
head->next = tail;
11638: e5803000 str r3, [r0]
head->previous = NULL;
1163c: e3a05000 mov r5, #0
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 );
11640: e280300c add r3, r0, #12
11644: e2802010 add r2, r0, #16
head->next = tail;
head->previous = NULL;
11648: e5805004 str r5, [r0, #4]
tail->previous = head;
1164c: e5800008 str r0, [r0, #8]
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
11650: e580200c str r2, [r0, #12]
head->previous = NULL;
11654: e5805010 str r5, [r0, #16]
tail->previous = head;
11658: e5803014 str r3, [r0, #20]
}
for (i = 0; i < FAT_HASH_SIZE; i++)
rtems_chain_initialize_empty(fs_info->vhash + i);
fs_info->rhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
1165c: e3a0100c mov r1, #12
11660: e3a00002 mov r0, #2
11664: ebffc9b8 bl 3d4c <calloc>
if ( fs_info->rhash == NULL )
11668: e1500005 cmp r0, r5
}
for (i = 0; i < FAT_HASH_SIZE; i++)
rtems_chain_initialize_empty(fs_info->vhash + i);
fs_info->rhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
1166c: e5840070 str r0, [r4, #112] ; 0x70
if ( fs_info->rhash == NULL )
11670: 1a000003 bne 11684 <fat_init_volume_info+0x55c>
11674: ea000018 b 116dc <fat_init_volume_info+0x5b4> <== NOT EXECUTED
/* set up collection of fat-files fd */
fs_info->vhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
if ( fs_info->vhash == NULL )
{
close(vol->fd);
11678: e5940060 ldr r0, [r4, #96] ; 0x60 <== NOT EXECUTED
1167c: ebffc9c4 bl 3d94 <close> <== NOT EXECUTED
11680: ea00002d b 1173c <fat_init_volume_info+0x614> <== NOT EXECUTED
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 );
11684: e2803004 add r3, r0, #4
head->next = tail;
head->previous = NULL;
11688: e8800028 stm r0, {r3, r5}
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 );
1168c: e2802010 add r2, r0, #16
11690: e280300c add r3, r0, #12
head->next = tail;
11694: e580200c str r2, [r0, #12]
head->previous = NULL;
tail->previous = head;
11698: e5800008 str r0, [r0, #8]
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
1169c: e5805010 str r5, [r0, #16]
tail->previous = head;
116a0: e5803014 str r3, [r0, #20]
}
for (i = 0; i < FAT_HASH_SIZE; i++)
rtems_chain_initialize_empty(fs_info->rhash + i);
fs_info->uino_pool_size = FAT_UINO_POOL_INIT_SIZE;
fs_info->uino_base = (vol->tot_secs << vol->sec_mul) << 4;
116a4: e5942030 ldr r2, [r4, #48] ; 0x30
116a8: e5d43003 ldrb r3, [r4, #3]
116ac: e1a03312 lsl r3, r2, r3
rtems_set_errno_and_return_minus_one( ENOMEM );
}
for (i = 0; i < FAT_HASH_SIZE; i++)
rtems_chain_initialize_empty(fs_info->rhash + i);
fs_info->uino_pool_size = FAT_UINO_POOL_INIT_SIZE;
116b0: e3a00c01 mov r0, #256 ; 0x100
fs_info->uino_base = (vol->tot_secs << vol->sec_mul) << 4;
116b4: e1a03203 lsl r3, r3, #4
rtems_set_errno_and_return_minus_one( ENOMEM );
}
for (i = 0; i < FAT_HASH_SIZE; i++)
rtems_chain_initialize_empty(fs_info->rhash + i);
fs_info->uino_pool_size = FAT_UINO_POOL_INIT_SIZE;
116b8: e584007c str r0, [r4, #124] ; 0x7c
fs_info->uino_base = (vol->tot_secs << vol->sec_mul) << 4;
116bc: e5843080 str r3, [r4, #128] ; 0x80
fs_info->index = 0;
116c0: e5845078 str r5, [r4, #120] ; 0x78
fs_info->uino = (char *)calloc(fs_info->uino_pool_size, sizeof(char));
116c4: e3a01001 mov r1, #1
116c8: ebffc99f bl 3d4c <calloc>
if ( fs_info->uino == NULL )
116cc: e3500000 cmp r0, #0
rtems_chain_initialize_empty(fs_info->rhash + i);
fs_info->uino_pool_size = FAT_UINO_POOL_INIT_SIZE;
fs_info->uino_base = (vol->tot_secs << vol->sec_mul) << 4;
fs_info->index = 0;
fs_info->uino = (char *)calloc(fs_info->uino_pool_size, sizeof(char));
116d0: e5840074 str r0, [r4, #116] ; 0x74
if ( fs_info->uino == NULL )
116d4: 1a00000a bne 11704 <fat_init_volume_info+0x5dc>
116d8: ea000003 b 116ec <fat_init_volume_info+0x5c4> <== NOT EXECUTED
rtems_chain_initialize_empty(fs_info->vhash + i);
fs_info->rhash = calloc(FAT_HASH_SIZE, sizeof(rtems_chain_control));
if ( fs_info->rhash == NULL )
{
close(vol->fd);
116dc: e5940060 ldr r0, [r4, #96] ; 0x60 <== NOT EXECUTED
116e0: ebffc9ab bl 3d94 <close> <== NOT EXECUTED
free(fs_info->vhash);
116e4: e594006c ldr r0, [r4, #108] ; 0x6c <== NOT EXECUTED
116e8: ea000012 b 11738 <fat_init_volume_info+0x610> <== NOT EXECUTED
fs_info->uino_base = (vol->tot_secs << vol->sec_mul) << 4;
fs_info->index = 0;
fs_info->uino = (char *)calloc(fs_info->uino_pool_size, sizeof(char));
if ( fs_info->uino == NULL )
{
close(vol->fd);
116ec: e5940060 ldr r0, [r4, #96] ; 0x60 <== NOT EXECUTED
116f0: ebffc9a7 bl 3d94 <close> <== NOT EXECUTED
free(fs_info->vhash);
116f4: e594006c ldr r0, [r4, #108] ; 0x6c <== NOT EXECUTED
116f8: ebffca47 bl 401c <free> <== NOT EXECUTED
free(fs_info->rhash);
116fc: e5940070 ldr r0, [r4, #112] ; 0x70 <== NOT EXECUTED
11700: ea00000c b 11738 <fat_init_volume_info+0x610> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( ENOMEM );
}
fs_info->sec_buf = (uint8_t *)calloc(vol->bps, sizeof(uint8_t));
11704: e1d400b0 ldrh r0, [r4]
11708: e3a01001 mov r1, #1
1170c: ebffc98e bl 3d4c <calloc>
if (fs_info->sec_buf == NULL)
11710: e3500000 cmp r0, #0
close(vol->fd);
free(fs_info->vhash);
free(fs_info->rhash);
rtems_set_errno_and_return_minus_one( ENOMEM );
}
fs_info->sec_buf = (uint8_t *)calloc(vol->bps, sizeof(uint8_t));
11714: e5840090 str r0, [r4, #144] ; 0x90
if (fs_info->sec_buf == NULL)
11718: 1a00000a bne 11748 <fat_init_volume_info+0x620>
{
close(vol->fd);
1171c: e5940060 ldr r0, [r4, #96] ; 0x60 <== NOT EXECUTED
11720: ebffc99b bl 3d94 <close> <== NOT EXECUTED
free(fs_info->vhash);
11724: e594006c ldr r0, [r4, #108] ; 0x6c <== NOT EXECUTED
11728: ebffca3b bl 401c <free> <== NOT EXECUTED
free(fs_info->rhash);
1172c: e5940070 ldr r0, [r4, #112] ; 0x70 <== NOT EXECUTED
11730: ebffca39 bl 401c <free> <== NOT EXECUTED
free(fs_info->uino);
11734: e5940074 ldr r0, [r4, #116] ; 0x74 <== NOT EXECUTED
11738: ebffca37 bl 401c <free> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( ENOMEM );
1173c: eb001c49 bl 18868 <__errno> <== NOT EXECUTED
11740: e3a0300c mov r3, #12 <== NOT EXECUTED
11744: eafffe8a b 11174 <fat_init_volume_info+0x4c> <== NOT EXECUTED
return bytes_written;
}
static bool is_cluster_aligned(const fat_vol_t *vol, uint32_t sec_num)
{
return (sec_num & (vol->spc - 1)) == 0;
11748: e5d43004 ldrb r3, [r4, #4]
1174c: e5940034 ldr r0, [r4, #52] ; 0x34
11750: e2433001 sub r3, r3, #1
/*
* If possible we will use the cluster size as bdbuf block size for faster
* file access. This requires that certain sectors are aligned to cluster
* borders.
*/
if (is_cluster_aligned(vol, vol->data_fsec)
11754: e0130000 ands r0, r3, r0
vol->bytes_per_block_log2 = vol->bpc_log2;
vol->sectors_per_block = vol->spc;
}
}
return RC_OK;
11758: 11a00005 movne r0, r5
/*
* If possible we will use the cluster size as bdbuf block size for faster
* file access. This requires that certain sectors are aligned to cluster
* borders.
*/
if (is_cluster_aligned(vol, vol->data_fsec)
1175c: 1a000011 bne 117a8 <fat_init_volume_info+0x680>
&& (FAT_FAT32 == vol->type || is_cluster_aligned(vol, vol->rdir_loc)))
11760: e5d4200e ldrb r2, [r4, #14]
11764: e3520004 cmp r2, #4
11768: 0a000002 beq 11778 <fat_init_volume_info+0x650>
return bytes_written;
}
static bool is_cluster_aligned(const fat_vol_t *vol, uint32_t sec_num)
{
return (sec_num & (vol->spc - 1)) == 0;
1176c: e5942020 ldr r2, [r4, #32]
* If possible we will use the cluster size as bdbuf block size for faster
* file access. This requires that certain sectors are aligned to cluster
* borders.
*/
if (is_cluster_aligned(vol, vol->data_fsec)
&& (FAT_FAT32 == vol->type || is_cluster_aligned(vol, vol->rdir_loc)))
11770: e1130002 tst r3, r2
11774: 1a00000b bne 117a8 <fat_init_volume_info+0x680>
{
sc = rtems_bdbuf_set_block_size (vol->dd, vol->bpc, true);
11778: e5940064 ldr r0, [r4, #100] ; 0x64
1177c: e1d410b6 ldrh r1, [r4, #6]
11780: e3a02001 mov r2, #1
11784: ebfff73e bl f484 <rtems_bdbuf_set_block_size>
if (sc == RTEMS_SUCCESSFUL)
11788: e3500000 cmp r0, #0
{
vol->bytes_per_block = vol->bpc;
1178c: 01d430b6 ldrheq r3, [r4, #6]
11790: 01c430ba strheq r3, [r4, #10]
vol->bytes_per_block_log2 = vol->bpc_log2;
11794: 05d43008 ldrbeq r3, [r4, #8]
11798: 05c4300c strbeq r3, [r4, #12]
vol->sectors_per_block = vol->spc;
1179c: 05d43004 ldrbeq r3, [r4, #4]
117a0: 05c43009 strbeq r3, [r4, #9]
}
}
return RC_OK;
117a4: 13a00000 movne r0, #0
}
117a8: e28dd0ac add sp, sp, #172 ; 0xac
117ac: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00016e84 <fat_scan_fat_for_free_clusters>:
uint32_t count,
uint32_t *cls_added,
uint32_t *last_cl,
bool zero_fill
)
{
16e84: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
uint32_t i = 2;
ssize_t bytes_written;
*cls_added = 0;
if (count == 0)
16e88: e3520000 cmp r2, #0
uint32_t count,
uint32_t *cls_added,
uint32_t *last_cl,
bool zero_fill
)
{
16e8c: e24dd014 sub sp, sp, #20
16e90: e1a06003 mov r6, r3
int rc = RC_OK;
uint32_t cl4find = 2;
uint32_t next_cln = 0;
uint32_t save_cln = 0;
uint32_t data_cls_val = fs_info->vol.data_cls + 2;
16e94: e590b038 ldr fp, [r0, #56] ; 0x38
uint32_t count,
uint32_t *cls_added,
uint32_t *last_cl,
bool zero_fill
)
{
16e98: e5dd303c ldrb r3, [sp, #60] ; 0x3c
uint32_t i = 2;
ssize_t bytes_written;
*cls_added = 0;
if (count == 0)
16e9c: e58d2008 str r2, [sp, #8]
bool zero_fill
)
{
int rc = RC_OK;
uint32_t cl4find = 2;
uint32_t next_cln = 0;
16ea0: e3a0a000 mov sl, #0
uint32_t count,
uint32_t *cls_added,
uint32_t *last_cl,
bool zero_fill
)
{
16ea4: e1a04000 mov r4, r0
16ea8: e1a08001 mov r8, r1
16eac: e58d300c str r3, [sp, #12]
int rc = RC_OK;
uint32_t cl4find = 2;
uint32_t next_cln = 0;
16eb0: e58da010 str sl, [sp, #16]
uint32_t save_cln = 0;
uint32_t data_cls_val = fs_info->vol.data_cls + 2;
16eb4: e28bb002 add fp, fp, #2
uint32_t i = 2;
ssize_t bytes_written;
*cls_added = 0;
16eb8: e586a000 str sl, [r6]
if (count == 0)
return rc;
16ebc: 059d7008 ldreq r7, [sp, #8]
uint32_t i = 2;
ssize_t bytes_written;
*cls_added = 0;
if (count == 0)
16ec0: 0a00006e beq 17080 <fat_scan_fat_for_free_clusters+0x1fc>
return rc;
if (fs_info->vol.next_cl != FAT_UNDEFINED_VALUE)
16ec4: e590504c ldr r5, [r0, #76] ; 0x4c
uint32_t *last_cl,
bool zero_fill
)
{
int rc = RC_OK;
uint32_t cl4find = 2;
16ec8: e3750001 cmn r5, #1
16ecc: 03a05002 moveq r5, #2
}
}
i++;
cl4find++;
if (cl4find >= data_cls_val)
cl4find = 2;
16ed0: e3a09002 mov r9, #2
16ed4: ea00004e b 17014 <fat_scan_fat_for_free_clusters+0x190>
* starting at cluster 2, so the maximum valid cluster number is
* (fs_info->vol.data_cls + 1)
*/
while (i < data_cls_val)
{
rc = fat_get_fat_cluster(fs_info, cl4find, &next_cln);
16ed8: e1a00004 mov r0, r4
16edc: e1a01005 mov r1, r5
16ee0: e28d2010 add r2, sp, #16
16ee4: ebfffee3 bl 16a78 <fat_get_fat_cluster>
if ( rc != RC_OK )
16ee8: e2507000 subs r7, r0, #0
16eec: 0a000006 beq 16f0c <fat_scan_fat_for_free_clusters+0x88>
{
if (*cls_added != 0)
16ef0: e5963000 ldr r3, [r6] <== NOT EXECUTED
16ef4: e3530000 cmp r3, #0 <== NOT EXECUTED
16ef8: 0a000060 beq 17080 <fat_scan_fat_for_free_clusters+0x1fc> <== NOT EXECUTED
fat_free_fat_clusters_chain(fs_info, (*chain));
16efc: e1a00004 mov r0, r4 <== NOT EXECUTED
16f00: e5981000 ldr r1, [r8] <== NOT EXECUTED
16f04: ebffffb1 bl 16dd0 <fat_free_fat_clusters_chain> <== NOT EXECUTED
16f08: ea00005c b 17080 <fat_scan_fat_for_free_clusters+0x1fc> <== NOT EXECUTED
return rc;
}
if (next_cln == FAT_GENFAT_FREE)
16f0c: e59d3010 ldr r3, [sp, #16]
16f10: e3530000 cmp r3, #0
16f14: 1a00003a bne 17004 <fat_scan_fat_for_free_clusters+0x180>
/*
* We are enforced to process allocation of the first free cluster
* by separate 'if' statement because otherwise undo function
* wouldn't work properly
*/
if (*cls_added == 0)
16f18: e5963000 ldr r3, [r6]
16f1c: e3530000 cmp r3, #0
16f20: 1a000007 bne 16f44 <fat_scan_fat_for_free_clusters+0xc0>
{
*chain = cl4find;
16f24: e5885000 str r5, [r8]
rc = fat_set_fat_cluster(fs_info, cl4find, FAT_GENFAT_EOC);
16f28: e1a00004 mov r0, r4
16f2c: e1a01005 mov r1, r5
16f30: e3e02000 mvn r2, #0
16f34: ebffff23 bl 16bc8 <fat_set_fat_cluster>
if ( rc != RC_OK )
16f38: e3500000 cmp r0, #0
16f3c: 0a000012 beq 16f8c <fat_scan_fat_for_free_clusters+0x108>
16f40: ea00004d b 1707c <fat_scan_fat_for_free_clusters+0x1f8> <== NOT EXECUTED
}
}
else
{
/* set EOC value to new allocated cluster */
rc = fat_set_fat_cluster(fs_info, cl4find, FAT_GENFAT_EOC);
16f44: e1a00004 mov r0, r4
16f48: e1a01005 mov r1, r5
16f4c: e3e02000 mvn r2, #0
16f50: ebffff1c bl 16bc8 <fat_set_fat_cluster>
if ( rc != RC_OK )
16f54: e2503000 subs r3, r0, #0
{
/* cleanup activity */
fat_free_fat_clusters_chain(fs_info, (*chain));
16f58: e1a00004 mov r0, r4
}
else
{
/* set EOC value to new allocated cluster */
rc = fat_set_fat_cluster(fs_info, cl4find, FAT_GENFAT_EOC);
if ( rc != RC_OK )
16f5c: 0a000005 beq 16f78 <fat_scan_fat_for_free_clusters+0xf4>
{
/* cleanup activity */
fat_free_fat_clusters_chain(fs_info, (*chain));
16f60: e5981000 ldr r1, [r8] <== NOT EXECUTED
16f64: e58d3004 str r3, [sp, #4] <== NOT EXECUTED
16f68: ebffff98 bl 16dd0 <fat_free_fat_clusters_chain> <== NOT EXECUTED
}
}
else
{
/* set EOC value to new allocated cluster */
rc = fat_set_fat_cluster(fs_info, cl4find, FAT_GENFAT_EOC);
16f6c: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
16f70: e1a07003 mov r7, r3 <== NOT EXECUTED
if ( rc != RC_OK )
{
/* cleanup activity */
fat_free_fat_clusters_chain(fs_info, (*chain));
return rc;
16f74: ea000041 b 17080 <fat_scan_fat_for_free_clusters+0x1fc> <== NOT EXECUTED
}
rc = fat_set_fat_cluster(fs_info, save_cln, cl4find);
16f78: e1a0100a mov r1, sl
16f7c: e1a02005 mov r2, r5
16f80: ebffff10 bl 16bc8 <fat_set_fat_cluster>
if ( rc != RC_OK )
16f84: e250a000 subs sl, r0, #0
16f88: 1a000030 bne 17050 <fat_scan_fat_for_free_clusters+0x1cc>
goto cleanup;
}
if (zero_fill)
16f8c: e59d200c ldr r2, [sp, #12]
16f90: e3520000 cmp r2, #0
16f94: 0a000008 beq 16fbc <fat_scan_fat_for_free_clusters+0x138>
{
bytes_written = fat_cluster_set (fs_info, cl4find, 0, fs_info->vol.bpc, 0);
16f98: e1d430b6 ldrh r3, [r4, #6]
16f9c: e3a02000 mov r2, #0
16fa0: e1a00004 mov r0, r4
16fa4: e1a01005 mov r1, r5
16fa8: e58d2000 str r2, [sp]
16fac: ebffe7dd bl 10f28 <fat_cluster_set>
if (fs_info->vol.bpc != bytes_written)
16fb0: e1d430b6 ldrh r3, [r4, #6]
16fb4: e1530000 cmp r3, r0
16fb8: 1a000023 bne 1704c <fat_scan_fat_for_free_clusters+0x1c8>
goto cleanup;
}
}
save_cln = cl4find;
(*cls_added)++;
16fbc: e5963000 ldr r3, [r6]
/* have we satisfied request ? */
if (*cls_added == count)
16fc0: e59d2008 ldr r2, [sp, #8]
goto cleanup;
}
}
save_cln = cl4find;
(*cls_added)++;
16fc4: e2833001 add r3, r3, #1
/* have we satisfied request ? */
if (*cls_added == count)
16fc8: e1530002 cmp r3, r2
goto cleanup;
}
}
save_cln = cl4find;
(*cls_added)++;
16fcc: e5863000 str r3, [r6]
/* have we satisfied request ? */
if (*cls_added == count)
16fd0: 1a00000a bne 17000 <fat_scan_fat_for_free_clusters+0x17c>
{
fs_info->vol.next_cl = save_cln;
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
16fd4: e5943044 ldr r3, [r4, #68] ; 0x44
(*cls_added)++;
/* have we satisfied request ? */
if (*cls_added == count)
{
fs_info->vol.next_cl = save_cln;
16fd8: e584504c str r5, [r4, #76] ; 0x4c
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
16fdc: e3730001 cmn r3, #1
fs_info->vol.free_cls -= (*cls_added);
16fe0: 15962000 ldrne r2, [r6]
16fe4: 10623003 rsbne r3, r2, r3
16fe8: 15843044 strne r3, [r4, #68] ; 0x44
*last_cl = save_cln;
16fec: e59d3038 ldr r3, [sp, #56] ; 0x38
fat_buf_release(fs_info);
16ff0: e1a00004 mov r0, r4
if (*cls_added == count)
{
fs_info->vol.next_cl = save_cln;
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
fs_info->vol.free_cls -= (*cls_added);
*last_cl = save_cln;
16ff4: e5835000 str r5, [r3]
fat_buf_release(fs_info);
16ff8: ebffe6f2 bl 10bc8 <fat_buf_release>
return rc;
16ffc: ea00001f b 17080 <fat_scan_fat_for_free_clusters+0x1fc>
save_cln = cl4find;
(*cls_added)++;
/* have we satisfied request ? */
if (*cls_added == count)
17000: e1a0a005 mov sl, r5
fat_buf_release(fs_info);
return rc;
}
}
i++;
cl4find++;
17004: e2855001 add r5, r5, #1
if (cl4find >= data_cls_val)
cl4find = 2;
17008: e155000b cmp r5, fp
*last_cl = save_cln;
fat_buf_release(fs_info);
return rc;
}
}
i++;
1700c: e2899001 add r9, r9, #1
cl4find++;
if (cl4find >= data_cls_val)
cl4find = 2;
17010: 23a05002 movcs r5, #2
/*
* fs_info->vol.data_cls is exactly the count of data clusters
* starting at cluster 2, so the maximum valid cluster number is
* (fs_info->vol.data_cls + 1)
*/
while (i < data_cls_val)
17014: e159000b cmp r9, fp
17018: 3affffae bcc 16ed8 <fat_scan_fat_for_free_clusters+0x54>
if (cl4find >= data_cls_val)
cl4find = 2;
}
fs_info->vol.next_cl = save_cln;
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
1701c: e5943044 ldr r3, [r4, #68] ; 0x44 <== NOT EXECUTED
cl4find++;
if (cl4find >= data_cls_val)
cl4find = 2;
}
fs_info->vol.next_cl = save_cln;
17020: e584a04c str sl, [r4, #76] ; 0x4c <== NOT EXECUTED
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
17024: e3730001 cmn r3, #1 <== NOT EXECUTED
fs_info->vol.free_cls -= (*cls_added);
17028: 15962000 ldrne r2, [r6] <== NOT EXECUTED
1702c: 10623003 rsbne r3, r2, r3 <== NOT EXECUTED
*last_cl = save_cln;
17030: e59d2038 ldr r2, [sp, #56] ; 0x38 <== NOT EXECUTED
cl4find = 2;
}
fs_info->vol.next_cl = save_cln;
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
fs_info->vol.free_cls -= (*cls_added);
17034: 15843044 strne r3, [r4, #68] ; 0x44 <== NOT EXECUTED
*last_cl = save_cln;
fat_buf_release(fs_info);
17038: e1a00004 mov r0, r4 <== NOT EXECUTED
fs_info->vol.next_cl = save_cln;
if (fs_info->vol.free_cls != FAT_UNDEFINED_VALUE)
fs_info->vol.free_cls -= (*cls_added);
*last_cl = save_cln;
1703c: e582a000 str sl, [r2] <== NOT EXECUTED
fat_buf_release(fs_info);
17040: ebffe6e0 bl 10bc8 <fat_buf_release> <== NOT EXECUTED
return RC_OK;
17044: e3a07000 mov r7, #0 <== NOT EXECUTED
17048: ea00000c b 17080 <fat_scan_fat_for_free_clusters+0x1fc> <== NOT EXECUTED
if (zero_fill)
{
bytes_written = fat_cluster_set (fs_info, cl4find, 0, fs_info->vol.bpc, 0);
if (fs_info->vol.bpc != bytes_written)
{
rc = -1;
1704c: e3e0a000 mvn sl, #0 <== NOT EXECUTED
return RC_OK;
cleanup:
/* cleanup activity */
fat_free_fat_clusters_chain(fs_info, (*chain));
17050: e5981000 ldr r1, [r8] <== NOT EXECUTED
17054: e1a00004 mov r0, r4 <== NOT EXECUTED
17058: ebffff5c bl 16dd0 <fat_free_fat_clusters_chain> <== NOT EXECUTED
/* trying to save last allocated cluster for future use */
fat_set_fat_cluster(fs_info, cl4find, FAT_GENFAT_FREE);
1705c: e1a01005 mov r1, r5 <== NOT EXECUTED
17060: e3a02000 mov r2, #0 <== NOT EXECUTED
17064: e1a00004 mov r0, r4 <== NOT EXECUTED
17068: ebfffed6 bl 16bc8 <fat_set_fat_cluster> <== NOT EXECUTED
fat_buf_release(fs_info);
1706c: e1a00004 mov r0, r4 <== NOT EXECUTED
17070: ebffe6d4 bl 10bc8 <fat_buf_release> <== NOT EXECUTED
return rc;
17074: e1a0700a mov r7, sl <== NOT EXECUTED
17078: ea000000 b 17080 <fat_scan_fat_for_free_clusters+0x1fc> <== NOT EXECUTED
* wouldn't work properly
*/
if (*cls_added == 0)
{
*chain = cl4find;
rc = fat_set_fat_cluster(fs_info, cl4find, FAT_GENFAT_EOC);
1707c: e1a07000 mov r7, r0 <== NOT EXECUTED
fat_free_fat_clusters_chain(fs_info, (*chain));
/* trying to save last allocated cluster for future use */
fat_set_fat_cluster(fs_info, cl4find, FAT_GENFAT_FREE);
fat_buf_release(fs_info);
return rc;
}
17080: e1a00007 mov r0, r7
17084: e28dd014 add sp, sp, #20
17088: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00010e88 <fat_sector_write>:
fat_fs_info_t *fs_info,
uint32_t start,
uint32_t offset,
uint32_t count,
const void *buff)
{
10e88: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
10e8c: e1a05000 mov r5, r0
10e90: e1a06003 mov r6, r3
int rc = RC_OK;
ssize_t cmpltd = 0;
uint32_t sec_num = start;
uint32_t ofs = offset;
10e94: e1a09002 mov r9, r2
uint32_t count,
const void *buff)
{
int rc = RC_OK;
ssize_t cmpltd = 0;
uint32_t sec_num = start;
10e98: e1a08001 mov r8, r1
uint32_t offset,
uint32_t count,
const void *buff)
{
int rc = RC_OK;
ssize_t cmpltd = 0;
10e9c: e3a04000 mov r4, #0
c = MIN(count, (fs_info->vol.bps - ofs));
if (c == fs_info->vol.bytes_per_block)
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_GET, &sec_buf);
else
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_READ, &sec_buf);
10ea0: e3a0b001 mov fp, #1
uint32_t sec_num = start;
uint32_t ofs = offset;
uint8_t *sec_buf;
uint32_t c = 0;
while(count > 0)
10ea4: ea000019 b 10f10 <fat_sector_write+0x88>
{
c = MIN(count, (fs_info->vol.bps - ofs));
10ea8: e1d570b0 ldrh r7, [r5]
if (c == fs_info->vol.bytes_per_block)
10eac: e1d530ba ldrh r3, [r5, #10]
uint8_t *sec_buf;
uint32_t c = 0;
while(count > 0)
{
c = MIN(count, (fs_info->vol.bps - ofs));
10eb0: e0697007 rsb r7, r9, r7
10eb4: e1570006 cmp r7, r6
10eb8: 21a07006 movcs r7, r6
if (c == fs_info->vol.bytes_per_block)
10ebc: e1570003 cmp r7, r3
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_GET, &sec_buf);
10ec0: 03a02002 moveq r2, #2
else
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_READ, &sec_buf);
10ec4: 13a02001 movne r2, #1
while(count > 0)
{
c = MIN(count, (fs_info->vol.bps - ofs));
if (c == fs_info->vol.bytes_per_block)
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_GET, &sec_buf);
10ec8: e1a00005 mov r0, r5
10ecc: e1a01008 mov r1, r8
else
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_READ, &sec_buf);
10ed0: e1a0300d mov r3, sp
10ed4: ebffff9e bl 10d54 <fat_buf_access>
if (rc != RC_OK)
10ed8: e3500000 cmp r0, #0
c = MIN(count, (fs_info->vol.bps - ofs));
if (c == fs_info->vol.bytes_per_block)
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_GET, &sec_buf);
else
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_READ, &sec_buf);
10edc: e1a0a000 mov sl, r0
if (rc != RC_OK)
10ee0: 1a00000d bne 10f1c <fat_sector_write+0x94>
return -1;
memcpy((sec_buf + ofs), (buff + cmpltd), c);
10ee4: e59d0000 ldr r0, [sp]
10ee8: e59d3028 ldr r3, [sp, #40] ; 0x28
10eec: e0800009 add r0, r0, r9
10ef0: e0831004 add r1, r3, r4
10ef4: e1a02007 mov r2, r7
10ef8: eb002101 bl 19304 <memcpy>
}
static inline void
fat_buf_mark_modified(fat_fs_info_t *fs_info)
{
fs_info->c.modified = true;
10efc: e5c5b088 strb fp, [r5, #136] ; 0x88
fat_buf_mark_modified(fs_info);
count -= c;
10f00: e0676006 rsb r6, r7, r6
cmpltd +=c;
10f04: e0874004 add r4, r7, r4
sec_num++;
10f08: e2888001 add r8, r8, #1
ofs = 0;
10f0c: e1a0900a mov r9, sl
uint32_t sec_num = start;
uint32_t ofs = offset;
uint8_t *sec_buf;
uint32_t c = 0;
while(count > 0)
10f10: e3560000 cmp r6, #0
10f14: 1affffe3 bne 10ea8 <fat_sector_write+0x20>
10f18: ea000000 b 10f20 <fat_sector_write+0x98>
if (c == fs_info->vol.bytes_per_block)
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_GET, &sec_buf);
else
rc = fat_buf_access(fs_info, sec_num, FAT_OP_TYPE_READ, &sec_buf);
if (rc != RC_OK)
return -1;
10f1c: e3e04000 mvn r4, #0 <== NOT EXECUTED
cmpltd +=c;
sec_num++;
ofs = 0;
}
return cmpltd;
}
10f20: e1a00004 mov r0, r4
10f24: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
00016bc8 <fat_set_fat_cluster>:
fat_set_fat_cluster(
fat_fs_info_t *fs_info,
uint32_t cln,
uint32_t in_val
)
{
16bc8: e92d47f1 push {r0, r4, r5, r6, r7, r8, r9, sl, lr}
int rc = RC_OK;
uint32_t sec = 0;
uint32_t ofs = 0;
uint16_t fat16_clv = 0;
uint32_t fat32_clv = 0;
uint8_t *sec_buf = NULL;
16bcc: e3a03000 mov r3, #0
/* sanity check */
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
16bd0: e3510001 cmp r1, #1
fat_set_fat_cluster(
fat_fs_info_t *fs_info,
uint32_t cln,
uint32_t in_val
)
{
16bd4: e1a04000 mov r4, r0
16bd8: e1a05001 mov r5, r1
16bdc: e1a09002 mov r9, r2
int rc = RC_OK;
uint32_t sec = 0;
uint32_t ofs = 0;
uint16_t fat16_clv = 0;
uint32_t fat32_clv = 0;
uint8_t *sec_buf = NULL;
16be0: e58d3000 str r3, [sp]
/* sanity check */
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
16be4: 9a000074 bls 16dbc <fat_set_fat_cluster+0x1f4>
16be8: e5903038 ldr r3, [r0, #56] ; 0x38
16bec: e2833001 add r3, r3, #1
16bf0: e1510003 cmp r1, r3
16bf4: 8a000070 bhi 16dbc <fat_set_fat_cluster+0x1f4>
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
16bf8: e5d0300e ldrb r3, [r0, #14]
16bfc: e2131001 ands r1, r3, #1
16c00: 108520a5 addne r2, r5, r5, lsr #1
16c04: 1a000002 bne 16c14 <fat_set_fat_cluster+0x4c>
16c08: e3130002 tst r3, #2
16c0c: 11a02085 lslne r2, r5, #1
16c10: 01a02105 lsleq r2, r5, #2
16c14: e5d48002 ldrb r8, [r4, #2]
16c18: e5940058 ldr r0, [r4, #88] ; 0x58
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16c1c: e3510000 cmp r1, #0
/* sanity check */
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
16c20: e0808832 add r8, r0, r2, lsr r8
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16c24: 108560a5 addne r6, r5, r5, lsr #1
16c28: 1a000002 bne 16c38 <fat_set_fat_cluster+0x70>
16c2c: e3130002 tst r3, #2
16c30: 11a06085 lslne r6, r5, #1
16c34: 01a06105 lsleq r6, r5, #2
rc = fat_buf_access(fs_info, sec, FAT_OP_TYPE_READ, &sec_buf);
16c38: e1a00004 mov r0, r4
16c3c: e1a01008 mov r1, r8
16c40: e3a02001 mov r2, #1
16c44: e1a0300d mov r3, sp
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16c48: e1d470b0 ldrh r7, [r4]
rc = fat_buf_access(fs_info, sec, FAT_OP_TYPE_READ, &sec_buf);
16c4c: ebffe840 bl 10d54 <fat_buf_access>
if (rc != RC_OK)
16c50: e3500000 cmp r0, #0
16c54: 1a00005c bne 16dcc <fat_set_fat_cluster+0x204>
return rc;
switch ( fs_info->vol.type )
16c58: e5d4a00e ldrb sl, [r4, #14]
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16c5c: e2477001 sub r7, r7, #1
rc = fat_buf_access(fs_info, sec, FAT_OP_TYPE_READ, &sec_buf);
if (rc != RC_OK)
return rc;
switch ( fs_info->vol.type )
16c60: e35a0002 cmp sl, #2
if ( (cln < 2) || (cln > (fs_info->vol.data_cls + 1)) )
rtems_set_errno_and_return_minus_one(EIO);
sec = (FAT_FAT_OFFSET(fs_info->vol.type, cln) >> fs_info->vol.sec_log2) +
fs_info->vol.afat_loc;
ofs = FAT_FAT_OFFSET(fs_info->vol.type, cln) & (fs_info->vol.bps - 1);
16c64: e0066007 and r6, r6, r7
rc = fat_buf_access(fs_info, sec, FAT_OP_TYPE_READ, &sec_buf);
if (rc != RC_OK)
return rc;
switch ( fs_info->vol.type )
16c68: 0a000047 beq 16d8c <fat_set_fat_cluster+0x1c4>
16c6c: e35a0004 cmp sl, #4
16c70: 0a000048 beq 16d98 <fat_set_fat_cluster+0x1d0>
16c74: e35a0001 cmp sl, #1
16c78: 1a00004f bne 16dbc <fat_set_fat_cluster+0x1f4>
{
case FAT_FAT12:
if ( FAT_CLUSTER_IS_ODD(cln) )
16c7c: e3150001 tst r5, #1
16c80: e1a09a09 lsl r9, r9, #20
16c84: 0a000019 beq 16cf0 <fat_set_fat_cluster+0x128>
{
fat16_clv = ((uint16_t )in_val) << FAT_FAT12_SHIFT;
*(sec_buf + ofs) &= 0x0F;
16c88: e59d3000 ldr r3, [sp]
16c8c: e7d32006 ldrb r2, [r3, r6]
16c90: e202200f and r2, r2, #15
16c94: e7c32006 strb r2, [r3, r6]
*(sec_buf + ofs) |= (uint8_t)(fat16_clv & 0x00F0);
16c98: e59d3000 ldr r3, [sp]
16c9c: e7d32006 ldrb r2, [r3, r6]
16ca0: e1822829 orr r2, r2, r9, lsr #16
16ca4: e7c32006 strb r2, [r3, r6]
fat_buf_mark_modified(fs_info);
if ( ofs == (fs_info->vol.bps - 1) )
16ca8: e1d430b0 ldrh r3, [r4]
16cac: e2433001 sub r3, r3, #1
16cb0: e1560003 cmp r6, r3
fat_buf_mark_modified(fs_info);
}
else
{
*(sec_buf + ofs + 1) &= 0x00;
16cb4: 159d3000 ldrne r3, [sp]
16cb8: 12866001 addne r6, r6, #1
}
static inline void
fat_buf_mark_modified(fat_fs_info_t *fs_info)
{
fs_info->c.modified = true;
16cbc: e5c4a088 strb sl, [r4, #136] ; 0x88
16cc0: 17c30006 strbne r0, [r3, r6]
*(sec_buf + ofs) |= (uint8_t)(fat16_clv & 0x00F0);
fat_buf_mark_modified(fs_info);
if ( ofs == (fs_info->vol.bps - 1) )
16cc4: 1a00002b bne 16d78 <fat_set_fat_cluster+0x1b0>
{
rc = fat_buf_access(fs_info, sec + 1, FAT_OP_TYPE_READ,
16cc8: e1a0300d mov r3, sp <== NOT EXECUTED
16ccc: e1a00004 mov r0, r4 <== NOT EXECUTED
16cd0: e2881001 add r1, r8, #1 <== NOT EXECUTED
16cd4: e1a0200a mov r2, sl <== NOT EXECUTED
16cd8: ebffe81d bl 10d54 <fat_buf_access> <== NOT EXECUTED
&sec_buf);
if (rc != RC_OK)
16cdc: e3500000 cmp r0, #0 <== NOT EXECUTED
return rc;
*sec_buf &= 0x00;
16ce0: 059d3000 ldreq r3, [sp] <== NOT EXECUTED
16ce4: 05c30000 strbeq r0, [r3] <== NOT EXECUTED
if ( ofs == (fs_info->vol.bps - 1) )
{
rc = fat_buf_access(fs_info, sec + 1, FAT_OP_TYPE_READ,
&sec_buf);
if (rc != RC_OK)
16ce8: 0a000017 beq 16d4c <fat_set_fat_cluster+0x184> <== NOT EXECUTED
16cec: ea000036 b 16dcc <fat_set_fat_cluster+0x204> <== NOT EXECUTED
}
}
else
{
fat16_clv = ((uint16_t )in_val) & FAT_FAT12_MASK;
*(sec_buf + ofs) &= 0x00;
16cf0: e59d3000 ldr r3, [sp]
16cf4: e7c30006 strb r0, [r3, r6]
*(sec_buf + ofs) |= (uint8_t)(fat16_clv & 0x00FF);
16cf8: e59d3000 ldr r3, [sp]
16cfc: e7d32006 ldrb r2, [r3, r6]
*(sec_buf + ofs + 1) |= (uint8_t )((fat16_clv & 0xFF00)>>8);
}
}
else
{
fat16_clv = ((uint16_t )in_val) & FAT_FAT12_MASK;
16d00: e1a09229 lsr r9, r9, #4
*(sec_buf + ofs) &= 0x00;
*(sec_buf + ofs) |= (uint8_t)(fat16_clv & 0x00FF);
16d04: e1822829 orr r2, r2, r9, lsr #16
16d08: e7c32006 strb r2, [r3, r6]
fat_buf_mark_modified(fs_info);
if ( ofs == (fs_info->vol.bps - 1) )
16d0c: e1d430b0 ldrh r3, [r4]
16d10: e2433001 sub r3, r3, #1
16d14: e1560003 cmp r6, r3
16d18: e5c4a088 strb sl, [r4, #136] ; 0x88
16d1c: 1a000010 bne 16d64 <fat_set_fat_cluster+0x19c>
{
rc = fat_buf_access(fs_info, sec + 1, FAT_OP_TYPE_READ,
16d20: e1a00004 mov r0, r4 <== NOT EXECUTED
16d24: e2881001 add r1, r8, #1 <== NOT EXECUTED
16d28: e1a0200a mov r2, sl <== NOT EXECUTED
16d2c: e1a0300d mov r3, sp <== NOT EXECUTED
16d30: ebffe807 bl 10d54 <fat_buf_access> <== NOT EXECUTED
&sec_buf);
if (rc != RC_OK)
16d34: e3500000 cmp r0, #0 <== NOT EXECUTED
16d38: 1a000023 bne 16dcc <fat_set_fat_cluster+0x204> <== NOT EXECUTED
return rc;
*sec_buf &= 0xF0;
16d3c: e59d3000 ldr r3, [sp] <== NOT EXECUTED
16d40: e5d32000 ldrb r2, [r3] <== NOT EXECUTED
16d44: e3c2200f bic r2, r2, #15 <== NOT EXECUTED
16d48: e5c32000 strb r2, [r3] <== NOT EXECUTED
*sec_buf |= (uint8_t)((fat16_clv & 0xFF00)>>8);
16d4c: e59d3000 ldr r3, [sp] <== NOT EXECUTED
16d50: e5d32000 ldrb r2, [r3] <== NOT EXECUTED
16d54: e1829c29 orr r9, r2, r9, lsr #24 <== NOT EXECUTED
16d58: e5c39000 strb r9, [r3] <== NOT EXECUTED
16d5c: e5c4a088 strb sl, [r4, #136] ; 0x88 <== NOT EXECUTED
16d60: ea000019 b 16dcc <fat_set_fat_cluster+0x204> <== NOT EXECUTED
fat_buf_mark_modified(fs_info);
}
else
{
*(sec_buf + ofs + 1) &= 0xF0;
16d64: e59d3000 ldr r3, [sp]
16d68: e2866001 add r6, r6, #1
16d6c: e7d32006 ldrb r2, [r3, r6]
16d70: e3c2200f bic r2, r2, #15
16d74: e7c32006 strb r2, [r3, r6]
*(sec_buf + ofs+1) |= (uint8_t)((fat16_clv & 0xFF00)>>8);
16d78: e59d3000 ldr r3, [sp]
16d7c: e7d32006 ldrb r2, [r3, r6]
16d80: e1829c29 orr r9, r2, r9, lsr #24
16d84: e7c39006 strb r9, [r3, r6]
16d88: ea00000f b 16dcc <fat_set_fat_cluster+0x204>
}
}
break;
case FAT_FAT16:
*((uint16_t *)(sec_buf + ofs)) =
16d8c: e59d3000 ldr r3, [sp]
(uint16_t )(CT_LE_W(in_val));
16d90: e18390b6 strh r9, [r3, r6]
16d94: ea000005 b 16db0 <fat_set_fat_cluster+0x1e8>
break;
case FAT_FAT32:
fat32_clv = CT_LE_L((in_val & FAT_FAT32_MASK));
*((uint32_t *)(sec_buf + ofs)) &= CT_LE_L(0xF0000000);
16d98: e59d3000 ldr r3, [sp]
16d9c: e7932006 ldr r2, [r3, r6]
(uint16_t )(CT_LE_W(in_val));
fat_buf_mark_modified(fs_info);
break;
case FAT_FAT32:
fat32_clv = CT_LE_L((in_val & FAT_FAT32_MASK));
16da0: e3c9920f bic r9, r9, #-268435456 ; 0xf0000000
*((uint32_t *)(sec_buf + ofs)) &= CT_LE_L(0xF0000000);
16da4: e202220f and r2, r2, #-268435456 ; 0xf0000000
*((uint32_t *)(sec_buf + ofs)) |= fat32_clv;
16da8: e1829009 orr r9, r2, r9
16dac: e7839006 str r9, [r3, r6]
16db0: e3a03001 mov r3, #1
16db4: e5c43088 strb r3, [r4, #136] ; 0x88
16db8: ea000003 b 16dcc <fat_set_fat_cluster+0x204>
fat_buf_mark_modified(fs_info);
break;
default:
rtems_set_errno_and_return_minus_one(EIO);
16dbc: eb0006a9 bl 18868 <__errno> <== NOT EXECUTED
16dc0: e3a03005 mov r3, #5 <== NOT EXECUTED
16dc4: e5803000 str r3, [r0] <== NOT EXECUTED
16dc8: e3e00000 mvn r0, #0 <== NOT EXECUTED
break;
}
return RC_OK;
}
16dcc: e8bd87f8 pop {r3, r4, r5, r6, r7, r8, r9, sl, pc}
00011878 <fat_shutdown_drive>:
* RC_OK on success, or -1 if error occured
* and errno set appropriately
*/
int
fat_shutdown_drive(fat_fs_info_t *fs_info)
{
11878: e92d41f0 push {r4, r5, r6, r7, r8, lr}
1187c: e1a04000 mov r4, r0
int rc = RC_OK;
int i = 0;
rc = fat_sync(fs_info);
11880: ebffffd0 bl 117c8 <fat_sync>
if ( rc != RC_OK )
rc = -1;
11884: e2505000 subs r5, r0, #0
11888: 13e05000 mvnne r5, #0
1188c: e3a07000 mov r7, #0
for (i = 0; i < FAT_HASH_SIZE; i++)
{
rtems_chain_node *node = NULL;
rtems_chain_control *the_chain = fs_info->vhash + i;
11890: e594806c ldr r8, [r4, #108] ; 0x6c
11894: e0888007 add r8, r8, r7
while ( (node = rtems_chain_get(the_chain)) != NULL )
11898: ea000000 b 118a0 <fat_shutdown_drive+0x28>
free(node);
1189c: ebffc9de bl 401c <free> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
118a0: e1a00008 mov r0, r8
118a4: ebffdc9b bl 8b18 <_Chain_Get>
for (i = 0; i < FAT_HASH_SIZE; i++)
{
rtems_chain_node *node = NULL;
rtems_chain_control *the_chain = fs_info->vhash + i;
while ( (node = rtems_chain_get(the_chain)) != NULL )
118a8: e2506000 subs r6, r0, #0
118ac: 1afffffa bne 1189c <fat_shutdown_drive+0x24>
118b0: e287700c add r7, r7, #12
rc = fat_sync(fs_info);
if ( rc != RC_OK )
rc = -1;
for (i = 0; i < FAT_HASH_SIZE; i++)
118b4: e3570018 cmp r7, #24
118b8: 1afffff4 bne 11890 <fat_shutdown_drive+0x18>
}
for (i = 0; i < FAT_HASH_SIZE; i++)
{
rtems_chain_node *node = NULL;
rtems_chain_control *the_chain = fs_info->rhash + i;
118bc: e5947070 ldr r7, [r4, #112] ; 0x70
118c0: e0877006 add r7, r7, r6
while ( (node = rtems_chain_get(the_chain)) != NULL )
118c4: ea000000 b 118cc <fat_shutdown_drive+0x54>
free(node);
118c8: ebffc9d3 bl 401c <free> <== NOT EXECUTED
118cc: e1a00007 mov r0, r7
118d0: ebffdc90 bl 8b18 <_Chain_Get>
for (i = 0; i < FAT_HASH_SIZE; i++)
{
rtems_chain_node *node = NULL;
rtems_chain_control *the_chain = fs_info->rhash + i;
while ( (node = rtems_chain_get(the_chain)) != NULL )
118d4: e3500000 cmp r0, #0
118d8: 1afffffa bne 118c8 <fat_shutdown_drive+0x50>
118dc: e286600c add r6, r6, #12
while ( (node = rtems_chain_get(the_chain)) != NULL )
free(node);
}
for (i = 0; i < FAT_HASH_SIZE; i++)
118e0: e3560018 cmp r6, #24
118e4: 1afffff4 bne 118bc <fat_shutdown_drive+0x44>
while ( (node = rtems_chain_get(the_chain)) != NULL )
free(node);
}
free(fs_info->vhash);
118e8: e594006c ldr r0, [r4, #108] ; 0x6c
118ec: ebffc9ca bl 401c <free>
free(fs_info->rhash);
118f0: e5940070 ldr r0, [r4, #112] ; 0x70
118f4: ebffc9c8 bl 401c <free>
free(fs_info->uino);
118f8: e5940074 ldr r0, [r4, #116] ; 0x74
118fc: ebffc9c6 bl 401c <free>
free(fs_info->sec_buf);
11900: e5940090 ldr r0, [r4, #144] ; 0x90
11904: ebffc9c4 bl 401c <free>
close(fs_info->vol.fd);
11908: e5940060 ldr r0, [r4, #96] ; 0x60
1190c: ebffc920 bl 3d94 <close>
if (rc)
11910: e3550000 cmp r5, #0
11914: 0a000002 beq 11924 <fat_shutdown_drive+0xac>
errno = EIO;
11918: eb001bd2 bl 18868 <__errno> <== NOT EXECUTED
1191c: e3a03005 mov r3, #5 <== NOT EXECUTED
11920: e5803000 str r3, [r0] <== NOT EXECUTED
return rc;
}
11924: e1a00005 mov r0, r5
11928: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
000117c8 <fat_sync>:
return RC_OK;
}
int
fat_sync(fat_fs_info_t *fs_info)
{
117c8: e92d4073 push {r0, r1, r4, r5, r6, lr}
static int
fat_fat32_update_fsinfo_sector(fat_fs_info_t *fs_info)
{
ssize_t ret1 = 0, ret2 = 0;
if (fs_info->vol.type == FAT_FAT32)
117cc: e5d0300e ldrb r3, [r0, #14]
117d0: e3530004 cmp r3, #4
return RC_OK;
}
int
fat_sync(fat_fs_info_t *fs_info)
{
117d4: e1a04000 mov r4, r0
* RC_OK on success, or -1 if error occured (errno set appropriately)
*/
static int
fat_fat32_update_fsinfo_sector(fat_fs_info_t *fs_info)
{
ssize_t ret1 = 0, ret2 = 0;
117d8: 13a00000 movne r0, #0
117dc: 11a05000 movne r5, r0
if (fs_info->vol.type == FAT_FAT32)
117e0: 1a000019 bne 1184c <fat_sync+0x84>
{
uint32_t free_count = fs_info->vol.free_cls;
uint32_t next_free = fs_info->vol.next_cl;
if (free_count != fs_info->vol.free_cls_in_fs_info)
117e4: e2841044 add r1, r4, #68 ; 0x44
117e8: e8910046 ldm r1, {r1, r2, r6}
117ec: e1510002 cmp r1, r2
* RC_OK on success, or -1 if error occured (errno set appropriately)
*/
static int
fat_fat32_update_fsinfo_sector(fat_fs_info_t *fs_info)
{
ssize_t ret1 = 0, ret2 = 0;
117f0: 03a05000 moveq r5, #0
if (fs_info->vol.type == FAT_FAT32)
{
uint32_t free_count = fs_info->vol.free_cls;
uint32_t next_free = fs_info->vol.next_cl;
if (free_count != fs_info->vol.free_cls_in_fs_info)
117f4: 0a000007 beq 11818 <fat_sync+0x50>
{
uint32_t le_free_count = CT_LE_L(free_count);
117f8: e28d2008 add r2, sp, #8 <== NOT EXECUTED
117fc: e5221004 str r1, [r2, #-4]! <== NOT EXECUTED
fs_info->vol.free_cls_in_fs_info = free_count;
11800: e5841048 str r1, [r4, #72] ; 0x48 <== NOT EXECUTED
ret1 = fat_sector_write(fs_info,
11804: e58d2000 str r2, [sp] <== NOT EXECUTED
11808: e1d414b0 ldrh r1, [r4, #64] ; 0x40 <== NOT EXECUTED
1180c: e3a02f7a mov r2, #488 ; 0x1e8 <== NOT EXECUTED
11810: ebfffd9c bl 10e88 <fat_sector_write> <== NOT EXECUTED
11814: e1a05000 mov r5, r0 <== NOT EXECUTED
FAT_FSINFO_FREE_CLUSTER_COUNT_OFFSET,
sizeof(le_free_count),
&le_free_count);
}
if (next_free != fs_info->vol.next_cl_in_fs_info)
11818: e5943050 ldr r3, [r4, #80] ; 0x50
1181c: e1560003 cmp r6, r3
* RC_OK on success, or -1 if error occured (errno set appropriately)
*/
static int
fat_fat32_update_fsinfo_sector(fat_fs_info_t *fs_info)
{
ssize_t ret1 = 0, ret2 = 0;
11820: 03a00000 moveq r0, #0
FAT_FSINFO_FREE_CLUSTER_COUNT_OFFSET,
sizeof(le_free_count),
&le_free_count);
}
if (next_free != fs_info->vol.next_cl_in_fs_info)
11824: 0a000008 beq 1184c <fat_sync+0x84>
{
uint32_t le_next_free = CT_LE_L(next_free);
11828: e28d3008 add r3, sp, #8
1182c: e5236004 str r6, [r3, #-4]!
fs_info->vol.next_cl_in_fs_info = next_free;
11830: e5846050 str r6, [r4, #80] ; 0x50
ret2 = fat_sector_write(fs_info,
11834: e58d3000 str r3, [sp]
11838: e1d414b0 ldrh r1, [r4, #64] ; 0x40
1183c: e1a00004 mov r0, r4
11840: e3a02f7b mov r2, #492 ; 0x1ec
11844: e3a03004 mov r3, #4
11848: ebfffd8e bl 10e88 <fat_sector_write>
sizeof(le_next_free),
&le_next_free);
}
}
if ( (ret1 < 0) || (ret2 < 0) )
1184c: e1a05fa5 lsr r5, r5, #31
{
int rc = RC_OK;
rc = fat_fat32_update_fsinfo_sector(fs_info);
if ( rc != RC_OK )
rc = -1;
11850: e1955fa0 orrs r5, r5, r0, lsr #31
fat_buf_release(fs_info);
11854: e1a00004 mov r0, r4
{
int rc = RC_OK;
rc = fat_fat32_update_fsinfo_sector(fs_info);
if ( rc != RC_OK )
rc = -1;
11858: 13e05000 mvnne r5, #0
fat_buf_release(fs_info);
1185c: ebfffcd9 bl 10bc8 <fat_buf_release>
if (rtems_bdbuf_syncdev(fs_info->vol.dd) != RTEMS_SUCCESSFUL)
11860: e5940064 ldr r0, [r4, #100] ; 0x64
11864: ebfff681 bl f270 <rtems_bdbuf_syncdev>
rc = -1;
11868: e3500000 cmp r0, #0
return rc;
}
1186c: 01a00005 moveq r0, r5
11870: 13e00000 mvnne r0, #0
11874: e8bd807c pop {r2, r3, r4, r5, r6, pc}
00020478 <fchmod>:
int fchmod( int fd, mode_t mode )
{
int rv;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
20478: e59f309c ldr r3, [pc, #156] ; 2051c <fchmod+0xa4>
2047c: e5933000 ldr r3, [r3]
20480: e1500003 cmp r0, r3
/**
* POSIX 1003.1b 5.6.4 - Change File Modes
*/
int fchmod( int fd, mode_t mode )
{
20484: e92d4030 push {r4, r5, lr}
20488: e1a05001 mov r5, r1
int rv;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
2048c: 2a000006 bcs 204ac <fchmod+0x34>
iop = rtems_libio_iop( fd );
20490: e59f3088 ldr r3, [pc, #136] ; 20520 <fchmod+0xa8>
20494: e5933000 ldr r3, [r3]
20498: e3a04030 mov r4, #48 ; 0x30
2049c: e0243490 mla r4, r0, r4, r3
rtems_libio_check_is_open(iop);
204a0: e594300c ldr r3, [r4, #12]
204a4: e3130c01 tst r3, #256 ; 0x100
204a8: 1a000002 bne 204b8 <fchmod+0x40>
204ac: eb004506 bl 318cc <__errno>
204b0: e3a03009 mov r3, #9
204b4: ea000014 b 2050c <fchmod+0x94>
if (iop->pathinfo.mt_entry->writeable) {
204b8: e5940024 ldr r0, [r4, #36] ; 0x24
204bc: e5d03029 ldrb r3, [r0, #41] ; 0x29
204c0: e3530000 cmp r3, #0
204c4: 0a00000e beq 20504 <fchmod+0x8c>
const rtems_filesystem_location_info_t *loc
)
{
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
(*mt_entry->ops->lock_h)( mt_entry );
204c8: e590300c ldr r3, [r0, #12]
204cc: e1a0e00f mov lr, pc
204d0: e593f000 ldr pc, [r3]
rtems_filesystem_instance_lock( &iop->pathinfo );
rv = (*iop->pathinfo.mt_entry->ops->fchmod_h)( &iop->pathinfo, mode );
204d4: e5943024 ldr r3, [r4, #36] ; 0x24
204d8: e1a01005 mov r1, r5
204dc: e593300c ldr r3, [r3, #12]
204e0: e2840010 add r0, r4, #16
204e4: e1a0e00f mov lr, pc
204e8: e593f020 ldr pc, [r3, #32]
204ec: e1a05000 mov r5, r0
static inline void rtems_filesystem_instance_unlock(
const rtems_filesystem_location_info_t *loc
)
{
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
204f0: e5940024 ldr r0, [r4, #36] ; 0x24
(*mt_entry->ops->unlock_h)( mt_entry );
204f4: e590300c ldr r3, [r0, #12]
204f8: e1a0e00f mov lr, pc
204fc: e593f004 ldr pc, [r3, #4]
20500: ea000003 b 20514 <fchmod+0x9c>
rtems_filesystem_instance_unlock( &iop->pathinfo );
} else {
errno = EROFS;
20504: eb0044f0 bl 318cc <__errno> <== NOT EXECUTED
20508: e3a0301e mov r3, #30 <== NOT EXECUTED
2050c: e5803000 str r3, [r0]
rv = -1;
20510: e3e05000 mvn r5, #0
}
return rv;
}
20514: e1a00005 mov r0, r5
20518: e8bd8030 pop {r4, r5, pc}
00020524 <fchown>:
int fchown( int fd, uid_t owner, gid_t group )
{
int rv = 0;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
20524: e59f30ac ldr r3, [pc, #172] ; 205d8 <fchown+0xb4>
20528: e5933000 ldr r3, [r3]
/**
* POSIX 1003.1b 5.6.5 - Change Owner and Group of a File
*/
int fchown( int fd, uid_t owner, gid_t group )
{
2052c: e1a01801 lsl r1, r1, #16
20530: e1a02802 lsl r2, r2, #16
int rv = 0;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
20534: e1500003 cmp r0, r3
/**
* POSIX 1003.1b 5.6.5 - Change Owner and Group of a File
*/
int fchown( int fd, uid_t owner, gid_t group )
{
20538: e92d4070 push {r4, r5, r6, lr}
2053c: e1a06821 lsr r6, r1, #16
20540: e1a05822 lsr r5, r2, #16
int rv = 0;
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
20544: 2a000006 bcs 20564 <fchown+0x40>
iop = rtems_libio_iop( fd );
20548: e59f308c ldr r3, [pc, #140] ; 205dc <fchown+0xb8>
2054c: e5933000 ldr r3, [r3]
20550: e3a04030 mov r4, #48 ; 0x30
20554: e0243490 mla r4, r0, r4, r3
rtems_libio_check_is_open(iop);
20558: e594300c ldr r3, [r4, #12]
2055c: e3130c01 tst r3, #256 ; 0x100
20560: 1a000002 bne 20570 <fchown+0x4c>
20564: eb0044d8 bl 318cc <__errno>
20568: e3a03009 mov r3, #9
2056c: ea000015 b 205c8 <fchown+0xa4>
if (iop->pathinfo.mt_entry->writeable) {
20570: e5940024 ldr r0, [r4, #36] ; 0x24
20574: e5d03029 ldrb r3, [r0, #41] ; 0x29
20578: e3530000 cmp r3, #0
2057c: 0a00000f beq 205c0 <fchown+0x9c>
const rtems_filesystem_location_info_t *loc
)
{
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
(*mt_entry->ops->lock_h)( mt_entry );
20580: e590300c ldr r3, [r0, #12]
20584: e1a0e00f mov lr, pc
20588: e593f000 ldr pc, [r3]
rtems_filesystem_instance_lock( &iop->pathinfo );
rv = (*iop->pathinfo.mt_entry->ops->chown_h)(
2058c: e5943024 ldr r3, [r4, #36] ; 0x24
20590: e1a02005 mov r2, r5
20594: e593300c ldr r3, [r3, #12]
20598: e2840010 add r0, r4, #16
2059c: e1a01006 mov r1, r6
205a0: e1a0e00f mov lr, pc
205a4: e593f024 ldr pc, [r3, #36] ; 0x24
205a8: e1a05000 mov r5, r0
static inline void rtems_filesystem_instance_unlock(
const rtems_filesystem_location_info_t *loc
)
{
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
205ac: e5940024 ldr r0, [r4, #36] ; 0x24
(*mt_entry->ops->unlock_h)( mt_entry );
205b0: e590300c ldr r3, [r0, #12]
205b4: e1a0e00f mov lr, pc
205b8: e593f004 ldr pc, [r3, #4]
205bc: ea000003 b 205d0 <fchown+0xac>
owner,
group
);
rtems_filesystem_instance_unlock( &iop->pathinfo );
} else {
errno = EROFS;
205c0: eb0044c1 bl 318cc <__errno> <== NOT EXECUTED
205c4: e3a0301e mov r3, #30 <== NOT EXECUTED
205c8: e5803000 str r3, [r0]
rv = -1;
205cc: e3e05000 mvn r5, #0
}
return rv;
}
205d0: e1a00005 mov r0, r5
205d4: e8bd8070 pop {r4, r5, r6, pc}
0002d150 <fcntl>:
int fcntl(
int fd,
int cmd,
...
)
{
2d150: e92d000e push {r1, r2, r3}
2d154: e92d41f1 push {r0, r4, r5, r6, r7, r8, lr}
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
2d158: e59f21d8 ldr r2, [pc, #472] ; 2d338 <bsp_section_text_size+0x3c>
2d15c: e5922000 ldr r2, [r2]
...
)
{
int ret;
va_list ap;
va_start( ap, cmd );
2d160: e28d3020 add r3, sp, #32
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
2d164: e1500002 cmp r0, r2
int fcntl(
int fd,
int cmd,
...
)
{
2d168: e59d601c ldr r6, [sp, #28]
int ret;
va_list ap;
va_start( ap, cmd );
2d16c: e58d3000 str r3, [sp]
int fd2;
int flags;
int mask;
int ret = 0;
rtems_libio_check_fd( fd );
2d170: 2a000006 bcs 2d190 <fcntl+0x40>
iop = rtems_libio_iop( fd );
2d174: e59f21c0 ldr r2, [pc, #448] ; 2d33c <bsp_section_text_size+0x40>
2d178: e5922000 ldr r2, [r2]
2d17c: e3a04030 mov r4, #48 ; 0x30
2d180: e0242490 mla r4, r0, r4, r2
rtems_libio_check_is_open(iop);
2d184: e594000c ldr r0, [r4, #12]
2d188: e3100c01 tst r0, #256 ; 0x100
2d18c: 1a000002 bne 2d19c <fcntl+0x4c>
2d190: ebffc10f bl 1d5d4 <__errno>
2d194: e3a03009 mov r3, #9
2d198: ea000054 b 2d2f0 <fcntl+0x1a0>
/*
* This switch should contain all the cases from POSIX.
*/
switch ( cmd ) {
2d19c: e3560009 cmp r6, #9
2d1a0: 979ff106 ldrls pc, [pc, r6, lsl #2]
2d1a4: ea00004f b 2d2e8 <fcntl+0x198>
2d1a8: 0002d1d0 .word 0x0002d1d0
2d1ac: 0002d274 .word 0x0002d274 <== NOT EXECUTED
2d1b0: 0002d284 .word 0x0002d284 <== NOT EXECUTED
2d1b4: 0002d2a4 .word 0x0002d2a4 <== NOT EXECUTED
2d1b8: 0002d2b0 .word 0x0002d2b0 <== NOT EXECUTED
2d1bc: 0002d2dc .word 0x0002d2dc <== NOT EXECUTED
2d1c0: 0002d2dc .word 0x0002d2dc <== NOT EXECUTED
2d1c4: 0002d2dc .word 0x0002d2dc <== NOT EXECUTED
2d1c8: 0002d2dc .word 0x0002d2dc <== NOT EXECUTED
2d1cc: 0002d2dc .word 0x0002d2dc <== NOT EXECUTED
/*
* FIXME: We ignore the start value fd2 for the file descriptor search. This
* is not POSIX conform.
*/
rtems_libio_t *diop = rtems_libio_allocate();
2d1d0: ebff6672 bl 6ba0 <rtems_libio_allocate>
if (diop != NULL) {
2d1d4: e2505000 subs r5, r0, #0
2d1d8: 0a000051 beq 2d324 <bsp_section_text_size+0x28>
int oflag = rtems_libio_to_fcntl_flags( iop->flags );
2d1dc: e594000c ldr r0, [r4, #12]
2d1e0: ebff665d bl 6b5c <rtems_libio_to_fcntl_flags>
oflag &= ~O_CREAT;
2d1e4: e3c07c02 bic r7, r0, #512 ; 0x200
diop->flags |= rtems_libio_fcntl_flags( oflag );
2d1e8: e1a00007 mov r0, r7
2d1ec: e595800c ldr r8, [r5, #12]
2d1f0: ebff664c bl 6b28 <rtems_libio_fcntl_flags>
2d1f4: e1800008 orr r0, r0, r8
2d1f8: e585000c str r0, [r5, #12]
static inline void rtems_filesystem_instance_lock(
const rtems_filesystem_location_info_t *loc
)
{
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
2d1fc: e5940024 ldr r0, [r4, #36] ; 0x24
(*mt_entry->ops->lock_h)( mt_entry );
2d200: e590300c ldr r3, [r0, #12]
2d204: e1a0e00f mov lr, pc
2d208: e593f000 ldr pc, [r3]
rtems_filesystem_instance_lock( &iop->pathinfo );
rtems_filesystem_location_clone( &diop->pathinfo, &iop->pathinfo );
2d20c: e2841010 add r1, r4, #16
2d210: e2850010 add r0, r5, #16
2d214: ebff9ca3 bl 144a8 <rtems_filesystem_location_clone>
static inline void rtems_filesystem_instance_unlock(
const rtems_filesystem_location_info_t *loc
)
{
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
2d218: e5940024 ldr r0, [r4, #36] ; 0x24
(*mt_entry->ops->unlock_h)( mt_entry );
2d21c: e590300c ldr r3, [r0, #12]
2d220: e1a0e00f mov lr, pc
2d224: e593f004 ldr pc, [r3, #4]
/*
* XXX: We call the open handler here to have a proper open and close pair.
*
* FIXME: What to do with the path?
*/
rv = (*diop->pathinfo.handlers->open_h)( diop, NULL, oflag, 0 );
2d228: e3a01000 mov r1, #0
2d22c: e1a02007 mov r2, r7
2d230: e595c020 ldr ip, [r5, #32]
2d234: e1a00005 mov r0, r5
2d238: e1a03001 mov r3, r1
2d23c: e1a0e00f mov lr, pc
2d240: e59cf000 ldr pc, [ip]
if ( rv == 0 ) {
2d244: e2507000 subs r7, r0, #0
2d248: 1a000006 bne 2d268 <fcntl+0x118>
rv = diop - rtems_libio_iops;
2d24c: e59f30e8 ldr r3, [pc, #232] ; 2d33c <bsp_section_text_size+0x40>
2d250: e5937000 ldr r7, [r3]
2d254: e0675005 rsb r5, r7, r5
2d258: e59f70e0 ldr r7, [pc, #224] ; 2d340 <bsp_section_text_size+0x44>
2d25c: e1a05245 asr r5, r5, #4
2d260: e0070795 mul r7, r5, r7
2d264: ea000023 b 2d2f8 <fcntl+0x1a8>
} else {
rtems_libio_free( diop );
2d268: e1a00005 mov r0, r5 <== NOT EXECUTED
2d26c: ebff6660 bl 6bf4 <rtems_libio_free> <== NOT EXECUTED
2d270: ea000020 b 2d2f8 <fcntl+0x1a8> <== NOT EXECUTED
fd2 = va_arg( ap, int );
ret = duplicate_iop( iop, fd2 );
break;
case F_GETFD: /* get f_flags */
ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0);
2d274: e3100b02 tst r0, #2048 ; 0x800
2d278: 03a07000 moveq r7, #0
2d27c: 13a07001 movne r7, #1
2d280: ea00001e b 2d300 <bsp_section_text_size+0x4>
* 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 ) )
2d284: e5937000 ldr r7, [r3]
2d288: e3570000 cmp r7, #0
iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC;
2d28c: 13800b02 orrne r0, r0, #2048 ; 0x800
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
2d290: 03c00b02 biceq r0, r0, #2048 ; 0x800
* processes, then we can ignore this one except to make
* F_GETFD work.
*/
if ( va_arg( ap, int ) )
iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC;
2d294: 1584000c strne r0, [r4, #12]
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
2d298: 0584000c streq r0, [r4, #12]
* 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 ) )
2d29c: 0a000017 beq 2d300 <bsp_section_text_size+0x4>
2d2a0: ea00000b b 2d2d4 <fcntl+0x184>
else
iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC;
break;
case F_GETFL: /* more flags (cloexec) */
ret = rtems_libio_to_fcntl_flags( iop->flags );
2d2a4: ebff662c bl 6b5c <rtems_libio_to_fcntl_flags>
2d2a8: e1a07000 mov r7, r0
2d2ac: ea000011 b 2d2f8 <fcntl+0x1a8>
break;
case F_SETFL:
flags = rtems_libio_fcntl_flags( va_arg( ap, int ) );
2d2b0: e5930000 ldr r0, [r3]
2d2b4: ebff661b bl 6b28 <rtems_libio_fcntl_flags>
/*
* XXX If we are turning on append, should we seek to the end?
*/
iop->flags = (iop->flags & ~mask) | (flags & mask);
2d2b8: e594200c ldr r2, [r4, #12]
2d2bc: e59f3080 ldr r3, [pc, #128] ; 2d344 <bsp_section_text_size+0x48>
2d2c0: e3c22c02 bic r2, r2, #512 ; 0x200
2d2c4: e0003003 and r3, r0, r3
2d2c8: e3c22001 bic r2, r2, #1
2d2cc: e1833002 orr r3, r3, r2
2d2d0: e584300c str r3, [r4, #12]
{
rtems_libio_t *iop;
int fd2;
int flags;
int mask;
int ret = 0;
2d2d4: e3a07000 mov r7, #0
2d2d8: ea000008 b 2d300 <bsp_section_text_size+0x4>
errno = ENOTSUP;
ret = -1;
break;
case F_GETOWN: /* for sockets. */
errno = ENOTSUP;
2d2dc: ebffc0bc bl 1d5d4 <__errno>
2d2e0: e3a03086 mov r3, #134 ; 0x86
2d2e4: ea000001 b 2d2f0 <fcntl+0x1a0>
ret = -1;
break;
default:
errno = EINVAL;
2d2e8: ebffc0b9 bl 1d5d4 <__errno>
2d2ec: e3a03016 mov r3, #22
2d2f0: e5803000 str r3, [r0]
2d2f4: ea00000a b 2d324 <bsp_section_text_size+0x28>
/*
* If we got this far successfully, then we give the optional
* filesystem specific handler a chance to process this.
*/
if (ret >= 0) {
2d2f8: e3570000 cmp r7, #0
2d2fc: ba000009 blt 2d328 <bsp_section_text_size+0x2c>
int err = (*iop->pathinfo.handlers->fcntl_h)( iop, cmd );
2d300: e5943020 ldr r3, [r4, #32]
2d304: e1a00004 mov r0, r4
2d308: e1a01006 mov r1, r6
2d30c: e1a0e00f mov lr, pc
2d310: e593f028 ldr pc, [r3, #40] ; 0x28
if (err) {
2d314: e2504000 subs r4, r0, #0
2d318: 0a000002 beq 2d328 <bsp_section_text_size+0x2c>
errno = err;
2d31c: ebffc0ac bl 1d5d4 <__errno> <== NOT EXECUTED
2d320: e5804000 str r4, [r0] <== NOT EXECUTED
ret = -1;
2d324: e3e07000 mvn r7, #0
va_list ap;
va_start( ap, cmd );
ret = vfcntl(fd,cmd,ap);
va_end(ap);
return ret;
}
2d328: e1a00007 mov r0, r7
2d32c: e8bd41f8 pop {r3, r4, r5, r6, r7, r8, lr}
2d330: e28dd00c add sp, sp, #12
2d334: e12fff1e bx lr
0000bffc <fifo_open>:
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
bffc: e92d41f7 push {r0, r1, r2, r4, r5, r6, r7, r8, lr}
static int pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
c000: e59f83ac ldr r8, [pc, #940] ; c3b4 <fifo_open+0x3b8>
c004: e5985000 ldr r5, [r8]
c008: e3550000 cmp r5, #0
int fifo_open(
pipe_control_t **pipep,
rtems_libio_t *iop
)
{
c00c: e1a06000 mov r6, r0
c010: e1a07001 mov r7, r1
static int pipe_lock(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (pipe_semaphore == RTEMS_ID_NONE) {
c014: 1a000011 bne c060 <fifo_open+0x64>
*/
#include <rtems/userenv.h>
static inline void rtems_libio_lock( void )
{
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
c018: e59f4398 ldr r4, [pc, #920] ; c3b8 <fifo_open+0x3bc>
c01c: e1a01005 mov r1, r5
c020: e5940000 ldr r0, [r4]
c024: e1a02005 mov r2, r5
c028: ebffeddb bl 779c <rtems_semaphore_obtain>
rtems_libio_lock();
if (pipe_semaphore == RTEMS_ID_NONE) {
c02c: e5983000 ldr r3, [r8]
c030: e3530000 cmp r3, #0
c034: 1a000005 bne c050 <fifo_open+0x54>
sc = rtems_semaphore_create(
c038: e59f037c ldr r0, [pc, #892] ; c3bc <fifo_open+0x3c0>
c03c: e3a01001 mov r1, #1
c040: e3a02054 mov r2, #84 ; 0x54
c044: e58d8000 str r8, [sp]
c048: ebffed44 bl 7560 <rtems_semaphore_create>
c04c: e1a05000 mov r5, r0
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
c050: e5940000 ldr r0, [r4]
c054: ebffee17 bl 78b8 <rtems_semaphore_release>
}
rtems_libio_unlock();
}
if (sc == RTEMS_SUCCESSFUL) {
c058: e3550000 cmp r5, #0
c05c: 1a0000d1 bne c3a8 <fifo_open+0x3ac>
sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
c060: e59f334c ldr r3, [pc, #844] ; c3b4 <fifo_open+0x3b8>
c064: e3a01000 mov r1, #0
c068: e5930000 ldr r0, [r3]
c06c: e1a02001 mov r2, r1
c070: ebffedc9 bl 779c <rtems_semaphore_obtain>
}
if (sc == RTEMS_SUCCESSFUL) {
c074: e2508000 subs r8, r0, #0
c078: 1a0000ca bne c3a8 <fifo_open+0x3ac>
err = pipe_lock();
if (err)
return err;
pipe = *pipep;
c07c: e5964000 ldr r4, [r6]
if (pipe == NULL) {
c080: e3540000 cmp r4, #0
c084: 1a000049 bne c1b0 <fifo_open+0x1b4>
{
static char c = 'a';
pipe_control_t *pipe;
int err = -ENOMEM;
pipe = malloc(sizeof(pipe_control_t));
c088: e3a00034 mov r0, #52 ; 0x34
c08c: ebffde46 bl 39ac <malloc>
if (pipe == NULL)
c090: e2504000 subs r4, r0, #0
c094: 0a000043 beq c1a8 <fifo_open+0x1ac>
return err;
memset(pipe, 0, sizeof(pipe_control_t));
c098: e1a01008 mov r1, r8
c09c: e3a02034 mov r2, #52 ; 0x34
c0a0: eb0011b5 bl 1077c <memset>
pipe->Size = PIPE_BUF;
c0a4: e3a00c02 mov r0, #512 ; 0x200
c0a8: e5840004 str r0, [r4, #4]
pipe->Buffer = malloc(pipe->Size);
c0ac: ebffde3e bl 39ac <malloc>
if (! pipe->Buffer)
c0b0: e3500000 cmp r0, #0
if (pipe == NULL)
return err;
memset(pipe, 0, sizeof(pipe_control_t));
pipe->Size = PIPE_BUF;
pipe->Buffer = malloc(pipe->Size);
c0b4: e5840000 str r0, [r4]
if (! pipe->Buffer)
c0b8: 0a000038 beq c1a0 <fifo_open+0x1a4>
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'r', c),
c0bc: e59f52fc ldr r5, [pc, #764] ; c3c0 <fifo_open+0x3c4>
if (! pipe->Buffer)
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
c0c0: e59f02fc ldr r0, [pc, #764] ; c3c4 <fifo_open+0x3c8>
rtems_build_name ('P', 'I', 'r', c),
c0c4: e5d53000 ldrb r3, [r5]
if (! pipe->Buffer)
goto err_buf;
err = -ENOMEM;
if (rtems_barrier_create(
c0c8: e1a01008 mov r1, r8
c0cc: e1830000 orr r0, r3, r0
c0d0: e1a02008 mov r2, r8
c0d4: e284302c add r3, r4, #44 ; 0x2c
c0d8: eb0005a1 bl d764 <rtems_barrier_create>
c0dc: e2501000 subs r1, r0, #0
c0e0: 1a00002c bne c198 <fifo_open+0x19c>
rtems_build_name ('P', 'I', 'r', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->readBarrier) != RTEMS_SUCCESSFUL)
goto err_rbar;
if (rtems_barrier_create(
rtems_build_name ('P', 'I', 'w', c),
c0e4: e5d53000 ldrb r3, [r5]
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(
c0e8: e59f02d8 ldr r0, [pc, #728] ; c3c8 <fifo_open+0x3cc>
c0ec: e1a02001 mov r2, r1
c0f0: e1830000 orr r0, r3, r0
c0f4: e2843030 add r3, r4, #48 ; 0x30
c0f8: eb000599 bl d764 <rtems_barrier_create>
c0fc: e2503000 subs r3, r0, #0
c100: 1a000022 bne c190 <fifo_open+0x194>
rtems_build_name ('P', 'I', 'w', c),
RTEMS_BARRIER_MANUAL_RELEASE, 0,
&pipe->writeBarrier) != RTEMS_SUCCESSFUL)
goto err_wbar;
if (rtems_semaphore_create(
rtems_build_name ('P', 'I', 's', c), 1,
c104: e5d52000 ldrb r2, [r5]
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(
c108: e59f02bc ldr r0, [pc, #700] ; c3cc <fifo_open+0x3d0>
c10c: e2841028 add r1, r4, #40 ; 0x28
c110: e58d1000 str r1, [sp]
c114: e1820000 orr r0, r2, r0
c118: e3a01001 mov r1, #1
c11c: e3a02010 mov r2, #16
c120: ebffed0e bl 7560 <rtems_semaphore_create>
c124: e3500000 cmp r0, #0
c128: 1a000016 bne c188 <fifo_open+0x18c>
RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Get (
Objects_Id id,
Objects_Locations *location
)
{
return (Barrier_Control *)
c12c: e594102c ldr r1, [r4, #44] ; 0x2c
c130: e28d2008 add r2, sp, #8
c134: e59f0294 ldr r0, [pc, #660] ; c3d0 <fifo_open+0x3d4>
c138: ebfff3cf bl 907c <_Objects_Get>
static void pipe_interruptible(pipe_control_t *pipe)
{
Objects_Locations location;
_Barrier_Get(pipe->readBarrier, &location)->Barrier.Wait_queue.state
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
c13c: e590304c ldr r3, [r0, #76] ; 0x4c
c140: e3833201 orr r3, r3, #268435456 ; 0x10000000
c144: e580304c str r3, [r0, #76] ; 0x4c
_Thread_Enable_dispatch();
c148: ebfff736 bl 9e28 <_Thread_Enable_dispatch>
c14c: e28d2008 add r2, sp, #8
c150: e5941030 ldr r1, [r4, #48] ; 0x30
c154: e59f0274 ldr r0, [pc, #628] ; c3d0 <fifo_open+0x3d4>
c158: ebfff3c7 bl 907c <_Objects_Get>
_Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state
|= STATES_INTERRUPTIBLE_BY_SIGNAL;
c15c: e590304c ldr r3, [r0, #76] ; 0x4c
c160: e3833201 orr r3, r3, #268435456 ; 0x10000000
c164: e580304c str r3, [r0, #76] ; 0x4c
_Thread_Enable_dispatch();
c168: ebfff72e bl 9e28 <_Thread_Enable_dispatch>
#ifdef RTEMS_POSIX_API
pipe_interruptible(pipe);
#endif
*pipep = pipe;
if (c ++ == 'z')
c16c: e5d53000 ldrb r3, [r5]
c170: e353007a cmp r3, #122 ; 0x7a
c174: e2832001 add r2, r3, #1
c = 'a';
c178: 03a03061 moveq r3, #97 ; 0x61
#ifdef RTEMS_POSIX_API
pipe_interruptible(pipe);
#endif
*pipep = pipe;
if (c ++ == 'z')
c17c: e5c52000 strb r2, [r5]
c = 'a';
c180: 05c53000 strbeq r3, [r5]
c184: ea000009 b c1b0 <fifo_open+0x1b4>
return 0;
err_sem:
rtems_barrier_delete(pipe->writeBarrier);
c188: e5940030 ldr r0, [r4, #48] ; 0x30
c18c: eb0005a2 bl d81c <rtems_barrier_delete>
err_wbar:
rtems_barrier_delete(pipe->readBarrier);
c190: e594002c ldr r0, [r4, #44] ; 0x2c
c194: eb0005a0 bl d81c <rtems_barrier_delete>
err_rbar:
free(pipe->Buffer);
c198: e5940000 ldr r0, [r4]
c19c: ebffdcf7 bl 3580 <free>
err_buf:
free(pipe);
c1a0: e1a00004 mov r0, r4
c1a4: ebffdcf5 bl 3580 <free>
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
err = -EINTR;
c1a8: e3e0500b mvn r5, #11
c1ac: ea00000d b c1e8 <fifo_open+0x1ec>
err = pipe_alloc(&pipe);
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
c1b0: e3a01000 mov r1, #0
c1b4: e5940028 ldr r0, [r4, #40] ; 0x28
c1b8: e1a02001 mov r2, r1
c1bc: ebffed76 bl 779c <rtems_semaphore_obtain>
err = -EINTR;
if (*pipep == NULL) {
c1c0: e5963000 ldr r3, [r6]
err = pipe_alloc(&pipe);
if (err)
goto out;
}
if (! PIPE_LOCK(pipe))
c1c4: e3500000 cmp r0, #0
c1c8: 01a05000 moveq r5, r0
c1cc: 13e05003 mvnne r5, #3
err = -EINTR;
if (*pipep == NULL) {
c1d0: e3530000 cmp r3, #0
c1d4: 1a000003 bne c1e8 <fifo_open+0x1ec>
if (err)
c1d8: e3550000 cmp r5, #0
pipe_free(pipe);
else
*pipep = pipe;
c1dc: 05864000 streq r4, [r6]
if (! PIPE_LOCK(pipe))
err = -EINTR;
if (*pipep == NULL) {
if (err)
pipe_free(pipe);
c1e0: 11a00004 movne r0, r4
c1e4: 1bffff48 blne bf0c <pipe_free>
#ifdef RTEMS_DEBUG
rtems_status_code sc = RTEMS_SUCCESSFUL;
sc =
#endif
rtems_semaphore_release(pipe_semaphore);
c1e8: e59f31c4 ldr r3, [pc, #452] ; c3b4 <fifo_open+0x3b8>
c1ec: e5930000 ldr r0, [r3]
c1f0: ebffedb0 bl 78b8 <rtems_semaphore_release>
pipe_control_t *pipe;
unsigned int prevCounter;
int err;
err = pipe_new(pipep);
if (err)
c1f4: e3550000 cmp r5, #0
c1f8: 1a00006b bne c3ac <fifo_open+0x3b0>
return err;
pipe = *pipep;
switch (LIBIO_ACCMODE(iop)) {
c1fc: e597300c ldr r3, [r7, #12]
c200: e2033006 and r3, r3, #6
c204: e3530004 cmp r3, #4
int err;
err = pipe_new(pipep);
if (err)
return err;
pipe = *pipep;
c208: e5964000 ldr r4, [r6]
switch (LIBIO_ACCMODE(iop)) {
c20c: 0a000024 beq c2a4 <fifo_open+0x2a8>
c210: e3530006 cmp r3, #6
c214: 0a000047 beq c338 <fifo_open+0x33c>
c218: e3530002 cmp r3, #2
c21c: 1a000059 bne c388 <fifo_open+0x38c>
case LIBIO_FLAGS_READ:
pipe->readerCounter ++;
c220: e5943020 ldr r3, [r4, #32]
c224: e2833001 add r3, r3, #1
c228: e5843020 str r3, [r4, #32]
if (pipe->Readers ++ == 0)
c22c: e5943010 ldr r3, [r4, #16]
c230: e2832001 add r2, r3, #1
c234: e3530000 cmp r3, #0
c238: e5842010 str r2, [r4, #16]
PIPE_WAKEUPWRITERS(pipe);
c23c: 05940030 ldreq r0, [r4, #48] ; 0x30
c240: 028d1004 addeq r1, sp, #4
c244: 0b00059a bleq d8b4 <rtems_barrier_release>
if (pipe->Writers == 0) {
c248: e5943014 ldr r3, [r4, #20]
c24c: e3530000 cmp r3, #0
c250: 1a00004c bne c388 <fifo_open+0x38c>
/* Not an error */
if (LIBIO_NODELAY(iop))
c254: e597300c ldr r3, [r7, #12]
c258: e3130001 tst r3, #1
c25c: 1a000049 bne c388 <fifo_open+0x38c>
break;
prevCounter = pipe->writerCounter;
c260: e5948024 ldr r8, [r4, #36] ; 0x24
err = -EINTR;
/* Wait until a writer opens the pipe */
do {
PIPE_UNLOCK(pipe);
c264: e5940028 ldr r0, [r4, #40] ; 0x28
c268: ebffed92 bl 78b8 <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
c26c: e3a01000 mov r1, #0
c270: e594002c ldr r0, [r4, #44] ; 0x2c
c274: eb0005a4 bl d90c <rtems_barrier_wait>
c278: e2501000 subs r1, r0, #0
c27c: 1a000044 bne c394 <fifo_open+0x398>
goto out_error;
if (! PIPE_LOCK(pipe))
c280: e5940028 ldr r0, [r4, #40] ; 0x28
c284: e1a02001 mov r2, r1
c288: ebffed43 bl 779c <rtems_semaphore_obtain>
c28c: e3500000 cmp r0, #0
c290: 1a00003f bne c394 <fifo_open+0x398>
goto out_error;
} while (prevCounter == pipe->writerCounter);
c294: e5943024 ldr r3, [r4, #36] ; 0x24
c298: e1580003 cmp r8, r3
c29c: 0afffff0 beq c264 <fifo_open+0x268>
c2a0: ea000038 b c388 <fifo_open+0x38c>
}
break;
case LIBIO_FLAGS_WRITE:
pipe->writerCounter ++;
c2a4: e5943024 ldr r3, [r4, #36] ; 0x24
c2a8: e2833001 add r3, r3, #1
c2ac: e5843024 str r3, [r4, #36] ; 0x24
if (pipe->Writers ++ == 0)
c2b0: e5943014 ldr r3, [r4, #20]
c2b4: e2832001 add r2, r3, #1
c2b8: e3530000 cmp r3, #0
c2bc: e5842014 str r2, [r4, #20]
PIPE_WAKEUPREADERS(pipe);
c2c0: 0594002c ldreq r0, [r4, #44] ; 0x2c
c2c4: 028d1004 addeq r1, sp, #4
c2c8: 0b000579 bleq d8b4 <rtems_barrier_release>
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
c2cc: e5943010 ldr r3, [r4, #16]
c2d0: e3530000 cmp r3, #0
c2d4: 1a00002b bne c388 <fifo_open+0x38c>
c2d8: e597300c ldr r3, [r7, #12]
c2dc: e3130001 tst r3, #1
err = -ENXIO;
goto out_error;
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
c2e0: 05948020 ldreq r8, [r4, #32]
pipe->writerCounter ++;
if (pipe->Writers ++ == 0)
PIPE_WAKEUPREADERS(pipe);
if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) {
c2e4: 0a000003 beq c2f8 <fifo_open+0x2fc>
PIPE_UNLOCK(pipe);
c2e8: e5940028 ldr r0, [r4, #40] ; 0x28
c2ec: ebffed71 bl 78b8 <rtems_semaphore_release>
err = -ENXIO;
c2f0: e3e05005 mvn r5, #5
goto out_error;
c2f4: ea000027 b c398 <fifo_open+0x39c>
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
do {
PIPE_UNLOCK(pipe);
c2f8: e5940028 ldr r0, [r4, #40] ; 0x28
c2fc: ebffed6d bl 78b8 <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
c300: e3a01000 mov r1, #0
c304: e5940030 ldr r0, [r4, #48] ; 0x30
c308: eb00057f bl d90c <rtems_barrier_wait>
c30c: e2501000 subs r1, r0, #0
c310: 1a00001f bne c394 <fifo_open+0x398>
goto out_error;
if (! PIPE_LOCK(pipe))
c314: e5940028 ldr r0, [r4, #40] ; 0x28
c318: e1a02001 mov r2, r1
c31c: ebffed1e bl 779c <rtems_semaphore_obtain>
c320: e3500000 cmp r0, #0
c324: 1a00001a bne c394 <fifo_open+0x398>
goto out_error;
} while (prevCounter == pipe->readerCounter);
c328: e5943020 ldr r3, [r4, #32]
c32c: e1580003 cmp r8, r3
c330: 0afffff0 beq c2f8 <fifo_open+0x2fc>
c334: ea000013 b c388 <fifo_open+0x38c>
}
break;
case LIBIO_FLAGS_READ_WRITE:
pipe->readerCounter ++;
c338: e5943020 ldr r3, [r4, #32]
c33c: e2833001 add r3, r3, #1
c340: e5843020 str r3, [r4, #32]
if (pipe->Readers ++ == 0)
c344: e5943010 ldr r3, [r4, #16]
c348: e2832001 add r2, r3, #1
c34c: e3530000 cmp r3, #0
c350: e5842010 str r2, [r4, #16]
PIPE_WAKEUPWRITERS(pipe);
c354: 05940030 ldreq r0, [r4, #48] ; 0x30
c358: 028d1004 addeq r1, sp, #4
c35c: 0b000554 bleq d8b4 <rtems_barrier_release>
pipe->writerCounter ++;
c360: e5943024 ldr r3, [r4, #36] ; 0x24
c364: e2833001 add r3, r3, #1
c368: e5843024 str r3, [r4, #36] ; 0x24
if (pipe->Writers ++ == 0)
c36c: e5943014 ldr r3, [r4, #20]
c370: e2832001 add r2, r3, #1
c374: e3530000 cmp r3, #0
c378: e5842014 str r2, [r4, #20]
PIPE_WAKEUPREADERS(pipe);
c37c: 0594002c ldreq r0, [r4, #44] ; 0x2c
c380: 028d1004 addeq r1, sp, #4
c384: 0b00054a bleq d8b4 <rtems_barrier_release>
break;
}
PIPE_UNLOCK(pipe);
c388: e5940028 ldr r0, [r4, #40] ; 0x28
c38c: ebffed49 bl 78b8 <rtems_semaphore_release>
return 0;
c390: ea000005 b c3ac <fifo_open+0x3b0>
goto out_error;
}
if (pipe->Readers == 0) {
prevCounter = pipe->readerCounter;
err = -EINTR;
c394: e3e05003 mvn r5, #3 <== NOT EXECUTED
PIPE_UNLOCK(pipe);
return 0;
out_error:
pipe_release(pipep, iop);
c398: e1a00006 mov r0, r6
c39c: e1a01007 mov r1, r7
c3a0: ebfffee6 bl bf40 <pipe_release>
return err;
c3a4: ea000000 b c3ac <fifo_open+0x3b0>
if (sc == RTEMS_SUCCESSFUL) {
sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
}
if (sc == RTEMS_SUCCESSFUL) {
c3a8: e3e0500b mvn r5, #11
return 0;
out_error:
pipe_release(pipep, iop);
return err;
}
c3ac: e1a00005 mov r0, r5
c3b0: e8bd81fe pop {r1, r2, r3, r4, r5, r6, r7, r8, pc}
0000809c <fpathconf>:
{
long return_value;
rtems_libio_t *iop;
const rtems_filesystem_limits_and_options_t *the_limits;
rtems_libio_check_fd(fd);
809c: e59f30f4 ldr r3, [pc, #244] ; 8198 <fpathconf+0xfc>
80a0: e5933000 ldr r3, [r3]
80a4: e1500003 cmp r0, r3
*/
long fpathconf(
int fd,
int name
)
{
80a8: e52de004 push {lr} ; (str lr, [sp, #-4]!)
long return_value;
rtems_libio_t *iop;
const rtems_filesystem_limits_and_options_t *the_limits;
rtems_libio_check_fd(fd);
80ac: 2a000006 bcs 80cc <fpathconf+0x30>
iop = rtems_libio_iop(fd);
80b0: e59f30e4 ldr r3, [pc, #228] ; 819c <fpathconf+0x100>
80b4: e5933000 ldr r3, [r3]
80b8: e3a02030 mov r2, #48 ; 0x30
80bc: e0203092 mla r0, r2, r0, r3
rtems_libio_check_is_open(iop);
80c0: e590300c ldr r3, [r0, #12]
80c4: e3130c01 tst r3, #256 ; 0x100
80c8: 1a000004 bne 80e0 <fpathconf+0x44>
80cc: eb0008b8 bl a3b4 <__errno>
80d0: e3a03009 mov r3, #9
80d4: e5803000 str r3, [r0]
80d8: e3e00000 mvn r0, #0
80dc: e49df004 pop {pc} ; (ldr pc, [sp], #4)
/*
* Now process the information request.
*/
the_limits = iop->pathinfo.mt_entry->pathconf_limits_and_options;
80e0: e5903024 ldr r3, [r0, #36] ; 0x24
80e4: e593302c ldr r3, [r3, #44] ; 0x2c
switch ( name ) {
80e8: e351000b cmp r1, #11
80ec: 979ff101 ldrls pc, [pc, r1, lsl #2]
80f0: ea000023 b 8184 <fpathconf+0xe8>
80f4: 00008124 .word 0x00008124
80f8: 0000812c .word 0x0000812c <== NOT EXECUTED
80fc: 00008134 .word 0x00008134 <== NOT EXECUTED
8100: 0000813c .word 0x0000813c <== NOT EXECUTED
8104: 00008144 .word 0x00008144 <== NOT EXECUTED
8108: 0000814c .word 0x0000814c <== NOT EXECUTED
810c: 00008154 .word 0x00008154 <== NOT EXECUTED
8110: 0000815c .word 0x0000815c <== NOT EXECUTED
8114: 00008164 .word 0x00008164 <== NOT EXECUTED
8118: 0000816c .word 0x0000816c <== NOT EXECUTED
811c: 00008174 .word 0x00008174 <== NOT EXECUTED
8120: 0000817c .word 0x0000817c <== NOT EXECUTED
case _PC_LINK_MAX:
return_value = the_limits->link_max;
8124: e5930000 ldr r0, [r3]
break;
8128: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_MAX_CANON:
return_value = the_limits->max_canon;
812c: e5930004 ldr r0, [r3, #4]
break;
8130: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_MAX_INPUT:
return_value = the_limits->max_input;
8134: e5930008 ldr r0, [r3, #8]
break;
8138: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_NAME_MAX:
return_value = the_limits->name_max;
813c: e593000c ldr r0, [r3, #12]
break;
8140: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_PATH_MAX:
return_value = the_limits->path_max;
8144: e5930010 ldr r0, [r3, #16]
break;
8148: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_PIPE_BUF:
return_value = the_limits->pipe_buf;
814c: e5930014 ldr r0, [r3, #20]
break;
8150: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_CHOWN_RESTRICTED:
return_value = the_limits->posix_chown_restrictions;
8154: e593001c ldr r0, [r3, #28]
break;
8158: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_NO_TRUNC:
return_value = the_limits->posix_no_trunc;
815c: e5930020 ldr r0, [r3, #32]
break;
8160: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_VDISABLE:
return_value = the_limits->posix_vdisable;
8164: e593002c ldr r0, [r3, #44] ; 0x2c
break;
8168: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_ASYNC_IO:
return_value = the_limits->posix_async_io;
816c: e5930018 ldr r0, [r3, #24]
break;
8170: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_PRIO_IO:
return_value = the_limits->posix_prio_io;
8174: e5930024 ldr r0, [r3, #36] ; 0x24
break;
8178: e49df004 pop {pc} ; (ldr pc, [sp], #4)
case _PC_SYNC_IO:
return_value = the_limits->posix_sync_io;
817c: e5930028 ldr r0, [r3, #40] ; 0x28
break;
8180: e49df004 pop {pc} ; (ldr pc, [sp], #4)
default:
rtems_set_errno_and_return_minus_one( EINVAL );
8184: eb00088a bl a3b4 <__errno>
8188: e3a03016 mov r3, #22
818c: e5803000 str r3, [r0]
8190: e3e00000 mvn r0, #0
break;
}
return return_value;
}
8194: e49df004 pop {pc} ; (ldr pc, [sp], #4)
000188ec <fstat>:
int fstat(
int fd,
struct stat *sbuf
)
{
188ec: e92d4030 push {r4, r5, lr}
rtems_libio_t *iop;
/*
* Check to see if we were passed a valid pointer.
*/
if ( !sbuf )
188f0: e2515000 subs r5, r1, #0
188f4: 1a000002 bne 18904 <fstat+0x18>
rtems_set_errno_and_return_minus_one( EFAULT );
188f8: ebffd38d bl d734 <__errno> <== NOT EXECUTED
188fc: e3a0300e mov r3, #14 <== NOT EXECUTED
18900: ea00000c b 18938 <fstat+0x4c> <== NOT EXECUTED
/*
* Now process the stat() request.
*/
iop = rtems_libio_iop( fd );
18904: e59f3060 ldr r3, [pc, #96] ; 1896c <fstat+0x80>
18908: e5933000 ldr r3, [r3]
1890c: e1500003 cmp r0, r3
18910: 2a000006 bcs 18930 <fstat+0x44>
18914: e59f3054 ldr r3, [pc, #84] ; 18970 <fstat+0x84>
18918: e5933000 ldr r3, [r3]
1891c: e3a04030 mov r4, #48 ; 0x30
18920: e0243490 mla r4, r0, r4, r3
rtems_libio_check_fd( fd );
rtems_libio_check_is_open(iop);
18924: e594300c ldr r3, [r4, #12]
18928: e3130c01 tst r3, #256 ; 0x100
1892c: 1a000004 bne 18944 <fstat+0x58>
18930: ebffd37f bl d734 <__errno>
18934: e3a03009 mov r3, #9
18938: e5803000 str r3, [r0]
1893c: e3e00000 mvn r0, #0
18940: e8bd8030 pop {r4, r5, pc}
/*
* Zero out the stat structure so the various support
* versions of stat don't have to.
*/
memset( sbuf, 0, sizeof(struct stat) );
18944: e1a00005 mov r0, r5
18948: e3a01000 mov r1, #0
1894c: e3a02048 mov r2, #72 ; 0x48
18950: ebffd5e7 bl e0f4 <memset>
return (*iop->pathinfo.handlers->fstat_h)( &iop->pathinfo, sbuf );
18954: e5943020 ldr r3, [r4, #32]
18958: e2840010 add r0, r4, #16
1895c: e1a01005 mov r1, r5
18960: e1a0e00f mov lr, pc
18964: e593f018 ldr pc, [r3, #24]
}
18968: e8bd8030 pop {r4, r5, pc}
00002268 <get_disk_entry>:
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
rtems_filesystem_split_dev_t(dev, major, minor);
if (major < disktab_size && disktab != NULL) {
2268: e59f3074 ldr r3, [pc, #116] ; 22e4 <get_disk_entry+0x7c>
226c: e593c000 ldr ip, [r3]
2270: e150000c cmp r0, ip
2274: 2a000016 bcs 22d4 <get_disk_entry+0x6c>
2278: e5933004 ldr r3, [r3, #4]
227c: e3530000 cmp r3, #0
return dd;
}
}
return NULL;
2280: 01a00003 moveq r0, r3
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
rtems_filesystem_split_dev_t(dev, major, minor);
if (major < disktab_size && disktab != NULL) {
2284: 012fff1e bxeq lr
rtems_disk_device_table *dtab = disktab + major;
2288: e083c180 add ip, r3, r0, lsl #3
if (minor < dtab->size && dtab->minor != NULL) {
228c: e59cc004 ldr ip, [ip, #4]
2290: e151000c cmp r1, ip
2294: 2a00000e bcs 22d4 <get_disk_entry+0x6c>
2298: e7930180 ldr r0, [r3, r0, lsl #3]
229c: e3500000 cmp r0, #0
22a0: 012fff1e bxeq lr
rtems_disk_device *dd = dtab->minor [minor];
22a4: e7900101 ldr r0, [r0, r1, lsl #2]
if (dd != NULL && !lookup_only) {
22a8: e3500000 cmp r0, #0
22ac: 012fff1e bxeq lr
22b0: e3520000 cmp r2, #0
22b4: 112fff1e bxne lr
if (!dd->deleted) {
22b8: e5d03040 ldrb r3, [r0, #64] ; 0x40
22bc: e3530000 cmp r3, #0
++dd->uses;
22c0: 05903014 ldreq r3, [r0, #20]
22c4: 02833001 addeq r3, r3, #1
22c8: 05803014 streq r3, [r0, #20]
if (minor < dtab->size && dtab->minor != NULL) {
rtems_disk_device *dd = dtab->minor [minor];
if (dd != NULL && !lookup_only) {
if (!dd->deleted) {
22cc: 012fff1e bxeq lr
22d0: ea000001 b 22dc <get_disk_entry+0x74>
return dd;
}
}
return NULL;
22d4: e3a00000 mov r0, #0 <== NOT EXECUTED
22d8: e12fff1e bx lr <== NOT EXECUTED
if (dd != NULL && !lookup_only) {
if (!dd->deleted) {
++dd->uses;
} else {
dd = NULL;
22dc: e1a00002 mov r0, r2
return dd;
}
}
return NULL;
}
22e0: e12fff1e bx lr
0000357c <get_sector>:
*/
static rtems_status_code
get_sector(int fd,
uint32_t sector_num,
rtems_sector_data_t **sector)
{
357c: e92d41f0 push {r4, r5, r6, r7, r8, lr}
rtems_sector_data_t *s;
ssize_t n;
off_t off;
off_t new_off;
if (sector == NULL)
3580: e2528000 subs r8, r2, #0
*/
static rtems_status_code
get_sector(int fd,
uint32_t sector_num,
rtems_sector_data_t **sector)
{
3584: e1a05000 mov r5, r0
3588: e1a04001 mov r4, r1
off_t off;
off_t new_off;
if (sector == NULL)
{
return RTEMS_INTERNAL_ERROR;
358c: 03a00019 moveq r0, #25
rtems_sector_data_t *s;
ssize_t n;
off_t off;
off_t new_off;
if (sector == NULL)
3590: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc}
{
return RTEMS_INTERNAL_ERROR;
}
off = sector_num * RTEMS_IDE_SECTOR_SIZE;
3594: e1a03481 lsl r3, r1, #9
3598: e3a07000 mov r7, #0
359c: e1a06003 mov r6, r3
new_off = lseek(fd, off, SEEK_SET);
35a0: e1a01003 mov r1, r3
35a4: e1a02007 mov r2, r7
35a8: e1a03007 mov r3, r7
35ac: eb0004ab bl 4860 <lseek>
if (new_off != off) {
35b0: e1510007 cmp r1, r7
35b4: 01500006 cmpeq r0, r6
35b8: 1a000011 bne 3604 <get_sector+0x88>
return RTEMS_IO_ERROR;
}
s = (rtems_sector_data_t *) malloc(sizeof(rtems_sector_data_t) + RTEMS_IDE_SECTOR_SIZE);
35bc: e3a00f81 mov r0, #516 ; 0x204
35c0: eb00050b bl 49f4 <malloc>
if (s == NULL)
35c4: e2506000 subs r6, r0, #0
{
return RTEMS_NO_MEMORY;
35c8: 03a0001a moveq r0, #26
if (new_off != off) {
return RTEMS_IO_ERROR;
}
s = (rtems_sector_data_t *) malloc(sizeof(rtems_sector_data_t) + RTEMS_IDE_SECTOR_SIZE);
if (s == NULL)
35cc: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc}
{
return RTEMS_NO_MEMORY;
}
n = read(fd, s->data, RTEMS_IDE_SECTOR_SIZE);
35d0: e1a00005 mov r0, r5
35d4: e2861004 add r1, r6, #4
35d8: e3a02c02 mov r2, #512 ; 0x200
35dc: eb00079c bl 5454 <read>
if (n != RTEMS_IDE_SECTOR_SIZE)
35e0: e3500c02 cmp r0, #512 ; 0x200
{
free(s);
return RTEMS_IO_ERROR;
}
s->sector_num = sector_num;
35e4: 05864000 streq r4, [r6]
*sector = s;
return RTEMS_SUCCESSFUL;
35e8: 03a00000 moveq r0, #0
return RTEMS_IO_ERROR;
}
s->sector_num = sector_num;
*sector = s;
35ec: 05886000 streq r6, [r8]
{
return RTEMS_NO_MEMORY;
}
n = read(fd, s->data, RTEMS_IDE_SECTOR_SIZE);
if (n != RTEMS_IDE_SECTOR_SIZE)
35f0: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc}
{
free(s);
35f4: e1a00006 mov r0, r6 <== NOT EXECUTED
35f8: eb00038d bl 4434 <free> <== NOT EXECUTED
return RTEMS_IO_ERROR;
35fc: e3a0001b mov r0, #27 <== NOT EXECUTED
3600: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
}
off = sector_num * RTEMS_IDE_SECTOR_SIZE;
new_off = lseek(fd, off, SEEK_SET);
if (new_off != off) {
return RTEMS_IO_ERROR;
3604: e3a0001b mov r0, #27 <== NOT EXECUTED
s->sector_num = sector_num;
*sector = s;
return RTEMS_SUCCESSFUL;
}
3608: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
00004cb4 <iproc>:
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
if (tty->termios.c_iflag & ISTRIP)
4cb4: e5913030 ldr r3, [r1, #48] ; 0x30
4cb8: e3130020 tst r3, #32
/*
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
4cbc: e92d4030 push {r4, r5, lr}
4cc0: e20050ff and r5, r0, #255 ; 0xff
if (tty->termios.c_iflag & ISTRIP)
c &= 0x7f;
4cc4: 1200507f andne r5, r0, #127 ; 0x7f
if (tty->termios.c_iflag & IUCLC)
4cc8: e3130c02 tst r3, #512 ; 0x200
/*
* Process a single input character
*/
static int
iproc (unsigned char c, struct rtems_termios_tty *tty)
{
4ccc: e1a04001 mov r4, r1
if (tty->termios.c_iflag & ISTRIP)
c &= 0x7f;
if (tty->termios.c_iflag & IUCLC)
4cd0: 0a000007 beq 4cf4 <iproc+0x40>
c = tolower (c);
4cd4: e59f2164 ldr r2, [pc, #356] ; 4e40 <iproc+0x18c>
4cd8: e5922000 ldr r2, [r2]
4cdc: e0822005 add r2, r2, r5
4ce0: e5d22001 ldrb r2, [r2, #1]
4ce4: e2022003 and r2, r2, #3
4ce8: e3520001 cmp r2, #1
4cec: 02855020 addeq r5, r5, #32
4cf0: e20550ff and r5, r5, #255 ; 0xff
if (c == '\r') {
4cf4: e355000d cmp r5, #13
4cf8: 1a000005 bne 4d14 <iproc+0x60>
if (tty->termios.c_iflag & IGNCR)
4cfc: e3130080 tst r3, #128 ; 0x80
4d00: 1a000048 bne 4e28 <iproc+0x174>
return 0;
if (tty->termios.c_iflag & ICRNL)
c = '\n';
4d04: e3130c01 tst r3, #256 ; 0x100
4d08: 03a0500d moveq r5, #13
4d0c: 13a0500a movne r5, #10
4d10: ea000007 b 4d34 <iproc+0x80>
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
4d14: e355000a cmp r5, #10
4d18: 1a000003 bne 4d2c <iproc+0x78>
c = '\r';
4d1c: e3130040 tst r3, #64 ; 0x40
4d20: 03a0500a moveq r5, #10
4d24: 13a0500d movne r5, #13
4d28: ea000001 b 4d34 <iproc+0x80>
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
4d2c: e3550000 cmp r5, #0
4d30: 0a00002c beq 4de8 <iproc+0x134>
4d34: e594303c ldr r3, [r4, #60] ; 0x3c
4d38: e3130002 tst r3, #2
4d3c: 0a000029 beq 4de8 <iproc+0x134>
if (c == tty->termios.c_cc[VERASE]) {
4d40: e5d42043 ldrb r2, [r4, #67] ; 0x43
4d44: e1520005 cmp r2, r5
erase (tty, 0);
4d48: 01a00004 moveq r0, r4
4d4c: 03a01000 moveq r1, #0
} else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) {
c = '\r';
}
if ((c != '\0') && (tty->termios.c_lflag & ICANON)) {
if (c == tty->termios.c_cc[VERASE]) {
4d50: 0a000004 beq 4d68 <iproc+0xb4>
erase (tty, 0);
return 0;
}
else if (c == tty->termios.c_cc[VKILL]) {
4d54: e5d42044 ldrb r2, [r4, #68] ; 0x44
4d58: e1520005 cmp r2, r5
4d5c: 1a000003 bne 4d70 <iproc+0xbc>
erase (tty, 1);
4d60: e1a00004 mov r0, r4
4d64: e3a01001 mov r1, #1
4d68: ebffff60 bl 4af0 <erase>
4d6c: ea00002d b 4e28 <iproc+0x174>
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
4d70: e5d42045 ldrb r2, [r4, #69] ; 0x45
4d74: e1520005 cmp r2, r5
4d78: 0a00002c beq 4e30 <iproc+0x17c>
return 1;
} else if (c == '\n') {
4d7c: e355000a cmp r5, #10
4d80: 1a000008 bne 4da8 <iproc+0xf4>
if (tty->termios.c_lflag & (ECHO | ECHONL))
4d84: e3130048 tst r3, #72 ; 0x48
echo (c, tty);
4d88: 11a00005 movne r0, r5
4d8c: 11a01004 movne r1, r4
4d90: 1bffff33 blne 4a64 <echo>
tty->cbuf[tty->ccount++] = c;
4d94: e284201c add r2, r4, #28
4d98: e892000c ldm r2, {r2, r3}
4d9c: e3a0100a mov r1, #10
4da0: e7c21003 strb r1, [r2, r3]
4da4: ea00000c b 4ddc <iproc+0x128>
return 1;
} else if ((c == tty->termios.c_cc[VEOL]) ||
4da8: e5d4204c ldrb r2, [r4, #76] ; 0x4c
4dac: e1520005 cmp r2, r5
4db0: 0a000002 beq 4dc0 <iproc+0x10c>
4db4: e5d42051 ldrb r2, [r4, #81] ; 0x51
4db8: e1520005 cmp r2, r5
4dbc: 1a000009 bne 4de8 <iproc+0x134>
(c == tty->termios.c_cc[VEOL2])) {
if (tty->termios.c_lflag & ECHO)
4dc0: e3130008 tst r3, #8 <== NOT EXECUTED
echo (c, tty);
4dc4: 11a00005 movne r0, r5 <== NOT EXECUTED
4dc8: 11a01004 movne r1, r4 <== NOT EXECUTED
4dcc: 1bffff24 blne 4a64 <echo> <== NOT EXECUTED
tty->cbuf[tty->ccount++] = c;
4dd0: e284201c add r2, r4, #28 <== NOT EXECUTED
4dd4: e892000c ldm r2, {r2, r3} <== NOT EXECUTED
4dd8: e7c25003 strb r5, [r2, r3] <== NOT EXECUTED
4ddc: e2833001 add r3, r3, #1
4de0: e5843020 str r3, [r4, #32]
4de4: ea000011 b 4e30 <iproc+0x17c>
}
/*
* FIXME: Should do IMAXBEL handling somehow
*/
if (tty->ccount < (CBUFSIZE-1)) {
4de8: e59f3054 ldr r3, [pc, #84] ; 4e44 <iproc+0x190>
4dec: e5933008 ldr r3, [r3, #8]
4df0: e5942020 ldr r2, [r4, #32]
4df4: e2433001 sub r3, r3, #1
4df8: e1520003 cmp r2, r3
4dfc: 2a00000d bcs 4e38 <iproc+0x184>
if (tty->termios.c_lflag & ECHO)
4e00: e594303c ldr r3, [r4, #60] ; 0x3c
4e04: e3130008 tst r3, #8
echo (c, tty);
4e08: 11a00005 movne r0, r5
4e0c: 11a01004 movne r1, r4
4e10: 1bffff13 blne 4a64 <echo>
tty->cbuf[tty->ccount++] = c;
4e14: e284201c add r2, r4, #28
4e18: e892000c ldm r2, {r2, r3}
4e1c: e7c25003 strb r5, [r2, r3]
4e20: e2833001 add r3, r3, #1
4e24: e5843020 str r3, [r4, #32]
if (tty->termios.c_iflag & IUCLC)
c = tolower (c);
if (c == '\r') {
if (tty->termios.c_iflag & IGNCR)
return 0;
4e28: e3a00000 mov r0, #0
4e2c: e8bd8030 pop {r4, r5, pc}
else if (c == tty->termios.c_cc[VKILL]) {
erase (tty, 1);
return 0;
}
else if (c == tty->termios.c_cc[VEOF]) {
return 1;
4e30: e3a00001 mov r0, #1
4e34: e8bd8030 pop {r4, r5, pc}
if (tty->ccount < (CBUFSIZE-1)) {
if (tty->termios.c_lflag & ECHO)
echo (c, tty);
tty->cbuf[tty->ccount++] = c;
}
return 0;
4e38: e3a00000 mov r0, #0 <== NOT EXECUTED
}
4e3c: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
0000c9a0 <memfile_open>:
rtems_libio_t *iop,
const char *pathname,
int oflag,
mode_t mode
)
{
c9a0: e92d4011 push {r0, r4, lr}
IMFS_jnode_t *the_jnode;
the_jnode = iop->pathinfo.node_access;
c9a4: e590c018 ldr ip, [r0, #24]
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & LIBIO_FLAGS_WRITE)
c9a8: e590000c ldr r0, [r0, #12]
c9ac: e2100004 ands r0, r0, #4
c9b0: 0a000017 beq ca14 <memfile_open+0x74>
c9b4: e59c304c ldr r3, [ip, #76] ; 0x4c
&& (IMFS_type( the_jnode ) == IMFS_LINEAR_FILE)) {
c9b8: e5933000 ldr r3, [r3]
c9bc: e3530005 cmp r3, #5
if ((count != 0)
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
return -1;
}
return 0;
c9c0: 13a00000 movne r0, #0
/*
* Perform 'copy on write' for linear files
*/
if ((iop->flags & LIBIO_FLAGS_WRITE)
&& (IMFS_type( the_jnode ) == IMFS_LINEAR_FILE)) {
c9c4: 1a000012 bne ca14 <memfile_open+0x74>
uint32_t count = the_jnode->info.linearfile.size;
c9c8: e59c0050 ldr r0, [ip, #80] ; 0x50 <== NOT EXECUTED
const unsigned char *buffer = the_jnode->info.linearfile.direct;
the_jnode->control = &IMFS_node_control_memfile;
c9cc: e59f2044 ldr r2, [pc, #68] ; ca18 <memfile_open+0x78> <== NOT EXECUTED
the_jnode->info.file.size = 0;
the_jnode->info.file.indirect = 0;
c9d0: e3a04000 mov r4, #0 <== NOT EXECUTED
if ((iop->flags & LIBIO_FLAGS_WRITE)
&& (IMFS_type( the_jnode ) == IMFS_LINEAR_FILE)) {
uint32_t count = the_jnode->info.linearfile.size;
const unsigned char *buffer = the_jnode->info.linearfile.direct;
the_jnode->control = &IMFS_node_control_memfile;
c9d4: e58c204c str r2, [ip, #76] ; 0x4c <== NOT EXECUTED
the_jnode->info.file.size = 0;
c9d8: e3a01000 mov r1, #0 <== NOT EXECUTED
c9dc: e3a02000 mov r2, #0 <== NOT EXECUTED
the_jnode->info.file.indirect = 0;
the_jnode->info.file.doubly_indirect = 0;
the_jnode->info.file.triply_indirect = 0;
if ((count != 0)
c9e0: e1500004 cmp r0, r4 <== NOT EXECUTED
* Perform 'copy on write' for linear files
*/
if ((iop->flags & LIBIO_FLAGS_WRITE)
&& (IMFS_type( the_jnode ) == IMFS_LINEAR_FILE)) {
uint32_t count = the_jnode->info.linearfile.size;
const unsigned char *buffer = the_jnode->info.linearfile.direct;
c9e4: e59c3058 ldr r3, [ip, #88] ; 0x58 <== NOT EXECUTED
the_jnode->control = &IMFS_node_control_memfile;
the_jnode->info.file.size = 0;
c9e8: e58c1050 str r1, [ip, #80] ; 0x50 <== NOT EXECUTED
c9ec: e58c2054 str r2, [ip, #84] ; 0x54 <== NOT EXECUTED
the_jnode->info.file.indirect = 0;
c9f0: e58c4058 str r4, [ip, #88] ; 0x58 <== NOT EXECUTED
the_jnode->info.file.doubly_indirect = 0;
c9f4: e58c405c str r4, [ip, #92] ; 0x5c <== NOT EXECUTED
the_jnode->info.file.triply_indirect = 0;
c9f8: e58c4060 str r4, [ip, #96] ; 0x60 <== NOT EXECUTED
if ((count != 0)
c9fc: 0a000004 beq ca14 <memfile_open+0x74> <== NOT EXECUTED
&& (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
ca00: e58d0000 str r0, [sp] <== NOT EXECUTED
ca04: e1a0000c mov r0, ip <== NOT EXECUTED
ca08: ebffff68 bl c7b0 <IMFS_memfile_write> <== NOT EXECUTED
ca0c: e3700001 cmn r0, #1 <== NOT EXECUTED
return -1;
}
return 0;
ca10: 11a00004 movne r0, r4 <== NOT EXECUTED
}
ca14: e8bd8018 pop {r3, r4, pc}
00002824 <mount>:
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
2824: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
int rv = 0;
if (
2828: e3530001 cmp r3, #1
const char *target,
const char *filesystemtype,
rtems_filesystem_options_t options,
const void *data
)
{
282c: e24dd060 sub sp, sp, #96 ; 0x60
2830: e1a05000 mov r5, r0
2834: e1a06001 mov r6, r1
2838: e1a09002 mov r9, r2
283c: e58d3008 str r3, [sp, #8]
int rv = 0;
if (
2840: 8a0000a7 bhi 2ae4 <mount+0x2c0>
options == RTEMS_FILESYSTEM_READ_ONLY
|| options == RTEMS_FILESYSTEM_READ_WRITE
) {
rtems_filesystem_fsmount_me_t fsmount_me_h =
2844: e1a00002 mov r0, r2
2848: eb001f5d bl a5c4 <rtems_filesystem_get_mount_handler>
rtems_filesystem_get_mount_handler( filesystemtype );
if ( fsmount_me_h != NULL ) {
284c: e3500000 cmp r0, #0
2850: e58d000c str r0, [sp, #12]
2854: 0a0000a2 beq 2ae4 <mount+0x2c0>
const char *target_or_null,
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
2858: e3560000 cmp r6, #0
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
285c: e1a00009 mov r0, r9
const char *target_or_null,
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
2860: e59fb2a4 ldr fp, [pc, #676] ; 2b0c <mount+0x2e8>
2864: 11a0b006 movne fp, r6
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
2868: eb00316d bl ee24 <strlen>
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
286c: e3550000 cmp r5, #0
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
2870: e1a0a000 mov sl, r0
size_t source_size = source_or_null != NULL ?
strlen( source_or_null ) + 1 : 0;
2874: 01a07005 moveq r7, r5
2878: 0a000002 beq 2888 <mount+0x64>
287c: e1a00005 mov r0, r5
2880: eb003167 bl ee24 <strlen>
2884: e2807001 add r7, r0, #1
size_t target_size = strlen( target ) + 1;
2888: e1a0000b mov r0, fp
288c: eb003164 bl ee24 <strlen>
2890: e2800001 add r0, r0, #1
2894: e58d0000 str r0, [sp]
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
+ filesystemtype_size + source_size + target_size
+ sizeof( rtems_filesystem_global_location_t );
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
2898: e59d3000 ldr r3, [sp]
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;
size_t size = sizeof( rtems_filesystem_mount_table_entry_t )
+ filesystemtype_size + source_size + target_size
289c: e28a1065 add r1, sl, #101 ; 0x65
28a0: e0811007 add r1, r1, r7
+ sizeof( rtems_filesystem_global_location_t );
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
28a4: e3a00001 mov r0, #1
28a8: e0811003 add r1, r1, r3
28ac: ebfffe07 bl 20d0 <calloc>
if ( mt_entry != NULL ) {
28b0: e2504000 subs r4, r0, #0
28b4: 0a000091 beq 2b00 <mount+0x2dc>
rtems_filesystem_global_location_t *mt_fs_root =
(rtems_filesystem_global_location_t *)
((char *) mt_entry + sizeof( *mt_entry ));
char *str = (char *) mt_fs_root + sizeof( *mt_fs_root );
28b8: e2848064 add r8, r4, #100 ; 0x64
const char *filesystemtype,
size_t *target_length_ptr
)
{
const char *target = target_or_null != NULL ? target_or_null : "/";
size_t filesystemtype_size = strlen( filesystemtype ) + 1;
28bc: e28aa001 add sl, sl, #1
+ filesystemtype_size + source_size + target_size
+ sizeof( rtems_filesystem_global_location_t );
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
if ( mt_entry != NULL ) {
rtems_filesystem_global_location_t *mt_fs_root =
28c0: e2843040 add r3, r4, #64 ; 0x40
(rtems_filesystem_global_location_t *)
((char *) mt_entry + sizeof( *mt_entry ));
char *str = (char *) mt_fs_root + sizeof( *mt_fs_root );
memcpy( str, filesystemtype, filesystemtype_size );
28c4: e1a00008 mov r0, r8
28c8: e1a01009 mov r1, r9
28cc: e1a0200a mov r2, sl
+ filesystemtype_size + source_size + target_size
+ sizeof( rtems_filesystem_global_location_t );
rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size );
if ( mt_entry != NULL ) {
rtems_filesystem_global_location_t *mt_fs_root =
28d0: e58d3004 str r3, [sp, #4]
(rtems_filesystem_global_location_t *)
((char *) mt_entry + sizeof( *mt_entry ));
char *str = (char *) mt_fs_root + sizeof( *mt_fs_root );
memcpy( str, filesystemtype, filesystemtype_size );
28d4: eb002dd0 bl e01c <memcpy>
mt_entry->type = str;
str += filesystemtype_size;
if ( source_or_null != NULL ) {
28d8: e3550000 cmp r5, #0
(rtems_filesystem_global_location_t *)
((char *) mt_entry + sizeof( *mt_entry ));
char *str = (char *) mt_fs_root + sizeof( *mt_fs_root );
memcpy( str, filesystemtype, filesystemtype_size );
mt_entry->type = str;
28dc: e5848034 str r8, [r4, #52] ; 0x34
str += filesystemtype_size;
28e0: e088800a add r8, r8, sl
if ( source_or_null != NULL ) {
28e4: 0a000005 beq 2900 <mount+0xdc>
memcpy( str, source_or_null, source_size );
28e8: e1a00008 mov r0, r8
28ec: e1a01005 mov r1, r5
28f0: e1a02007 mov r2, r7
28f4: eb002dc8 bl e01c <memcpy>
mt_entry->dev = str;
28f8: e5848038 str r8, [r4, #56] ; 0x38
str += source_size;
28fc: e0888007 add r8, r8, r7
}
memcpy( str, target, target_size );
2900: e1a0100b mov r1, fp
2904: e59d2000 ldr r2, [sp]
2908: e1a00008 mov r0, r8
290c: eb002dc2 bl e01c <memcpy>
mt_entry->target = str;
str += target_size;
mt_entry->mounted = true;
mt_entry->mt_fs_root = mt_fs_root;
2910: e59d3004 ldr r3, [sp, #4]
2914: e5843024 str r3, [r4, #36] ; 0x24
mt_entry->pathconf_limits_and_options = &rtems_filesystem_default_pathconf;
2918: e59f31f0 ldr r3, [pc, #496] ; 2b10 <mount+0x2ec>
memcpy( str, target, target_size );
mt_entry->target = str;
str += target_size;
mt_entry->mounted = true;
291c: e3a02001 mov r2, #1
2920: e5c42028 strb r2, [r4, #40] ; 0x28
mt_entry->mt_fs_root = mt_fs_root;
mt_entry->pathconf_limits_and_options = &rtems_filesystem_default_pathconf;
2924: e584302c str r3, [r4, #44] ; 0x2c
mt_fs_root->location.mt_entry = mt_entry;
mt_fs_root->reference_count = 1;
2928: e5842058 str r2, [r4, #88] ; 0x58
void *starting_address,
size_t number_nodes,
size_t node_size
)
{
_Chain_Initialize( the_chain, starting_address, number_nodes, node_size );
292c: e2840014 add r0, r4, #20
2930: e59d1004 ldr r1, [sp, #4]
2934: e3a03024 mov r3, #36 ; 0x24
mt_entry->dev = str;
str += source_size;
}
memcpy( str, target, target_size );
mt_entry->target = str;
2938: e5848030 str r8, [r4, #48] ; 0x30
mt_entry->mounted = true;
mt_entry->mt_fs_root = mt_fs_root;
mt_entry->pathconf_limits_and_options = &rtems_filesystem_default_pathconf;
mt_fs_root->location.mt_entry = mt_entry;
293c: e5844054 str r4, [r4, #84] ; 0x54
2940: eb00103d bl 6a3c <_Chain_Initialize>
filesystemtype,
&target_length
);
if ( mt_entry != NULL ) {
mt_entry->writeable = options == RTEMS_FILESYSTEM_READ_WRITE;
2944: e59d3008 ldr r3, [sp, #8]
rv = (*fsmount_me_h)( mt_entry, data );
2948: e1a00004 mov r0, r4
filesystemtype,
&target_length
);
if ( mt_entry != NULL ) {
mt_entry->writeable = options == RTEMS_FILESYSTEM_READ_WRITE;
294c: e5c43029 strb r3, [r4, #41] ; 0x29
rv = (*fsmount_me_h)( mt_entry, data );
2950: e59d1084 ldr r1, [sp, #132] ; 0x84
2954: e59d300c ldr r3, [sp, #12]
2958: e1a0e00f mov lr, pc
295c: e12fff13 bx r3
if ( rv == 0 ) {
2960: e2505000 subs r5, r0, #0
2964: 1a00005b bne 2ad8 <mount+0x2b4>
if ( target != NULL ) {
2968: e3560000 cmp r6, #0
296c: 0a000030 beq 2a34 <mount+0x210>
{
int rv = 0;
rtems_filesystem_eval_path_context_t ctx;
int eval_flags = RTEMS_FS_PERMS_RWX
| RTEMS_FS_FOLLOW_LINK;
rtems_filesystem_location_info_t *currentloc =
2970: e1a01006 mov r1, r6
2974: e3a0201f mov r2, #31
2978: e28d0010 add r0, sp, #16
297c: eb000318 bl 35e4 <rtems_filesystem_eval_path_start>
static inline bool rtems_filesystem_location_is_instance_root(
const rtems_filesystem_location_info_t *loc
)
{
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
2980: e5902014 ldr r2, [r0, #20]
return (*mt_entry->ops->are_nodes_equal_h)(
2984: e592300c ldr r3, [r2, #12]
2988: e5921024 ldr r1, [r2, #36] ; 0x24
298c: e1a0e00f mov lr, pc
2990: e593f010 ldr pc, [r3, #16]
rtems_filesystem_eval_path_start( &ctx, target, eval_flags );
if ( !rtems_filesystem_location_is_instance_root( currentloc ) ) {
2994: e3500000 cmp r0, #0
2998: 1a00001c bne 2a10 <mount+0x1ec>
static inline void rtems_filesystem_eval_path_extract_currentloc(
rtems_filesystem_eval_path_context_t *ctx,
rtems_filesystem_location_info_t *get
)
{
rtems_filesystem_location_copy_and_detach(
299c: e28d1028 add r1, sp, #40 ; 0x28
29a0: e28d0048 add r0, sp, #72 ; 0x48
29a4: eb0003d2 bl 38f4 <rtems_filesystem_location_copy_and_detach>
rtems_filesystem_location_info_t targetloc;
rtems_filesystem_global_location_t *mt_point_node;
rtems_filesystem_eval_path_extract_currentloc( &ctx, &targetloc );
mt_point_node = rtems_filesystem_location_transform_to_global( &targetloc );
29a8: e28d0048 add r0, sp, #72 ; 0x48
29ac: eb000441 bl 3ab8 <rtems_filesystem_location_transform_to_global>
mt_entry->mt_point_node = mt_point_node;
rv = (*mt_point_node->location.mt_entry->ops->mount_h)( mt_entry );
29b0: e5903014 ldr r3, [r0, #20]
rtems_filesystem_location_info_t targetloc;
rtems_filesystem_global_location_t *mt_point_node;
rtems_filesystem_eval_path_extract_currentloc( &ctx, &targetloc );
mt_point_node = rtems_filesystem_location_transform_to_global( &targetloc );
mt_entry->mt_point_node = mt_point_node;
29b4: e5840020 str r0, [r4, #32]
if ( !rtems_filesystem_location_is_instance_root( currentloc ) ) {
rtems_filesystem_location_info_t targetloc;
rtems_filesystem_global_location_t *mt_point_node;
rtems_filesystem_eval_path_extract_currentloc( &ctx, &targetloc );
mt_point_node = rtems_filesystem_location_transform_to_global( &targetloc );
29b8: e1a06000 mov r6, r0
mt_entry->mt_point_node = mt_point_node;
rv = (*mt_point_node->location.mt_entry->ops->mount_h)( mt_entry );
29bc: e593300c ldr r3, [r3, #12]
29c0: e1a00004 mov r0, r4
29c4: e1a0e00f mov lr, pc
29c8: e593f030 ldr pc, [r3, #48] ; 0x30
if ( rv == 0 ) {
29cc: e2505000 subs r5, r0, #0
29d0: 1a00000b bne 2a04 <mount+0x1e0>
rtems_filesystem_mt_lock();
29d4: ebffff8c bl 280c <rtems_filesystem_mt_lock>
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
29d8: e59f3134 ldr r3, [pc, #308] ; 2b14 <mount+0x2f0>
29dc: e5932008 ldr r2, [r3, #8]
the_node->next = tail;
29e0: e2831004 add r1, r3, #4
tail->previous = the_node;
29e4: e5834008 str r4, [r3, #8]
rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
}
static inline void rtems_libio_unlock( void )
{
rtems_semaphore_release( rtems_libio_semaphore );
29e8: e59f3128 ldr r3, [pc, #296] ; 2b18 <mount+0x2f4>
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
29ec: e5841000 str r1, [r4]
tail->previous = the_node;
old_last->next = the_node;
the_node->previous = old_last;
29f0: e5842004 str r2, [r4, #4]
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
old_last->next = the_node;
29f4: e5824000 str r4, [r2]
29f8: e5930000 ldr r0, [r3]
29fc: eb000daf bl 60c0 <rtems_semaphore_release>
2a00: ea000006 b 2a20 <mount+0x1fc>
&rtems_filesystem_mount_table,
&mt_entry->mt_node
);
rtems_filesystem_mt_unlock();
} else {
rtems_filesystem_global_location_release( mt_point_node );
2a04: e1a00006 mov r0, r6
2a08: eb0003db bl 397c <rtems_filesystem_global_location_release>
2a0c: ea000003 b 2a20 <mount+0x1fc>
}
} else {
rtems_filesystem_eval_path_error( &ctx, EBUSY );
2a10: e28d0010 add r0, sp, #16
2a14: e3a01010 mov r1, #16
2a18: eb00023c bl 3310 <rtems_filesystem_eval_path_error>
rv = -1;
2a1c: e3e05000 mvn r5, #0
}
rtems_filesystem_eval_path_cleanup( &ctx );
2a20: e28d0010 add r0, sp, #16
2a24: eb0002f6 bl 3604 <rtems_filesystem_eval_path_cleanup>
rv = register_subordinate_file_system( mt_entry, target );
} else {
rv = register_root_file_system( mt_entry );
}
if ( rv != 0 ) {
2a28: e3550000 cmp r5, #0
2a2c: 0a000030 beq 2af4 <mount+0x2d0>
2a30: ea000024 b 2ac8 <mount+0x2a4>
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
int rv = 0;
rtems_filesystem_mt_lock();
2a34: ebffff74 bl 280c <rtems_filesystem_mt_lock>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
2a38: e59f30d4 ldr r3, [pc, #212] ; 2b14 <mount+0x2f0>
if ( rtems_chain_is_empty( &rtems_filesystem_mount_table ) ) {
2a3c: e5931000 ldr r1, [r3]
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
2a40: e2832004 add r2, r3, #4
2a44: e1510002 cmp r1, r2
2a48: 1a000005 bne 2a64 <mount+0x240>
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
2a4c: e5932008 ldr r2, [r3, #8]
the_node->next = tail;
2a50: e5841000 str r1, [r4]
tail->previous = the_node;
2a54: e5834008 str r4, [r3, #8]
old_last->next = the_node;
2a58: e5824000 str r4, [r2]
the_node->previous = old_last;
2a5c: e5842004 str r2, [r4, #4]
2a60: ea000003 b 2a74 <mount+0x250>
rtems_chain_append_unprotected(
&rtems_filesystem_mount_table,
&mt_entry->mt_node
);
} else {
errno = EINVAL;
2a64: eb002b32 bl d734 <__errno> <== NOT EXECUTED
2a68: e3a03016 mov r3, #22 <== NOT EXECUTED
2a6c: e5803000 str r3, [r0] <== NOT EXECUTED
rv = -1;
2a70: e3e05000 mvn r5, #0 <== NOT EXECUTED
2a74: e59f309c ldr r3, [pc, #156] ; 2b18 <mount+0x2f4>
2a78: e5930000 ldr r0, [r3]
2a7c: eb000d8f bl 60c0 <rtems_semaphore_release>
}
rtems_filesystem_mt_unlock();
if ( rv == 0 ) {
2a80: e3550000 cmp r5, #0
2a84: 1a00000f bne 2ac8 <mount+0x2a4>
rtems_filesystem_global_location_t *new_fs_root =
rtems_filesystem_global_location_obtain( &mt_entry->mt_fs_root );
2a88: e2844024 add r4, r4, #36 ; 0x24
rv = -1;
}
rtems_filesystem_mt_unlock();
if ( rv == 0 ) {
rtems_filesystem_global_location_t *new_fs_root =
2a8c: e1a00004 mov r0, r4
2a90: eb0003d9 bl 39fc <rtems_filesystem_global_location_obtain>
2a94: e1a07000 mov r7, r0
rtems_filesystem_global_location_obtain( &mt_entry->mt_fs_root );
rtems_filesystem_global_location_t *new_fs_current =
2a98: e1a00004 mov r0, r4
2a9c: eb0003d6 bl 39fc <rtems_filesystem_global_location_obtain>
rtems_filesystem_global_location_obtain( &mt_entry->mt_fs_root );
rtems_filesystem_global_location_assign(
2aa0: e59f4074 ldr r4, [pc, #116] ; 2b1c <mount+0x2f8>
rtems_filesystem_mt_unlock();
if ( rv == 0 ) {
rtems_filesystem_global_location_t *new_fs_root =
rtems_filesystem_global_location_obtain( &mt_entry->mt_fs_root );
rtems_filesystem_global_location_t *new_fs_current =
2aa4: e1a06000 mov r6, r0
rtems_filesystem_global_location_obtain( &mt_entry->mt_fs_root );
rtems_filesystem_global_location_assign(
2aa8: e5940000 ldr r0, [r4]
2aac: e1a01007 mov r1, r7
2ab0: e2800004 add r0, r0, #4
2ab4: eb0003c6 bl 39d4 <rtems_filesystem_global_location_assign>
&rtems_filesystem_root,
new_fs_root
);
rtems_filesystem_global_location_assign(
2ab8: e5940000 ldr r0, [r4]
2abc: e1a01006 mov r1, r6
2ac0: eb0003c3 bl 39d4 <rtems_filesystem_global_location_assign>
2ac4: ea00000a b 2af4 <mount+0x2d0>
} else {
rv = register_root_file_system( mt_entry );
}
if ( rv != 0 ) {
(*mt_entry->ops->fsunmount_me_h)( mt_entry );
2ac8: e594300c ldr r3, [r4, #12]
2acc: e1a00004 mov r0, r4
2ad0: e1a0e00f mov lr, pc
2ad4: e593f03c ldr pc, [r3, #60] ; 0x3c
}
}
if ( rv != 0 ) {
free( mt_entry );
2ad8: e1a00004 mov r0, r4
2adc: ebfffe11 bl 2328 <free>
2ae0: ea000003 b 2af4 <mount+0x2d0>
} else {
errno = EINVAL;
rv = -1;
}
} else {
errno = EINVAL;
2ae4: eb002b12 bl d734 <__errno>
2ae8: e3a03016 mov r3, #22
2aec: e5803000 str r3, [r0]
rv = -1;
2af0: e3e05000 mvn r5, #0
}
return rv;
}
2af4: e1a00005 mov r0, r5
2af8: e28dd060 add sp, sp, #96 ; 0x60
2afc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
if ( rv != 0 ) {
free( mt_entry );
}
} else {
errno = ENOMEM;
2b00: eb002b0b bl d734 <__errno> <== NOT EXECUTED
2b04: e3a0300c mov r3, #12 <== NOT EXECUTED
2b08: eafffff7 b 2aec <mount+0x2c8> <== NOT EXECUTED
00015004 <msdos_creat_node>:
msdos_node_type_t type,
const char *name,
int name_len,
mode_t mode,
const fat_file_fd_t *link_fd)
{
15004: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
int rc = RC_OK;
ssize_t ret = 0;
msdos_fs_info_t *fs_info = parent_loc->mt_entry->fs_info;
fat_file_fd_t *parent_fat_fd = parent_loc->node_access;
fat_file_fd_t *fat_fd = NULL;
15008: e3a05000 mov r5, #0
msdos_node_type_t type,
const char *name,
int name_len,
mode_t mode,
const fat_file_fd_t *link_fd)
{
1500c: e24dd0ac sub sp, sp, #172 ; 0xac
15010: e1a09003 mov r9, r3
int rc = RC_OK;
ssize_t ret = 0;
msdos_fs_info_t *fs_info = parent_loc->mt_entry->fs_info;
15014: e5903014 ldr r3, [r0, #20]
msdos_node_type_t type,
const char *name,
int name_len,
mode_t mode,
const fat_file_fd_t *link_fd)
{
15018: e58d200c str r2, [sp, #12]
int rc = RC_OK;
ssize_t ret = 0;
msdos_fs_info_t *fs_info = parent_loc->mt_entry->fs_info;
fat_file_fd_t *parent_fat_fd = parent_loc->node_access;
1501c: e590a008 ldr sl, [r0, #8]
fat_dir_pos_t *dir_pos
)
{
dir_pos->sname.cln = 0;
dir_pos->sname.ofs = 0;
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
15020: e3e08000 mvn r8, #0
uint32_t sec = 0;
uint32_t byte = 0;
fat_dir_pos_init(&dir_pos);
memset(short_node, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
15024: e3a02020 mov r2, #32
msdos_node_type_t type,
const char *name,
int name_len,
mode_t mode,
const fat_file_fd_t *link_fd)
{
15028: e1a07000 mov r7, r0
1502c: e1a06001 mov r6, r1
uint32_t sec = 0;
uint32_t byte = 0;
fat_dir_pos_init(&dir_pos);
memset(short_node, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
15030: e28d0054 add r0, sp, #84 ; 0x54
15034: e1a01005 mov r1, r5
mode_t mode,
const fat_file_fd_t *link_fd)
{
int rc = RC_OK;
ssize_t ret = 0;
msdos_fs_info_t *fs_info = parent_loc->mt_entry->fs_info;
15038: e5934008 ldr r4, [r3, #8]
fat_file_fd_t *parent_fat_fd = parent_loc->node_access;
fat_file_fd_t *fat_fd = NULL;
1503c: e58d50a4 str r5, [sp, #164] ; 0xa4
time_t time_ret = 0;
uint16_t time_val = 0;
15040: e1cd5ab8 strh r5, [sp, #168] ; 0xa8
uint16_t date = 0;
15044: e1cd5aba strh r5, [sp, #170] ; 0xaa
static inline void
fat_dir_pos_init(
fat_dir_pos_t *dir_pos
)
{
dir_pos->sname.cln = 0;
15048: e58d5094 str r5, [sp, #148] ; 0x94
dir_pos->sname.ofs = 0;
1504c: e58d5098 str r5, [sp, #152] ; 0x98
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
15050: e58d809c str r8, [sp, #156] ; 0x9c
dir_pos->lname.ofs = FAT_FILE_SHORT_NAME;
15054: e58d80a0 str r8, [sp, #160] ; 0xa0
uint32_t sec = 0;
uint32_t byte = 0;
fat_dir_pos_init(&dir_pos);
memset(short_node, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
15058: eb0010df bl 193dc <memset>
memset(dot_dotdot, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE * 2);
1505c: e28d0014 add r0, sp, #20
15060: e1a01005 mov r1, r5
15064: e3a02040 mov r2, #64 ; 0x40
15068: eb0010db bl 193dc <memset>
if (name_len > MSDOS_NAME_MAX_LFN_WITH_DOT) {
1506c: e3590f41 cmp r9, #260 ; 0x104
ssize_t ret = 0;
msdos_fs_info_t *fs_info = parent_loc->mt_entry->fs_info;
fat_file_fd_t *parent_fat_fd = parent_loc->node_access;
fat_file_fd_t *fat_fd = NULL;
time_t time_ret = 0;
uint16_t time_val = 0;
15070: e1a0b005 mov fp, r5
fat_dir_pos_init(&dir_pos);
memset(short_node, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
memset(dot_dotdot, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE * 2);
if (name_len > MSDOS_NAME_MAX_LFN_WITH_DOT) {
15074: da000002 ble 15084 <msdos_creat_node+0x80>
rtems_set_errno_and_return_minus_one(ENAMETOOLONG);
15078: eb000dfa bl 18868 <__errno> <== NOT EXECUTED
1507c: e3a0305b mov r3, #91 ; 0x5b <== NOT EXECUTED
15080: ea000009 b 150ac <msdos_creat_node+0xa8> <== NOT EXECUTED
}
name_type = msdos_long_to_short (name, name_len,
15084: e59d000c ldr r0, [sp, #12]
15088: e1a01009 mov r1, r9
1508c: e28d2054 add r2, sp, #84 ; 0x54
15090: e3a0300b mov r3, #11
15094: eb000107 bl 154b8 <msdos_long_to_short>
MSDOS_DIR_NAME(short_node),
MSDOS_NAME_MAX);
if (name_type == MSDOS_NAME_INVALID) {
15098: e3500000 cmp r0, #0
1509c: e58d0010 str r0, [sp, #16]
150a0: 1a000003 bne 150b4 <msdos_creat_node+0xb0>
rtems_set_errno_and_return_minus_one(EINVAL);
150a4: eb000def bl 18868 <__errno> <== NOT EXECUTED
150a8: e3a03016 mov r3, #22 <== NOT EXECUTED
150ac: e5803000 str r3, [r0] <== NOT EXECUTED
150b0: ea0000a9 b 1535c <msdos_creat_node+0x358> <== NOT EXECUTED
/* fill reserved field */
*MSDOS_DIR_NT_RES(short_node) = MSDOS_RES_NT_VALUE;
/* set up last write date and time */
time_ret = time(NULL);
150b4: e1a00005 mov r0, r5
if (name_type == MSDOS_NAME_INVALID) {
rtems_set_errno_and_return_minus_one(EINVAL);
}
/* fill reserved field */
*MSDOS_DIR_NT_RES(short_node) = MSDOS_RES_NT_VALUE;
150b8: e5cd5060 strb r5, [sp, #96] ; 0x60
/* set up last write date and time */
time_ret = time(NULL);
150bc: eb00219b bl 1d730 <time>
if ( time_ret == -1 )
150c0: e3700001 cmn r0, #1
/* fill reserved field */
*MSDOS_DIR_NT_RES(short_node) = MSDOS_RES_NT_VALUE;
/* set up last write date and time */
time_ret = time(NULL);
150c4: e1a08000 mov r8, r0
if ( time_ret == -1 )
150c8: 0a0000a3 beq 1535c <msdos_creat_node+0x358>
return -1;
msdos_date_unix2dos(time_ret, &date, &time_val);
150cc: e28d20a8 add r2, sp, #168 ; 0xa8
150d0: e28d10aa add r1, sp, #170 ; 0xaa
150d4: eb000a38 bl 179bc <msdos_date_unix2dos>
*MSDOS_DIR_CRT_TIME(short_node) = CT_LE_W(time_val);
*MSDOS_DIR_CRT_DATE(short_node) = CT_LE_W(date);
150d8: e1dd3aba ldrh r3, [sp, #170] ; 0xaa
*MSDOS_DIR_LAST_ACCESS_DATE(short_node) = CT_LE_W(date);
/* initialize directory/file size */
*MSDOS_DIR_FILE_SIZE(short_node) = MSDOS_INIT_DIR_SIZE;
if (type == MSDOS_DIRECTORY) {
150dc: e3560000 cmp r6, #0
time_ret = time(NULL);
if ( time_ret == -1 )
return -1;
msdos_date_unix2dos(time_ret, &date, &time_val);
*MSDOS_DIR_CRT_TIME(short_node) = CT_LE_W(time_val);
150e0: e1dd2ab8 ldrh r2, [sp, #168] ; 0xa8
*MSDOS_DIR_CRT_DATE(short_node) = CT_LE_W(date);
150e4: e1cd36b4 strh r3, [sp, #100] ; 0x64
*MSDOS_DIR_WRITE_TIME(short_node) = CT_LE_W(time_val);
*MSDOS_DIR_WRITE_DATE(short_node) = CT_LE_W(date);
150e8: e1cd36bc strh r3, [sp, #108] ; 0x6c
*MSDOS_DIR_LAST_ACCESS_DATE(short_node) = CT_LE_W(date);
150ec: e1cd36b6 strh r3, [sp, #102] ; 0x66
/* initialize directory/file size */
*MSDOS_DIR_FILE_SIZE(short_node) = MSDOS_INIT_DIR_SIZE;
if (type == MSDOS_DIRECTORY) {
*MSDOS_DIR_ATTR(short_node) |= MSDOS_ATTR_DIRECTORY;
150f0: 05dd305f ldrbeq r3, [sp, #95] ; 0x5f
time_ret = time(NULL);
if ( time_ret == -1 )
return -1;
msdos_date_unix2dos(time_ret, &date, &time_val);
*MSDOS_DIR_CRT_TIME(short_node) = CT_LE_W(time_val);
150f4: e1cd26b2 strh r2, [sp, #98] ; 0x62
*MSDOS_DIR_CRT_DATE(short_node) = CT_LE_W(date);
*MSDOS_DIR_WRITE_TIME(short_node) = CT_LE_W(time_val);
150f8: e1cd26ba strh r2, [sp, #106] ; 0x6a
*MSDOS_DIR_WRITE_DATE(short_node) = CT_LE_W(date);
*MSDOS_DIR_LAST_ACCESS_DATE(short_node) = CT_LE_W(date);
/* initialize directory/file size */
*MSDOS_DIR_FILE_SIZE(short_node) = MSDOS_INIT_DIR_SIZE;
150fc: e58d5070 str r5, [sp, #112] ; 0x70
if (type == MSDOS_DIRECTORY) {
*MSDOS_DIR_ATTR(short_node) |= MSDOS_ATTR_DIRECTORY;
15100: 03833010 orreq r3, r3, #16
*MSDOS_DIR_LAST_ACCESS_DATE(short_node) = CT_LE_W(date);
/* initialize directory/file size */
*MSDOS_DIR_FILE_SIZE(short_node) = MSDOS_INIT_DIR_SIZE;
if (type == MSDOS_DIRECTORY) {
15104: 0a00002b beq 151b8 <msdos_creat_node+0x1b4>
*MSDOS_DIR_ATTR(short_node) |= MSDOS_ATTR_DIRECTORY;
}
else if (type == MSDOS_HARD_LINK) {
15108: e3560002 cmp r6, #2
* set "archive bit" due to changes
*/
*MSDOS_DIR_ATTR(short_node) |= MSDOS_ATTR_ARCHIVE;
}
else { /* regular file... */
*MSDOS_DIR_ATTR(short_node) |= MSDOS_ATTR_ARCHIVE;
1510c: 15dd305f ldrbne r3, [sp, #95] ; 0x5f
*MSDOS_DIR_FILE_SIZE(short_node) = MSDOS_INIT_DIR_SIZE;
if (type == MSDOS_DIRECTORY) {
*MSDOS_DIR_ATTR(short_node) |= MSDOS_ATTR_DIRECTORY;
}
else if (type == MSDOS_HARD_LINK) {
15110: 1a000027 bne 151b4 <msdos_creat_node+0x1b0>
* node to the newly created
*/
/*
* read the original directory entry
*/
sec = fat_cluster_num_to_sector_num(&fs_info->fat,
15114: e59d20d4 ldr r2, [sp, #212] ; 0xd4 <== NOT EXECUTED
15118: e5921020 ldr r1, [r2, #32] <== NOT EXECUTED
fat_cluster_num_to_sector_num(
const fat_fs_info_t *fs_info,
uint32_t cln
)
{
if ( (cln == 0) && (fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)) )
1511c: e3510000 cmp r1, #0 <== NOT EXECUTED
15120: 1a000003 bne 15134 <msdos_creat_node+0x130> <== NOT EXECUTED
15124: e5d4300e ldrb r3, [r4, #14] <== NOT EXECUTED
15128: e3130003 tst r3, #3 <== NOT EXECUTED
return fs_info->vol.rdir_loc;
1512c: 15941020 ldrne r1, [r4, #32] <== NOT EXECUTED
fat_cluster_num_to_sector_num(
const fat_fs_info_t *fs_info,
uint32_t cln
)
{
if ( (cln == 0) && (fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)) )
15130: 1a000003 bne 15144 <msdos_creat_node+0x140> <== NOT EXECUTED
return fs_info->vol.rdir_loc;
return (((cln - FAT_RSRVD_CLN) << fs_info->vol.spc_log2) +
15134: e5d42005 ldrb r2, [r4, #5] <== NOT EXECUTED
15138: e5943034 ldr r3, [r4, #52] ; 0x34 <== NOT EXECUTED
1513c: e2411002 sub r1, r1, #2 <== NOT EXECUTED
15140: e0831211 add r1, r3, r1, lsl r2 <== NOT EXECUTED
link_fd->dir_pos.sname.cln);
sec += (link_fd->dir_pos.sname.ofs >> fs_info->fat.vol.sec_log2);
15144: e59d20d4 ldr r2, [sp, #212] ; 0xd4 <== NOT EXECUTED
15148: e5923024 ldr r3, [r2, #36] ; 0x24 <== NOT EXECUTED
byte = (link_fd->dir_pos.sname.ofs & (fs_info->fat.vol.bps - 1));
1514c: e1d420b0 ldrh r2, [r4] <== NOT EXECUTED
/*
* read the original directory entry
*/
sec = fat_cluster_num_to_sector_num(&fs_info->fat,
link_fd->dir_pos.sname.cln);
sec += (link_fd->dir_pos.sname.ofs >> fs_info->fat.vol.sec_log2);
15150: e5d4c002 ldrb ip, [r4, #2] <== NOT EXECUTED
byte = (link_fd->dir_pos.sname.ofs & (fs_info->fat.vol.bps - 1));
ret = _fat_block_read(&fs_info->fat,
sec, byte, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE,
link_node);
15154: e28d0074 add r0, sp, #116 ; 0x74 <== NOT EXECUTED
* read the original directory entry
*/
sec = fat_cluster_num_to_sector_num(&fs_info->fat,
link_fd->dir_pos.sname.cln);
sec += (link_fd->dir_pos.sname.ofs >> fs_info->fat.vol.sec_log2);
byte = (link_fd->dir_pos.sname.ofs & (fs_info->fat.vol.bps - 1));
15158: e2422001 sub r2, r2, #1 <== NOT EXECUTED
ret = _fat_block_read(&fs_info->fat,
1515c: e58d0000 str r0, [sp] <== NOT EXECUTED
15160: e0811c33 add r1, r1, r3, lsr ip <== NOT EXECUTED
15164: e0022003 and r2, r2, r3 <== NOT EXECUTED
15168: e1a00004 mov r0, r4 <== NOT EXECUTED
1516c: e3a03020 mov r3, #32 <== NOT EXECUTED
15170: ebffef22 bl 10e00 <_fat_block_read> <== NOT EXECUTED
sec, byte, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE,
link_node);
if (ret < 0) {
15174: e3500000 cmp r0, #0 <== NOT EXECUTED
return -1;
15178: b3e08000 mvnlt r8, #0 <== NOT EXECUTED
byte = (link_fd->dir_pos.sname.ofs & (fs_info->fat.vol.bps - 1));
ret = _fat_block_read(&fs_info->fat,
sec, byte, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE,
link_node);
if (ret < 0) {
1517c: ba000076 blt 1535c <msdos_creat_node+0x358> <== NOT EXECUTED
}
/*
* copy various attributes
*/
*MSDOS_DIR_ATTR(short_node) =*MSDOS_DIR_ATTR(link_node);
*MSDOS_DIR_CRT_TIME_TENTH(short_node)=*MSDOS_DIR_CRT_TIME_TENTH(link_node);
15180: e5dd2081 ldrb r2, [sp, #129] ; 0x81 <== NOT EXECUTED
15184: e5cd2061 strb r2, [sp, #97] ; 0x61 <== NOT EXECUTED
*MSDOS_DIR_CRT_TIME(short_node) =*MSDOS_DIR_CRT_TIME(link_node);
15188: e1dd28b2 ldrh r2, [sp, #130] ; 0x82 <== NOT EXECUTED
1518c: e1cd26b2 strh r2, [sp, #98] ; 0x62 <== NOT EXECUTED
*MSDOS_DIR_CRT_DATE(short_node) =*MSDOS_DIR_CRT_DATE(link_node);
15190: e1dd28b4 ldrh r2, [sp, #132] ; 0x84 <== NOT EXECUTED
15194: e1cd26b4 strh r2, [sp, #100] ; 0x64 <== NOT EXECUTED
/*
* copy/set "file size", "first cluster"
*/
*MSDOS_DIR_FILE_SIZE(short_node) =*MSDOS_DIR_FILE_SIZE(link_node);
15198: e59d2090 ldr r2, [sp, #144] ; 0x90 <== NOT EXECUTED
1519c: e58d2070 str r2, [sp, #112] ; 0x70 <== NOT EXECUTED
*MSDOS_DIR_FIRST_CLUSTER_LOW(short_node) =
151a0: e1dd28be ldrh r2, [sp, #142] ; 0x8e <== NOT EXECUTED
151a4: e1cd26be strh r2, [sp, #110] ; 0x6e <== NOT EXECUTED
*MSDOS_DIR_FIRST_CLUSTER_LOW(link_node);
*MSDOS_DIR_FIRST_CLUSTER_HI(short_node) =
151a8: e1dd28b8 ldrh r2, [sp, #136] ; 0x88 <== NOT EXECUTED
return -1;
}
/*
* copy various attributes
*/
*MSDOS_DIR_ATTR(short_node) =*MSDOS_DIR_ATTR(link_node);
151ac: e5dd307f ldrb r3, [sp, #127] ; 0x7f <== NOT EXECUTED
*/
*MSDOS_DIR_FILE_SIZE(short_node) =*MSDOS_DIR_FILE_SIZE(link_node);
*MSDOS_DIR_FIRST_CLUSTER_LOW(short_node) =
*MSDOS_DIR_FIRST_CLUSTER_LOW(link_node);
*MSDOS_DIR_FIRST_CLUSTER_HI(short_node) =
151b0: e1cd26b8 strh r2, [sp, #104] ; 0x68 <== NOT EXECUTED
* set "archive bit" due to changes
*/
*MSDOS_DIR_ATTR(short_node) |= MSDOS_ATTR_ARCHIVE;
}
else { /* regular file... */
*MSDOS_DIR_ATTR(short_node) |= MSDOS_ATTR_ARCHIVE;
151b4: e3833020 orr r3, r3, #32
151b8: e5cd305f strb r3, [sp, #95] ; 0x5f
/*
* find free space in the parent directory and write new initialized
* FAT 32 Bytes Directory Entry Structure to the disk
*/
rc = msdos_get_name_node(parent_loc, true, name, name_len,
151bc: e59d3010 ldr r3, [sp, #16]
151c0: e28db094 add fp, sp, #148 ; 0x94
151c4: e58d3000 str r3, [sp]
name_type, &dir_pos, short_node);
151c8: e28d5054 add r5, sp, #84 ; 0x54
/*
* find free space in the parent directory and write new initialized
* FAT 32 Bytes Directory Entry Structure to the disk
*/
rc = msdos_get_name_node(parent_loc, true, name, name_len,
151cc: e1a00007 mov r0, r7
151d0: e3a01001 mov r1, #1
151d4: e59d200c ldr r2, [sp, #12]
151d8: e1a03009 mov r3, r9
151dc: e58db004 str fp, [sp, #4]
151e0: e58d5008 str r5, [sp, #8]
151e4: eb00052c bl 1669c <msdos_get_name_node>
name_type, &dir_pos, short_node);
if ( rc != RC_OK )
151e8: e2508000 subs r8, r0, #0
151ec: 1a00005a bne 1535c <msdos_creat_node+0x358>
/*
* if we create a new file we are done, if directory there are more steps
* to do
*/
if (type == MSDOS_DIRECTORY)
151f0: e3560000 cmp r6, #0
151f4: 1a000058 bne 1535c <msdos_creat_node+0x358>
{
/* open new directory as fat-file */
rc = fat_file_open(&fs_info->fat, &dir_pos, &fat_fd);
151f8: e1a00004 mov r0, r4
151fc: e1a0100b mov r1, fp
15200: e28d20a4 add r2, sp, #164 ; 0xa4
15204: ebffebbf bl 10108 <fat_file_open>
if (rc != RC_OK)
15208: e2508000 subs r8, r0, #0
1520c: 1a00004e bne 1534c <msdos_creat_node+0x348>
/*
* we opened fat-file for node we just created, so initialize fat-file
* descritor
*/
fat_fd->fat_file_size = 0;
15210: e59d80a4 ldr r8, [sp, #164] ; 0xa4
fat_fd->fat_file_type = FAT_DIRECTORY;
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
15214: e3a03602 mov r3, #2097152 ; 0x200000
/*
* we opened fat-file for node we just created, so initialize fat-file
* descritor
*/
fat_fd->fat_file_size = 0;
15218: e5886018 str r6, [r8, #24]
fat_fd->fat_file_type = FAT_DIRECTORY;
1521c: e5886010 str r6, [r8, #16]
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
15220: e5883014 str r3, [r8, #20]
/*
* dot and dotdot entries are identical to new node except the
* names
*/
memcpy(DOT_NODE_P(dot_dotdot), short_node,
15224: e1a0c005 mov ip, r5
15228: e8bc000f ldm ip!, {r0, r1, r2, r3}
1522c: e28de014 add lr, sp, #20
15230: e8ae000f stmia lr!, {r0, r1, r2, r3}
15234: e89c000f ldm ip, {r0, r1, r2, r3}
15238: e88e000f stm lr, {r0, r1, r2, r3}
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
memcpy(DOTDOT_NODE_P(dot_dotdot), short_node,
1523c: e8b5000f ldm r5!, {r0, r1, r2, r3}
15240: e28de034 add lr, sp, #52 ; 0x34
15244: e8ae000f stmia lr!, {r0, r1, r2, r3}
15248: e89c000f ldm ip, {r0, r1, r2, r3}
1524c: e88e000f stm lr, {r0, r1, r2, r3}
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
memcpy(MSDOS_DIR_NAME(DOT_NODE_P(dot_dotdot)), MSDOS_DOT_NAME,
15250: e59f3110 ldr r3, [pc, #272] ; 15368 <msdos_creat_node+0x364>
15254: e3a0200b mov r2, #11
15258: e5931000 ldr r1, [r3]
1525c: e28d0014 add r0, sp, #20
15260: eb001027 bl 19304 <memcpy>
MSDOS_NAME_MAX);
memcpy(MSDOS_DIR_NAME(DOTDOT_NODE_P(dot_dotdot)), MSDOS_DOTDOT_NAME,
15264: e59f3100 ldr r3, [pc, #256] ; 1536c <msdos_creat_node+0x368>
15268: e28d0034 add r0, sp, #52 ; 0x34
1526c: e5931000 ldr r1, [r3]
15270: e3a0200b mov r2, #11
15274: eb001022 bl 19304 <memcpy>
/*
* here we can ommit FAT32 condition because for all FAT types dirs
* right under root dir should contain 0 in dotdot entry but for
* FAT12/16 parent_fat_fd->cluster_num always contains such value
*/
if ((FAT_FD_OF_ROOT_DIR(parent_fat_fd)) &&
15278: e59a3020 ldr r3, [sl, #32]
1527c: e3530001 cmp r3, #1
15280: 1a000007 bne 152a4 <msdos_creat_node+0x2a0>
15284: e59a3024 ldr r3, [sl, #36] ; 0x24
15288: e3530000 cmp r3, #0
1528c: 1a000004 bne 152a4 <msdos_creat_node+0x2a0>
(fs_info->fat.vol.type & FAT_FAT32))
15290: e5d4300e ldrb r3, [r4, #14]
/*
* here we can ommit FAT32 condition because for all FAT types dirs
* right under root dir should contain 0 in dotdot entry but for
* FAT12/16 parent_fat_fd->cluster_num always contains such value
*/
if ((FAT_FD_OF_ROOT_DIR(parent_fat_fd)) &&
15294: e3130004 tst r3, #4
(fs_info->fat.vol.type & FAT_FAT32))
{
*MSDOS_DIR_FIRST_CLUSTER_LOW(DOTDOT_NODE_P(dot_dotdot)) = 0x0000;
15298: 11cd64be strhne r6, [sp, #78] ; 0x4e
*MSDOS_DIR_FIRST_CLUSTER_HI(DOTDOT_NODE_P(dot_dotdot)) = 0x0000;
1529c: 11cd64b8 strhne r6, [sp, #72] ; 0x48
/*
* here we can ommit FAT32 condition because for all FAT types dirs
* right under root dir should contain 0 in dotdot entry but for
* FAT12/16 parent_fat_fd->cluster_num always contains such value
*/
if ((FAT_FD_OF_ROOT_DIR(parent_fat_fd)) &&
152a0: 1a000003 bne 152b4 <msdos_creat_node+0x2b0>
*MSDOS_DIR_FIRST_CLUSTER_HI(DOTDOT_NODE_P(dot_dotdot)) = 0x0000;
}
else
{
*MSDOS_DIR_FIRST_CLUSTER_LOW(DOTDOT_NODE_P(dot_dotdot)) =
CT_LE_W((uint16_t )((parent_fat_fd->cln) & 0x0000FFFF));
152a4: e59a301c ldr r3, [sl, #28]
152a8: e1cd34be strh r3, [sp, #78] ; 0x4e
*MSDOS_DIR_FIRST_CLUSTER_HI(DOTDOT_NODE_P(dot_dotdot)) =
CT_LE_W((uint16_t )(((parent_fat_fd->cln) & 0xFFFF0000)>>16));
152ac: e1a03823 lsr r3, r3, #16
152b0: e1cd34b8 strh r3, [sp, #72] ; 0x48
* correspondes to a new node is zero length, so it will be extended
* by one cluster and entries will be written
*/
ret = fat_file_write(&fs_info->fat, fat_fd, 0,
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE * 2,
(uint8_t *)dot_dotdot);
152b4: e28d5014 add r5, sp, #20
/*
* write dot and dotdot entries to new fat-file: currently fat-file
* correspondes to a new node is zero length, so it will be extended
* by one cluster and entries will be written
*/
ret = fat_file_write(&fs_info->fat, fat_fd, 0,
152b8: e1a00004 mov r0, r4
152bc: e1a01008 mov r1, r8
152c0: e3a02000 mov r2, #0
152c4: e3a03040 mov r3, #64 ; 0x40
152c8: e58d5000 str r5, [sp]
152cc: ebffed66 bl 1086c <fat_file_write>
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE * 2,
(uint8_t *)dot_dotdot);
if (ret < 0)
152d0: e3500000 cmp r0, #0
152d4: ba000018 blt 1533c <msdos_creat_node+0x338>
rc = -1;
goto error;
}
/* increment fat-file size by cluster size */
fat_fd->fat_file_size += fs_info->fat.vol.bpc;
152d8: e59d10a4 ldr r1, [sp, #164] ; 0xa4
152dc: e1d430b6 ldrh r3, [r4, #6]
152e0: e5912018 ldr r2, [r1, #24]
152e4: e0823003 add r3, r2, r3
152e8: e5813018 str r3, [r1, #24]
/* set up cluster num for dot entry */
*MSDOS_DIR_FIRST_CLUSTER_LOW(DOT_NODE_P(dot_dotdot)) =
CT_LE_W((uint16_t )((fat_fd->cln) & 0x0000FFFF));
152ec: e591301c ldr r3, [r1, #28]
152f0: e1cd32be strh r3, [sp, #46] ; 0x2e
*MSDOS_DIR_FIRST_CLUSTER_HI(DOT_NODE_P(dot_dotdot)) =
CT_LE_W((uint16_t )(((fat_fd->cln) & 0xFFFF0000) >> 16));
152f4: e1a03823 lsr r3, r3, #16
152f8: e1cd32b8 strh r3, [sp, #40] ; 0x28
/* rewrite dot entry */
ret = fat_file_write(&fs_info->fat, fat_fd, 0,
152fc: e1a00004 mov r0, r4
15300: e3a02000 mov r2, #0
15304: e3a03020 mov r3, #32
15308: e58d5000 str r5, [sp]
1530c: ebffed56 bl 1086c <fat_file_write>
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE,
(uint8_t *)DOT_NODE_P(dot_dotdot));
if (ret < 0)
15310: e3500000 cmp r0, #0
15314: ba000008 blt 1533c <msdos_creat_node+0x338>
rc = -1;
goto error;
}
/* write first cluster num of a new directory to disk */
rc = msdos_set_first_cluster_num(parent_loc->mt_entry, fat_fd);
15318: e5970014 ldr r0, [r7, #20]
1531c: e59d10a4 ldr r1, [sp, #164] ; 0xa4
15320: eb00010f bl 15764 <msdos_set_first_cluster_num>
if (rc != RC_OK)
15324: e2508000 subs r8, r0, #0
15328: 1a000004 bne 15340 <msdos_creat_node+0x33c>
goto error;
fat_file_close(&fs_info->fat, fat_fd);
1532c: e1a00004 mov r0, r4
15330: e59d10a4 ldr r1, [sp, #164] ; 0xa4
15334: ebffec6d bl 104f0 <fat_file_close>
15338: ea000007 b 1535c <msdos_creat_node+0x358>
ret = fat_file_write(&fs_info->fat, fat_fd, 0,
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE,
(uint8_t *)DOT_NODE_P(dot_dotdot));
if (ret < 0)
{
rc = -1;
1533c: e3e08000 mvn r8, #0 <== NOT EXECUTED
fat_file_close(&fs_info->fat, fat_fd);
}
return RC_OK;
error:
fat_file_close(&fs_info->fat, fat_fd);
15340: e1a00004 mov r0, r4 <== NOT EXECUTED
15344: e59d10a4 ldr r1, [sp, #164] ; 0xa4 <== NOT EXECUTED
15348: ebffec68 bl 104f0 <fat_file_close> <== NOT EXECUTED
err:
/* mark the used 32bytes structure on the disk as free */
msdos_set_first_char4file_name(parent_loc->mt_entry, &dir_pos, 0xE5);
1534c: e5970014 ldr r0, [r7, #20] <== NOT EXECUTED
15350: e28d1094 add r1, sp, #148 ; 0x94 <== NOT EXECUTED
15354: e3a020e5 mov r2, #229 ; 0xe5 <== NOT EXECUTED
15358: eb000141 bl 15864 <msdos_set_first_char4file_name> <== NOT EXECUTED
return rc;
}
1535c: e1a00008 mov r0, r8
15360: e28dd0ac add sp, sp, #172 ; 0xac
15364: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00017af8 <msdos_date_dos2unix>:
uint32_t y, year;
uint32_t days;
uint16_t *months;
seconds = 2 * ((dt & MSDOS_DT_2SECONDS_MASK) >> MSDOS_DT_2SECONDS_SHIFT)
+ ((dt & MSDOS_DT_MINUTES_MASK) >> MSDOS_DT_MINUTES_SHIFT) * 60
17af8: e2012e7e and r2, r1, #2016 ; 0x7e0
17afc: e3a0301e mov r3, #30
17b00: e1a022a2 lsr r2, r2, #5
17b04: e0020293 mul r2, r3, r2
+ ((dt & MSDOS_DT_HOURS_MASK) >> MSDOS_DT_HOURS_SHIFT) * 3600;
17b08: e201cb3e and ip, r1, #63488 ; 0xf800
17b0c: e59f30d8 ldr r3, [pc, #216] ; 17bec <msdos_date_dos2unix+0xf4>
17b10: e1a0c5ac lsr ip, ip, #11
17b14: e023239c mla r3, ip, r3, r2
uint32_t m, month;
uint32_t y, year;
uint32_t days;
uint16_t *months;
seconds = 2 * ((dt & MSDOS_DT_2SECONDS_MASK) >> MSDOS_DT_2SECONDS_SHIFT)
17b18: e201101f and r1, r1, #31
+ ((dt & MSDOS_DT_MINUTES_MASK) >> MSDOS_DT_MINUTES_SHIFT) * 60
+ ((dt & MSDOS_DT_HOURS_MASK) >> MSDOS_DT_HOURS_SHIFT) * 3600;
17b1c: e0831001 add r1, r3, r1
/*
* If the year, month, and day from the last conversion are the
* same then use the saved value.
*/
if (lastdosdate != dd) {
17b20: e59f30c8 ldr r3, [pc, #200] ; 17bf0 <msdos_date_dos2unix+0xf8>
17b24: e1d320be ldrh r2, [r3, #14]
17b28: e1520000 cmp r2, r0
* called from the stat(), and fstat() system calls and so probably need
* not be too efficient.
*/
unsigned int
msdos_date_dos2unix(unsigned int dd, unsigned int dt)
{
17b2c: e92d40f0 push {r4, r5, r6, r7, lr}
uint32_t m, month;
uint32_t y, year;
uint32_t days;
uint16_t *months;
seconds = 2 * ((dt & MSDOS_DT_2SECONDS_MASK) >> MSDOS_DT_2SECONDS_SHIFT)
17b30: e1a01081 lsl r1, r1, #1
+ ((dt & MSDOS_DT_HOURS_MASK) >> MSDOS_DT_HOURS_SHIFT) * 3600;
/*
* If the year, month, and day from the last conversion are the
* same then use the saved value.
*/
if (lastdosdate != dd) {
17b34: 0a000028 beq 17bdc <msdos_date_dos2unix+0xe4>
lastdosdate = dd;
17b38: e1c300be strh r0, [r3, #14]
days = 0;
year = (dd & MSDOS_DD_YEAR_MASK) >> MSDOS_DD_YEAR_SHIFT;
17b3c: e2007cfe and r7, r0, #65024 ; 0xfe00
* If the year, month, and day from the last conversion are the
* same then use the saved value.
*/
if (lastdosdate != dd) {
lastdosdate = dd;
days = 0;
17b40: e3a03000 mov r3, #0
year = (dd & MSDOS_DD_YEAR_MASK) >> MSDOS_DD_YEAR_SHIFT;
17b44: e1a074a7 lsr r7, r7, #9
for (y = 0; y < year; y++)
17b48: e1a02003 mov r2, r3
days += y & 0x03 ? 365 : 366;
17b4c: e59f60a0 ldr r6, [pc, #160] ; 17bf4 <msdos_date_dos2unix+0xfc>
17b50: e59f50a0 ldr r5, [pc, #160] ; 17bf8 <msdos_date_dos2unix+0x100>
*/
if (lastdosdate != dd) {
lastdosdate = dd;
days = 0;
year = (dd & MSDOS_DD_YEAR_MASK) >> MSDOS_DD_YEAR_SHIFT;
for (y = 0; y < year; y++)
17b54: ea000004 b 17b6c <msdos_date_dos2unix+0x74>
days += y & 0x03 ? 365 : 366;
17b58: e3540000 cmp r4, #0
17b5c: 01a04006 moveq r4, r6
17b60: 11a04005 movne r4, r5
17b64: e0833004 add r3, r3, r4
*/
if (lastdosdate != dd) {
lastdosdate = dd;
days = 0;
year = (dd & MSDOS_DD_YEAR_MASK) >> MSDOS_DD_YEAR_SHIFT;
for (y = 0; y < year; y++)
17b68: e2822001 add r2, r2, #1
17b6c: e1520007 cmp r2, r7
17b70: e2024003 and r4, r2, #3
17b74: 1afffff7 bne 17b58 <msdos_date_dos2unix+0x60>
months = year & 0x03 ? regyear : leapyear;
/*
* Prevent going from 0 to 0xffffffff in the following
* loop.
*/
month = (dd & MSDOS_DD_MONTH_MASK) >> MSDOS_DD_MONTH_SHIFT;
17b78: e2002e1e and r2, r0, #480 ; 0x1e0
if (month == 0) {
month = 1;
17b7c: e3520000 cmp r2, #0
17b80: 11a052a2 lsrne r5, r2, #5
/*
* Prevent going from 0 to 0xffffffff in the following
* loop.
*/
month = (dd & MSDOS_DD_MONTH_MASK) >> MSDOS_DD_MONTH_SHIFT;
if (month == 0) {
17b84: e59f2070 ldr r2, [pc, #112] ; 17bfc <msdos_date_dos2unix+0x104>
month = 1;
17b88: 03a05001 moveq r5, #1
/*
* Prevent going from 0 to 0xffffffff in the following
* loop.
*/
month = (dd & MSDOS_DD_MONTH_MASK) >> MSDOS_DD_MONTH_SHIFT;
if (month == 0) {
17b8c: e3540000 cmp r4, #0
17b90: e282c018 add ip, r2, #24
month = 1;
}
for (m = 0; m < month - 1; m++)
17b94: e2454001 sub r4, r5, #1
/*
* Prevent going from 0 to 0xffffffff in the following
* loop.
*/
month = (dd & MSDOS_DD_MONTH_MASK) >> MSDOS_DD_MONTH_SHIFT;
if (month == 0) {
17b98: 11a0c002 movne ip, r2
month = 1;
}
for (m = 0; m < month - 1; m++)
17b9c: e3a02000 mov r2, #0
17ba0: ea000002 b 17bb0 <msdos_date_dos2unix+0xb8>
days += months[m];
17ba4: e0dc50b2 ldrh r5, [ip], #2 <== NOT EXECUTED
*/
month = (dd & MSDOS_DD_MONTH_MASK) >> MSDOS_DD_MONTH_SHIFT;
if (month == 0) {
month = 1;
}
for (m = 0; m < month - 1; m++)
17ba8: e2822001 add r2, r2, #1 <== NOT EXECUTED
days += months[m];
17bac: e0833005 add r3, r3, r5 <== NOT EXECUTED
*/
month = (dd & MSDOS_DD_MONTH_MASK) >> MSDOS_DD_MONTH_SHIFT;
if (month == 0) {
month = 1;
}
for (m = 0; m < month - 1; m++)
17bb0: e1520004 cmp r2, r4
17bb4: 3afffffa bcc 17ba4 <msdos_date_dos2unix+0xac>
days += months[m];
days += ((dd & MSDOS_DD_DAY_MASK) >> MSDOS_DD_DAY_SHIFT) - 1;
17bb8: e200001f and r0, r0, #31
lastseconds = (days + DAYSTO1980) * SECONDSPERDAY;
17bbc: e59f203c ldr r2, [pc, #60] ; 17c00 <msdos_date_dos2unix+0x108>
if (month == 0) {
month = 1;
}
for (m = 0; m < month - 1; m++)
days += months[m];
days += ((dd & MSDOS_DD_DAY_MASK) >> MSDOS_DD_DAY_SHIFT) - 1;
17bc0: e2400001 sub r0, r0, #1
17bc4: e0803003 add r3, r0, r3
lastseconds = (days + DAYSTO1980) * SECONDSPERDAY;
17bc8: e0030392 mul r3, r2, r3
17bcc: e59f2030 ldr r2, [pc, #48] ; 17c04 <msdos_date_dos2unix+0x10c>
17bd0: e0832002 add r2, r3, r2
17bd4: e59f3014 ldr r3, [pc, #20] ; 17bf0 <msdos_date_dos2unix+0xf8>
17bd8: e5832010 str r2, [r3, #16]
}
return seconds + lastseconds;
17bdc: e59f300c ldr r3, [pc, #12] ; 17bf0 <msdos_date_dos2unix+0xf8>
17be0: e5933010 ldr r3, [r3, #16]
}
17be4: e0810003 add r0, r1, r3
17be8: e8bd80f0 pop {r4, r5, r6, r7, pc}
000179bc <msdos_date_unix2dos>:
* file timestamps. The passed in unix time is assumed to be in GMT.
*/
void
msdos_date_unix2dos(unsigned int t, uint16_t *ddp,
uint16_t *dtp)
{
179bc: e92d41f0 push {r4, r5, r6, r7, r8, lr}
/*
* If the time from the last conversion is the same as now, then
* skip the computations and use the saved result.
*/
if (lasttime != t) {
179c0: e59f6114 ldr r6, [pc, #276] ; 17adc <msdos_date_unix2dos+0x120>
179c4: e5963000 ldr r3, [r6]
179c8: e1530000 cmp r3, r0
* file timestamps. The passed in unix time is assumed to be in GMT.
*/
void
msdos_date_unix2dos(unsigned int t, uint16_t *ddp,
uint16_t *dtp)
{
179cc: e1a04000 mov r4, r0
179d0: e1a05001 mov r5, r1
179d4: e1a07002 mov r7, r2
/*
* If the time from the last conversion is the same as now, then
* skip the computations and use the saved result.
*/
if (lasttime != t) {
179d8: 0a000039 beq 17ac4 <msdos_date_unix2dos+0x108>
lasttime = t;
lastdtime = (((t % 60) >> 1) << MSDOS_DT_2SECONDS_SHIFT)
+ (((t / 60) % 60) << MSDOS_DT_MINUTES_SHIFT)
179dc: e3a0103c mov r1, #60 ; 0x3c
/*
* If the time from the last conversion is the same as now, then
* skip the computations and use the saved result.
*/
if (lasttime != t) {
lasttime = t;
179e0: e5860000 str r0, [r6]
lastdtime = (((t % 60) >> 1) << MSDOS_DT_2SECONDS_SHIFT)
+ (((t / 60) % 60) << MSDOS_DT_MINUTES_SHIFT)
179e4: ebffa89d bl 1c60 <__aeabi_uidiv>
179e8: e3a0103c mov r1, #60 ; 0x3c
179ec: ebffa8e1 bl 1d78 <__umodsi3>
+ (((t / 3600) % 24) << MSDOS_DT_HOURS_SHIFT);
179f0: e3a01ee1 mov r1, #3600 ; 0xe10
* If the time from the last conversion is the same as now, then
* skip the computations and use the saved result.
*/
if (lasttime != t) {
lasttime = t;
lastdtime = (((t % 60) >> 1) << MSDOS_DT_2SECONDS_SHIFT)
179f4: e1a08280 lsl r8, r0, #5
+ (((t / 60) % 60) << MSDOS_DT_MINUTES_SHIFT)
+ (((t / 3600) % 24) << MSDOS_DT_HOURS_SHIFT);
179f8: e1a00004 mov r0, r4
179fc: ebffa897 bl 1c60 <__aeabi_uidiv>
17a00: e3a01018 mov r1, #24
17a04: ebffa8db bl 1d78 <__umodsi3>
* If the time from the last conversion is the same as now, then
* skip the computations and use the saved result.
*/
if (lasttime != t) {
lasttime = t;
lastdtime = (((t % 60) >> 1) << MSDOS_DT_2SECONDS_SHIFT)
17a08: e3a0103c mov r1, #60 ; 0x3c
17a0c: e0888580 add r8, r8, r0, lsl #11
17a10: e1a00004 mov r0, r4
17a14: ebffa8d7 bl 1d78 <__umodsi3>
17a18: e08800a0 add r0, r8, r0, lsr #1
17a1c: e1c600b4 strh r0, [r6, #4]
/*
* If the number of days since 1970 is the same as the last
* time we did the computation then skip all this leap year
* and month stuff.
*/
days = t / (SECONDSPERDAY);
17a20: e59f10b8 ldr r1, [pc, #184] ; 17ae0 <msdos_date_unix2dos+0x124>
17a24: e1a00004 mov r0, r4
17a28: ebffa88c bl 1c60 <__aeabi_uidiv>
if (days != lastday) {
17a2c: e5963008 ldr r3, [r6, #8]
17a30: e1500003 cmp r0, r3
17a34: 0a000022 beq 17ac4 <msdos_date_unix2dos+0x108>
lastday = days;
17a38: e5860008 str r0, [r6, #8]
for (year = 1970;; year++) {
17a3c: e59f30a0 ldr r3, [pc, #160] ; 17ae4 <msdos_date_unix2dos+0x128>
inc = year & 0x03 ? 365 : 366;
17a40: e59f40a0 ldr r4, [pc, #160] ; 17ae8 <msdos_date_unix2dos+0x12c>
17a44: e59f10a0 ldr r1, [pc, #160] ; 17aec <msdos_date_unix2dos+0x130>
17a48: e213c003 ands ip, r3, #3
17a4c: 01a02004 moveq r2, r4
17a50: 11a02001 movne r2, r1
if (days < inc)
17a54: e1500002 cmp r0, r2
break;
days -= inc;
17a58: 20620000 rsbcs r0, r2, r0
* and month stuff.
*/
days = t / (SECONDSPERDAY);
if (days != lastday) {
lastday = days;
for (year = 1970;; year++) {
17a5c: 22833001 addcs r3, r3, #1
inc = year & 0x03 ? 365 : 366;
if (days < inc)
break;
days -= inc;
}
17a60: 2afffff8 bcs 17a48 <msdos_date_unix2dos+0x8c>
months = year & 0x03 ? regyear : leapyear;
17a64: e59f2084 ldr r2, [pc, #132] ; 17af0 <msdos_date_unix2dos+0x134>
17a68: e35c0000 cmp ip, #0
17a6c: e2821018 add r1, r2, #24
17a70: 11a01002 movne r1, r2
for (month = 0; month < 12; month++) {
17a74: e3a02000 mov r2, #0
if (days < months[month])
17a78: e0d1c0b2 ldrh ip, [r1], #2
17a7c: e150000c cmp r0, ip
17a80: 3a000003 bcc 17a94 <msdos_date_unix2dos+0xd8>
if (days < inc)
break;
days -= inc;
}
months = year & 0x03 ? regyear : leapyear;
for (month = 0; month < 12; month++) {
17a84: e2822001 add r2, r2, #1 <== NOT EXECUTED
17a88: e352000c cmp r2, #12 <== NOT EXECUTED
if (days < months[month])
break;
days -= months[month];
17a8c: e06c0000 rsb r0, ip, r0 <== NOT EXECUTED
if (days < inc)
break;
days -= inc;
}
months = year & 0x03 ? regyear : leapyear;
for (month = 0; month < 12; month++) {
17a90: 1afffff8 bne 17a78 <msdos_date_unix2dos+0xbc> <== NOT EXECUTED
if (days < months[month])
break;
days -= months[month];
}
lastddate = ((days + 1) << MSDOS_DD_DAY_SHIFT)
17a94: e0802282 add r2, r0, r2, lsl #5
* Remember dos's idea of time is relative to 1980.
* unix's is relative to 1970. If somehow we get a
* time before 1980 then don't give totally crazy
* results.
*/
if (year > 1980)
17a98: e59f0054 ldr r0, [pc, #84] ; 17af4 <msdos_date_unix2dos+0x138>
for (month = 0; month < 12; month++) {
if (days < months[month])
break;
days -= months[month];
}
lastddate = ((days + 1) << MSDOS_DD_DAY_SHIFT)
17a9c: e2822021 add r2, r2, #33 ; 0x21
* Remember dos's idea of time is relative to 1980.
* unix's is relative to 1970. If somehow we get a
* time before 1980 then don't give totally crazy
* results.
*/
if (year > 1980)
17aa0: e1530000 cmp r3, r0
lastddate += (year - 1980) <<
17aa4: 82433e7b subhi r3, r3, #1968 ; 0x7b0
for (month = 0; month < 12; month++) {
if (days < months[month])
break;
days -= months[month];
}
lastddate = ((days + 1) << MSDOS_DD_DAY_SHIFT)
17aa8: e1a02802 lsl r2, r2, #16
17aac: e1a02822 lsr r2, r2, #16
17ab0: e59f1024 ldr r1, [pc, #36] ; 17adc <msdos_date_unix2dos+0x120>
* unix's is relative to 1970. If somehow we get a
* time before 1980 then don't give totally crazy
* results.
*/
if (year > 1980)
lastddate += (year - 1980) <<
17ab4: 8243300c subhi r3, r3, #12
17ab8: 80823483 addhi r3, r2, r3, lsl #9
for (month = 0; month < 12; month++) {
if (days < months[month])
break;
days -= months[month];
}
lastddate = ((days + 1) << MSDOS_DD_DAY_SHIFT)
17abc: e1c120bc strh r2, [r1, #12]
* unix's is relative to 1970. If somehow we get a
* time before 1980 then don't give totally crazy
* results.
*/
if (year > 1980)
lastddate += (year - 1980) <<
17ac0: 81c130bc strhhi r3, [r1, #12]
MSDOS_DD_YEAR_SHIFT;
}
}
*dtp = lastdtime;
17ac4: e59f3010 ldr r3, [pc, #16] ; 17adc <msdos_date_unix2dos+0x120>
17ac8: e1d320b4 ldrh r2, [r3, #4]
*ddp = lastddate;
17acc: e1d330bc ldrh r3, [r3, #12]
if (year > 1980)
lastddate += (year - 1980) <<
MSDOS_DD_YEAR_SHIFT;
}
}
*dtp = lastdtime;
17ad0: e1c720b0 strh r2, [r7]
*ddp = lastddate;
17ad4: e1c530b0 strh r3, [r5]
}
17ad8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
00015968 <msdos_dir_is_empty>:
msdos_dir_is_empty(
rtems_filesystem_mount_table_entry_t *mt_entry,
fat_file_fd_t *fat_fd,
bool *ret_val
)
{
15968: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
ssize_t ret = 0;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t j = 0, i = 0;
/* dir is not empty */
*ret_val = false;
1596c: e3a06000 mov r6, #0
fat_file_fd_t *fat_fd,
bool *ret_val
)
{
ssize_t ret = 0;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
15970: e5904008 ldr r4, [r0, #8]
msdos_dir_is_empty(
rtems_filesystem_mount_table_entry_t *mt_entry,
fat_file_fd_t *fat_fd,
bool *ret_val
)
{
15974: e1a0b001 mov fp, r1
15978: e1a05002 mov r5, r2
ssize_t ret = 0;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t j = 0, i = 0;
/* dir is not empty */
*ret_val = false;
1597c: e5c26000 strb r6, [r2]
while ((ret = fat_file_read(&fs_info->fat, fat_fd, j * fs_info->fat.vol.bps,
15980: ea00002a b 15a30 <msdos_dir_is_empty+0xc8>
fs_info->fat.vol.bps,
fs_info->cl_buf)) != FAT_EOF)
{
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
15984: e350001f cmp r0, #31
15988: da000034 ble 15a60 <msdos_dir_is_empty+0xf8>
return -1;
assert(ret == fs_info->fat.vol.bps);
1598c: e1d490b0 ldrh r9, [r4]
15990: e1500009 cmp r0, r9
15994: 0a000021 beq 15a20 <msdos_dir_is_empty+0xb8>
15998: e59f00d0 ldr r0, [pc, #208] ; 15a70 <msdos_dir_is_empty+0x108><== NOT EXECUTED
1599c: e59f10d0 ldr r1, [pc, #208] ; 15a74 <msdos_dir_is_empty+0x10c><== NOT EXECUTED
159a0: e59f20d0 ldr r2, [pc, #208] ; 15a78 <msdos_dir_is_empty+0x110><== NOT EXECUTED
159a4: e59f30d0 ldr r3, [pc, #208] ; 15a7c <msdos_dir_is_empty+0x114><== NOT EXECUTED
159a8: ebfff25f bl 1232c <__assert_func> <== NOT EXECUTED
/* have to look at the DIR_NAME as "raw" 8-bit data */
for (i = 0;
i < fs_info->fat.vol.bps;
i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + i;
159ac: e59430a0 ldr r3, [r4, #160] ; 0xa0
* then consider it as empty.
*
* Just ignore long file name entries. They must have a short entry to
* be valid.
*/
if (((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
159b0: e7d38007 ldrb r8, [r3, r7]
159b4: e35800e5 cmp r8, #229 ; 0xe5
/* have to look at the DIR_NAME as "raw" 8-bit data */
for (i = 0;
i < fs_info->fat.vol.bps;
i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + i;
159b8: e083a007 add sl, r3, r7
* then consider it as empty.
*
* Just ignore long file name entries. They must have a short entry to
* be valid.
*/
if (((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
159bc: 0a00000f beq 15a00 <msdos_dir_is_empty+0x98>
MSDOS_THIS_DIR_ENTRY_EMPTY) ||
((*MSDOS_DIR_ATTR(entry) & MSDOS_ATTR_LFN_MASK) ==
159c0: e5da300b ldrb r3, [sl, #11]
159c4: e203303f and r3, r3, #63 ; 0x3f
*
* Just ignore long file name entries. They must have a short entry to
* be valid.
*/
if (((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
MSDOS_THIS_DIR_ENTRY_EMPTY) ||
159c8: e353000f cmp r3, #15
159cc: 0a00000b beq 15a00 <msdos_dir_is_empty+0x98>
((*MSDOS_DIR_ATTR(entry) & MSDOS_ATTR_LFN_MASK) ==
MSDOS_ATTR_LFN) ||
(strncmp(MSDOS_DIR_NAME((entry)), MSDOS_DOT_NAME,
159d0: e1a0000a mov r0, sl
159d4: e59f10a4 ldr r1, [pc, #164] ; 15a80 <msdos_dir_is_empty+0x118>
159d8: e3a0200b mov r2, #11
159dc: eb0014f7 bl 1adc0 <strncmp>
* be valid.
*/
if (((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
MSDOS_THIS_DIR_ENTRY_EMPTY) ||
((*MSDOS_DIR_ATTR(entry) & MSDOS_ATTR_LFN_MASK) ==
MSDOS_ATTR_LFN) ||
159e0: e3500000 cmp r0, #0
159e4: 0a000005 beq 15a00 <msdos_dir_is_empty+0x98>
(strncmp(MSDOS_DIR_NAME((entry)), MSDOS_DOT_NAME,
MSDOS_SHORT_NAME_LEN) == 0) ||
(strncmp(MSDOS_DIR_NAME((entry)),
159e8: e1a0000a mov r0, sl
159ec: e59f1090 ldr r1, [pc, #144] ; 15a84 <msdos_dir_is_empty+0x11c>
159f0: e3a0200b mov r2, #11
159f4: eb0014f1 bl 1adc0 <strncmp>
if (((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
MSDOS_THIS_DIR_ENTRY_EMPTY) ||
((*MSDOS_DIR_ATTR(entry) & MSDOS_ATTR_LFN_MASK) ==
MSDOS_ATTR_LFN) ||
(strncmp(MSDOS_DIR_NAME((entry)), MSDOS_DOT_NAME,
MSDOS_SHORT_NAME_LEN) == 0) ||
159f8: e3500000 cmp r0, #0
159fc: 1a000001 bne 15a08 <msdos_dir_is_empty+0xa0>
assert(ret == fs_info->fat.vol.bps);
/* have to look at the DIR_NAME as "raw" 8-bit data */
for (i = 0;
i < fs_info->fat.vol.bps;
i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
15a00: e2877020 add r7, r7, #32
15a04: ea000006 b 15a24 <msdos_dir_is_empty+0xbc>
continue;
/*
* Nothing more to look at.
*/
if ((*MSDOS_DIR_NAME(entry)) ==
15a08: e3580000 cmp r8, #0
MSDOS_THIS_DIR_ENTRY_AND_REST_EMPTY)
{
*ret_val = true;
15a0c: 03a03001 moveq r3, #1
15a10: 05c53000 strbeq r3, [r5]
return RC_OK;
15a14: 01a00008 moveq r0, r8
continue;
/*
* Nothing more to look at.
*/
if ((*MSDOS_DIR_NAME(entry)) ==
15a18: 0a000013 beq 15a6c <msdos_dir_is_empty+0x104>
15a1c: ea000011 b 15a68 <msdos_dir_is_empty+0x100>
fs_info->cl_buf)) != FAT_EOF)
{
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
return -1;
assert(ret == fs_info->fat.vol.bps);
15a20: e3a07000 mov r7, #0
/* have to look at the DIR_NAME as "raw" 8-bit data */
for (i = 0;
15a24: e1570009 cmp r7, r9
15a28: 3affffdf bcc 159ac <msdos_dir_is_empty+0x44>
/*
* Short file name entries mean not empty.
*/
return RC_OK;
}
j++;
15a2c: e2866001 add r6, r6, #1 <== NOT EXECUTED
uint32_t j = 0, i = 0;
/* dir is not empty */
*ret_val = false;
while ((ret = fat_file_read(&fs_info->fat, fat_fd, j * fs_info->fat.vol.bps,
15a30: e1d430b0 ldrh r3, [r4]
15a34: e59420a0 ldr r2, [r4, #160] ; 0xa0
15a38: e1a00004 mov r0, r4
15a3c: e58d2000 str r2, [sp]
15a40: e1a0100b mov r1, fp
15a44: e0020693 mul r2, r3, r6
15a48: ebffea03 bl 1025c <fat_file_read>
15a4c: e3500000 cmp r0, #0
15a50: 1affffcb bne 15984 <msdos_dir_is_empty+0x1c>
*/
return RC_OK;
}
j++;
}
*ret_val = true;
15a54: e3a03001 mov r3, #1 <== NOT EXECUTED
15a58: e5c53000 strb r3, [r5] <== NOT EXECUTED
return RC_OK;
15a5c: ea000002 b 15a6c <msdos_dir_is_empty+0x104> <== NOT EXECUTED
while ((ret = fat_file_read(&fs_info->fat, fat_fd, j * fs_info->fat.vol.bps,
fs_info->fat.vol.bps,
fs_info->cl_buf)) != FAT_EOF)
{
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
return -1;
15a60: e3e00000 mvn r0, #0 <== NOT EXECUTED
15a64: ea000000 b 15a6c <msdos_dir_is_empty+0x104> <== NOT EXECUTED
}
/*
* Short file name entries mean not empty.
*/
return RC_OK;
15a68: e3a00000 mov r0, #0
}
j++;
}
*ret_val = true;
return RC_OK;
}
15a6c: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
00017d6c <msdos_dir_read>:
* the number of bytes read on success, or -1 if error occured (errno
* set apropriately).
*/
ssize_t
msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
{
17d6c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
17d70: e5903024 ldr r3, [r0, #36] ; 0x24 <== NOT EXECUTED
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
17d74: e590a018 ldr sl, [r0, #24] <== NOT EXECUTED
* the number of bytes read on success, or -1 if error occured (errno
* set apropriately).
*/
ssize_t
msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
{
17d78: e24ddf55 sub sp, sp, #340 ; 0x154 <== NOT EXECUTED
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
17d7c: e5934008 ldr r4, [r3, #8] <== NOT EXECUTED
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
fat_file_fd_t *tmp_fat_fd = NULL;
17d80: e3a03000 mov r3, #0 <== NOT EXECUTED
17d84: e58d314c str r3, [sp, #332] ; 0x14c <== NOT EXECUTED
uint32_t start = 0;
ssize_t ret = 0;
uint32_t cmpltd = 0;
uint32_t j = 0, i = 0;
uint32_t bts2rd = 0;
uint32_t cur_cln = 0;
17d88: e58d3150 str r3, [sp, #336] ; 0x150 <== NOT EXECUTED
* too, so read such set of sectors is quick operation for low-level IO
* layer.
*/
bts2rd = (FAT_FD_OF_ROOT_DIR(fat_fd) &&
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16))) ?
fat_fd->fat_file_size :
17d8c: e59a3020 ldr r3, [sl, #32] <== NOT EXECUTED
17d90: e3530001 cmp r3, #1 <== NOT EXECUTED
* the number of bytes read on success, or -1 if error occured (errno
* set apropriately).
*/
ssize_t
msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
{
17d94: e58d0010 str r0, [sp, #16] <== NOT EXECUTED
17d98: e58d1028 str r1, [sp, #40] ; 0x28 <== NOT EXECUTED
17d9c: e1a05002 mov r5, r2 <== NOT EXECUTED
/*
* cast start and count - protect against using sizes that are not exact
* multiples of the -dirent- size. These could result in unexpected
* results
*/
start = iop->offset / sizeof(struct dirent);
17da0: e1a0c000 mov ip, r0 <== NOT EXECUTED
17da4: e9900300 ldmib r0, {r8, r9} <== NOT EXECUTED
* too, so read such set of sectors is quick operation for low-level IO
* layer.
*/
bts2rd = (FAT_FD_OF_ROOT_DIR(fat_fd) &&
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16))) ?
fat_fd->fat_file_size :
17da8: 1a000006 bne 17dc8 <msdos_dir_read+0x5c> <== NOT EXECUTED
* optimization: we know that root directory for FAT12/16 volumes is
* sequential set of sectors and any cluster is sequential set of sectors
* too, so read such set of sectors is quick operation for low-level IO
* layer.
*/
bts2rd = (FAT_FD_OF_ROOT_DIR(fat_fd) &&
17dac: e59a3024 ldr r3, [sl, #36] ; 0x24 <== NOT EXECUTED
17db0: e3530000 cmp r3, #0 <== NOT EXECUTED
17db4: 1a000003 bne 17dc8 <msdos_dir_read+0x5c> <== NOT EXECUTED
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16))) ?
17db8: e5d4300e ldrb r3, [r4, #14] <== NOT EXECUTED
* optimization: we know that root directory for FAT12/16 volumes is
* sequential set of sectors and any cluster is sequential set of sectors
* too, so read such set of sectors is quick operation for low-level IO
* layer.
*/
bts2rd = (FAT_FD_OF_ROOT_DIR(fat_fd) &&
17dbc: e3130003 tst r3, #3 <== NOT EXECUTED
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16))) ?
fat_fd->fat_file_size :
17dc0: 159ac018 ldrne ip, [sl, #24] <== NOT EXECUTED
* optimization: we know that root directory for FAT12/16 volumes is
* sequential set of sectors and any cluster is sequential set of sectors
* too, so read such set of sectors is quick operation for low-level IO
* layer.
*/
bts2rd = (FAT_FD_OF_ROOT_DIR(fat_fd) &&
17dc4: 1a000000 bne 17dcc <msdos_dir_read+0x60> <== NOT EXECUTED
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16))) ?
fat_fd->fat_file_size :
17dc8: e1d4c0b6 ldrh ip, [r4, #6] <== NOT EXECUTED
fs_info->fat.vol.bpc;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
17dcc: e3a01000 mov r1, #0 <== NOT EXECUTED
17dd0: e594009c ldr r0, [r4, #156] ; 0x9c <== NOT EXECUTED
17dd4: e1a02001 mov r2, r1 <== NOT EXECUTED
* too, so read such set of sectors is quick operation for low-level IO
* layer.
*/
bts2rd = (FAT_FD_OF_ROOT_DIR(fat_fd) &&
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16))) ?
fat_fd->fat_file_size :
17dd8: e58dc01c str ip, [sp, #28] <== NOT EXECUTED
fs_info->fat.vol.bpc;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
17ddc: ebffc0a7 bl 8080 <rtems_semaphore_obtain> <== NOT EXECUTED
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
17de0: e2506000 subs r6, r0, #0 <== NOT EXECUTED
17de4: 1a00001d bne 17e60 <msdos_dir_read+0xf4> <== NOT EXECUTED
/*
* cast start and count - protect against using sizes that are not exact
* multiples of the -dirent- size. These could result in unexpected
* results
*/
start = iop->offset / sizeof(struct dirent);
17de8: e3a03000 mov r3, #0 <== NOT EXECUTED
17dec: e1a00008 mov r0, r8 <== NOT EXECUTED
17df0: e1a01009 mov r1, r9 <== NOT EXECUTED
17df4: e3a02e11 mov r2, #272 ; 0x110 <== NOT EXECUTED
17df8: ebffa65d bl 1774 <__divdi3> <== NOT EXECUTED
count = (count / sizeof(struct dirent)) * sizeof(struct dirent);
17dfc: e3a01e11 mov r1, #272 ; 0x110 <== NOT EXECUTED
/*
* cast start and count - protect against using sizes that are not exact
* multiples of the -dirent- size. These could result in unexpected
* results
*/
start = iop->offset / sizeof(struct dirent);
17e00: e1a09000 mov r9, r0 <== NOT EXECUTED
count = (count / sizeof(struct dirent)) * sizeof(struct dirent);
17e04: e1a00005 mov r0, r5 <== NOT EXECUTED
17e08: ebffa794 bl 1c60 <__aeabi_uidiv> <== NOT EXECUTED
17e0c: e3a03e11 mov r3, #272 ; 0x110 <== NOT EXECUTED
17e10: e00c0093 mul ip, r3, r0 <== NOT EXECUTED
17e14: e1a05006 mov r5, r6 <== NOT EXECUTED
17e18: e58dc014 str ip, [sp, #20] <== NOT EXECUTED
17e1c: e1a0b006 mov fp, r6 <== NOT EXECUTED
17e20: e58d6018 str r6, [sp, #24] <== NOT EXECUTED
17e24: e3e08000 mvn r8, #0 <== NOT EXECUTED
17e28: e58d600c str r6, [sp, #12] <== NOT EXECUTED
17e2c: ea0000f2 b 181fc <msdos_dir_read+0x490> <== NOT EXECUTED
* fat-file is already opened by open call, so read it
* Always read directory fat-file from the beggining because of MSDOS
* directories feature :( - we should count elements currently
* present in the directory because there may be holes :)
*/
ret = fat_file_read(&fs_info->fat, fat_fd, (j * bts2rd),
17e30: e59430a0 ldr r3, [r4, #160] ; 0xa0 <== NOT EXECUTED
17e34: e1a00004 mov r0, r4 <== NOT EXECUTED
17e38: e58d3000 str r3, [sp] <== NOT EXECUTED
17e3c: e1a0100a mov r1, sl <== NOT EXECUTED
17e40: e1a02006 mov r2, r6 <== NOT EXECUTED
17e44: e59d301c ldr r3, [sp, #28] <== NOT EXECUTED
17e48: ebffe103 bl 1025c <fat_file_read> <== NOT EXECUTED
bts2rd, fs_info->cl_buf);
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
17e4c: e350001f cmp r0, #31 <== NOT EXECUTED
* fat-file is already opened by open call, so read it
* Always read directory fat-file from the beggining because of MSDOS
* directories feature :( - we should count elements currently
* present in the directory because there may be holes :)
*/
ret = fat_file_read(&fs_info->fat, fat_fd, (j * bts2rd),
17e50: e58d0024 str r0, [sp, #36] ; 0x24 <== NOT EXECUTED
bts2rd, fs_info->cl_buf);
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
17e54: ca0000e0 bgt 181dc <msdos_dir_read+0x470> <== NOT EXECUTED
{
rtems_semaphore_release(fs_info->vol_sema);
17e58: e594009c ldr r0, [r4, #156] ; 0x9c <== NOT EXECUTED
17e5c: ebffc0ce bl 819c <rtems_semaphore_release> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one(EIO);
17e60: eb000280 bl 18868 <__errno> <== NOT EXECUTED
17e64: e3a03005 mov r3, #5 <== NOT EXECUTED
17e68: e5803000 str r3, [r0] <== NOT EXECUTED
17e6c: e3e03000 mvn r3, #0 <== NOT EXECUTED
17e70: ea0000e7 b 18214 <msdos_dir_read+0x4a8> <== NOT EXECUTED
}
for (i = 0; i < ret; i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + i;
17e74: e59530a0 ldr r3, [r5, #160] ; 0xa0 <== NOT EXECUTED
17e78: e0834007 add r4, r3, r7 <== NOT EXECUTED
/*
* Is this directory from here on empty ?
*/
if ((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
17e7c: e7d33007 ldrb r3, [r3, r7] <== NOT EXECUTED
17e80: e3530000 cmp r3, #0 <== NOT EXECUTED
17e84: 01a04005 moveq r4, r5 <== NOT EXECUTED
17e88: 0a0000de beq 18208 <msdos_dir_read+0x49c> <== NOT EXECUTED
rtems_semaphore_release(fs_info->vol_sema);
return cmpltd;
}
/* Is the directory entry empty */
if ((*MSDOS_DIR_ENTRY_TYPE(entry)) == MSDOS_THIS_DIR_ENTRY_EMPTY)
17e8c: e35300e5 cmp r3, #229 ; 0xe5 <== NOT EXECUTED
17e90: 0a0000cf beq 181d4 <msdos_dir_read+0x468> <== NOT EXECUTED
continue;
/* Is the directory entry empty a volume label */
if (((*MSDOS_DIR_ATTR(entry)) & MSDOS_ATTR_VOLUME_ID) &&
17e94: e5d4200b ldrb r2, [r4, #11] <== NOT EXECUTED
17e98: e3120008 tst r2, #8 <== NOT EXECUTED
17e9c: e202203f and r2, r2, #63 ; 0x3f <== NOT EXECUTED
17ea0: 0a000001 beq 17eac <msdos_dir_read+0x140> <== NOT EXECUTED
17ea4: e352000f cmp r2, #15 <== NOT EXECUTED
17ea8: 1a0000c9 bne 181d4 <msdos_dir_read+0x468> <== NOT EXECUTED
/*
* Check the attribute to see if the entry is for a long file
* name.
*/
if ((*MSDOS_DIR_ATTR(entry) & MSDOS_ATTR_LFN_MASK) ==
17eac: e352000f cmp r2, #15 <== NOT EXECUTED
17eb0: 1a00002d bne 17f6c <msdos_dir_read+0x200> <== NOT EXECUTED
int q;
/*
* Is this is the first entry of a LFN ?
*/
if (lfn_start == FAT_FILE_SHORT_NAME)
17eb4: e3780001 cmn r8, #1 <== NOT EXECUTED
17eb8: 1a00000a bne 17ee8 <msdos_dir_read+0x17c> <== NOT EXECUTED
{
/*
* The first entry must have the last long entry flag set.
*/
if ((*MSDOS_DIR_ENTRY_TYPE(entry) &
17ebc: e3130040 tst r3, #64 ; 0x40 <== NOT EXECUTED
17ec0: 0a0000c3 beq 181d4 <msdos_dir_read+0x468> <== NOT EXECUTED
* Get the number of entries so we can count down and
* also the checksum of the short entry.
*/
lfn_entries = (*MSDOS_DIR_ENTRY_TYPE(entry) &
MSDOS_LAST_LONG_ENTRY_MASK);
lfn_checksum = *MSDOS_DIR_LFN_CHECKSUM(entry);
17ec4: e5d4c00d ldrb ip, [r4, #13] <== NOT EXECUTED
/*
* Remember the start location of the long file name.
*/
lfn_start =
((j * bts2rd) + i) / MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE;
17ec8: e0878006 add r8, r7, r6 <== NOT EXECUTED
* also the checksum of the short entry.
*/
lfn_entries = (*MSDOS_DIR_ENTRY_TYPE(entry) &
MSDOS_LAST_LONG_ENTRY_MASK);
lfn_checksum = *MSDOS_DIR_LFN_CHECKSUM(entry);
memset (tmp_dirent.d_name, 0, sizeof(tmp_dirent.d_name));
17ecc: e28d003c add r0, sp, #60 ; 0x3c <== NOT EXECUTED
17ed0: e3a01000 mov r1, #0 <== NOT EXECUTED
17ed4: e3a02c01 mov r2, #256 ; 0x100 <== NOT EXECUTED
continue;
/*
* Remember the start location of the long file name.
*/
lfn_start =
17ed8: e1a082a8 lsr r8, r8, #5 <== NOT EXECUTED
/*
* Get the number of entries so we can count down and
* also the checksum of the short entry.
*/
lfn_entries = (*MSDOS_DIR_ENTRY_TYPE(entry) &
17edc: e203b03f and fp, r3, #63 ; 0x3f <== NOT EXECUTED
MSDOS_LAST_LONG_ENTRY_MASK);
lfn_checksum = *MSDOS_DIR_LFN_CHECKSUM(entry);
17ee0: e58dc018 str ip, [sp, #24] <== NOT EXECUTED
memset (tmp_dirent.d_name, 0, sizeof(tmp_dirent.d_name));
17ee4: eb00053c bl 193dc <memset> <== NOT EXECUTED
* If the entry number or the check sum do not match
* forget this series of long directory entries. These could
* be orphaned entries depending on the history of the
* disk.
*/
if ((lfn_entries != (*MSDOS_DIR_ENTRY_TYPE(entry) &
17ee8: e5d43000 ldrb r3, [r4] <== NOT EXECUTED
17eec: e203303f and r3, r3, #63 ; 0x3f <== NOT EXECUTED
17ef0: e15b0003 cmp fp, r3 <== NOT EXECUTED
17ef4: 1a0000b5 bne 181d0 <msdos_dir_read+0x464> <== NOT EXECUTED
MSDOS_LAST_LONG_ENTRY_MASK)) ||
17ef8: e5d4300d ldrb r3, [r4, #13] <== NOT EXECUTED
17efc: e59dc018 ldr ip, [sp, #24] <== NOT EXECUTED
17f00: e153000c cmp r3, ip <== NOT EXECUTED
17f04: 1a0000b1 bne 181d0 <msdos_dir_read+0x464> <== NOT EXECUTED
* The DOS maximum length is 255 characters without the
* trailing nul character. We need to range check the length to
* fit in the directory entry name field.
*/
lfn_entries--;
17f08: e24bb001 sub fp, fp, #1 <== NOT EXECUTED
p = entry + 1;
o = lfn_entries * MSDOS_LFN_LEN_PER_ENTRY;
17f0c: e3a0200d mov r2, #13 <== NOT EXECUTED
17f10: e002029b mul r2, fp, r2 <== NOT EXECUTED
* trailing nul character. We need to range check the length to
* fit in the directory entry name field.
*/
lfn_entries--;
p = entry + 1;
17f14: e2844001 add r4, r4, #1 <== NOT EXECUTED
o = lfn_entries * MSDOS_LFN_LEN_PER_ENTRY;
for (q = 0; q < MSDOS_LFN_LEN_PER_ENTRY; q++)
17f18: e3a03000 mov r3, #0 <== NOT EXECUTED
{
if (o >= (sizeof(tmp_dirent.d_name) - 1))
17f1c: e35200fe cmp r2, #254 ; 0xfe <== NOT EXECUTED
17f20: 8a0000a6 bhi 181c0 <msdos_dir_read+0x454> <== NOT EXECUTED
break;
tmp_dirent.d_name[o++] = *p;
17f24: e5d40000 ldrb r0, [r4] <== NOT EXECUTED
* RETURNS:
* the number of bytes read on success, or -1 if error occured (errno
* set apropriately).
*/
ssize_t
msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
17f28: e28dc02c add ip, sp, #44 ; 0x2c <== NOT EXECUTED
17f2c: e08c1002 add r1, ip, r2 <== NOT EXECUTED
for (q = 0; q < MSDOS_LFN_LEN_PER_ENTRY; q++)
{
if (o >= (sizeof(tmp_dirent.d_name) - 1))
break;
tmp_dirent.d_name[o++] = *p;
17f30: e5c10010 strb r0, [r1, #16] <== NOT EXECUTED
if (*p == '\0')
17f34: e5d41000 ldrb r1, [r4] <== NOT EXECUTED
17f38: e3510000 cmp r1, #0 <== NOT EXECUTED
for (q = 0; q < MSDOS_LFN_LEN_PER_ENTRY; q++)
{
if (o >= (sizeof(tmp_dirent.d_name) - 1))
break;
tmp_dirent.d_name[o++] = *p;
17f3c: e2822001 add r2, r2, #1 <== NOT EXECUTED
if (*p == '\0')
17f40: 0a00009e beq 181c0 <msdos_dir_read+0x454> <== NOT EXECUTED
break;
switch (q)
17f44: e3530004 cmp r3, #4 <== NOT EXECUTED
{
case 4:
p += 5;
17f48: 02844005 addeq r4, r4, #5 <== NOT EXECUTED
tmp_dirent.d_name[o++] = *p;
if (*p == '\0')
break;
switch (q)
17f4c: 0a000002 beq 17f5c <msdos_dir_read+0x1f0> <== NOT EXECUTED
17f50: e353000a cmp r3, #10 <== NOT EXECUTED
break;
case 10:
p += 4;
break;
default:
p += 2;
17f54: 12844002 addne r4, r4, #2 <== NOT EXECUTED
{
case 4:
p += 5;
break;
case 10:
p += 4;
17f58: 02844004 addeq r4, r4, #4 <== NOT EXECUTED
lfn_entries--;
p = entry + 1;
o = lfn_entries * MSDOS_LFN_LEN_PER_ENTRY;
for (q = 0; q < MSDOS_LFN_LEN_PER_ENTRY; q++)
17f5c: e2833001 add r3, r3, #1 <== NOT EXECUTED
17f60: e353000d cmp r3, #13 <== NOT EXECUTED
17f64: 1affffec bne 17f1c <msdos_dir_read+0x1b0> <== NOT EXECUTED
17f68: ea000094 b 181c0 <msdos_dir_read+0x454> <== NOT EXECUTED
fat_dir_pos_t dir_pos;
/*
* Skip active entries until get the entry to start from.
*/
if (start)
17f6c: e3590000 cmp r9, #0 <== NOT EXECUTED
{
lfn_start = FAT_FILE_SHORT_NAME;
start--;
17f70: 12499001 subne r9, r9, #1 <== NOT EXECUTED
fat_dir_pos_t dir_pos;
/*
* Skip active entries until get the entry to start from.
*/
if (start)
17f74: 1a000095 bne 181d0 <msdos_dir_read+0x464> <== NOT EXECUTED
* unfortunately there is no method to extract ino except to
* open fat-file descriptor :( ... so, open it
*/
/* get number of cluster we are working with */
rc = fat_file_ioctl(&fs_info->fat, fat_fd, F_CLU_NUM,
17f78: e28d1e15 add r1, sp, #336 ; 0x150 <== NOT EXECUTED
17f7c: e58d1000 str r1, [sp] <== NOT EXECUTED
17f80: e1a03006 mov r3, r6 <== NOT EXECUTED
17f84: e1a00005 mov r0, r5 <== NOT EXECUTED
17f88: e1a0100a mov r1, sl <== NOT EXECUTED
17f8c: e3a02001 mov r2, #1 <== NOT EXECUTED
17f90: ebffe17e bl 10590 <fat_file_ioctl> <== NOT EXECUTED
j * bts2rd, &cur_cln);
if (rc != RC_OK)
17f94: e2503000 subs r3, r0, #0 <== NOT EXECUTED
17f98: 1a000082 bne 181a8 <msdos_dir_read+0x43c> <== NOT EXECUTED
fat_dir_pos_t *dir_pos
)
{
dir_pos->sname.cln = 0;
dir_pos->sname.ofs = 0;
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
17f9c: e3e03000 mvn r3, #0 <== NOT EXECUTED
17fa0: e58d3144 str r3, [sp, #324] ; 0x144 <== NOT EXECUTED
dir_pos->lname.ofs = FAT_FILE_SHORT_NAME;
17fa4: e58d3148 str r3, [sp, #328] ; 0x148 <== NOT EXECUTED
rtems_semaphore_release(fs_info->vol_sema);
return rc;
}
fat_dir_pos_init(&dir_pos);
dir_pos.sname.cln = cur_cln;
17fa8: e59d3150 ldr r3, [sp, #336] ; 0x150 <== NOT EXECUTED
dir_pos.sname.ofs = i;
rc = fat_file_open(&fs_info->fat, &dir_pos, &tmp_fat_fd);
17fac: e1a00005 mov r0, r5 <== NOT EXECUTED
17fb0: e28d1f4f add r1, sp, #316 ; 0x13c <== NOT EXECUTED
17fb4: e28d2f53 add r2, sp, #332 ; 0x14c <== NOT EXECUTED
rtems_semaphore_release(fs_info->vol_sema);
return rc;
}
fat_dir_pos_init(&dir_pos);
dir_pos.sname.cln = cur_cln;
17fb8: e58d313c str r3, [sp, #316] ; 0x13c <== NOT EXECUTED
dir_pos.sname.ofs = i;
17fbc: e58d7140 str r7, [sp, #320] ; 0x140 <== NOT EXECUTED
rc = fat_file_open(&fs_info->fat, &dir_pos, &tmp_fat_fd);
17fc0: ebffe050 bl 10108 <fat_file_open> <== NOT EXECUTED
if (rc != RC_OK)
17fc4: e2503000 subs r3, r0, #0 <== NOT EXECUTED
17fc8: 1a000076 bne 181a8 <msdos_dir_read+0x43c> <== NOT EXECUTED
}
/* fill in dirent structure */
/* XXX: from what and in what d_off should be computed ?! */
tmp_dirent.d_off = start + cmpltd;
tmp_dirent.d_reclen = sizeof(struct dirent);
17fcc: e59f32a4 ldr r3, [pc, #676] ; 18278 <msdos_dir_read+0x50c> <== NOT EXECUTED
17fd0: e3a02e11 mov r2, #272 ; 0x110 <== NOT EXECUTED
17fd4: e28d1f55 add r1, sp, #340 ; 0x154 <== NOT EXECUTED
17fd8: e18120b3 strh r2, [r1, r3] <== NOT EXECUTED
tmp_dirent.d_ino = tmp_fat_fd->ino;
17fdc: e59d314c ldr r3, [sp, #332] ; 0x14c <== NOT EXECUTED
return rc;
}
/* fill in dirent structure */
/* XXX: from what and in what d_off should be computed ?! */
tmp_dirent.d_off = start + cmpltd;
17fe0: e59dc00c ldr ip, [sp, #12] <== NOT EXECUTED
tmp_dirent.d_reclen = sizeof(struct dirent);
tmp_dirent.d_ino = tmp_fat_fd->ino;
17fe4: e593300c ldr r3, [r3, #12] <== NOT EXECUTED
/*
* If a long file name check if the correct number of
* entries have been found and if the checksum is correct.
* If not return the short file name.
*/
if (lfn_start != FAT_FILE_SHORT_NAME)
17fe8: e3780001 cmn r8, #1 <== NOT EXECUTED
return rc;
}
/* fill in dirent structure */
/* XXX: from what and in what d_off should be computed ?! */
tmp_dirent.d_off = start + cmpltd;
17fec: e58dc030 str ip, [sp, #48] ; 0x30 <== NOT EXECUTED
17ff0: e58d9034 str r9, [sp, #52] ; 0x34 <== NOT EXECUTED
tmp_dirent.d_reclen = sizeof(struct dirent);
tmp_dirent.d_ino = tmp_fat_fd->ino;
17ff4: e58d302c str r3, [sp, #44] ; 0x2c <== NOT EXECUTED
/*
* If a long file name check if the correct number of
* entries have been found and if the checksum is correct.
* If not return the short file name.
*/
if (lfn_start != FAT_FILE_SHORT_NAME)
17ff8: 0a00000e beq 18038 <msdos_dir_read+0x2cc> <== NOT EXECUTED
17ffc: e1a02009 mov r2, r9 <== NOT EXECUTED
18000: e1a03009 mov r3, r9 <== NOT EXECUTED
uint8_t cs = 0;
uint8_t* p = (uint8_t*) entry;
int i;
for (i = 0; i < 11; i++, p++)
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
18004: e7d40002 ldrb r0, [r4, r2] <== NOT EXECUTED
18008: e2131001 ands r1, r3, #1 <== NOT EXECUTED
1800c: 13a01080 movne r1, #128 ; 0x80 <== NOT EXECUTED
18010: e08030a3 add r3, r0, r3, lsr #1 <== NOT EXECUTED
{
uint8_t cs = 0;
uint8_t* p = (uint8_t*) entry;
int i;
for (i = 0; i < 11; i++, p++)
18014: e2822001 add r2, r2, #1 <== NOT EXECUTED
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
18018: e0833001 add r3, r3, r1 <== NOT EXECUTED
{
uint8_t cs = 0;
uint8_t* p = (uint8_t*) entry;
int i;
for (i = 0; i < 11; i++, p++)
1801c: e352000b cmp r2, #11 <== NOT EXECUTED
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
18020: e20330ff and r3, r3, #255 ; 0xff <== NOT EXECUTED
{
uint8_t cs = 0;
uint8_t* p = (uint8_t*) entry;
int i;
for (i = 0; i < 11; i++, p++)
18024: 1afffff6 bne 18004 <msdos_dir_read+0x298> <== NOT EXECUTED
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
if (lfn_entries || (lfn_checksum != cs))
18028: e59dc018 ldr ip, [sp, #24] <== NOT EXECUTED
1802c: e35b0000 cmp fp, #0 <== NOT EXECUTED
18030: 015c0003 cmpeq ip, r3 <== NOT EXECUTED
18034: 0a000079 beq 18220 <msdos_dir_read+0x4b4> <== NOT EXECUTED
18038: e1a01004 mov r1, r4 <== NOT EXECUTED
uint8_t cs = 0;
uint8_t* p = (uint8_t*) entry;
int i;
for (i = 0; i < 11; i++, p++)
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
1803c: e3a03008 mov r3, #8 <== NOT EXECUTED
18040: ea000002 b 18050 <msdos_dir_read+0x2e4> <== NOT EXECUTED
const char *src_tmp;
/*
* find last non-blank character of base name
*/
for ((i = MSDOS_SHORT_BASE_LEN ,
18044: e2533001 subs r3, r3, #1 <== NOT EXECUTED
int i;
for (i = 0; i < 11; i++, p++)
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
if (lfn_entries || (lfn_checksum != cs))
18048: e2411001 sub r1, r1, #1 <== NOT EXECUTED
const char *src_tmp;
/*
* find last non-blank character of base name
*/
for ((i = MSDOS_SHORT_BASE_LEN ,
1804c: 0a000004 beq 18064 <msdos_dir_read+0x2f8> <== NOT EXECUTED
src_tmp = src + MSDOS_SHORT_BASE_LEN-1);
((i > 0) &&
18050: e5d10007 ldrb r0, [r1, #7] <== NOT EXECUTED
18054: e3500020 cmp r0, #32 <== NOT EXECUTED
const char *src_tmp;
/*
* find last non-blank character of base name
*/
for ((i = MSDOS_SHORT_BASE_LEN ,
18058: e1a02003 mov r2, r3 <== NOT EXECUTED
src_tmp = src + MSDOS_SHORT_BASE_LEN-1);
((i > 0) &&
1805c: 0afffff8 beq 18044 <msdos_dir_read+0x2d8> <== NOT EXECUTED
18060: ea000000 b 18068 <msdos_dir_read+0x2fc> <== NOT EXECUTED
const char *src_tmp;
/*
* find last non-blank character of base name
*/
for ((i = MSDOS_SHORT_BASE_LEN ,
18064: e1a02003 mov r2, r3 <== NOT EXECUTED
* copy base name to destination
*/
src_tmp = src;
len = i;
while (i-- > 0) {
*dst++ = tolower((unsigned char)(*src_tmp++));
18068: e59f120c ldr r1, [pc, #524] ; 1827c <msdos_dir_read+0x510> <== NOT EXECUTED
1806c: e5911000 ldr r1, [r1] <== NOT EXECUTED
18070: e1a0e004 mov lr, r4 <== NOT EXECUTED
18074: e58d1020 str r1, [sp, #32] <== NOT EXECUTED
{
/*
* convert dir entry from fixed 8+3 format (without dot)
* to 0..8 + 1dot + 0..3 format
*/
tmp_dirent.d_namlen = msdos_format_dirent_with_dot(
18078: e28dc03c add ip, sp, #60 ; 0x3c <== NOT EXECUTED
* copy base name to destination
*/
src_tmp = src;
len = i;
while (i-- > 0) {
*dst++ = tolower((unsigned char)(*src_tmp++));
1807c: e1a01003 mov r1, r3 <== NOT EXECUTED
18080: e58d3004 str r3, [sp, #4] <== NOT EXECUTED
18084: ea000008 b 180ac <msdos_dir_read+0x340> <== NOT EXECUTED
18088: e4de0001 ldrb r0, [lr], #1 <== NOT EXECUTED
1808c: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED
18090: e0838000 add r8, r3, r0 <== NOT EXECUTED
18094: e5d88001 ldrb r8, [r8, #1] <== NOT EXECUTED
18098: e2088003 and r8, r8, #3 <== NOT EXECUTED
1809c: e3580001 cmp r8, #1 <== NOT EXECUTED
180a0: 02800020 addeq r0, r0, #32 <== NOT EXECUTED
180a4: e4cc0001 strb r0, [ip], #1 <== NOT EXECUTED
180a8: e2411001 sub r1, r1, #1 <== NOT EXECUTED
/*
* copy base name to destination
*/
src_tmp = src;
len = i;
while (i-- > 0) {
180ac: e3510000 cmp r1, #0 <== NOT EXECUTED
180b0: cafffff4 bgt 18088 <msdos_dir_read+0x31c> <== NOT EXECUTED
180b4: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
* RETURNS:
* the number of bytes read on success, or -1 if error occured (errno
* set apropriately).
*/
ssize_t
msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
180b8: e28d1f55 add r1, sp, #340 ; 0x154 <== NOT EXECUTED
180bc: e1c3cfc3 bic ip, r3, r3, asr #31 <== NOT EXECUTED
180c0: e081000c add r0, r1, ip <== NOT EXECUTED
/*
* find last non-blank character of extension
*/
for ((i = MSDOS_SHORT_EXT_LEN ,
src_tmp = src + MSDOS_SHORT_BASE_LEN+MSDOS_SHORT_EXT_LEN-1);
((i > 0) &&
180c4: e5d4100a ldrb r1, [r4, #10] <== NOT EXECUTED
180c8: e3510020 cmp r1, #32 <== NOT EXECUTED
* RETURNS:
* the number of bytes read on success, or -1 if error occured (errno
* set apropriately).
*/
ssize_t
msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
180cc: e2400f46 sub r0, r0, #280 ; 0x118 <== NOT EXECUTED
/*
* find last non-blank character of extension
*/
for ((i = MSDOS_SHORT_EXT_LEN ,
src_tmp = src + MSDOS_SHORT_BASE_LEN+MSDOS_SHORT_EXT_LEN-1);
((i > 0) &&
180d0: 1a000058 bne 18238 <msdos_dir_read+0x4cc> <== NOT EXECUTED
180d4: e5d41009 ldrb r1, [r4, #9] <== NOT EXECUTED
180d8: e3510020 cmp r1, #32 <== NOT EXECUTED
180dc: 1a000057 bne 18240 <msdos_dir_read+0x4d4> <== NOT EXECUTED
180e0: e5d41008 ldrb r1, [r4, #8] <== NOT EXECUTED
180e4: e3510020 cmp r1, #32 <== NOT EXECUTED
180e8: 13a01001 movne r1, #1 <== NOT EXECUTED
180ec: 0a00000e beq 1812c <msdos_dir_read+0x3c0> <== NOT EXECUTED
180f0: ea000053 b 18244 <msdos_dir_read+0x4d8> <== NOT EXECUTED
if (i > 0) {
*dst++ = '.'; /* append dot */
len += i + 1; /* extension + dot */
src_tmp = src + MSDOS_SHORT_BASE_LEN;
while (i-- > 0) {
*dst++ = tolower((unsigned char)(*src_tmp++));
180f4: e4d4e001 ldrb lr, [r4], #1 <== NOT EXECUTED
180f8: e082800e add r8, r2, lr <== NOT EXECUTED
180fc: e5d88001 ldrb r8, [r8, #1] <== NOT EXECUTED
18100: e2088003 and r8, r8, #3 <== NOT EXECUTED
18104: e3580001 cmp r8, #1 <== NOT EXECUTED
18108: 028ee020 addeq lr, lr, #32 <== NOT EXECUTED
1810c: e5e0e001 strb lr, [r0, #1]! <== NOT EXECUTED
18110: e24cc001 sub ip, ip, #1 <== NOT EXECUTED
*/
if (i > 0) {
*dst++ = '.'; /* append dot */
len += i + 1; /* extension + dot */
src_tmp = src + MSDOS_SHORT_BASE_LEN;
while (i-- > 0) {
18114: e35c0000 cmp ip, #0 <== NOT EXECUTED
18118: cafffff5 bgt 180f4 <msdos_dir_read+0x388> <== NOT EXECUTED
* RETURNS:
* the number of bytes read on success, or -1 if error occured (errno
* set apropriately).
*/
ssize_t
msdos_dir_read(rtems_libio_t *iop, void *buffer, size_t count)
1811c: e59dc020 ldr ip, [sp, #32] <== NOT EXECUTED
18120: e1c12fc1 bic r2, r1, r1, asr #31 <== NOT EXECUTED
18124: e08c0002 add r0, ip, r2 <== NOT EXECUTED
18128: e0832002 add r2, r3, r2 <== NOT EXECUTED
{
/*
* convert dir entry from fixed 8+3 format (without dot)
* to 0..8 + 1dot + 0..3 format
*/
tmp_dirent.d_namlen = msdos_format_dirent_with_dot(
1812c: e59f314c ldr r3, [pc, #332] ; 18280 <msdos_dir_read+0x514> <== NOT EXECUTED
while (i-- > 0) {
*dst++ = tolower((unsigned char)(*src_tmp++));
len++;
}
}
*dst = '\0'; /* terminate string */
18130: e3a01000 mov r1, #0 <== NOT EXECUTED
{
/*
* convert dir entry from fixed 8+3 format (without dot)
* to 0..8 + 1dot + 0..3 format
*/
tmp_dirent.d_namlen = msdos_format_dirent_with_dot(
18134: e28dcf55 add ip, sp, #340 ; 0x154 <== NOT EXECUTED
while (i-- > 0) {
*dst++ = tolower((unsigned char)(*src_tmp++));
len++;
}
}
*dst = '\0'; /* terminate string */
18138: e5c01000 strb r1, [r0] <== NOT EXECUTED
{
/*
* convert dir entry from fixed 8+3 format (without dot)
* to 0..8 + 1dot + 0..3 format
*/
tmp_dirent.d_namlen = msdos_format_dirent_with_dot(
1813c: e18c20b3 strh r2, [ip, r3] <== NOT EXECUTED
18140: e3e08000 mvn r8, #0 <== NOT EXECUTED
else
{
tmp_dirent.d_namlen = strlen(tmp_dirent.d_name);
}
memcpy(buffer + cmpltd, &tmp_dirent, sizeof(struct dirent));
18144: e59dc028 ldr ip, [sp, #40] ; 0x28 <== NOT EXECUTED
18148: e59d100c ldr r1, [sp, #12] <== NOT EXECUTED
1814c: e3a02e11 mov r2, #272 ; 0x110 <== NOT EXECUTED
18150: e08c0001 add r0, ip, r1 <== NOT EXECUTED
18154: e28d102c add r1, sp, #44 ; 0x2c <== NOT EXECUTED
18158: eb000469 bl 19304 <memcpy> <== NOT EXECUTED
iop->offset = iop->offset + sizeof(struct dirent);
1815c: e59dc010 ldr ip, [sp, #16] <== NOT EXECUTED
18160: e99c000c ldmib ip, {r2, r3} <== NOT EXECUTED
18164: e3a00e11 mov r0, #272 ; 0x110 <== NOT EXECUTED
18168: e0922000 adds r2, r2, r0 <== NOT EXECUTED
1816c: e3a01000 mov r1, #0 <== NOT EXECUTED
18170: e0a33001 adc r3, r3, r1 <== NOT EXECUTED
18174: e98c000c stmib ip, {r2, r3} <== NOT EXECUTED
cmpltd += (sizeof(struct dirent));
count -= (sizeof(struct dirent));
/* inode number extracted, close fat-file */
rc = fat_file_close(&fs_info->fat, tmp_fat_fd);
18178: e1a00005 mov r0, r5 <== NOT EXECUTED
1817c: e59d114c ldr r1, [sp, #332] ; 0x14c <== NOT EXECUTED
18180: ebffe0da bl 104f0 <fat_file_close> <== NOT EXECUTED
if (rc != RC_OK)
18184: e2503000 subs r3, r0, #0 <== NOT EXECUTED
18188: 1a000006 bne 181a8 <msdos_dir_read+0x43c> <== NOT EXECUTED
}
memcpy(buffer + cmpltd, &tmp_dirent, sizeof(struct dirent));
iop->offset = iop->offset + sizeof(struct dirent);
cmpltd += (sizeof(struct dirent));
1818c: e59dc00c ldr ip, [sp, #12] <== NOT EXECUTED
18190: e28cce11 add ip, ip, #272 ; 0x110 <== NOT EXECUTED
18194: e58dc00c str ip, [sp, #12] <== NOT EXECUTED
count -= (sizeof(struct dirent));
18198: e59dc014 ldr ip, [sp, #20] <== NOT EXECUTED
1819c: e24cce11 sub ip, ip, #272 ; 0x110 <== NOT EXECUTED
181a0: e58dc014 str ip, [sp, #20] <== NOT EXECUTED
181a4: ea000005 b 181c0 <msdos_dir_read+0x454> <== NOT EXECUTED
/* inode number extracted, close fat-file */
rc = fat_file_close(&fs_info->fat, tmp_fat_fd);
if (rc != RC_OK)
{
rtems_semaphore_release(fs_info->vol_sema);
181a8: e595009c ldr r0, [r5, #156] ; 0x9c <== NOT EXECUTED
181ac: e1a04005 mov r4, r5 <== NOT EXECUTED
181b0: e58d3008 str r3, [sp, #8] <== NOT EXECUTED
181b4: ebffbff8 bl 819c <rtems_semaphore_release> <== NOT EXECUTED
return rc;
181b8: e59d3008 ldr r3, [sp, #8] <== NOT EXECUTED
181bc: ea000014 b 18214 <msdos_dir_read+0x4a8> <== NOT EXECUTED
}
}
if (count <= 0)
181c0: e59dc014 ldr ip, [sp, #20] <== NOT EXECUTED
181c4: e35c0000 cmp ip, #0 <== NOT EXECUTED
181c8: 1a000001 bne 181d4 <msdos_dir_read+0x468> <== NOT EXECUTED
181cc: ea000007 b 181f0 <msdos_dir_read+0x484> <== NOT EXECUTED
*/
if ((lfn_entries != (*MSDOS_DIR_ENTRY_TYPE(entry) &
MSDOS_LAST_LONG_ENTRY_MASK)) ||
(lfn_checksum != *MSDOS_DIR_LFN_CHECKSUM(entry)))
{
lfn_start = FAT_FILE_SHORT_NAME;
181d0: e3e08000 mvn r8, #0 <== NOT EXECUTED
{
rtems_semaphore_release(fs_info->vol_sema);
rtems_set_errno_and_return_minus_one(EIO);
}
for (i = 0; i < ret; i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
181d4: e2877020 add r7, r7, #32 <== NOT EXECUTED
181d8: ea000001 b 181e4 <msdos_dir_read+0x478> <== NOT EXECUTED
* directories feature :( - we should count elements currently
* present in the directory because there may be holes :)
*/
ret = fat_file_read(&fs_info->fat, fat_fd, (j * bts2rd),
bts2rd, fs_info->cl_buf);
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
181dc: e3a07000 mov r7, #0 <== NOT EXECUTED
* unfortunately there is no method to extract ino except to
* open fat-file descriptor :( ... so, open it
*/
/* get number of cluster we are working with */
rc = fat_file_ioctl(&fs_info->fat, fat_fd, F_CLU_NUM,
181e0: e1a05004 mov r5, r4 <== NOT EXECUTED
{
rtems_semaphore_release(fs_info->vol_sema);
rtems_set_errno_and_return_minus_one(EIO);
}
for (i = 0; i < ret; i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
181e4: e59dc024 ldr ip, [sp, #36] ; 0x24 <== NOT EXECUTED
181e8: e157000c cmp r7, ip <== NOT EXECUTED
181ec: 3affff20 bcc 17e74 <msdos_dir_read+0x108> <== NOT EXECUTED
181f0: e59dc01c ldr ip, [sp, #28] <== NOT EXECUTED
181f4: e1a04005 mov r4, r5 <== NOT EXECUTED
181f8: e086600c add r6, r6, ip <== NOT EXECUTED
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
while (count > 0)
181fc: e59dc014 ldr ip, [sp, #20] <== NOT EXECUTED
18200: e35c0000 cmp ip, #0 <== NOT EXECUTED
18204: 1affff09 bne 17e30 <msdos_dir_read+0xc4> <== NOT EXECUTED
break;
}
j++;
}
rtems_semaphore_release(fs_info->vol_sema);
18208: e594009c ldr r0, [r4, #156] ; 0x9c <== NOT EXECUTED
1820c: ebffbfe2 bl 819c <rtems_semaphore_release> <== NOT EXECUTED
return cmpltd;
18210: e59d300c ldr r3, [sp, #12] <== NOT EXECUTED
}
18214: e1a00003 mov r0, r3 <== NOT EXECUTED
18218: e28ddf55 add sp, sp, #340 ; 0x154 <== NOT EXECUTED
1821c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
tmp_dirent.d_namlen = msdos_format_dirent_with_dot(
tmp_dirent.d_name, entry); /* src text */
}
else
{
tmp_dirent.d_namlen = strlen(tmp_dirent.d_name);
18220: e28d003c add r0, sp, #60 ; 0x3c <== NOT EXECUTED
18224: eb000acd bl 1ad60 <strlen> <== NOT EXECUTED
18228: e59f3050 ldr r3, [pc, #80] ; 18280 <msdos_dir_read+0x514> <== NOT EXECUTED
1822c: e28d1f55 add r1, sp, #340 ; 0x154 <== NOT EXECUTED
18230: e18100b3 strh r0, [r1, r3] <== NOT EXECUTED
18234: eaffffc2 b 18144 <msdos_dir_read+0x3d8> <== NOT EXECUTED
*dst++ = tolower((unsigned char)(*src_tmp++));
}
/*
* find last non-blank character of extension
*/
for ((i = MSDOS_SHORT_EXT_LEN ,
18238: e3a01003 mov r1, #3 <== NOT EXECUTED
1823c: ea000000 b 18244 <msdos_dir_read+0x4d8> <== NOT EXECUTED
src_tmp = src + MSDOS_SHORT_BASE_LEN+MSDOS_SHORT_EXT_LEN-1);
((i > 0) &&
(*src_tmp == ' '));
i--,src_tmp--)
18240: e3a01002 mov r1, #2 <== NOT EXECUTED
{};
/*
* extension is not empty
*/
if (i > 0) {
*dst++ = '.'; /* append dot */
18244: e28d2f55 add r2, sp, #340 ; 0x154 <== NOT EXECUTED
18248: e082c00c add ip, r2, ip <== NOT EXECUTED
1824c: e3a0202e mov r2, #46 ; 0x2e <== NOT EXECUTED
18250: e54c2118 strb r2, [ip, #-280] ; 0x118 <== NOT EXECUTED
len += i + 1; /* extension + dot */
18254: e2812001 add r2, r1, #1 <== NOT EXECUTED
18258: e0833002 add r3, r3, r2 <== NOT EXECUTED
src_tmp = src + MSDOS_SHORT_BASE_LEN;
while (i-- > 0) {
*dst++ = tolower((unsigned char)(*src_tmp++));
1825c: e59f2018 ldr r2, [pc, #24] ; 1827c <msdos_dir_read+0x510> <== NOT EXECUTED
{};
/*
* extension is not empty
*/
if (i > 0) {
*dst++ = '.'; /* append dot */
18260: e280c001 add ip, r0, #1 <== NOT EXECUTED
18264: e58dc020 str ip, [sp, #32] <== NOT EXECUTED
len += i + 1; /* extension + dot */
src_tmp = src + MSDOS_SHORT_BASE_LEN;
18268: e2844008 add r4, r4, #8 <== NOT EXECUTED
while (i-- > 0) {
*dst++ = tolower((unsigned char)(*src_tmp++));
1826c: e5922000 ldr r2, [r2] <== NOT EXECUTED
18270: e1a0c001 mov ip, r1 <== NOT EXECUTED
18274: eaffffa6 b 18114 <msdos_dir_read+0x3a8> <== NOT EXECUTED
00018284 <msdos_dir_stat>:
const rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
18284: e5903014 ldr r3, [r0, #20]
int
msdos_dir_stat(
const rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
18288: e92d40f0 push {r4, r5, r6, r7, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
1828c: e5936008 ldr r6, [r3, #8]
int
msdos_dir_stat(
const rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
18290: e1a04001 mov r4, r1
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
18294: e3a01000 mov r1, #0
struct stat *buf
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
18298: e5905008 ldr r5, [r0, #8]
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
1829c: e1a02001 mov r2, r1
182a0: e596009c ldr r0, [r6, #156] ; 0x9c
182a4: ebffbf75 bl 8080 <rtems_semaphore_obtain>
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
182a8: e2507000 subs r7, r0, #0
182ac: 0a000004 beq 182c4 <msdos_dir_stat+0x40>
rtems_set_errno_and_return_minus_one(EIO);
182b0: eb00016c bl 18868 <__errno> <== NOT EXECUTED
182b4: e3a03005 mov r3, #5 <== NOT EXECUTED
182b8: e5803000 str r3, [r0] <== NOT EXECUTED
182bc: e3e00000 mvn r0, #0 <== NOT EXECUTED
182c0: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
static inline dev_t rtems_disk_get_device_identifier(
const rtems_disk_device *dd
)
{
return dd->dev;
182c4: e5963064 ldr r3, [r6, #100] ; 0x64
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
182c8: e893000c ldm r3, {r2, r3}
182cc: e884000c stm r4, {r2, r3}
buf->st_ino = fat_fd->ino;
182d0: e595300c ldr r3, [r5, #12]
182d4: e5843008 str r3, [r4, #8]
buf->st_mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO;
182d8: e59f3044 ldr r3, [pc, #68] ; 18324 <msdos_dir_stat+0xa0>
buf->st_rdev = 0ll;
182dc: e3a02000 mov r2, #0
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
buf->st_mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO;
182e0: e584300c str r3, [r4, #12]
buf->st_rdev = 0ll;
182e4: e3a03000 mov r3, #0
182e8: e5842018 str r2, [r4, #24]
182ec: e584301c str r3, [r4, #28]
buf->st_size = fat_fd->fat_file_size;
182f0: e5953018 ldr r3, [r5, #24]
182f4: e5843020 str r3, [r4, #32]
buf->st_blocks = fat_fd->fat_file_size >> FAT_SECTOR512_BITS;
182f8: e1a034a3 lsr r3, r3, #9
182fc: e5843044 str r3, [r4, #68] ; 0x44
buf->st_blksize = fs_info->fat.vol.bps;
18300: e1d630b0 ldrh r3, [r6]
18304: e5843040 str r3, [r4, #64] ; 0x40
buf->st_mtime = fat_fd->mtime;
18308: e5953040 ldr r3, [r5, #64] ; 0x40
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
buf->st_mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO;
buf->st_rdev = 0ll;
buf->st_size = fat_fd->fat_file_size;
1830c: e5847024 str r7, [r4, #36] ; 0x24
buf->st_blocks = fat_fd->fat_file_size >> FAT_SECTOR512_BITS;
buf->st_blksize = fs_info->fat.vol.bps;
buf->st_mtime = fat_fd->mtime;
18310: e5843030 str r3, [r4, #48] ; 0x30
rtems_semaphore_release(fs_info->vol_sema);
18314: e596009c ldr r0, [r6, #156] ; 0x9c
18318: ebffbf9f bl 819c <rtems_semaphore_release>
return RC_OK;
1831c: e1a00007 mov r0, r7
}
18320: e8bd80f0 pop {r4, r5, r6, r7, pc}
00015384 <msdos_eval_token>:
static inline bool rtems_filesystem_is_current_directory(
const char *token,
size_t tokenlen
)
{
return tokenlen == 1 && token [0] == '.';
15384: e3530001 cmp r3, #1
rtems_filesystem_eval_path_context_t *ctx,
void *arg,
const char *token,
size_t tokenlen
)
{
15388: e92d4010 push {r4, lr}
1538c: e1a04000 mov r4, r0
15390: 1a00001c bne 15408 <msdos_eval_token+0x84>
15394: e5d21000 ldrb r1, [r2]
15398: e351002e cmp r1, #46 ; 0x2e
static inline void rtems_filesystem_eval_path_clear_token(
rtems_filesystem_eval_path_context_t *ctx
)
{
ctx->tokenlen = 0;
1539c: 03a00000 moveq r0, #0
153a0: 0584000c streq r0, [r4, #12]
static inline bool rtems_filesystem_is_current_directory(
const char *token,
size_t tokenlen
)
{
return tokenlen == 1 && token [0] == '.';
153a4: 1a000017 bne 15408 <msdos_eval_token+0x84>
153a8: e8bd8010 pop {r4, pc}
msdos_set_handlers(rtems_filesystem_location_info_t *loc)
{
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
if (fat_fd->fat_file_type == FAT_DIRECTORY)
153ac: e5942020 ldr r2, [r4, #32]
* None
*/
static void
msdos_set_handlers(rtems_filesystem_location_info_t *loc)
{
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
153b0: e594302c ldr r3, [r4, #44] ; 0x2c
fat_file_fd_t *fat_fd = loc->node_access;
if (fat_fd->fat_file_type == FAT_DIRECTORY)
153b4: e5922010 ldr r2, [r2, #16]
* None
*/
static void
msdos_set_handlers(rtems_filesystem_location_info_t *loc)
{
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
153b8: e5933008 ldr r3, [r3, #8]
fat_file_fd_t *fat_fd = loc->node_access;
if (fat_fd->fat_file_type == FAT_DIRECTORY)
153bc: e3520000 cmp r2, #0
static inline void rtems_filesystem_eval_path_clear_token(
rtems_filesystem_eval_path_context_t *ctx
)
{
ctx->tokenlen = 0;
153c0: e584000c str r0, [r4, #12]
void *arg,
const char *token,
size_t tokenlen
)
{
rtems_filesystem_eval_path_generic_status status =
153c4: e5940004 ldr r0, [r4, #4]
{
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
if (fat_fd->fat_file_type == FAT_DIRECTORY)
loc->handlers = fs_info->directory_handlers;
153c8: 05933094 ldreq r3, [r3, #148] ; 0x94
else
loc->handlers = fs_info->file_handlers;
153cc: 15933098 ldrne r3, [r3, #152] ; 0x98
void *arg,
const char *token,
size_t tokenlen
)
{
rtems_filesystem_eval_path_generic_status status =
153d0: e2700001 rsbs r0, r0, #1
fat_file_fd_t *fat_fd = loc->node_access;
if (fat_fd->fat_file_type == FAT_DIRECTORY)
loc->handlers = fs_info->directory_handlers;
else
loc->handlers = fs_info->file_handlers;
153d4: e5843028 str r3, [r4, #40] ; 0x28
void *arg,
const char *token,
size_t tokenlen
)
{
rtems_filesystem_eval_path_generic_status status =
153d8: 33a00000 movcc r0, #0
153dc: e8bd8010 pop {r4, pc}
rtems_filesystem_eval_path_clear_token(ctx);
msdos_set_handlers(currentloc);
if (rtems_filesystem_eval_path_has_path(ctx)) {
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE;
}
} else if (rc == MSDOS_NAME_NOT_FOUND_ERR) {
153e0: e59f303c ldr r3, [pc, #60] ; 15424 <msdos_eval_token+0xa0>
153e4: e1500003 cmp r0, r3
153e8: 0a000004 beq 15400 <msdos_eval_token+0x7c>
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY;
} else {
rtems_filesystem_eval_path_error(ctx, 0);
153ec: e1a00004 mov r0, r4 <== NOT EXECUTED
153f0: e3a01000 mov r1, #0 <== NOT EXECUTED
153f4: ebffbf72 bl 51c4 <rtems_filesystem_eval_path_error> <== NOT EXECUTED
void *arg,
const char *token,
size_t tokenlen
)
{
rtems_filesystem_eval_path_generic_status status =
153f8: e3a00001 mov r0, #1 <== NOT EXECUTED
153fc: e8bd8010 pop {r4, pc} <== NOT EXECUTED
msdos_set_handlers(currentloc);
if (rtems_filesystem_eval_path_has_path(ctx)) {
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE;
}
} else if (rc == MSDOS_NAME_NOT_FOUND_ERR) {
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY;
15400: e3a00002 mov r0, #2
rtems_filesystem_eval_path_error(ctx, 0);
}
}
return status;
}
15404: e8bd8010 pop {r4, pc}
rtems_filesystem_eval_path_clear_token(ctx);
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE;
} else {
rtems_filesystem_location_info_t *currentloc =
rtems_filesystem_eval_path_get_currentloc(ctx);
int rc = msdos_find_name(currentloc, token, tokenlen);
15408: e1a01002 mov r1, r2
1540c: e2840018 add r0, r4, #24
15410: e1a02003 mov r2, r3
15414: eb0004d5 bl 16770 <msdos_find_name>
if (rc == RC_OK) {
15418: e3500000 cmp r0, #0
1541c: 0affffe2 beq 153ac <msdos_eval_token+0x28>
15420: eaffffee b 153e0 <msdos_eval_token+0x5c>
00018388 <msdos_file_close>:
int
msdos_file_close(rtems_libio_t *iop)
{
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
18388: e5903024 ldr r3, [r0, #36] ; 0x24
* RC_OK, if file closed successfully, or -1 if error occured (errno set
* appropriately)
*/
int
msdos_file_close(rtems_libio_t *iop)
{
1838c: e92d4030 push {r4, r5, lr}
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
18390: e5934008 ldr r4, [r3, #8]
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
18394: e3a01000 mov r1, #0
* RC_OK, if file closed successfully, or -1 if error occured (errno set
* appropriately)
*/
int
msdos_file_close(rtems_libio_t *iop)
{
18398: e1a05000 mov r5, r0
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
1839c: e1a02001 mov r2, r1
183a0: e594009c ldr r0, [r4, #156] ; 0x9c
183a4: ebffbf35 bl 8080 <rtems_semaphore_obtain>
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
183a8: e3500000 cmp r0, #0
183ac: 0a000004 beq 183c4 <msdos_file_close+0x3c>
rtems_set_errno_and_return_minus_one(EIO);
183b0: eb00012c bl 18868 <__errno> <== NOT EXECUTED
183b4: e3a03005 mov r3, #5 <== NOT EXECUTED
183b8: e5803000 str r3, [r0] <== NOT EXECUTED
183bc: e3e05000 mvn r5, #0 <== NOT EXECUTED
183c0: ea000004 b 183d8 <msdos_file_close+0x50> <== NOT EXECUTED
rc = msdos_file_update(iop);
183c4: e1a00005 mov r0, r5
183c8: ebffffd6 bl 18328 <msdos_file_update>
183cc: e1a05000 mov r5, r0
rtems_semaphore_release(fs_info->vol_sema);
183d0: e594009c ldr r0, [r4, #156] ; 0x9c
183d4: ebffbf70 bl 819c <rtems_semaphore_release>
return rc;
}
183d8: e1a00005 mov r0, r5
183dc: e8bd8030 pop {r4, r5, pc}
000185dc <msdos_file_ftruncate>:
int
msdos_file_ftruncate(rtems_libio_t *iop, off_t length)
{
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
185dc: e5903024 ldr r3, [r0, #36] ; 0x24
* RETURNS:
* RC_OK on success, or -1 if error occured (errno set appropriately).
*/
int
msdos_file_ftruncate(rtems_libio_t *iop, off_t length)
{
185e0: e92d43f3 push {r0, r1, r4, r5, r6, r7, r8, r9, lr}
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
185e4: e5935008 ldr r5, [r3, #8]
* RETURNS:
* RC_OK on success, or -1 if error occured (errno set appropriately).
*/
int
msdos_file_ftruncate(rtems_libio_t *iop, off_t length)
{
185e8: e1a08001 mov r8, r1
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
uint32_t old_length;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
185ec: e3a01000 mov r1, #0
msdos_file_ftruncate(rtems_libio_t *iop, off_t length)
{
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
185f0: e5904018 ldr r4, [r0, #24]
* RETURNS:
* RC_OK on success, or -1 if error occured (errno set appropriately).
*/
int
msdos_file_ftruncate(rtems_libio_t *iop, off_t length)
{
185f4: e1a09002 mov r9, r2
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
uint32_t old_length;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
185f8: e595009c ldr r0, [r5, #156] ; 0x9c
185fc: e1a02001 mov r2, r1
18600: ebffbe9e bl 8080 <rtems_semaphore_obtain>
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
18604: e3500000 cmp r0, #0
18608: 0a000004 beq 18620 <msdos_file_ftruncate+0x44>
rtems_set_errno_and_return_minus_one(EIO);
1860c: eb000095 bl 18868 <__errno> <== NOT EXECUTED
18610: e3a03005 mov r3, #5 <== NOT EXECUTED
18614: e5803000 str r3, [r0] <== NOT EXECUTED
18618: e3e07000 mvn r7, #0 <== NOT EXECUTED
1861c: ea000027 b 186c0 <msdos_file_ftruncate+0xe4> <== NOT EXECUTED
old_length = fat_fd->fat_file_size;
18620: e5946018 ldr r6, [r4, #24]
if (length < old_length) {
18624: e3a03000 mov r3, #0
18628: e1a02006 mov r2, r6
1862c: e1580002 cmp r8, r2
18630: e0d91003 sbcs r1, r9, r3
18634: aa000006 bge 18654 <msdos_file_ftruncate+0x78>
rc = fat_file_truncate(&fs_info->fat, fat_fd, length);
18638: e1a00005 mov r0, r5
1863c: e1a01004 mov r1, r4
18640: e1a02008 mov r2, r8
18644: ebffdf6d bl 10400 <fat_file_truncate>
errno = ENOSPC;
rc = -1;
}
}
if (rc == RC_OK) {
18648: e2507000 subs r7, r0, #0
1864c: 0a000017 beq 186b0 <msdos_file_ftruncate+0xd4>
18650: ea000018 b 186b8 <msdos_file_ftruncate+0xdc> <== NOT EXECUTED
if (length < old_length) {
rc = fat_file_truncate(&fs_info->fat, fat_fd, length);
} else {
uint32_t new_length;
rc = fat_file_extend(&fs_info->fat,
18654: e28d3004 add r3, sp, #4
18658: e58d3000 str r3, [sp]
1865c: e1a00005 mov r0, r5
18660: e1a01004 mov r1, r4
18664: e3a02001 mov r2, #1
18668: e1a03008 mov r3, r8
1866c: ebffdff4 bl 10644 <fat_file_extend>
fat_fd,
true,
length,
&new_length);
if (rc == RC_OK && length != new_length) {
18670: e2507000 subs r7, r0, #0
18674: 1a00000f bne 186b8 <msdos_file_ftruncate+0xdc>
18678: e59d2004 ldr r2, [sp, #4]
1867c: e3a03000 mov r3, #0
18680: e1590003 cmp r9, r3
18684: 01580002 cmpeq r8, r2
18688: 0a000008 beq 186b0 <msdos_file_ftruncate+0xd4>
fat_file_truncate(&fs_info->fat, fat_fd, old_length);
1868c: e1a01004 mov r1, r4 <== NOT EXECUTED
18690: e1a02006 mov r2, r6 <== NOT EXECUTED
18694: e1a00005 mov r0, r5 <== NOT EXECUTED
18698: ebffdf58 bl 10400 <fat_file_truncate> <== NOT EXECUTED
errno = ENOSPC;
1869c: eb000071 bl 18868 <__errno> <== NOT EXECUTED
186a0: e3a0301c mov r3, #28 <== NOT EXECUTED
186a4: e5803000 str r3, [r0] <== NOT EXECUTED
rc = -1;
186a8: e3e07000 mvn r7, #0 <== NOT EXECUTED
186ac: ea000001 b 186b8 <msdos_file_ftruncate+0xdc> <== NOT EXECUTED
}
}
if (rc == RC_OK) {
fat_fd->fat_file_size = length;
186b0: e5848018 str r8, [r4, #24]
186b4: e3a07000 mov r7, #0
}
rtems_semaphore_release(fs_info->vol_sema);
186b8: e595009c ldr r0, [r5, #156] ; 0x9c
186bc: ebffbeb6 bl 819c <rtems_semaphore_release>
return rc;
}
186c0: e1a00007 mov r0, r7
186c4: e8bd83fc pop {r2, r3, r4, r5, r6, r7, r8, r9, pc}
000183e0 <msdos_file_read>:
ssize_t
msdos_file_read(rtems_libio_t *iop, void *buffer, size_t count)
{
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
183e0: e5903024 ldr r3, [r0, #36] ; 0x24
* the number of bytes read on success, or -1 if error occured (errno set
* appropriately)
*/
ssize_t
msdos_file_read(rtems_libio_t *iop, void *buffer, size_t count)
{
183e4: e92d41f1 push {r0, r4, r5, r6, r7, r8, lr}
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
183e8: e5935008 ldr r5, [r3, #8]
* the number of bytes read on success, or -1 if error occured (errno set
* appropriately)
*/
ssize_t
msdos_file_read(rtems_libio_t *iop, void *buffer, size_t count)
{
183ec: e1a08001 mov r8, r1
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
183f0: e3a01000 mov r1, #0
msdos_file_read(rtems_libio_t *iop, void *buffer, size_t count)
{
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
183f4: e5907018 ldr r7, [r0, #24]
* the number of bytes read on success, or -1 if error occured (errno set
* appropriately)
*/
ssize_t
msdos_file_read(rtems_libio_t *iop, void *buffer, size_t count)
{
183f8: e1a04000 mov r4, r0
183fc: e1a06002 mov r6, r2
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
18400: e595009c ldr r0, [r5, #156] ; 0x9c
18404: e1a02001 mov r2, r1
18408: ebffbf1c bl 8080 <rtems_semaphore_obtain>
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
1840c: e3500000 cmp r0, #0
18410: 0a000004 beq 18428 <msdos_file_read+0x48>
rtems_set_errno_and_return_minus_one(EIO);
18414: eb000113 bl 18868 <__errno> <== NOT EXECUTED
18418: e3a03005 mov r3, #5 <== NOT EXECUTED
1841c: e5803000 str r3, [r0] <== NOT EXECUTED
18420: e3e06000 mvn r6, #0 <== NOT EXECUTED
18424: ea00000d b 18460 <msdos_file_read+0x80> <== NOT EXECUTED
ret = fat_file_read(&fs_info->fat, fat_fd, iop->offset, count,
18428: e1a03006 mov r3, r6
1842c: e1a00005 mov r0, r5
18430: e1a01007 mov r1, r7
18434: e5942004 ldr r2, [r4, #4]
18438: e58d8000 str r8, [sp]
1843c: ebffdf86 bl 1025c <fat_file_read>
buffer);
if (ret > 0)
18440: e2506000 subs r6, r0, #0
18444: da000003 ble 18458 <msdos_file_read+0x78>
iop->offset += ret;
18448: e994000c ldmib r4, {r2, r3}
1844c: e0922006 adds r2, r2, r6
18450: e0a33fc6 adc r3, r3, r6, asr #31
18454: e984000c stmib r4, {r2, r3}
rtems_semaphore_release(fs_info->vol_sema);
18458: e595009c ldr r0, [r5, #156] ; 0x9c
1845c: ebffbf4e bl 819c <rtems_semaphore_release>
return ret;
}
18460: e1a00006 mov r0, r6
18464: e8bd81f8 pop {r3, r4, r5, r6, r7, r8, pc}
00018528 <msdos_file_stat>:
const rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
18528: e5903014 ldr r3, [r0, #20]
int
msdos_file_stat(
const rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
1852c: e92d41f0 push {r4, r5, r6, r7, r8, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
18530: e5936008 ldr r6, [r3, #8]
int
msdos_file_stat(
const rtems_filesystem_location_info_t *loc,
struct stat *buf
)
{
18534: e1a04001 mov r4, r1
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
uint32_t cl_mask = fs_info->fat.vol.bpc - 1;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
18538: e3a01000 mov r1, #0
struct stat *buf
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
1853c: e5905008 ldr r5, [r0, #8]
uint32_t cl_mask = fs_info->fat.vol.bpc - 1;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
18540: e1a02001 mov r2, r1
18544: e596009c ldr r0, [r6, #156] ; 0x9c
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
uint32_t cl_mask = fs_info->fat.vol.bpc - 1;
18548: e1d670b6 ldrh r7, [r6, #6]
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
1854c: ebffbecb bl 8080 <rtems_semaphore_obtain>
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
18550: e2508000 subs r8, r0, #0
18554: 0a000004 beq 1856c <msdos_file_stat+0x44>
rtems_set_errno_and_return_minus_one(EIO);
18558: eb0000c2 bl 18868 <__errno> <== NOT EXECUTED
1855c: e3a03005 mov r3, #5 <== NOT EXECUTED
18560: e5803000 str r3, [r0] <== NOT EXECUTED
18564: e3e00000 mvn r0, #0 <== NOT EXECUTED
18568: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
1856c: e5963064 ldr r3, [r6, #100] ; 0x64
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
18570: e893000c ldm r3, {r2, r3}
18574: e884000c stm r4, {r2, r3}
buf->st_ino = fat_fd->ino;
18578: e595300c ldr r3, [r5, #12]
1857c: e5843008 str r3, [r4, #8]
buf->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
18580: e59f3050 ldr r3, [pc, #80] ; 185d8 <msdos_file_stat+0xb0>
buf->st_rdev = 0ll;
18584: e3a02000 mov r2, #0
if (sc != RTEMS_SUCCESSFUL)
rtems_set_errno_and_return_minus_one(EIO);
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
buf->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
18588: e584300c str r3, [r4, #12]
buf->st_rdev = 0ll;
1858c: e3a03000 mov r3, #0
18590: e5842018 str r2, [r4, #24]
18594: e584301c str r3, [r4, #28]
buf->st_size = fat_fd->fat_file_size;
18598: e5953018 ldr r3, [r5, #24]
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = loc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = loc->node_access;
uint32_t cl_mask = fs_info->fat.vol.bpc - 1;
1859c: e2477001 sub r7, r7, #1
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
buf->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
buf->st_rdev = 0ll;
buf->st_size = fat_fd->fat_file_size;
185a0: e5843020 str r3, [r4, #32]
buf->st_blocks = ((fat_fd->fat_file_size + cl_mask) & ~cl_mask)
185a4: e0873003 add r3, r7, r3
185a8: e1c37007 bic r7, r3, r7
>> FAT_SECTOR512_BITS;
buf->st_blksize = fs_info->fat.vol.bpc;
185ac: e1d630b6 ldrh r3, [r6, #6]
185b0: e5843040 str r3, [r4, #64] ; 0x40
buf->st_mtime = fat_fd->mtime;
185b4: e5953040 ldr r3, [r5, #64] ; 0x40
buf->st_ino = fat_fd->ino;
buf->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
buf->st_rdev = 0ll;
buf->st_size = fat_fd->fat_file_size;
buf->st_blocks = ((fat_fd->fat_file_size + cl_mask) & ~cl_mask)
>> FAT_SECTOR512_BITS;
185b8: e1a074a7 lsr r7, r7, #9
buf->st_dev = rtems_disk_get_device_identifier(fs_info->fat.vol.dd);
buf->st_ino = fat_fd->ino;
buf->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO;
buf->st_rdev = 0ll;
buf->st_size = fat_fd->fat_file_size;
185bc: e5848024 str r8, [r4, #36] ; 0x24
buf->st_blocks = ((fat_fd->fat_file_size + cl_mask) & ~cl_mask)
185c0: e5847044 str r7, [r4, #68] ; 0x44
>> FAT_SECTOR512_BITS;
buf->st_blksize = fs_info->fat.vol.bpc;
buf->st_mtime = fat_fd->mtime;
185c4: e5843030 str r3, [r4, #48] ; 0x30
rtems_semaphore_release(fs_info->vol_sema);
185c8: e596009c ldr r0, [r6, #156] ; 0x9c
185cc: ebffbef2 bl 819c <rtems_semaphore_release>
return RC_OK;
185d0: e1a00008 mov r0, r8
}
185d4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
000186c8 <msdos_file_sync>:
int
msdos_file_sync(rtems_libio_t *iop)
{
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
186c8: e5903024 ldr r3, [r0, #36] ; 0x24
* RETURNS:
* RC_OK on success, or -1 if error occured (errno set appropriately)
*/
int
msdos_file_sync(rtems_libio_t *iop)
{
186cc: e92d4030 push {r4, r5, lr}
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
186d0: e5934008 ldr r4, [r3, #8]
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
186d4: e3a01000 mov r1, #0
* RETURNS:
* RC_OK on success, or -1 if error occured (errno set appropriately)
*/
int
msdos_file_sync(rtems_libio_t *iop)
{
186d8: e1a05000 mov r5, r0
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
186dc: e1a02001 mov r2, r1
186e0: e594009c ldr r0, [r4, #156] ; 0x9c
186e4: ebffbe65 bl 8080 <rtems_semaphore_obtain>
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
186e8: e3500000 cmp r0, #0
186ec: 0a000004 beq 18704 <msdos_file_sync+0x3c>
rtems_set_errno_and_return_minus_one(EIO);
186f0: eb00005c bl 18868 <__errno> <== NOT EXECUTED
186f4: e3a03005 mov r3, #5 <== NOT EXECUTED
186f8: e5803000 str r3, [r0] <== NOT EXECUTED
186fc: e3e05000 mvn r5, #0 <== NOT EXECUTED
18700: ea000007 b 18724 <msdos_file_sync+0x5c> <== NOT EXECUTED
rc = msdos_file_update(iop);
18704: e1a00005 mov r0, r5
18708: ebffff06 bl 18328 <msdos_file_update>
if (rc != RC_OK)
1870c: e2505000 subs r5, r0, #0
18710: 1a000001 bne 1871c <msdos_file_sync+0x54>
{
rtems_semaphore_release(fs_info->vol_sema);
return rc;
}
rc = fat_sync(&fs_info->fat);
18714: e1a00004 mov r0, r4
18718: ebffe42a bl 117c8 <fat_sync>
rtems_semaphore_release(fs_info->vol_sema);
1871c: e594009c ldr r0, [r4, #156] ; 0x9c
18720: ebffbe9d bl 819c <rtems_semaphore_release>
return RC_OK;
}
18724: e1a00005 mov r0, r5
18728: e8bd8030 pop {r4, r5, pc}
00018328 <msdos_file_update>:
#include "msdos.h"
static int
msdos_file_update(rtems_libio_t *iop)
{
18328: e92d4030 push {r4, r5, lr}
int rc = RC_OK;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
1832c: e5904018 ldr r4, [r0, #24]
/*
* if fat-file descriptor is not marked as "removed", synchronize
* size, first cluster number, write time and date fields of the file
*/
if (!FAT_FILE_IS_REMOVED(fat_fd))
18330: e5d43030 ldrb r3, [r4, #48] ; 0x30
18334: e3130001 tst r3, #1
#include "msdos.h"
static int
msdos_file_update(rtems_libio_t *iop)
{
18338: e1a05000 mov r5, r0
/*
* if fat-file descriptor is not marked as "removed", synchronize
* size, first cluster number, write time and date fields of the file
*/
if (!FAT_FILE_IS_REMOVED(fat_fd))
1833c: 1a000009 bne 18368 <msdos_file_update+0x40>
18340: ea00000a b 18370 <msdos_file_update+0x48>
if (rc != RC_OK)
{
return rc;
}
rc = msdos_set_file_size(iop->pathinfo.mt_entry, fat_fd);
18344: e5950024 ldr r0, [r5, #36] ; 0x24
18348: e1a01004 mov r1, r4
1834c: ebfff52a bl 157fc <msdos_set_file_size>
if (rc != RC_OK)
18350: e3500000 cmp r0, #0
18354: 18bd8030 popne {r4, r5, pc}
{
return rc;
}
rc = msdos_set_dir_wrt_time_and_date(iop->pathinfo.mt_entry, fat_fd);
18358: e5950024 ldr r0, [r5, #36] ; 0x24
1835c: e1a01004 mov r1, r4
return rc;
}
}
return rc;
}
18360: e8bd4030 pop {r4, r5, lr}
if (rc != RC_OK)
{
return rc;
}
rc = msdos_set_dir_wrt_time_and_date(iop->pathinfo.mt_entry, fat_fd);
18364: eafff4d1 b 156b0 <msdos_set_dir_wrt_time_and_date>
#include "msdos.h"
static int
msdos_file_update(rtems_libio_t *iop)
{
int rc = RC_OK;
18368: e3a00000 mov r0, #0 <== NOT EXECUTED
return rc;
}
}
return rc;
}
1836c: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
* if fat-file descriptor is not marked as "removed", synchronize
* size, first cluster number, write time and date fields of the file
*/
if (!FAT_FILE_IS_REMOVED(fat_fd))
{
rc = msdos_set_first_cluster_num(iop->pathinfo.mt_entry, fat_fd);
18370: e5900024 ldr r0, [r0, #36] ; 0x24
18374: e1a01004 mov r1, r4
18378: ebfff4f9 bl 15764 <msdos_set_first_cluster_num>
if (rc != RC_OK)
1837c: e3500000 cmp r0, #0
18380: 18bd8030 popne {r4, r5, pc}
18384: eaffffee b 18344 <msdos_file_update+0x1c>
00018468 <msdos_file_write>:
ssize_t
msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
{
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
18468: e5903024 ldr r3, [r0, #36] ; 0x24
* the number of bytes written on success, or -1 if error occured
* and errno set appropriately
*/
ssize_t
msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
{
1846c: e92d41f1 push {r0, r4, r5, r6, r7, r8, lr}
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
18470: e5936008 ldr r6, [r3, #8]
* the number of bytes written on success, or -1 if error occured
* and errno set appropriately
*/
ssize_t
msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
{
18474: e1a08001 mov r8, r1
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
18478: e3a01000 mov r1, #0
msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
{
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
1847c: e5905018 ldr r5, [r0, #24]
* the number of bytes written on success, or -1 if error occured
* and errno set appropriately
*/
ssize_t
msdos_file_write(rtems_libio_t *iop,const void *buffer, size_t count)
{
18480: e1a04000 mov r4, r0
18484: e1a07002 mov r7, r2
ssize_t ret = 0;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
fat_file_fd_t *fat_fd = iop->pathinfo.node_access;
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
18488: e596009c ldr r0, [r6, #156] ; 0x9c
1848c: e1a02001 mov r2, r1
18490: ebffbefa bl 8080 <rtems_semaphore_obtain>
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
18494: e3500000 cmp r0, #0
18498: 0a000003 beq 184ac <msdos_file_write+0x44>
rtems_set_errno_and_return_minus_one(EIO);
1849c: eb0000f1 bl 18868 <__errno> <== NOT EXECUTED
184a0: e3a03005 mov r3, #5 <== NOT EXECUTED
184a4: e5803000 str r3, [r0] <== NOT EXECUTED
184a8: ea00000e b 184e8 <msdos_file_write+0x80> <== NOT EXECUTED
if ((iop->flags & LIBIO_FLAGS_APPEND) != 0)
184ac: e594300c ldr r3, [r4, #12]
184b0: e3130c02 tst r3, #512 ; 0x200
iop->offset = fat_fd->fat_file_size;
184b4: 15953018 ldrne r3, [r5, #24]
184b8: 15843004 strne r3, [r4, #4]
184bc: 15840008 strne r0, [r4, #8]
ret = fat_file_write(&fs_info->fat, fat_fd, iop->offset, count,
184c0: e1a03007 mov r3, r7
184c4: e1a00006 mov r0, r6
184c8: e1a01005 mov r1, r5
184cc: e5942004 ldr r2, [r4, #4]
184d0: e58d8000 str r8, [sp]
184d4: ebffe0e4 bl 1086c <fat_file_write>
buffer);
if (ret < 0)
184d8: e2507000 subs r7, r0, #0
184dc: aa000003 bge 184f0 <msdos_file_write+0x88>
{
rtems_semaphore_release(fs_info->vol_sema);
184e0: e596009c ldr r0, [r6, #156] ; 0x9c <== NOT EXECUTED
184e4: ebffbf2c bl 819c <rtems_semaphore_release> <== NOT EXECUTED
return -1;
184e8: e3e07000 mvn r7, #0 <== NOT EXECUTED
184ec: ea00000b b 18520 <msdos_file_write+0xb8> <== NOT EXECUTED
/*
* update file size in both fat-file descriptor and file control block if
* file was extended
*/
iop->offset += ret;
184f0: e994000c ldmib r4, {r2, r3}
if (iop->offset > fat_fd->fat_file_size)
184f4: e595c018 ldr ip, [r5, #24]
/*
* update file size in both fat-file descriptor and file control block if
* file was extended
*/
iop->offset += ret;
184f8: e0922007 adds r2, r2, r7
184fc: e0a33fc7 adc r3, r3, r7, asr #31
if (iop->offset > fat_fd->fat_file_size)
18500: e1a0000c mov r0, ip
18504: e3a01000 mov r1, #0
18508: e1500002 cmp r0, r2
1850c: e0d1c003 sbcs ip, r1, r3
/*
* update file size in both fat-file descriptor and file control block if
* file was extended
*/
iop->offset += ret;
18510: e984000c stmib r4, {r2, r3}
if (iop->offset > fat_fd->fat_file_size)
fat_fd->fat_file_size = iop->offset;
rtems_semaphore_release(fs_info->vol_sema);
18514: e596009c ldr r0, [r6, #156] ; 0x9c
* update file size in both fat-file descriptor and file control block if
* file was extended
*/
iop->offset += ret;
if (iop->offset > fat_fd->fat_file_size)
fat_fd->fat_file_size = iop->offset;
18518: b5852018 strlt r2, [r5, #24]
rtems_semaphore_release(fs_info->vol_sema);
1851c: ebffbf1e bl 819c <rtems_semaphore_release>
return ret;
}
18520: e1a00007 mov r0, r7
18524: e8bd81f8 pop {r3, r4, r5, r6, r7, r8, pc}
00017c08 <msdos_filename_unix2dos>:
* Convert a unix filename to a DOS filename. Return -1 if wrong name is
* supplied.
*/
int
msdos_filename_unix2dos(const char *un, int unlen, char *dn)
{
17c08: e92d4030 push {r4, r5, lr}
/*
* Fill the dos filename string with blanks. These are DOS's pad
* characters.
*/
for (i = 0; i <= 10; i++)
17c0c: e3a03000 mov r3, #0
dn[i] = ' ';
17c10: e3a0c020 mov ip, #32
17c14: e7c2c003 strb ip, [r2, r3]
/*
* Fill the dos filename string with blanks. These are DOS's pad
* characters.
*/
for (i = 0; i <= 10; i++)
17c18: e2833001 add r3, r3, #1
17c1c: e353000b cmp r3, #11
17c20: 1afffffb bne 17c14 <msdos_filename_unix2dos+0xc>
/*
* The filenames "." and ".." are handled specially, since they
* don't follow dos filename rules.
*/
if (un[0] == '.' && unlen == 1) {
17c24: e5d03000 ldrb r3, [r0]
17c28: e353002e cmp r3, #46 ; 0x2e
17c2c: 13a0c000 movne ip, #0
17c30: 03a0c001 moveq ip, #1
17c34: e3510001 cmp r1, #1
17c38: 0353002e cmpeq r3, #46 ; 0x2e
dn[0] = '.';
17c3c: 03a0302e moveq r3, #46 ; 0x2e
17c40: 05c23000 strbeq r3, [r2]
/*
* The filenames "." and ".." are handled specially, since they
* don't follow dos filename rules.
*/
if (un[0] == '.' && unlen == 1) {
17c44: 0a000045 beq 17d60 <msdos_filename_unix2dos+0x158>
dn[0] = '.';
return 0;
}
if (un[0] == '.' && un[1] == '.' && unlen == 2) {
17c48: e35c0000 cmp ip, #0
17c4c: 0a000008 beq 17c74 <msdos_filename_unix2dos+0x6c>
17c50: e5d03001 ldrb r3, [r0, #1] <== NOT EXECUTED
17c54: e3510002 cmp r1, #2 <== NOT EXECUTED
17c58: 0353002e cmpeq r3, #46 ; 0x2e <== NOT EXECUTED
dn[0] = '.';
17c5c: 03a0302e moveq r3, #46 ; 0x2e <== NOT EXECUTED
17c60: 05c23000 strbeq r3, [r2] <== NOT EXECUTED
dn[1] = '.';
17c64: 05c23001 strbeq r3, [r2, #1] <== NOT EXECUTED
*/
if (un[0] == '.' && unlen == 1) {
dn[0] = '.';
return 0;
}
if (un[0] == '.' && un[1] == '.' && unlen == 2) {
17c68: 1a000001 bne 17c74 <msdos_filename_unix2dos+0x6c> <== NOT EXECUTED
17c6c: ea00003b b 17d60 <msdos_filename_unix2dos+0x158> <== NOT EXECUTED
/*
* Remove any dots from the start of a file name.
*/
while (unlen && (*un == '.')) {
un++;
unlen--;
17c70: e2411001 sub r1, r1, #1 <== NOT EXECUTED
}
/*
* Remove any dots from the start of a file name.
*/
while (unlen && (*un == '.')) {
17c74: e3510000 cmp r1, #0
un++;
unlen--;
17c78: e1a0c000 mov ip, r0
}
/*
* Remove any dots from the start of a file name.
*/
while (unlen && (*un == '.')) {
17c7c: 1a000002 bne 17c8c <msdos_filename_unix2dos+0x84>
/*
* Fill the dos filename string with blanks. These are DOS's pad
* characters.
*/
for (i = 0; i <= 10; i++)
17c80: e3a00000 mov r0, #0
* of string, a '.', or 8 characters. Whichever happens first stops
* us. This forms the name portion of the dos filename. Fold to
* upper case.
*/
for (i = 0; i <= 7 && unlen && (c = *un) && c != '.'; i++) {
if (msdos_map[c] == 0)
17c84: e59f50dc ldr r5, [pc, #220] ; 17d68 <msdos_filename_unix2dos+0x160>
17c88: ea00000a b 17cb8 <msdos_filename_unix2dos+0xb0>
}
/*
* Remove any dots from the start of a file name.
*/
while (unlen && (*un == '.')) {
17c8c: e5dc3000 ldrb r3, [ip]
17c90: e353002e cmp r3, #46 ; 0x2e
17c94: e2800001 add r0, r0, #1
17c98: 0afffff4 beq 17c70 <msdos_filename_unix2dos+0x68>
17c9c: eafffff7 b 17c80 <msdos_filename_unix2dos+0x78>
* of string, a '.', or 8 characters. Whichever happens first stops
* us. This forms the name portion of the dos filename. Fold to
* upper case.
*/
for (i = 0; i <= 7 && unlen && (c = *un) && c != '.'; i++) {
if (msdos_map[c] == 0)
17ca0: e7d54004 ldrb r4, [r5, r4]
17ca4: e3540000 cmp r4, #0
17ca8: 0a000013 beq 17cfc <msdos_filename_unix2dos+0xf4>
break;
dn[i] = msdos_map[c];
17cac: e7c24000 strb r4, [r2, r0]
un++;
unlen--;
17cb0: e2411001 sub r1, r1, #1
* Copy the unix filename into the dos filename string upto the end
* of string, a '.', or 8 characters. Whichever happens first stops
* us. This forms the name portion of the dos filename. Fold to
* upper case.
*/
for (i = 0; i <= 7 && unlen && (c = *un) && c != '.'; i++) {
17cb4: e2800001 add r0, r0, #1
17cb8: e2914000 adds r4, r1, #0
17cbc: 13a04001 movne r4, #1
17cc0: e3500007 cmp r0, #7
17cc4: c3a04000 movgt r4, #0
17cc8: e3540000 cmp r4, #0
17ccc: e1a0300c mov r3, ip
17cd0: 0a000009 beq 17cfc <msdos_filename_unix2dos+0xf4>
17cd4: e4dc4001 ldrb r4, [ip], #1
17cd8: e3540000 cmp r4, #0
17cdc: 0a000006 beq 17cfc <msdos_filename_unix2dos+0xf4>
17ce0: e354002e cmp r4, #46 ; 0x2e
17ce4: 1affffed bne 17ca0 <msdos_filename_unix2dos+0x98>
17ce8: ea000003 b 17cfc <msdos_filename_unix2dos+0xf4>
*/
while (unlen && (c = *un)) {
un++;
unlen--;
/* Make sure we've skipped over the dot before stopping. */
if (c == '.')
17cec: e350002e cmp r0, #46 ; 0x2e
/*
* Strip any further characters up to a '.' or the end of the
* string.
*/
while (unlen && (c = *un)) {
un++;
17cf0: e1a0c003 mov ip, r3
unlen--;
17cf4: e2411001 sub r1, r1, #1
/* Make sure we've skipped over the dot before stopping. */
if (c == '.')
17cf8: 0a000005 beq 17d14 <msdos_filename_unix2dos+0x10c>
/*
* Strip any further characters up to a '.' or the end of the
* string.
*/
while (unlen && (c = *un)) {
17cfc: e3510000 cmp r1, #0
un++;
unlen--;
/* Make sure we've skipped over the dot before stopping. */
if (c == '.')
17d00: e1a0c003 mov ip, r3
/*
* Strip any further characters up to a '.' or the end of the
* string.
*/
while (unlen && (c = *un)) {
17d04: 0a000002 beq 17d14 <msdos_filename_unix2dos+0x10c>
17d08: e4d30001 ldrb r0, [r3], #1
17d0c: e3500000 cmp r0, #0
17d10: 1afffff5 bne 17cec <msdos_filename_unix2dos+0xe4>
/*
* Fill the dos filename string with blanks. These are DOS's pad
* characters.
*/
for (i = 0; i <= 10; i++)
17d14: e3a00000 mov r0, #0
17d18: e3a03008 mov r3, #8
* Copy in the extension part of the name, if any. Force to upper
* case. Note that the extension is allowed to contain '.'s.
* Filenames in this form are probably inaccessable under dos.
*/
for (i = 8; i <= 10 && unlen && (c = *un); i++) {
if (msdos_map[c] == 0)
17d1c: e59f5044 ldr r5, [pc, #68] ; 17d68 <msdos_filename_unix2dos+0x160>
17d20: ea000005 b 17d3c <msdos_filename_unix2dos+0x134>
17d24: e7d54004 ldrb r4, [r5, r4]
17d28: e3540000 cmp r4, #0
17d2c: e2800001 add r0, r0, #1
17d30: 0a00000a beq 17d60 <msdos_filename_unix2dos+0x158>
break;
dn[i] = msdos_map[c];
17d34: e7c24003 strb r4, [r2, r3]
/*
* Copy in the extension part of the name, if any. Force to upper
* case. Note that the extension is allowed to contain '.'s.
* Filenames in this form are probably inaccessable under dos.
*/
for (i = 8; i <= 10 && unlen && (c = *un); i++) {
17d38: e2833001 add r3, r3, #1
17d3c: e0514000 subs r4, r1, r0
17d40: 13a04001 movne r4, #1
17d44: e353000a cmp r3, #10
17d48: c3a04000 movgt r4, #0
17d4c: e3540000 cmp r4, #0
17d50: 0a000002 beq 17d60 <msdos_filename_unix2dos+0x158>
17d54: e7dc4000 ldrb r4, [ip, r0]
17d58: e3540000 cmp r4, #0
17d5c: 1afffff0 bne 17d24 <msdos_filename_unix2dos+0x11c>
dn[i] = msdos_map[c];
un++;
unlen--;
}
return 0;
}
17d60: e3a00000 mov r0, #0
17d64: e8bd8030 pop {r4, r5, pc}
00016770 <msdos_find_name>:
msdos_find_name(
rtems_filesystem_location_info_t *parent_loc,
const char *name,
int name_len
)
{
16770: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
16774: e24dd040 sub sp, sp, #64 ; 0x40
int rc = RC_OK;
msdos_fs_info_t *fs_info = parent_loc->mt_entry->fs_info;
16778: e5903014 ldr r3, [r0, #20]
fat_file_fd_t *fat_fd = NULL;
1677c: e3a05000 mov r5, #0
fat_dir_pos_t dir_pos;
unsigned short time_val = 0;
unsigned short date = 0;
char node_entry[MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE];
memset(node_entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
16780: e28d400c add r4, sp, #12
msdos_find_name(
rtems_filesystem_location_info_t *parent_loc,
const char *name,
int name_len
)
{
16784: e1a07001 mov r7, r1
16788: e1a09002 mov r9, r2
fat_dir_pos_t dir_pos;
unsigned short time_val = 0;
unsigned short date = 0;
char node_entry[MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE];
memset(node_entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
1678c: e1a01005 mov r1, r5
msdos_find_name(
rtems_filesystem_location_info_t *parent_loc,
const char *name,
int name_len
)
{
16790: e1a08000 mov r8, r0
fat_dir_pos_t dir_pos;
unsigned short time_val = 0;
unsigned short date = 0;
char node_entry[MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE];
memset(node_entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
16794: e3a02020 mov r2, #32
16798: e1a00004 mov r0, r4
const char *name,
int name_len
)
{
int rc = RC_OK;
msdos_fs_info_t *fs_info = parent_loc->mt_entry->fs_info;
1679c: e5936008 ldr r6, [r3, #8]
fat_file_fd_t *fat_fd = NULL;
167a0: e58d503c str r5, [sp, #60] ; 0x3c
fat_dir_pos_t dir_pos;
unsigned short time_val = 0;
unsigned short date = 0;
char node_entry[MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE];
memset(node_entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
167a4: eb000b0c bl 193dc <memset>
name_type = msdos_long_to_short (name,
167a8: e1a01009 mov r1, r9
167ac: e1a02004 mov r2, r4
167b0: e3a0300b mov r3, #11
167b4: e1a00007 mov r0, r7
167b8: ebfffb3e bl 154b8 <msdos_long_to_short>
/*
* find the node which correspondes to the name in the directory pointed by
* 'parent_loc'
*/
rc = msdos_get_name_node(parent_loc, false, name, name_len, name_type,
167bc: e28da02c add sl, sp, #44 ; 0x2c
167c0: e58d0000 str r0, [sp]
167c4: e1a01005 mov r1, r5
167c8: e1a00008 mov r0, r8
167cc: e1a02007 mov r2, r7
167d0: e1a03009 mov r3, r9
167d4: e58da004 str sl, [sp, #4]
167d8: e58d4008 str r4, [sp, #8]
167dc: ebffffae bl 1669c <msdos_get_name_node>
&dir_pos, node_entry);
if (rc != RC_OK)
167e0: e2505000 subs r5, r0, #0
167e4: 1a000045 bne 16900 <msdos_find_name+0x190>
return rc;
if (((*MSDOS_DIR_ATTR(node_entry)) & MSDOS_ATTR_VOLUME_ID) ||
167e8: e5dd3017 ldrb r3, [sp, #23]
167ec: e3130008 tst r3, #8
167f0: 1a000041 bne 168fc <msdos_find_name+0x18c>
((*MSDOS_DIR_ATTR(node_entry) & MSDOS_ATTR_LFN_MASK) == MSDOS_ATTR_LFN))
167f4: e203303f and r3, r3, #63 ; 0x3f
rc = msdos_get_name_node(parent_loc, false, name, name_len, name_type,
&dir_pos, node_entry);
if (rc != RC_OK)
return rc;
if (((*MSDOS_DIR_ATTR(node_entry)) & MSDOS_ATTR_VOLUME_ID) ||
167f8: e353000f cmp r3, #15
167fc: 0a00003e beq 168fc <msdos_find_name+0x18c>
((*MSDOS_DIR_ATTR(node_entry) & MSDOS_ATTR_LFN_MASK) == MSDOS_ATTR_LFN))
return MSDOS_NAME_NOT_FOUND_ERR;
/* open fat-file corresponded to the found node */
rc = fat_file_open(&fs_info->fat, &dir_pos, &fat_fd);
16800: e1a00006 mov r0, r6
16804: e1a0100a mov r1, sl
16808: e28d203c add r2, sp, #60 ; 0x3c
1680c: ebffe63d bl 10108 <fat_file_open>
if (rc != RC_OK)
16810: e2505000 subs r5, r0, #0
16814: 1a000039 bne 16900 <msdos_find_name+0x190>
return rc;
fat_fd->dir_pos = dir_pos;
16818: e59d703c ldr r7, [sp, #60] ; 0x3c
1681c: e89a000f ldm sl, {r0, r1, r2, r3}
16820: e287c020 add ip, r7, #32
16824: e88c000f stm ip, {r0, r1, r2, r3}
* size and first cluster num to the disk after each write operation
* (even if one byte is written - that is TOO slow) because
* otherwise real values of these fields stored in fat-file descriptor
* may be accidentally rewritten with wrong values stored on the disk
*/
if (fat_fd->links_num == 1)
16828: e5973008 ldr r3, [r7, #8]
1682c: e3530001 cmp r3, #1
16830: 1a000026 bne 168d0 <msdos_find_name+0x160>
{
fat_fd->cln = MSDOS_EXTRACT_CLUSTER_NUM(node_entry);
16834: e1d421b4 ldrh r2, [r4, #20]
16838: e1d431ba ldrh r3, [r4, #26]
1683c: e1833802 orr r3, r3, r2, lsl #16
16840: e587301c str r3, [r7, #28]
time_val = *MSDOS_DIR_WRITE_TIME(node_entry);
date = *MSDOS_DIR_WRITE_DATE(node_entry);
fat_fd->mtime = msdos_date_dos2unix(CF_LE_W(date), CF_LE_W(time_val));
16844: e1d411b6 ldrh r1, [r4, #22]
16848: e1d401b8 ldrh r0, [r4, #24]
1684c: eb0004a9 bl 17af8 <msdos_date_dos2unix>
if ((*MSDOS_DIR_ATTR(node_entry)) & MSDOS_ATTR_DIRECTORY)
16850: e5dd3017 ldrb r3, [sp, #23]
16854: e3130010 tst r3, #16
fat_fd->cln = MSDOS_EXTRACT_CLUSTER_NUM(node_entry);
time_val = *MSDOS_DIR_WRITE_TIME(node_entry);
date = *MSDOS_DIR_WRITE_DATE(node_entry);
fat_fd->mtime = msdos_date_dos2unix(CF_LE_W(date), CF_LE_W(time_val));
16858: e5870040 str r0, [r7, #64] ; 0x40
1685c: e59d103c ldr r1, [sp, #60] ; 0x3c
if ((*MSDOS_DIR_ATTR(node_entry)) & MSDOS_ATTR_DIRECTORY)
16860: 0a000007 beq 16884 <msdos_find_name+0x114>
{
fat_fd->fat_file_type = FAT_DIRECTORY;
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
16864: e3a03602 mov r3, #2097152 ; 0x200000
fat_fd->mtime = msdos_date_dos2unix(CF_LE_W(date), CF_LE_W(time_val));
if ((*MSDOS_DIR_ATTR(node_entry)) & MSDOS_ATTR_DIRECTORY)
{
fat_fd->fat_file_type = FAT_DIRECTORY;
16868: e5815010 str r5, [r1, #16]
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
1686c: e5813014 str r3, [r1, #20]
rc = fat_file_size(&fs_info->fat, fat_fd);
16870: e1a00006 mov r0, r6
16874: ebffe897 bl 10ad8 <fat_file_size>
if (rc != RC_OK)
16878: e2505000 subs r5, r0, #0
1687c: 0a000006 beq 1689c <msdos_find_name+0x12c>
16880: ea000019 b 168ec <msdos_find_name+0x17c> <== NOT EXECUTED
return rc;
}
}
else
{
fat_fd->fat_file_size = CF_LE_L(*MSDOS_DIR_FILE_SIZE(node_entry));
16884: e594301c ldr r3, [r4, #28]
16888: e5813018 str r3, [r1, #24]
fat_fd->fat_file_type = FAT_FILE;
1688c: e3a03004 mov r3, #4
16890: e5813010 str r3, [r1, #16]
fat_fd->size_limit = MSDOS_MAX_FILE_SIZE;
16894: e3e03000 mvn r3, #0
16898: e5813014 str r3, [r1, #20]
}
/* these data is not actual for zero-length fat-file */
fat_fd->map.file_cln = 0;
1689c: e59d303c ldr r3, [sp, #60] ; 0x3c
168a0: e3a02000 mov r2, #0
fat_fd->map.disk_cln = fat_fd->cln;
if ((fat_fd->fat_file_size != 0) &&
168a4: e5931018 ldr r1, [r3, #24]
fat_fd->fat_file_type = FAT_FILE;
fat_fd->size_limit = MSDOS_MAX_FILE_SIZE;
}
/* these data is not actual for zero-length fat-file */
fat_fd->map.file_cln = 0;
168a8: e5832034 str r2, [r3, #52] ; 0x34
fat_fd->map.disk_cln = fat_fd->cln;
168ac: e593201c ldr r2, [r3, #28]
if ((fat_fd->fat_file_size != 0) &&
168b0: e3510000 cmp r1, #0
fat_fd->size_limit = MSDOS_MAX_FILE_SIZE;
}
/* these data is not actual for zero-length fat-file */
fat_fd->map.file_cln = 0;
fat_fd->map.disk_cln = fat_fd->cln;
168b4: e5832038 str r2, [r3, #56] ; 0x38
if ((fat_fd->fat_file_size != 0) &&
168b8: 0a000002 beq 168c8 <msdos_find_name+0x158>
(fat_fd->fat_file_size <= fs_info->fat.vol.bpc))
168bc: e1d600b6 ldrh r0, [r6, #6]
/* these data is not actual for zero-length fat-file */
fat_fd->map.file_cln = 0;
fat_fd->map.disk_cln = fat_fd->cln;
if ((fat_fd->fat_file_size != 0) &&
168c0: e1510000 cmp r1, r0
168c4: 9a000000 bls 168cc <msdos_find_name+0x15c>
{
fat_fd->map.last_cln = fat_fd->cln;
}
else
{
fat_fd->map.last_cln = FAT_UNDEFINED_VALUE;
168c8: e3e02000 mvn r2, #0
168cc: e583203c str r2, [r3, #60] ; 0x3c
}
}
/* close fat-file corresponded to the node we searched in */
rc = fat_file_close(&fs_info->fat, parent_loc->node_access);
168d0: e1a00006 mov r0, r6
168d4: e5981008 ldr r1, [r8, #8]
168d8: ebffe704 bl 104f0 <fat_file_close>
if (rc != RC_OK)
168dc: e2505000 subs r5, r0, #0
fat_file_close(&fs_info->fat, fat_fd);
return rc;
}
/* update node_info_ptr field */
parent_loc->node_access = fat_fd;
168e0: 059d303c ldreq r3, [sp, #60] ; 0x3c
168e4: 05883008 streq r3, [r8, #8]
}
}
/* close fat-file corresponded to the node we searched in */
rc = fat_file_close(&fs_info->fat, parent_loc->node_access);
if (rc != RC_OK)
168e8: 0a000004 beq 16900 <msdos_find_name+0x190>
{
fat_file_close(&fs_info->fat, fat_fd);
168ec: e1a00006 mov r0, r6 <== NOT EXECUTED
168f0: e59d103c ldr r1, [sp, #60] ; 0x3c <== NOT EXECUTED
168f4: ebffe6fd bl 104f0 <fat_file_close> <== NOT EXECUTED
return rc;
168f8: ea000000 b 16900 <msdos_find_name+0x190> <== NOT EXECUTED
if (rc != RC_OK)
return rc;
if (((*MSDOS_DIR_ATTR(node_entry)) & MSDOS_ATTR_VOLUME_ID) ||
((*MSDOS_DIR_ATTR(node_entry) & MSDOS_ATTR_LFN_MASK) == MSDOS_ATTR_LFN))
return MSDOS_NAME_NOT_FOUND_ERR;
168fc: e59f5008 ldr r5, [pc, #8] ; 1690c <msdos_find_name+0x19c> <== NOT EXECUTED
/* update node_info_ptr field */
parent_loc->node_access = fat_fd;
return rc;
}
16900: e1a00005 mov r0, r5
16904: e28dd040 add sp, sp, #64 ; 0x40
16908: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
00015a88 <msdos_find_name_in_fat_file>:
int name_len,
msdos_name_type_t name_type,
fat_dir_pos_t *dir_pos,
char *name_dir_entry
)
{
15a88: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
15a8c: e24dd04c sub sp, sp, #76 ; 0x4c
uint32_t empty_space_count = 0;
bool empty_space_found = false;
uint32_t entries_per_block;
bool read_cluster = false;
assert(name_len > 0);
15a90: e59dc070 ldr ip, [sp, #112] ; 0x70
int name_len,
msdos_name_type_t name_type,
fat_dir_pos_t *dir_pos,
char *name_dir_entry
)
{
15a94: e20220ff and r2, r2, #255 ; 0xff
uint32_t empty_space_count = 0;
bool empty_space_found = false;
uint32_t entries_per_block;
bool read_cluster = false;
assert(name_len > 0);
15a98: e35c0000 cmp ip, #0
int name_len,
msdos_name_type_t name_type,
fat_dir_pos_t *dir_pos,
char *name_dir_entry
)
{
15a9c: e1a06001 mov r6, r1
15aa0: e58d3034 str r3, [sp, #52] ; 0x34
15aa4: e59da078 ldr sl, [sp, #120] ; 0x78
15aa8: e58d2018 str r2, [sp, #24]
ssize_t ret = 0;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
15aac: e5904008 ldr r4, [r0, #8]
uint32_t empty_space_count = 0;
bool empty_space_found = false;
uint32_t entries_per_block;
bool read_cluster = false;
assert(name_len > 0);
15ab0: d59f086c ldrle r0, [pc, #2156] ; 16324 <msdos_find_name_in_fat_file+0x89c>
15ab4: d59f186c ldrle r1, [pc, #2156] ; 16328 <msdos_find_name_in_fat_file+0x8a0>
15ab8: d59f286c ldrle r2, [pc, #2156] ; 1632c <msdos_find_name_in_fat_file+0x8a4>
15abc: d59f386c ldrle r3, [pc, #2156] ; 16330 <msdos_find_name_in_fat_file+0x8a8>
15ac0: da000031 ble 15b8c <msdos_find_name_in_fat_file+0x104>
* is short still check for possible long entries with the short name.
*
* In PR1491 we need to have a LFN for a short file name entry. To
* test this make this test always fail, ie add "0 &&".
*/
if (create_node && (name_type == MSDOS_NAME_SHORT))
15ac4: e59dc018 ldr ip, [sp, #24]
static inline void
fat_dir_pos_init(
fat_dir_pos_t *dir_pos
)
{
dir_pos->sname.cln = 0;
15ac8: e3a08000 mov r8, #0
dir_pos->sname.ofs = 0;
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
15acc: e3e03000 mvn r3, #0
15ad0: e15c0008 cmp ip, r8
static inline void
fat_dir_pos_init(
fat_dir_pos_t *dir_pos
)
{
dir_pos->sname.cln = 0;
15ad4: e58a8000 str r8, [sl]
dir_pos->sname.ofs = 0;
15ad8: e58a8004 str r8, [sl, #4]
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
15adc: e58a3008 str r3, [sl, #8]
dir_pos->lname.ofs = FAT_FILE_SHORT_NAME;
15ae0: e58a300c str r3, [sl, #12]
assert(name_len > 0);
fat_dir_pos_init(dir_pos);
lfn_start.cln = lfn_start.ofs = FAT_FILE_SHORT_NAME;
15ae4: e58d3044 str r3, [sp, #68] ; 0x44
15ae8: e58d3040 str r3, [sp, #64] ; 0x40
* is short still check for possible long entries with the short name.
*
* In PR1491 we need to have a LFN for a short file name entry. To
* test this make this test always fail, ie add "0 &&".
*/
if (create_node && (name_type == MSDOS_NAME_SHORT))
15aec: 0a000002 beq 15afc <msdos_find_name_in_fat_file+0x74>
15af0: e59dc074 ldr ip, [sp, #116] ; 0x74
15af4: e35c0001 cmp ip, #1
15af8: 0a000004 beq 15b10 <msdos_find_name_in_fat_file+0x88>
lfn_entries = 0;
else
lfn_entries =
15afc: e59dc070 ldr ip, [sp, #112] ; 0x70
15b00: e3a0100d mov r1, #13
15b04: e28c000c add r0, ip, #12
15b08: eb00415d bl 26084 <__aeabi_idiv>
15b0c: e1a08000 mov r8, r0
((name_len - 1) + MSDOS_LFN_LEN_PER_ENTRY) / MSDOS_LFN_LEN_PER_ENTRY;
if (FAT_FD_OF_ROOT_DIR(fat_fd) &&
15b10: e5963020 ldr r3, [r6, #32]
15b14: e3530001 cmp r3, #1
15b18: 1a000006 bne 15b38 <msdos_find_name_in_fat_file+0xb0>
15b1c: e5963024 ldr r3, [r6, #36] ; 0x24
15b20: e3530000 cmp r3, #0
15b24: 1a000003 bne 15b38 <msdos_find_name_in_fat_file+0xb0>
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
15b28: e5d4300e ldrb r3, [r4, #14]
lfn_entries = 0;
else
lfn_entries =
((name_len - 1) + MSDOS_LFN_LEN_PER_ENTRY) / MSDOS_LFN_LEN_PER_ENTRY;
if (FAT_FD_OF_ROOT_DIR(fat_fd) &&
15b2c: e3130003 tst r3, #3
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
bts2rd = fat_fd->fat_file_size;
15b30: 15965018 ldrne r5, [r6, #24]
lfn_entries = 0;
else
lfn_entries =
((name_len - 1) + MSDOS_LFN_LEN_PER_ENTRY) / MSDOS_LFN_LEN_PER_ENTRY;
if (FAT_FD_OF_ROOT_DIR(fat_fd) &&
15b34: 1a000000 bne 15b3c <msdos_find_name_in_fat_file+0xb4>
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
bts2rd = fat_fd->fat_file_size;
else
bts2rd = fs_info->fat.vol.bpc;
15b38: e1d450b6 ldrh r5, [r4, #6]
/*
* Scan the directory seeing if the file is present. While
* doing this see if a suitable location can be found to
* create the entry if the name is not found.
*/
while ((ret = fat_file_read(&fs_info->fat, fat_fd, (dir_offset * bts2rd),
15b3c: e3a07000 mov r7, #0
int lfn_entries;
int lfn_entry = 0;
uint32_t empty_space_offset = 0;
uint32_t empty_space_entry = 0;
uint32_t empty_space_count = 0;
bool empty_space_found = false;
15b40: e58d7014 str r7, [sp, #20]
uint8_t lfn_checksum = 0;
int lfn_entries;
int lfn_entry = 0;
uint32_t empty_space_offset = 0;
uint32_t empty_space_entry = 0;
uint32_t empty_space_count = 0;
15b44: e1a09007 mov r9, r7
bool lfn_matched = false;
uint8_t lfn_checksum = 0;
int lfn_entries;
int lfn_entry = 0;
uint32_t empty_space_offset = 0;
uint32_t empty_space_entry = 0;
15b48: e1a0b007 mov fp, r7
fat_pos_t lfn_start;
bool lfn_matched = false;
uint8_t lfn_checksum = 0;
int lfn_entries;
int lfn_entry = 0;
uint32_t empty_space_offset = 0;
15b4c: e58d701c str r7, [sp, #28]
uint32_t bts2rd = 0;
fat_pos_t lfn_start;
bool lfn_matched = false;
uint8_t lfn_checksum = 0;
int lfn_entries;
int lfn_entry = 0;
15b50: e58d7010 str r7, [sp, #16]
uint32_t dir_offset = 0;
uint32_t dir_entry = 0;
uint32_t bts2rd = 0;
fat_pos_t lfn_start;
bool lfn_matched = false;
uint8_t lfn_checksum = 0;
15b54: e58d702c str r7, [sp, #44] ; 0x2c
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t dir_offset = 0;
uint32_t dir_entry = 0;
uint32_t bts2rd = 0;
fat_pos_t lfn_start;
bool lfn_matched = false;
15b58: e58d7028 str r7, [sp, #40] ; 0x28
char *name_dir_entry
)
{
ssize_t ret = 0;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t dir_offset = 0;
15b5c: e58d700c str r7, [sp, #12]
15b60: e58d6024 str r6, [sp, #36] ; 0x24
15b64: e58da030 str sl, [sp, #48] ; 0x30
/*
* Scan the directory seeing if the file is present. While
* doing this see if a suitable location can be found to
* create the entry if the name is not found.
*/
while ((ret = fat_file_read(&fs_info->fat, fat_fd, (dir_offset * bts2rd),
15b68: ea0000d9 b 15ed4 <msdos_find_name_in_fat_file+0x44c>
bool remainder_empty = false;
#if MSDOS_FIND_PRINT
printf ("MSFS:[2] dir_offset:%li\n", dir_offset);
#endif
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
15b6c: e350001f cmp r0, #31
15b70: da0001d4 ble 162c8 <msdos_find_name_in_fat_file+0x840>
rtems_set_errno_and_return_minus_one(EIO);
assert(ret == bts2rd);
15b74: e1500005 cmp r0, r5
15b78: 0a000004 beq 15b90 <msdos_find_name_in_fat_file+0x108>
15b7c: e59f07a0 ldr r0, [pc, #1952] ; 16324 <msdos_find_name_in_fat_file+0x89c><== NOT EXECUTED
15b80: e59f17ac ldr r1, [pc, #1964] ; 16334 <msdos_find_name_in_fat_file+0x8ac><== NOT EXECUTED
15b84: e59f27a0 ldr r2, [pc, #1952] ; 1632c <msdos_find_name_in_fat_file+0x8a4><== NOT EXECUTED
15b88: e59f37a8 ldr r3, [pc, #1960] ; 16338 <msdos_find_name_in_fat_file+0x8b0><== NOT EXECUTED
15b8c: ebfff1e6 bl 1232c <__assert_func> <== NOT EXECUTED
/*
* Remainder is not empty so is this entry empty ?
*/
empty_space_count++;
if (empty_space_count == (lfn_entries + 1))
15b90: e2883001 add r3, r8, #1
15b94: e58d303c str r3, [sp, #60] ; 0x3c
15b98: e59d3028 ldr r3, [sp, #40] ; 0x28
#endif
if (ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
rtems_set_errno_and_return_minus_one(EIO);
assert(ret == bts2rd);
15b9c: e3a06000 mov r6, #0
memcpy(name_dir_entry, entry,
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
return RC_OK;
}
lfn_start.cln = FAT_FILE_SHORT_NAME;
15ba0: e3e0a000 mvn sl, #0
/*
* Remainder is not empty so is this entry empty ?
*/
empty_space_count++;
if (empty_space_count == (lfn_entries + 1))
15ba4: e1a0c007 mov ip, r7
/* have to look at the DIR_NAME as "raw" 8-bit data */
for (dir_entry = 0;
dir_entry < bts2rd;
dir_entry += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + dir_entry;
15ba8: e59420a0 ldr r2, [r4, #160] ; 0xa0
* to here and write the long file name if this is the start of
* a series of empty entries. If empty_space_count is 0 then
* we are currently not inside an empty series of entries. It
* is a count of empty entries.
*/
if (empty_space_count == 0)
15bac: e59d001c ldr r0, [sp, #28]
/* have to look at the DIR_NAME as "raw" 8-bit data */
for (dir_entry = 0;
dir_entry < bts2rd;
dir_entry += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + dir_entry;
15bb0: e0827006 add r7, r2, r6
* to here and write the long file name if this is the start of
* a series of empty entries. If empty_space_count is 0 then
* we are currently not inside an empty series of entries. It
* is a count of empty entries.
*/
if (empty_space_count == 0)
15bb4: e59d100c ldr r1, [sp, #12]
/*
* See if the entry is empty or the remainder of the directory is
* empty ? Localise to make the code read better.
*/
bool entry_empty = (*MSDOS_DIR_ENTRY_TYPE(entry) ==
15bb8: e7d22006 ldrb r2, [r2, r6]
* to here and write the long file name if this is the start of
* a series of empty entries. If empty_space_count is 0 then
* we are currently not inside an empty series of entries. It
* is a count of empty entries.
*/
if (empty_space_count == 0)
15bbc: e3590000 cmp r9, #0
15bc0: 01a00001 moveq r0, r1
15bc4: 01a0b006 moveq fp, r6
{
empty_space_entry = dir_entry;
empty_space_offset = dir_offset;
}
if (remainder_empty)
15bc8: e3520000 cmp r2, #0
* to here and write the long file name if this is the start of
* a series of empty entries. If empty_space_count is 0 then
* we are currently not inside an empty series of entries. It
* is a count of empty entries.
*/
if (empty_space_count == 0)
15bcc: e58d001c str r0, [sp, #28]
{
empty_space_entry = dir_entry;
empty_space_offset = dir_offset;
}
if (remainder_empty)
15bd0: 1a00000a bne 15c00 <msdos_find_name_in_fat_file+0x178>
#endif
/*
* If just looking and there is no more entries in the
* directory - return name-not-found
*/
if (!create_node)
15bd4: e59d2018 ldr r2, [sp, #24]
15bd8: e3520000 cmp r2, #0
15bdc: e1a0c006 mov ip, r6
15be0: e59da030 ldr sl, [sp, #48] ; 0x30
15be4: e59d6024 ldr r6, [sp, #36] ; 0x24
15be8: 0a0001c5 beq 16304 <msdos_find_name_in_fat_file+0x87c>
* Lets go and write the directory entries. If we have not found
* any available space add the remaining number of entries to any that
* we may have already found that are just before this entry. If more
* are needed FAT_EOF is returned by the read and we extend the file.
*/
if (!empty_space_found)
15bec: e59d3014 ldr r3, [sp, #20]
15bf0: e3530000 cmp r3, #0
{
empty_space_count +=
entries_per_block - (dir_entry / MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
15bf4: 008992a5 addeq r9, r9, r5, lsr #5
* we may have already found that are just before this entry. If more
* are needed FAT_EOF is returned by the read and we extend the file.
*/
if (!empty_space_found)
{
empty_space_count +=
15bf8: 004992ac subeq r9, r9, ip, lsr #5
15bfc: ea0000c2 b 15f0c <msdos_find_name_in_fat_file+0x484>
printf ("MSFS:[3.2] esf:%i esc%i\n", empty_space_found, empty_space_count);
#endif
}
break;
}
else if (entry_empty)
15c00: e35200e5 cmp r2, #229 ; 0xe5
{
if (create_node)
15c04: e59d0018 ldr r0, [sp, #24]
printf ("MSFS:[3.2] esf:%i esc%i\n", empty_space_found, empty_space_count);
#endif
}
break;
}
else if (entry_empty)
15c08: 1a000008 bne 15c30 <msdos_find_name_in_fat_file+0x1a8>
{
if (create_node)
15c0c: e3500000 cmp r0, #0
15c10: 0a0000a7 beq 15eb4 <msdos_find_name_in_fat_file+0x42c>
* Remainder is not empty so is this entry empty ?
*/
empty_space_count++;
if (empty_space_count == (lfn_entries + 1))
empty_space_found = true;
15c14: e59d203c ldr r2, [sp, #60] ; 0x3c
if (create_node)
{
/*
* Remainder is not empty so is this entry empty ?
*/
empty_space_count++;
15c18: e2899001 add r9, r9, #1
if (empty_space_count == (lfn_entries + 1))
empty_space_found = true;
15c1c: e59d1014 ldr r1, [sp, #20]
15c20: e1590002 cmp r9, r2
15c24: 03a01001 moveq r1, #1
15c28: e58d1014 str r1, [sp, #20]
15c2c: ea0000a0 b 15eb4 <msdos_find_name_in_fat_file+0x42c>
* A valid entry so handle it.
*
* If empty space has not been found we need to start the
* count again.
*/
if (create_node && !empty_space_found)
15c30: e3500000 cmp r0, #0
15c34: 0a000003 beq 15c48 <msdos_find_name_in_fat_file+0x1c0>
{
empty_space_entry = 0;
empty_space_count = 0;
15c38: e59d1014 ldr r1, [sp, #20]
15c3c: e3510000 cmp r1, #0
15c40: 01a09001 moveq r9, r1
15c44: 01a0b001 moveq fp, r1
/*
* Check the attribute to see if the entry is for a long
* file name.
*/
if ((*MSDOS_DIR_ATTR(entry) & MSDOS_ATTR_LFN_MASK) ==
15c48: e5d7100b ldrb r1, [r7, #11]
15c4c: e201103f and r1, r1, #63 ; 0x3f
15c50: e351000f cmp r1, #15
15c54: 1a00004f bne 15d98 <msdos_find_name_in_fat_file+0x310>
#endif
/*
* If we are not already processing a LFN see if this is
* the first entry of a LFN ?
*/
if (lfn_start.cln == FAT_FILE_SHORT_NAME)
15c58: e59d1040 ldr r1, [sp, #64] ; 0x40
15c5c: e3710001 cmn r1, #1
15c60: 1a00000b bne 15c94 <msdos_find_name_in_fat_file+0x20c>
/*
* The first entry must have the last long entry
* flag set.
*/
if ((*MSDOS_DIR_ENTRY_TYPE(entry) &
15c64: e2123040 ands r3, r2, #64 ; 0x40
15c68: 0a000091 beq 15eb4 <msdos_find_name_in_fat_file+0x42c>
* entry match the number we expect for this
* file name. Note we do not know the number of
* characters in the entry so this is check further
* on when the characters are checked.
*/
if (lfn_entries != (*MSDOS_DIR_ENTRY_TYPE(entry) &
15c6c: e202203f and r2, r2, #63 ; 0x3f
15c70: e1580002 cmp r8, r2
15c74: 1a00008d bne 15eb0 <msdos_find_name_in_fat_file+0x428>
continue;
/*
* Get the checksum of the short entry.
*/
lfn_start.cln = dir_offset;
15c78: e59d200c ldr r2, [sp, #12]
lfn_start.ofs = dir_entry;
lfn_entry = lfn_entries;
lfn_checksum = *MSDOS_DIR_LFN_CHECKSUM(entry);
15c7c: e5d7300d ldrb r3, [r7, #13]
continue;
/*
* Get the checksum of the short entry.
*/
lfn_start.cln = dir_offset;
15c80: e58d2040 str r2, [sp, #64] ; 0x40
lfn_start.ofs = dir_entry;
15c84: e58d6044 str r6, [sp, #68] ; 0x44
lfn_entry = lfn_entries;
lfn_checksum = *MSDOS_DIR_LFN_CHECKSUM(entry);
15c88: e58d8010 str r8, [sp, #16]
15c8c: e58d302c str r3, [sp, #44] ; 0x2c
* If we are not already processing a LFN see if this is
* the first entry of a LFN ?
*/
if (lfn_start.cln == FAT_FILE_SHORT_NAME)
{
lfn_matched = false;
15c90: e3a03000 mov r3, #0
* If the entry number or the check sum do not match
* forget this series of long directory entries. These
* could be orphaned entries depending on the history
* of the disk.
*/
if ((lfn_entry != (*MSDOS_DIR_ENTRY_TYPE(entry) &
15c94: e5d72000 ldrb r2, [r7]
15c98: e59d0010 ldr r0, [sp, #16]
15c9c: e202203f and r2, r2, #63 ; 0x3f
15ca0: e1500002 cmp r0, r2
15ca4: 1a000003 bne 15cb8 <msdos_find_name_in_fat_file+0x230>
MSDOS_LAST_LONG_ENTRY_MASK)) ||
15ca8: e5d7200d ldrb r2, [r7, #13]
15cac: e59d102c ldr r1, [sp, #44] ; 0x2c
15cb0: e1520001 cmp r2, r1
15cb4: 0a000001 beq 15cc0 <msdos_find_name_in_fat_file+0x238>
(lfn_checksum != *MSDOS_DIR_LFN_CHECKSUM(entry)))
{
#if MSDOS_FIND_PRINT
printf ("MSFS:[4.4] no match\n");
#endif
lfn_start.cln = FAT_FILE_SHORT_NAME;
15cb8: e58da040 str sl, [sp, #64] ; 0x40 <== NOT EXECUTED
continue;
15cbc: ea00007c b 15eb4 <msdos_find_name_in_fat_file+0x42c> <== NOT EXECUTED
}
lfn_entry--;
15cc0: e59d3010 ldr r3, [sp, #16]
o = lfn_entry * MSDOS_LFN_LEN_PER_ENTRY;
15cc4: e3a0000d mov r0, #13
#endif
lfn_start.cln = FAT_FILE_SHORT_NAME;
continue;
}
lfn_entry--;
15cc8: e2432001 sub r2, r3, #1
o = lfn_entry * MSDOS_LFN_LEN_PER_ENTRY;
15ccc: e0010290 mul r1, r0, r2
* RC_OK on success, or error code if error occured (errno set
* appropriately)
*
*/
#define MSDOS_FIND_PRINT 0
int msdos_find_name_in_fat_file(
15cd0: e59d0034 ldr r0, [sp, #52] ; 0x34
15cd4: e0800001 add r0, r0, r1
15cd8: e58d0038 str r0, [sp, #56] ; 0x38
15cdc: e58d1004 str r1, [sp, #4]
continue;
}
lfn_entry--;
o = lfn_entry * MSDOS_LFN_LEN_PER_ENTRY;
p = entry + 1;
15ce0: e2877001 add r7, r7, #1
#if MSDOS_FIND_PRINT
printf ("MSFS:[5] lfne:%i\n", lfn_entry);
#endif
for (i = 0; i < MSDOS_LFN_LEN_PER_ENTRY; i++)
15ce4: e3a03000 mov r3, #0
{
#if MSDOS_FIND_PRINT > 1
printf ("MSFS:[6] o:%i i:%i *p:%c(%02x) name[o + i]:%c(%02x)\n",
o, i, *p, *p, name[o + i], name[o + i]);
#endif
if (*p == '\0')
15ce8: e5d71000 ldrb r1, [r7]
15cec: e3510000 cmp r1, #0
15cf0: e58d1028 str r1, [sp, #40] ; 0x28
15cf4: 1a000008 bne 15d1c <msdos_find_name_in_fat_file+0x294>
/*
* If this is the first entry, ie the last part of the
* long file name and the length does not match then
* the file names do not match.
*/
if (((lfn_entry + 1) == lfn_entries) &&
15cf8: e59d0010 ldr r0, [sp, #16]
15cfc: e1500008 cmp r0, r8
15d00: e59d1004 ldr r1, [sp, #4]
15d04: 1a00001a bne 15d74 <msdos_find_name_in_fat_file+0x2ec>
((o + i) != name_len))
15d08: e0813003 add r3, r1, r3
/*
* If this is the first entry, ie the last part of the
* long file name and the length does not match then
* the file names do not match.
*/
if (((lfn_entry + 1) == lfn_entries) &&
15d0c: e59d1070 ldr r1, [sp, #112] ; 0x70
15d10: e1530001 cmp r3, r1
15d14: 1a00000b bne 15d48 <msdos_find_name_in_fat_file+0x2c0>
15d18: ea000015 b 15d74 <msdos_find_name_in_fat_file+0x2ec>
* RC_OK on success, or error code if error occured (errno set
* appropriately)
*
*/
#define MSDOS_FIND_PRINT 0
int msdos_find_name_in_fat_file(
15d1c: e59d0004 ldr r0, [sp, #4]
((o + i) != name_len))
lfn_start.cln = FAT_FILE_SHORT_NAME;
break;
}
if (((o + i) >= name_len) || (*p != name[o + i]))
15d20: e59d1070 ldr r1, [sp, #112] ; 0x70
* RC_OK on success, or error code if error occured (errno set
* appropriately)
*
*/
#define MSDOS_FIND_PRINT 0
int msdos_find_name_in_fat_file(
15d24: e0830000 add r0, r3, r0
((o + i) != name_len))
lfn_start.cln = FAT_FILE_SHORT_NAME;
break;
}
if (((o + i) >= name_len) || (*p != name[o + i]))
15d28: e1500001 cmp r0, r1
* RC_OK on success, or error code if error occured (errno set
* appropriately)
*
*/
#define MSDOS_FIND_PRINT 0
int msdos_find_name_in_fat_file(
15d2c: e58d0020 str r0, [sp, #32]
((o + i) != name_len))
lfn_start.cln = FAT_FILE_SHORT_NAME;
break;
}
if (((o + i) >= name_len) || (*p != name[o + i]))
15d30: aa000004 bge 15d48 <msdos_find_name_in_fat_file+0x2c0>
15d34: e59d0038 ldr r0, [sp, #56] ; 0x38
15d38: e59d1028 ldr r1, [sp, #40] ; 0x28
15d3c: e7d00003 ldrb r0, [r0, r3]
15d40: e1500001 cmp r0, r1
15d44: 0a000001 beq 15d50 <msdos_find_name_in_fat_file+0x2c8>
{
lfn_start.cln = FAT_FILE_SHORT_NAME;
15d48: e58da040 str sl, [sp, #64] ; 0x40
break;
15d4c: ea000008 b 15d74 <msdos_find_name_in_fat_file+0x2ec>
}
switch (i)
15d50: e3530004 cmp r3, #4
{
case 4:
p += 5;
15d54: 02877005 addeq r7, r7, #5
{
lfn_start.cln = FAT_FILE_SHORT_NAME;
break;
}
switch (i)
15d58: 0a000002 beq 15d68 <msdos_find_name_in_fat_file+0x2e0>
15d5c: e353000a cmp r3, #10
break;
case 10:
p += 4;
break;
default:
p += 2;
15d60: 12877002 addne r7, r7, #2
{
case 4:
p += 5;
break;
case 10:
p += 4;
15d64: 02877004 addeq r7, r7, #4
p = entry + 1;
#if MSDOS_FIND_PRINT
printf ("MSFS:[5] lfne:%i\n", lfn_entry);
#endif
for (i = 0; i < MSDOS_LFN_LEN_PER_ENTRY; i++)
15d68: e2833001 add r3, r3, #1
15d6c: e353000d cmp r3, #13
15d70: 1affffdc bne 15ce8 <msdos_find_name_in_fat_file+0x260>
p += 2;
break;
}
}
lfn_matched = ((lfn_entry == 0) &&
15d74: e3520000 cmp r2, #0
15d78: 13a03000 movne r3, #0
15d7c: 1a000002 bne 15d8c <msdos_find_name_in_fat_file+0x304>
* RC_OK on success, or error code if error occured (errno set
* appropriately)
*
*/
#define MSDOS_FIND_PRINT 0
int msdos_find_name_in_fat_file(
15d80: e59d3040 ldr r3, [sp, #64] ; 0x40
15d84: e2933001 adds r3, r3, #1
15d88: 13a03001 movne r3, #1
p += 2;
break;
}
}
lfn_matched = ((lfn_entry == 0) &&
15d8c: e20330ff and r3, r3, #255 ; 0xff
#endif
lfn_start.cln = FAT_FILE_SHORT_NAME;
continue;
}
lfn_entry--;
15d90: e58d2010 str r2, [sp, #16]
15d94: ea000046 b 15eb4 <msdos_find_name_in_fat_file+0x42c>
* If a LFN has been found and it matched check the
* entries have all been found and the checksum is
* correct. If this is the case return the short file
* name entry.
*/
if (lfn_matched)
15d98: e3530000 cmp r3, #0
15d9c: 0a00000f beq 15de0 <msdos_find_name_in_fat_file+0x358>
15da0: e3a02000 mov r2, #0
15da4: e1a03002 mov r3, r2
uint8_t cs = 0;
uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(entry);
int i;
for (i = 0; i < MSDOS_SHORT_NAME_LEN; i++, p++)
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
15da8: e7d71002 ldrb r1, [r7, r2]
15dac: e2130001 ands r0, r3, #1
15db0: 13a00080 movne r0, #128 ; 0x80
15db4: e08130a3 add r3, r1, r3, lsr #1
{
uint8_t cs = 0;
uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(entry);
int i;
for (i = 0; i < MSDOS_SHORT_NAME_LEN; i++, p++)
15db8: e2822001 add r2, r2, #1
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
15dbc: e0833000 add r3, r3, r0
{
uint8_t cs = 0;
uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(entry);
int i;
for (i = 0; i < MSDOS_SHORT_NAME_LEN; i++, p++)
15dc0: e352000b cmp r2, #11
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
15dc4: e20330ff and r3, r3, #255 ; 0xff
{
uint8_t cs = 0;
uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(entry);
int i;
for (i = 0; i < MSDOS_SHORT_NAME_LEN; i++, p++)
15dc8: 1afffff6 bne 15da8 <msdos_find_name_in_fat_file+0x320>
cs = ((cs & 1) ? 0x80 : 0) + (cs >> 1) + *p;
if (lfn_entry || (lfn_checksum != cs))
15dcc: e59d202c ldr r2, [sp, #44] ; 0x2c
15dd0: e59d0010 ldr r0, [sp, #16]
15dd4: e3500000 cmp r0, #0
15dd8: 01520003 cmpeq r2, r3
15ddc: 0a00000d beq 15e18 <msdos_find_name_in_fat_file+0x390>
* short and they match then we have the entry. We will not
* match a long file name against a short file name because
* a long file name that generates a matching short file
* name is not a long file name.
*/
if (lfn_matched ||
15de0: e59d1074 ldr r1, [sp, #116] ; 0x74
15de4: e3510001 cmp r1, #1
15de8: 1a00002f bne 15eac <msdos_find_name_in_fat_file+0x424>
((name_type == MSDOS_NAME_SHORT) &&
15dec: e59d3040 ldr r3, [sp, #64] ; 0x40
15df0: e3730001 cmn r3, #1
15df4: 1a00002c bne 15eac <msdos_find_name_in_fat_file+0x424>
(lfn_start.cln == FAT_FILE_SHORT_NAME) &&
(memcmp(MSDOS_DIR_NAME(entry),
15df8: e1a00007 mov r0, r7
15dfc: e59d107c ldr r1, [sp, #124] ; 0x7c
15e00: e3a0200b mov r2, #11
15e04: e58dc008 str ip, [sp, #8]
15e08: eb000d10 bl 19250 <memcmp>
* a long file name that generates a matching short file
* name is not a long file name.
*/
if (lfn_matched ||
((name_type == MSDOS_NAME_SHORT) &&
(lfn_start.cln == FAT_FILE_SHORT_NAME) &&
15e0c: e3500000 cmp r0, #0
15e10: e59dc008 ldr ip, [sp, #8]
15e14: 1a000024 bne 15eac <msdos_find_name_in_fat_file+0x424>
15e18: e1a08007 mov r8, r7
15e1c: e1a0700c mov r7, ip
15e20: e1a0c006 mov ip, r6
15e24: e59d6024 ldr r6, [sp, #36] ; 0x24
15e28: e59da030 ldr sl, [sp, #48] ; 0x30
#endif
/*
* We get the entry we looked for - fill the position
* structure and the 32 bytes of the short entry
*/
int rc = fat_file_ioctl(&fs_info->fat, fat_fd, F_CLU_NUM,
15e2c: e1a03007 mov r3, r7
15e30: e1a00004 mov r0, r4
15e34: e1a01006 mov r1, r6
15e38: e3a02001 mov r2, #1
15e3c: e58dc008 str ip, [sp, #8]
15e40: e58da000 str sl, [sp]
15e44: ebffe9d1 bl 10590 <fat_file_ioctl>
dir_offset * bts2rd,
&dir_pos->sname.cln);
if (rc != RC_OK)
15e48: e2507000 subs r7, r0, #0
15e4c: e59dc008 ldr ip, [sp, #8]
15e50: 1a000130 bne 16318 <msdos_find_name_in_fat_file+0x890>
return rc;
dir_pos->sname.ofs = dir_entry;
if (lfn_start.cln != FAT_FILE_SHORT_NAME)
15e54: e59d3040 ldr r3, [sp, #64] ; 0x40
15e58: e3730001 cmn r3, #1
dir_offset * bts2rd,
&dir_pos->sname.cln);
if (rc != RC_OK)
return rc;
dir_pos->sname.ofs = dir_entry;
15e5c: e58ac004 str ip, [sl, #4]
if (lfn_start.cln != FAT_FILE_SHORT_NAME)
15e60: 0a000008 beq 15e88 <msdos_find_name_in_fat_file+0x400>
{
rc = fat_file_ioctl(&fs_info->fat, fat_fd, F_CLU_NUM,
15e64: e28d2040 add r2, sp, #64 ; 0x40
15e68: e58d2000 str r2, [sp]
15e6c: e1a00004 mov r0, r4
15e70: e1a01006 mov r1, r6
15e74: e3a02001 mov r2, #1
15e78: e0030395 mul r3, r5, r3
15e7c: ebffe9c3 bl 10590 <fat_file_ioctl>
lfn_start.cln * bts2rd,
&lfn_start.cln);
if (rc != RC_OK)
15e80: e3500000 cmp r0, #0
15e84: 1a000122 bne 16314 <msdos_find_name_in_fat_file+0x88c>
return rc;
}
dir_pos->lname.cln = lfn_start.cln;
15e88: e59d3040 ldr r3, [sp, #64] ; 0x40
15e8c: e58a3008 str r3, [sl, #8]
dir_pos->lname.ofs = lfn_start.ofs;
15e90: e59d3044 ldr r3, [sp, #68] ; 0x44
memcpy(name_dir_entry, entry,
15e94: e59d007c ldr r0, [sp, #124] ; 0x7c
if (rc != RC_OK)
return rc;
}
dir_pos->lname.cln = lfn_start.cln;
dir_pos->lname.ofs = lfn_start.ofs;
15e98: e58a300c str r3, [sl, #12]
memcpy(name_dir_entry, entry,
15e9c: e1a01008 mov r1, r8
15ea0: e3a02020 mov r2, #32
15ea4: eb000d16 bl 19304 <memcpy>
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
return RC_OK;
15ea8: ea00011a b 16318 <msdos_find_name_in_fat_file+0x890>
}
lfn_start.cln = FAT_FILE_SHORT_NAME;
15eac: e58da040 str sl, [sp, #64] ; 0x40
* If we are not already processing a LFN see if this is
* the first entry of a LFN ?
*/
if (lfn_start.cln == FAT_FILE_SHORT_NAME)
{
lfn_matched = false;
15eb0: e3a03000 mov r3, #0
assert(ret == bts2rd);
/* have to look at the DIR_NAME as "raw" 8-bit data */
for (dir_entry = 0;
dir_entry < bts2rd;
dir_entry += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
15eb4: e2866020 add r6, r6, #32
rtems_set_errno_and_return_minus_one(EIO);
assert(ret == bts2rd);
/* have to look at the DIR_NAME as "raw" 8-bit data */
for (dir_entry = 0;
15eb8: e1560005 cmp r6, r5
15ebc: 3affff39 bcc 15ba8 <msdos_find_name_in_fat_file+0x120>
15ec0: e08c7005 add r7, ip, r5
}
if (remainder_empty)
break;
dir_offset++;
15ec4: e59dc00c ldr ip, [sp, #12]
15ec8: e28cc001 add ip, ip, #1
15ecc: e58d3028 str r3, [sp, #40] ; 0x28
15ed0: e58dc00c str ip, [sp, #12]
/*
* Scan the directory seeing if the file is present. While
* doing this see if a suitable location can be found to
* create the entry if the name is not found.
*/
while ((ret = fat_file_read(&fs_info->fat, fat_fd, (dir_offset * bts2rd),
15ed4: e59430a0 ldr r3, [r4, #160] ; 0xa0
15ed8: e1a00004 mov r0, r4
15edc: e58d3000 str r3, [sp]
15ee0: e59d1024 ldr r1, [sp, #36] ; 0x24
15ee4: e1a02007 mov r2, r7
15ee8: e1a03005 mov r3, r5
15eec: ebffe8da bl 1025c <fat_file_read>
15ef0: e3500000 cmp r0, #0
15ef4: 1affff1c bne 15b6c <msdos_find_name_in_fat_file+0xe4>
}
/*
* If we are not to create the entry return a not found error.
*/
if (!create_node)
15ef8: e59dc018 ldr ip, [sp, #24]
15efc: e35c0000 cmp ip, #0
15f00: e59d6024 ldr r6, [sp, #36] ; 0x24
15f04: e59da030 ldr sl, [sp, #48] ; 0x30
15f08: 0a0000fd beq 16304 <msdos_find_name_in_fat_file+0x87c>
* data to place in each long file name entry. First set the short
* file name to the slot of the SFN entry. This will mean no clashes
* in this directory.
*/
lfn_checksum = 0;
if (name_type == MSDOS_NAME_LONG)
15f0c: e59dc074 ldr ip, [sp, #116] ; 0x74
15f10: e35c0002 cmp ip, #2
15f14: 1a00001f bne 15f98 <msdos_find_name_in_fat_file+0x510>
{
int slot = (((empty_space_offset * bts2rd) + empty_space_entry) /
15f18: e59d101c ldr r1, [sp, #28]
15f1c: e021b195 mla r1, r5, r1, fp
{
static const char* hex = "0123456789ABCDEF";
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
if ((*c == ' ') || (*c == '.'))
15f20: e59dc07c ldr ip, [sp, #124] ; 0x7c
*/
lfn_checksum = 0;
if (name_type == MSDOS_NAME_LONG)
{
int slot = (((empty_space_offset * bts2rd) + empty_space_entry) /
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE) + lfn_entries + 1;
15f24: e2883001 add r3, r8, #1
15f28: e08312a1 add r1, r3, r1, lsr #5
{
static const char* hex = "0123456789ABCDEF";
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
if ((*c == ' ') || (*c == '.'))
15f2c: e5dc3000 ldrb r3, [ip]
15f30: e3530020 cmp r3, #32
15f34: 1353002e cmpne r3, #46 ; 0x2e
*c = '_';
15f38: 03a0305f moveq r3, #95 ; 0x5f
15f3c: 05cc3000 strbeq r3, [ip]
{
static const char* hex = "0123456789ABCDEF";
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
if ((*c == ' ') || (*c == '.'))
15f40: e59dc07c ldr ip, [sp, #124] ; 0x7c
15f44: e5dc3001 ldrb r3, [ip, #1]
15f48: e3530020 cmp r3, #32
15f4c: 1353002e cmpne r3, #46 ; 0x2e
*c = '_';
15f50: 03a0305f moveq r3, #95 ; 0x5f
15f54: 05cc3001 strbeq r3, [ip, #1]
msdos_short_name_hex(char* sfn, int num)
{
static const char* hex = "0123456789ABCDEF";
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
15f58: e59dc07c ldr ip, [sp, #124] ; 0x7c
15f5c: e28c2002 add r2, ip, #2
if ((*c == ' ') || (*c == '.'))
*c = '_';
for (i = 0; i < 4; i++, c++)
*c = hex[(num >> ((3 - i) * 4)) & 0xf];
15f60: e59fc3d4 ldr ip, [pc, #980] ; 1633c <msdos_find_name_in_fat_file+0x8b4>
msdos_short_name_hex(char* sfn, int num)
{
static const char* hex = "0123456789ABCDEF";
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
15f64: e3a0300c mov r3, #12
if ((*c == ' ') || (*c == '.'))
*c = '_';
for (i = 0; i < 4; i++, c++)
*c = hex[(num >> ((3 - i) * 4)) & 0xf];
15f68: e1a00351 asr r0, r1, r3
15f6c: e200000f and r0, r0, #15
15f70: e7dc0000 ldrb r0, [ip, r0]
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
if ((*c == ' ') || (*c == '.'))
*c = '_';
for (i = 0; i < 4; i++, c++)
15f74: e2433004 sub r3, r3, #4
15f78: e3730004 cmn r3, #4
*c = hex[(num >> ((3 - i) * 4)) & 0xf];
15f7c: e4c20001 strb r0, [r2], #1
char* c = MSDOS_DIR_NAME(sfn);
int i;
for (i = 0; i < 2; i++, c++)
if ((*c == ' ') || (*c == '.'))
*c = '_';
for (i = 0; i < 4; i++, c++)
15f80: 1afffff8 bne 15f68 <msdos_find_name_in_fat_file+0x4e0>
*c = hex[(num >> ((3 - i) * 4)) & 0xf];
*c++ = '~';
15f84: e59dc07c ldr ip, [sp, #124] ; 0x7c
15f88: e3a0307e mov r3, #126 ; 0x7e
15f8c: e5cc3006 strb r3, [ip, #6]
*c++ = '1';
15f90: e3a03031 mov r3, #49 ; 0x31
15f94: e5cc3007 strb r3, [ip, #7]
int slot = (((empty_space_offset * bts2rd) + empty_space_entry) /
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE) + lfn_entries + 1;
msdos_short_name_hex(MSDOS_DIR_NAME(name_dir_entry), slot);
}
if (lfn_entries)
15f98: e3580000 cmp r8, #0
* If a long file name calculate the checksum of the short file name
* data to place in each long file name entry. First set the short
* file name to the slot of the SFN entry. This will mean no clashes
* in this directory.
*/
lfn_checksum = 0;
15f9c: 058d8010 streq r8, [sp, #16]
int slot = (((empty_space_offset * bts2rd) + empty_space_entry) /
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE) + lfn_entries + 1;
msdos_short_name_hex(MSDOS_DIR_NAME(name_dir_entry), slot);
}
if (lfn_entries)
15fa0: 0a00000d beq 15fdc <msdos_find_name_in_fat_file+0x554>
15fa4: e3a03000 mov r3, #0
15fa8: e58d3010 str r3, [sp, #16]
15fac: e1a02003 mov r2, r3
{
uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(name_dir_entry);
int i;
for (i = 0; i < 11; i++, p++)
lfn_checksum =
15fb0: e59dc07c ldr ip, [sp, #124] ; 0x7c
15fb4: e7dc0003 ldrb r0, [ip, r3]
15fb8: e2121001 ands r1, r2, #1
15fbc: 13a01080 movne r1, #128 ; 0x80
15fc0: e08020a2 add r2, r0, r2, lsr #1
if (lfn_entries)
{
uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(name_dir_entry);
int i;
for (i = 0; i < 11; i++, p++)
15fc4: e2833001 add r3, r3, #1
lfn_checksum =
15fc8: e0822001 add r2, r2, r1
if (lfn_entries)
{
uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(name_dir_entry);
int i;
for (i = 0; i < 11; i++, p++)
15fcc: e353000b cmp r3, #11
lfn_checksum =
15fd0: e20220ff and r2, r2, #255 ; 0xff
if (lfn_entries)
{
uint8_t* p = (uint8_t*) MSDOS_DIR_NAME(name_dir_entry);
int i;
for (i = 0; i < 11; i++, p++)
15fd4: 1afffff5 bne 15fb0 <msdos_find_name_in_fat_file+0x528>
15fd8: e58d2010 str r2, [sp, #16]
* empty_space_count is a count of empty entries in the currently
* read cluster so if 0 there is no space. Note, dir_offset will
* be at the next cluster so we can just make empty_space_offset
* that value.
*/
if (empty_space_count == 0)
15fdc: e59dc00c ldr ip, [sp, #12]
15fe0: e3590000 cmp r9, #0
15fe4: 058dc01c streq ip, [sp, #28]
{
read_cluster = true;
15fe8: 03a03001 moveq r3, #1
empty_space_offset = dir_offset;
empty_space_entry = 0;
15fec: 01a0b009 moveq fp, r9
* empty_space_count is a count of empty entries in the currently
* read cluster so if 0 there is no space. Note, dir_offset will
* be at the next cluster so we can just make empty_space_offset
* that value.
*/
if (empty_space_count == 0)
15ff0: 0a000002 beq 16000 <msdos_find_name_in_fat_file+0x578>
uint32_t empty_space_offset = 0;
uint32_t empty_space_entry = 0;
uint32_t empty_space_count = 0;
bool empty_space_found = false;
uint32_t entries_per_block;
bool read_cluster = false;
15ff4: e59d001c ldr r0, [sp, #28]
15ff8: e05c3000 subs r3, ip, r0
15ffc: 13a03001 movne r3, #1
read_cluster = true;
/*
* Handle the entry writes.
*/
lfn_start.cln = lfn_start.ofs = FAT_FILE_SHORT_NAME;
16000: e59d901c ldr r9, [sp, #28]
16004: e3e02000 mvn r2, #0
lfn_entry = 0;
16008: e3a0c000 mov ip, #0
read_cluster = true;
/*
* Handle the entry writes.
*/
lfn_start.cln = lfn_start.ofs = FAT_FILE_SHORT_NAME;
1600c: e58d2044 str r2, [sp, #68] ; 0x44
16010: e58d2040 str r2, [sp, #64] ; 0x40
16014: e0090995 mul r9, r5, r9
lfn_entry = 0;
16018: e58dc00c str ip, [sp, #12]
#endif
/*
* The one more is the short entry.
*/
while (lfn_entry < (lfn_entries + 1))
1601c: ea0000b3 b 162f0 <msdos_find_name_in_fat_file+0x868>
{
int length = 0;
if (read_cluster)
16020: e3530000 cmp r3, #0
16024: 0a000009 beq 16050 <msdos_find_name_in_fat_file+0x5c8>
{
uint32_t new_length;
#if MSDOS_FIND_PRINT
printf ("MSFS:[9.1] eso:%li\n", empty_space_offset);
#endif
ret = fat_file_read(&fs_info->fat, fat_fd,
16028: e59430a0 ldr r3, [r4, #160] ; 0xa0
1602c: e1a02009 mov r2, r9
16030: e58d3000 str r3, [sp]
16034: e1a00004 mov r0, r4
16038: e1a01006 mov r1, r6
1603c: e1a03005 mov r3, r5
16040: ebffe885 bl 1025c <fat_file_read>
(empty_space_offset * bts2rd), bts2rd,
fs_info->cl_buf);
if (ret != bts2rd)
16044: e1500005 cmp r0, r5
{
uint32_t new_length;
#if MSDOS_FIND_PRINT
printf ("MSFS:[9.1] eso:%li\n", empty_space_offset);
#endif
ret = fat_file_read(&fs_info->fat, fat_fd,
16048: e1a02000 mov r2, r0
(empty_space_offset * bts2rd), bts2rd,
fs_info->cl_buf);
if (ret != bts2rd)
1604c: 1a000010 bne 16094 <msdos_find_name_in_fat_file+0x60c>
16050: e59dc00c ldr ip, [sp, #12]
16054: e06c3008 rsb r3, ip, r8
16058: e20330ff and r3, r3, #255 ; 0xff
1605c: e58d3014 str r3, [sp, #20]
* RC_OK on success, or error code if error occured (errno set
* appropriately)
*
*/
#define MSDOS_FIND_PRINT 0
int msdos_find_name_in_fat_file(
16060: e59d0034 ldr r0, [sp, #52] ; 0x34
16064: e1e0300c mvn r3, ip
16068: e0883003 add r3, r8, r3
1606c: e3a0200d mov r2, #13
16070: e02c0392 mla ip, r2, r3, r0
16074: e3a01000 mov r1, #0
length, lfn_entry);
#endif
/*
* Time to write the short file name entry.
*/
if (lfn_entry == (lfn_entries + 1))
16078: e2883001 add r3, r8, #1
1607c: e58d3024 str r3, [sp, #36] ; 0x24
* RC_OK on success, or error code if error occured (errno set
* appropriately)
*
*/
#define MSDOS_FIND_PRINT 0
int msdos_find_name_in_fat_file(
16080: e58dc020 str ip, [sp, #32]
16084: e1a03008 mov r3, r8
16088: e58d1018 str r1, [sp, #24]
1608c: e1a0800b mov r8, fp
16090: ea00007b b 16284 <msdos_find_name_in_fat_file+0x7fc>
(empty_space_offset * bts2rd), bts2rd,
fs_info->cl_buf);
if (ret != bts2rd)
{
if (ret != FAT_EOF)
16094: e3500000 cmp r0, #0
16098: 1a00008a bne 162c8 <msdos_find_name_in_fat_file+0x840>
rtems_set_errno_and_return_minus_one(EIO);
#if MSDOS_FIND_PRINT
printf ("MSFS:[9.2] extending file:%li\n", empty_space_offset);
#endif
ret = fat_file_extend (&fs_info->fat, fat_fd, false,
1609c: e28d3048 add r3, sp, #72 ; 0x48
160a0: e58d3000 str r3, [sp]
160a4: e1a01006 mov r1, r6
160a8: e1a00004 mov r0, r4
160ac: e1a03009 mov r3, r9
160b0: ebffe963 bl 10644 <fat_file_extend>
empty_space_offset * bts2rd, &new_length);
if (ret != RC_OK)
160b4: e2501000 subs r1, r0, #0
160b8: 1a000093 bne 1630c <msdos_find_name_in_fat_file+0x884>
return ret;
#if MSDOS_FIND_PRINT
printf ("MSFS:[9.3] extended: %d <-> %d\n", new_length, empty_space_offset * bts2rd);
#endif
if (new_length != (empty_space_offset * bts2rd))
160bc: e59d3048 ldr r3, [sp, #72] ; 0x48
160c0: e1530009 cmp r3, r9
160c4: 1a00007f bne 162c8 <msdos_find_name_in_fat_file+0x840>
rtems_set_errno_and_return_minus_one(EIO);
memset(fs_info->cl_buf, 0, bts2rd);
160c8: e1a02005 mov r2, r5
160cc: e59400a0 ldr r0, [r4, #160] ; 0xa0
160d0: eb000cc1 bl 193dc <memset>
ret = fat_file_write(&fs_info->fat, fat_fd,
160d4: e59430a0 ldr r3, [r4, #160] ; 0xa0
160d8: e1a00004 mov r0, r4
160dc: e58d3000 str r3, [sp]
160e0: e1a01006 mov r1, r6
160e4: e1a02009 mov r2, r9
160e8: e1a03005 mov r3, r5
160ec: ebffe9de bl 1086c <fat_file_write>
empty_space_offset * bts2rd,
bts2rd, fs_info->cl_buf);
#if MSDOS_FIND_PRINT
printf ("MSFS:[9.4] clear write: %d\n", ret);
#endif
if (ret == -1)
160f0: e3700001 cmn r0, #1
160f4: 0a000086 beq 16314 <msdos_find_name_in_fat_file+0x88c>
return ret;
else if (ret != bts2rd)
160f8: e1500005 cmp r0, r5 <== NOT EXECUTED
160fc: 0affffd3 beq 16050 <msdos_find_name_in_fat_file+0x5c8> <== NOT EXECUTED
16100: ea000070 b 162c8 <msdos_find_name_in_fat_file+0x840> <== NOT EXECUTED
char* p;
const char* n;
int i;
char fill = 0;
length += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE;
16104: e59dc018 ldr ip, [sp, #24]
16108: e28cc020 add ip, ip, #32
1610c: e58dc018 str ip, [sp, #24]
lfn_entry++;
16110: e59dc00c ldr ip, [sp, #12]
length, lfn_entry);
#endif
/*
* Time to write the short file name entry.
*/
if (lfn_entry == (lfn_entries + 1))
16114: e59d0024 ldr r0, [sp, #36] ; 0x24
const char* n;
int i;
char fill = 0;
length += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE;
lfn_entry++;
16118: e28cc001 add ip, ip, #1
for (dir_entry = empty_space_entry;
dir_entry < bts2rd;
dir_entry += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + dir_entry;
1611c: e59470a0 ldr r7, [r4, #160] ; 0xa0
length, lfn_entry);
#endif
/*
* Time to write the short file name entry.
*/
if (lfn_entry == (lfn_entries + 1))
16120: e15c0000 cmp ip, r0
for (dir_entry = empty_space_entry;
dir_entry < bts2rd;
dir_entry += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + dir_entry;
16124: e0877008 add r7, r7, r8
const char* n;
int i;
char fill = 0;
length += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE;
lfn_entry++;
16128: e58dc00c str ip, [sp, #12]
length, lfn_entry);
#endif
/*
* Time to write the short file name entry.
*/
if (lfn_entry == (lfn_entries + 1))
1612c: 1a000021 bne 161b8 <msdos_find_name_in_fat_file+0x730>
16130: e1a0c008 mov ip, r8
{
/* get current cluster number */
int rc = fat_file_ioctl(&fs_info->fat, fat_fd, F_CLU_NUM,
16134: e1a00004 mov r0, r4
16138: e1a08003 mov r8, r3
1613c: e1a01006 mov r1, r6
16140: e3a02001 mov r2, #1
16144: e1a03009 mov r3, r9
16148: e58dc008 str ip, [sp, #8]
1614c: e58da000 str sl, [sp]
16150: ebffe90e bl 10590 <fat_file_ioctl>
empty_space_offset * bts2rd,
&dir_pos->sname.cln);
if (rc != RC_OK)
16154: e3500000 cmp r0, #0
16158: e59dc008 ldr ip, [sp, #8]
1615c: 1a00006c bne 16314 <msdos_find_name_in_fat_file+0x88c>
return rc;
dir_pos->sname.ofs = dir_entry;
if (lfn_start.cln != FAT_FILE_SHORT_NAME)
16160: e59d3040 ldr r3, [sp, #64] ; 0x40
16164: e3730001 cmn r3, #1
empty_space_offset * bts2rd,
&dir_pos->sname.cln);
if (rc != RC_OK)
return rc;
dir_pos->sname.ofs = dir_entry;
16168: e58ac004 str ip, [sl, #4]
if (lfn_start.cln != FAT_FILE_SHORT_NAME)
1616c: 0a000008 beq 16194 <msdos_find_name_in_fat_file+0x70c>
{
rc = fat_file_ioctl(&fs_info->fat, fat_fd, F_CLU_NUM,
16170: e28d2040 add r2, sp, #64 ; 0x40
16174: e58d2000 str r2, [sp]
16178: e1a00004 mov r0, r4
1617c: e1a01006 mov r1, r6
16180: e3a02001 mov r2, #1
16184: e0030395 mul r3, r5, r3
16188: ebffe900 bl 10590 <fat_file_ioctl>
lfn_start.cln * bts2rd,
&lfn_start.cln);
if (rc != RC_OK)
1618c: e3500000 cmp r0, #0
16190: 1a00005f bne 16314 <msdos_find_name_in_fat_file+0x88c>
return rc;
}
dir_pos->lname.cln = lfn_start.cln;
16194: e59d3040 ldr r3, [sp, #64] ; 0x40
16198: e58a3008 str r3, [sl, #8]
dir_pos->lname.ofs = lfn_start.ofs;
1619c: e59d3044 ldr r3, [sp, #68] ; 0x44
/* write new node entry */
memcpy (entry, (uint8_t *) name_dir_entry,
161a0: e1a00007 mov r0, r7
if (rc != RC_OK)
return rc;
}
dir_pos->lname.cln = lfn_start.cln;
dir_pos->lname.ofs = lfn_start.ofs;
161a4: e58a300c str r3, [sl, #12]
/* write new node entry */
memcpy (entry, (uint8_t *) name_dir_entry,
161a8: e59d107c ldr r1, [sp, #124] ; 0x7c
161ac: e3a02020 mov r2, #32
161b0: eb000c53 bl 19304 <memcpy>
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
break;
161b4: ea000035 b 16290 <msdos_find_name_in_fat_file+0x808>
* This is a long file name and we need to write
* a long file name entry. See if this is the
* first entry written and if so remember the
* the location of the long file name.
*/
if (lfn_start.cln == FAT_FILE_SHORT_NAME)
161b8: e59d2040 ldr r2, [sp, #64] ; 0x40
161bc: e3720001 cmn r2, #1
{
lfn_start.cln = empty_space_offset;
161c0: 059dc01c ldreq ip, [sp, #28]
}
/*
* Clear the entry before loading the data.
*/
memset (entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
161c4: e3a01000 mov r1, #0
161c8: e3a02020 mov r2, #32
161cc: e1a00007 mov r0, r7
* first entry written and if so remember the
* the location of the long file name.
*/
if (lfn_start.cln == FAT_FILE_SHORT_NAME)
{
lfn_start.cln = empty_space_offset;
161d0: 058dc040 streq ip, [sp, #64] ; 0x40
}
/*
* Clear the entry before loading the data.
*/
memset (entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
161d4: e58d3008 str r3, [sp, #8]
* the location of the long file name.
*/
if (lfn_start.cln == FAT_FILE_SHORT_NAME)
{
lfn_start.cln = empty_space_offset;
lfn_start.ofs = dir_entry;
161d8: 058d8044 streq r8, [sp, #68] ; 0x44
}
/*
* Clear the entry before loading the data.
*/
memset (entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
161dc: eb000c7e bl 193dc <memset>
*MSDOS_DIR_LFN_CHECKSUM(entry) = lfn_checksum;
161e0: e59dc010 ldr ip, [sp, #16]
161e4: e5c7c00d strb ip, [r7, #13]
{
char* entry = (char*) fs_info->cl_buf + dir_entry;
char* p;
const char* n;
int i;
char fill = 0;
161e8: e3a00000 mov r0, #0
memset (entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
*MSDOS_DIR_LFN_CHECKSUM(entry) = lfn_checksum;
p = entry + 1;
n = name + (lfn_entries - lfn_entry) * MSDOS_LFN_LEN_PER_ENTRY;
161ec: e59dc020 ldr ip, [sp, #32]
for (i = 0; i < MSDOS_LFN_LEN_PER_ENTRY; i++)
161f0: e59d3008 ldr r3, [sp, #8]
*/
memset (entry, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
*MSDOS_DIR_LFN_CHECKSUM(entry) = lfn_checksum;
p = entry + 1;
161f4: e2872001 add r2, r7, #1
n = name + (lfn_entries - lfn_entry) * MSDOS_LFN_LEN_PER_ENTRY;
for (i = 0; i < MSDOS_LFN_LEN_PER_ENTRY; i++)
161f8: e1a01000 mov r1, r0
{
if (*n != 0)
161fc: e5dce000 ldrb lr, [ip]
16200: e35e0000 cmp lr, #0
*p = *n;
n++;
}
else
{
p [0] = fill;
16204: 05c20000 strbeq r0, [r2]
p [1] = fill;
16208: 05c20001 strbeq r0, [r2, #1]
for (i = 0; i < MSDOS_LFN_LEN_PER_ENTRY; i++)
{
if (*n != 0)
{
*p = *n;
1620c: 15c2e000 strbne lr, [r2]
n++;
16210: 128cc001 addne ip, ip, #1
}
else
{
p [0] = fill;
p [1] = fill;
fill = 0xff;
16214: 03a000ff moveq r0, #255 ; 0xff
}
switch (i)
16218: e3510004 cmp r1, #4
{
case 4:
p += 5;
1621c: 02822005 addeq r2, r2, #5
p [0] = fill;
p [1] = fill;
fill = 0xff;
}
switch (i)
16220: 0a000002 beq 16230 <msdos_find_name_in_fat_file+0x7a8>
16224: e351000a cmp r1, #10
break;
case 10:
p += 4;
break;
default:
p += 2;
16228: 12822002 addne r2, r2, #2
{
case 4:
p += 5;
break;
case 10:
p += 4;
1622c: 02822004 addeq r2, r2, #4
*MSDOS_DIR_LFN_CHECKSUM(entry) = lfn_checksum;
p = entry + 1;
n = name + (lfn_entries - lfn_entry) * MSDOS_LFN_LEN_PER_ENTRY;
for (i = 0; i < MSDOS_LFN_LEN_PER_ENTRY; i++)
16230: e2811001 add r1, r1, #1
16234: e351000d cmp r1, #13
16238: 1affffef bne 161fc <msdos_find_name_in_fat_file+0x774>
p += 2;
break;
}
}
*MSDOS_DIR_ENTRY_TYPE(entry) = (lfn_entries - lfn_entry) + 1;
1623c: e59dc014 ldr ip, [sp, #20]
16240: e5c7c000 strb ip, [r7]
if (lfn_entry == 1)
16244: e59dc00c ldr ip, [sp, #12]
16248: e35c0001 cmp ip, #1
*MSDOS_DIR_ENTRY_TYPE(entry) |= MSDOS_LAST_LONG_ENTRY;
1624c: 059dc014 ldreq ip, [sp, #20]
16250: 038c2040 orreq r2, ip, #64 ; 0x40
16254: 05c72000 strbeq r2, [r7]
*MSDOS_DIR_ATTR(entry) |= MSDOS_ATTR_LFN;
16258: e5d7200b ldrb r2, [r7, #11]
printf ("MSFS:[10] eso:%li\n", empty_space_offset);
#endif
for (dir_entry = empty_space_entry;
dir_entry < bts2rd;
dir_entry += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
1625c: e59dc014 ldr ip, [sp, #20]
}
*MSDOS_DIR_ENTRY_TYPE(entry) = (lfn_entries - lfn_entry) + 1;
if (lfn_entry == 1)
*MSDOS_DIR_ENTRY_TYPE(entry) |= MSDOS_LAST_LONG_ENTRY;
*MSDOS_DIR_ATTR(entry) |= MSDOS_ATTR_LFN;
16260: e382200f orr r2, r2, #15
16264: e5c7200b strb r2, [r7, #11]
printf ("MSFS:[10] eso:%li\n", empty_space_offset);
#endif
for (dir_entry = empty_space_entry;
dir_entry < bts2rd;
dir_entry += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
16268: e24c2001 sub r2, ip, #1
1626c: e59dc020 ldr ip, [sp, #32]
16270: e20220ff and r2, r2, #255 ; 0xff
16274: e24cc00d sub ip, ip, #13
16278: e58d2014 str r2, [sp, #20]
1627c: e58dc020 str ip, [sp, #32]
16280: e2888020 add r8, r8, #32
#if MSDOS_FIND_PRINT
printf ("MSFS:[10] eso:%li\n", empty_space_offset);
#endif
for (dir_entry = empty_space_entry;
16284: e1580005 cmp r8, r5
16288: 3affff9d bcc 16104 <msdos_find_name_in_fat_file+0x67c>
1628c: e1a08003 mov r8, r3 <== NOT EXECUTED
if (lfn_entry == 1)
*MSDOS_DIR_ENTRY_TYPE(entry) |= MSDOS_LAST_LONG_ENTRY;
*MSDOS_DIR_ATTR(entry) |= MSDOS_ATTR_LFN;
}
ret = fat_file_write(&fs_info->fat, fat_fd,
16290: e59430a0 ldr r3, [r4, #160] ; 0xa0
16294: e083300b add r3, r3, fp
16298: e58d3000 str r3, [sp]
1629c: e1a00004 mov r0, r4
162a0: e1a01006 mov r1, r6
162a4: e089200b add r2, r9, fp
162a8: e59d3018 ldr r3, [sp, #24]
162ac: ebffe96e bl 1086c <fat_file_write>
(empty_space_offset * bts2rd) + empty_space_entry,
length, fs_info->cl_buf + empty_space_entry);
if (ret == -1)
162b0: e3700001 cmn r0, #1
162b4: 0a000016 beq 16314 <msdos_find_name_in_fat_file+0x88c>
return ret;
else if (ret != length)
162b8: e59dc018 ldr ip, [sp, #24]
162bc: e150000c cmp r0, ip
}
ret = fat_file_write(&fs_info->fat, fat_fd,
(empty_space_offset * bts2rd) + empty_space_entry,
length, fs_info->cl_buf + empty_space_entry);
if (ret == -1)
162c0: e0899005 add r9, r9, r5
return ret;
else if (ret != length)
162c4: 0a000004 beq 162dc <msdos_find_name_in_fat_file+0x854>
rtems_set_errno_and_return_minus_one(EIO);
162c8: eb000966 bl 18868 <__errno> <== NOT EXECUTED
162cc: e3a03005 mov r3, #5 <== NOT EXECUTED
162d0: e5803000 str r3, [r0] <== NOT EXECUTED
162d4: e3e07000 mvn r7, #0 <== NOT EXECUTED
162d8: ea00000e b 16318 <msdos_find_name_in_fat_file+0x890> <== NOT EXECUTED
empty_space_offset++;
162dc: e59dc01c ldr ip, [sp, #28]
162e0: e28cc001 add ip, ip, #1
162e4: e58dc01c str ip, [sp, #28]
empty_space_entry = 0;
162e8: e3a0b000 mov fp, #0
read_cluster = true;
162ec: e3a03001 mov r3, #1
#endif
/*
* The one more is the short entry.
*/
while (lfn_entry < (lfn_entries + 1))
162f0: e59dc00c ldr ip, [sp, #12]
162f4: e158000c cmp r8, ip
162f8: aaffff48 bge 16020 <msdos_find_name_in_fat_file+0x598>
empty_space_offset++;
empty_space_entry = 0;
read_cluster = true;
}
return 0;
162fc: e3a07000 mov r7, #0
16300: ea000004 b 16318 <msdos_find_name_in_fat_file+0x890>
/*
* If we are not to create the entry return a not found error.
*/
if (!create_node)
return MSDOS_NAME_NOT_FOUND_ERR;
16304: e59f7034 ldr r7, [pc, #52] ; 16340 <msdos_find_name_in_fat_file+0x8b8>
16308: ea000002 b 16318 <msdos_find_name_in_fat_file+0x890>
rtems_set_errno_and_return_minus_one(EIO);
#if MSDOS_FIND_PRINT
printf ("MSFS:[9.2] extending file:%li\n", empty_space_offset);
#endif
ret = fat_file_extend (&fs_info->fat, fat_fd, false,
1630c: e1a07001 mov r7, r1 <== NOT EXECUTED
16310: ea000000 b 16318 <msdos_find_name_in_fat_file+0x890> <== NOT EXECUTED
}
ret = fat_file_write(&fs_info->fat, fat_fd,
(empty_space_offset * bts2rd) + empty_space_entry,
length, fs_info->cl_buf + empty_space_entry);
if (ret == -1)
16314: e1a07000 mov r7, r0
empty_space_entry = 0;
read_cluster = true;
}
return 0;
}
16318: e1a00007 mov r0, r7
1631c: e28dd04c add sp, sp, #76 ; 0x4c
16320: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00016344 <msdos_find_node_by_cluster_num_in_fat_file>:
fat_file_fd_t *fat_fd,
uint32_t cl4find,
fat_dir_pos_t *dir_pos,
char *dir_entry
)
{
16344: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
16348: e1a09003 mov r9, r3
ssize_t ret = 0;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t bts2rd = 0;
uint32_t i = 0, j = 0;
if (FAT_FD_OF_ROOT_DIR(fat_fd) &&
1634c: e5913020 ldr r3, [r1, #32]
16350: e3530001 cmp r3, #1
fat_file_fd_t *fat_fd,
uint32_t cl4find,
fat_dir_pos_t *dir_pos,
char *dir_entry
)
{
16354: e1a06001 mov r6, r1
16358: e1a0b002 mov fp, r2
int rc = RC_OK;
ssize_t ret = 0;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
1635c: e5904008 ldr r4, [r0, #8]
uint32_t bts2rd = 0;
uint32_t i = 0, j = 0;
if (FAT_FD_OF_ROOT_DIR(fat_fd) &&
16360: 1a000008 bne 16388 <msdos_find_node_by_cluster_num_in_fat_file+0x44>
16364: e5913024 ldr r3, [r1, #36] ; 0x24 <== NOT EXECUTED
16368: e3530000 cmp r3, #0 <== NOT EXECUTED
1636c: 1a000005 bne 16388 <msdos_find_node_by_cluster_num_in_fat_file+0x44><== NOT EXECUTED
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
16370: e5d4300e ldrb r3, [r4, #14] <== NOT EXECUTED
ssize_t ret = 0;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t bts2rd = 0;
uint32_t i = 0, j = 0;
if (FAT_FD_OF_ROOT_DIR(fat_fd) &&
16374: e3130003 tst r3, #3 <== NOT EXECUTED
16378: 0a000002 beq 16388 <msdos_find_node_by_cluster_num_in_fat_file+0x44><== NOT EXECUTED
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
bts2rd = fat_fd->fat_file_size;
1637c: e5917018 ldr r7, [r1, #24] <== NOT EXECUTED
assert(ret == bts2rd);
for (i = 0; i < bts2rd; i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + i;
16380: e3a0a000 mov sl, #0
16384: ea000031 b 16450 <msdos_find_node_by_cluster_num_in_fat_file+0x10c>
if (FAT_FD_OF_ROOT_DIR(fat_fd) &&
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
bts2rd = fat_fd->fat_file_size;
else
bts2rd = fs_info->fat.vol.bpc;
16388: e1d470b6 ldrh r7, [r4, #6]
1638c: eafffffb b 16380 <msdos_find_node_by_cluster_num_in_fat_file+0x3c>
while ((ret = fat_file_read(&fs_info->fat, fat_fd, j * bts2rd, bts2rd,
fs_info->cl_buf)) != FAT_EOF)
{
if ( ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE )
16390: e350001f cmp r0, #31
16394: ca000004 bgt 163ac <msdos_find_node_by_cluster_num_in_fat_file+0x68>
rtems_set_errno_and_return_minus_one( EIO );
16398: eb000932 bl 18868 <__errno> <== NOT EXECUTED
1639c: e3a03005 mov r3, #5 <== NOT EXECUTED
163a0: e5803000 str r3, [r0] <== NOT EXECUTED
163a4: e3e04000 mvn r4, #0 <== NOT EXECUTED
163a8: ea000032 b 16478 <msdos_find_node_by_cluster_num_in_fat_file+0x134><== NOT EXECUTED
assert(ret == bts2rd);
163ac: e1500007 cmp r0, r7
163b0: 159f00c8 ldrne r0, [pc, #200] ; 16480 <msdos_find_node_by_cluster_num_in_fat_file+0x13c>
163b4: 159f10c8 ldrne r1, [pc, #200] ; 16484 <msdos_find_node_by_cluster_num_in_fat_file+0x140>
163b8: 159f20c8 ldrne r2, [pc, #200] ; 16488 <msdos_find_node_by_cluster_num_in_fat_file+0x144>
163bc: 159f30c8 ldrne r3, [pc, #200] ; 1648c <msdos_find_node_by_cluster_num_in_fat_file+0x148>
163c0: 1bffefd9 blne 1232c <__assert_func>
for (i = 0; i < bts2rd; i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
{
char* entry = (char*) fs_info->cl_buf + i;
163c4: e59430a0 ldr r3, [r4, #160] ; 0xa0
163c8: e3a05000 mov r5, #0
163cc: e1a08003 mov r8, r3
/* if this and all rest entries are empty - return not-found */
if ((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
163d0: e7d32005 ldrb r2, [r3, r5]
163d4: e3520000 cmp r2, #0
163d8: 0a000025 beq 16474 <msdos_find_node_by_cluster_num_in_fat_file+0x130>
MSDOS_THIS_DIR_ENTRY_AND_REST_EMPTY)
return MSDOS_NAME_NOT_FOUND_ERR;
/* if this entry is empty - skip it */
if ((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
163dc: e35200e5 cmp r2, #229 ; 0xe5
163e0: 0a000015 beq 1643c <msdos_find_node_by_cluster_num_in_fat_file+0xf8>
MSDOS_THIS_DIR_ENTRY_EMPTY)
continue;
/* if get a non-empty entry - compare clusters num */
if (MSDOS_EXTRACT_CLUSTER_NUM(entry) == cl4find)
163e4: e1d811b4 ldrh r1, [r8, #20]
163e8: e1d821ba ldrh r2, [r8, #26]
163ec: e1822801 orr r2, r2, r1, lsl #16
163f0: e152000b cmp r2, fp
163f4: 1a000010 bne 1643c <msdos_find_node_by_cluster_num_in_fat_file+0xf8>
{
/* on success fill aux structure and copy all 32 bytes */
rc = fat_file_ioctl(&fs_info->fat, fat_fd, F_CLU_NUM, j * bts2rd,
163f8: e1a00004 mov r0, r4
163fc: e1a01006 mov r1, r6
16400: e3a02001 mov r2, #1
16404: e1a0300a mov r3, sl
16408: e58d9000 str r9, [sp]
1640c: ebffe85f bl 10590 <fat_file_ioctl>
&dir_pos->sname.cln);
if (rc != RC_OK)
16410: e2504000 subs r4, r0, #0
16414: 1a000017 bne 16478 <msdos_find_node_by_cluster_num_in_fat_file+0x134>
return rc;
dir_pos->sname.ofs = i;
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
16418: e3e03000 mvn r3, #0
rc = fat_file_ioctl(&fs_info->fat, fat_fd, F_CLU_NUM, j * bts2rd,
&dir_pos->sname.cln);
if (rc != RC_OK)
return rc;
dir_pos->sname.ofs = i;
1641c: e5895004 str r5, [r9, #4]
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
16420: e5893008 str r3, [r9, #8]
dir_pos->lname.ofs = FAT_FILE_SHORT_NAME;
16424: e589300c str r3, [r9, #12]
memcpy(dir_entry, entry,
16428: e59d0028 ldr r0, [sp, #40] ; 0x28
1642c: e1a01008 mov r1, r8
16430: e3a02020 mov r2, #32
16434: eb000bb2 bl 19304 <memcpy>
MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
return RC_OK;
16438: ea00000e b 16478 <msdos_find_node_by_cluster_num_in_fat_file+0x134>
if ( ret < MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE )
rtems_set_errno_and_return_minus_one( EIO );
assert(ret == bts2rd);
for (i = 0; i < bts2rd; i += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE)
1643c: e2855020 add r5, r5, #32
16440: e1550007 cmp r5, r7
16444: e2888020 add r8, r8, #32
16448: 3affffe0 bcc 163d0 <msdos_find_node_by_cluster_num_in_fat_file+0x8c>
1644c: e08aa007 add sl, sl, r7 <== NOT EXECUTED
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
bts2rd = fat_fd->fat_file_size;
else
bts2rd = fs_info->fat.vol.bpc;
while ((ret = fat_file_read(&fs_info->fat, fat_fd, j * bts2rd, bts2rd,
16450: e59430a0 ldr r3, [r4, #160] ; 0xa0
16454: e1a00004 mov r0, r4
16458: e58d3000 str r3, [sp]
1645c: e1a01006 mov r1, r6
16460: e1a0200a mov r2, sl
16464: e1a03007 mov r3, r7
16468: ebffe77b bl 1025c <fat_file_read>
1646c: e3500000 cmp r0, #0
16470: 1affffc6 bne 16390 <msdos_find_node_by_cluster_num_in_fat_file+0x4c>
char* entry = (char*) fs_info->cl_buf + i;
/* if this and all rest entries are empty - return not-found */
if ((*MSDOS_DIR_ENTRY_TYPE(entry)) ==
MSDOS_THIS_DIR_ENTRY_AND_REST_EMPTY)
return MSDOS_NAME_NOT_FOUND_ERR;
16474: e59f4014 ldr r4, [pc, #20] ; 16490 <msdos_find_node_by_cluster_num_in_fat_file+0x14c><== NOT EXECUTED
}
}
j++;
}
return MSDOS_NAME_NOT_FOUND_ERR;
}
16478: e1a00004 mov r0, r4
1647c: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000bc54 <msdos_format>:
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
bc54: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
msdos_format_param_t fmt_params;
/*
* open device for writing
*/
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL, "open device\n");
bc58: e59f2d98 ldr r2, [pc, #3480] ; c9f8 <msdos_format+0xda4>
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
bc5c: e24ddfb7 sub sp, sp, #732 ; 0x2dc
bc60: e1a07000 mov r7, r0
bc64: e1a05001 mov r5, r1
msdos_format_param_t fmt_params;
/*
* open device for writing
*/
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL, "open device\n");
bc68: e1a00001 mov r0, r1
bc6c: e3a01002 mov r1, #2
bc70: ebffff66 bl ba10 <msdos_format_printf>
fd = open(devname, O_RDWR);
bc74: e3a01002 mov r1, #2
bc78: e1a00007 mov r0, r7
bc7c: ebffe42f bl 4d40 <open>
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
char tmp_sec[FAT_TOTAL_MBR_SIZE];
struct stat stat_buf;
int ret_val = 0;
bc80: e3700001 cmn r0, #1
bc84: 01a04000 moveq r4, r0
bc88: 13a04000 movne r4, #0
/*
* open device for writing
*/
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL, "open device\n");
fd = open(devname, O_RDWR);
bc8c: e1a06000 mov r6, r0
}
/*
* sanity check on device
*/
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
bc90: e3a01002 mov r1, #2
bc94: e1a00005 mov r0, r5
bc98: e59f2d5c ldr r2, [pc, #3420] ; c9fc <msdos_format+0xda8>
bc9c: e1a03007 mov r3, r7
bca0: ebffff5a bl ba10 <msdos_format_printf>
"stat check: %s\n", devname);
if (ret_val == 0) {
bca4: e3540000 cmp r4, #0
bca8: 13e04000 mvnne r4, #0
bcac: 1a000003 bne bcc0 <msdos_format+0x6c>
ret_val = fstat(fd, &stat_buf);
bcb0: e1a00006 mov r0, r6
bcb4: e28d1fa2 add r1, sp, #648 ; 0x288
bcb8: ebffe100 bl 40c0 <fstat>
bcbc: e1a04000 mov r4, r0
}
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_INFO,
bcc0: e1a00005 mov r0, r5
bcc4: e3a01001 mov r1, #1
bcc8: e59f2d30 ldr r2, [pc, #3376] ; ca00 <msdos_format+0xdac>
bccc: e1a03007 mov r3, r7
bcd0: ebffff4e bl ba10 <msdos_format_printf>
"formating: %s\n", devname);
/* rtems feature: no block devices, all are character devices */
if ((ret_val == 0) && (!S_ISBLK(stat_buf.st_mode))) {
bcd4: e3540000 cmp r4, #0
bcd8: 1a0001bb bne c3cc <msdos_format+0x778>
bcdc: e59d3294 ldr r3, [sp, #660] ; 0x294
bce0: e2033a0f and r3, r3, #61440 ; 0xf000
bce4: e3530a06 cmp r3, #24576 ; 0x6000
bce8: 0a000321 beq c974 <msdos_format+0xd20>
errno = ENOTTY;
bcec: eb0032dd bl 18868 <__errno> <== NOT EXECUTED
bcf0: e3a03019 mov r3, #25 <== NOT EXECUTED
bcf4: e5803000 str r3, [r0] <== NOT EXECUTED
ret_val = -1;
bcf8: e3e04000 mvn r4, #0 <== NOT EXECUTED
bcfc: ea0001b2 b c3cc <msdos_format+0x778> <== NOT EXECUTED
static inline int rtems_disk_fd_get_block_count(
int fd,
rtems_blkdev_bnum *block_count
)
{
return ioctl(fd, RTEMS_BLKIO_GETSIZE, block_count);
bd00: e1a00006 mov r0, r6
bd04: e59f1cf8 ldr r1, [pc, #3320] ; ca04 <msdos_format+0xdb0>
bd08: e28d2f8e add r2, sp, #568 ; 0x238
bd0c: eb001a3a bl 125fc <ioctl>
ret_val = rtems_disk_fd_get_media_block_size(fd, &fmt_params->bytes_per_sector);
}
if (ret_val == 0) {
ret_val = rtems_disk_fd_get_block_count(fd, &fmt_params->totl_sector_cnt);
}
if (ret_val == 0) {
bd10: e2504000 subs r4, r0, #0
bd14: 1a000132 bne c1e4 <msdos_format+0x590>
total_size = fmt_params->bytes_per_sector * fmt_params->totl_sector_cnt;
bd18: e59d2238 ldr r2, [sp, #568] ; 0x238
bd1c: e59d3234 ldr r3, [sp, #564] ; 0x234
bd20: e0010293 mul r1, r3, r2
bd24: e3a09000 mov r9, #0
bd28: e1a08001 mov r8, r1
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
bd2c: e58d2000 str r2, [sp]
bd30: e1a00005 mov r0, r5
bd34: e3a01002 mov r1, #2
bd38: e59f2cc8 ldr r2, [pc, #3272] ; ca08 <msdos_format+0xdb4>
bd3c: e98d0300 stmib sp, {r8, r9}
bd40: ebffff32 bl ba10 <msdos_format_printf>
/*
* determine number of FATs
*/
if (ret_val == 0) {
if ((rqdata == NULL) ||
bd44: e1550009 cmp r5, r9
bd48: 0a000002 beq bd58 <msdos_format+0x104>
(rqdata->fat_num == 0)) {
bd4c: e595300c ldr r3, [r5, #12]
/*
* determine number of FATs
*/
if (ret_val == 0) {
if ((rqdata == NULL) ||
bd50: e1530009 cmp r3, r9
bd54: 1a000001 bne bd60 <msdos_format+0x10c>
(rqdata->fat_num == 0)) {
fmt_params->fat_num = 2;
bd58: e3a03002 mov r3, #2
bd5c: ea000001 b bd68 <msdos_format+0x114>
}
else if (rqdata->fat_num <= 6) {
bd60: e3530006 cmp r3, #6
bd64: 8a000008 bhi bd8c <msdos_format+0x138>
fmt_params->fat_num = rqdata->fat_num;
bd68: e5cd3264 strb r3, [sp, #612] ; 0x264
ret_val = -1;
}
}
if (ret_val == 0)
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
bd6c: e1a00005 mov r0, r5
bd70: e3a01002 mov r1, #2
bd74: e59f2c90 ldr r2, [pc, #3216] ; ca0c <msdos_format+0xdb8>
bd78: e5dd3264 ldrb r3, [sp, #612] ; 0x264
bd7c: ebffff23 bl ba10 <msdos_format_printf>
* are a compromise concerning capacity and efficency
*/
uint32_t fat12_sect_per_clust = 8;
uint32_t fat16_sect_per_clust = 32;
if (rqdata != NULL && rqdata->sectors_per_cluster != 0) {
bd80: e3550000 cmp r5, #0
bd84: 1a000005 bne bda0 <msdos_format+0x14c>
bd88: ea000008 b bdb0 <msdos_format+0x15c>
}
else if (rqdata->fat_num <= 6) {
fmt_params->fat_num = rqdata->fat_num;
}
else {
errno = EINVAL;
bd8c: eb0032b5 bl 18868 <__errno>
bd90: e3a03016 mov r3, #22
bd94: e5803000 str r3, [r0]
ret_val = -1;
bd98: e3e04000 mvn r4, #0
bd9c: ea000110 b c1e4 <msdos_format+0x590>
* are a compromise concerning capacity and efficency
*/
uint32_t fat12_sect_per_clust = 8;
uint32_t fat16_sect_per_clust = 32;
if (rqdata != NULL && rqdata->sectors_per_cluster != 0) {
bda0: e5953008 ldr r3, [r5, #8]
bda4: e3530000 cmp r3, #0
bda8: 11a02003 movne r2, r3
bdac: 1a000001 bne bdb8 <msdos_format+0x164>
* limiting values for disk size, fat type, sectors per cluster
* NOTE: maximum sect_per_clust is arbitrarily choosen with values that
* are a compromise concerning capacity and efficency
*/
uint32_t fat12_sect_per_clust = 8;
uint32_t fat16_sect_per_clust = 32;
bdb0: e3a02020 mov r2, #32
/*
* limiting values for disk size, fat type, sectors per cluster
* NOTE: maximum sect_per_clust is arbitrarily choosen with values that
* are a compromise concerning capacity and efficency
*/
uint32_t fat12_sect_per_clust = 8;
bdb4: e3a03008 mov r3, #8
if (rqdata != NULL && rqdata->sectors_per_cluster != 0) {
fat12_sect_per_clust = rqdata->sectors_per_cluster;
fat16_sect_per_clust = rqdata->sectors_per_cluster;
}
if (fmt_params->totl_sector_cnt < FAT_FAT12_MAX_CLN * fat12_sect_per_clust) {
bdb8: e59f0c50 ldr r0, [pc, #3152] ; ca10 <msdos_format+0xdbc>
bdbc: e0030390 mul r3, r0, r3
bdc0: e59d1238 ldr r1, [sp, #568] ; 0x238
bdc4: e1510003 cmp r1, r3
fmt_params->fattype = FAT_FAT12;
bdc8: 33a03001 movcc r3, #1
bdcc: 35cd3266 strbcc r3, [sp, #614] ; 0x266
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
bdd0: 33a03002 movcc r3, #2
if (rqdata != NULL && rqdata->sectors_per_cluster != 0) {
fat12_sect_per_clust = rqdata->sectors_per_cluster;
fat16_sect_per_clust = rqdata->sectors_per_cluster;
}
if (fmt_params->totl_sector_cnt < FAT_FAT12_MAX_CLN * fat12_sect_per_clust) {
bdd4: 3a000015 bcc be30 <msdos_format+0x1dc>
fmt_params->fattype = FAT_FAT12;
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
}
else if (fmt_params->totl_sector_cnt < FAT_FAT16_MAX_CLN * fat16_sect_per_clust) {
bdd8: e59f3c34 ldr r3, [pc, #3124] ; ca14 <msdos_format+0xdc0>
bddc: e0020293 mul r2, r3, r2
bde0: e1510002 cmp r1, r2
fmt_params->fattype = FAT_FAT16;
bde4: 33a03002 movcc r3, #2
bde8: 35cd3266 strbcc r3, [sp, #614] ; 0x266
if (fmt_params->totl_sector_cnt < FAT_FAT12_MAX_CLN * fat12_sect_per_clust) {
fmt_params->fattype = FAT_FAT12;
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
}
else if (fmt_params->totl_sector_cnt < FAT_FAT16_MAX_CLN * fat16_sect_per_clust) {
bdec: 3a00000f bcc be30 <msdos_format+0x1dc>
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
}
else {
#define ONE_GB (1024L * 1024L * 1024L)
uint32_t gigs = (total_size + ONE_GB) / ONE_GB;
bdf0: e3a02101 mov r2, #1073741824 ; 0x40000000
bdf4: e0922008 adds r2, r2, r8
bdf8: e3a03000 mov r3, #0
bdfc: e0a33009 adc r3, r3, r9
be00: e1a01f22 lsr r1, r2, #30
be04: e1811103 orr r1, r1, r3, lsl #2
int b;
fmt_params->fattype = FAT_FAT32;
be08: e3a03004 mov r3, #4
be0c: e5cd3266 strb r3, [sp, #614] ; 0x266
/* scale with the size of disk... */
for (b = 31; b > 0; b--)
if ((gigs & (1 << b)) != 0)
be10: e3a02001 mov r2, #1
#define ONE_GB (1024L * 1024L * 1024L)
uint32_t gigs = (total_size + ONE_GB) / ONE_GB;
int b;
fmt_params->fattype = FAT_FAT32;
/* scale with the size of disk... */
for (b = 31; b > 0; b--)
be14: e3a0301f mov r3, #31
if ((gigs & (1 << b)) != 0)
be18: e0110312 ands r0, r1, r2, lsl r3
be1c: 1a000001 bne be28 <msdos_format+0x1d4>
#define ONE_GB (1024L * 1024L * 1024L)
uint32_t gigs = (total_size + ONE_GB) / ONE_GB;
int b;
fmt_params->fattype = FAT_FAT32;
/* scale with the size of disk... */
for (b = 31; b > 0; b--)
be20: e2533001 subs r3, r3, #1
be24: 1afffffb bne be18 <msdos_format+0x1c4>
if ((gigs & (1 << b)) != 0)
break;
fmt_params->sectors_per_cluster = 1 << b;
be28: e3a02001 mov r2, #1
be2c: e1a03312 lsl r3, r2, r3
}
ret_val = msdos_set_sectors_per_cluster_from_request( rqdata, fmt_params );
be30: e28d1f8d add r1, sp, #564 ; 0x234
be34: e1a00005 mov r0, r5
fmt_params->fattype = FAT_FAT32;
/* scale with the size of disk... */
for (b = 31; b > 0; b--)
if ((gigs & (1 << b)) != 0)
break;
fmt_params->sectors_per_cluster = 1 << b;
be38: e58d3240 str r3, [sp, #576] ; 0x240
}
ret_val = msdos_set_sectors_per_cluster_from_request( rqdata, fmt_params );
be3c: ebffff68 bl bbe4 <msdos_set_sectors_per_cluster_from_request>
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
}
else {
#define ONE_GB ( 1024L * 1024L * 1024L )
uint32_t gigs = ( total_size + ONE_GB ) / ONE_GB;
be40: e3a02101 mov r2, #1073741824 ; 0x40000000
be44: e0922008 adds r2, r2, r8
be48: e3a03000 mov r3, #0
be4c: e0a33009 adc r3, r3, r9
be50: e1a02f22 lsr r2, r2, #30
be54: e1822103 orr r2, r2, r3, lsl #2
be58: e3a01000 mov r1, #0
if ((gigs & (1 << b)) != 0)
break;
fmt_params->sectors_per_cluster = 1 << b;
}
ret_val = msdos_set_sectors_per_cluster_from_request( rqdata, fmt_params );
be5c: e1a04000 mov r4, r0
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
}
else {
#define ONE_GB ( 1024L * 1024L * 1024L )
uint32_t gigs = ( total_size + ONE_GB ) / ONE_GB;
be60: e58d2028 str r2, [sp, #40] ; 0x28
be64: e3a080ff mov r8, #255 ; 0xff
be68: e58d100c str r1, [sp, #12]
be6c: e58d6010 str r6, [sp, #16]
be70: ea0000d2 b c1c0 <msdos_format+0x56c>
&& fmt_params->fattype != fat_type
&& fmt_params->totl_sector_cnt > 0 ) {
/*
* Skip aligning structures or d align them
*/
if (ret_val == 0 && rqdata != NULL)
be74: e2956000 adds r6, r5, #0
be78: 13a06001 movne r6, #1
be7c: e3560000 cmp r6, #0
fmt_params->skip_alignment = rqdata->skip_alignment;
be80: 15d53016 ldrbne r3, [r5, #22]
if (ret_val == 0) {
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
be84: e1a00005 mov r0, r5
&& fmt_params->totl_sector_cnt > 0 ) {
/*
* Skip aligning structures or d align them
*/
if (ret_val == 0 && rqdata != NULL)
fmt_params->skip_alignment = rqdata->skip_alignment;
be88: 15cd3284 strbne r3, [sp, #644] ; 0x284
if (ret_val == 0) {
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
be8c: e3a01002 mov r1, #2
be90: e59d3240 ldr r3, [sp, #576] ; 0x240
be94: e59f2b7c ldr r2, [pc, #2940] ; ca18 <msdos_format+0xdc4>
be98: ebfffedc bl ba10 <msdos_format_printf>
"sectors per cluster: %d\n", fmt_params->sectors_per_cluster);
if (fmt_params->fattype == FAT_FAT32) {
be9c: e5dd3266 ldrb r3, [sp, #614] ; 0x266
bea0: e3530004 cmp r3, #4
bea4: 1a000008 bne becc <msdos_format+0x278>
/* recommended: for FAT32, always set reserved sector count to 32 */
fmt_params->rsvd_sector_cnt = 32;
bea8: e3a03020 mov r3, #32
beac: e58d323c str r3, [sp, #572] ; 0x23c
/* for FAT32, always set files per root directory 0 */
fmt_params->files_per_root_dir = 0;
beb0: e3a03000 mov r3, #0
beb4: e58d324c str r3, [sp, #588] ; 0x24c
/* location of copy of MBR */
fmt_params->mbr_copy_sec = 6;
beb8: e3a03006 mov r3, #6
bebc: e58d325c str r3, [sp, #604] ; 0x25c
/* location of fsinfo sector */
fmt_params->fsinfo_sec = 1;
bec0: e3a03001 mov r3, #1
bec4: e58d3260 str r3, [sp, #608] ; 0x260
bec8: ea000015 b bf24 <msdos_format+0x2d0>
}
else {
/* recommended: for FAT12/FAT16, always set reserved sector count to 1 */
fmt_params->rsvd_sector_cnt = 1;
becc: e3a02001 mov r2, #1
/* recommended: for FAT16, set files per root directory to 512 */
/* for FAT12/FAT16, set files per root directory */
/* must fill up an even count of sectors */
if ((rqdata != NULL) &&
bed0: e3560000 cmp r6, #0
fmt_params->fsinfo_sec = 1;
}
else {
/* recommended: for FAT12/FAT16, always set reserved sector count to 1 */
fmt_params->rsvd_sector_cnt = 1;
bed4: e58d223c str r2, [sp, #572] ; 0x23c
/* recommended: for FAT16, set files per root directory to 512 */
/* for FAT12/FAT16, set files per root directory */
/* must fill up an even count of sectors */
if ((rqdata != NULL) &&
bed8: 0a000003 beq beec <msdos_format+0x298>
(rqdata->files_per_root_dir > 0)) {
bedc: e5952010 ldr r2, [r5, #16]
/* recommended: for FAT12/FAT16, always set reserved sector count to 1 */
fmt_params->rsvd_sector_cnt = 1;
/* recommended: for FAT16, set files per root directory to 512 */
/* for FAT12/FAT16, set files per root directory */
/* must fill up an even count of sectors */
if ((rqdata != NULL) &&
bee0: e3520000 cmp r2, #0
(rqdata->files_per_root_dir > 0)) {
fmt_params->files_per_root_dir = rqdata->files_per_root_dir;
bee4: 158d224c strne r2, [sp, #588] ; 0x24c
/* recommended: for FAT12/FAT16, always set reserved sector count to 1 */
fmt_params->rsvd_sector_cnt = 1;
/* recommended: for FAT16, set files per root directory to 512 */
/* for FAT12/FAT16, set files per root directory */
/* must fill up an even count of sectors */
if ((rqdata != NULL) &&
bee8: 1a000003 bne befc <msdos_format+0x2a8>
(rqdata->files_per_root_dir > 0)) {
fmt_params->files_per_root_dir = rqdata->files_per_root_dir;
}
else {
if (fmt_params->fattype == FAT_FAT16) {
beec: e3530002 cmp r3, #2
fmt_params->files_per_root_dir = 512;
bef0: 03a03c02 moveq r3, #512 ; 0x200
}
else {
fmt_params->files_per_root_dir = 64;
bef4: 13a03040 movne r3, #64 ; 0x40
bef8: e58d324c str r3, [sp, #588] ; 0x24c
}
}
fmt_params->files_per_root_dir = (fmt_params->files_per_root_dir +
(2*fmt_params->bytes_per_sector/
befc: e59d1234 ldr r1, [sp, #564] ; 0x234
}
else {
fmt_params->files_per_root_dir = 64;
}
}
fmt_params->files_per_root_dir = (fmt_params->files_per_root_dir +
bf00: e59d624c ldr r6, [sp, #588] ; 0x24c
(2*fmt_params->bytes_per_sector/
bf04: e1a01081 lsl r1, r1, #1
bf08: e1a012a1 lsr r1, r1, #5
}
else {
fmt_params->files_per_root_dir = 64;
}
}
fmt_params->files_per_root_dir = (fmt_params->files_per_root_dir +
bf0c: e2466001 sub r6, r6, #1
bf10: e0866001 add r6, r6, r1
(2*fmt_params->bytes_per_sector/
FAT_DIRENTRY_SIZE-1));
fmt_params->files_per_root_dir -= (fmt_params->files_per_root_dir %
bf14: e1a00006 mov r0, r6
bf18: ebffd796 bl 1d78 <__umodsi3>
bf1c: e0600006 rsb r0, r0, r6
bf20: e58d024c str r0, [sp, #588] ; 0x24c
/FAT_DIRENTRY_SIZE));
}
fmt_params->root_dir_sectors =
(((fmt_params->files_per_root_dir * FAT_DIRENTRY_SIZE)
+ fmt_params->bytes_per_sector - 1)
bf24: e59d7234 ldr r7, [sp, #564] ; 0x234
/ fmt_params->bytes_per_sector);
bf28: e59d024c ldr r0, [sp, #588] ; 0x24c
/FAT_DIRENTRY_SIZE));
}
fmt_params->root_dir_sectors =
(((fmt_params->files_per_root_dir * FAT_DIRENTRY_SIZE)
+ fmt_params->bytes_per_sector - 1)
bf2c: e2472001 sub r2, r7, #1
/ fmt_params->bytes_per_sector);
bf30: e1a01007 mov r1, r7
bf34: e0820280 add r0, r2, r0, lsl #5
/FAT_DIRENTRY_SIZE));
}
fmt_params->root_dir_sectors =
(((fmt_params->files_per_root_dir * FAT_DIRENTRY_SIZE)
+ fmt_params->bytes_per_sector - 1)
bf38: e58d2014 str r2, [sp, #20]
/ fmt_params->bytes_per_sector);
bf3c: ebffd747 bl 1c60 <__aeabi_uidiv>
if (ret_val == 0) {
/*
* check values to get legal arrangement of FAT type and cluster count
*/
ret_val = msdos_format_eval_sectors_per_cluster(fmt_params->fattype,
bf40: e59d3238 ldr r3, [sp, #568] ; 0x238
bf44: e59d223c ldr r2, [sp, #572] ; 0x23c
bf48: e58d3024 str r3, [sp, #36] ; 0x24
fmt_params->bytes_per_sector,
fmt_params->totl_sector_cnt,
fmt_params->rsvd_sector_cnt,
fmt_params->root_dir_sectors,
fmt_params->fat_num,
bf4c: e5dd3264 ldrb r3, [sp, #612] ; 0x264
}
fmt_params->root_dir_sectors =
(((fmt_params->files_per_root_dir * FAT_DIRENTRY_SIZE)
+ fmt_params->bytes_per_sector - 1)
/ fmt_params->bytes_per_sector);
bf50: e1a09000 mov r9, r0
fmt_params->files_per_root_dir -= (fmt_params->files_per_root_dir %
(2*fmt_params->bytes_per_sector
/FAT_DIRENTRY_SIZE));
}
fmt_params->root_dir_sectors =
bf54: e58d0250 str r0, [sp, #592] ; 0x250
uint32_t fatdata_sect_cnt;
uint32_t fat_sectors_cnt;
/*
* ensure, that maximum cluster size (32KByte) is not exceeded
*/
while (MS_BYTES_PER_CLUSTER_LIMIT / bytes_per_sector < sectors_per_cluster) {
bf58: e1a01007 mov r1, r7
bf5c: e3a00902 mov r0, #32768 ; 0x8000
if (ret_val == 0) {
/*
* check values to get legal arrangement of FAT type and cluster count
*/
ret_val = msdos_format_eval_sectors_per_cluster(fmt_params->fattype,
bf60: e5dd8266 ldrb r8, [sp, #614] ; 0x266
bf64: e58d2018 str r2, [sp, #24]
fmt_params->bytes_per_sector,
fmt_params->totl_sector_cnt,
fmt_params->rsvd_sector_cnt,
fmt_params->root_dir_sectors,
fmt_params->fat_num,
bf68: e58d301c str r3, [sp, #28]
if (ret_val == 0) {
/*
* check values to get legal arrangement of FAT type and cluster count
*/
ret_val = msdos_format_eval_sectors_per_cluster(fmt_params->fattype,
bf6c: e59d6240 ldr r6, [sp, #576] ; 0x240
fmt_params->totl_sector_cnt,
fmt_params->rsvd_sector_cnt,
fmt_params->root_dir_sectors,
fmt_params->fat_num,
fmt_params->sectors_per_cluster,
fmt_params->skip_alignment,
bf70: e5ddb284 ldrb fp, [sp, #644] ; 0x284
uint32_t fatdata_sect_cnt;
uint32_t fat_sectors_cnt;
/*
* ensure, that maximum cluster size (32KByte) is not exceeded
*/
while (MS_BYTES_PER_CLUSTER_LIMIT / bytes_per_sector < sectors_per_cluster) {
bf74: ebffd739 bl 1c60 <__aeabi_uidiv>
bf78: ea000000 b bf80 <msdos_format+0x32c>
sectors_per_cluster /= 2;
bf7c: e1a060a6 lsr r6, r6, #1 <== NOT EXECUTED
uint32_t fatdata_sect_cnt;
uint32_t fat_sectors_cnt;
/*
* ensure, that maximum cluster size (32KByte) is not exceeded
*/
while (MS_BYTES_PER_CLUSTER_LIMIT / bytes_per_sector < sectors_per_cluster) {
bf80: e1500006 cmp r0, r6
bf84: 3afffffc bcc bf7c <msdos_format+0x328>
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
return (sectors + clustersize - 1) & ~(clustersize - 1);
bf88: e59d2018 ldr r2, [sp, #24]
bf8c: e2493001 sub r3, r9, #1
bf90: e2422001 sub r2, r2, #1
bf94: e58d202c str r2, [sp, #44] ; 0x2c
bf98: e58d3020 str r3, [sp, #32]
bf9c: e58d4030 str r4, [sp, #48] ; 0x30
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
bfa0: e35b0000 cmp fp, #0
return (sectors + clustersize - 1) & ~(clustersize - 1);
bfa4: 059d202c ldreq r2, [sp, #44] ; 0x2c
bfa8: 02660000 rsbeq r0, r6, #0
bfac: 00823006 addeq r3, r2, r6
bfb0: 00000003 andeq r0, r0, r3
else
return sectors;
bfb4: 159d0018 ldrne r0, [sp, #24]
* compute number of data clusters for current data:
* - compute cluster count for data AND fat
* - compute storage size for FAT
* - subtract from total cluster count
*/
fatdata_sect_cnt = total_sector_cnt
bfb8: e59d3024 ldr r3, [sp, #36] ; 0x24
- loc_align_object (rsvd_sector_cnt, sectors_per_cluster, skip_alignment);
if (fattype == FAT_FAT12) {
bfbc: e3580001 cmp r8, #1
* compute number of data clusters for current data:
* - compute cluster count for data AND fat
* - compute storage size for FAT
* - subtract from total cluster count
*/
fatdata_sect_cnt = total_sector_cnt
bfc0: e0600003 rsb r0, r0, r3
- loc_align_object (rsvd_sector_cnt, sectors_per_cluster, skip_alignment);
if (fattype == FAT_FAT12) {
bfc4: 1a00000c bne bffc <msdos_format+0x3a8>
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
bfc8: e35b0000 cmp fp, #0
return (sectors + clustersize - 1) & ~(clustersize - 1);
bfcc: 059d2020 ldreq r2, [sp, #32]
bfd0: 00823006 addeq r3, r2, r6
bfd4: 02662000 rsbeq r2, r6, #0
bfd8: 00023003 andeq r3, r2, r3
else
return sectors;
bfdc: 11a03009 movne r3, r9
fatdata_sect_cnt = total_sector_cnt
- loc_align_object (rsvd_sector_cnt, sectors_per_cluster, skip_alignment);
if (fattype == FAT_FAT12) {
fatdata_sect_cnt = fatdata_sect_cnt
- loc_align_object (root_dir_sector_cnt, sectors_per_cluster, skip_alignment);
fatdata_cluster_cnt = fatdata_sect_cnt/sectors_per_cluster;
bfe0: e0630000 rsb r0, r3, r0
bfe4: e1a01006 mov r1, r6
bfe8: ebffd71c bl 1c60 <__aeabi_uidiv>
bfec: e1a0a000 mov sl, r0
fat_capacity = fatdata_cluster_cnt * 3 / 2;
bff0: e0800080 add r0, r0, r0, lsl #1
bff4: e1a000a0 lsr r0, r0, #1
bff8: ea000011 b c044 <msdos_format+0x3f0>
}
else if (fattype == FAT_FAT16) {
bffc: e3580002 cmp r8, #2
c000: 1a00000b bne c034 <msdos_format+0x3e0>
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
c004: e35b0000 cmp fp, #0
return (sectors + clustersize - 1) & ~(clustersize - 1);
c008: 059d2020 ldreq r2, [sp, #32]
c00c: 00823006 addeq r3, r2, r6
c010: 02662000 rsbeq r2, r6, #0
c014: 00023003 andeq r3, r2, r3
else
return sectors;
c018: 11a03009 movne r3, r9
fat_capacity = fatdata_cluster_cnt * 3 / 2;
}
else if (fattype == FAT_FAT16) {
fatdata_sect_cnt = fatdata_sect_cnt
- loc_align_object (root_dir_sector_cnt, sectors_per_cluster, skip_alignment);
fatdata_cluster_cnt = fatdata_sect_cnt/sectors_per_cluster;
c01c: e0630000 rsb r0, r3, r0
c020: e1a01006 mov r1, r6
c024: ebffd70d bl 1c60 <__aeabi_uidiv>
c028: e1a0a000 mov sl, r0
fat_capacity = fatdata_cluster_cnt * 2;
c02c: e1a00080 lsl r0, r0, #1
c030: ea000003 b c044 <msdos_format+0x3f0>
}
else { /* FAT32 */
fatdata_cluster_cnt = fatdata_sect_cnt/sectors_per_cluster;
c034: e1a01006 mov r1, r6
c038: ebffd708 bl 1c60 <__aeabi_uidiv>
c03c: e1a0a000 mov sl, r0
fat_capacity = fatdata_cluster_cnt * 4;
c040: e1a00100 lsl r0, r0, #2
}
sectors_per_fat = ((fat_capacity
c044: e59d3014 ldr r3, [sp, #20]
c048: e1a01007 mov r1, r7
c04c: e0800003 add r0, r0, r3
c050: ebffd702 bl 1c60 <__aeabi_uidiv>
+ (bytes_per_sector - 1))
/ bytes_per_sector);
fat_sectors_cnt = loc_align_object (sectors_per_fat * fat_num,
c054: e59d201c ldr r2, [sp, #28]
c058: e0040092 mul r4, r2, r0
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
c05c: e35b0000 cmp fp, #0
c060: e2460001 sub r0, r6, #1
return (sectors + clustersize - 1) & ~(clustersize - 1);
c064: 00804004 addeq r4, r0, r4
c068: 02663000 rsbeq r3, r6, #0
c06c: 00044003 andeq r4, r4, r3
skip_alignment);
*data_cluster_cnt = (fatdata_cluster_cnt -
((fat_sectors_cnt
+ (sectors_per_cluster - 1))
/ sectors_per_cluster));
c070: e0800004 add r0, r0, r4
c074: e1a01006 mov r1, r6
c078: ebffd6f8 bl 1c60 <__aeabi_uidiv>
/*
* data cluster count too big? Then make clusters bigger
*/
if (((fattype == FAT_FAT12) && (*data_cluster_cnt > FAT_FAT12_MAX_CLN)) ||
c07c: e3580001 cmp r8, #1
fat_sectors_cnt = loc_align_object (sectors_per_fat * fat_num,
sectors_per_cluster,
skip_alignment);
*data_cluster_cnt = (fatdata_cluster_cnt -
c080: e060a00a rsb sl, r0, sl
+ (sectors_per_cluster - 1))
/ sectors_per_cluster));
/*
* data cluster count too big? Then make clusters bigger
*/
if (((fattype == FAT_FAT12) && (*data_cluster_cnt > FAT_FAT12_MAX_CLN)) ||
c084: 1a000004 bne c09c <msdos_format+0x448>
c088: e59f3980 ldr r3, [pc, #2432] ; ca10 <msdos_format+0xdbc>
c08c: e15a0003 cmp sl, r3
((fattype == FAT_FAT16) && (*data_cluster_cnt > FAT_FAT16_MAX_CLN))) {
sectors_per_cluster *= 2;
}
else {
finished = true;
c090: 91a03008 movls r3, r8
+ (sectors_per_cluster - 1))
/ sectors_per_cluster));
/*
* data cluster count too big? Then make clusters bigger
*/
if (((fattype == FAT_FAT12) && (*data_cluster_cnt > FAT_FAT12_MAX_CLN)) ||
c094: 9a000009 bls c0c0 <msdos_format+0x46c>
c098: ea000004 b c0b0 <msdos_format+0x45c>
c09c: e3580002 cmp r8, #2
c0a0: 1a000009 bne c0cc <msdos_format+0x478>
((fattype == FAT_FAT16) && (*data_cluster_cnt > FAT_FAT16_MAX_CLN))) {
c0a4: e59f0968 ldr r0, [pc, #2408] ; ca14 <msdos_format+0xdc0>
c0a8: e15a0000 cmp sl, r0
c0ac: 9a000006 bls c0cc <msdos_format+0x478>
finished = true;
}
/*
* when maximum cluster size is exceeded, we have invalid data, abort...
*/
if (fattype == FAT_FAT12) {
c0b0: e3580001 cmp r8, #1
/*
* data cluster count too big? Then make clusters bigger
*/
if (((fattype == FAT_FAT12) && (*data_cluster_cnt > FAT_FAT12_MAX_CLN)) ||
((fattype == FAT_FAT16) && (*data_cluster_cnt > FAT_FAT16_MAX_CLN))) {
sectors_per_cluster *= 2;
c0b4: e1a06086 lsl r6, r6, #1
finished = true;
}
/*
* when maximum cluster size is exceeded, we have invalid data, abort...
*/
if (fattype == FAT_FAT12) {
c0b8: e3a03000 mov r3, #0
c0bc: 1a000003 bne c0d0 <msdos_format+0x47c>
if (MS_BYTES_PER_CLUSTER_LIMIT_FAT12 < (sectors_per_cluster * bytes_per_sector)) {
c0c0: e0020697 mul r2, r7, r6
c0c4: e3520a01 cmp r2, #4096 ; 0x1000
c0c8: ea000002 b c0d8 <msdos_format+0x484>
if (((fattype == FAT_FAT12) && (*data_cluster_cnt > FAT_FAT12_MAX_CLN)) ||
((fattype == FAT_FAT16) && (*data_cluster_cnt > FAT_FAT16_MAX_CLN))) {
sectors_per_cluster *= 2;
}
else {
finished = true;
c0cc: e3a03001 mov r3, #1
*/
if (fattype == FAT_FAT12) {
if (MS_BYTES_PER_CLUSTER_LIMIT_FAT12 < (sectors_per_cluster * bytes_per_sector)) {
finished = true;
}
} else if ((sectors_per_cluster * bytes_per_sector)
c0d0: e0020697 mul r2, r7, r6
c0d4: e3520902 cmp r2, #32768 ; 0x8000
c0d8: 8a000001 bhi c0e4 <msdos_format+0x490>
> MS_BYTES_PER_CLUSTER_LIMIT) {
finished = true;
}
} while (!finished);
c0dc: e3530000 cmp r3, #0
c0e0: 0affffae beq bfa0 <msdos_format+0x34c>
c0e4: e1a03004 mov r3, r4
*sectors_per_cluster_adj = sectors_per_cluster;
*sectors_per_fat_ptr = fat_sectors_cnt / fat_num;
c0e8: e1a00003 mov r0, r3
c0ec: e59d101c ldr r1, [sp, #28]
c0f0: ebffd6da bl 1c60 <__aeabi_uidiv>
static uint8_t
msdos_get_fat_type( const uint32_t bytes_per_sector,
const uint32_t sectors_per_cluster,
const uint32_t number_of_clusters )
{
uint32_t ms_sectors_per_cluster_limit_FAT12 =
c0f4: e1a01007 mov r1, r7
finished = true;
}
} while (!finished);
*sectors_per_cluster_adj = sectors_per_cluster;
*sectors_per_fat_ptr = fat_sectors_cnt / fat_num;
c0f8: e58d0244 str r0, [sp, #580] ; 0x244
static uint8_t
msdos_get_fat_type( const uint32_t bytes_per_sector,
const uint32_t sectors_per_cluster,
const uint32_t number_of_clusters )
{
uint32_t ms_sectors_per_cluster_limit_FAT12 =
c0fc: e59f0918 ldr r0, [pc, #2328] ; ca1c <msdos_format+0xdc8>
fmt_params->sectors_per_cluster,
fmt_params->skip_alignment,
§ors_per_cluster_adj,
&fmt_params->sectors_per_fat,
&data_clusters_cnt);
fmt_params->sectors_per_cluster = sectors_per_cluster_adj;
c100: e58d6240 str r6, [sp, #576] ; 0x240
static uint8_t
msdos_get_fat_type( const uint32_t bytes_per_sector,
const uint32_t sectors_per_cluster,
const uint32_t number_of_clusters )
{
uint32_t ms_sectors_per_cluster_limit_FAT12 =
c104: ebffd6d5 bl 1c60 <__aeabi_uidiv>
( MS_BYTES_PER_CLUSTER_LIMIT_FAT12 +1 ) / bytes_per_sector;
uint32_t ms_sectors_per_cluster_limit_FAT16 =
( MS_BYTES_PER_CLUSTER_LIMIT +1 ) / bytes_per_sector;
uint8_t fattype = FAT_FAT32;
if ( number_of_clusters < FAT_FAT12_MAX_CLN
c108: e59f3910 ldr r3, [pc, #2320] ; ca20 <msdos_format+0xdcc>
c10c: e1560000 cmp r6, r0
c110: 915a0003 cmpls sl, r3
c114: e59d4030 ldr r4, [sp, #48] ; 0x30
&& sectors_per_cluster <= ms_sectors_per_cluster_limit_FAT12 ) {
fattype = FAT_FAT12;
c118: 93a03001 movls r3, #1
( MS_BYTES_PER_CLUSTER_LIMIT_FAT12 +1 ) / bytes_per_sector;
uint32_t ms_sectors_per_cluster_limit_FAT16 =
( MS_BYTES_PER_CLUSTER_LIMIT +1 ) / bytes_per_sector;
uint8_t fattype = FAT_FAT32;
if ( number_of_clusters < FAT_FAT12_MAX_CLN
c11c: 9a000007 bls c140 <msdos_format+0x4ec>
const uint32_t sectors_per_cluster,
const uint32_t number_of_clusters )
{
uint32_t ms_sectors_per_cluster_limit_FAT12 =
( MS_BYTES_PER_CLUSTER_LIMIT_FAT12 +1 ) / bytes_per_sector;
uint32_t ms_sectors_per_cluster_limit_FAT16 =
c120: e59f08fc ldr r0, [pc, #2300] ; ca24 <msdos_format+0xdd0>
c124: e1a01007 mov r1, r7
c128: ebffd6cc bl 1c60 <__aeabi_uidiv>
( MS_BYTES_PER_CLUSTER_LIMIT +1 ) / bytes_per_sector;
uint8_t fattype = FAT_FAT32;
c12c: e59f38f4 ldr r3, [pc, #2292] ; ca28 <msdos_format+0xdd4>
c130: e1560000 cmp r6, r0
c134: 915a0003 cmpls sl, r3
c138: 93a03002 movls r3, #2
c13c: 83a03004 movhi r3, #4
fmt_params->fattype = msdos_get_fat_type(
fmt_params->bytes_per_sector,
fmt_params->sectors_per_cluster,
data_clusters_cnt );
/* Correct sectors per cluster to the fat type specific default value */
if (fat_type != fmt_params->fattype) {
c140: e1580003 cmp r8, r3
fmt_params->sectors_per_cluster = sectors_per_cluster_adj;
fat_type = fmt_params->fattype;
/* Correct the FAT type according to the new data cluster count */
if ( ret_val == 0 ) {
fmt_params->fattype = msdos_get_fat_type(
c144: e5cd3266 strb r3, [sp, #614] ; 0x266
fmt_params->bytes_per_sector,
fmt_params->sectors_per_cluster,
data_clusters_cnt );
/* Correct sectors per cluster to the fat type specific default value */
if (fat_type != fmt_params->fattype) {
c148: 0a000011 beq c194 <msdos_format+0x540>
static void
msdos_set_default_sectors_per_cluster_for_fattype(
msdos_format_param_t *fmt_params,
const uint64_t total_size )
{
if ( fmt_params->fattype == FAT_FAT12
c14c: e2433001 sub r3, r3, #1
c150: e3530001 cmp r3, #1
|| fmt_params->fattype == FAT_FAT16 ) {
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
c154: 93a03002 movls r3, #2
static void
msdos_set_default_sectors_per_cluster_for_fattype(
msdos_format_param_t *fmt_params,
const uint64_t total_size )
{
if ( fmt_params->fattype == FAT_FAT12
c158: 9a000008 bls c180 <msdos_format+0x52c>
c15c: e3a0301f mov r3, #31
#define ONE_GB ( 1024L * 1024L * 1024L )
uint32_t gigs = ( total_size + ONE_GB ) / ONE_GB;
int b;
/* scale with the size of disk... */
for ( b = 31; b > 0; b-- ) {
if ( (gigs & ( 1 << b) ) != 0 )
c160: e3a02001 mov r2, #1
c164: e59d1028 ldr r1, [sp, #40] ; 0x28
c168: e0111312 ands r1, r1, r2, lsl r3
c16c: 1a000001 bne c178 <msdos_format+0x524>
else {
#define ONE_GB ( 1024L * 1024L * 1024L )
uint32_t gigs = ( total_size + ONE_GB ) / ONE_GB;
int b;
/* scale with the size of disk... */
for ( b = 31; b > 0; b-- ) {
c170: e2533001 subs r3, r3, #1
c174: 1afffffa bne c164 <msdos_format+0x510>
if ( (gigs & ( 1 << b) ) != 0 )
break;
}
fmt_params->sectors_per_cluster = 1 << b;
c178: e3a02001 mov r2, #1
c17c: e1a03312 lsl r3, r2, r3
data_clusters_cnt );
/* Correct sectors per cluster to the fat type specific default value */
if (fat_type != fmt_params->fattype) {
msdos_set_default_sectors_per_cluster_for_fattype( fmt_params,
total_size );
ret_val = msdos_set_sectors_per_cluster_from_request( rqdata,
c180: e1a00005 mov r0, r5
c184: e28d1f8d add r1, sp, #564 ; 0x234
/* scale with the size of disk... */
for ( b = 31; b > 0; b-- ) {
if ( (gigs & ( 1 << b) ) != 0 )
break;
}
fmt_params->sectors_per_cluster = 1 << b;
c188: e58d3240 str r3, [sp, #576] ; 0x240
data_clusters_cnt );
/* Correct sectors per cluster to the fat type specific default value */
if (fat_type != fmt_params->fattype) {
msdos_set_default_sectors_per_cluster_for_fattype( fmt_params,
total_size );
ret_val = msdos_set_sectors_per_cluster_from_request( rqdata,
c18c: ebfffe94 bl bbe4 <msdos_set_sectors_per_cluster_from_request>
c190: e1a04000 mov r4, r0
fmt_params );
}
}
if (fat_type != fmt_params->fattype && 1 < iteration_cnt) {
c194: e5dd3266 ldrb r3, [sp, #614] ; 0x266
c198: e59d200c ldr r2, [sp, #12]
c19c: e1530008 cmp r3, r8
c1a0: 13520001 cmpne r2, #1
--fmt_params->totl_sector_cnt;
c1a4: 859d3238 ldrhi r3, [sp, #568] ; 0x238
}
}
++iteration_cnt;
c1a8: e59d000c ldr r0, [sp, #12]
ret_val = msdos_set_sectors_per_cluster_from_request( rqdata,
fmt_params );
}
}
if (fat_type != fmt_params->fattype && 1 < iteration_cnt) {
--fmt_params->totl_sector_cnt;
c1ac: 82433001 subhi r3, r3, #1
c1b0: 858d3238 strhi r3, [sp, #568] ; 0x238
}
}
++iteration_cnt;
c1b4: e2803001 add r3, r0, #1
c1b8: e20330ff and r3, r3, #255 ; 0xff
c1bc: e58d300c str r3, [sp, #12]
if (ret_val == 0) {
data_clusters_cnt =
fmt_params->totl_sector_cnt / fmt_params->sectors_per_cluster;
}
while( ret_val == 0
c1c0: e3540000 cmp r4, #0
c1c4: 1a000005 bne c1e0 <msdos_format+0x58c>
&& fmt_params->fattype != fat_type
c1c8: e5dd3266 ldrb r3, [sp, #614] ; 0x266
c1cc: e1530008 cmp r3, r8
c1d0: 0a000002 beq c1e0 <msdos_format+0x58c>
&& fmt_params->totl_sector_cnt > 0 ) {
c1d4: e59d3238 ldr r3, [sp, #568] ; 0x238
c1d8: e3530000 cmp r3, #0
c1dc: 1affff24 bne be74 <msdos_format+0x220>
c1e0: e59d6010 ldr r6, [sp, #16]
}
++iteration_cnt;
}
}
if ( fmt_params->totl_sector_cnt == 0 )
c1e4: e59d3238 ldr r3, [sp, #568] ; 0x238
c1e8: e3530000 cmp r3, #0
c1ec: 0a000029 beq c298 <msdos_format+0x644>
{
errno = EINVAL;
ret_val = -1;
}
if (0 == ret_val)
c1f0: e3540000 cmp r4, #0
c1f4: 1a00002e bne c2b4 <msdos_format+0x660>
{
if (FAT_FAT32 != fmt_params->fattype)
c1f8: e5dd3266 ldrb r3, [sp, #614] ; 0x266
c1fc: e3530004 cmp r3, #4
c200: 0a00000b beq c234 <msdos_format+0x5e0>
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
c204: e5dd1284 ldrb r1, [sp, #644] ; 0x284
if (0 == ret_val)
{
if (FAT_FAT32 != fmt_params->fattype)
{
fmt_params->files_per_root_dir = loc_align_object (fmt_params->root_dir_sectors,
c208: e59d3250 ldr r3, [sp, #592] ; 0x250
c20c: e59d2240 ldr r2, [sp, #576] ; 0x240
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
c210: e3510000 cmp r1, #0
return (sectors + clustersize - 1) & ~(clustersize - 1);
c214: 00833002 addeq r3, r3, r2
c218: 02433001 subeq r3, r3, #1
c21c: 02622000 rsbeq r2, r2, #0
c220: 00033002 andeq r3, r3, r2
if (FAT_FAT32 != fmt_params->fattype)
{
fmt_params->files_per_root_dir = loc_align_object (fmt_params->root_dir_sectors,
fmt_params->sectors_per_cluster,
fmt_params->skip_alignment)
* (fmt_params->bytes_per_sector / FAT_DIRENTRY_SIZE);
c224: e59d2234 ldr r2, [sp, #564] ; 0x234
c228: e1a022a2 lsr r2, r2, #5
c22c: e0030392 mul r3, r2, r3
if (0 == ret_val)
{
if (FAT_FAT32 != fmt_params->fattype)
{
fmt_params->files_per_root_dir = loc_align_object (fmt_params->root_dir_sectors,
c230: e58d324c str r3, [sp, #588] ; 0x24c
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
c234: e5dd1284 ldrb r1, [sp, #644] ; 0x284
fmt_params->sectors_per_cluster,
fmt_params->skip_alignment)
* (fmt_params->bytes_per_sector / FAT_DIRENTRY_SIZE);
}
fmt_params->rsvd_sector_cnt = loc_align_object (fmt_params->rsvd_sector_cnt,
c238: e59d323c ldr r3, [sp, #572] ; 0x23c
c23c: e59d2240 ldr r2, [sp, #576] ; 0x240
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
c240: e3510000 cmp r1, #0
return (sectors + clustersize - 1) & ~(clustersize - 1);
c244: 00833002 addeq r3, r3, r2
c248: 02433001 subeq r3, r3, #1
c24c: 02622000 rsbeq r2, r2, #0
c250: 00033002 andeq r3, r3, r2
/*
* determine media code
*/
if (ret_val == 0) {
if ((rqdata != NULL) &&
c254: e3550000 cmp r5, #0
fmt_params->sectors_per_cluster,
fmt_params->skip_alignment)
* (fmt_params->bytes_per_sector / FAT_DIRENTRY_SIZE);
}
fmt_params->rsvd_sector_cnt = loc_align_object (fmt_params->rsvd_sector_cnt,
c258: e58d323c str r3, [sp, #572] ; 0x23c
/*
* determine media code
*/
if (ret_val == 0) {
if ((rqdata != NULL) &&
c25c: 0a000012 beq c2ac <msdos_format+0x658>
(rqdata->media != 0)) {
c260: e5d57014 ldrb r7, [r5, #20]
/*
* determine media code
*/
if (ret_val == 0) {
if ((rqdata != NULL) &&
c264: e3570000 cmp r7, #0
c268: 0a00000f beq c2ac <msdos_format+0x658>
(rqdata->media != 0)) {
const char valid_media_codes[] =
c26c: e59f17b8 ldr r1, [pc, #1976] ; ca2c <msdos_format+0xdd8>
c270: e3a02009 mov r2, #9
c274: e28d0e2d add r0, sp, #720 ; 0x2d0
c278: eb003421 bl 19304 <memcpy>
{0xF0,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF};
if (NULL==memchr(valid_media_codes,
c27c: e28d0e2d add r0, sp, #720 ; 0x2d0
c280: e1a01007 mov r1, r7
c284: e3a02009 mov r2, #9
c288: eb0033b0 bl 19150 <memchr>
c28c: e3500000 cmp r0, #0
sizeof(valid_media_codes))) {
ret_val = -1;
errno = EINVAL;
}
else {
fmt_params->media_code = rqdata->media;
c290: 15cd7265 strbne r7, [sp, #613] ; 0x265
if (ret_val == 0) {
if ((rqdata != NULL) &&
(rqdata->media != 0)) {
const char valid_media_codes[] =
{0xF0,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF};
if (NULL==memchr(valid_media_codes,
c294: 1a000006 bne c2b4 <msdos_format+0x660>
rqdata->media,
sizeof(valid_media_codes))) {
ret_val = -1;
errno = EINVAL;
c298: eb003172 bl 18868 <__errno>
c29c: e3a03016 mov r3, #22
c2a0: e5803000 str r3, [r0]
const char valid_media_codes[] =
{0xF0,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF};
if (NULL==memchr(valid_media_codes,
rqdata->media,
sizeof(valid_media_codes))) {
ret_val = -1;
c2a4: e3e04000 mvn r4, #0
c2a8: ea000001 b c2b4 <msdos_format+0x660>
else {
fmt_params->media_code = rqdata->media;
}
}
else {
fmt_params->media_code = FAT_BR_MEDIA_FIXED;
c2ac: e3e03007 mvn r3, #7
c2b0: e5cd3265 strb r3, [sp, #613] ; 0x265
c2b4: e59d323c ldr r3, [sp, #572] ; 0x23c
c2b8: e5dd2264 ldrb r2, [sp, #612] ; 0x264
c2bc: e59d1244 ldr r1, [sp, #580] ; 0x244
* for formatting
*/
if (fmt_params->root_dir_sectors > 0) {
fmt_params->root_dir_start_sec =
fmt_params->rsvd_sector_cnt
+ (fmt_params-> fat_num*fmt_params->sectors_per_fat);
c2c0: e0233291 mla r3, r1, r2, r3
}
/*
* determine location and size of root directory
* for formatting
*/
if (fmt_params->root_dir_sectors > 0) {
c2c4: e59d0250 ldr r0, [sp, #592] ; 0x250
c2c8: e3500000 cmp r0, #0
fmt_params->root_dir_start_sec =
c2cc: e58d3254 str r3, [sp, #596] ; 0x254
* for FAT32: root directory is in cluster 2
*/
fmt_params->root_dir_start_sec =
fmt_params->rsvd_sector_cnt
+ (fmt_params-> fat_num*fmt_params->sectors_per_fat);
fmt_params->root_dir_fmt_sec_cnt = fmt_params->sectors_per_cluster;
c2d0: 059d3240 ldreq r3, [sp, #576] ; 0x240
*/
if (fmt_params->root_dir_sectors > 0) {
fmt_params->root_dir_start_sec =
fmt_params->rsvd_sector_cnt
+ (fmt_params-> fat_num*fmt_params->sectors_per_fat);
fmt_params->root_dir_fmt_sec_cnt = fmt_params->root_dir_sectors;
c2d4: 158d0258 strne r0, [sp, #600] ; 0x258
* for FAT32: root directory is in cluster 2
*/
fmt_params->root_dir_start_sec =
fmt_params->rsvd_sector_cnt
+ (fmt_params-> fat_num*fmt_params->sectors_per_fat);
fmt_params->root_dir_fmt_sec_cnt = fmt_params->sectors_per_cluster;
c2d8: 058d3258 streq r3, [sp, #600] ; 0x258
}
/*
* determine usable OEMName
*/
if (ret_val == 0) {
c2dc: e3540000 cmp r4, #0
c2e0: 1a000039 bne c3cc <msdos_format+0x778>
const char *from;
char *to = fmt_params->OEMName;
int cnt;
from = "RTEMS"; /* default: make "from" point to OS Name */
if ((rqdata != NULL) &&
c2e4: e3550000 cmp r5, #0
*/
if (ret_val == 0) {
const char *from;
char *to = fmt_params->OEMName;
int cnt;
from = "RTEMS"; /* default: make "from" point to OS Name */
c2e8: 059f3740 ldreq r3, [pc, #1856] ; ca30 <msdos_format+0xddc>
if ((rqdata != NULL) &&
c2ec: 0a000003 beq c300 <msdos_format+0x6ac>
(rqdata->OEMName != NULL)) {
c2f0: e5953000 ldr r3, [r5]
*/
if (ret_val == 0) {
const char *from;
char *to = fmt_params->OEMName;
int cnt;
from = "RTEMS"; /* default: make "from" point to OS Name */
c2f4: e59f2734 ldr r2, [pc, #1844] ; ca30 <msdos_format+0xddc>
c2f8: e3530000 cmp r3, #0
c2fc: 01a03002 moveq r3, r2
from = rqdata->OEMName;
}
for (cnt = 0;
cnt < (sizeof(fmt_params->OEMName)-1);
cnt++) {
if (isprint((unsigned char)*from)) {
c300: e59f272c ldr r2, [pc, #1836] ; ca34 <msdos_format+0xde0>
c304: e5928000 ldr r8, [r2]
/*
* determine usable OEMName
*/
if (ret_val == 0) {
const char *from;
char *to = fmt_params->OEMName;
c308: e28d2f99 add r2, sp, #612 ; 0x264
from = rqdata->OEMName;
}
for (cnt = 0;
cnt < (sizeof(fmt_params->OEMName)-1);
cnt++) {
if (isprint((unsigned char)*from)) {
c30c: e3a01009 mov r1, #9
/*
* determine usable OEMName
*/
if (ret_val == 0) {
const char *from;
char *to = fmt_params->OEMName;
c310: e2822003 add r2, r2, #3
/*
* non-printable character in given name, so keep stuck
* at that character and replace all following characters
* with a ' '
*/
*to++=' ';
c314: e3a07020 mov r7, #32
}
*to = '\0';
c318: e3a0e000 mov lr, #0
c31c: ea00000a b c34c <msdos_format+0x6f8>
from = rqdata->OEMName;
}
for (cnt = 0;
cnt < (sizeof(fmt_params->OEMName)-1);
cnt++) {
if (isprint((unsigned char)*from)) {
c320: e5d3c000 ldrb ip, [r3]
c324: e088000c add r0, r8, ip
c328: e5d00001 ldrb r0, [r0, #1]
c32c: e3100097 tst r0, #151 ; 0x97
c330: e2820001 add r0, r2, #1
*to++ = *from++;
c334: 15c2c000 strbne ip, [r2]
/*
* non-printable character in given name, so keep stuck
* at that character and replace all following characters
* with a ' '
*/
*to++=' ';
c338: 05c27000 strbeq r7, [r2]
}
*to = '\0';
c33c: e5c0e000 strb lr, [r0]
}
for (cnt = 0;
cnt < (sizeof(fmt_params->OEMName)-1);
cnt++) {
if (isprint((unsigned char)*from)) {
*to++ = *from++;
c340: 11a02000 movne r2, r0
c344: 12833001 addne r3, r3, #1
/*
* non-printable character in given name, so keep stuck
* at that character and replace all following characters
* with a ' '
*/
*to++=' ';
c348: 01a02000 moveq r2, r0
from = "RTEMS"; /* default: make "from" point to OS Name */
if ((rqdata != NULL) &&
(rqdata->OEMName != NULL)) {
from = rqdata->OEMName;
}
for (cnt = 0;
c34c: e2511001 subs r1, r1, #1
c350: 1afffff2 bne c320 <msdos_format+0x6cc>
c354: ea000191 b c9a0 <msdos_format+0xd4c>
const char *from;
char *to = fmt_params->VolLabel;
int cnt;
from = ""; /* default: make "from" point to empty string */
if ((rqdata != NULL) &&
(rqdata->VolLabel != NULL)) {
c358: e5953004 ldr r3, [r5, #4]
if (ret_val == 0) {
const char *from;
char *to = fmt_params->VolLabel;
int cnt;
from = ""; /* default: make "from" point to empty string */
if ((rqdata != NULL) &&
c35c: e3530000 cmp r3, #0
(rqdata->VolLabel != NULL)) {
from = rqdata->VolLabel;
fmt_params->VolLabel_present = true;
c360: 13a02001 movne r2, #1
c364: 15cd227c strbne r2, [sp, #636] ; 0x27c
if (ret_val == 0) {
const char *from;
char *to = fmt_params->VolLabel;
int cnt;
from = ""; /* default: make "from" point to empty string */
if ((rqdata != NULL) &&
c368: 1a000000 bne c370 <msdos_format+0x71c>
*/
if (ret_val == 0) {
const char *from;
char *to = fmt_params->VolLabel;
int cnt;
from = ""; /* default: make "from" point to empty string */
c36c: e59f36c4 ldr r3, [pc, #1732] ; ca38 <msdos_format+0xde4>
fmt_params->VolLabel_present = true;
}
for (cnt = 0;
cnt < (sizeof(fmt_params->VolLabel)-1);
cnt++) {
if (isprint((unsigned char)*from)) {
c370: e59f26bc ldr r2, [pc, #1724] ; ca34 <msdos_format+0xde0>
c374: e3a0100c mov r1, #12
c378: e5928000 ldr r8, [r2]
/*
* non-printable character in given name, so keep stuck
* at that character and replace all following characters
* with a ' '
*/
*to++=' ';
c37c: e3a07020 mov r7, #32
/*
* determine usable Volume Label
*/
if (ret_val == 0) {
const char *from;
char *to = fmt_params->VolLabel;
c380: e28d2e27 add r2, sp, #624 ; 0x270
* at that character and replace all following characters
* with a ' '
*/
*to++=' ';
}
*to = '\0';
c384: e3a0e000 mov lr, #0
c388: ea00000a b c3b8 <msdos_format+0x764>
fmt_params->VolLabel_present = true;
}
for (cnt = 0;
cnt < (sizeof(fmt_params->VolLabel)-1);
cnt++) {
if (isprint((unsigned char)*from)) {
c38c: e5d3c000 ldrb ip, [r3]
c390: e088000c add r0, r8, ip
c394: e5d00001 ldrb r0, [r0, #1]
c398: e3100097 tst r0, #151 ; 0x97
c39c: e2820001 add r0, r2, #1
*to++ = *from++;
c3a0: 15c2c000 strbne ip, [r2]
/*
* non-printable character in given name, so keep stuck
* at that character and replace all following characters
* with a ' '
*/
*to++=' ';
c3a4: 05c27000 strbeq r7, [r2]
}
*to = '\0';
c3a8: e5c0e000 strb lr, [r0]
}
for (cnt = 0;
cnt < (sizeof(fmt_params->VolLabel)-1);
cnt++) {
if (isprint((unsigned char)*from)) {
*to++ = *from++;
c3ac: 11a02000 movne r2, r0
c3b0: 12833001 addne r3, r3, #1
/*
* non-printable character in given name, so keep stuck
* at that character and replace all following characters
* with a ' '
*/
*to++=' ';
c3b4: 01a02000 moveq r2, r0
if ((rqdata != NULL) &&
(rqdata->VolLabel != NULL)) {
from = rqdata->VolLabel;
fmt_params->VolLabel_present = true;
}
for (cnt = 0;
c3b8: e2511001 subs r1, r1, #1
c3bc: 1afffff2 bne c38c <msdos_format+0x738>
c3c0: ea000179 b c9ac <msdos_format+0xd58>
rc = rtems_clock_get_tod_timeval(&time_value);
if (rc == RTEMS_SUCCESSFUL) {
*volid_ptr = time_value.tv_sec + time_value.tv_sec;
}
else {
*volid_ptr = rand();
c3c4: eb00368b bl 19df8 <rand>
c3c8: e58d0280 str r0, [sp, #640] ; 0x280
}
/*
* if requested, write whole disk/partition with 0xe5
*/
if ((ret_val == 0) &&
(rqdata != NULL) &&
c3cc: e2958000 adds r8, r5, #0
c3d0: 13a08001 movne r8, #1
ret_val = msdos_format_determine_fmt_params(fd,rqdata,&fmt_params);
}
/*
* if requested, write whole disk/partition with 0xe5
*/
if ((ret_val == 0) &&
c3d4: e3540000 cmp r4, #0
c3d8: 13a03000 movne r3, #0
c3dc: 02083001 andeq r3, r8, #1
c3e0: e3530000 cmp r3, #0
c3e4: 0a00000b beq c418 <msdos_format+0x7c4>
(rqdata != NULL) &&
c3e8: e5d52015 ldrb r2, [r5, #21]
c3ec: e3520000 cmp r2, #0
c3f0: 1a00000a bne c420 <msdos_format+0x7cc>
!(rqdata->quick_format)) {
ret_val = msdos_format_fill_sectors
c3f4: e59d3234 ldr r3, [sp, #564] ; 0x234
c3f8: e58d3000 str r3, [sp]
c3fc: e3a030e5 mov r3, #229 ; 0xe5
c400: e58d3004 str r3, [sp, #4]
c404: e1a00005 mov r0, r5
c408: e1a01006 mov r1, r6
c40c: e59d3238 ldr r3, [sp, #568] ; 0x238
c410: ebfffda9 bl babc <msdos_format_fill_sectors>
c414: e1a04000 mov r4, r0
}
/*
* create master boot record
*/
if (ret_val == 0) {
c418: e3540000 cmp r4, #0
c41c: 1a000173 bne c9f0 <msdos_format+0xd9c>
/*
* Read the current MBR to obtain the partition table.
*/
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
c420: e1a00005 mov r0, r5
c424: e3a01002 mov r1, #2
c428: e59f260c ldr r2, [pc, #1548] ; ca3c <msdos_format+0xde8>
c42c: ebfffd77 bl ba10 <msdos_format_printf>
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
int ret_val = 0;
if (0 > lseek(fd,((off_t)start_sector)*sector_size,SEEK_SET)) {
c430: e3a02000 mov r2, #0
c434: e1a00006 mov r0, r6
c438: e3a01000 mov r1, #0
c43c: e3a03000 mov r3, #0
/*
* Read the current MBR to obtain the partition table.
*/
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
"read MRB sector\n");
ret_val = msdos_format_read_sec(fd,
c440: e59d4234 ldr r4, [sp, #564] ; 0x234
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
int ret_val = 0;
if (0 > lseek(fd,((off_t)start_sector)*sector_size,SEEK_SET)) {
c444: eb00188a bl 12674 <lseek>
c448: e3500000 cmp r0, #0
c44c: e2d12000 sbcs r2, r1, #0
c450: ba000005 blt c46c <msdos_format+0x818>
ret_val = -1;
}
if (ret_val == 0) {
if (0 > read(fd,buffer,sector_size)) {
c454: e1a00006 mov r0, r6
c458: e28d1034 add r1, sp, #52 ; 0x34
c45c: e1a02004 mov r2, r4
c460: eb001933 bl 12934 <read>
c464: e3500000 cmp r0, #0
c468: aa000157 bge c9cc <msdos_format+0xd78>
fmt_params.bytes_per_sector,
tmp_sec);
}
}
if (ret_val == 0 && rqdata != NULL && rqdata->sync_device) {
c46c: e3e04000 mvn r4, #0 <== NOT EXECUTED
c470: ea00015e b c9f0 <msdos_format+0xd9c> <== NOT EXECUTED
{
uint32_t total_sectors_num16 = 0;
uint32_t total_sectors_num32 = 0;
/* store total sector count in either 16 or 32 bit field in mbr */
if (fmt_params->totl_sector_cnt < 0x10000) {
c474: e1a07004 mov r7, r4
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
uint32_t total_sectors_num16 = 0;
c478: e3a04000 mov r4, #0
* finally we are there: let's fill in the values into the MBR
* but first clear the MRB leaving the partition table.
*/
#define RTEMS_IDE_PARTITION_TABLE_OFFSET 0x1be
#define RTEMS_IDE_PARTITION_TABLE_SIZE (4 * 16)
memset(mbr,0,RTEMS_IDE_PARTITION_TABLE_OFFSET);
c47c: e3a01000 mov r1, #0
c480: e59f25b8 ldr r2, [pc, #1464] ; ca40 <msdos_format+0xdec>
c484: e28d0034 add r0, sp, #52 ; 0x34
c488: eb0033d3 bl 193dc <memset>
memset(mbr + RTEMS_IDE_PARTITION_TABLE_OFFSET + RTEMS_IDE_PARTITION_TABLE_SIZE,
c48c: e3a0a000 mov sl, #0
c490: e28d3e23 add r3, sp, #560 ; 0x230
* with 0xEB,....
*/
/*
* fill OEMName
*/
memcpy(FAT_GET_ADDR_BR_OEMNAME(mbr),
c494: e28d2f8d add r2, sp, #564 ; 0x234
* but first clear the MRB leaving the partition table.
*/
#define RTEMS_IDE_PARTITION_TABLE_OFFSET 0x1be
#define RTEMS_IDE_PARTITION_TABLE_SIZE (4 * 16)
memset(mbr,0,RTEMS_IDE_PARTITION_TABLE_OFFSET);
memset(mbr + RTEMS_IDE_PARTITION_TABLE_OFFSET + RTEMS_IDE_PARTITION_TABLE_SIZE,
c498: e28d0034 add r0, sp, #52 ; 0x34
* with 0xEB,....
*/
/*
* fill OEMName
*/
memcpy(FAT_GET_ADDR_BR_OEMNAME(mbr),
c49c: e2821033 add r1, r2, #51 ; 0x33
* but first clear the MRB leaving the partition table.
*/
#define RTEMS_IDE_PARTITION_TABLE_OFFSET 0x1be
#define RTEMS_IDE_PARTITION_TABLE_SIZE (4 * 16)
memset(mbr,0,RTEMS_IDE_PARTITION_TABLE_OFFSET);
memset(mbr + RTEMS_IDE_PARTITION_TABLE_OFFSET + RTEMS_IDE_PARTITION_TABLE_SIZE,
c4a0: e1c3a0b2 strh sl, [r3, #2]
* with 0xEB,....
*/
/*
* fill OEMName
*/
memcpy(FAT_GET_ADDR_BR_OEMNAME(mbr),
c4a4: e3a02008 mov r2, #8
c4a8: e2800003 add r0, r0, #3
c4ac: eb003394 bl 19304 <memcpy>
fmt_params->OEMName,
FAT_BR_OEMNAME_SIZE);
FAT_SET_BR_BYTES_PER_SECTOR(mbr , fmt_params->bytes_per_sector);
c4b0: e59d3234 ldr r3, [sp, #564] ; 0x234
c4b4: e5cd303f strb r3, [sp, #63] ; 0x3f
c4b8: e1a03423 lsr r3, r3, #8
c4bc: e5cd3040 strb r3, [sp, #64] ; 0x40
FAT_SET_BR_SECTORS_PER_CLUSTER(mbr , fmt_params->sectors_per_cluster);
c4c0: e59d3240 ldr r3, [sp, #576] ; 0x240
c4c4: e5cd3041 strb r3, [sp, #65] ; 0x41
FAT_SET_BR_RESERVED_SECTORS_NUM(mbr, fmt_params->rsvd_sector_cnt);
c4c8: e59d323c ldr r3, [sp, #572] ; 0x23c
c4cc: e5cd3042 strb r3, [sp, #66] ; 0x42
c4d0: e1a03423 lsr r3, r3, #8
c4d4: e5cd3043 strb r3, [sp, #67] ; 0x43
/* number of FATs on medium */
FAT_SET_BR_FAT_NUM(mbr , 2); /* standard/recommended value */
FAT_SET_BR_FILES_PER_ROOT_DIR(mbr , fmt_params->files_per_root_dir);
c4d8: e59d324c ldr r3, [sp, #588] ; 0x24c
c4dc: e5cd3045 strb r3, [sp, #69] ; 0x45
c4e0: e1a03423 lsr r3, r3, #8
c4e4: e5cd3046 strb r3, [sp, #70] ; 0x46
FAT_SET_BR_TOTAL_SECTORS_NUM16(mbr , total_sectors_num16);
FAT_SET_BR_MEDIA(mbr , fmt_params->media_code);
c4e8: e5dd3265 ldrb r3, [sp, #613] ; 0x265
FAT_SET_BR_RESERVED_SECTORS_NUM(mbr, fmt_params->rsvd_sector_cnt);
/* number of FATs on medium */
FAT_SET_BR_FAT_NUM(mbr , 2); /* standard/recommended value */
FAT_SET_BR_FILES_PER_ROOT_DIR(mbr , fmt_params->files_per_root_dir);
FAT_SET_BR_TOTAL_SECTORS_NUM16(mbr , total_sectors_num16);
c4ec: e5cd4047 strb r4, [sp, #71] ; 0x47
FAT_SET_BR_MEDIA(mbr , fmt_params->media_code);
c4f0: e5cd3049 strb r3, [sp, #73] ; 0x49
FAT_SET_BR_RESERVED_SECTORS_NUM(mbr, fmt_params->rsvd_sector_cnt);
/* number of FATs on medium */
FAT_SET_BR_FAT_NUM(mbr , 2); /* standard/recommended value */
FAT_SET_BR_FILES_PER_ROOT_DIR(mbr , fmt_params->files_per_root_dir);
FAT_SET_BR_TOTAL_SECTORS_NUM16(mbr , total_sectors_num16);
c4f4: e1a04424 lsr r4, r4, #8
FAT_SET_BR_MEDIA(mbr , fmt_params->media_code);
FAT_SET_BR_SECTORS_PER_TRACK(mbr , 255); /* only needed for INT13... */
c4f8: e3e03000 mvn r3, #0
FAT_SET_BR_RESERVED_SECTORS_NUM(mbr, fmt_params->rsvd_sector_cnt);
/* number of FATs on medium */
FAT_SET_BR_FAT_NUM(mbr , 2); /* standard/recommended value */
FAT_SET_BR_FILES_PER_ROOT_DIR(mbr , fmt_params->files_per_root_dir);
FAT_SET_BR_TOTAL_SECTORS_NUM16(mbr , total_sectors_num16);
c4fc: e5cd4048 strb r4, [sp, #72] ; 0x48
FAT_SET_BR_MEDIA(mbr , fmt_params->media_code);
FAT_SET_BR_SECTORS_PER_TRACK(mbr , 255); /* only needed for INT13... */
c500: e5cd304c strb r3, [sp, #76] ; 0x4c
FAT_SET_BR_NUMBER_OF_HEADS(mbr , 6); /* only needed for INT13... */
FAT_SET_BR_HIDDEN_SECTORS(mbr , 1); /* only needed for INT13... */
FAT_SET_BR_TOTAL_SECTORS_NUM32(mbr , total_sectors_num32);
if (fmt_params->fattype != FAT_FAT32) {
c504: e5dd4266 ldrb r4, [sp, #614] ; 0x266
FAT_SET_BR_FILES_PER_ROOT_DIR(mbr , fmt_params->files_per_root_dir);
FAT_SET_BR_TOTAL_SECTORS_NUM16(mbr , total_sectors_num16);
FAT_SET_BR_MEDIA(mbr , fmt_params->media_code);
FAT_SET_BR_SECTORS_PER_TRACK(mbr , 255); /* only needed for INT13... */
FAT_SET_BR_NUMBER_OF_HEADS(mbr , 6); /* only needed for INT13... */
c508: e3a03006 mov r3, #6
c50c: e5cd304e strb r3, [sp, #78] ; 0x4e
FAT_SET_BR_HIDDEN_SECTORS(mbr , 1); /* only needed for INT13... */
FAT_SET_BR_TOTAL_SECTORS_NUM32(mbr , total_sectors_num32);
c510: e1a03427 lsr r3, r7, #8
FAT_SET_BR_BYTES_PER_SECTOR(mbr , fmt_params->bytes_per_sector);
FAT_SET_BR_SECTORS_PER_CLUSTER(mbr , fmt_params->sectors_per_cluster);
FAT_SET_BR_RESERVED_SECTORS_NUM(mbr, fmt_params->rsvd_sector_cnt);
/* number of FATs on medium */
FAT_SET_BR_FAT_NUM(mbr , 2); /* standard/recommended value */
c514: e3a01002 mov r1, #2
FAT_SET_BR_TOTAL_SECTORS_NUM16(mbr , total_sectors_num16);
FAT_SET_BR_MEDIA(mbr , fmt_params->media_code);
FAT_SET_BR_SECTORS_PER_TRACK(mbr , 255); /* only needed for INT13... */
FAT_SET_BR_NUMBER_OF_HEADS(mbr , 6); /* only needed for INT13... */
FAT_SET_BR_HIDDEN_SECTORS(mbr , 1); /* only needed for INT13... */
c518: e3a02001 mov r2, #1
FAT_SET_BR_TOTAL_SECTORS_NUM32(mbr , total_sectors_num32);
c51c: e5cd7054 strb r7, [sp, #84] ; 0x54
c520: e5cd3055 strb r3, [sp, #85] ; 0x55
if (fmt_params->fattype != FAT_FAT32) {
c524: e3540004 cmp r4, #4
FAT_SET_BR_SECTORS_PER_TRACK(mbr , 255); /* only needed for INT13... */
FAT_SET_BR_NUMBER_OF_HEADS(mbr , 6); /* only needed for INT13... */
FAT_SET_BR_HIDDEN_SECTORS(mbr , 1); /* only needed for INT13... */
FAT_SET_BR_TOTAL_SECTORS_NUM32(mbr , total_sectors_num32);
c528: e1a03827 lsr r3, r7, #16
c52c: e1a07c27 lsr r7, r7, #24
c530: e5cd3056 strb r3, [sp, #86] ; 0x56
FAT_SET_BR_BYTES_PER_SECTOR(mbr , fmt_params->bytes_per_sector);
FAT_SET_BR_SECTORS_PER_CLUSTER(mbr , fmt_params->sectors_per_cluster);
FAT_SET_BR_RESERVED_SECTORS_NUM(mbr, fmt_params->rsvd_sector_cnt);
/* number of FATs on medium */
FAT_SET_BR_FAT_NUM(mbr , 2); /* standard/recommended value */
c534: e5cd1044 strb r1, [sp, #68] ; 0x44
FAT_SET_BR_TOTAL_SECTORS_NUM16(mbr , total_sectors_num16);
FAT_SET_BR_MEDIA(mbr , fmt_params->media_code);
FAT_SET_BR_SECTORS_PER_TRACK(mbr , 255); /* only needed for INT13... */
FAT_SET_BR_NUMBER_OF_HEADS(mbr , 6); /* only needed for INT13... */
FAT_SET_BR_HIDDEN_SECTORS(mbr , 1); /* only needed for INT13... */
c538: e5cd2050 strb r2, [sp, #80] ; 0x50
FAT_SET_BR_TOTAL_SECTORS_NUM32(mbr , total_sectors_num32);
c53c: e5cd7057 strb r7, [sp, #87] ; 0x57
c540: e59d3244 ldr r3, [sp, #580] ; 0x244
if (fmt_params->fattype != FAT_FAT32) {
c544: 0a000016 beq c5a4 <msdos_format+0x950>
FAT_SET_BR_SECTORS_PER_FAT(mbr ,fmt_params->sectors_per_fat);
c548: e5cd304a strb r3, [sp, #74] ; 0x4a
c54c: e1a03423 lsr r3, r3, #8
c550: e5cd304b strb r3, [sp, #75] ; 0x4b
FAT_SET_BR_DRVNUM(mbr , 0); /* only needed for INT13... */
FAT_SET_BR_RSVD1(mbr , 0); /* fill with zero */
FAT_SET_BR_BOOTSIG(mbr , FAT_BR_BOOTSIG_VAL);
c554: e3a03029 mov r3, #41 ; 0x29
c558: e5cd305a strb r3, [sp, #90] ; 0x5a
FAT_SET_BR_VOLID(mbr , fmt_params->vol_id); /* volume id */
c55c: e59d3280 ldr r3, [sp, #640] ; 0x280
c560: e1a02423 lsr r2, r3, #8
c564: e5cd205c strb r2, [sp, #92] ; 0x5c
c568: e1a02823 lsr r2, r3, #16
c56c: e5cd305b strb r3, [sp, #91] ; 0x5b
c570: e5cd205d strb r2, [sp, #93] ; 0x5d
c574: e1a03c23 lsr r3, r3, #24
memcpy(FAT_GET_ADDR_BR_VOLLAB(mbr),
c578: e28d1e27 add r1, sp, #624 ; 0x270
c57c: e28d005f add r0, sp, #95 ; 0x5f
c580: e3a0200b mov r2, #11
if (fmt_params->fattype != FAT_FAT32) {
FAT_SET_BR_SECTORS_PER_FAT(mbr ,fmt_params->sectors_per_fat);
FAT_SET_BR_DRVNUM(mbr , 0); /* only needed for INT13... */
FAT_SET_BR_RSVD1(mbr , 0); /* fill with zero */
FAT_SET_BR_BOOTSIG(mbr , FAT_BR_BOOTSIG_VAL);
FAT_SET_BR_VOLID(mbr , fmt_params->vol_id); /* volume id */
c584: e5cd305e strb r3, [sp, #94] ; 0x5e
memcpy(FAT_GET_ADDR_BR_VOLLAB(mbr),
c588: eb00335d bl 19304 <memcpy>
fmt_params->VolLabel,
FAT_BR_VOLLAB_SIZE);
memcpy(FAT_GET_ADDR_BR_FILSYSTYPE(mbr),
c58c: e59f34b0 ldr r3, [pc, #1200] ; ca44 <msdos_format+0xdf0>
c590: e3540001 cmp r4, #1
c594: e59f14ac ldr r1, [pc, #1196] ; ca48 <msdos_format+0xdf4>
c598: e28d006a add r0, sp, #106 ; 0x6a
c59c: 01a01003 moveq r1, r3
c5a0: ea000018 b c608 <msdos_format+0x9b4>
? "FAT12 "
: "FAT16 ",
FAT_BR_FILSYSTYPE_SIZE);
}
else {
FAT_SET_BR_SECTORS_PER_FAT32(mbr ,fmt_params->sectors_per_fat);
c5a4: e1a00423 lsr r0, r3, #8
c5a8: e5cd3058 strb r3, [sp, #88] ; 0x58
c5ac: e5cd0059 strb r0, [sp, #89] ; 0x59
c5b0: e1a00823 lsr r0, r3, #16
c5b4: e1a03c23 lsr r3, r3, #24
c5b8: e5cd305b strb r3, [sp, #91] ; 0x5b
FAT_SET_BR_EXT_FLAGS(mbr , 0);
FAT_SET_BR_FSVER(mbr , 0); /* FAT32 Version:0.0 */
FAT_SET_BR_FAT32_ROOT_CLUSTER(mbr , 2); /* put root dir to cluster 2 */
FAT_SET_BR_FAT32_FS_INFO_SECTOR(mbr, 1); /* Put fsinfo to rsrvd sec 1*/
FAT_SET_BR_FAT32_BK_BOOT_SECTOR(mbr, fmt_params->mbr_copy_sec ); /* Put MBR copy to rsrvd sec */
c5bc: e59d325c ldr r3, [sp, #604] ; 0x25c
? "FAT12 "
: "FAT16 ",
FAT_BR_FILSYSTYPE_SIZE);
}
else {
FAT_SET_BR_SECTORS_PER_FAT32(mbr ,fmt_params->sectors_per_fat);
c5c0: e5cd005a strb r0, [sp, #90] ; 0x5a
FAT_SET_BR_EXT_FLAGS(mbr , 0);
FAT_SET_BR_FSVER(mbr , 0); /* FAT32 Version:0.0 */
FAT_SET_BR_FAT32_ROOT_CLUSTER(mbr , 2); /* put root dir to cluster 2 */
c5c4: e5cd1060 strb r1, [sp, #96] ; 0x60
FAT_SET_BR_FAT32_FS_INFO_SECTOR(mbr, 1); /* Put fsinfo to rsrvd sec 1*/
c5c8: e5cd2064 strb r2, [sp, #100] ; 0x64
FAT_SET_BR_FAT32_BK_BOOT_SECTOR(mbr, fmt_params->mbr_copy_sec ); /* Put MBR copy to rsrvd sec */
c5cc: e5cd3066 strb r3, [sp, #102] ; 0x66
memset(FAT_GET_ADDR_BR_FAT32_RESERVED(mbr),0,FAT_BR_FAT32_RESERVED_SIZE);
c5d0: e1a0100a mov r1, sl
FAT_SET_BR_SECTORS_PER_FAT32(mbr ,fmt_params->sectors_per_fat);
FAT_SET_BR_EXT_FLAGS(mbr , 0);
FAT_SET_BR_FSVER(mbr , 0); /* FAT32 Version:0.0 */
FAT_SET_BR_FAT32_ROOT_CLUSTER(mbr , 2); /* put root dir to cluster 2 */
FAT_SET_BR_FAT32_FS_INFO_SECTOR(mbr, 1); /* Put fsinfo to rsrvd sec 1*/
FAT_SET_BR_FAT32_BK_BOOT_SECTOR(mbr, fmt_params->mbr_copy_sec ); /* Put MBR copy to rsrvd sec */
c5d4: e1a03423 lsr r3, r3, #8
memset(FAT_GET_ADDR_BR_FAT32_RESERVED(mbr),0,FAT_BR_FAT32_RESERVED_SIZE);
c5d8: e3a0200c mov r2, #12
c5dc: e28d0068 add r0, sp, #104 ; 0x68
FAT_SET_BR_SECTORS_PER_FAT32(mbr ,fmt_params->sectors_per_fat);
FAT_SET_BR_EXT_FLAGS(mbr , 0);
FAT_SET_BR_FSVER(mbr , 0); /* FAT32 Version:0.0 */
FAT_SET_BR_FAT32_ROOT_CLUSTER(mbr , 2); /* put root dir to cluster 2 */
FAT_SET_BR_FAT32_FS_INFO_SECTOR(mbr, 1); /* Put fsinfo to rsrvd sec 1*/
FAT_SET_BR_FAT32_BK_BOOT_SECTOR(mbr, fmt_params->mbr_copy_sec ); /* Put MBR copy to rsrvd sec */
c5e0: e5cd3067 strb r3, [sp, #103] ; 0x67
memset(FAT_GET_ADDR_BR_FAT32_RESERVED(mbr),0,FAT_BR_FAT32_RESERVED_SIZE);
c5e4: eb00337c bl 193dc <memset>
FAT_SET_BR_FAT32_DRVNUM(mbr , 0); /* only needed for INT13... */
FAT_SET_BR_FAT32_RSVD1(mbr , 0); /* fill with zero */
FAT_SET_BR_FAT32_BOOTSIG(mbr ,FAT_BR_FAT32_BOOTSIG_VAL);
c5e8: e3a03029 mov r3, #41 ; 0x29
FAT_SET_BR_FAT32_VOLID(mbr , 0); /* not set */
memset(FAT_GET_ADDR_BR_FAT32_VOLLAB(mbr) ,0,FAT_BR_VOLLAB_SIZE);
c5ec: e1a0100a mov r1, sl
c5f0: e28d007b add r0, sp, #123 ; 0x7b
c5f4: e3a0200b mov r2, #11
FAT_SET_BR_FAT32_BK_BOOT_SECTOR(mbr, fmt_params->mbr_copy_sec ); /* Put MBR copy to rsrvd sec */
memset(FAT_GET_ADDR_BR_FAT32_RESERVED(mbr),0,FAT_BR_FAT32_RESERVED_SIZE);
FAT_SET_BR_FAT32_DRVNUM(mbr , 0); /* only needed for INT13... */
FAT_SET_BR_FAT32_RSVD1(mbr , 0); /* fill with zero */
FAT_SET_BR_FAT32_BOOTSIG(mbr ,FAT_BR_FAT32_BOOTSIG_VAL);
c5f8: e5cd3076 strb r3, [sp, #118] ; 0x76
FAT_SET_BR_FAT32_VOLID(mbr , 0); /* not set */
memset(FAT_GET_ADDR_BR_FAT32_VOLLAB(mbr) ,0,FAT_BR_VOLLAB_SIZE);
c5fc: eb003376 bl 193dc <memset>
memcpy(FAT_GET_ADDR_BR_FAT32_FILSYSTYPE(mbr),
c600: e59f1444 ldr r1, [pc, #1092] ; ca4c <msdos_format+0xdf8>
c604: e28d0086 add r0, sp, #134 ; 0x86
c608: e3a02008 mov r2, #8
c60c: eb00333c bl 19304 <memcpy>
FAT_BR_FILSYSTYPE_SIZE);
}
/*
* add boot record signature
*/
FAT_SET_BR_SIGNATURE(mbr, FAT_BR_SIGNATURE_VAL);
c610: e3a03055 mov r3, #85 ; 0x55
c614: e5cd3232 strb r3, [sp, #562] ; 0x232
c618: e3e03055 mvn r3, #85 ; 0x55
c61c: e5cd3233 strb r3, [sp, #563] ; 0x233
/*
* add jump to boot loader at start of sector
*/
FAT_SET_VAL8(mbr,0,0xeb);
c620: e3e03014 mvn r3, #20
c624: e5cd3034 strb r3, [sp, #52] ; 0x34
FAT_SET_VAL8(mbr,1,0x3c);
c628: e3a0303c mov r3, #60 ; 0x3c
c62c: e5cd3035 strb r3, [sp, #53] ; 0x35
/*
* write master boot record to disk
* also write copy of MBR to disk
*/
if (ret_val == 0) {
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
c630: e1a00005 mov r0, r5
/*
* add jump to boot loader at start of sector
*/
FAT_SET_VAL8(mbr,0,0xeb);
FAT_SET_VAL8(mbr,1,0x3c);
FAT_SET_VAL8(mbr,2,0x90);
c634: e3e0306f mvn r3, #111 ; 0x6f
/*
* write master boot record to disk
* also write copy of MBR to disk
*/
if (ret_val == 0) {
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
c638: e3a01002 mov r1, #2
c63c: e59f240c ldr r2, [pc, #1036] ; ca50 <msdos_format+0xdfc>
/*
* add jump to boot loader at start of sector
*/
FAT_SET_VAL8(mbr,0,0xeb);
FAT_SET_VAL8(mbr,1,0x3c);
FAT_SET_VAL8(mbr,2,0x90);
c640: e5cd3036 strb r3, [sp, #54] ; 0x36
/*
* write master boot record to disk
* also write copy of MBR to disk
*/
if (ret_val == 0) {
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
c644: ebfffcf1 bl ba10 <msdos_format_printf>
"write MRB sector\n");
ret_val = msdos_format_write_sec(fd,
c648: e1a00006 mov r0, r6
c64c: e3a01000 mov r1, #0
c650: e59d2234 ldr r2, [sp, #564] ; 0x234
c654: e28d3034 add r3, sp, #52 ; 0x34
c658: ebfffd01 bl ba64 <msdos_format_write_sec>
0,
fmt_params.bytes_per_sector,
tmp_sec);
}
if ((ret_val == 0) &&
c65c: e2504000 subs r4, r0, #0
c660: 1a0000e2 bne c9f0 <msdos_format+0xd9c>
c664: e59d325c ldr r3, [sp, #604] ; 0x25c
c668: e3530000 cmp r3, #0
c66c: 0a00000a beq c69c <msdos_format+0xa48>
(fmt_params.mbr_copy_sec != 0)) {
/*
* write copy of MBR
*/
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
c670: e1a00005 mov r0, r5
c674: e3a01002 mov r1, #2
c678: e59f23d4 ldr r2, [pc, #980] ; ca54 <msdos_format+0xe00>
c67c: ebfffce3 bl ba10 <msdos_format_printf>
"write back up MRB sector\n");
ret_val = msdos_format_write_sec(fd,
c680: e1a00006 mov r0, r6
c684: e59d125c ldr r1, [sp, #604] ; 0x25c
c688: e59d2234 ldr r2, [sp, #564] ; 0x234
c68c: e28d3034 add r3, sp, #52 ; 0x34
c690: ebfffcf3 bl ba64 <msdos_format_write_sec>
}
}
/*
* for FAT32: initialize info sector on disk
*/
if ((ret_val == 0) &&
c694: e2504000 subs r4, r0, #0
c698: 1a0000d4 bne c9f0 <msdos_format+0xd9c>
(fmt_params.fsinfo_sec != 0)) {
c69c: e59d4260 ldr r4, [sp, #608] ; 0x260
}
}
/*
* for FAT32: initialize info sector on disk
*/
if ((ret_val == 0) &&
c6a0: e3540000 cmp r4, #0
c6a4: 0a000023 beq c738 <msdos_format+0xae4>
\*=========================================================================*/
{
/*
* clear fsinfo sector data
*/
memset(fsinfo,0,FAT_TOTAL_FSINFO_SIZE);
c6a8: e3a01000 mov r1, #0
c6ac: e3a02c02 mov r2, #512 ; 0x200
c6b0: e28d0034 add r0, sp, #52 ; 0x34
c6b4: eb003348 bl 193dc <memset>
/*
* write LEADSIG, STRUCTSIG, TRAILSIG
*/
FAT_SET_FSINFO_LEAD_SIGNATURE (fsinfo,FAT_FSINFO_LEAD_SIGNATURE_VALUE );
c6b8: e3a03052 mov r3, #82 ; 0x52
c6bc: e5cd3034 strb r3, [sp, #52] ; 0x34
c6c0: e5cd3035 strb r3, [sp, #53] ; 0x35
c6c4: e3a03061 mov r3, #97 ; 0x61
c6c8: e5cd3036 strb r3, [sp, #54] ; 0x36
FAT_SET_FSINFO_STRUC_SIGNATURE(fsinfo,FAT_FSINFO_STRUC_SIGNATURE_VALUE);
c6cc: e5cd321b strb r3, [sp, #539] ; 0x21b
FAT_SET_FSINFO_TRAIL_SIGNATURE(fsinfo,FAT_FSINFO_TRAIL_SIGNATURE_VALUE);
c6d0: e3a03055 mov r3, #85 ; 0x55
c6d4: e5cd3232 strb r3, [sp, #562] ; 0x232
c6d8: e3e03055 mvn r3, #85 ; 0x55
*/
memset(fsinfo,0,FAT_TOTAL_FSINFO_SIZE);
/*
* write LEADSIG, STRUCTSIG, TRAILSIG
*/
FAT_SET_FSINFO_LEAD_SIGNATURE (fsinfo,FAT_FSINFO_LEAD_SIGNATURE_VALUE );
c6dc: e3a02041 mov r2, #65 ; 0x41
FAT_SET_FSINFO_STRUC_SIGNATURE(fsinfo,FAT_FSINFO_STRUC_SIGNATURE_VALUE);
c6e0: e3a01072 mov r1, #114 ; 0x72
FAT_SET_FSINFO_TRAIL_SIGNATURE(fsinfo,FAT_FSINFO_TRAIL_SIGNATURE_VALUE);
c6e4: e5cd3233 strb r3, [sp, #563] ; 0x233
/*
* write "empty" values for free cluster count and next cluster number
*/
FAT_SET_FSINFO_FREE_CLUSTER_COUNT(fsinfo+FAT_FSI_INFO,
c6e8: e3e03000 mvn r3, #0
*/
memset(fsinfo,0,FAT_TOTAL_FSINFO_SIZE);
/*
* write LEADSIG, STRUCTSIG, TRAILSIG
*/
FAT_SET_FSINFO_LEAD_SIGNATURE (fsinfo,FAT_FSINFO_LEAD_SIGNATURE_VALUE );
c6ec: e5cd2037 strb r2, [sp, #55] ; 0x37
FAT_SET_FSINFO_STRUC_SIGNATURE(fsinfo,FAT_FSINFO_STRUC_SIGNATURE_VALUE);
c6f0: e5cd1218 strb r1, [sp, #536] ; 0x218
c6f4: e5cd1219 strb r1, [sp, #537] ; 0x219
c6f8: e5cd221a strb r2, [sp, #538] ; 0x21a
FAT_SET_FSINFO_TRAIL_SIGNATURE(fsinfo,FAT_FSINFO_TRAIL_SIGNATURE_VALUE);
/*
* write "empty" values for free cluster count and next cluster number
*/
FAT_SET_FSINFO_FREE_CLUSTER_COUNT(fsinfo+FAT_FSI_INFO,
c6fc: e5cd321c strb r3, [sp, #540] ; 0x21c
c700: e5cd321d strb r3, [sp, #541] ; 0x21d
c704: e5cd321e strb r3, [sp, #542] ; 0x21e
c708: e5cd321f strb r3, [sp, #543] ; 0x21f
0xffffffff);
FAT_SET_FSINFO_NEXT_FREE_CLUSTER (fsinfo+FAT_FSI_INFO,
c70c: e5cd3220 strb r3, [sp, #544] ; 0x220
c710: e5cd3221 strb r3, [sp, #545] ; 0x221
c714: e5cd3222 strb r3, [sp, #546] ; 0x222
c718: e5cd3223 strb r3, [sp, #547] ; 0x223
/*
* write fsinfo sector
*/
if ((ret_val == 0) &&
(fmt_params.fsinfo_sec != 0)) {
ret_val = msdos_format_write_sec(fd,
c71c: e1a01004 mov r1, r4
c720: e1a00006 mov r0, r6
c724: e59d2234 ldr r2, [sp, #564] ; 0x234
c728: e28d3034 add r3, sp, #52 ; 0x34
c72c: ebfffccc bl ba64 <msdos_format_write_sec>
}
/*
* write FAT as all empty
* -> write all FAT sectors as zero
*/
if (ret_val == 0) {
c730: e2504000 subs r4, r0, #0
c734: 1a0000ad bne c9f0 <msdos_format+0xd9c>
ret_val = msdos_format_fill_sectors
c738: e59d2234 ldr r2, [sp, #564] ; 0x234
(rqdata,
c73c: e5dd3264 ldrb r3, [sp, #612] ; 0x264
/*
* write FAT as all empty
* -> write all FAT sectors as zero
*/
if (ret_val == 0) {
ret_val = msdos_format_fill_sectors
c740: e59dc244 ldr ip, [sp, #580] ; 0x244
c744: e58d2000 str r2, [sp]
c748: e3a02000 mov r2, #0
c74c: e58d2004 str r2, [sp, #4]
c750: e1a00005 mov r0, r5
c754: e1a01006 mov r1, r6
c758: e59d223c ldr r2, [sp, #572] ; 0x23c
c75c: e003039c mul r3, ip, r3
c760: ebfffcd5 bl babc <msdos_format_fill_sectors>
}
/*
* clear/init root directory
* -> write all directory sectors as 0x00
*/
if (ret_val == 0) {
c764: e2504000 subs r4, r0, #0
c768: 1a0000a0 bne c9f0 <msdos_format+0xd9c>
ret_val = msdos_format_fill_sectors
c76c: e59d3234 ldr r3, [sp, #564] ; 0x234
c770: e88d0018 stm sp, {r3, r4}
c774: e28d2f95 add r2, sp, #596 ; 0x254
c778: e1a00005 mov r0, r5
c77c: e1a01006 mov r1, r6
c780: e892000c ldm r2, {r2, r3}
c784: ebfffccc bl babc <msdos_format_fill_sectors>
0x00);
}
/*
* write volume label to first entry of directory
*/
if ((ret_val == 0) && fmt_params.VolLabel_present) {
c788: e2504000 subs r4, r0, #0
c78c: 1a000097 bne c9f0 <msdos_format+0xd9c>
c790: e5dd327c ldrb r3, [sp, #636] ; 0x27c
c794: e3530000 cmp r3, #0
c798: 0a000013 beq c7ec <msdos_format+0xb98>
memset(tmp_sec,0,sizeof(tmp_sec));
c79c: e1a01004 mov r1, r4
c7a0: e3a02c02 mov r2, #512 ; 0x200
c7a4: e28d0034 add r0, sp, #52 ; 0x34
c7a8: eb00330b bl 193dc <memset>
memcpy(MSDOS_DIR_NAME(tmp_sec),fmt_params.VolLabel,MSDOS_SHORT_NAME_LEN);
c7ac: e28d2e27 add r2, sp, #624 ; 0x270
c7b0: e8920007 ldm r2, {r0, r1, r2}
c7b4: e28d3034 add r3, sp, #52 ; 0x34
c7b8: e8a30003 stmia r3!, {r0, r1}
c7bc: e0c320b2 strh r2, [r3], #2
c7c0: e1a02822 lsr r2, r2, #16
c7c4: e5c32000 strb r2, [r3]
*MSDOS_DIR_ATTR(tmp_sec) = MSDOS_ATTR_VOLUME_ID;
c7c8: e3a03008 mov r3, #8
c7cc: e5cd303f strb r3, [sp, #63] ; 0x3f
ret_val = msdos_format_write_sec
c7d0: e1a00006 mov r0, r6
c7d4: e59d1254 ldr r1, [sp, #596] ; 0x254
c7d8: e59d2234 ldr r2, [sp, #564] ; 0x234
c7dc: e28d3034 add r3, sp, #52 ; 0x34
c7e0: ebfffc9f bl ba64 <msdos_format_write_sec>
/*
* write FAT entry 0 as (0xffffff00|Media_type)EOC,
* write FAT entry 1 as EOC
* allocate directory in a FAT32 FS
*/
if (ret_val == 0) {
c7e4: e250a000 subs sl, r0, #0
c7e8: 1a00004f bne c92c <msdos_format+0xcd8>
uint32_t start_sector;
/*
* empty sector: all clusters are free/do not link further on
*/
memset(tmp_sec,0,sizeof(tmp_sec));
c7ec: e28d0034 add r0, sp, #52 ; 0x34
c7f0: e3a01000 mov r1, #0
c7f4: e3a02c02 mov r2, #512 ; 0x200
c7f8: eb0032f7 bl 193dc <memset>
switch(fmt_params.fattype) {
c7fc: e5dd3266 ldrb r3, [sp, #614] ; 0x266
c800: e3530002 cmp r3, #2
c804: 0a00000a beq c834 <msdos_format+0xbe0>
c808: e3530004 cmp r3, #4
c80c: 0a000010 beq c854 <msdos_format+0xc00>
c810: e3530001 cmp r3, #1
c814: 1a00001b bne c888 <msdos_format+0xc34>
case FAT_FAT12:
/* LSBits of FAT entry 0: media_type */
FAT_SET_VAL8(tmp_sec,0,(fmt_params.media_code));
c818: e5dd3265 ldrb r3, [sp, #613] ; 0x265
c81c: e5cd3034 strb r3, [sp, #52] ; 0x34
/* MSBits of FAT entry 0:0xf, LSBits of FAT entry 1: LSB of EOC */
FAT_SET_VAL8(tmp_sec,1,(0x0f | (FAT_FAT12_EOC << 4)));
c820: e3e03070 mvn r3, #112 ; 0x70
c824: e5cd3035 strb r3, [sp, #53] ; 0x35
/* MSBits of FAT entry 1: MSBits of EOC */
FAT_SET_VAL8(tmp_sec,2,(FAT_FAT12_EOC >> 4));
c828: e3e03000 mvn r3, #0
c82c: e5cd3036 strb r3, [sp, #54] ; 0x36
break;
c830: ea000018 b c898 <msdos_format+0xc44>
case FAT_FAT16:
/* FAT entry 0: 0xff00|media_type */
FAT_SET_VAL8(tmp_sec,0,fmt_params.media_code);
c834: e5dd3265 ldrb r3, [sp, #613] ; 0x265
FAT_SET_VAL8(tmp_sec,1,0xff);
/* FAT entry 1: EOC */
FAT_SET_VAL16(tmp_sec,2,FAT_FAT16_EOC);
c838: e3e02007 mvn r2, #7
FAT_SET_VAL8(tmp_sec,2,(FAT_FAT12_EOC >> 4));
break;
case FAT_FAT16:
/* FAT entry 0: 0xff00|media_type */
FAT_SET_VAL8(tmp_sec,0,fmt_params.media_code);
c83c: e5cd3034 strb r3, [sp, #52] ; 0x34
FAT_SET_VAL8(tmp_sec,1,0xff);
c840: e3e03000 mvn r3, #0
c844: e5cd3035 strb r3, [sp, #53] ; 0x35
/* FAT entry 1: EOC */
FAT_SET_VAL16(tmp_sec,2,FAT_FAT16_EOC);
c848: e5cd2036 strb r2, [sp, #54] ; 0x36
c84c: e5cd3037 strb r3, [sp, #55] ; 0x37
break;
c850: ea000010 b c898 <msdos_format+0xc44>
case FAT_FAT32:
/* FAT entry 0: 0xffffff00|media_type */
FAT_SET_VAL32(tmp_sec,0,0xffffff00|fmt_params.media_code);
c854: e5dd3265 ldrb r3, [sp, #613] ; 0x265
c858: e5cd3034 strb r3, [sp, #52] ; 0x34
c85c: e3e03000 mvn r3, #0
c860: e5cd3035 strb r3, [sp, #53] ; 0x35
c864: e5cd3036 strb r3, [sp, #54] ; 0x36
c868: e5cd3037 strb r3, [sp, #55] ; 0x37
/* FAT entry 1: EOC */
FAT_SET_VAL32(tmp_sec,4,FAT_FAT32_EOC);
c86c: e3e02007 mvn r2, #7
c870: e5cd3039 strb r3, [sp, #57] ; 0x39
c874: e5cd303a strb r3, [sp, #58] ; 0x3a
c878: e3a0300f mov r3, #15
c87c: e5cd2038 strb r2, [sp, #56] ; 0x38
c880: e5cd303b strb r3, [sp, #59] ; 0x3b
break;
c884: ea000003 b c898 <msdos_format+0xc44>
default:
ret_val = -1;
errno = EINVAL;
c888: eb002ff6 bl 18868 <__errno> <== NOT EXECUTED
c88c: e3a03016 mov r3, #22 <== NOT EXECUTED
c890: e5803000 str r3, [r0] <== NOT EXECUTED
/* FAT entry 1: EOC */
FAT_SET_VAL32(tmp_sec,4,FAT_FAT32_EOC);
break;
default:
ret_val = -1;
c894: e3e04000 mvn r4, #0 <== NOT EXECUTED
errno = EINVAL;
}
if (fmt_params.fattype == FAT_FAT32) {
c898: e5dd3266 ldrb r3, [sp, #614] ; 0x266
c89c: e3530004 cmp r3, #4
c8a0: 1a000006 bne c8c0 <msdos_format+0xc6c>
/*
* only first valid cluster (cluster number 2) belongs
* to root directory, and is end of chain
* mark this in every copy of the FAT
*/
FAT_SET_VAL32(tmp_sec,8,FAT_FAT32_EOC);
c8a4: e3e03007 mvn r3, #7
c8a8: e5cd303c strb r3, [sp, #60] ; 0x3c
c8ac: e3e03000 mvn r3, #0
c8b0: e5cd303d strb r3, [sp, #61] ; 0x3d
c8b4: e5cd303e strb r3, [sp, #62] ; 0x3e
c8b8: e3a0300f mov r3, #15
c8bc: e5cd303f strb r3, [sp, #63] ; 0x3f
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
c8c0: e5dd2284 ldrb r2, [sp, #644] ; 0x284
* mark this in every copy of the FAT
*/
FAT_SET_VAL32(tmp_sec,8,FAT_FAT32_EOC);
}
start_sector = loc_align_object (fmt_params.rsvd_sector_cnt,
c8c4: e59d723c ldr r7, [sp, #572] ; 0x23c
c8c8: e59d3240 ldr r3, [sp, #576] ; 0x240
static uint32_t
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
c8cc: e3520000 cmp r2, #0
return (sectors + clustersize - 1) & ~(clustersize - 1);
c8d0: 00877003 addeq r7, r7, r3
}
start_sector = loc_align_object (fmt_params.rsvd_sector_cnt,
fmt_params.sectors_per_cluster,
fmt_params.skip_alignment);
for (i = 0;
c8d4: e1a0a004 mov sl, r4
loc_align_object (const uint32_t sectors,
const uint32_t clustersize,
const bool skip_alignment)
{
if (! skip_alignment)
return (sectors + clustersize - 1) & ~(clustersize - 1);
c8d8: 02477001 subeq r7, r7, #1
c8dc: 02633000 rsbeq r3, r3, #0
c8e0: 00077003 andeq r7, r7, r3
}
start_sector = loc_align_object (fmt_params.rsvd_sector_cnt,
fmt_params.sectors_per_cluster,
fmt_params.skip_alignment);
for (i = 0;
c8e4: e3a04000 mov r4, #0
c8e8: e1a0000a mov r0, sl
c8ec: ea000006 b c90c <msdos_format+0xcb8>
(i < fmt_params.fat_num) && (ret_val == 0);
i++) {
ret_val = msdos_format_write_sec
c8f0: e59d1244 ldr r1, [sp, #580] ; 0x244
c8f4: e1a00006 mov r0, r6
c8f8: e0217194 mla r1, r4, r1, r7
c8fc: e59d2234 ldr r2, [sp, #564] ; 0x234
c900: e28d3034 add r3, sp, #52 ; 0x34
c904: ebfffc56 bl ba64 <msdos_format_write_sec>
start_sector = loc_align_object (fmt_params.rsvd_sector_cnt,
fmt_params.sectors_per_cluster,
fmt_params.skip_alignment);
for (i = 0;
(i < fmt_params.fat_num) && (ret_val == 0);
i++) {
c908: e2844001 add r4, r4, #1
start_sector = loc_align_object (fmt_params.rsvd_sector_cnt,
fmt_params.sectors_per_cluster,
fmt_params.skip_alignment);
for (i = 0;
(i < fmt_params.fat_num) && (ret_val == 0);
c90c: e5dd2264 ldrb r2, [sp, #612] ; 0x264
}
start_sector = loc_align_object (fmt_params.rsvd_sector_cnt,
fmt_params.sectors_per_cluster,
fmt_params.skip_alignment);
for (i = 0;
c910: e2703001 rsbs r3, r0, #1
c914: 33a03000 movcc r3, #0
c918: e1540002 cmp r4, r2
c91c: a3a03000 movge r3, #0
c920: e3530000 cmp r3, #0
c924: 1afffff1 bne c8f0 <msdos_format+0xc9c>
c928: e1a0a000 mov sl, r0
fmt_params.bytes_per_sector,
tmp_sec);
}
}
if (ret_val == 0 && rqdata != NULL && rqdata->sync_device) {
c92c: e35a0000 cmp sl, #0
c930: 13a08000 movne r8, #0
c934: 02088001 andeq r8, r8, #1
c938: e3580000 cmp r8, #0
c93c: 0a000006 beq c95c <msdos_format+0xd08>
c940: e5d5a017 ldrb sl, [r5, #23]
c944: e35a0000 cmp sl, #0
c948: 0a000003 beq c95c <msdos_format+0xd08>
return ioctl(fd, RTEMS_BLKIO_GETDISKDEV, dd_ptr);
}
static inline int rtems_disk_fd_sync(int fd)
{
return ioctl(fd, RTEMS_BLKIO_SYNCDEV);
c94c: e1a00006 mov r0, r6
c950: e59f1100 ldr r1, [pc, #256] ; ca58 <msdos_format+0xe04>
c954: eb001728 bl 125fc <ioctl>
c958: e1a0a000 mov sl, r0
/*
* cleanup:
* sync and unlock disk
* free any data structures (not needed now)
*/
if (fd != -1) {
c95c: e3760001 cmn r6, #1
close(fd);
c960: 11a00006 movne r0, r6
c964: 1bffdd0a blne 3d94 <close>
}
return ret_val;
}
c968: e1a0000a mov r0, sl
c96c: e28ddfb7 add sp, sp, #732 ; 0x2dc
c970: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
uint64_t total_size = 0;
uint32_t data_clusters_cnt;
uint8_t iteration_cnt = 0;
uint8_t fat_type = UINT8_MAX;
memset(fmt_params,0,sizeof(*fmt_params));
c974: e1a01004 mov r1, r4
c978: e3a02054 mov r2, #84 ; 0x54
c97c: e28d0f8d add r0, sp, #564 ; 0x234
c980: eb003295 bl 193dc <memset>
static inline int rtems_disk_fd_get_media_block_size(
int fd,
uint32_t *media_block_size
)
{
return ioctl(fd, RTEMS_BLKIO_GETMEDIABLKSIZE, media_block_size);
c984: e1a00006 mov r0, r6
c988: e59f10cc ldr r1, [pc, #204] ; ca5c <msdos_format+0xe08>
c98c: e28d2f8d add r2, sp, #564 ; 0x234
c990: eb001719 bl 125fc <ioctl>
* At least one thing we don't have to magically guess...
*/
if (ret_val == 0) {
ret_val = rtems_disk_fd_get_media_block_size(fd, &fmt_params->bytes_per_sector);
}
if (ret_val == 0) {
c994: e2504000 subs r4, r0, #0
c998: 1afffe11 bne c1e4 <msdos_format+0x590>
c99c: eafffcd7 b bd00 <msdos_format+0xac>
if (ret_val == 0) {
const char *from;
char *to = fmt_params->VolLabel;
int cnt;
from = ""; /* default: make "from" point to empty string */
if ((rqdata != NULL) &&
c9a0: e3550000 cmp r5, #0
c9a4: 1afffe6b bne c358 <msdos_format+0x704>
c9a8: eafffe6f b c36c <msdos_format+0x718>
{
int ret_val = 0;
int rc;
struct timeval time_value;
rc = rtems_clock_get_tod_timeval(&time_value);
c9ac: e28d0e2d add r0, sp, #720 ; 0x2d0
c9b0: eb001ac6 bl 134d0 <rtems_clock_get_tod_timeval>
if (rc == RTEMS_SUCCESSFUL) {
c9b4: e3500000 cmp r0, #0
*volid_ptr = time_value.tv_sec + time_value.tv_sec;
c9b8: 059d32d0 ldreq r3, [sp, #720] ; 0x2d0
c9bc: 01a03083 lsleq r3, r3, #1
c9c0: 058d3280 streq r3, [sp, #640] ; 0x280
int ret_val = 0;
int rc;
struct timeval time_value;
rc = rtems_clock_get_tod_timeval(&time_value);
if (rc == RTEMS_SUCCESSFUL) {
c9c4: 0afffe80 beq c3cc <msdos_format+0x778>
c9c8: eafffe7d b c3c4 <msdos_format+0x770>
ret_val = msdos_format_read_sec(fd,
0,
fmt_params.bytes_per_sector,
tmp_sec);
if (ret_val == 0) {
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
c9cc: e1a00005 mov r0, r5
c9d0: e3a01002 mov r1, #2
c9d4: e59f2084 ldr r2, [pc, #132] ; ca60 <msdos_format+0xe0c>
c9d8: ebfffc0c bl ba10 <msdos_format_printf>
{
uint32_t total_sectors_num16 = 0;
uint32_t total_sectors_num32 = 0;
/* store total sector count in either 16 or 32 bit field in mbr */
if (fmt_params->totl_sector_cnt < 0x10000) {
c9dc: e59d4238 ldr r4, [sp, #568] ; 0x238
c9e0: e3540801 cmp r4, #65536 ; 0x10000
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
uint32_t total_sectors_num16 = 0;
uint32_t total_sectors_num32 = 0;
c9e4: 33a07000 movcc r7, #0
/* store total sector count in either 16 or 32 bit field in mbr */
if (fmt_params->totl_sector_cnt < 0x10000) {
c9e8: 3afffea3 bcc c47c <msdos_format+0x828>
c9ec: eafffea0 b c474 <msdos_format+0x820>
}
start_sector = loc_align_object (fmt_params.rsvd_sector_cnt,
fmt_params.sectors_per_cluster,
fmt_params.skip_alignment);
for (i = 0;
c9f0: e1a0a004 mov sl, r4
c9f4: eaffffcc b c92c <msdos_format+0xcd8>
0000babc <msdos_format_fill_sectors>:
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
babc: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
bac0: e1a06000 mov r6, r0
/*
* allocate and fill buffer
*/
if (ret_val == 0) {
fill_buffer = malloc(sector_size);
bac4: e59d0028 ldr r0, [sp, #40] ; 0x28
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
bac8: e58d1000 str r1, [sp]
bacc: e1a05002 mov r5, r2
bad0: e1a08003 mov r8, r3
bad4: e5dd402c ldrb r4, [sp, #44] ; 0x2c
/*
* allocate and fill buffer
*/
if (ret_val == 0) {
fill_buffer = malloc(sector_size);
bad8: ebffe284 bl 44f0 <malloc>
if (fill_buffer == NULL) {
badc: e250b000 subs fp, r0, #0
bae0: 1a000004 bne baf8 <msdos_format_fill_sectors+0x3c>
errno = ENOMEM;
bae4: eb00335f bl 18868 <__errno> <== NOT EXECUTED
bae8: e3a0300c mov r3, #12 <== NOT EXECUTED
baec: e5803000 str r3, [r0] <== NOT EXECUTED
ret_val = -1;
baf0: e3e04000 mvn r4, #0 <== NOT EXECUTED
baf4: ea000003 b bb08 <msdos_format_fill_sectors+0x4c> <== NOT EXECUTED
}
else {
memset(fill_buffer,fill_byte,sector_size);
baf8: e1a01004 mov r1, r4
bafc: e59d2028 ldr r2, [sp, #40] ; 0x28
bb00: eb003635 bl 193dc <memset>
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
int ret_val = 0;
bb04: e3a04000 mov r4, #0
else {
memset(fill_buffer,fill_byte,sector_size);
}
}
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
bb08: e1a00006 mov r0, r6
bb0c: e3a01002 mov r1, #2
bb10: e59f20bc ldr r2, [pc, #188] ; bbd4 <msdos_format_fill_sectors+0x118>
bb14: e3a07064 mov r7, #100 ; 0x64
bb18: ebffffbc bl ba10 <msdos_format_printf>
bb1c: e0070798 mul r7, r8, r7
"Filling : ");
/*
* write to consecutive sectors
*/
while ((ret_val == 0) &&
bb20: e1a0a008 mov sl, r8
\*=========================================================================*/
{
int ret_val = 0;
char *fill_buffer = NULL;
uint32_t total_sectors = sector_cnt;
int last_percent = -1;
bb24: e3e09000 mvn r9, #0
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
"Filling : ");
/*
* write to consecutive sectors
*/
while ((ret_val == 0) &&
bb28: ea000014 b bb80 <msdos_format_fill_sectors+0xc4>
(sector_cnt > 0)) {
int percent = (sector_cnt * 100) / total_sectors;
bb2c: e1a00007 mov r0, r7
bb30: e1a01008 mov r1, r8
bb34: ebffd849 bl 1c60 <__aeabi_uidiv>
if (percent != last_percent) {
bb38: e1500009 cmp r0, r9
/*
* write to consecutive sectors
*/
while ((ret_val == 0) &&
(sector_cnt > 0)) {
int percent = (sector_cnt * 100) / total_sectors;
bb3c: e1a04000 mov r4, r0
if (percent != last_percent) {
bb40: 0a000005 beq bb5c <msdos_format_fill_sectors+0xa0>
if ((percent & 1) == 0)
bb44: e3100001 tst r0, #1
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL, ".");
bb48: 01a00006 moveq r0, r6
bb4c: 03a01002 moveq r1, #2
bb50: 059f2080 ldreq r2, [pc, #128] ; bbd8 <msdos_format_fill_sectors+0x11c>
bb54: 0bffffad bleq ba10 <msdos_format_printf>
*/
while ((ret_val == 0) &&
(sector_cnt > 0)) {
int percent = (sector_cnt * 100) / total_sectors;
if (percent != last_percent) {
if ((percent & 1) == 0)
bb58: e1a09004 mov r9, r4
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL, ".");
last_percent = percent;
}
ret_val = msdos_format_write_sec(fd,start_sector,sector_size,fill_buffer);
bb5c: e1a01005 mov r1, r5
bb60: e59d0000 ldr r0, [sp]
bb64: e59d2028 ldr r2, [sp, #40] ; 0x28
bb68: e1a0300b mov r3, fp
bb6c: ebffffbc bl ba64 <msdos_format_write_sec>
start_sector++;
bb70: e2855001 add r5, r5, #1
if (percent != last_percent) {
if ((percent & 1) == 0)
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL, ".");
last_percent = percent;
}
ret_val = msdos_format_write_sec(fd,start_sector,sector_size,fill_buffer);
bb74: e1a04000 mov r4, r0
start_sector++;
sector_cnt--;
bb78: e24aa001 sub sl, sl, #1
bb7c: e2477064 sub r7, r7, #100 ; 0x64
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL,
"Filling : ");
/*
* write to consecutive sectors
*/
while ((ret_val == 0) &&
bb80: e29a3000 adds r3, sl, #0
bb84: 13a03001 movne r3, #1
bb88: e3540000 cmp r4, #0
bb8c: 13a03000 movne r3, #0
bb90: e3530000 cmp r3, #0
bb94: 1affffe4 bne bb2c <msdos_format_fill_sectors+0x70>
ret_val = msdos_format_write_sec(fd,start_sector,sector_size,fill_buffer);
start_sector++;
sector_cnt--;
}
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_DETAIL, "\n");
bb98: e1a00006 mov r0, r6
bb9c: e3a01002 mov r1, #2
bba0: e59f2034 ldr r2, [pc, #52] ; bbdc <msdos_format_fill_sectors+0x120>
bba4: ebffff99 bl ba10 <msdos_format_printf>
if (ret_val)
bba8: e3540000 cmp r4, #0
msdos_format_printf (rqdata, MSDOS_FMT_INFO_LEVEL_INFO,
bbac: 11a00006 movne r0, r6
bbb0: 13a01001 movne r1, #1
bbb4: 159f2024 ldrne r2, [pc, #36] ; bbe0 <msdos_format_fill_sectors+0x124>
bbb8: 11a03005 movne r3, r5
bbbc: 1bffff93 blne ba10 <msdos_format_printf>
"filling error on sector: %d\n", start_sector);
/*
* cleanup
*/
if (fill_buffer != NULL) {
bbc0: e35b0000 cmp fp, #0
free(fill_buffer);
bbc4: 11a0000b movne r0, fp
bbc8: 1bffe113 blne 401c <free>
fill_buffer = NULL;
}
return ret_val;
}
bbcc: e1a00004 mov r0, r4
bbd0: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000ba10 <msdos_format_printf>:
*/
static void
msdos_format_printf (const msdos_format_request_param_t *rqdata,
int info_level,
const char *format, ...)
{
ba10: e92d000c push {r2, r3}
ba14: e92d4011 push {r0, r4, lr}
va_list args;
va_start (args, format);
if (rqdata != NULL && rqdata->info_level >= info_level)
ba18: e3500000 cmp r0, #0
msdos_format_printf (const msdos_format_request_param_t *rqdata,
int info_level,
const char *format, ...)
{
va_list args;
va_start (args, format);
ba1c: e28d2010 add r2, sp, #16
ba20: e58d2000 str r2, [sp]
if (rqdata != NULL && rqdata->info_level >= info_level)
ba24: 0a00000a beq ba54 <msdos_format_printf+0x44>
ba28: e5903018 ldr r3, [r0, #24]
ba2c: e1530001 cmp r3, r1
ba30: ba000007 blt ba54 <msdos_format_printf+0x44>
{
vfprintf (stdout, format, args);
ba34: e59f4024 ldr r4, [pc, #36] ; ba60 <msdos_format_printf+0x50><== NOT EXECUTED
ba38: e5943000 ldr r3, [r4] <== NOT EXECUTED
ba3c: e59d100c ldr r1, [sp, #12] <== NOT EXECUTED
ba40: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
ba44: eb0056e3 bl 215d8 <vfprintf> <== NOT EXECUTED
fflush (stdout);
ba48: e5943000 ldr r3, [r4] <== NOT EXECUTED
ba4c: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
ba50: eb003481 bl 18c5c <fflush> <== NOT EXECUTED
}
va_end (args);
}
ba54: e8bd4018 pop {r3, r4, lr}
ba58: e28dd008 add sp, sp, #8
ba5c: e12fff1e bx lr
0000ba64 <msdos_format_write_sec>:
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
ba64: e92d41f0 push {r4, r5, r6, r7, r8, lr}
int ret_val = 0;
if (0 > lseek(fd,((off_t)start_sector)*sector_size,SEEK_SET)) {
ba68: e0887291 umull r7, r8, r1, r2
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
ba6c: e1a04002 mov r4, r2
ba70: e1a05003 mov r5, r3
int ret_val = 0;
if (0 > lseek(fd,((off_t)start_sector)*sector_size,SEEK_SET)) {
ba74: e1a02008 mov r2, r8
ba78: e1a01007 mov r1, r7
ba7c: e3a03000 mov r3, #0
)
/*-------------------------------------------------------------------------*\
| Return Value: |
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
ba80: e1a06000 mov r6, r0
int ret_val = 0;
if (0 > lseek(fd,((off_t)start_sector)*sector_size,SEEK_SET)) {
ba84: eb001afa bl 12674 <lseek>
ba88: e3500000 cmp r0, #0
ba8c: e2d18000 sbcs r8, r1, #0
ba90: ba000007 blt bab4 <msdos_format_write_sec+0x50>
ret_val = -1;
}
if (ret_val == 0) {
if (0 > write(fd,buffer,sector_size)) {
ba94: e1a00006 mov r0, r6
ba98: e1a01005 mov r1, r5
ba9c: e1a02004 mov r2, r4
baa0: ebffefc3 bl 79b4 <write>
baa4: e3500000 cmp r0, #0
baa8: b3e00000 mvnlt r0, #0
baac: a3a00000 movge r0, #0
bab0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
int ret_val = 0;
if (0 > lseek(fd,((off_t)start_sector)*sector_size,SEEK_SET)) {
bab4: e3e00000 mvn r0, #0 <== NOT EXECUTED
ret_val = -1;
}
}
return ret_val;
}
bab8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
00016494 <msdos_get_dotdot_dir_info_cluster_num_and_offset>:
rtems_filesystem_mount_table_entry_t *mt_entry,
uint32_t cln,
fat_dir_pos_t *dir_pos,
char *dir_entry
)
{
16494: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
int rc = RC_OK;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
16498: e5905008 ldr r5, [r0, #8]
rtems_filesystem_mount_table_entry_t *mt_entry,
uint32_t cln,
fat_dir_pos_t *dir_pos,
char *dir_entry
)
{
1649c: e24dd058 sub sp, sp, #88 ; 0x58
164a0: e1a06002 mov r6, r2
164a4: e58d3010 str r3, [sp, #16]
int rc = RC_OK;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
fat_file_fd_t *fat_fd = NULL;
164a8: e28d2058 add r2, sp, #88 ; 0x58
164ac: e3a03000 mov r3, #0
rtems_filesystem_mount_table_entry_t *mt_entry,
uint32_t cln,
fat_dir_pos_t *dir_pos,
char *dir_entry
)
{
164b0: e1a09000 mov r9, r0
164b4: e1a07001 mov r7, r1
int rc = RC_OK;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
fat_file_fd_t *fat_fd = NULL;
164b8: e5223004 str r3, [r2, #-4]!
uint32_t cl4find = 0;
/*
* open fat-file corresponded to ".."
*/
rc = fat_file_open(&fs_info->fat, dir_pos, &fat_fd);
164bc: e1a00005 mov r0, r5
164c0: e1a01006 mov r1, r6
164c4: ebffe70f bl 10108 <fat_file_open>
if (rc != RC_OK)
164c8: e2504000 subs r4, r0, #0
164cc: 1a00006d bne 16688 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1f4>
return rc;
fat_fd->cln = cln;
164d0: e59d1054 ldr r1, [sp, #84] ; 0x54
fat_fd->fat_file_type = FAT_DIRECTORY;
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
164d4: e3a03602 mov r3, #2097152 ; 0x200000
rc = fat_file_open(&fs_info->fat, dir_pos, &fat_fd);
if (rc != RC_OK)
return rc;
fat_fd->cln = cln;
fat_fd->fat_file_type = FAT_DIRECTORY;
164d8: e5814010 str r4, [r1, #16]
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
fat_fd->map.file_cln = 0;
164dc: e5814034 str r4, [r1, #52] ; 0x34
*/
rc = fat_file_open(&fs_info->fat, dir_pos, &fat_fd);
if (rc != RC_OK)
return rc;
fat_fd->cln = cln;
164e0: e581701c str r7, [r1, #28]
fat_fd->fat_file_type = FAT_DIRECTORY;
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
164e4: e5813014 str r3, [r1, #20]
fat_fd->map.file_cln = 0;
fat_fd->map.disk_cln = fat_fd->cln;
164e8: e5817038 str r7, [r1, #56] ; 0x38
rc = fat_file_size(&fs_info->fat, fat_fd);
164ec: e1a00005 mov r0, r5
164f0: ebffe978 bl 10ad8 <fat_file_size>
if (rc != RC_OK)
164f4: e2504000 subs r4, r0, #0
164f8: 1a000050 bne 16640 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1ac>
fat_file_close(&fs_info->fat, fat_fd);
return rc;
}
/* find "." node in opened directory */
memset(dot_node, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
164fc: e28d7014 add r7, sp, #20
16500: e1a01004 mov r1, r4
16504: e3a02020 mov r2, #32
16508: e1a00007 mov r0, r7
1650c: eb000bb2 bl 193dc <memset>
msdos_long_to_short(".", 1, dot_node, MSDOS_SHORT_NAME_LEN);
16510: e3a01001 mov r1, #1
16514: e1a02007 mov r2, r7
16518: e3a0300b mov r3, #11
1651c: e59f0170 ldr r0, [pc, #368] ; 16694 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x200>
16520: ebfffbe4 bl 154b8 <msdos_long_to_short>
rc = msdos_find_name_in_fat_file(mt_entry, fat_fd, false, ".", 1,
16524: e3a0a001 mov sl, #1
16528: e1a02004 mov r2, r4
1652c: e1a00009 mov r0, r9
16530: e59d1054 ldr r1, [sp, #84] ; 0x54
16534: e59f3158 ldr r3, [pc, #344] ; 16694 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x200>
16538: e58da000 str sl, [sp]
1653c: e58da004 str sl, [sp, #4]
16540: e58d6008 str r6, [sp, #8]
16544: e58d700c str r7, [sp, #12]
16548: ebfffd4e bl 15a88 <msdos_find_name_in_fat_file>
MSDOS_NAME_SHORT, dir_pos, dot_node);
if (rc != RC_OK)
1654c: e2504000 subs r4, r0, #0
16550: 1a00003a bne 16640 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1ac>
fat_file_close(&fs_info->fat, fat_fd);
return rc;
}
/* find ".." node in opened directory */
memset(dotdot_node, 0, MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE);
16554: e28d8034 add r8, sp, #52 ; 0x34
16558: e1a01004 mov r1, r4
1655c: e3a02020 mov r2, #32
16560: e1a00008 mov r0, r8
16564: eb000b9c bl 193dc <memset>
msdos_long_to_short("..", 2, dotdot_node, MSDOS_SHORT_NAME_LEN);
16568: e3a01002 mov r1, #2
1656c: e1a02008 mov r2, r8
16570: e3a0300b mov r3, #11
16574: e59f011c ldr r0, [pc, #284] ; 16698 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x204>
16578: ebfffbce bl 154b8 <msdos_long_to_short>
rc = msdos_find_name_in_fat_file(mt_entry, fat_fd, false, "..", 2,
1657c: e3a03002 mov r3, #2
16580: e88d0408 stm sp, {r3, sl}
16584: e1a02004 mov r2, r4
16588: e1a00009 mov r0, r9
1658c: e59d1054 ldr r1, [sp, #84] ; 0x54
16590: e59f3100 ldr r3, [pc, #256] ; 16698 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x204>
16594: e58d6008 str r6, [sp, #8]
16598: e58d800c str r8, [sp, #12]
1659c: ebfffd39 bl 15a88 <msdos_find_name_in_fat_file>
MSDOS_NAME_SHORT, dir_pos,
dotdot_node);
if (rc != RC_OK)
165a0: e2504000 subs r4, r0, #0
165a4: 1a000025 bne 16640 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1ac>
}
cl4find = MSDOS_EXTRACT_CLUSTER_NUM(dot_node);
/* close fat-file corresponded to ".." directory */
rc = fat_file_close(&fs_info->fat, fat_fd);
165a8: e1a00005 mov r0, r5
165ac: e59d1054 ldr r1, [sp, #84] ; 0x54
{
fat_file_close(&fs_info->fat, fat_fd);
return rc;
}
cl4find = MSDOS_EXTRACT_CLUSTER_NUM(dot_node);
165b0: e1d7b1ba ldrh fp, [r7, #26]
165b4: e1d771b4 ldrh r7, [r7, #20]
/* close fat-file corresponded to ".." directory */
rc = fat_file_close(&fs_info->fat, fat_fd);
165b8: ebffe7cc bl 104f0 <fat_file_close>
if ( rc != RC_OK )
165bc: e2504000 subs r4, r0, #0
165c0: 1a000030 bne 16688 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1f4>
return rc;
if ( (MSDOS_EXTRACT_CLUSTER_NUM(dotdot_node)) == 0)
165c4: e1d821b4 ldrh r2, [r8, #20]
165c8: e1d831ba ldrh r3, [r8, #26]
165cc: e1933802 orrs r3, r3, r2, lsl #16
fat_dir_pos_init(
fat_dir_pos_t *dir_pos
)
{
dir_pos->sname.cln = 0;
dir_pos->sname.ofs = 0;
165d0: 05863004 streq r3, [r6, #4]
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
165d4: 03e03000 mvneq r3, #0
165d8: 05863008 streq r3, [r6, #8]
dir_pos->lname.ofs = FAT_FILE_SHORT_NAME;
165dc: 0586300c streq r3, [r6, #12]
/*
* we handle root dir for all FAT types in the same way with the
* ordinary directories ( through fat_file_* calls )
*/
fat_dir_pos_init(dir_pos);
dir_pos->sname.cln = FAT_ROOTDIR_CLUSTER_NUM;
165e0: 0586a000 streq sl, [r6]
}
/* open fat-file corresponded to second ".." */
rc = fat_file_open(&fs_info->fat, dir_pos, &fat_fd);
165e4: e1a00005 mov r0, r5
165e8: e1a01006 mov r1, r6
165ec: e28d2054 add r2, sp, #84 ; 0x54
165f0: ebffe6c4 bl 10108 <fat_file_open>
if (rc != RC_OK)
165f4: e2504000 subs r4, r0, #0
165f8: 1a000022 bne 16688 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1f4>
return rc;
if ((MSDOS_EXTRACT_CLUSTER_NUM(dotdot_node)) == 0)
165fc: e1dd24b8 ldrh r2, [sp, #72] ; 0x48
16600: e1dd34be ldrh r3, [sp, #78] ; 0x4e
16604: e1933802 orrs r3, r3, r2, lsl #16
fat_fd->cln = fs_info->fat.vol.rdir_cl;
16608: 0595303c ldreq r3, [r5, #60] ; 0x3c
1660c: e59d1054 ldr r1, [sp, #84] ; 0x54
else
fat_fd->cln = MSDOS_EXTRACT_CLUSTER_NUM(dotdot_node);
16610: e581301c str r3, [r1, #28]
fat_fd->fat_file_type = FAT_DIRECTORY;
16614: e3a03000 mov r3, #0
16618: e5813010 str r3, [r1, #16]
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
fat_fd->map.file_cln = 0;
1661c: e5813034 str r3, [r1, #52] ; 0x34
fat_fd->map.disk_cln = fat_fd->cln;
16620: e591301c ldr r3, [r1, #28]
fat_fd->cln = fs_info->fat.vol.rdir_cl;
else
fat_fd->cln = MSDOS_EXTRACT_CLUSTER_NUM(dotdot_node);
fat_fd->fat_file_type = FAT_DIRECTORY;
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
16624: e3a02602 mov r2, #2097152 ; 0x200000
16628: e5812014 str r2, [r1, #20]
fat_fd->map.file_cln = 0;
fat_fd->map.disk_cln = fat_fd->cln;
1662c: e5813038 str r3, [r1, #56] ; 0x38
rc = fat_file_size(&fs_info->fat, fat_fd);
16630: e1a00005 mov r0, r5
16634: ebffe927 bl 10ad8 <fat_file_size>
if (rc != RC_OK)
16638: e2504000 subs r4, r0, #0
1663c: 0a000002 beq 1664c <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1b8>
{
fat_file_close(&fs_info->fat, fat_fd);
16640: e1a00005 mov r0, r5 <== NOT EXECUTED
16644: e59d1054 ldr r1, [sp, #84] ; 0x54 <== NOT EXECUTED
16648: ea00000a b 16678 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1e4><== NOT EXECUTED
return rc;
}
/* in this directory find slot with specified cluster num */
rc = msdos_find_node_by_cluster_num_in_fat_file(mt_entry, fat_fd, cl4find,
1664c: e59d3010 ldr r3, [sp, #16]
16650: e59d1054 ldr r1, [sp, #84] ; 0x54
16654: e58d3000 str r3, [sp]
16658: e1a00009 mov r0, r9
1665c: e18b2807 orr r2, fp, r7, lsl #16
16660: e1a03006 mov r3, r6
16664: ebffff36 bl 16344 <msdos_find_node_by_cluster_num_in_fat_file>
dir_pos, dir_entry);
if (rc != RC_OK)
16668: e2504000 subs r4, r0, #0
{
fat_file_close(&fs_info->fat, fat_fd);
1666c: e59d1054 ldr r1, [sp, #84] ; 0x54
16670: e1a00005 mov r0, r5
}
/* in this directory find slot with specified cluster num */
rc = msdos_find_node_by_cluster_num_in_fat_file(mt_entry, fat_fd, cl4find,
dir_pos, dir_entry);
if (rc != RC_OK)
16674: 0a000001 beq 16680 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1ec>
{
fat_file_close(&fs_info->fat, fat_fd);
16678: ebffe79c bl 104f0 <fat_file_close> <== NOT EXECUTED
return rc;
1667c: ea000001 b 16688 <msdos_get_dotdot_dir_info_cluster_num_and_offset+0x1f4><== NOT EXECUTED
}
rc = fat_file_close(&fs_info->fat, fat_fd);
16680: ebffe79a bl 104f0 <fat_file_close>
16684: e1a04000 mov r4, r0
return rc;
}
16688: e1a00004 mov r0, r4
1668c: e28dd058 add sp, sp, #88 ; 0x58
16690: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000cad8 <msdos_initialize_support>:
rtems_filesystem_mount_table_entry_t *temp_mt_entry,
const rtems_filesystem_operations_table *op_table,
const rtems_filesystem_file_handlers_r *file_handlers,
const rtems_filesystem_file_handlers_r *directory_handlers
)
{
cad8: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
cadc: e1a06000 mov r6, r0
cae0: e24dd018 sub sp, sp, #24
cae4: e1a08001 mov r8, r1
cae8: e1a07003 mov r7, r3
msdos_fs_info_t *fs_info = NULL;
fat_file_fd_t *fat_fd = NULL;
fat_dir_pos_t root_pos;
uint32_t cl_buf_size;
fs_info = (msdos_fs_info_t *)calloc(1, sizeof(msdos_fs_info_t));
caec: e3a00001 mov r0, #1
)
{
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = NULL;
fat_file_fd_t *fat_fd = NULL;
caf0: e3a03000 mov r3, #0
fat_dir_pos_t root_pos;
uint32_t cl_buf_size;
fs_info = (msdos_fs_info_t *)calloc(1, sizeof(msdos_fs_info_t));
caf4: e3a010a4 mov r1, #164 ; 0xa4
rtems_filesystem_mount_table_entry_t *temp_mt_entry,
const rtems_filesystem_operations_table *op_table,
const rtems_filesystem_file_handlers_r *file_handlers,
const rtems_filesystem_file_handlers_r *directory_handlers
)
{
caf8: e1a0a002 mov sl, r2
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = NULL;
fat_file_fd_t *fat_fd = NULL;
cafc: e58d3014 str r3, [sp, #20]
fat_dir_pos_t root_pos;
uint32_t cl_buf_size;
fs_info = (msdos_fs_info_t *)calloc(1, sizeof(msdos_fs_info_t));
cb00: ebffdc91 bl 3d4c <calloc>
if (!fs_info)
cb04: e2504000 subs r4, r0, #0
cb08: 0a000041 beq cc14 <msdos_initialize_support+0x13c>
rtems_set_errno_and_return_minus_one(ENOMEM);
temp_mt_entry->fs_info = fs_info;
cb0c: e5864008 str r4, [r6, #8]
rc = fat_init_volume_info(&fs_info->fat, temp_mt_entry->dev);
cb10: e5961038 ldr r1, [r6, #56] ; 0x38
cb14: eb001183 bl 11128 <fat_init_volume_info>
if (rc != RC_OK)
cb18: e2505000 subs r5, r0, #0
cb1c: 1a00000f bne cb60 <msdos_initialize_support+0x88>
fat_dir_pos_t *dir_pos
)
{
dir_pos->sname.cln = 0;
dir_pos->sname.ofs = 0;
dir_pos->lname.cln = FAT_FILE_SHORT_NAME;
cb20: e3e03000 mvn r3, #0
cb24: e58d300c str r3, [sp, #12]
dir_pos->lname.ofs = FAT_FILE_SHORT_NAME;
cb28: e58d3010 str r3, [sp, #16]
/*
* open fat-file which correspondes to root directory
* (so inode number 0x00000010 is always used for root directory)
*/
fat_dir_pos_init(&root_pos);
root_pos.sname.cln = FAT_ROOTDIR_CLUSTER_NUM;
cb2c: e28d1018 add r1, sp, #24
cb30: e3a03001 mov r3, #1
{
free(fs_info);
return rc;
}
fs_info->file_handlers = file_handlers;
cb34: e584a098 str sl, [r4, #152] ; 0x98
fs_info->directory_handlers = directory_handlers;
cb38: e5847094 str r7, [r4, #148] ; 0x94
/*
* open fat-file which correspondes to root directory
* (so inode number 0x00000010 is always used for root directory)
*/
fat_dir_pos_init(&root_pos);
root_pos.sname.cln = FAT_ROOTDIR_CLUSTER_NUM;
cb3c: e5213014 str r3, [r1, #-20]!
rc = fat_file_open(&fs_info->fat, &root_pos, &fat_fd);
cb40: e1a00004 mov r0, r4
cb44: e28d2014 add r2, sp, #20
fat_dir_pos_init(
fat_dir_pos_t *dir_pos
)
{
dir_pos->sname.cln = 0;
dir_pos->sname.ofs = 0;
cb48: e58d5008 str r5, [sp, #8]
cb4c: eb000d6d bl 10108 <fat_file_open>
if (rc != RC_OK)
cb50: e2505000 subs r5, r0, #0
cb54: 0a000004 beq cb6c <msdos_initialize_support+0x94>
{
fat_shutdown_drive(&fs_info->fat);
cb58: e1a00004 mov r0, r4 <== NOT EXECUTED
cb5c: eb001345 bl 11878 <fat_shutdown_drive> <== NOT EXECUTED
free(fs_info);
cb60: e1a00004 mov r0, r4 <== NOT EXECUTED
cb64: ebffdd2c bl 401c <free> <== NOT EXECUTED
return rc;
cb68: ea000048 b cc90 <msdos_initialize_support+0x1b8> <== NOT EXECUTED
}
/* again: unfortunately "fat-file" is just almost fat file :( */
fat_fd->fat_file_type = FAT_DIRECTORY;
cb6c: e59d1014 ldr r1, [sp, #20]
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
cb70: e3a03602 mov r3, #2097152 ; 0x200000
cb74: e5813014 str r3, [r1, #20]
fat_fd->cln = fs_info->fat.vol.rdir_cl;
cb78: e594303c ldr r3, [r4, #60] ; 0x3c
fat_fd->map.file_cln = 0;
fat_fd->map.disk_cln = fat_fd->cln;
/* if we have FAT12/16 */
if ( fat_fd->cln == 0 )
cb7c: e3530000 cmp r3, #0
free(fs_info);
return rc;
}
/* again: unfortunately "fat-file" is just almost fat file :( */
fat_fd->fat_file_type = FAT_DIRECTORY;
cb80: e5815010 str r5, [r1, #16]
fat_fd->size_limit = MSDOS_MAX_DIR_LENGHT;
fat_fd->cln = fs_info->fat.vol.rdir_cl;
cb84: e581301c str r3, [r1, #28]
fat_fd->map.file_cln = 0;
cb88: e5815034 str r5, [r1, #52] ; 0x34
fat_fd->map.disk_cln = fat_fd->cln;
cb8c: e5813038 str r3, [r1, #56] ; 0x38
/* if we have FAT12/16 */
if ( fat_fd->cln == 0 )
cb90: 1a000005 bne cbac <msdos_initialize_support+0xd4>
{
fat_fd->fat_file_size = fs_info->fat.vol.rdir_size;
cb94: e594302c ldr r3, [r4, #44] ; 0x2c
cl_buf_size = (fs_info->fat.vol.bpc > fs_info->fat.vol.rdir_size) ?
fs_info->fat.vol.bpc :
cb98: e1d400b6 ldrh r0, [r4, #6]
fat_fd->map.disk_cln = fat_fd->cln;
/* if we have FAT12/16 */
if ( fat_fd->cln == 0 )
{
fat_fd->fat_file_size = fs_info->fat.vol.rdir_size;
cb9c: e5813018 str r3, [r1, #24]
cl_buf_size = (fs_info->fat.vol.bpc > fs_info->fat.vol.rdir_size) ?
cba0: e1500003 cmp r0, r3
cba4: 31a00003 movcc r0, r3
cba8: ea00000d b cbe4 <msdos_initialize_support+0x10c>
fs_info->fat.vol.bpc :
fs_info->fat.vol.rdir_size;
}
else
{
rc = fat_file_size(&fs_info->fat, fat_fd);
cbac: e1a00004 mov r0, r4
cbb0: eb000fc8 bl 10ad8 <fat_file_size>
if ( rc != RC_OK )
cbb4: e250a000 subs sl, r0, #0
fat_file_close(&fs_info->fat, fat_fd);
fat_shutdown_drive(&fs_info->fat);
free(fs_info);
return rc;
}
cl_buf_size = fs_info->fat.vol.bpc;
cbb8: 01d400b6 ldrheq r0, [r4, #6]
fs_info->fat.vol.rdir_size;
}
else
{
rc = fat_file_size(&fs_info->fat, fat_fd);
if ( rc != RC_OK )
cbbc: 0a000008 beq cbe4 <msdos_initialize_support+0x10c>
{
fat_file_close(&fs_info->fat, fat_fd);
cbc0: e59d1014 ldr r1, [sp, #20] <== NOT EXECUTED
cbc4: e1a00004 mov r0, r4 <== NOT EXECUTED
cbc8: eb000e48 bl 104f0 <fat_file_close> <== NOT EXECUTED
fat_shutdown_drive(&fs_info->fat);
cbcc: e1a00004 mov r0, r4 <== NOT EXECUTED
cbd0: eb001328 bl 11878 <fat_shutdown_drive> <== NOT EXECUTED
free(fs_info);
cbd4: e1a00004 mov r0, r4 <== NOT EXECUTED
cbd8: ebffdd0f bl 401c <free> <== NOT EXECUTED
return rc;
cbdc: e1a0500a mov r5, sl <== NOT EXECUTED
cbe0: ea00002a b cc90 <msdos_initialize_support+0x1b8> <== NOT EXECUTED
}
cl_buf_size = fs_info->fat.vol.bpc;
}
fs_info->cl_buf = (uint8_t *)calloc(cl_buf_size, sizeof(char));
cbe4: e3a01001 mov r1, #1
cbe8: ebffdc57 bl 3d4c <calloc>
if (fs_info->cl_buf == NULL)
cbec: e3500000 cmp r0, #0
return rc;
}
cl_buf_size = fs_info->fat.vol.bpc;
}
fs_info->cl_buf = (uint8_t *)calloc(cl_buf_size, sizeof(char));
cbf0: e58400a0 str r0, [r4, #160] ; 0xa0
if (fs_info->cl_buf == NULL)
cbf4: 1a00000b bne cc28 <msdos_initialize_support+0x150>
{
fat_file_close(&fs_info->fat, fat_fd);
cbf8: e59d1014 ldr r1, [sp, #20] <== NOT EXECUTED
cbfc: e1a00004 mov r0, r4 <== NOT EXECUTED
cc00: eb000e3a bl 104f0 <fat_file_close> <== NOT EXECUTED
fat_shutdown_drive(&fs_info->fat);
cc04: e1a00004 mov r0, r4 <== NOT EXECUTED
cc08: eb00131a bl 11878 <fat_shutdown_drive> <== NOT EXECUTED
free(fs_info);
cc0c: e1a00004 mov r0, r4 <== NOT EXECUTED
cc10: ebffdd01 bl 401c <free> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one(ENOMEM);
cc14: eb002f13 bl 18868 <__errno> <== NOT EXECUTED
cc18: e3a0300c mov r3, #12 <== NOT EXECUTED
cc1c: e5803000 str r3, [r0] <== NOT EXECUTED
cc20: e3e05000 mvn r5, #0 <== NOT EXECUTED
cc24: ea000019 b cc90 <msdos_initialize_support+0x1b8> <== NOT EXECUTED
}
sc = rtems_semaphore_create(3,
cc28: e284309c add r3, r4, #156 ; 0x9c
cc2c: e58d3000 str r3, [sp]
cc30: e3a00003 mov r0, #3
cc34: e3a01001 mov r1, #1
cc38: e3a02010 mov r2, #16
cc3c: e3a03000 mov r3, #0
cc40: ebffec7f bl 7e44 <rtems_semaphore_create>
1,
RTEMS_BINARY_SEMAPHORE | RTEMS_FIFO,
0,
&fs_info->vol_sema);
if (sc != RTEMS_SUCCESSFUL)
cc44: e3500000 cmp r0, #0
cc48: 0a00000b beq cc7c <msdos_initialize_support+0x1a4>
{
fat_file_close(&fs_info->fat, fat_fd);
cc4c: e59d1014 ldr r1, [sp, #20] <== NOT EXECUTED
cc50: e1a00004 mov r0, r4 <== NOT EXECUTED
cc54: eb000e25 bl 104f0 <fat_file_close> <== NOT EXECUTED
fat_shutdown_drive(&fs_info->fat);
cc58: e1a00004 mov r0, r4 <== NOT EXECUTED
cc5c: eb001305 bl 11878 <fat_shutdown_drive> <== NOT EXECUTED
free(fs_info->cl_buf);
cc60: e59400a0 ldr r0, [r4, #160] ; 0xa0 <== NOT EXECUTED
cc64: ebffdcec bl 401c <free> <== NOT EXECUTED
free(fs_info);
cc68: e1a00004 mov r0, r4 <== NOT EXECUTED
cc6c: ebffdcea bl 401c <free> <== NOT EXECUTED
rtems_set_errno_and_return_minus_one( EIO );
cc70: eb002efc bl 18868 <__errno> <== NOT EXECUTED
cc74: e3a03005 mov r3, #5 <== NOT EXECUTED
cc78: eaffffe7 b cc1c <msdos_initialize_support+0x144> <== NOT EXECUTED
}
temp_mt_entry->mt_fs_root->location.node_access = fat_fd;
cc7c: e5963024 ldr r3, [r6, #36] ; 0x24
cc80: e59d2014 ldr r2, [sp, #20]
temp_mt_entry->mt_fs_root->location.handlers = directory_handlers;
cc84: e5837010 str r7, [r3, #16]
free(fs_info->cl_buf);
free(fs_info);
rtems_set_errno_and_return_minus_one( EIO );
}
temp_mt_entry->mt_fs_root->location.node_access = fat_fd;
cc88: e5832008 str r2, [r3, #8]
temp_mt_entry->mt_fs_root->location.handlers = directory_handlers;
temp_mt_entry->ops = op_table;
cc8c: e586800c str r8, [r6, #12]
return rc;
}
cc90: e1a00005 mov r0, r5
cc94: e28dd018 add sp, sp, #24
cc98: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
0000caac <msdos_lock>:
void msdos_lock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
msdos_fs_info_t *fs_info = mt_entry->fs_info;
rtems_status_code sc = rtems_semaphore_obtain(
fs_info->vol_sema,
caac: e5903008 ldr r3, [r0, #8]
};
void msdos_lock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
msdos_fs_info_t *fs_info = mt_entry->fs_info;
rtems_status_code sc = rtems_semaphore_obtain(
cab0: e3a01000 mov r1, #0
.rename_h = msdos_rename,
.statvfs_h = rtems_filesystem_default_statvfs
};
void msdos_lock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
cab4: e52de004 push {lr} ; (str lr, [sp, #-4]!)
msdos_fs_info_t *fs_info = mt_entry->fs_info;
rtems_status_code sc = rtems_semaphore_obtain(
cab8: e593009c ldr r0, [r3, #156] ; 0x9c
cabc: e1a02001 mov r2, r1
cac0: ebffed6e bl 8080 <rtems_semaphore_obtain>
fs_info->vol_sema,
RTEMS_WAIT,
RTEMS_NO_TIMEOUT
);
if (sc != RTEMS_SUCCESSFUL) {
cac4: e3500000 cmp r0, #0
cac8: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
rtems_fatal_error_occurred(0xdeadbeef);
cacc: e59f0000 ldr r0, [pc] ; cad4 <msdos_lock+0x28> <== NOT EXECUTED
cad0: ebffef42 bl 87e0 <rtems_fatal_error_occurred> <== NOT EXECUTED
000154b8 <msdos_long_to_short>:
*
*/
#define MSDOS_L2S_PRINT 0
msdos_name_type_t
msdos_long_to_short(const char *lfn, int lfn_len, char* sfn, int sfn_len)
{
154b8: e92d4ff3 push {r0, r1, r4, r5, r6, r7, r8, r9, sl, fp, lr}
154bc: e1a05000 mov r5, r0
154c0: e1a04001 mov r4, r1
int i;
/*
* Fill with spaces. This is how a short directory entry is padded.
*/
memset (sfn, ' ', sfn_len);
154c4: e1a00002 mov r0, r2
154c8: e3a01020 mov r1, #32
*
*/
#define MSDOS_L2S_PRINT 0
msdos_name_type_t
msdos_long_to_short(const char *lfn, int lfn_len, char* sfn, int sfn_len)
{
154cc: e1a06002 mov r6, r2
int i;
/*
* Fill with spaces. This is how a short directory entry is padded.
*/
memset (sfn, ' ', sfn_len);
154d0: e1a02003 mov r2, r3
154d4: eb000fc0 bl 193dc <memset>
/*
* Handle '.' and '..' specially.
*/
if ((lfn[0] == '.') && (lfn_len == 1))
154d8: e5d52000 ldrb r2, [r5]
154dc: e242102e sub r1, r2, #46 ; 0x2e
154e0: e2713000 rsbs r3, r1, #0
154e4: e0a33001 adc r3, r3, r1
154e8: e3540001 cmp r4, #1
154ec: 0352002e cmpeq r2, #46 ; 0x2e
{
sfn[0] = '.';
154f0: 03a0302e moveq r3, #46 ; 0x2e
memset (sfn, ' ', sfn_len);
/*
* Handle '.' and '..' specially.
*/
if ((lfn[0] == '.') && (lfn_len == 1))
154f4: 0a000065 beq 15690 <msdos_long_to_short+0x1d8>
printf ("MSDOS_L2S: SHORT[1]: lfn:'%s' SFN:'%s'\n", lfn, sfn);
#endif
return MSDOS_NAME_SHORT;
}
if ((lfn[0] == '.') && (lfn[1] == '.') && (lfn_len == 2))
154f8: e3530000 cmp r3, #0
154fc: 0a00000b beq 15530 <msdos_long_to_short+0x78>
15500: e5d53001 ldrb r3, [r5, #1]
15504: e3540002 cmp r4, #2
15508: 0353002e cmpeq r3, #46 ; 0x2e
1550c: 13a03000 movne r3, #0
15510: 03a03001 moveq r3, #1
15514: 1a000005 bne 15530 <msdos_long_to_short+0x78>
15518: ea00005a b 15688 <msdos_long_to_short+0x1d0>
/*
* Filenames with only blanks and dots are not allowed!
*/
for (i = 0; i < lfn_len; i++)
if ((lfn[i] != ' ') && (lfn[i] != '.'))
1551c: e7d52003 ldrb r2, [r5, r3]
15520: e352002e cmp r2, #46 ; 0x2e
15524: 13520020 cmpne r2, #32
15528: 1a000002 bne 15538 <msdos_long_to_short+0x80>
}
/*
* Filenames with only blanks and dots are not allowed!
*/
for (i = 0; i < lfn_len; i++)
1552c: e2833001 add r3, r3, #1
15530: e1530004 cmp r3, r4
15534: bafffff8 blt 1551c <msdos_long_to_short+0x64>
if ((lfn[i] != ' ') && (lfn[i] != '.'))
break;
if (i == lfn_len)
15538: e1530004 cmp r3, r4
{
#if MSDOS_L2S_PRINT
printf ("MSDOS_L2S: INVALID[1]: lfn:'%s' SFN:'%s'\n", lfn, sfn);
#endif
return MSDOS_NAME_INVALID;
1553c: 03a00000 moveq r0, #0
*/
for (i = 0; i < lfn_len; i++)
if ((lfn[i] != ' ') && (lfn[i] != '.'))
break;
if (i == lfn_len)
15540: 0a000054 beq 15698 <msdos_long_to_short+0x1e0>
15544: e3a08000 mov r8, #0
15548: e3e09000 mvn r9, #0
1554c: e58d8004 str r8, [sp, #4]
15550: e1a03008 mov r3, r8
15554: ea000037 b 15638 <msdos_long_to_short+0x180>
int dot_at = -1;
int count = 0;
while (*name && (count < name_len))
{
bool is_dot = *name == '.';
15558: e24a202e sub r2, sl, #46 ; 0x2e
1555c: e272b000 rsbs fp, r2, #0
*
*/
static msdos_name_type_t
msdos_is_valid_name_char(const char ch)
{
if (strchr(" +,;=[]", ch) != NULL)
15560: e59f013c ldr r0, [pc, #316] ; 156a4 <msdos_long_to_short+0x1ec>
15564: e1a0100a mov r1, sl
int dot_at = -1;
int count = 0;
while (*name && (count < name_len))
{
bool is_dot = *name == '.';
15568: e0abb002 adc fp, fp, r2
*
*/
static msdos_name_type_t
msdos_is_valid_name_char(const char ch)
{
if (strchr(" +,;=[]", ch) != NULL)
1556c: e58d3000 str r3, [sp]
15570: eb001325 bl 1a20c <strchr>
15574: e3500000 cmp r0, #0
15578: e59d3000 ldr r3, [sp]
return MSDOS_NAME_LONG;
1557c: 13a07002 movne r7, #2
*
*/
static msdos_name_type_t
msdos_is_valid_name_char(const char ch)
{
if (strchr(" +,;=[]", ch) != NULL)
15580: 1a00000f bne 155c4 <msdos_long_to_short+0x10c>
return MSDOS_NAME_LONG;
if ((ch == '.') || isalnum((unsigned char)ch) ||
15584: e35b0000 cmp fp, #0
15588: 1a00000c bne 155c0 <msdos_long_to_short+0x108>
1558c: e59f1114 ldr r1, [pc, #276] ; 156a8 <msdos_long_to_short+0x1f0>
15590: e5912000 ldr r2, [r1]
15594: e082200a add r2, r2, sl
15598: e5d22001 ldrb r2, [r2, #1]
1559c: e3120007 tst r2, #7
155a0: 1a000006 bne 155c0 <msdos_long_to_short+0x108>
(strchr("$%'-_@~`!(){}^#&", ch) != NULL))
155a4: e59f0100 ldr r0, [pc, #256] ; 156ac <msdos_long_to_short+0x1f4>
155a8: e1a0100a mov r1, sl
155ac: eb001316 bl 1a20c <strchr>
*/
static msdos_name_type_t
msdos_is_valid_name_char(const char ch)
{
if (strchr(" +,;=[]", ch) != NULL)
return MSDOS_NAME_LONG;
155b0: e2907000 adds r7, r0, #0
155b4: 13a07001 movne r7, #1
155b8: e59d3000 ldr r3, [sp]
155bc: ea000000 b 155c4 <msdos_long_to_short+0x10c>
if ((ch == '.') || isalnum((unsigned char)ch) ||
(strchr("$%'-_@~`!(){}^#&", ch) != NULL))
return MSDOS_NAME_SHORT;
155c0: e3a07001 mov r7, #1
#if MSDOS_NAME_TYPE_PRINT
printf ("MSDOS_NAME_TYPE: c:%02x type:%d\n", *name, type);
#endif
if ((type == MSDOS_NAME_INVALID) || (type == MSDOS_NAME_LONG))
155c4: e3570000 cmp r7, #0
155c8: 13570002 cmpne r7, #2
155cc: 0a000025 beq 15668 <msdos_long_to_short+0x1b0>
return type;
if (dot_at >= 0)
155d0: e3790001 cmn r9, #1
155d4: 0a000005 beq 155f0 <msdos_long_to_short+0x138>
{
if (is_dot || ((count - dot_at) > 3))
155d8: e35b0000 cmp fp, #0
155dc: 1a00002e bne 1569c <msdos_long_to_short+0x1e4>
155e0: e0692008 rsb r2, r9, r8
155e4: e3520003 cmp r2, #3
155e8: da000007 ble 1560c <msdos_long_to_short+0x154>
155ec: ea00002a b 1569c <msdos_long_to_short+0x1e4> <== NOT EXECUTED
return MSDOS_NAME_LONG;
}
}
else
{
if (count == 8 && !is_dot)
155f0: e3580008 cmp r8, #8
155f4: 1a000002 bne 15604 <msdos_long_to_short+0x14c>
155f8: e35b0000 cmp fp, #0
155fc: 1a00000b bne 15630 <msdos_long_to_short+0x178>
15600: ea000025 b 1569c <msdos_long_to_short+0x1e4>
#endif
return MSDOS_NAME_LONG;
}
}
if (is_dot)
15604: e35b0000 cmp fp, #0
15608: 1a000008 bne 15630 <msdos_long_to_short+0x178>
dot_at = count;
else if ((*name >= 'A') && (*name <= 'Z'))
1560c: e24a2041 sub r2, sl, #65 ; 0x41
15610: e3520019 cmp r2, #25
uppercase = true;
15614: 93a02001 movls r2, #1
15618: 958d2004 strls r2, [sp, #4]
}
}
if (is_dot)
dot_at = count;
else if ((*name >= 'A') && (*name <= 'Z'))
1561c: 9a000004 bls 15634 <msdos_long_to_short+0x17c>
uppercase = true;
else if ((*name >= 'a') && (*name <= 'z'))
15620: e24aa061 sub sl, sl, #97 ; 0x61
lowercase = true;
15624: e35a0019 cmp sl, #25
15628: 93a03001 movls r3, #1
1562c: ea000000 b 15634 <msdos_long_to_short+0x17c>
#endif
return MSDOS_NAME_LONG;
}
}
if (is_dot)
15630: e1a09008 mov r9, r8
else if ((*name >= 'A') && (*name <= 'Z'))
uppercase = true;
else if ((*name >= 'a') && (*name <= 'z'))
lowercase = true;
count++;
15634: e2888001 add r8, r8, #1
bool lowercase = false;
bool uppercase = false;
int dot_at = -1;
int count = 0;
while (*name && (count < name_len))
15638: e7d5a008 ldrb sl, [r5, r8]
1563c: e35a0000 cmp sl, #0
15640: 11580004 cmpne r8, r4
15644: baffffc3 blt 15558 <msdos_long_to_short+0xa0>
count++;
name++;
}
if (lowercase && uppercase)
15648: e3530000 cmp r3, #0
}
#if MSDOS_NAME_TYPE_PRINT
printf ("MSDOS_NAME_TYPE: SHORT[1]\n");
#endif
return MSDOS_NAME_SHORT;
1564c: 03a07001 moveq r7, #1
count++;
name++;
}
if (lowercase && uppercase)
15650: 0a000006 beq 15670 <msdos_long_to_short+0x1b8>
}
#if MSDOS_NAME_TYPE_PRINT
printf ("MSDOS_NAME_TYPE: SHORT[1]\n");
#endif
return MSDOS_NAME_SHORT;
15654: e59d3004 ldr r3, [sp, #4]
15658: e3530000 cmp r3, #0
1565c: 13a07002 movne r7, #2
15660: 03a07001 moveq r7, #1
15664: ea000001 b 15670 <msdos_long_to_short+0x1b8>
* Is this a short name ?
*/
type = msdos_name_type (lfn, lfn_len);
if (type == MSDOS_NAME_INVALID)
15668: e2570000 subs r0, r7, #0
1566c: 0a000009 beq 15698 <msdos_long_to_short+0x1e0>
printf ("MSDOS_L2S: INVALID[2]: lfn:'%s' SFN:'%s'\n", lfn, sfn);
#endif
return MSDOS_NAME_INVALID;
}
msdos_filename_unix2dos (lfn, lfn_len, sfn);
15670: e1a00005 mov r0, r5
15674: e1a01004 mov r1, r4
15678: e1a02006 mov r2, r6
1567c: eb000961 bl 17c08 <msdos_filename_unix2dos>
15680: e1a00007 mov r0, r7
15684: ea000003 b 15698 <msdos_long_to_short+0x1e0>
return MSDOS_NAME_SHORT;
}
if ((lfn[0] == '.') && (lfn[1] == '.') && (lfn_len == 2))
{
sfn[0] = sfn[1] = '.';
15688: e3a0302e mov r3, #46 ; 0x2e
1568c: e5c63001 strb r3, [r6, #1]
15690: e5c63000 strb r3, [r6]
#if MSDOS_L2S_PRINT
printf ("MSDOS_L2S: SHORT[2]: lfn:'%s' SFN:'%s'\n", lfn, sfn);
#endif
return MSDOS_NAME_SHORT;
15694: e3a00001 mov r0, #1
#if MSDOS_L2S_PRINT
printf ("MSDOS_L2S: TYPE:%d lfn:'%s' SFN:'%s'\n", type, lfn, sfn);
#endif
return type;
}
15698: e8bd8ffc pop {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
{
#if MSDOS_NAME_TYPE_PRINT
printf ("MSDOS_NAME_TYPE: LONG[2]: is_dot:%d, at:%d cnt\n",
is_dot, dot_at, count);
#endif
return MSDOS_NAME_LONG;
1569c: e3a07002 mov r7, #2
156a0: eafffff2 b 15670 <msdos_long_to_short+0x1b8>
0000cc9c <msdos_mknod>:
const char *name,
size_t namelen,
mode_t mode,
dev_t dev
)
{
cc9c: e1a0c002 mov ip, r2
msdos_node_type_t type = 0;
/*
* Figure out what type of msdos node this is.
*/
if (S_ISDIR(mode))
cca0: e2032a0f and r2, r3, #61440 ; 0xf000
cca4: e3520901 cmp r2, #16384 ; 0x4000
const char *name,
size_t namelen,
mode_t mode,
dev_t dev
)
{
cca8: e92d4010 push {r4, lr}
ccac: e1a04001 mov r4, r1
msdos_node_type_t type = 0;
/*
* Figure out what type of msdos node this is.
*/
if (S_ISDIR(mode))
ccb0: 0a000007 beq ccd4 <msdos_mknod+0x38>
{
type = MSDOS_DIRECTORY;
}
else if (S_ISREG(mode))
ccb4: e3520902 cmp r2, #32768 ; 0x8000
{
type = MSDOS_REGULAR_FILE;
ccb8: 03a01004 moveq r1, #4
*/
if (S_ISDIR(mode))
{
type = MSDOS_DIRECTORY;
}
else if (S_ISREG(mode))
ccbc: 0a000005 beq ccd8 <msdos_mknod+0x3c>
{
type = MSDOS_REGULAR_FILE;
}
else
rtems_set_errno_and_return_minus_one(EINVAL);
ccc0: eb002ee8 bl 18868 <__errno> <== NOT EXECUTED
ccc4: e3a03016 mov r3, #22 <== NOT EXECUTED
ccc8: e5803000 str r3, [r0] <== NOT EXECUTED
/* Create an MSDOS node */
rc = msdos_creat_node(parentloc, type, name, namelen, mode, NULL);
return rc;
}
cccc: e3e00000 mvn r0, #0 <== NOT EXECUTED
ccd0: e8bd8010 pop {r4, pc} <== NOT EXECUTED
/*
* Figure out what type of msdos node this is.
*/
if (S_ISDIR(mode))
{
type = MSDOS_DIRECTORY;
ccd4: e3a01000 mov r1, #0
}
else
rtems_set_errno_and_return_minus_one(EINVAL);
/* Create an MSDOS node */
rc = msdos_creat_node(parentloc, type, name, namelen, mode, NULL);
ccd8: e58d3008 str r3, [sp, #8]
ccdc: e3a03000 mov r3, #0
cce0: e58d300c str r3, [sp, #12]
cce4: e1a02004 mov r2, r4
cce8: e1a0300c mov r3, ip
return rc;
}
ccec: e8bd4010 pop {r4, lr}
}
else
rtems_set_errno_and_return_minus_one(EINVAL);
/* Create an MSDOS node */
rc = msdos_creat_node(parentloc, type, name, namelen, mode, NULL);
ccf0: ea0020c3 b 15004 <msdos_creat_node>
0000cd00 <msdos_rename>:
const rtems_filesystem_location_info_t *old_loc,
const rtems_filesystem_location_info_t *new_parent_loc,
const char *new_name,
size_t new_namelen
)
{
cd00: e92d4033 push {r0, r1, r4, r5, lr} <== NOT EXECUTED
int rc = RC_OK;
fat_file_fd_t *old_fat_fd = old_loc->node_access;
cd04: e5914008 ldr r4, [r1, #8] <== NOT EXECUTED
const rtems_filesystem_location_info_t *old_loc,
const rtems_filesystem_location_info_t *new_parent_loc,
const char *new_name,
size_t new_namelen
)
{
cd08: e1a05001 mov r5, r1 <== NOT EXECUTED
/*
* create new directory entry as "hard link", copying relevant info from
* existing file
*/
rc = msdos_creat_node(new_parent_loc,
cd0c: e3a01902 mov r1, #32768 ; 0x8000 <== NOT EXECUTED
cd10: e88d0012 stm sp, {r1, r4} <== NOT EXECUTED
cd14: e1a00002 mov r0, r2 <== NOT EXECUTED
cd18: e3a01002 mov r1, #2 <== NOT EXECUTED
cd1c: e1a02003 mov r2, r3 <== NOT EXECUTED
cd20: e59d3014 ldr r3, [sp, #20] <== NOT EXECUTED
cd24: eb0020b6 bl 15004 <msdos_creat_node> <== NOT EXECUTED
MSDOS_HARD_LINK,new_name,new_namelen,S_IFREG,
old_fat_fd);
if (rc != RC_OK)
cd28: e3500000 cmp r0, #0 <== NOT EXECUTED
cd2c: 1a000005 bne cd48 <msdos_rename+0x48> <== NOT EXECUTED
}
/*
* mark file removed
*/
rc = msdos_set_first_char4file_name(old_loc->mt_entry,
cd30: e5950014 ldr r0, [r5, #20] <== NOT EXECUTED
cd34: e2841020 add r1, r4, #32 <== NOT EXECUTED
cd38: e3a020e5 mov r2, #229 ; 0xe5 <== NOT EXECUTED
&old_fat_fd->dir_pos,
MSDOS_THIS_DIR_ENTRY_EMPTY);
return rc;
}
cd3c: e28dd008 add sp, sp, #8 <== NOT EXECUTED
cd40: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
}
/*
* mark file removed
*/
rc = msdos_set_first_char4file_name(old_loc->mt_entry,
cd44: ea0022c6 b 15864 <msdos_set_first_char4file_name> <== NOT EXECUTED
&old_fat_fd->dir_pos,
MSDOS_THIS_DIR_ENTRY_EMPTY);
return rc;
}
cd48: e28dd008 add sp, sp, #8 <== NOT EXECUTED
cd4c: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
0000cd50 <msdos_rmnod>:
#include "msdos.h"
int
msdos_rmnod(const rtems_filesystem_location_info_t *parent_pathloc,
const rtems_filesystem_location_info_t *pathloc)
{
cd50: e92d40f1 push {r0, r4, r5, r6, r7, lr}
int rc = RC_OK;
msdos_fs_info_t *fs_info = pathloc->mt_entry->fs_info;
fat_file_fd_t *fat_fd = pathloc->node_access;
cd54: e5914008 ldr r4, [r1, #8]
if (fat_fd->fat_file_type == MSDOS_DIRECTORY)
cd58: e5943010 ldr r3, [r4, #16]
int
msdos_rmnod(const rtems_filesystem_location_info_t *parent_pathloc,
const rtems_filesystem_location_info_t *pathloc)
{
int rc = RC_OK;
msdos_fs_info_t *fs_info = pathloc->mt_entry->fs_info;
cd5c: e5910014 ldr r0, [r1, #20]
fat_file_fd_t *fat_fd = pathloc->node_access;
if (fat_fd->fat_file_type == MSDOS_DIRECTORY)
cd60: e3530000 cmp r3, #0
#include "msdos.h"
int
msdos_rmnod(const rtems_filesystem_location_info_t *parent_pathloc,
const rtems_filesystem_location_info_t *pathloc)
{
cd64: e1a05001 mov r5, r1
int rc = RC_OK;
msdos_fs_info_t *fs_info = pathloc->mt_entry->fs_info;
cd68: e5906008 ldr r6, [r0, #8]
fat_file_fd_t *fat_fd = pathloc->node_access;
if (fat_fd->fat_file_type == MSDOS_DIRECTORY)
cd6c: 1a000013 bne cdc0 <msdos_rmnod+0x70>
{
bool is_empty = false;
cd70: e28d2004 add r2, sp, #4
cd74: e5623001 strb r3, [r2, #-1]!
/*
* You cannot remove a node that still has children
*/
rc = msdos_dir_is_empty(pathloc->mt_entry, fat_fd, &is_empty);
cd78: e1a01004 mov r1, r4
cd7c: eb0022f9 bl 15968 <msdos_dir_is_empty>
if (rc != RC_OK)
cd80: e2507000 subs r7, r0, #0
cd84: 1a000015 bne cde0 <msdos_rmnod+0x90>
{
return rc;
}
if (!is_empty)
cd88: e5dd3003 ldrb r3, [sp, #3]
cd8c: e3530000 cmp r3, #0
cd90: 1a000002 bne cda0 <msdos_rmnod+0x50>
{
rtems_set_errno_and_return_minus_one(ENOTEMPTY);
cd94: eb002eb3 bl 18868 <__errno>
cd98: e3a0305a mov r3, #90 ; 0x5a
cd9c: ea000004 b cdb4 <msdos_rmnod+0x64>
/*
* We deny attempts to delete open directory (if directory is current
* directory we assume it is open one)
*/
if (fat_fd->links_num > 1)
cda0: e5943008 ldr r3, [r4, #8]
cda4: e3530001 cmp r3, #1
cda8: 9a000004 bls cdc0 <msdos_rmnod+0x70>
{
rtems_set_errno_and_return_minus_one(EBUSY);
cdac: eb002ead bl 18868 <__errno> <== NOT EXECUTED
cdb0: e3a03010 mov r3, #16 <== NOT EXECUTED
cdb4: e5803000 str r3, [r0]
cdb8: e3e07000 mvn r7, #0
cdbc: ea000007 b cde0 <msdos_rmnod+0x90>
* not used - mount() not implemenetd yet.
*/
}
/* mark file removed */
rc = msdos_set_first_char4file_name(pathloc->mt_entry, &fat_fd->dir_pos,
cdc0: e5950014 ldr r0, [r5, #20]
cdc4: e2841020 add r1, r4, #32
cdc8: e3a020e5 mov r2, #229 ; 0xe5
cdcc: eb0022a4 bl 15864 <msdos_set_first_char4file_name>
MSDOS_THIS_DIR_ENTRY_EMPTY);
if (rc != RC_OK)
cdd0: e2507000 subs r7, r0, #0
{
return rc;
}
fat_file_mark_removed(&fs_info->fat, fat_fd);
cdd4: 01a00006 moveq r0, r6
cdd8: 01a01004 moveq r1, r4
cddc: 0b000f2b bleq 10a90 <fat_file_mark_removed>
return rc;
}
cde0: e1a00007 mov r0, r7
cde4: e8bd80f8 pop {r3, r4, r5, r6, r7, pc}
00015864 <msdos_set_first_char4file_name>:
msdos_set_first_char4file_name(
rtems_filesystem_mount_table_entry_t *mt_entry,
fat_dir_pos_t *dir_pos,
unsigned char fchar
)
{
15864: e92d41ff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, lr}
ssize_t ret;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
15868: e5904008 ldr r4, [r0, #8]
msdos_set_first_char4file_name(
rtems_filesystem_mount_table_entry_t *mt_entry,
fat_dir_pos_t *dir_pos,
unsigned char fchar
)
{
1586c: e5cd2004 strb r2, [sp, #4]
ssize_t ret;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t dir_block_size;
fat_pos_t start = dir_pos->lname;
15870: e2813008 add r3, r1, #8
15874: e893000c ldm r3, {r2, r3}
fat_pos_t end = dir_pos->sname;
15878: e8910120 ldm r1, {r5, r8}
)
{
ssize_t ret;
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t dir_block_size;
fat_pos_t start = dir_pos->lname;
1587c: e58d2008 str r2, [sp, #8]
15880: e58d300c str r3, [sp, #12]
fat_pos_t end = dir_pos->sname;
if ((end.cln == fs_info->fat.vol.rdir_cl) &&
15884: e594303c ldr r3, [r4, #60] ; 0x3c
15888: e1550003 cmp r5, r3
1588c: 1a000003 bne 158a0 <msdos_set_first_char4file_name+0x3c>
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
15890: e5d4300e ldrb r3, [r4, #14]
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t dir_block_size;
fat_pos_t start = dir_pos->lname;
fat_pos_t end = dir_pos->sname;
if ((end.cln == fs_info->fat.vol.rdir_cl) &&
15894: e3130003 tst r3, #3
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
dir_block_size = fs_info->fat.vol.rdir_size;
15898: 1594602c ldrne r6, [r4, #44] ; 0x2c
msdos_fs_info_t *fs_info = mt_entry->fs_info;
uint32_t dir_block_size;
fat_pos_t start = dir_pos->lname;
fat_pos_t end = dir_pos->sname;
if ((end.cln == fs_info->fat.vol.rdir_cl) &&
1589c: 1a000000 bne 158a4 <msdos_set_first_char4file_name+0x40>
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
dir_block_size = fs_info->fat.vol.rdir_size;
else
dir_block_size = fs_info->fat.vol.bpc;
158a0: e1d460b6 ldrh r6, [r4, #6] <== NOT EXECUTED
if (dir_pos->lname.cln == FAT_FILE_SHORT_NAME)
158a4: e5913008 ldr r3, [r1, #8]
158a8: e3730001 cmn r3, #1
start = dir_pos->sname;
158ac: 0891000c ldmeq r1, {r2, r3}
158b0: 058d2008 streq r2, [sp, #8]
158b4: 058d300c streq r3, [sp, #12]
uint32_t sec = (fat_cluster_num_to_sector_num(&fs_info->fat, start.cln) +
(start.ofs >> fs_info->fat.vol.sec_log2));
uint32_t byte = (start.ofs & (fs_info->fat.vol.bps - 1));
ret = fat_sector_write(&fs_info->fat, sec, byte + MSDOS_FILE_NAME_OFFSET,
1, &fchar);
158b8: e28d7004 add r7, sp, #4
* name code was written rather than use the fat_file_write
* interface.
*/
while (true)
{
uint32_t sec = (fat_cluster_num_to_sector_num(&fs_info->fat, start.cln) +
158bc: e59d1008 ldr r1, [sp, #8]
158c0: e1a00004 mov r0, r4
158c4: ebfffef0 bl 1548c <fat_cluster_num_to_sector_num>
(start.ofs >> fs_info->fat.vol.sec_log2));
uint32_t byte = (start.ofs & (fs_info->fat.vol.bps - 1));
158c8: e1d420b0 ldrh r2, [r4]
* interface.
*/
while (true)
{
uint32_t sec = (fat_cluster_num_to_sector_num(&fs_info->fat, start.cln) +
(start.ofs >> fs_info->fat.vol.sec_log2));
158cc: e59d300c ldr r3, [sp, #12]
158d0: e5d41002 ldrb r1, [r4, #2]
uint32_t byte = (start.ofs & (fs_info->fat.vol.bps - 1));
158d4: e2422001 sub r2, r2, #1
* name code was written rather than use the fat_file_write
* interface.
*/
while (true)
{
uint32_t sec = (fat_cluster_num_to_sector_num(&fs_info->fat, start.cln) +
158d8: e0801133 add r1, r0, r3, lsr r1
(start.ofs >> fs_info->fat.vol.sec_log2));
uint32_t byte = (start.ofs & (fs_info->fat.vol.bps - 1));
ret = fat_sector_write(&fs_info->fat, sec, byte + MSDOS_FILE_NAME_OFFSET,
158dc: e0022003 and r2, r2, r3
158e0: e1a00004 mov r0, r4
158e4: e3a03001 mov r3, #1
158e8: e58d7000 str r7, [sp]
158ec: ebffed65 bl 10e88 <fat_sector_write>
1, &fchar);
if (ret < 0)
158f0: e3500000 cmp r0, #0
158f4: ba000016 blt 15954 <msdos_set_first_char4file_name+0xf0>
return -1;
if ((start.cln == end.cln) && (start.ofs == end.ofs))
158f8: e59d1008 ldr r1, [sp, #8]
158fc: e1510005 cmp r1, r5
15900: e59d300c ldr r3, [sp, #12]
15904: 1a000001 bne 15910 <msdos_set_first_char4file_name+0xac>
15908: e1530008 cmp r3, r8
1590c: 0a000012 beq 1595c <msdos_set_first_char4file_name+0xf8>
break;
start.ofs += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE;
15910: e2833020 add r3, r3, #32
if (start.ofs >= dir_block_size)
15914: e1530006 cmp r3, r6
return -1;
if ((start.cln == end.cln) && (start.ofs == end.ofs))
break;
start.ofs += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE;
15918: e58d300c str r3, [sp, #12]
if (start.ofs >= dir_block_size)
1591c: 3affffe6 bcc 158bc <msdos_set_first_char4file_name+0x58>
{
int rc;
if ((end.cln == fs_info->fat.vol.rdir_cl) &&
15920: e594303c ldr r3, [r4, #60] ; 0x3c <== NOT EXECUTED
15924: e1550003 cmp r5, r3 <== NOT EXECUTED
15928: 1a000002 bne 15938 <msdos_set_first_char4file_name+0xd4> <== NOT EXECUTED
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
1592c: e5d4300e ldrb r3, [r4, #14] <== NOT EXECUTED
start.ofs += MSDOS_DIRECTORY_ENTRY_STRUCT_SIZE;
if (start.ofs >= dir_block_size)
{
int rc;
if ((end.cln == fs_info->fat.vol.rdir_cl) &&
15930: e3130003 tst r3, #3 <== NOT EXECUTED
15934: 1a000008 bne 1595c <msdos_set_first_char4file_name+0xf8> <== NOT EXECUTED
(fs_info->fat.vol.type & (FAT_FAT12 | FAT_FAT16)))
break;
rc = fat_get_fat_cluster(&fs_info->fat, start.cln, &start.cln);
15938: e1a00004 mov r0, r4 <== NOT EXECUTED
1593c: e28d2008 add r2, sp, #8 <== NOT EXECUTED
15940: eb00044c bl 16a78 <fat_get_fat_cluster> <== NOT EXECUTED
if ( rc != RC_OK )
15944: e3500000 cmp r0, #0 <== NOT EXECUTED
15948: 1a000004 bne 15960 <msdos_set_first_char4file_name+0xfc> <== NOT EXECUTED
return rc;
start.ofs = 0;
1594c: e58d000c str r0, [sp, #12] <== NOT EXECUTED
15950: eaffffd9 b 158bc <msdos_set_first_char4file_name+0x58> <== NOT EXECUTED
uint32_t byte = (start.ofs & (fs_info->fat.vol.bps - 1));
ret = fat_sector_write(&fs_info->fat, sec, byte + MSDOS_FILE_NAME_OFFSET,
1, &fchar);
if (ret < 0)
return -1;
15954: e3e00000 mvn r0, #0 <== NOT EXECUTED
15958: ea000000 b 15960 <msdos_set_first_char4file_name+0xfc> <== NOT EXECUTED
return rc;
start.ofs = 0;
}
}
return RC_OK;
1595c: e3a00000 mov r0, #0
}
15960: e28dd010 add sp, sp, #16
15964: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
0000bbe4 <msdos_set_sectors_per_cluster_from_request>:
msdos_format_param_t *fmt_params )
{
int ret_val = -1;
uint32_t onebit;
if ( rqdata != NULL && rqdata->sectors_per_cluster > 0 ) {
bbe4: e3500000 cmp r0, #0
static int
msdos_set_sectors_per_cluster_from_request(
const msdos_format_request_param_t *rqdata,
msdos_format_param_t *fmt_params )
{
bbe8: e92d4070 push {r4, r5, r6, lr}
bbec: e1a05001 mov r5, r1
int ret_val = -1;
uint32_t onebit;
if ( rqdata != NULL && rqdata->sectors_per_cluster > 0 ) {
bbf0: 0a000002 beq bc00 <msdos_set_sectors_per_cluster_from_request+0x1c>
bbf4: e5903008 ldr r3, [r0, #8]
bbf8: e3530000 cmp r3, #0
fmt_params->sectors_per_cluster = rqdata->sectors_per_cluster;
bbfc: 1581300c strne r3, [r1, #12]
static int
msdos_set_sectors_per_cluster_from_request(
const msdos_format_request_param_t *rqdata,
msdos_format_param_t *fmt_params )
{
bc00: e3a04080 mov r4, #128 ; 0x80
bc04: e3e06000 mvn r6, #0
* must be power of 2
* must be smaller than or equal to 128
* sectors_per_cluster*bytes_per_sector must not be bigger than 32K
*/
for ( onebit = 128; onebit >= 1; onebit = onebit >> 1 ) {
if ( fmt_params->sectors_per_cluster >= onebit ) {
bc08: e595300c ldr r3, [r5, #12]
bc0c: e1530004 cmp r3, r4
bc10: 3a000006 bcc bc30 <msdos_set_sectors_per_cluster_from_request+0x4c>
fmt_params->sectors_per_cluster = onebit;
bc14: e585400c str r4, [r5, #12]
if ( fmt_params->sectors_per_cluster
<= 32768L / fmt_params->bytes_per_sector ) {
bc18: e3a00902 mov r0, #32768 ; 0x8000
bc1c: e5951000 ldr r1, [r5]
bc20: ebffd80e bl 1c60 <__aeabi_uidiv>
* sectors_per_cluster*bytes_per_sector must not be bigger than 32K
*/
for ( onebit = 128; onebit >= 1; onebit = onebit >> 1 ) {
if ( fmt_params->sectors_per_cluster >= onebit ) {
fmt_params->sectors_per_cluster = onebit;
if ( fmt_params->sectors_per_cluster
bc24: e1540000 cmp r4, r0
<= 32768L / fmt_params->bytes_per_sector ) {
/* value is small enough so this value is ok */
onebit = 1;
bc28: 93a04001 movls r4, #1
ret_val = 0;
bc2c: 93a06000 movls r6, #0
* check sectors per cluster.
* must be power of 2
* must be smaller than or equal to 128
* sectors_per_cluster*bytes_per_sector must not be bigger than 32K
*/
for ( onebit = 128; onebit >= 1; onebit = onebit >> 1 ) {
bc30: e1b040a4 lsrs r4, r4, #1
bc34: 1afffff3 bne bc08 <msdos_set_sectors_per_cluster_from_request+0x24>
ret_val = 0;
}
}
}
if (ret_val != 0) {
bc38: e3560000 cmp r6, #0
bc3c: 0a000002 beq bc4c <msdos_set_sectors_per_cluster_from_request+0x68>
errno = EINVAL;
bc40: eb003308 bl 18868 <__errno> <== NOT EXECUTED
bc44: e3a03016 mov r3, #22 <== NOT EXECUTED
bc48: e5803000 str r3, [r0] <== NOT EXECUTED
}
return ret_val;
}
bc4c: e1a00006 mov r0, r6
bc50: e8bd8070 pop {r4, r5, r6, pc}
00016910 <msdos_sync>:
int
msdos_sync(rtems_libio_t *iop)
{
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
16910: e5903024 ldr r3, [r0, #36] ; 0x24
return MSDOS_NAME_NOT_FOUND_ERR;
}
int
msdos_sync(rtems_libio_t *iop)
{
16914: e92d4030 push {r4, r5, lr}
int rc = RC_OK;
rtems_status_code sc = RTEMS_SUCCESSFUL;
msdos_fs_info_t *fs_info = iop->pathinfo.mt_entry->fs_info;
16918: e5934008 ldr r4, [r3, #8]
sc = rtems_semaphore_obtain(fs_info->vol_sema, RTEMS_WAIT,
1691c: e3a01000 mov r1, #0
16920: e594009c ldr r0, [r4, #156] ; 0x9c
16924: e1a02001 mov r2, r1
16928: ebffc5d4 bl 8080 <rtems_semaphore_obtain>
MSDOS_VOLUME_SEMAPHORE_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
1692c: e3500000 cmp r0, #0
16930: 0a000004 beq 16948 <msdos_sync+0x38>
rtems_set_errno_and_return_minus_one(EIO);
16934: eb0007cb bl 18868 <__errno> <== NOT EXECUTED
16938: e3a03005 mov r3, #5 <== NOT EXECUTED
1693c: e5803000 str r3, [r0] <== NOT EXECUTED
16940: e3e05000 mvn r5, #0 <== NOT EXECUTED
16944: ea000004 b 1695c <msdos_sync+0x4c> <== NOT EXECUTED
rc = fat_sync(&fs_info->fat);
16948: e1a00004 mov r0, r4
1694c: ebffeb9d bl 117c8 <fat_sync>
16950: e1a05000 mov r5, r0
rtems_semaphore_release(fs_info->vol_sema);
16954: e594009c ldr r0, [r4, #156] ; 0x9c
16958: ebffc60f bl 819c <rtems_semaphore_release>
return rc;
}
1695c: e1a00005 mov r0, r5
16960: e8bd8030 pop {r4, r5, pc}
0000ca88 <msdos_unlock>:
}
void msdos_unlock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
msdos_fs_info_t *fs_info = mt_entry->fs_info;
rtems_status_code sc = rtems_semaphore_release(fs_info->vol_sema);
ca88: e5903008 ldr r3, [r0, #8]
rtems_fatal_error_occurred(0xdeadbeef);
}
}
void msdos_unlock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
ca8c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
msdos_fs_info_t *fs_info = mt_entry->fs_info;
rtems_status_code sc = rtems_semaphore_release(fs_info->vol_sema);
ca90: e593009c ldr r0, [r3, #156] ; 0x9c
ca94: ebffedc0 bl 819c <rtems_semaphore_release>
if (sc != RTEMS_SUCCESSFUL) {
ca98: e3500000 cmp r0, #0
ca9c: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
rtems_fatal_error_occurred(0xdeadbeef);
caa0: e59f0000 ldr r0, [pc] ; caa8 <msdos_unlock+0x20> <== NOT EXECUTED
caa4: ebffef4d bl 87e0 <rtems_fatal_error_occurred> <== NOT EXECUTED
00002ba8 <newlib_free_buffers>:
* task.
*/
int newlib_free_buffers(
FILE *fp
)
{
2ba8: e92d4010 push {r4, lr}
2bac: e1a04000 mov r4, r0
switch ( fileno(fp) ) {
2bb0: eb002be8 bl db58 <fileno>
2bb4: e3500002 cmp r0, #2
2bb8: 8a00000b bhi 2bec <newlib_free_buffers+0x44>
case 0:
case 1:
case 2:
if (fp->_flags & __SMBF) {
2bbc: e1d430bc ldrh r3, [r4, #12]
2bc0: e3130080 tst r3, #128 ; 0x80
2bc4: 0a00000a beq 2bf4 <newlib_free_buffers+0x4c>
free( fp->_bf._base );
2bc8: e5940010 ldr r0, [r4, #16] <== NOT EXECUTED
2bcc: ebfffdd5 bl 2328 <free> <== NOT EXECUTED
fp->_flags &= ~__SMBF;
2bd0: e1d430bc ldrh r3, [r4, #12] <== NOT EXECUTED
2bd4: e3c33080 bic r3, r3, #128 ; 0x80 <== NOT EXECUTED
2bd8: e1c430bc strh r3, [r4, #12] <== NOT EXECUTED
fp->_bf._base = fp->_p = (unsigned char *) NULL;
2bdc: e3a03000 mov r3, #0 <== NOT EXECUTED
2be0: e5843000 str r3, [r4] <== NOT EXECUTED
2be4: e5843010 str r3, [r4, #16] <== NOT EXECUTED
2be8: ea000001 b 2bf4 <newlib_free_buffers+0x4c> <== NOT EXECUTED
}
break;
default:
fclose(fp);
2bec: e1a00004 mov r0, r4 <== NOT EXECUTED
2bf0: eb002b1b bl d864 <fclose> <== NOT EXECUTED
}
return 0;
}
2bf4: e3a00000 mov r0, #0
2bf8: e8bd8010 pop {r4, pc}
00001568 <notify>:
}
void
notify (s)
char *s;
{
1568: e1a01000 mov r1, r0 <== NOT EXECUTED
156c: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
printf ("%s test appears to be inconsistent...\n", s);
1570: e59f000c ldr r0, [pc, #12] ; 1584 <notify+0x1c> <== NOT EXECUTED
1574: eb006403 bl 1a588 <printf> <== NOT EXECUTED
printf (" PLEASE NOTIFY KARPINKSI!\n");
1578: e59f0008 ldr r0, [pc, #8] ; 1588 <notify+0x20> <== NOT EXECUTED
}
157c: e49de004 pop {lr} ; (ldr lr, [sp], #4) <== NOT EXECUTED
void
notify (s)
char *s;
{
printf ("%s test appears to be inconsistent...\n", s);
printf (" PLEASE NOTIFY KARPINKSI!\n");
1580: ea006440 b 1a688 <puts> <== NOT EXECUTED
0000565c <null_op_fsmount_me>:
rtems_filesystem_mount_table_entry_t *mt_entry,
const void *data
)
{
return -1;
}
565c: e3e00000 mvn r0, #0 <== NOT EXECUTED
5660: e12fff1e bx lr <== NOT EXECUTED
0000566c <null_op_fsunmount_me>:
static void null_op_fsunmount_me(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
/* Do nothing */
}
566c: e12fff1e bx lr <== NOT EXECUTED
00005634 <null_op_link>:
const char *name,
size_t namelen
)
{
return -1;
}
5634: e3e00000 mvn r0, #0 <== NOT EXECUTED
5638: e12fff1e bx lr <== NOT EXECUTED
00005654 <null_op_mount>:
static int null_op_mount(
rtems_filesystem_mount_table_entry_t *mt_entry
)
{
return -1;
}
5654: e3e00000 mvn r0, #0 <== NOT EXECUTED
5658: e12fff1e bx lr <== NOT EXECUTED
00005680 <null_op_readlink>:
char *buf,
size_t bufsize
)
{
return -1;
}
5680: e3e00000 mvn r0, #0 <== NOT EXECUTED
5684: e12fff1e bx lr <== NOT EXECUTED
00005688 <null_op_rename>:
const char *name,
size_t namelen
)
{
return -1;
}
5688: e3e00000 mvn r0, #0 <== NOT EXECUTED
568c: e12fff1e bx lr <== NOT EXECUTED
0000562c <null_op_rmnod>:
const rtems_filesystem_location_info_t *parentloc,
const rtems_filesystem_location_info_t *loc
)
{
return -1;
}
562c: e3e00000 mvn r0, #0 <== NOT EXECUTED
5630: e12fff1e bx lr <== NOT EXECUTED
00004914 <oproc>:
/*
* Handle output processing
*/
static void
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
4914: e92d4011 push {r0, r4, lr}
int i;
if (tty->termios.c_oflag & OPOST) {
4918: e5913034 ldr r3, [r1, #52] ; 0x34
491c: e3130001 tst r3, #1
/*
* Handle output processing
*/
static void
oproc (unsigned char c, struct rtems_termios_tty *tty)
{
4920: e1a04001 mov r4, r1
4924: e5cd0000 strb r0, [sp]
int i;
if (tty->termios.c_oflag & OPOST) {
4928: 0a000045 beq 4a44 <oproc+0x130>
switch (c) {
492c: e20020ff and r2, r0, #255 ; 0xff
4930: e2421008 sub r1, r2, #8
4934: e3510005 cmp r1, #5
4938: 979ff101 ldrls pc, [pc, r1, lsl #2]
493c: ea00002c b 49f4 <oproc+0xe0>
4940: 000049e0 .word 0x000049e0
4944: 000049b8 .word 0x000049b8 <== NOT EXECUTED
4948: 00004958 .word 0x00004958 <== NOT EXECUTED
494c: 000049f4 .word 0x000049f4 <== NOT EXECUTED
4950: 000049f4 .word 0x000049f4 <== NOT EXECUTED
4954: 00004980 .word 0x00004980 <== NOT EXECUTED
case '\n':
if (tty->termios.c_oflag & ONLRET)
4958: e3130020 tst r3, #32
tty->column = 0;
495c: 13a02000 movne r2, #0
4960: 15842028 strne r2, [r4, #40] ; 0x28
if (tty->termios.c_oflag & ONLCR) {
4964: e3130004 tst r3, #4
4968: 0a000035 beq 4a44 <oproc+0x130>
rtems_termios_puts ("\r", 1, tty);
496c: e59f00e4 ldr r0, [pc, #228] ; 4a58 <oproc+0x144>
4970: e3a01001 mov r1, #1
4974: e1a02004 mov r2, r4
4978: ebffffa8 bl 4820 <rtems_termios_puts>
497c: ea00000b b 49b0 <oproc+0x9c>
tty->column = 0;
}
break;
case '\r':
if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0))
4980: e3130010 tst r3, #16 <== NOT EXECUTED
4984: 0a000002 beq 4994 <oproc+0x80> <== NOT EXECUTED
4988: e5942028 ldr r2, [r4, #40] ; 0x28 <== NOT EXECUTED
498c: e3520000 cmp r2, #0 <== NOT EXECUTED
4990: 0a00002f beq 4a54 <oproc+0x140> <== NOT EXECUTED
return;
if (tty->termios.c_oflag & OCRNL) {
4994: e2132008 ands r2, r3, #8 <== NOT EXECUTED
c = '\n';
if (tty->termios.c_oflag & ONLRET)
tty->column = 0;
break;
}
tty->column = 0;
4998: 05842028 streq r2, [r4, #40] ; 0x28 <== NOT EXECUTED
break;
case '\r':
if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0))
return;
if (tty->termios.c_oflag & OCRNL) {
499c: 0a000028 beq 4a44 <oproc+0x130> <== NOT EXECUTED
c = '\n';
49a0: e3a0200a mov r2, #10 <== NOT EXECUTED
if (tty->termios.c_oflag & ONLRET)
49a4: e3130020 tst r3, #32 <== NOT EXECUTED
case '\r':
if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0))
return;
if (tty->termios.c_oflag & OCRNL) {
c = '\n';
49a8: e5cd2000 strb r2, [sp] <== NOT EXECUTED
if (tty->termios.c_oflag & ONLRET)
49ac: 0a000024 beq 4a44 <oproc+0x130> <== NOT EXECUTED
tty->column = 0;
49b0: e3a03000 mov r3, #0
49b4: ea000021 b 4a40 <oproc+0x12c>
}
tty->column = 0;
break;
case '\t':
i = 8 - (tty->column & 7);
49b8: e5942028 ldr r2, [r4, #40] ; 0x28
49bc: e2021007 and r1, r2, #7
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
49c0: e2033b06 and r3, r3, #6144 ; 0x1800
}
tty->column = 0;
break;
case '\t':
i = 8 - (tty->column & 7);
49c4: e2611008 rsb r1, r1, #8
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
49c8: e3530b06 cmp r3, #6144 ; 0x1800
49cc: e0823001 add r3, r2, r1
tty->column += i;
49d0: e5843028 str r3, [r4, #40] ; 0x28
rtems_termios_puts ( " ", i, tty);
49d4: 059f0080 ldreq r0, [pc, #128] ; 4a5c <oproc+0x148>
tty->column = 0;
break;
case '\t':
i = 8 - (tty->column & 7);
if ((tty->termios.c_oflag & TABDLY) == XTABS) {
49d8: 1a000019 bne 4a44 <oproc+0x130>
49dc: ea00001a b 4a4c <oproc+0x138>
}
tty->column += i;
break;
case '\b':
if (tty->column > 0)
49e0: e5943028 ldr r3, [r4, #40] ; 0x28 <== NOT EXECUTED
49e4: e3530000 cmp r3, #0 <== NOT EXECUTED
tty->column--;
49e8: c2433001 subgt r3, r3, #1 <== NOT EXECUTED
}
tty->column += i;
break;
case '\b':
if (tty->column > 0)
49ec: ca000013 bgt 4a40 <oproc+0x12c> <== NOT EXECUTED
49f0: ea000013 b 4a44 <oproc+0x130> <== NOT EXECUTED
tty->column--;
break;
default:
if (tty->termios.c_oflag & OLCUC)
49f4: e3130002 tst r3, #2
49f8: 0a000007 beq 4a1c <oproc+0x108>
c = toupper(c);
49fc: e59f305c ldr r3, [pc, #92] ; 4a60 <oproc+0x14c> <== NOT EXECUTED
4a00: e5933000 ldr r3, [r3] <== NOT EXECUTED
4a04: e0833002 add r3, r3, r2 <== NOT EXECUTED
4a08: e5d33001 ldrb r3, [r3, #1] <== NOT EXECUTED
4a0c: e2033003 and r3, r3, #3 <== NOT EXECUTED
4a10: e3530002 cmp r3, #2 <== NOT EXECUTED
4a14: 02422020 subeq r2, r2, #32 <== NOT EXECUTED
4a18: e5cd2000 strb r2, [sp] <== NOT EXECUTED
if (!iscntrl(c))
4a1c: e59f203c ldr r2, [pc, #60] ; 4a60 <oproc+0x14c>
4a20: e5dd3000 ldrb r3, [sp]
4a24: e5922000 ldr r2, [r2]
4a28: e0823003 add r3, r2, r3
4a2c: e5d33001 ldrb r3, [r3, #1]
4a30: e3130020 tst r3, #32
4a34: 1a000002 bne 4a44 <oproc+0x130>
tty->column++;
4a38: e5943028 ldr r3, [r4, #40] ; 0x28
4a3c: e2833001 add r3, r3, #1
4a40: e5843028 str r3, [r4, #40] ; 0x28
break;
}
}
rtems_termios_puts (&c, 1, tty);
4a44: e1a0000d mov r0, sp
4a48: e3a01001 mov r1, #1
4a4c: e1a02004 mov r2, r4
4a50: ebffff72 bl 4820 <rtems_termios_puts>
}
4a54: e8bd8018 pop {r3, r4, pc}
00003538 <partition_free>:
* RETURNS:
* N/A
*/
static void
partition_free(rtems_part_desc_t *part_desc)
{
3538: e92d4070 push {r4, r5, r6, lr}
int part_num;
if (part_desc == NULL)
353c: e2504000 subs r4, r0, #0
3540: 08bd8070 popeq {r4, r5, r6, pc}
return;
if (is_extended(part_desc->sys_type))
3544: e5d43001 ldrb r3, [r4, #1]
3548: e3530005 cmp r3, #5
354c: 13530085 cmpne r3, #133 ; 0x85
3550: 1a000006 bne 3570 <partition_free+0x38>
3554: e1a06004 mov r6, r4 <== NOT EXECUTED
3558: e3a05004 mov r5, #4 <== NOT EXECUTED
{
for (part_num = 0;
part_num < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
part_num++)
{
partition_free(part_desc->sub_part[part_num]);
355c: e5960018 ldr r0, [r6, #24] <== NOT EXECUTED
3560: ebfffff4 bl 3538 <partition_free> <== NOT EXECUTED
if (part_desc == NULL)
return;
if (is_extended(part_desc->sys_type))
{
for (part_num = 0;
3564: e2555001 subs r5, r5, #1 <== NOT EXECUTED
part_num < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
part_num++)
{
partition_free(part_desc->sub_part[part_num]);
3568: e2866004 add r6, r6, #4 <== NOT EXECUTED
if (part_desc == NULL)
return;
if (is_extended(part_desc->sys_type))
{
for (part_num = 0;
356c: 1afffffa bne 355c <partition_free+0x24> <== NOT EXECUTED
{
partition_free(part_desc->sub_part[part_num]);
}
}
free(part_desc);
3570: e1a00004 mov r0, r4
}
3574: e8bd4070 pop {r4, r5, r6, lr}
{
partition_free(part_desc->sub_part[part_num]);
}
}
free(part_desc);
3578: ea0003ad b 4434 <free>
00003808 <partition_table_get>:
* RTEMS_SUCCESSFUL if success,
* RTEMS_INTERNAL_ERROR otherwise
*/
static rtems_status_code
partition_table_get(const char *dev_name, rtems_disk_desc_t *disk_desc)
{
3808: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
380c: e1a05001 mov r5, r1
3810: e24dd050 sub sp, sp, #80 ; 0x50
struct stat dev_stat;
rtems_status_code rc;
int fd;
fd = open(dev_name, O_RDONLY);
3814: e3a01000 mov r1, #0
* RTEMS_SUCCESSFUL if success,
* RTEMS_INTERNAL_ERROR otherwise
*/
static rtems_status_code
partition_table_get(const char *dev_name, rtems_disk_desc_t *disk_desc)
{
3818: e1a07000 mov r7, r0
struct stat dev_stat;
rtems_status_code rc;
int fd;
fd = open(dev_name, O_RDONLY);
381c: eb000688 bl 5244 <open>
if (fd < 0)
3820: e2506000 subs r6, r0, #0
3824: ba00005f blt 39a8 <partition_table_get+0x1a0>
{
return RTEMS_INTERNAL_ERROR;
}
rc = fstat(fd, &dev_stat);
3828: e1a0100d mov r1, sp
382c: eb000329 bl 44d8 <fstat>
if (rc != RTEMS_SUCCESSFUL)
3830: e2504000 subs r4, r0, #0
3834: 0a000002 beq 3844 <partition_table_get+0x3c>
{
close(fd);
3838: e1a00006 mov r0, r6 <== NOT EXECUTED
383c: eb00025a bl 41ac <close> <== NOT EXECUTED
3840: ea000058 b 39a8 <partition_table_get+0x1a0> <== NOT EXECUTED
return RTEMS_INTERNAL_ERROR;
}
strncpy (disk_desc->dev_name, dev_name, 15);
3844: e1a01007 mov r1, r7
3848: e3a0200f mov r2, #15
384c: e2850008 add r0, r5, #8
3850: eb004310 bl 14498 <strncpy>
disk_desc->dev = dev_stat.st_rdev;
3854: e28d3018 add r3, sp, #24
3858: e893000c ldm r3, {r2, r3}
385c: e885000c stm r5, {r2, r3}
disk_desc->sector_size = (dev_stat.st_blksize) ? dev_stat.st_blksize :
3860: e59d3040 ldr r3, [sp, #64] ; 0x40
3864: e3530000 cmp r3, #0
3868: 03a03c02 moveq r3, #512 ; 0x200
*/
static rtems_status_code
read_mbr(int fd, rtems_disk_desc_t *disk_desc)
{
int part_num;
rtems_sector_data_t *sector = NULL;
386c: e28d2050 add r2, sp, #80 ; 0x50
3870: e5224008 str r4, [r2, #-8]!
rtems_part_desc_t *part_desc;
uint8_t *data;
rtems_status_code rc;
/* get MBR sector */
rc = get_sector(fd, 0, §or);
3874: e1a01004 mov r1, r4
return RTEMS_INTERNAL_ERROR;
}
strncpy (disk_desc->dev_name, dev_name, 15);
disk_desc->dev = dev_stat.st_rdev;
disk_desc->sector_size = (dev_stat.st_blksize) ? dev_stat.st_blksize :
3878: e5853018 str r3, [r5, #24]
rtems_part_desc_t *part_desc;
uint8_t *data;
rtems_status_code rc;
/* get MBR sector */
rc = get_sector(fd, 0, §or);
387c: e1a00006 mov r0, r6
3880: ebffff3d bl 357c <get_sector>
if (rc != RTEMS_SUCCESSFUL)
3884: e2504000 subs r4, r0, #0
3888: e59d0048 ldr r0, [sp, #72] ; 0x48
388c: 0a000002 beq 389c <partition_table_get+0x94>
{
if (sector)
3890: e3500000 cmp r0, #0 <== NOT EXECUTED
3894: 1a000017 bne 38f8 <partition_table_get+0xf0> <== NOT EXECUTED
3898: ea00003f b 399c <partition_table_get+0x194> <== NOT EXECUTED
static bool
msdos_signature_check (rtems_sector_data_t *sector)
{
uint8_t *p = sector->data + RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_OFFSET;
return ((p[0] == RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA1) &&
389c: e5d03202 ldrb r3, [r0, #514] ; 0x202
38a0: e3530055 cmp r3, #85 ; 0x55
38a4: 1a000003 bne 38b8 <partition_table_get+0xb0>
* RETURNS:
* RTEMS_SUCCESSFUL if success,
* RTEMS_INTERNAL_ERROR otherwise
*/
static rtems_status_code
partition_table_get(const char *dev_name, rtems_disk_desc_t *disk_desc)
38a8: e5d04203 ldrb r4, [r0, #515] ; 0x203
38ac: e24420aa sub r2, r4, #170 ; 0xaa
38b0: e2724000 rsbs r4, r2, #0
38b4: e0a44002 adc r4, r4, r2
free(sector);
return rc;
}
/* check if the partition table structure is MS-DOS style */
if (!msdos_signature_check(sector))
38b8: e31400ff tst r4, #255 ; 0xff
38bc: 1a000002 bne 38cc <partition_table_get+0xc4>
{
free(sector);
38c0: eb0002db bl 4434 <free> <== NOT EXECUTED
return RTEMS_INTERNAL_ERROR;
38c4: e3a04019 mov r4, #25 <== NOT EXECUTED
38c8: ea000033 b 399c <partition_table_get+0x194> <== NOT EXECUTED
}
/* read and process 4 primary partition descriptors */
data = sector->data + RTEMS_IDE_PARTITION_TABLE_OFFSET;
38cc: e2809d07 add r9, r0, #448 ; 0x1c0
38d0: e2899002 add r9, r9, #2
38d4: e1a07005 mov r7, r5
38d8: e1a0a005 mov sl, r5
38dc: e3a08001 mov r8, #1
38e0: e1a00009 mov r0, r9
38e4: e28d104c add r1, sp, #76 ; 0x4c
38e8: ebffff47 bl 360c <data_to_part_desc.part.1>
for (part_num = 0;
part_num < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
part_num++)
{
rc = data_to_part_desc(data, &part_desc);
if (rc != RTEMS_SUCCESSFUL)
38ec: e2504000 subs r4, r0, #0
38f0: 0a000002 beq 3900 <partition_table_get+0xf8>
{
free(sector);
38f4: e59d0048 ldr r0, [sp, #72] ; 0x48 <== NOT EXECUTED
38f8: eb0002cd bl 4434 <free> <== NOT EXECUTED
38fc: ea000026 b 399c <partition_table_get+0x194> <== NOT EXECUTED
return rc;
}
if (part_desc != NULL)
3900: e59d304c ldr r3, [sp, #76] ; 0x4c
3904: e3530000 cmp r3, #0
{
part_desc->log_id = part_num + 1;
part_desc->disk_desc = disk_desc;
part_desc->end = part_desc->start + part_desc->size - 1;
3908: 19930006 ldmibne r3, {r1, r2}
390c: 10812002 addne r2, r1, r2
return rc;
}
if (part_desc != NULL)
{
part_desc->log_id = part_num + 1;
3910: 15c38002 strbne r8, [r3, #2]
else
{
disk_desc->partitions[part_num] = NULL;
}
data += RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE;
3914: e2888001 add r8, r8, #1
if (part_desc != NULL)
{
part_desc->log_id = part_num + 1;
part_desc->disk_desc = disk_desc;
part_desc->end = part_desc->start + part_desc->size - 1;
3918: 12422001 subne r2, r2, #1
else
{
disk_desc->partitions[part_num] = NULL;
}
data += RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE;
391c: e20880ff and r8, r8, #255 ; 0xff
}
if (part_desc != NULL)
{
part_desc->log_id = part_num + 1;
part_desc->disk_desc = disk_desc;
3920: 15835010 strne r5, [r3, #16]
part_desc->end = part_desc->start + part_desc->size - 1;
3924: 1583200c strne r2, [r3, #12]
disk_desc->partitions[part_num] = part_desc;
}
else
{
disk_desc->partitions[part_num] = NULL;
3928: 058a4028 streq r4, [sl, #40] ; 0x28
if (part_desc != NULL)
{
part_desc->log_id = part_num + 1;
part_desc->disk_desc = disk_desc;
part_desc->end = part_desc->start + part_desc->size - 1;
disk_desc->partitions[part_num] = part_desc;
392c: 158a3028 strne r3, [sl, #40] ; 0x28
/* read and process 4 primary partition descriptors */
data = sector->data + RTEMS_IDE_PARTITION_TABLE_OFFSET;
for (part_num = 0;
3930: e3580005 cmp r8, #5
else
{
disk_desc->partitions[part_num] = NULL;
}
data += RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE;
3934: e2899010 add r9, r9, #16
3938: e28aa004 add sl, sl, #4
/* read and process 4 primary partition descriptors */
data = sector->data + RTEMS_IDE_PARTITION_TABLE_OFFSET;
for (part_num = 0;
393c: 1affffe7 bne 38e0 <partition_table_get+0xd8>
}
data += RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE;
}
free(sector);
3940: e59d0048 ldr r0, [sp, #72] ; 0x48
3944: eb0002ba bl 4434 <free>
disk_desc->last_log_id = RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
3948: e3a03004 mov r3, #4
394c: e5853024 str r3, [r5, #36] ; 0x24
part_desc = disk_desc->partitions[part_num];
if (part_desc != NULL && is_extended(part_desc->sys_type))
{
read_extended_partition(fd, part_desc->start, part_desc);
free(part_desc);
disk_desc->partitions[part_num] = NULL;
3950: e3a08000 mov r8, #0
data += RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE;
}
free(sector);
disk_desc->last_log_id = RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
3954: e1a05003 mov r5, r3
but we are to process each primary partition */
for (part_num = 0;
part_num < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
part_num++)
{
part_desc = disk_desc->partitions[part_num];
3958: e5972028 ldr r2, [r7, #40] ; 0x28
if (part_desc != NULL && is_extended(part_desc->sys_type))
395c: e3520000 cmp r2, #0
but we are to process each primary partition */
for (part_num = 0;
part_num < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
part_num++)
{
part_desc = disk_desc->partitions[part_num];
3960: e58d204c str r2, [sp, #76] ; 0x4c
if (part_desc != NULL && is_extended(part_desc->sys_type))
3964: 0a000009 beq 3990 <partition_table_get+0x188>
3968: e5d23001 ldrb r3, [r2, #1]
396c: e3530005 cmp r3, #5
3970: 13530085 cmpne r3, #133 ; 0x85
3974: 1a000005 bne 3990 <partition_table_get+0x188>
{
read_extended_partition(fd, part_desc->start, part_desc);
3978: e5921004 ldr r1, [r2, #4]
397c: e1a00006 mov r0, r6
3980: ebffff4e bl 36c0 <read_extended_partition>
free(part_desc);
3984: e59d004c ldr r0, [sp, #76] ; 0x4c
3988: eb0002a9 bl 4434 <free>
disk_desc->partitions[part_num] = NULL;
398c: e5878028 str r8, [r7, #40] ; 0x28
disk_desc->last_log_id = RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
/* There cannot be more than one extended partition,
but we are to process each primary partition */
for (part_num = 0;
3990: e2555001 subs r5, r5, #1
part_desc = disk_desc->partitions[part_num];
if (part_desc != NULL && is_extended(part_desc->sys_type))
{
read_extended_partition(fd, part_desc->start, part_desc);
free(part_desc);
disk_desc->partitions[part_num] = NULL;
3994: e2877004 add r7, r7, #4
disk_desc->last_log_id = RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
/* There cannot be more than one extended partition,
but we are to process each primary partition */
for (part_num = 0;
3998: 1affffee bne 3958 <partition_table_get+0x150>
disk_desc->sector_size = (dev_stat.st_blksize) ? dev_stat.st_blksize :
RTEMS_IDE_SECTOR_SIZE;
rc = read_mbr(fd, disk_desc);
close(fd);
399c: e1a00006 mov r0, r6
39a0: eb000201 bl 41ac <close>
return rc;
39a4: ea000000 b 39ac <partition_table_get+0x1a4>
int fd;
fd = open(dev_name, O_RDONLY);
if (fd < 0)
{
return RTEMS_INTERNAL_ERROR;
39a8: e3a04019 mov r4, #25 <== NOT EXECUTED
rc = read_mbr(fd, disk_desc);
close(fd);
return rc;
}
39ac: e1a00004 mov r0, r4
39b0: e28dd050 add sp, sp, #80 ; 0x50
39b4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
000034e4 <pathconf>:
*/
long pathconf(
const char *path,
int name
)
{
34e4: e92d4030 push {r4, r5, lr}
34e8: e1a05001 mov r5, r1
int status;
int fd;
fd = open( path, O_RDONLY );
34ec: e3a01000 mov r1, #0
34f0: ebffff80 bl 32f8 <open>
if ( fd == -1 )
34f4: e3700001 cmn r0, #1
)
{
int status;
int fd;
fd = open( path, O_RDONLY );
34f8: e1a04000 mov r4, r0
if ( fd == -1 )
return -1;
34fc: 01a05000 moveq r5, r0
{
int status;
int fd;
fd = open( path, O_RDONLY );
if ( fd == -1 )
3500: 0a000004 beq 3518 <pathconf+0x34>
return -1;
status = fpathconf( fd, name );
3504: e1a01005 mov r1, r5 <== NOT EXECUTED
3508: eb0012e3 bl 809c <fpathconf> <== NOT EXECUTED
350c: e1a05000 mov r5, r0 <== NOT EXECUTED
(void) close( fd );
3510: e1a00004 mov r0, r4 <== NOT EXECUTED
3514: eb0012c2 bl 8024 <close> <== NOT EXECUTED
return status;
}
3518: e1a00005 mov r0, r5
351c: e8bd8030 pop {r4, r5, pc}
0000b2b0 <pipe_create>:
static uint16_t rtems_pipe_no = 0;
int pipe_create(
int filsdes[2]
)
{
b2b0: e92d403f push {r0, r1, r2, r3, r4, r5, lr}
b2b4: e1a04000 mov r4, r0
rtems_libio_t *iop;
int err = 0;
if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0)
b2b8: e59f10f4 ldr r1, [pc, #244] ; b3b4 <pipe_create+0x104>
b2bc: e59f00f4 ldr r0, [pc, #244] ; b3b8 <pipe_create+0x108>
b2c0: eb0004e4 bl c658 <rtems_mkdir>
b2c4: e3500000 cmp r0, #0
b2c8: 1a000036 bne b3a8 <pipe_create+0xf8>
return -1;
/* /tmp/.fifoXXXX */
char fifopath[15];
memcpy(fifopath, "/tmp/.fifo", 10);
b2cc: e59f10e8 ldr r1, [pc, #232] ; b3bc <pipe_create+0x10c>
b2d0: e3a0200a mov r2, #10
b2d4: e1a0000d mov r0, sp
b2d8: eb001125 bl f774 <memcpy>
sprintf(fifopath + 10, "%04x", rtems_pipe_no ++);
b2dc: e59f30dc ldr r3, [pc, #220] ; b3c0 <pipe_create+0x110>
b2e0: e1d320b0 ldrh r2, [r3]
b2e4: e2821001 add r1, r2, #1
b2e8: e1c310b0 strh r1, [r3]
b2ec: e28d000a add r0, sp, #10
b2f0: e59f10cc ldr r1, [pc, #204] ; b3c4 <pipe_create+0x114>
b2f4: eb00121e bl fb74 <sprintf>
/* Try creating FIFO file until find an available file name */
while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) {
b2f8: e1a0000d mov r0, sp
b2fc: e3a01d06 mov r1, #384 ; 0x180
b300: eb00043d bl c3fc <mkfifo>
b304: e2505000 subs r5, r0, #0
b308: 0a000001 beq b314 <pipe_create+0x64>
if (errno != EEXIST){
b30c: eb000ede bl ee8c <__errno> <== NOT EXECUTED
b310: ea000024 b b3a8 <pipe_create+0xf8> <== NOT EXECUTED
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);
b314: e1a0000d mov r0, sp
b318: e3a01901 mov r1, #16384 ; 0x4000
b31c: ebffe17c bl 3914 <open>
if (filsdes[0] < 0) {
b320: e3500000 cmp r0, #0
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);
b324: e5840000 str r0, [r4]
if (filsdes[0] < 0) {
b328: aa000002 bge b338 <pipe_create+0x88>
err = errno;
b32c: eb000ed6 bl ee8c <__errno>
b330: e5905000 ldr r5, [r0]
b334: ea000014 b b38c <pipe_create+0xdc>
the file node will be deleted after it is closed by all. */
unlink(fifopath);
}
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
b338: e59f3088 ldr r3, [pc, #136] ; b3c8 <pipe_create+0x118>
b33c: e5933000 ldr r3, [r3]
b340: e1500003 cmp r0, r3
b344: 359f3080 ldrcc r3, [pc, #128] ; b3cc <pipe_create+0x11c>
b348: 35933000 ldrcc r3, [r3]
b34c: 33a05030 movcc r5, #48 ; 0x30
b350: 30253590 mlacc r5, r0, r5, r3
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
b354: e595300c ldr r3, [r5, #12]
b358: e3c33001 bic r3, r3, #1
b35c: e585300c str r3, [r5, #12]
filsdes[1] = open(fifopath, O_WRONLY);
b360: e1a0000d mov r0, sp
b364: e3a01001 mov r1, #1
b368: ebffe169 bl 3914 <open>
if (filsdes[1] < 0) {
b36c: e3500000 cmp r0, #0
else {
/* Reset open file to blocking mode */
iop = rtems_libio_iop(filsdes[0]);
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
filsdes[1] = open(fifopath, O_WRONLY);
b370: e5840004 str r0, [r4, #4]
int pipe_create(
int filsdes[2]
)
{
rtems_libio_t *iop;
int err = 0;
b374: a3a05000 movge r5, #0
iop = rtems_libio_iop(filsdes[0]);
iop->flags &= ~LIBIO_FLAGS_NO_DELAY;
filsdes[1] = open(fifopath, O_WRONLY);
if (filsdes[1] < 0) {
b378: aa000003 bge b38c <pipe_create+0xdc>
err = errno;
b37c: eb000ec2 bl ee8c <__errno>
b380: e5905000 ldr r5, [r0]
close(filsdes[0]);
b384: e5940000 ldr r0, [r4]
b388: ebffdd96 bl 29e8 <close>
}
unlink(fifopath);
b38c: e1a0000d mov r0, sp
b390: ebffec29 bl 643c <unlink>
}
if(err != 0)
b394: e3550000 cmp r5, #0
rtems_set_errno_and_return_minus_one(err);
return 0;
b398: 01a00005 moveq r0, r5
err = errno;
close(filsdes[0]);
}
unlink(fifopath);
}
if(err != 0)
b39c: 0a000002 beq b3ac <pipe_create+0xfc>
rtems_set_errno_and_return_minus_one(err);
b3a0: eb000eb9 bl ee8c <__errno>
b3a4: e5805000 str r5, [r0]
b3a8: e3e00000 mvn r0, #0
return 0;
}
b3ac: e28dd010 add sp, sp, #16
b3b0: e8bd8030 pop {r4, r5, pc}
0000c6f0 <pipe_ioctl>:
ioctl_command_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
c6f0: e59f3058 ldr r3, [pc, #88] ; c750 <pipe_ioctl+0x60>
c6f4: e1510003 cmp r1, r3
pipe_control_t *pipe,
ioctl_command_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
c6f8: e92d4070 push {r4, r5, r6, lr}
c6fc: e1a04000 mov r4, r0
c700: e1a05002 mov r5, r2
*(unsigned int *)buffer = pipe->Length;
PIPE_UNLOCK(pipe);
return 0;
}
return -EINVAL;
c704: 13e00015 mvnne r0, #21
ioctl_command_t cmd,
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
c708: 18bd8070 popne {r4, r5, r6, pc}
if (buffer == NULL)
c70c: e3520000 cmp r2, #0
return -EFAULT;
c710: 03e0000d mvneq r0, #13
void *buffer,
rtems_libio_t *iop
)
{
if (cmd == FIONREAD) {
if (buffer == NULL)
c714: 08bd8070 popeq {r4, r5, r6, pc}
return -EFAULT;
if (! PIPE_LOCK(pipe))
c718: e3a01000 mov r1, #0
c71c: e5940028 ldr r0, [r4, #40] ; 0x28
c720: e1a02001 mov r2, r1
c724: ebffec1c bl 779c <rtems_semaphore_obtain>
c728: e2506000 subs r6, r0, #0
c72c: 1a000005 bne c748 <pipe_ioctl+0x58>
return -EINTR;
/* Return length of pipe */
*(unsigned int *)buffer = pipe->Length;
c730: e594300c ldr r3, [r4, #12]
PIPE_UNLOCK(pipe);
c734: e5940028 ldr r0, [r4, #40] ; 0x28
if (! PIPE_LOCK(pipe))
return -EINTR;
/* Return length of pipe */
*(unsigned int *)buffer = pipe->Length;
c738: e5853000 str r3, [r5]
PIPE_UNLOCK(pipe);
c73c: ebffec5d bl 78b8 <rtems_semaphore_release>
return 0;
c740: e1a00006 mov r0, r6
c744: e8bd8070 pop {r4, r5, r6, pc}
if (cmd == FIONREAD) {
if (buffer == NULL)
return -EFAULT;
if (! PIPE_LOCK(pipe))
return -EINTR;
c748: e3e00003 mvn r0, #3 <== NOT EXECUTED
PIPE_UNLOCK(pipe);
return 0;
}
return -EINVAL;
}
c74c: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
0000c3d4 <pipe_read>:
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
c3d4: e92d47f1 push {r0, r4, r5, r6, r7, r8, r9, sl, lr}
c3d8: e1a09001 mov r9, r1
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
c3dc: e3a01000 mov r1, #0
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
c3e0: e1a04000 mov r4, r0
c3e4: e1a05002 mov r5, r2
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
c3e8: e5900028 ldr r0, [r0, #40] ; 0x28
c3ec: e1a02001 mov r2, r1
pipe_control_t *pipe,
void *buffer,
size_t count,
rtems_libio_t *iop
)
{
c3f0: e1a0a003 mov sl, r3
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
c3f4: ebffece8 bl 779c <rtems_semaphore_obtain>
c3f8: e2506000 subs r6, r0, #0
return -EINTR;
c3fc: 13e06003 mvnne r6, #3
rtems_libio_t *iop
)
{
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
c400: 0a000042 beq c510 <pipe_read+0x13c>
c404: ea00004c b c53c <pipe_read+0x168> <== NOT EXECUTED
return -EINTR;
while (read < count) {
while (PIPE_EMPTY(pipe)) {
/* Not an error */
if (pipe->Writers == 0)
c408: e5947014 ldr r7, [r4, #20]
c40c: e3570000 cmp r7, #0
c410: 0a000043 beq c524 <pipe_read+0x150>
goto out_locked;
if (LIBIO_NODELAY(iop)) {
c414: e59a800c ldr r8, [sl, #12]
c418: e2188001 ands r8, r8, #1
c41c: 1a00003f bne c520 <pipe_read+0x14c>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until pipe is no more empty or no writer exists */
pipe->waitingReaders ++;
c420: e5943018 ldr r3, [r4, #24]
c424: e2833001 add r3, r3, #1
c428: e5843018 str r3, [r4, #24]
PIPE_UNLOCK(pipe);
c42c: e5940028 ldr r0, [r4, #40] ; 0x28
c430: ebffed20 bl 78b8 <rtems_semaphore_release>
if (! PIPE_READWAIT(pipe))
c434: e1a01008 mov r1, r8
c438: e594002c ldr r0, [r4, #44] ; 0x2c
c43c: eb000532 bl d90c <rtems_barrier_wait>
c440: e3500000 cmp r0, #0
c444: 01a07000 moveq r7, r0
c448: 13e07003 mvnne r7, #3
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
c44c: e1a01008 mov r1, r8
c450: e5940028 ldr r0, [r4, #40] ; 0x28
c454: e1a02008 mov r2, r8
c458: ebffeccf bl 779c <rtems_semaphore_obtain>
c45c: e3500000 cmp r0, #0
c460: 1a000032 bne c530 <pipe_read+0x15c>
/* WARN waitingReaders not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingReaders --;
c464: e5943018 ldr r3, [r4, #24]
if (ret != 0)
c468: e3570000 cmp r7, #0
if (! PIPE_LOCK(pipe)) {
/* WARN waitingReaders not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingReaders --;
c46c: e2433001 sub r3, r3, #1
c470: e5843018 str r3, [r4, #24]
if (ret != 0)
c474: 1a00002a bne c524 <pipe_read+0x150>
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
while (PIPE_EMPTY(pipe)) {
c478: e594300c ldr r3, [r4, #12]
c47c: e3530000 cmp r3, #0
c480: 0affffe0 beq c408 <pipe_read+0x34>
if (ret != 0)
goto out_locked;
}
/* Read chunk bytes */
chunk = MIN(count - read, pipe->Length);
c484: e0667005 rsb r7, r6, r5
c488: e1530007 cmp r3, r7
c48c: 31a07003 movcc r7, r3
chunk1 = pipe->Size - pipe->Start;
c490: e5948004 ldr r8, [r4, #4]
c494: e5943008 ldr r3, [r4, #8]
c498: e5941000 ldr r1, [r4]
c49c: e0638008 rsb r8, r3, r8
if (chunk > chunk1) {
c4a0: e1570008 cmp r7, r8
c4a4: e0890006 add r0, r9, r6
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
c4a8: e0811003 add r1, r1, r3
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
c4ac: d1a02007 movle r2, r7
}
/* Read chunk bytes */
chunk = MIN(count - read, pipe->Length);
chunk1 = pipe->Size - pipe->Start;
if (chunk > chunk1) {
c4b0: da000005 ble c4cc <pipe_read+0xf8>
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1);
c4b4: e1a02008 mov r2, r8
c4b8: eb00102c bl 10570 <memcpy>
memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1);
c4bc: e0860008 add r0, r6, r8
c4c0: e5941000 ldr r1, [r4]
c4c4: e0890000 add r0, r9, r0
c4c8: e0682007 rsb r2, r8, r7
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
c4cc: eb001027 bl 10570 <memcpy>
pipe->Start += chunk;
c4d0: e5940008 ldr r0, [r4, #8]
pipe->Start %= pipe->Size;
c4d4: e5941004 ldr r1, [r4, #4]
c4d8: e0870000 add r0, r7, r0
c4dc: eb00404d bl 1c618 <__umodsi3>
pipe->Length -= chunk;
c4e0: e594300c ldr r3, [r4, #12]
c4e4: e0673003 rsb r3, r7, r3
/* For buffering optimization */
if (PIPE_EMPTY(pipe))
c4e8: e3530000 cmp r3, #0
}
else
memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk);
pipe->Start += chunk;
pipe->Start %= pipe->Size;
c4ec: e5840008 str r0, [r4, #8]
pipe->Length -= chunk;
c4f0: e584300c str r3, [r4, #12]
/* For buffering optimization */
if (PIPE_EMPTY(pipe))
pipe->Start = 0;
c4f4: 05843008 streq r3, [r4, #8]
if (pipe->waitingWriters > 0)
c4f8: e594301c ldr r3, [r4, #28]
c4fc: e3530000 cmp r3, #0
PIPE_WAKEUPWRITERS(pipe);
c500: 15940030 ldrne r0, [r4, #48] ; 0x30
c504: 11a0100d movne r1, sp
c508: 1b0004e9 blne d8b4 <rtems_barrier_release>
read += chunk;
c50c: e0866007 add r6, r6, r7
int chunk, chunk1, read = 0, ret = 0;
if (! PIPE_LOCK(pipe))
return -EINTR;
while (read < count) {
c510: e1560005 cmp r6, r5
c514: 3affffd7 bcc c478 <pipe_read+0xa4>
c518: e3a07000 mov r7, #0
c51c: ea000000 b c524 <pipe_read+0x150>
/* Not an error */
if (pipe->Writers == 0)
goto out_locked;
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
c520: e3e0700a mvn r7, #10
PIPE_WAKEUPWRITERS(pipe);
read += chunk;
}
out_locked:
PIPE_UNLOCK(pipe);
c524: e5940028 ldr r0, [r4, #40] ; 0x28
c528: ebffece2 bl 78b8 <rtems_semaphore_release>
c52c: ea000000 b c534 <pipe_read+0x160>
PIPE_UNLOCK(pipe);
if (! PIPE_READWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingReaders not restored! */
ret = -EINTR;
c530: e3e07003 mvn r7, #3 <== NOT EXECUTED
PIPE_UNLOCK(pipe);
out_nolock:
if (read > 0)
return read;
return ret;
c534: e3560000 cmp r6, #0
c538: d1a06007 movle r6, r7
}
c53c: e1a00006 mov r0, r6
c540: e8bd87f8 pop {r3, r4, r5, r6, r7, r8, r9, sl, pc}
0000c544 <pipe_write>:
pipe_control_t *pipe,
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
c544: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
c548: e2527000 subs r7, r2, #0
pipe_control_t *pipe,
const void *buffer,
size_t count,
rtems_libio_t *iop
)
{
c54c: e1a04000 mov r4, r0
c550: e1a0b001 mov fp, r1
c554: e1a08003 mov r8, r3
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
return 0;
c558: 01a05007 moveq r5, r7
)
{
int chunk, chunk1, written = 0, ret = 0;
/* Write nothing */
if (count == 0)
c55c: 0a000061 beq c6e8 <pipe_write+0x1a4>
return 0;
if (! PIPE_LOCK(pipe))
c560: e3a01000 mov r1, #0
c564: e5900028 ldr r0, [r0, #40] ; 0x28
c568: e1a02001 mov r2, r1
c56c: ebffec8a bl 779c <rtems_semaphore_obtain>
c570: e3500000 cmp r0, #0
return -EINTR;
c574: 13e05003 mvnne r5, #3
/* Write nothing */
if (count == 0)
return 0;
if (! PIPE_LOCK(pipe))
c578: 1a00005a bne c6e8 <pipe_write+0x1a4>
return -EINTR;
if (pipe->Readers == 0) {
c57c: e5945010 ldr r5, [r4, #16]
c580: e3550000 cmp r5, #0
c584: 0a00004b beq c6b8 <pipe_write+0x174>
ret = -EPIPE;
goto out_locked;
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
c588: e5949004 ldr r9, [r4, #4]
c58c: e1570009 cmp r7, r9
c590: 91a09007 movls r9, r7
c594: 83a09001 movhi r9, #1
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
c598: e1a05000 mov r5, r0
c59c: ea00003f b c6a0 <pipe_write+0x15c>
/* 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)) {
c5a0: e598a00c ldr sl, [r8, #12]
c5a4: e21aa001 ands sl, sl, #1
c5a8: 1a000040 bne c6b0 <pipe_write+0x16c>
ret = -EAGAIN;
goto out_locked;
}
/* Wait until there is chunk bytes space or no reader exists */
pipe->waitingWriters ++;
c5ac: e594301c ldr r3, [r4, #28]
c5b0: e2833001 add r3, r3, #1
c5b4: e584301c str r3, [r4, #28]
PIPE_UNLOCK(pipe);
c5b8: e5940028 ldr r0, [r4, #40] ; 0x28
c5bc: ebffecbd bl 78b8 <rtems_semaphore_release>
if (! PIPE_WRITEWAIT(pipe))
c5c0: e1a0100a mov r1, sl
c5c4: e5940030 ldr r0, [r4, #48] ; 0x30
c5c8: eb0004cf bl d90c <rtems_barrier_wait>
c5cc: e3500000 cmp r0, #0
c5d0: 01a06000 moveq r6, r0
c5d4: 13e06003 mvnne r6, #3
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
c5d8: e1a0100a mov r1, sl
c5dc: e5940028 ldr r0, [r4, #40] ; 0x28
c5e0: e1a0200a mov r2, sl
c5e4: ebffec6c bl 779c <rtems_semaphore_obtain>
c5e8: e3500000 cmp r0, #0
c5ec: 1a00003a bne c6dc <pipe_write+0x198>
/* WARN waitingWriters not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingWriters --;
c5f0: e594301c ldr r3, [r4, #28]
if (ret != 0)
c5f4: e3560000 cmp r6, #0
if (! PIPE_LOCK(pipe)) {
/* WARN waitingWriters not restored! */
ret = -EINTR;
goto out_nolock;
}
pipe->waitingWriters --;
c5f8: e2433001 sub r3, r3, #1
c5fc: e584301c str r3, [r4, #28]
if (ret != 0)
c600: 1a00002d bne c6bc <pipe_write+0x178>
goto out_locked;
if (pipe->Readers == 0) {
c604: e5943010 ldr r3, [r4, #16]
c608: e3530000 cmp r3, #0
c60c: 0a000029 beq c6b8 <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) {
c610: e594a004 ldr sl, [r4, #4]
c614: e594300c ldr r3, [r4, #12]
c618: e063200a rsb r2, r3, sl
c61c: e1520009 cmp r2, r9
c620: 3affffde bcc c5a0 <pipe_write+0x5c>
goto out_locked;
}
}
chunk = MIN(count - written, PIPE_SPACE(pipe));
chunk1 = pipe->Size - PIPE_WSTART(pipe);
c624: e5940008 ldr r0, [r4, #8]
c628: e1a0100a mov r1, sl
c62c: e0830000 add r0, r3, r0
ret = -EPIPE;
goto out_locked;
}
}
chunk = MIN(count - written, PIPE_SPACE(pipe));
c630: e0656007 rsb r6, r5, r7
c634: e1520006 cmp r2, r6
c638: 31a06002 movcc r6, r2
chunk1 = pipe->Size - PIPE_WSTART(pipe);
c63c: eb003ff5 bl 1c618 <__umodsi3>
c640: e5943000 ldr r3, [r4]
c644: e060a00a rsb sl, r0, sl
if (chunk > chunk1) {
c648: e156000a cmp r6, sl
c64c: e08b1005 add r1, fp, r5
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1);
c650: e0830000 add r0, r3, r0
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
c654: d1a02006 movle r2, r6
}
}
chunk = MIN(count - written, PIPE_SPACE(pipe));
chunk1 = pipe->Size - PIPE_WSTART(pipe);
if (chunk > chunk1) {
c658: da000005 ble c674 <pipe_write+0x130>
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1);
c65c: e1a0200a mov r2, sl
c660: eb000fc2 bl 10570 <memcpy>
memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1);
c664: e08a1005 add r1, sl, r5
c668: e5940000 ldr r0, [r4]
c66c: e08b1001 add r1, fp, r1
c670: e06a2006 rsb r2, sl, r6
}
else
memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk);
c674: eb000fbd bl 10570 <memcpy>
pipe->Length += chunk;
c678: e594300c ldr r3, [r4, #12]
c67c: e0833006 add r3, r3, r6
c680: e584300c str r3, [r4, #12]
if (pipe->waitingReaders > 0)
c684: e5943018 ldr r3, [r4, #24]
c688: e3530000 cmp r3, #0
PIPE_WAKEUPREADERS(pipe);
c68c: 1594002c ldrne r0, [r4, #44] ; 0x2c
c690: 11a0100d movne r1, sp
c694: 1b000486 blne d8b4 <rtems_barrier_release>
written += chunk;
c698: e0855006 add r5, r5, r6
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
c69c: e3a09001 mov r9, #1
}
/* Write of PIPE_BUF bytes or less shall not be interleaved */
chunk = count <= pipe->Size ? count : 1;
while (written < count) {
c6a0: e1550007 cmp r5, r7
c6a4: 3affffd9 bcc c610 <pipe_write+0xcc>
c6a8: e3a06000 mov r6, #0
c6ac: ea000002 b c6bc <pipe_write+0x178>
while (PIPE_SPACE(pipe) < chunk) {
if (LIBIO_NODELAY(iop)) {
ret = -EAGAIN;
c6b0: e3e0600a mvn r6, #10
c6b4: ea000000 b c6bc <pipe_write+0x178>
pipe->waitingWriters --;
if (ret != 0)
goto out_locked;
if (pipe->Readers == 0) {
ret = -EPIPE;
c6b8: e3e0601f mvn r6, #31
/* Write of more than PIPE_BUF bytes can be interleaved */
chunk = 1;
}
out_locked:
PIPE_UNLOCK(pipe);
c6bc: e5940028 ldr r0, [r4, #40] ; 0x28
c6c0: ebffec7c bl 78b8 <rtems_semaphore_release>
out_nolock:
#ifdef RTEMS_POSIX_API
/* Signal SIGPIPE */
if (ret == -EPIPE)
c6c4: e3760020 cmn r6, #32
c6c8: 1a000004 bne c6e0 <pipe_write+0x19c>
kill(getpid(), SIGPIPE);
c6cc: eb00011e bl cb4c <getpid>
c6d0: e3a0100d mov r1, #13
c6d4: eb000277 bl d0b8 <kill>
c6d8: ea000000 b c6e0 <pipe_write+0x19c>
PIPE_UNLOCK(pipe);
if (! PIPE_WRITEWAIT(pipe))
ret = -EINTR;
if (! PIPE_LOCK(pipe)) {
/* WARN waitingWriters not restored! */
ret = -EINTR;
c6dc: e3e06003 mvn r6, #3 <== NOT EXECUTED
/* Signal SIGPIPE */
if (ret == -EPIPE)
kill(getpid(), SIGPIPE);
#endif
if (written > 0)
c6e0: e3550000 cmp r5, #0
c6e4: d1a05006 movle r5, r6
return written;
return ret;
}
c6e8: e1a00005 mov r0, r5
c6ec: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000a594 <pthread_attr_setschedpolicy>:
int pthread_attr_setschedpolicy(
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
a594: e3500000 cmp r0, #0
a598: 0a00000b beq a5cc <pthread_attr_setschedpolicy+0x38>
a59c: e5903000 ldr r3, [r0]
a5a0: e3530000 cmp r3, #0
a5a4: 0a000008 beq a5cc <pthread_attr_setschedpolicy+0x38>
return EINVAL;
switch ( policy ) {
a5a8: e3510004 cmp r1, #4
a5ac: 8a000008 bhi a5d4 <pthread_attr_setschedpolicy+0x40>
a5b0: e3a03001 mov r3, #1
a5b4: e1a03113 lsl r3, r3, r1
a5b8: e3130017 tst r3, #23
case SCHED_OTHER:
case SCHED_FIFO:
case SCHED_RR:
case SCHED_SPORADIC:
attr->schedpolicy = policy;
a5bc: 15801014 strne r1, [r0, #20]
return 0;
a5c0: 13a00000 movne r0, #0
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
switch ( policy ) {
a5c4: 112fff1e bxne lr
a5c8: ea000001 b a5d4 <pthread_attr_setschedpolicy+0x40> <== NOT EXECUTED
pthread_attr_t *attr,
int policy
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
a5cc: e3a00016 mov r0, #22
a5d0: e12fff1e bx lr
case SCHED_SPORADIC:
attr->schedpolicy = policy;
return 0;
default:
return ENOTSUP;
a5d4: e3a00086 mov r0, #134 ; 0x86
}
}
a5d8: e12fff1e bx lr
00018f20 <pthread_kill>:
int pthread_kill(
pthread_t thread,
int sig
)
{
18f20: e92d41f1 push {r0, r4, r5, r6, r7, r8, lr}
POSIX_API_Control *api;
Thread_Control *the_thread;
Objects_Locations location;
if ( !sig )
18f24: e2517000 subs r7, r1, #0
18f28: 0a000002 beq 18f38 <pthread_kill+0x18>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
18f2c: e2478001 sub r8, r7, #1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
18f30: e358001f cmp r8, #31
18f34: 9a000002 bls 18f44 <pthread_kill+0x24>
rtems_set_errno_and_return_minus_one( EINVAL );
18f38: ebffd1fd bl d734 <__errno>
18f3c: e3a03016 mov r3, #22
18f40: ea000025 b 18fdc <pthread_kill+0xbc>
the_thread = _Thread_Get( thread, &location );
18f44: e1a0100d mov r1, sp
18f48: ebffbdc2 bl 8658 <_Thread_Get>
switch ( location ) {
18f4c: e59d6000 ldr r6, [sp]
18f50: e3560000 cmp r6, #0
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
rtems_set_errno_and_return_minus_one( EINVAL );
the_thread = _Thread_Get( thread, &location );
18f54: e1a04000 mov r4, r0
switch ( location ) {
18f58: 1a00001d bne 18fd4 <pthread_kill+0xb4>
18f5c: e59f0084 ldr r0, [pc, #132] ; 18fe8 <pthread_kill+0xc8>
18f60: ebffb645 bl 687c <_API_extensions_Add_post_switch>
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
18f64: e59f2080 ldr r2, [pc, #128] ; 18fec <pthread_kill+0xcc>
18f68: e3a0100c mov r1, #12
18f6c: e0222791 mla r2, r1, r7, r2
18f70: e5922008 ldr r2, [r2, #8]
18f74: e3520001 cmp r2, #1
* If sig == 0 then just validate arguments
*/
_POSIX_signals_Add_post_switch_extension();
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
18f78: e59430f4 ldr r3, [r4, #244] ; 0xf4
if ( sig ) {
if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
18f7c: 1a000002 bne 18f8c <pthread_kill+0x6c>
_Thread_Enable_dispatch();
18f80: ebffbdac bl 8638 <_Thread_Enable_dispatch>
return 0;
18f84: e1a00006 mov r0, r6
18f88: ea000015 b 18fe4 <pthread_kill+0xc4>
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
18f8c: e59320d4 ldr r2, [r3, #212] ; 0xd4
static inline sigset_t signo_to_mask(
uint32_t sig
)
{
return 1u << (sig - 1);
18f90: e3a05001 mov r5, #1
18f94: e1828815 orr r8, r2, r5, lsl r8
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
18f98: e1a00004 mov r0, r4
return 0;
}
/* XXX critical section */
api->signals_pending |= signo_to_mask( sig );
18f9c: e58380d4 str r8, [r3, #212] ; 0xd4
(void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
18fa0: e1a02006 mov r2, r6
18fa4: e1a01007 mov r1, r7
18fa8: ebffff97 bl 18e0c <_POSIX_signals_Unblock_thread>
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
18fac: e59f303c ldr r3, [pc, #60] ; 18ff0 <pthread_kill+0xd0>
18fb0: e5932000 ldr r2, [r3]
18fb4: e3520000 cmp r2, #0
18fb8: 0a000002 beq 18fc8 <pthread_kill+0xa8>
18fbc: e5932008 ldr r2, [r3, #8]
18fc0: e1540002 cmp r4, r2
_Thread_Dispatch_necessary = true;
18fc4: 05c35004 strbeq r5, [r3, #4]
}
_Thread_Enable_dispatch();
18fc8: ebffbd9a bl 8638 <_Thread_Enable_dispatch>
return 0;
18fcc: e3a00000 mov r0, #0
18fd0: ea000003 b 18fe4 <pthread_kill+0xc4>
#endif
case OBJECTS_ERROR:
break;
}
rtems_set_errno_and_return_minus_one( ESRCH );
18fd4: ebffd1d6 bl d734 <__errno> <== NOT EXECUTED
18fd8: e3a03003 mov r3, #3 <== NOT EXECUTED
18fdc: e5803000 str r3, [r0]
18fe0: e3e00000 mvn r0, #0
}
18fe4: e8bd81f8 pop {r3, r4, r5, r6, r7, r8, pc}
0000584c <pthread_mutexattr_gettype>:
int pthread_mutexattr_gettype(
const pthread_mutexattr_t *attr,
int *type
)
{
if ( !attr )
584c: e3500000 cmp r0, #0
5850: 0a000008 beq 5878 <pthread_mutexattr_gettype+0x2c>
return EINVAL;
if ( !attr->is_initialized )
5854: e5903000 ldr r3, [r0]
5858: e3530000 cmp r3, #0
585c: 0a000005 beq 5878 <pthread_mutexattr_gettype+0x2c>
return EINVAL;
if ( !type )
5860: e3510000 cmp r1, #0
return EINVAL;
*type = attr->type;
5864: 15903010 ldrne r3, [r0, #16]
return 0;
5868: 13a00000 movne r0, #0
return EINVAL;
if ( !type )
return EINVAL;
*type = attr->type;
586c: 15813000 strne r3, [r1]
return EINVAL;
if ( !attr->is_initialized )
return EINVAL;
if ( !type )
5870: 112fff1e bxne lr
5874: ea000001 b 5880 <pthread_mutexattr_gettype+0x34> <== NOT EXECUTED
{
if ( !attr )
return EINVAL;
if ( !attr->is_initialized )
return EINVAL;
5878: e3a00016 mov r0, #22
587c: e12fff1e bx lr
if ( !type )
return EINVAL;
5880: e3a00016 mov r0, #22 <== NOT EXECUTED
*type = attr->type;
return 0;
}
5884: e12fff1e bx lr <== NOT EXECUTED
00007d80 <pthread_mutexattr_setpshared>:
int pthread_mutexattr_setpshared(
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
7d80: e3500000 cmp r0, #0
7d84: 0a000007 beq 7da8 <pthread_mutexattr_setpshared+0x28>
7d88: e5903000 ldr r3, [r0]
7d8c: e3530000 cmp r3, #0
7d90: 0a000004 beq 7da8 <pthread_mutexattr_setpshared+0x28>
return EINVAL;
switch ( pshared ) {
7d94: e3510001 cmp r1, #1
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
7d98: 95801004 strls r1, [r0, #4]
return 0;
7d9c: 93a00000 movls r0, #0
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
switch ( pshared ) {
7da0: 912fff1e bxls lr
7da4: ea000001 b 7db0 <pthread_mutexattr_setpshared+0x30> <== NOT EXECUTED
pthread_mutexattr_t *attr,
int pshared
)
{
if ( !attr || !attr->is_initialized )
return EINVAL;
7da8: e3a00016 mov r0, #22
7dac: e12fff1e bx lr
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
7db0: e3a00016 mov r0, #22 <== NOT EXECUTED
}
}
7db4: e12fff1e bx lr <== NOT EXECUTED
00007a8c <pthread_rwlockattr_setpshared>:
int pthread_rwlockattr_setpshared(
pthread_rwlockattr_t *attr,
int pshared
)
{
if ( !attr )
7a8c: e3500000 cmp r0, #0
7a90: 0a000007 beq 7ab4 <pthread_rwlockattr_setpshared+0x28>
return EINVAL;
if ( !attr->is_initialized )
7a94: e5903000 ldr r3, [r0]
7a98: e3530000 cmp r3, #0
7a9c: 0a000004 beq 7ab4 <pthread_rwlockattr_setpshared+0x28>
return EINVAL;
switch ( pshared ) {
7aa0: e3510001 cmp r1, #1
case PTHREAD_PROCESS_SHARED:
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
7aa4: 95801004 strls r1, [r0, #4]
return 0;
7aa8: 93a00000 movls r0, #0
return EINVAL;
if ( !attr->is_initialized )
return EINVAL;
switch ( pshared ) {
7aac: 912fff1e bxls lr
7ab0: ea000001 b 7abc <pthread_rwlockattr_setpshared+0x30> <== NOT EXECUTED
{
if ( !attr )
return EINVAL;
if ( !attr->is_initialized )
return EINVAL;
7ab4: e3a00016 mov r0, #22
7ab8: e12fff1e bx lr
case PTHREAD_PROCESS_PRIVATE:
attr->process_shared = pshared;
return 0;
default:
return EINVAL;
7abc: e3a00016 mov r0, #22 <== NOT EXECUTED
}
}
7ac0: e12fff1e bx lr <== NOT EXECUTED
0000abfc <ramdisk_allocate>:
void *area_begin,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
bool trace
)
{
abfc: e92d41f0 push {r4, r5, r6, r7, r8, lr}
ac00: e1a04000 mov r4, r0
struct ramdisk *rd = malloc(sizeof(struct ramdisk));
ac04: e3a00010 mov r0, #16
void *area_begin,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
bool trace
)
{
ac08: e1a05001 mov r5, r1
ac0c: e1a06002 mov r6, r2
ac10: e20380ff and r8, r3, #255 ; 0xff
struct ramdisk *rd = malloc(sizeof(struct ramdisk));
ac14: ebffe333 bl 38e8 <malloc>
if (rd == NULL) {
ac18: e2507000 subs r7, r0, #0
ac1c: 0a000012 beq ac6c <ramdisk_allocate+0x70>
return NULL;
}
if (area_begin == NULL) {
ac20: e3540000 cmp r4, #0
return NULL;
}
rd->malloced = true;
} else {
rd->malloced = false;
ac24: 13a03000 movne r3, #0
if (rd == NULL) {
return NULL;
}
if (area_begin == NULL) {
ac28: 1a000009 bne ac54 <ramdisk_allocate+0x58>
area_begin = calloc(media_block_count, media_block_size);
ac2c: e1a00006 mov r0, r6
ac30: e1a01005 mov r1, r5
ac34: ebffe149 bl 3160 <calloc>
if (area_begin == NULL) {
ac38: e2504000 subs r4, r0, #0
free(rd);
return NULL;
}
rd->malloced = true;
ac3c: 13a03001 movne r3, #1
return NULL;
}
if (area_begin == NULL) {
area_begin = calloc(media_block_count, media_block_size);
if (area_begin == NULL) {
ac40: 1a000003 bne ac54 <ramdisk_allocate+0x58>
free(rd);
ac44: e1a00007 mov r0, r7 <== NOT EXECUTED
ac48: ebffe1f8 bl 3430 <free> <== NOT EXECUTED
return NULL;
ac4c: e1a07004 mov r7, r4 <== NOT EXECUTED
ac50: ea000005 b ac6c <ramdisk_allocate+0x70> <== NOT EXECUTED
}
rd->malloced = true;
} else {
rd->malloced = false;
ac54: e5c7300d strb r3, [r7, #13]
}
rd->block_size = media_block_size;
rd->block_num = media_block_count;
ac58: e8870060 stm r7, {r5, r6}
rd->area = area_begin;
rd->trace = trace;
rd->initialized = true;
ac5c: e3a03001 mov r3, #1
} else {
rd->malloced = false;
}
rd->block_size = media_block_size;
rd->block_num = media_block_count;
rd->area = area_begin;
ac60: e5874008 str r4, [r7, #8]
rd->trace = trace;
ac64: e5c7800e strb r8, [r7, #14]
rd->initialized = true;
ac68: e5c7300c strb r3, [r7, #12]
return rd;
}
ac6c: e1a00007 mov r0, r7
ac70: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
0000bd88 <ramdisk_initialize>:
rtems_device_driver
ramdisk_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor __attribute__((unused)),
void *arg __attribute__((unused)))
{
bd88: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
bd8c: e24dd01c sub sp, sp, #28
bd90: e1a09000 mov r9, r0
rtems_device_minor_number i;
rtems_ramdisk_config *c = rtems_ramdisk_configuration;
struct ramdisk *r;
rtems_status_code rc;
rc = rtems_disk_io_initialize();
bd94: ebffdd9d bl 3410 <rtems_disk_io_initialize>
if (rc != RTEMS_SUCCESSFUL)
bd98: e2505000 subs r5, r0, #0
bd9c: 11a00005 movne r0, r5
bda0: 1a00003c bne be98 <ramdisk_initialize+0x110>
* This is allocating memory for a RAM disk which will persist for
* the life of the system. RTEMS has no "de-initialize" driver call
* so there is no corresponding free(r). Coverity is correct that
* it is never freed but this is not a problem.
*/
r = calloc(rtems_ramdisk_configuration_size, sizeof(struct ramdisk));
bda4: e59f80f4 ldr r8, [pc, #244] ; bea0 <ramdisk_initialize+0x118>
bda8: e3a01010 mov r1, #16
bdac: e5980000 ldr r0, [r8]
bdb0: ebffe0eb bl 4164 <calloc>
rtems_device_major_number major,
rtems_device_minor_number minor __attribute__((unused)),
void *arg __attribute__((unused)))
{
rtems_device_minor_number i;
rtems_ramdisk_config *c = rtems_ramdisk_configuration;
bdb4: e59f60e8 ldr r6, [pc, #232] ; bea4 <ramdisk_initialize+0x11c>
* This is allocating memory for a RAM disk which will persist for
* the life of the system. RTEMS has no "de-initialize" driver call
* so there is no corresponding free(r). Coverity is correct that
* it is never freed but this is not a problem.
*/
r = calloc(rtems_ramdisk_configuration_size, sizeof(struct ramdisk));
bdb8: e1a04000 mov r4, r0
r->trace = false;
bdbc: e5c0500e strb r5, [r0, #14]
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
{
dev_t dev = rtems_filesystem_make_dev_t(major, i);
char name [] = RAMDISK_DEVICE_BASE_NAME "a";
bdc0: e28d7010 add r7, sp, #16
* so there is no corresponding free(r). Coverity is correct that
* it is never freed but this is not a problem.
*/
r = calloc(rtems_ramdisk_configuration_size, sizeof(struct ramdisk));
r->trace = false;
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
bdc4: ea00002f b be88 <ramdisk_initialize+0x100>
{
dev_t dev = rtems_filesystem_make_dev_t(major, i);
char name [] = RAMDISK_DEVICE_BASE_NAME "a";
bdc8: e3a02009 mov r2, #9
bdcc: e1a00007 mov r0, r7
bdd0: e59f10d0 ldr r1, [pc, #208] ; bea8 <ramdisk_initialize+0x120>
bdd4: eb001cf9 bl 131c0 <memcpy>
name [sizeof(RAMDISK_DEVICE_BASE_NAME)] += i;
bdd8: e5dd3018 ldrb r3, [sp, #24]
r->block_size = c->block_size;
r->block_num = c->block_num;
if (c->location == NULL)
bddc: e5962008 ldr r2, [r6, #8]
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
{
dev_t dev = rtems_filesystem_make_dev_t(major, i);
char name [] = RAMDISK_DEVICE_BASE_NAME "a";
name [sizeof(RAMDISK_DEVICE_BASE_NAME)] += i;
r->block_size = c->block_size;
bde0: e596b000 ldr fp, [r6]
r->block_num = c->block_num;
bde4: e596a004 ldr sl, [r6, #4]
r->trace = false;
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
{
dev_t dev = rtems_filesystem_make_dev_t(major, i);
char name [] = RAMDISK_DEVICE_BASE_NAME "a";
name [sizeof(RAMDISK_DEVICE_BASE_NAME)] += i;
bde8: e0853003 add r3, r5, r3
r->block_size = c->block_size;
r->block_num = c->block_num;
if (c->location == NULL)
bdec: e3520000 cmp r2, #0
r->trace = false;
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
{
dev_t dev = rtems_filesystem_make_dev_t(major, i);
char name [] = RAMDISK_DEVICE_BASE_NAME "a";
name [sizeof(RAMDISK_DEVICE_BASE_NAME)] += i;
bdf0: e5cd3018 strb r3, [sp, #24]
r->block_size = c->block_size;
bdf4: e584b000 str fp, [r4]
r->block_num = c->block_num;
bdf8: e584a004 str sl, [r4, #4]
bdfc: e3a03001 mov r3, #1
if (c->location == NULL)
be00: 1a00000a bne be30 <ramdisk_initialize+0xa8>
{
r->malloced = true;
r->area = malloc(r->block_size * r->block_num);
be04: e0000a9b mul r0, fp, sl
name [sizeof(RAMDISK_DEVICE_BASE_NAME)] += i;
r->block_size = c->block_size;
r->block_num = c->block_num;
if (c->location == NULL)
{
r->malloced = true;
be08: e5c4300d strb r3, [r4, #13]
r->area = malloc(r->block_size * r->block_num);
be0c: e58d300c str r3, [sp, #12]
be10: ebffe2f7 bl 49f4 <malloc>
if (r->area == NULL) /* No enough memory for this disk */
be14: e59d300c ldr r3, [sp, #12]
be18: e3500000 cmp r0, #0
r->block_size = c->block_size;
r->block_num = c->block_num;
if (c->location == NULL)
{
r->malloced = true;
r->area = malloc(r->block_size * r->block_num);
be1c: e5840008 str r0, [r4, #8]
if (r->area == NULL) /* No enough memory for this disk */
{
r->initialized = false;
be20: 05c4000c strbeq r0, [r4, #12]
continue;
}
else
{
r->initialized = true;
be24: 15c4300c strbne r3, [r4, #12]
r->block_num = c->block_num;
if (c->location == NULL)
{
r->malloced = true;
r->area = malloc(r->block_size * r->block_num);
if (r->area == NULL) /* No enough memory for this disk */
be28: 1a000004 bne be40 <ramdisk_initialize+0xb8>
be2c: ea000012 b be7c <ramdisk_initialize+0xf4> <== NOT EXECUTED
r->initialized = true;
}
}
else
{
r->malloced = false;
be30: e3a01000 mov r1, #0 <== NOT EXECUTED
be34: e5c4100d strb r1, [r4, #13] <== NOT EXECUTED
r->initialized = true;
be38: e5c4300c strb r3, [r4, #12] <== NOT EXECUTED
r->area = c->location;
be3c: e5842008 str r2, [r4, #8] <== NOT EXECUTED
}
rc = rtems_disk_create_phys(dev, c->block_size, c->block_num,
be40: e59f3064 ldr r3, [pc, #100] ; beac <ramdisk_initialize+0x124>
be44: e1a00009 mov r0, r9
be48: e88d0098 stm sp, {r3, r4, r7}
be4c: e1a01005 mov r1, r5
be50: e1a0200b mov r2, fp
be54: e1a0300a mov r3, sl
be58: ebffdcd8 bl 31c0 <rtems_disk_create_phys>
ramdisk_ioctl, r, name);
if (rc != RTEMS_SUCCESSFUL)
be5c: e3500000 cmp r0, #0
be60: 0a000005 beq be7c <ramdisk_initialize+0xf4>
{
if (r->malloced)
be64: e5d4300d ldrb r3, [r4, #13] <== NOT EXECUTED
be68: e3530000 cmp r3, #0 <== NOT EXECUTED
{
free(r->area);
be6c: 15940008 ldrne r0, [r4, #8] <== NOT EXECUTED
be70: 1bffe16f blne 4434 <free> <== NOT EXECUTED
}
r->initialized = false;
be74: e3a03000 mov r3, #0 <== NOT EXECUTED
be78: e5c4300c strb r3, [r4, #12] <== NOT EXECUTED
* so there is no corresponding free(r). Coverity is correct that
* it is never freed but this is not a problem.
*/
r = calloc(rtems_ramdisk_configuration_size, sizeof(struct ramdisk));
r->trace = false;
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
be7c: e2855001 add r5, r5, #1
be80: e286600c add r6, r6, #12
be84: e2844010 add r4, r4, #16
be88: e5983000 ldr r3, [r8]
be8c: e1550003 cmp r5, r3
be90: 3affffcc bcc bdc8 <ramdisk_initialize+0x40>
free(r->area);
}
r->initialized = false;
}
}
return RTEMS_SUCCESSFUL;
be94: e3a00000 mov r0, #0
}
be98: e28dd01c add sp, sp, #28
be9c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000aae4 <ramdisk_ioctl>:
int
ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
{
struct ramdisk *rd = rtems_disk_get_driver_data(dd);
switch (req)
aae4: e59fc108 ldr ip, [pc, #264] ; abf4 <ramdisk_ioctl+0x110>
aae8: e151000c cmp r1, ip
return 0;
}
int
ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
{
aaec: e92d41f0 push {r4, r5, r6, r7, r8, lr}
aaf0: e1a04002 mov r4, r2
static inline void *rtems_disk_get_driver_data(
const rtems_disk_device *dd
)
{
return dd->driver_data;
aaf4: e590503c ldr r5, [r0, #60] ; 0x3c
struct ramdisk *rd = rtems_disk_get_driver_data(dd);
switch (req)
aaf8: 0a000030 beq abc0 <ramdisk_ioctl+0xdc>
aafc: e59fc0f4 ldr ip, [pc, #244] ; abf8 <ramdisk_ioctl+0x114>
ab00: e151000c cmp r1, ip
ab04: 1a000033 bne abd8 <ramdisk_ioctl+0xf4>
{
case RTEMS_BLKIO_REQUEST:
{
rtems_blkdev_request *r = argp;
switch (r->req)
ab08: e5927000 ldr r7, [r2]
ab0c: e3570000 cmp r7, #0
#endif
static int
ramdisk_read(struct ramdisk *rd, rtems_blkdev_request *req)
{
uint8_t *from = rd->area;
ab10: 05958008 ldreq r8, [r5, #8]
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d",
req->bufs[0].block, req->bufnum);
#endif
for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
ab14: 02826018 addeq r6, r2, #24
{
case RTEMS_BLKIO_REQUEST:
{
rtems_blkdev_request *r = argp;
switch (r->req)
ab18: 0a000009 beq ab44 <ramdisk_ioctl+0x60>
ab1c: e3570001 cmp r7, #1
ab20: 1a000021 bne abac <ramdisk_ioctl+0xc8>
ab24: ea00000b b ab58 <ramdisk_ioctl+0x74>
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk read: buf=%d block=%d length=%d off=%d addr=%p",
i, sg->block, sg->length, sg->block * rd->block_size,
from + (sg->block * rd->block_size));
#endif
memcpy(sg->buffer, from + (sg->block * rd->block_size), sg->length);
ab28: e5163010 ldr r3, [r6, #-16]
ab2c: e5951000 ldr r1, [r5]
ab30: e5160008 ldr r0, [r6, #-8]
ab34: e0218193 mla r1, r3, r1, r8
ab38: e516200c ldr r2, [r6, #-12]
ab3c: eb001d07 bl 11f60 <memcpy>
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d",
req->bufs[0].block, req->bufnum);
#endif
for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
ab40: e2877001 add r7, r7, #1
ab44: e5943010 ldr r3, [r4, #16]
ab48: e1570003 cmp r7, r3
ab4c: e2866010 add r6, r6, #16
ab50: 3afffff4 bcc ab28 <ramdisk_ioctl+0x44>
ab54: ea00000e b ab94 <ramdisk_ioctl+0xb0>
}
static int
ramdisk_write(struct ramdisk *rd, rtems_blkdev_request *req)
{
uint8_t *to = rd->area;
ab58: e5958008 ldr r8, [r5, #8]
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d",
req->bufs[0].block, req->bufnum);
#endif
for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
ab5c: e2826018 add r6, r2, #24
ab60: e3a07000 mov r7, #0
ab64: ea000006 b ab84 <ramdisk_ioctl+0xa0>
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk write: buf=%d block=%d length=%d off=%d addr=%p",
i, sg->block, sg->length, sg->block * rd->block_size,
to + (sg->block * rd->block_size));
#endif
memcpy(to + (sg->block * rd->block_size), sg->buffer, sg->length);
ab68: e5163010 ldr r3, [r6, #-16]
ab6c: e5950000 ldr r0, [r5]
ab70: e5161008 ldr r1, [r6, #-8]
ab74: e0208093 mla r0, r3, r0, r8
ab78: e516200c ldr r2, [r6, #-12]
ab7c: eb001cf7 bl 11f60 <memcpy>
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d",
req->bufs[0].block, req->bufnum);
#endif
for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
ab80: e2877001 add r7, r7, #1
ab84: e5943010 ldr r3, [r4, #16]
ab88: e1570003 cmp r7, r3
ab8c: e2866010 add r6, r6, #16
ab90: 3afffff4 bcc ab68 <ramdisk_ioctl+0x84>
static inline void rtems_blkdev_request_done(
rtems_blkdev_request *req,
rtems_status_code status
)
{
(*req->done)(req, status);
ab94: e1a00004 mov r0, r4
ab98: e3a01000 mov r1, #0
ab9c: e1a0e00f mov lr, pc
aba0: e594f004 ldr pc, [r4, #4]
{
case RTEMS_BLKDEV_REQ_READ:
return ramdisk_read(rd, r);
case RTEMS_BLKDEV_REQ_WRITE:
return ramdisk_write(rd, r);
aba4: e3a00000 mov r0, #0
aba8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
default:
errno = EINVAL;
abac: eb001ab1 bl 11678 <__errno> <== NOT EXECUTED
abb0: e3a03016 mov r3, #22 <== NOT EXECUTED
abb4: e5803000 str r3, [r0] <== NOT EXECUTED
return -1;
abb8: e3e00000 mvn r0, #0 <== NOT EXECUTED
abbc: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
}
break;
}
case RTEMS_BLKIO_DELETED:
if (rd->free_at_delete_request) {
abc0: e5d5300f ldrb r3, [r5, #15]
abc4: e3530000 cmp r3, #0
abc8: 0a000004 beq abe0 <ramdisk_ioctl+0xfc>
ramdisk_free(rd);
abcc: e1a00005 mov r0, r5
abd0: eb000027 bl ac74 <ramdisk_free>
abd4: ea000001 b abe0 <ramdisk_ioctl+0xfc>
break;
}
errno = EINVAL;
return -1;
}
abd8: e8bd41f0 pop {r4, r5, r6, r7, r8, lr}
ramdisk_free(rd);
}
break;
default:
return rtems_blkdev_ioctl (dd, req, argp);
abdc: ea000955 b d138 <rtems_blkdev_ioctl>
break;
}
errno = EINVAL;
abe0: eb001aa4 bl 11678 <__errno>
abe4: e3a03016 mov r3, #22
abe8: e5803000 str r3, [r0]
return -1;
abec: e3e00000 mvn r0, #0
}
abf0: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
0000ac9c <ramdisk_register>:
rtems_blkdev_bnum media_block_count,
bool trace,
const char *disk,
dev_t *dev_ptr
)
{
ac9c: e92d47ff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr}
aca0: e1a07000 mov r7, r0
aca4: e20240ff and r4, r2, #255 ; 0xff
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_device_major_number major = 0;
aca8: e3a00000 mov r0, #0
acac: e28d2010 add r2, sp, #16
rtems_blkdev_bnum media_block_count,
bool trace,
const char *disk,
dev_t *dev_ptr
)
{
acb0: e1a06001 mov r6, r1
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_device_major_number major = 0;
acb4: e5220004 str r0, [r2, #-4]!
ramdisk *rd = NULL;
dev_t dev = 0;
sc = rtems_io_register_driver(0, &ramdisk_ops, &major);
acb8: e59f1074 ldr r1, [pc, #116] ; ad34 <ramdisk_register+0x98>
rtems_blkdev_bnum media_block_count,
bool trace,
const char *disk,
dev_t *dev_ptr
)
{
acbc: e1a08003 mov r8, r3
acc0: e59d9030 ldr r9, [sp, #48] ; 0x30
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_device_major_number major = 0;
ramdisk *rd = NULL;
dev_t dev = 0;
sc = rtems_io_register_driver(0, &ramdisk_ops, &major);
acc4: ebfff355 bl 7a20 <rtems_io_register_driver>
if (sc != RTEMS_SUCCESSFUL) {
acc8: e250a000 subs sl, r0, #0
accc: 1a000015 bne ad28 <ramdisk_register+0x8c>
return RTEMS_UNSATISFIED;
}
rd = ramdisk_allocate(NULL, media_block_size, media_block_count, trace);
acd0: e1a01007 mov r1, r7
acd4: e1a02006 mov r2, r6
acd8: e1a03004 mov r3, r4
acdc: ebffffc6 bl abfc <ramdisk_allocate>
if (rd == NULL) {
ace0: e2505000 subs r5, r0, #0
ace4: 0a00000d beq ad20 <ramdisk_register+0x84>
rtems_device_minor_number _minor
)
{
union __rtems_dev_t temp;
temp.__overlay.major = _major;
ace8: e59d400c ldr r4, [sp, #12]
return RTEMS_UNSATISFIED;
}
dev = rtems_filesystem_make_dev_t(major, 0);
sc = rtems_disk_create_phys(
acec: e59f3044 ldr r3, [pc, #68] ; ad38 <ramdisk_register+0x9c>
acf0: e1a00004 mov r0, r4
acf4: e88d0128 stm sp, {r3, r5, r8}
acf8: e1a0100a mov r1, sl
acfc: e1a02007 mov r2, r7
ad00: e1a03006 mov r3, r6
ad04: ebffde9b bl 2778 <rtems_disk_create_phys>
media_block_count,
ramdisk_ioctl,
rd,
disk
);
if (sc != RTEMS_SUCCESSFUL) {
ad08: e3500000 cmp r0, #0
rtems_io_unregister_driver(major);
return RTEMS_UNSATISFIED;
}
*dev_ptr = dev;
ad0c: 05894000 streq r4, [r9]
ad10: 05890004 streq r0, [r9, #4]
media_block_count,
ramdisk_ioctl,
rd,
disk
);
if (sc != RTEMS_SUCCESSFUL) {
ad14: 0a000004 beq ad2c <ramdisk_register+0x90>
ramdisk_free(rd);
ad18: e1a00005 mov r0, r5 <== NOT EXECUTED
ad1c: ebffffd4 bl ac74 <ramdisk_free> <== NOT EXECUTED
rtems_io_unregister_driver(major);
ad20: e59d000c ldr r0, [sp, #12] <== NOT EXECUTED
ad24: ebfff39b bl 7b98 <rtems_io_unregister_driver> <== NOT EXECUTED
ramdisk *rd = NULL;
dev_t dev = 0;
sc = rtems_io_register_driver(0, &ramdisk_ops, &major);
if (sc != RTEMS_SUCCESSFUL) {
return RTEMS_UNSATISFIED;
ad28: e3a0000d mov r0, #13 <== NOT EXECUTED
}
*dev_ptr = dev;
return RTEMS_SUCCESSFUL;
}
ad2c: e28dd010 add sp, sp, #16
ad30: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
00018a14 <read>:
size_t count
)
{
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
18a14: e59fc07c ldr ip, [pc, #124] ; 18a98 <read+0x84>
18a18: e59cc000 ldr ip, [ip]
18a1c: e150000c cmp r0, ip
ssize_t read(
int fd,
void *buffer,
size_t count
)
{
18a20: e92d4030 push {r4, r5, lr}
18a24: e1a04001 mov r4, r1
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
18a28: 2a00000f bcs 18a6c <read+0x58>
iop = rtems_libio_iop( fd );
18a2c: e59fc068 ldr ip, [pc, #104] ; 18a9c <read+0x88>
18a30: e59cc000 ldr ip, [ip]
18a34: e3a05030 mov r5, #48 ; 0x30
18a38: e020c095 mla r0, r5, r0, ip
rtems_libio_check_is_open( iop );
18a3c: e590c00c ldr ip, [r0, #12]
18a40: e31c0c01 tst ip, #256 ; 0x100
18a44: 0a000008 beq 18a6c <read+0x58>
rtems_libio_check_buffer( buffer );
18a48: e3510000 cmp r1, #0
18a4c: 1a000002 bne 18a5c <read+0x48>
18a50: ebffd337 bl d734 <__errno> <== NOT EXECUTED
18a54: e3a03016 mov r3, #22 <== NOT EXECUTED
18a58: ea000005 b 18a74 <read+0x60> <== NOT EXECUTED
rtems_libio_check_count( count );
18a5c: e3520000 cmp r2, #0
18a60: 0a00000a beq 18a90 <read+0x7c>
rtems_libio_check_permissions_with_error( iop, LIBIO_FLAGS_READ, EBADF );
18a64: e31c0002 tst ip, #2
18a68: 1a000004 bne 18a80 <read+0x6c>
18a6c: ebffd330 bl d734 <__errno>
18a70: e3a03009 mov r3, #9
18a74: e5803000 str r3, [r0]
18a78: e3e00000 mvn r0, #0
18a7c: e8bd8030 pop {r4, r5, pc}
/*
* Now process the read().
*/
return (*iop->pathinfo.handlers->read_h)( iop, buffer, count );
18a80: e5903020 ldr r3, [r0, #32]
18a84: e1a0e00f mov lr, pc
18a88: e593f008 ldr pc, [r3, #8]
18a8c: e8bd8030 pop {r4, r5, pc}
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
18a90: e1a00002 mov r0, r2
/*
* Now process the read().
*/
return (*iop->pathinfo.handlers->read_h)( iop, buffer, count );
}
18a94: e8bd8030 pop {r4, r5, pc}
000036c0 <read_extended_partition>:
* RTEMS_NO_MEMOTY if cannot allocate memory for part_desc_t strucure,
* RTEMS_INTERNAL_ERROR if other error occurs.
*/
static rtems_status_code
read_extended_partition(int fd, uint32_t start, rtems_part_desc_t *ext_part)
{
36c0: e92d4ff3 push {r0, r1, r4, r5, r6, r7, r8, r9, sl, fp, lr}
int i;
rtems_sector_data_t *sector = NULL;
36c4: e3a03000 mov r3, #0
uint32_t here;
uint8_t *data;
rtems_part_desc_t *new_part_desc;
rtems_status_code rc;
if ((ext_part == NULL) || (ext_part->disk_desc == NULL))
36c8: e2525000 subs r5, r2, #0
* RTEMS_NO_MEMOTY if cannot allocate memory for part_desc_t strucure,
* RTEMS_INTERNAL_ERROR if other error occurs.
*/
static rtems_status_code
read_extended_partition(int fd, uint32_t start, rtems_part_desc_t *ext_part)
{
36cc: e1a09000 mov r9, r0
36d0: e1a0a001 mov sl, r1
int i;
rtems_sector_data_t *sector = NULL;
36d4: e58d3000 str r3, [sp]
uint32_t here;
uint8_t *data;
rtems_part_desc_t *new_part_desc;
rtems_status_code rc;
if ((ext_part == NULL) || (ext_part->disk_desc == NULL))
36d8: 0a000047 beq 37fc <read_extended_partition+0x13c>
36dc: e5953010 ldr r3, [r5, #16]
36e0: e3530000 cmp r3, #0
36e4: 0a000044 beq 37fc <read_extended_partition+0x13c>
{
return RTEMS_INTERNAL_ERROR;
}
/* get start sector of current extended partition */
here = ext_part->start;
36e8: e5958004 ldr r8, [r5, #4]
/* get first extended partition sector */
rc = get_sector(fd, here, §or);
36ec: e1a0200d mov r2, sp
36f0: e1a01008 mov r1, r8
36f4: ebffffa0 bl 357c <get_sector>
if (rc != RTEMS_SUCCESSFUL)
36f8: e2504000 subs r4, r0, #0
36fc: e59d0000 ldr r0, [sp]
3700: 0a000002 beq 3710 <read_extended_partition+0x50>
{
if (sector)
3704: e3500000 cmp r0, #0 <== NOT EXECUTED
3708: 1a000039 bne 37f4 <read_extended_partition+0x134> <== NOT EXECUTED
370c: ea00003b b 3800 <read_extended_partition+0x140> <== NOT EXECUTED
static bool
msdos_signature_check (rtems_sector_data_t *sector)
{
uint8_t *p = sector->data + RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_OFFSET;
return ((p[0] == RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA1) &&
3710: e5d03202 ldrb r3, [r0, #514] ; 0x202
3714: e3530055 cmp r3, #85 ; 0x55
3718: 1a000003 bne 372c <read_extended_partition+0x6c>
* RTEMS_SUCCESSFUL if success,
* RTEMS_NO_MEMOTY if cannot allocate memory for part_desc_t strucure,
* RTEMS_INTERNAL_ERROR if other error occurs.
*/
static rtems_status_code
read_extended_partition(int fd, uint32_t start, rtems_part_desc_t *ext_part)
371c: e5d04203 ldrb r4, [r0, #515] ; 0x203
3720: e24430aa sub r3, r4, #170 ; 0xaa
3724: e2734000 rsbs r4, r3, #0
3728: e0a44003 adc r4, r4, r3
if (sector)
free(sector);
return rc;
}
if (!msdos_signature_check(sector))
372c: e31400ff tst r4, #255 ; 0xff
3730: 1a000001 bne 373c <read_extended_partition+0x7c>
{
free(sector);
3734: eb00033e bl 4434 <free> <== NOT EXECUTED
3738: ea00002f b 37fc <read_extended_partition+0x13c> <== NOT EXECUTED
* RTEMS_SUCCESSFUL if success,
* RTEMS_NO_MEMOTY if cannot allocate memory for part_desc_t strucure,
* RTEMS_INTERNAL_ERROR if other error occurs.
*/
static rtems_status_code
read_extended_partition(int fd, uint32_t start, rtems_part_desc_t *ext_part)
373c: e2807e1d add r7, r0, #464 ; 0x1d0
3740: e2877002 add r7, r7, #2
}
if (!msdos_signature_check(sector))
{
free(sector);
return RTEMS_INTERNAL_ERROR;
3744: e1a06005 mov r6, r5
* RTEMS_SUCCESSFUL if success,
* RTEMS_NO_MEMOTY if cannot allocate memory for part_desc_t strucure,
* RTEMS_INTERNAL_ERROR if other error occurs.
*/
static rtems_status_code
read_extended_partition(int fd, uint32_t start, rtems_part_desc_t *ext_part)
3748: e285b010 add fp, r5, #16
374c: e2470010 sub r0, r7, #16
3750: e28d1004 add r1, sp, #4
3754: ebffffac bl 360c <data_to_part_desc.part.1>
{
/* if data_to_part_desc fails skip this partition
* and parse the next one
*/
rc = data_to_part_desc(data, &new_part_desc);
if (rc != RTEMS_SUCCESSFUL)
3758: e2504000 subs r4, r0, #0
375c: 1a000023 bne 37f0 <read_extended_partition+0x130>
{
free(sector);
return rc;
}
if (new_part_desc == NULL)
3760: e59d2004 ldr r2, [sp, #4]
3764: e3520000 cmp r2, #0
3768: 0a00001c beq 37e0 <read_extended_partition+0x120>
{
data += RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE;
continue;
}
ext_part->sub_part[i] = new_part_desc;
376c: e5862018 str r2, [r6, #24]
new_part_desc->ext_part = ext_part;
new_part_desc->disk_desc = ext_part->disk_desc;
if (is_extended(new_part_desc->sys_type))
3770: e5d21001 ldrb r1, [r2, #1]
continue;
}
ext_part->sub_part[i] = new_part_desc;
new_part_desc->ext_part = ext_part;
new_part_desc->disk_desc = ext_part->disk_desc;
3774: e5953010 ldr r3, [r5, #16]
if (is_extended(new_part_desc->sys_type))
3778: e3510005 cmp r1, #5
377c: 13510085 cmpne r1, #133 ; 0x85
data += RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE;
continue;
}
ext_part->sub_part[i] = new_part_desc;
new_part_desc->ext_part = ext_part;
3780: e5825014 str r5, [r2, #20]
new_part_desc->disk_desc = ext_part->disk_desc;
3784: e5823010 str r3, [r2, #16]
if (is_extended(new_part_desc->sys_type))
3788: 1a000007 bne 37ac <read_extended_partition+0xec>
{
new_part_desc->log_id = EMPTY_PARTITION;
new_part_desc->start += start;
378c: e5923004 ldr r3, [r2, #4]
3790: e083300a add r3, r3, sl
new_part_desc->ext_part = ext_part;
new_part_desc->disk_desc = ext_part->disk_desc;
if (is_extended(new_part_desc->sys_type))
{
new_part_desc->log_id = EMPTY_PARTITION;
3794: e5c24002 strb r4, [r2, #2]
new_part_desc->start += start;
3798: e5823004 str r3, [r2, #4]
read_extended_partition(fd, start, new_part_desc);
379c: e1a00009 mov r0, r9
37a0: e1a0100a mov r1, sl
37a4: ebffffc5 bl 36c0 <read_extended_partition>
37a8: ea00000c b 37e0 <read_extended_partition+0x120>
}
else
{
rtems_disk_desc_t *disk_desc = new_part_desc->disk_desc;
disk_desc->partitions[disk_desc->last_log_id] = new_part_desc;
37ac: e5931024 ldr r1, [r3, #36] ; 0x24
37b0: e281000a add r0, r1, #10
new_part_desc->log_id = ++disk_desc->last_log_id;
37b4: e2811001 add r1, r1, #1
37b8: e5831024 str r1, [r3, #36] ; 0x24
read_extended_partition(fd, start, new_part_desc);
}
else
{
rtems_disk_desc_t *disk_desc = new_part_desc->disk_desc;
disk_desc->partitions[disk_desc->last_log_id] = new_part_desc;
37bc: e7832100 str r2, [r3, r0, lsl #2]
new_part_desc->log_id = ++disk_desc->last_log_id;
new_part_desc->start += here;
37c0: e5923004 ldr r3, [r2, #4]
}
else
{
rtems_disk_desc_t *disk_desc = new_part_desc->disk_desc;
disk_desc->partitions[disk_desc->last_log_id] = new_part_desc;
new_part_desc->log_id = ++disk_desc->last_log_id;
37c4: e5c21002 strb r1, [r2, #2]
new_part_desc->start += here;
new_part_desc->end = new_part_desc->start + new_part_desc->size - 1;
37c8: e5921008 ldr r1, [r2, #8]
else
{
rtems_disk_desc_t *disk_desc = new_part_desc->disk_desc;
disk_desc->partitions[disk_desc->last_log_id] = new_part_desc;
new_part_desc->log_id = ++disk_desc->last_log_id;
new_part_desc->start += here;
37cc: e0883003 add r3, r8, r3
new_part_desc->end = new_part_desc->start + new_part_desc->size - 1;
37d0: e2411001 sub r1, r1, #1
else
{
rtems_disk_desc_t *disk_desc = new_part_desc->disk_desc;
disk_desc->partitions[disk_desc->last_log_id] = new_part_desc;
new_part_desc->log_id = ++disk_desc->last_log_id;
new_part_desc->start += here;
37d4: e5823004 str r3, [r2, #4]
new_part_desc->end = new_part_desc->start + new_part_desc->size - 1;
37d8: e0813003 add r3, r1, r3
37dc: e582300c str r3, [r2, #12]
37e0: e2866004 add r6, r6, #4
/* read and process up to 4 logical partition descriptors */
data = sector->data + RTEMS_IDE_PARTITION_TABLE_OFFSET;
for (i = 0; i < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER; i++)
37e4: e156000b cmp r6, fp
{
rtems_disk_desc_t *disk_desc = new_part_desc->disk_desc;
disk_desc->partitions[disk_desc->last_log_id] = new_part_desc;
new_part_desc->log_id = ++disk_desc->last_log_id;
new_part_desc->start += here;
new_part_desc->end = new_part_desc->start + new_part_desc->size - 1;
37e8: e2877010 add r7, r7, #16
/* read and process up to 4 logical partition descriptors */
data = sector->data + RTEMS_IDE_PARTITION_TABLE_OFFSET;
for (i = 0; i < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER; i++)
37ec: 1affffd6 bne 374c <read_extended_partition+0x8c>
new_part_desc->end = new_part_desc->start + new_part_desc->size - 1;
}
data += RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE;
}
free(sector);
37f0: e59d0000 ldr r0, [sp]
37f4: eb00030e bl 4434 <free>
return RTEMS_SUCCESSFUL;
37f8: ea000000 b 3800 <read_extended_partition+0x140>
rtems_part_desc_t *new_part_desc;
rtems_status_code rc;
if ((ext_part == NULL) || (ext_part->disk_desc == NULL))
{
return RTEMS_INTERNAL_ERROR;
37fc: e3a04019 mov r4, #25 <== NOT EXECUTED
}
free(sector);
return RTEMS_SUCCESSFUL;
}
3800: e1a00004 mov r0, r4
3804: e8bd8ffc pop {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000309c <realloc>:
)
{
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
309c: e59f3118 ldr r3, [pc, #280] ; 31bc <realloc+0x120>
30a0: e5932010 ldr r2, [r3, #16]
30a4: e2822001 add r2, r2, #1
void *realloc(
void *ptr,
size_t size
)
{
30a8: e92d40f1 push {r0, r4, r5, r6, r7, lr}
uintptr_t old_size;
char *new_area;
MSBUMP(realloc_calls, 1);
30ac: e5832010 str r2, [r3, #16]
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
30b0: e59f3108 ldr r3, [pc, #264] ; 31c0 <realloc+0x124>
30b4: e5933000 ldr r3, [r3]
30b8: e3530003 cmp r3, #3
void *realloc(
void *ptr,
size_t size
)
{
30bc: e1a04000 mov r4, r0
30c0: e1a05001 mov r5, r1
/*
* Do not attempt to allocate memory if in a critical section or ISR.
*/
if (_System_state_Is_up(_System_state_Get())) {
30c4: 1a000008 bne 30ec <realloc+0x50>
* This routine returns true if thread dispatch indicates
* that we are in a critical section.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Dispatch_in_critical_section(void)
{
if ( _Thread_Dispatch_disable_level == 0 )
30c8: e59f30f4 ldr r3, [pc, #244] ; 31c4 <realloc+0x128>
30cc: e5933000 ldr r3, [r3]
30d0: e3530000 cmp r3, #0
if (_Thread_Dispatch_in_critical_section())
return (void *) 0;
30d4: 13a04000 movne r4, #0
30d8: 1a000034 bne 31b0 <realloc+0x114>
if (_ISR_Nest_level > 0)
30dc: e59f20e4 ldr r2, [pc, #228] ; 31c8 <realloc+0x12c>
30e0: e5922000 ldr r2, [r2]
30e4: e3520000 cmp r2, #0
30e8: 1a00002d bne 31a4 <realloc+0x108>
}
/*
* Continue with realloc().
*/
if ( !ptr )
30ec: e3540000 cmp r4, #0
30f0: 1a000003 bne 3104 <realloc+0x68>
return malloc( size );
30f4: e1a00005 mov r0, r5
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
free( ptr );
return new_area;
}
30f8: e28dd004 add sp, sp, #4
30fc: e8bd40f0 pop {r4, r5, r6, r7, lr}
/*
* Continue with realloc().
*/
if ( !ptr )
return malloc( size );
3100: eafffd4d b 263c <malloc>
if ( !size ) {
3104: e3550000 cmp r5, #0
3108: 1a000003 bne 311c <realloc+0x80>
free( ptr );
310c: e1a00004 mov r0, r4 <== NOT EXECUTED
3110: ebfffc84 bl 2328 <free> <== NOT EXECUTED
return (void *) 0;
3114: e1a04005 mov r4, r5 <== NOT EXECUTED
3118: ea000024 b 31b0 <realloc+0x114> <== NOT EXECUTED
}
if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) {
311c: e59f60a8 ldr r6, [pc, #168] ; 31cc <realloc+0x130>
3120: e1a01004 mov r1, r4
3124: e5960000 ldr r0, [r6]
3128: e1a0200d mov r2, sp
312c: eb00127d bl 7b28 <_Protected_heap_Get_block_size>
3130: e2507000 subs r7, r0, #0
3134: 1a000004 bne 314c <realloc+0xb0>
errno = EINVAL;
3138: eb00297d bl d734 <__errno>
313c: e3a03016 mov r3, #22
3140: e5803000 str r3, [r0]
return (void *) 0;
3144: e1a04007 mov r4, r7
3148: ea000018 b 31b0 <realloc+0x114>
}
/*
* Now resize it.
*/
if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) {
314c: e5960000 ldr r0, [r6]
3150: e1a01004 mov r1, r4
3154: e1a02005 mov r2, r5
3158: eb001285 bl 7b74 <_Protected_heap_Resize_block>
315c: e3500000 cmp r0, #0
3160: 1a000012 bne 31b0 <realloc+0x114>
* 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 );
3164: e1a00005 mov r0, r5
3168: ebfffd33 bl 263c <malloc>
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
316c: e59f3048 ldr r3, [pc, #72] ; 31bc <realloc+0x120>
3170: e5932004 ldr r2, [r3, #4]
if ( !new_area ) {
3174: e2506000 subs r6, r0, #0
* and the C Standard.
*/
new_area = malloc( size );
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
3178: e2422001 sub r2, r2, #1
317c: e5832004 str r2, [r3, #4]
if ( !new_area ) {
3180: 0a000009 beq 31ac <realloc+0x110>
return (void *) 0;
}
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
3184: e59d2000 ldr r2, [sp]
3188: e1a01004 mov r1, r4
318c: e1550002 cmp r5, r2
3190: 31a02005 movcc r2, r5
3194: eb002ba0 bl e01c <memcpy>
free( ptr );
3198: e1a00004 mov r0, r4
319c: ebfffc61 bl 2328 <free>
31a0: ea000001 b 31ac <realloc+0x110>
if (_System_state_Is_up(_System_state_Get())) {
if (_Thread_Dispatch_in_critical_section())
return (void *) 0;
if (_ISR_Nest_level > 0)
return (void *) 0;
31a4: e1a04003 mov r4, r3 <== NOT EXECUTED
31a8: ea000000 b 31b0 <realloc+0x114> <== NOT EXECUTED
new_area = malloc( size );
MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */
if ( !new_area ) {
return (void *) 0;
31ac: e1a04006 mov r4, r6
memcpy( new_area, ptr, (size < old_size) ? size : old_size );
free( ptr );
return new_area;
}
31b0: e1a00004 mov r0, r4
31b4: e28dd004 add sp, sp, #4
31b8: e8bd80f0 pop {r4, r5, r6, r7, pc}
00006810 <rtems_aio_enqueue>:
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
6810: e92d41f0 push {r4, r5, r6, r7, r8, lr}
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);
6814: e59f41e4 ldr r4, [pc, #484] ; 6a00 <rtems_aio_enqueue+0x1f0>
* errno - otherwise
*/
int
rtems_aio_enqueue (rtems_aio_request *req)
{
6818: e24dd024 sub sp, sp, #36 ; 0x24
681c: e1a06000 mov r6, r0
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);
6820: e1a00004 mov r0, r4
6824: eb000255 bl 7180 <pthread_mutex_lock>
if (result != 0) {
6828: e2505000 subs r5, r0, #0
682c: 0a000002 beq 683c <rtems_aio_enqueue+0x2c>
free (req);
6830: e1a00006 mov r0, r6 <== NOT EXECUTED
6834: ebfff02a bl 28e4 <free> <== NOT EXECUTED
return result;
6838: ea00006d b 69f4 <rtems_aio_enqueue+0x1e4> <== 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);
683c: eb000464 bl 79d4 <pthread_self>
6840: e28d1020 add r1, sp, #32
6844: e1a0200d mov r2, sp
6848: eb000370 bl 7610 <pthread_getschedparam>
req->caller_thread = pthread_self ();
684c: eb000460 bl 79d4 <pthread_self>
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
6850: e5963014 ldr r3, [r6, #20]
6854: e59d1000 ldr r1, [sp]
6858: e5932014 ldr r2, [r3, #20]
685c: e0622001 rsb r2, r2, r1
6860: e586200c str r2, [r6, #12]
req->policy = policy;
6864: e59d2020 ldr r2, [sp, #32]
6868: e5862008 str r2, [r6, #8]
req->aiocbp->error_code = EINPROGRESS;
686c: e3a02077 mov r2, #119 ; 0x77
/* _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 ();
6870: e5860010 str r0, [r6, #16]
req->priority = param.sched_priority - req->aiocbp->aio_reqprio;
req->policy = policy;
req->aiocbp->error_code = EINPROGRESS;
6874: e5832030 str r2, [r3, #48] ; 0x30
req->aiocbp->return_value = 0;
if ((aio_request_queue.idle_threads == 0) &&
6878: e5942068 ldr r2, [r4, #104] ; 0x68
687c: e3520000 cmp r2, #0
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;
6880: e5835034 str r5, [r3, #52] ; 0x34
if ((aio_request_queue.idle_threads == 0) &&
6884: 1a00002d bne 6940 <rtems_aio_enqueue+0x130>
6888: e5942064 ldr r2, [r4, #100] ; 0x64
688c: e3520004 cmp r2, #4
6890: ca00002a bgt 6940 <rtems_aio_enqueue+0x130>
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);
6894: e5931000 ldr r1, [r3]
6898: e2840048 add r0, r4, #72 ; 0x48
689c: e3a02001 mov r2, #1
68a0: ebffff83 bl 66b4 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
68a4: e5903018 ldr r3, [r0, #24]
68a8: e3530001 cmp r3, #1
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);
68ac: e1a07000 mov r7, r0
68b0: e2808008 add r8, r0, #8
if (r_chain->new_fd == 1) {
68b4: 1a000017 bne 6918 <rtems_aio_enqueue+0x108>
RTEMS_INLINE_ROUTINE void _Chain_Prepend(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert(_Chain_Head(the_chain), the_node);
68b8: e1a01006 mov r1, r6
68bc: e1a00008 mov r0, r8
68c0: eb000890 bl 8b08 <_Chain_Insert>
rtems_chain_prepend (&r_chain->perfd, &req->next_prio);
r_chain->new_fd = 0;
pthread_mutex_init (&r_chain->mutex, NULL);
68c4: e1a01005 mov r1, r5
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;
68c8: e5875018 str r5, [r7, #24]
pthread_mutex_init (&r_chain->mutex, NULL);
68cc: e287001c add r0, r7, #28
68d0: eb0001d9 bl 703c <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
68d4: e1a01005 mov r1, r5
68d8: e2870020 add r0, r7, #32
68dc: eb0000ef bl 6ca0 <pthread_cond_init>
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
68e0: e1a03007 mov r3, r7
68e4: e28d001c add r0, sp, #28
68e8: e2841008 add r1, r4, #8
68ec: e59f2110 ldr r2, [pc, #272] ; 6a04 <rtems_aio_enqueue+0x1f4>
68f0: eb0002b1 bl 73bc <pthread_create>
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
68f4: e2506000 subs r6, r0, #0
pthread_mutex_unlock (&aio_request_queue.mutex);
return result;
}
++aio_request_queue.active_threads;
68f8: 05943064 ldreq r3, [r4, #100] ; 0x64
68fc: 02833001 addeq r3, r3, #1
6900: 05843064 streq r3, [r4, #100] ; 0x64
pthread_cond_init (&r_chain->cond, NULL);
AIO_printf ("New thread \n");
result = pthread_create (&thid, &aio_request_queue.attr,
rtems_aio_handle, (void *) r_chain);
if (result != 0) {
6904: 0a000038 beq 69ec <rtems_aio_enqueue+0x1dc>
pthread_mutex_unlock (&aio_request_queue.mutex);
6908: e1a00004 mov r0, r4 <== NOT EXECUTED
690c: eb00023a bl 71fc <pthread_mutex_unlock> <== NOT EXECUTED
return result;
6910: e1a05006 mov r5, r6 <== NOT EXECUTED
6914: ea000036 b 69f4 <rtems_aio_enqueue+0x1e4> <== NOT EXECUTED
}
++aio_request_queue.active_threads;
}
else {
/* put request in the fd chain it belongs to */
pthread_mutex_lock (&r_chain->mutex);
6918: e280401c add r4, r0, #28
691c: e1a00004 mov r0, r4
6920: eb000216 bl 7180 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
6924: e1a00008 mov r0, r8
6928: e1a01006 mov r1, r6
692c: ebffff1c bl 65a4 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
6930: e2870020 add r0, r7, #32
6934: eb000109 bl 6d60 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
6938: e1a00004 mov r0, r4
693c: ea00000e b 697c <rtems_aio_enqueue+0x16c>
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,
6940: e59f00c0 ldr r0, [pc, #192] ; 6a08 <rtems_aio_enqueue+0x1f8>
6944: e5931000 ldr r1, [r3]
6948: e3a02000 mov r2, #0
694c: ebffff58 bl 66b4 <rtems_aio_search_fd>
req->aiocbp->aio_fildes, 0);
if (r_chain != NULL)
6950: e2504000 subs r4, r0, #0
6954: 0a00000a beq 6984 <rtems_aio_enqueue+0x174>
{
pthread_mutex_lock (&r_chain->mutex);
6958: e284701c add r7, r4, #28
695c: e1a00007 mov r0, r7
6960: eb000206 bl 7180 <pthread_mutex_lock>
rtems_aio_insert_prio (&r_chain->perfd, req);
6964: e2840008 add r0, r4, #8
6968: e1a01006 mov r1, r6
696c: ebffff0c bl 65a4 <rtems_aio_insert_prio>
pthread_cond_signal (&r_chain->cond);
6970: e2840020 add r0, r4, #32
6974: eb0000f9 bl 6d60 <pthread_cond_signal>
pthread_mutex_unlock (&r_chain->mutex);
6978: e1a00007 mov r0, r7
697c: eb00021e bl 71fc <pthread_mutex_unlock>
6980: ea000019 b 69ec <rtems_aio_enqueue+0x1dc>
} else {
/* or to the idle chain */
chain = &aio_request_queue.idle_req;
r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1);
6984: e5963014 ldr r3, [r6, #20]
6988: e59f007c ldr r0, [pc, #124] ; 6a0c <rtems_aio_enqueue+0x1fc>
698c: e5931000 ldr r1, [r3]
6990: e3a02001 mov r2, #1
6994: ebffff46 bl 66b4 <rtems_aio_search_fd>
if (r_chain->new_fd == 1) {
6998: e5903018 ldr r3, [r0, #24]
699c: e3530001 cmp r3, #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);
69a0: e1a07000 mov r7, r0
69a4: e1a01006 mov r1, r6
69a8: e2800008 add r0, r0, #8
if (r_chain->new_fd == 1) {
69ac: 1a000008 bne 69d4 <rtems_aio_enqueue+0x1c4>
69b0: eb000854 bl 8b08 <_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);
69b4: e1a01004 mov r1, r4
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;
69b8: e5874018 str r4, [r7, #24]
pthread_mutex_init (&r_chain->mutex, NULL);
69bc: e287001c add r0, r7, #28
69c0: eb00019d bl 703c <pthread_mutex_init>
pthread_cond_init (&r_chain->cond, NULL);
69c4: e2870020 add r0, r7, #32
69c8: e1a01004 mov r1, r4
69cc: eb0000b3 bl 6ca0 <pthread_cond_init>
69d0: ea000000 b 69d8 <rtems_aio_enqueue+0x1c8>
} else
/* just insert the request in the existing fd chain */
rtems_aio_insert_prio (&r_chain->perfd, req);
69d4: ebfffef2 bl 65a4 <rtems_aio_insert_prio>
if (aio_request_queue.idle_threads > 0)
69d8: e59f0020 ldr r0, [pc, #32] ; 6a00 <rtems_aio_enqueue+0x1f0>
69dc: e5903068 ldr r3, [r0, #104] ; 0x68
69e0: e3530000 cmp r3, #0
pthread_cond_signal (&aio_request_queue.new_req);
69e4: c2800004 addgt r0, r0, #4
69e8: cb0000dc blgt 6d60 <pthread_cond_signal>
}
}
pthread_mutex_unlock (&aio_request_queue.mutex);
69ec: e59f000c ldr r0, [pc, #12] ; 6a00 <rtems_aio_enqueue+0x1f0>
69f0: eb000201 bl 71fc <pthread_mutex_unlock>
return 0;
}
69f4: e1a00005 mov r0, r5
69f8: e28dd024 add sp, sp, #36 ; 0x24
69fc: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
00006338 <rtems_aio_handle>:
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
6338: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
633c: e59f425c ldr r4, [pc, #604] ; 65a0 <rtems_aio_handle+0x268>
* NULL - if error
*/
static void *
rtems_aio_handle (void *arg)
{
6340: e24dd02c sub sp, sp, #44 ; 0x2c
6344: e1a05000 mov r5, r0
rtems_chain_node *node;
node = rtems_chain_first (&aio_request_queue.work_req);
temp = (rtems_aio_request_chain *) node;
while (temp->fildes < r_chain->fildes &&
6348: e284904c add r9, r4, #76 ; 0x4c
/* 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);
634c: e285801c add r8, r5, #28
6350: e1a00008 mov r0, r8
6354: eb000389 bl 7180 <pthread_mutex_lock>
if (result != 0)
6358: e250a000 subs sl, r0, #0
635c: 1a00008c bne 6594 <rtems_aio_handle+0x25c>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
6360: e5956008 ldr r6, [r5, #8]
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
6364: e285300c add r3, r5, #12
/* If the locked chain is not empty, take the first
request extract it, unlock the chain and process
the request, in this way the user can supply more
requests to this fd chain */
if (!rtems_chain_is_empty (chain)) {
6368: e1560003 cmp r6, r3
636c: 0a000035 beq 6448 <rtems_aio_handle+0x110>
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);
6370: eb000597 bl 79d4 <pthread_self>
6374: e28d1028 add r1, sp, #40 ; 0x28
6378: e28d2004 add r2, sp, #4
637c: eb0004a3 bl 7610 <pthread_getschedparam>
param.sched_priority = req->priority;
6380: e596300c ldr r3, [r6, #12]
6384: e58d3004 str r3, [sp, #4]
pthread_setschedparam (pthread_self(), req->policy, ¶m);
6388: eb000591 bl 79d4 <pthread_self>
638c: e28d2004 add r2, sp, #4
6390: e5961008 ldr r1, [r6, #8]
6394: eb000593 bl 79e8 <pthread_setschedparam>
6398: e1a00006 mov r0, r6
639c: eb0009c4 bl 8ab4 <_Chain_Extract>
rtems_chain_extract (node);
pthread_mutex_unlock (&r_chain->mutex);
63a0: e1a00008 mov r0, r8
63a4: eb000394 bl 71fc <pthread_mutex_unlock>
switch (req->aiocbp->aio_lio_opcode) {
63a8: e5962014 ldr r2, [r6, #20]
63ac: e592302c ldr r3, [r2, #44] ; 0x2c
63b0: e3530002 cmp r3, #2
63b4: 0a00000b beq 63e8 <rtems_aio_handle+0xb0>
63b8: e3530003 cmp r3, #3
63bc: 0a000011 beq 6408 <rtems_aio_handle+0xd0>
63c0: e3530001 cmp r3, #1
63c4: 1a000013 bne 6418 <rtems_aio_handle+0xe0>
case LIO_READ:
AIO_printf ("read\n");
result = pread (req->aiocbp->aio_fildes,
63c8: e5921008 ldr r1, [r2, #8]
63cc: e5923004 ldr r3, [r2, #4]
63d0: e58d1000 str r1, [sp]
63d4: e282100c add r1, r2, #12
63d8: e5920000 ldr r0, [r2]
63dc: e8910006 ldm r1, {r1, r2}
63e0: eb00281b bl 10454 <pread>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
63e4: ea000009 b 6410 <rtems_aio_handle+0xd8>
case LIO_WRITE:
AIO_printf ("write\n");
result = pwrite (req->aiocbp->aio_fildes,
63e8: e5921008 ldr r1, [r2, #8]
63ec: e5923004 ldr r3, [r2, #4]
63f0: e58d1000 str r1, [sp]
63f4: e282100c add r1, r2, #12
63f8: e5920000 ldr r0, [r2]
63fc: e8910006 ldm r1, {r1, r2}
6400: eb002856 bl 10560 <pwrite>
(void *) req->aiocbp->aio_buf,
req->aiocbp->aio_nbytes, req->aiocbp->aio_offset);
break;
6404: ea000001 b 6410 <rtems_aio_handle+0xd8>
case LIO_SYNC:
AIO_printf ("sync\n");
result = fsync (req->aiocbp->aio_fildes);
6408: e5920000 ldr r0, [r2] <== NOT EXECUTED
640c: eb001907 bl c830 <fsync> <== NOT EXECUTED
break;
default:
result = -1;
}
if (result == -1) {
6410: e3700001 cmn r0, #1
6414: 1a000006 bne 6434 <rtems_aio_handle+0xfc>
req->aiocbp->return_value = -1;
6418: e5966014 ldr r6, [r6, #20] <== NOT EXECUTED
641c: e3e03000 mvn r3, #0 <== NOT EXECUTED
6420: e5863034 str r3, [r6, #52] ; 0x34 <== NOT EXECUTED
req->aiocbp->error_code = errno;
6424: eb002530 bl f8ec <__errno> <== NOT EXECUTED
6428: e5903000 ldr r3, [r0] <== NOT EXECUTED
642c: e5863030 str r3, [r6, #48] ; 0x30 <== NOT EXECUTED
6430: eaffffc5 b 634c <rtems_aio_handle+0x14> <== NOT EXECUTED
} else {
req->aiocbp->return_value = result;
6434: e5963014 ldr r3, [r6, #20]
req->aiocbp->error_code = 0;
6438: e3a02000 mov r2, #0
}
if (result == -1) {
req->aiocbp->return_value = -1;
req->aiocbp->error_code = errno;
} else {
req->aiocbp->return_value = result;
643c: e5830034 str r0, [r3, #52] ; 0x34
req->aiocbp->error_code = 0;
6440: e5832030 str r2, [r3, #48] ; 0x30
6444: eaffffc0 b 634c <rtems_aio_handle+0x14>
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
pthread_mutex_lock (&aio_request_queue.mutex);
6448: e59f7150 ldr r7, [pc, #336] ; 65a0 <rtems_aio_handle+0x268>
struct timespec timeout;
AIO_printf ("Chain is empty [WQ], wait for work\n");
pthread_mutex_unlock (&r_chain->mutex);
644c: e1a00008 mov r0, r8
6450: eb000369 bl 71fc <pthread_mutex_unlock>
pthread_mutex_lock (&aio_request_queue.mutex);
6454: e1a00007 mov r0, r7
6458: eb000348 bl 7180 <pthread_mutex_lock>
if (rtems_chain_is_empty (chain))
645c: e5953008 ldr r3, [r5, #8]
6460: e1530006 cmp r3, r6
6464: 1a000047 bne 6588 <rtems_aio_handle+0x250>
{
clock_gettime (CLOCK_REALTIME, &timeout);
6468: e28d1020 add r1, sp, #32
646c: e3a00001 mov r0, #1
6470: eb0001b0 bl 6b38 <clock_gettime>
timeout.tv_sec += 3;
6474: e59d3020 ldr r3, [sp, #32]
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
6478: e2856020 add r6, r5, #32
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
647c: e2833003 add r3, r3, #3
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&r_chain->cond,
6480: e1a00006 mov r0, r6
6484: e1a01007 mov r1, r7
6488: e28d2020 add r2, sp, #32
pthread_mutex_lock (&aio_request_queue.mutex);
if (rtems_chain_is_empty (chain))
{
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
648c: e58d3020 str r3, [sp, #32]
timeout.tv_nsec = 0;
6490: e58da024 str sl, [sp, #36] ; 0x24
result = pthread_cond_timedwait (&r_chain->cond,
6494: eb000248 bl 6dbc <pthread_cond_timedwait>
&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) {
6498: e3500074 cmp r0, #116 ; 0x74
649c: 1a000039 bne 6588 <rtems_aio_handle+0x250>
64a0: e1a00005 mov r0, r5
64a4: eb000982 bl 8ab4 <_Chain_Extract>
rtems_chain_extract (&r_chain->next_fd);
pthread_mutex_destroy (&r_chain->mutex);
64a8: e1a00008 mov r0, r8
64ac: eb000296 bl 6f0c <pthread_mutex_destroy>
pthread_cond_destroy (&r_chain->cond);
64b0: e1a00006 mov r0, r6
64b4: eb0001c9 bl 6be0 <pthread_cond_destroy>
free (r_chain);
64b8: e1a00005 mov r0, r5
64bc: ebfff108 bl 28e4 <free>
/* 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)) {
64c0: e5942054 ldr r2, [r4, #84] ; 0x54
64c4: e2873058 add r3, r7, #88 ; 0x58
64c8: e1520003 cmp r2, r3
64cc: 1a000018 bne 6534 <rtems_aio_handle+0x1fc>
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
64d0: e5943068 ldr r3, [r4, #104] ; 0x68
64d4: e2833001 add r3, r3, #1
64d8: e5843068 str r3, [r4, #104] ; 0x68
--aio_request_queue.active_threads;
64dc: e5943064 ldr r3, [r4, #100] ; 0x64
clock_gettime (CLOCK_REALTIME, &timeout);
64e0: e28d1020 add r1, sp, #32
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
--aio_request_queue.active_threads;
64e4: e2433001 sub r3, r3, #1
clock_gettime (CLOCK_REALTIME, &timeout);
64e8: e3a00001 mov r0, #1
signal. The thread now becomes idle. */
if (rtems_chain_is_empty (&aio_request_queue.idle_req)) {
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
--aio_request_queue.active_threads;
64ec: e5843064 str r3, [r4, #100] ; 0x64
clock_gettime (CLOCK_REALTIME, &timeout);
64f0: eb000190 bl 6b38 <clock_gettime>
timeout.tv_sec += 3;
64f4: e59d3020 ldr r3, [sp, #32]
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
64f8: e2870004 add r0, r7, #4
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
64fc: e2833003 add r3, r3, #3
timeout.tv_nsec = 0;
result = pthread_cond_timedwait (&aio_request_queue.new_req,
6500: e1a01007 mov r1, r7
6504: e28d2020 add r2, sp, #32
AIO_printf ("Chain is empty [IQ], wait for work\n");
++aio_request_queue.idle_threads;
--aio_request_queue.active_threads;
clock_gettime (CLOCK_REALTIME, &timeout);
timeout.tv_sec += 3;
6508: e58d3020 str r3, [sp, #32]
timeout.tv_nsec = 0;
650c: e58da024 str sl, [sp, #36] ; 0x24
result = pthread_cond_timedwait (&aio_request_queue.new_req,
6510: eb000229 bl 6dbc <pthread_cond_timedwait>
&aio_request_queue.mutex,
&timeout);
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
6514: e3500074 cmp r0, #116 ; 0x74
6518: 1a000005 bne 6534 <rtems_aio_handle+0x1fc>
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
651c: e5973068 ldr r3, [r7, #104] ; 0x68
pthread_mutex_unlock (&aio_request_queue.mutex);
6520: e1a00007 mov r0, r7
/* If no new fd chain was added in the idle requests
then this thread is finished */
if (result == ETIMEDOUT) {
AIO_printf ("Etimeout\n");
--aio_request_queue.idle_threads;
6524: e2433001 sub r3, r3, #1
6528: e5873068 str r3, [r7, #104] ; 0x68
pthread_mutex_unlock (&aio_request_queue.mutex);
652c: eb000332 bl 71fc <pthread_mutex_unlock>
return NULL;
6530: ea000017 b 6594 <rtems_aio_handle+0x25c>
}
}
/* Otherwise move this chain to the working chain and
start the loop all over again */
AIO_printf ("Work on idle\n");
--aio_request_queue.idle_threads;
6534: e5943068 ldr r3, [r4, #104] ; 0x68
6538: e2433001 sub r3, r3, #1
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
653c: e5945054 ldr r5, [r4, #84] ; 0x54
6540: e5843068 str r3, [r4, #104] ; 0x68
++aio_request_queue.active_threads;
6544: e5943064 ldr r3, [r4, #100] ; 0x64
6548: e1a00005 mov r0, r5
654c: e2833001 add r3, r3, #1
6550: e5843064 str r3, [r4, #100] ; 0x64
6554: eb000956 bl 8ab4 <_Chain_Extract>
6558: e5943048 ldr r3, [r4, #72] ; 0x48
rtems_chain_node *node;
node = rtems_chain_first (&aio_request_queue.work_req);
temp = (rtems_aio_request_chain *) node;
while (temp->fildes < r_chain->fildes &&
655c: e5952014 ldr r2, [r5, #20]
6560: ea000000 b 6568 <rtems_aio_handle+0x230>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Next(
Chain_Node *the_node
)
{
return the_node->next;
6564: e5933000 ldr r3, [r3]
6568: e5931014 ldr r1, [r3, #20]
656c: e1510002 cmp r1, r2
6570: aa000001 bge 657c <rtems_aio_handle+0x244>
6574: e1530009 cmp r3, r9
6578: 1afffff9 bne 6564 <rtems_aio_handle+0x22c>
RTEMS_INLINE_ROUTINE void rtems_chain_insert(
rtems_chain_node *after_node,
rtems_chain_node *the_node
)
{
_Chain_Insert( after_node, the_node );
657c: e5930004 ldr r0, [r3, #4]
6580: e1a01005 mov r1, r5
6584: eb00095f bl 8b08 <_Chain_Insert>
}
}
/* 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);
6588: e59f0010 ldr r0, [pc, #16] ; 65a0 <rtems_aio_handle+0x268>
658c: eb00031a bl 71fc <pthread_mutex_unlock>
6590: eaffff6d b 634c <rtems_aio_handle+0x14>
}
}
AIO_printf ("Thread finished\n");
return NULL;
}
6594: e3a00000 mov r0, #0
6598: e28dd02c add sp, sp, #44 ; 0x2c
659c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
000065f4 <rtems_aio_init>:
* 0 - if initialization succeeded
*/
int
rtems_aio_init (void)
{
65f4: e92d4010 push {r4, lr}
int result = 0;
result = pthread_attr_init (&aio_request_queue.attr);
65f8: e59f00a4 ldr r0, [pc, #164] ; 66a4 <rtems_aio_init+0xb0>
65fc: eb00034f bl 7340 <pthread_attr_init>
if (result != 0)
6600: e2504000 subs r4, r0, #0
6604: 1a000024 bne 669c <rtems_aio_init+0xa8>
return result;
result =
6608: e59f0094 ldr r0, [pc, #148] ; 66a4 <rtems_aio_init+0xb0>
660c: e1a01004 mov r1, r4
6610: eb00035b bl 7384 <pthread_attr_setdetachstate>
pthread_attr_setdetachstate (&aio_request_queue.attr,
PTHREAD_CREATE_DETACHED);
if (result != 0)
6614: e3500000 cmp r0, #0
pthread_attr_destroy (&aio_request_queue.attr);
6618: 159f0084 ldrne r0, [pc, #132] ; 66a4 <rtems_aio_init+0xb0>
661c: 1b00033e blne 731c <pthread_attr_destroy>
result = pthread_mutex_init (&aio_request_queue.mutex, NULL);
6620: e59f0080 ldr r0, [pc, #128] ; 66a8 <rtems_aio_init+0xb4>
6624: e3a01000 mov r1, #0
6628: eb000283 bl 703c <pthread_mutex_init>
if (result != 0)
662c: e3500000 cmp r0, #0
pthread_attr_destroy (&aio_request_queue.attr);
6630: 159f006c ldrne r0, [pc, #108] ; 66a4 <rtems_aio_init+0xb0>
6634: 1b000338 blne 731c <pthread_attr_destroy>
result = pthread_cond_init (&aio_request_queue.new_req, NULL);
6638: e59f006c ldr r0, [pc, #108] ; 66ac <rtems_aio_init+0xb8>
663c: e3a01000 mov r1, #0
6640: eb000196 bl 6ca0 <pthread_cond_init>
if (result != 0) {
6644: e2504000 subs r4, r0, #0
6648: 0a000003 beq 665c <rtems_aio_init+0x68>
pthread_mutex_destroy (&aio_request_queue.mutex);
664c: e59f0054 ldr r0, [pc, #84] ; 66a8 <rtems_aio_init+0xb4> <== NOT EXECUTED
6650: eb00022d bl 6f0c <pthread_mutex_destroy> <== NOT EXECUTED
pthread_attr_destroy (&aio_request_queue.attr);
6654: e59f0048 ldr r0, [pc, #72] ; 66a4 <rtems_aio_init+0xb0> <== NOT EXECUTED
6658: eb00032f bl 731c <pthread_attr_destroy> <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
665c: e59f3044 ldr r3, [pc, #68] ; 66a8 <rtems_aio_init+0xb4>
6660: e283204c add r2, r3, #76 ; 0x4c
head->previous = NULL;
tail->previous = head;
6664: e2831048 add r1, r3, #72 ; 0x48
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
6668: e5832048 str r2, [r3, #72] ; 0x48
head->previous = NULL;
666c: e3a02000 mov r2, #0
6670: e583204c str r2, [r3, #76] ; 0x4c
tail->previous = head;
6674: e5831050 str r1, [r3, #80] ; 0x50
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
6678: e5832058 str r2, [r3, #88] ; 0x58
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
667c: e2831058 add r1, r3, #88 ; 0x58
}
rtems_chain_initialize_empty (&aio_request_queue.work_req);
rtems_chain_initialize_empty (&aio_request_queue.idle_req);
aio_request_queue.active_threads = 0;
6680: e5832064 str r2, [r3, #100] ; 0x64
aio_request_queue.idle_threads = 0;
6684: e5832068 str r2, [r3, #104] ; 0x68
aio_request_queue.initialized = AIO_QUEUE_INITIALIZED;
6688: e59f2020 ldr r2, [pc, #32] ; 66b0 <rtems_aio_init+0xbc>
668c: e5831054 str r1, [r3, #84] ; 0x54
head->previous = NULL;
tail->previous = head;
6690: e2831054 add r1, r3, #84 ; 0x54
6694: e583105c str r1, [r3, #92] ; 0x5c
6698: e5832060 str r2, [r3, #96] ; 0x60
return result;
}
669c: e1a00004 mov r0, r4
66a0: e8bd8010 pop {r4, pc}
000065a4 <rtems_aio_insert_prio>:
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
65a4: e1a02000 mov r2, r0
65a8: e4923004 ldr r3, [r2], #4
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
65ac: e1530002 cmp r3, r2
* NONE
*/
static void
rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req)
{
65b0: e1a0c001 mov ip, r1
rtems_chain_node *node;
AIO_printf ("FD exists \n");
node = rtems_chain_first (chain);
if (rtems_chain_is_empty (chain)) {
65b4: 0a00000d beq 65f0 <rtems_aio_insert_prio+0x4c>
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;
65b8: e5931014 ldr r1, [r3, #20]
while (req->aiocbp->aio_reqprio > prio &&
65bc: e59c0014 ldr r0, [ip, #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;
65c0: e5911014 ldr r1, [r1, #20]
while (req->aiocbp->aio_reqprio > prio &&
65c4: e5900014 ldr r0, [r0, #20]
65c8: ea000002 b 65d8 <rtems_aio_insert_prio+0x34>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Next(
Chain_Node *the_node
)
{
return the_node->next;
65cc: e5933000 ldr r3, [r3] <== NOT EXECUTED
!rtems_chain_is_tail (chain, node)) {
node = rtems_chain_next (node);
prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
65d0: e5931014 ldr r1, [r3, #20] <== NOT EXECUTED
65d4: e5911014 ldr r1, [r1, #20] <== NOT EXECUTED
rtems_chain_prepend (chain, &req->next_prio);
} else {
AIO_printf ("Add by priority \n");
int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio;
while (req->aiocbp->aio_reqprio > prio &&
65d8: e1500001 cmp r0, r1
65dc: da000001 ble 65e8 <rtems_aio_insert_prio+0x44>
65e0: e1530002 cmp r3, r2 <== NOT EXECUTED
65e4: 1afffff8 bne 65cc <rtems_aio_insert_prio+0x28> <== NOT EXECUTED
65e8: e5930004 ldr r0, [r3, #4]
65ec: e1a0100c mov r1, ip
65f0: ea000944 b 8b08 <_Chain_Insert>
000067a8 <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)
{
67a8: e92d4010 push {r4, lr}
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
67ac: e4904004 ldr r4, [r0], #4
if (rtems_chain_is_empty (chain))
67b0: e1540000 cmp r4, r0
67b4: 1a000005 bne 67d0 <rtems_aio_remove_req+0x28>
67b8: ea000012 b 6808 <rtems_aio_remove_req+0x60>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Next(
Chain_Node *the_node
)
{
return the_node->next;
67bc: e5944000 ldr r4, [r4] <== 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) {
67c0: e1540000 cmp r4, r0 <== NOT EXECUTED
67c4: 1a000001 bne 67d0 <rtems_aio_remove_req+0x28> <== NOT EXECUTED
node = rtems_chain_next (node);
current = (rtems_aio_request *) node;
}
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
67c8: e3a00001 mov r0, #1 <== NOT EXECUTED
67cc: e8bd8010 pop {r4, pc} <== 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) {
67d0: e5943014 ldr r3, [r4, #20]
67d4: e1530001 cmp r3, r1
67d8: 1afffff7 bne 67bc <rtems_aio_remove_req+0x14>
67dc: e1a00004 mov r0, r4
67e0: eb0008b3 bl 8ab4 <_Chain_Extract>
if (rtems_chain_is_tail (chain, node))
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
67e4: e5943014 ldr r3, [r4, #20]
67e8: e3a0208c mov r2, #140 ; 0x8c
67ec: e5832030 str r2, [r3, #48] ; 0x30
current->aiocbp->return_value = -1;
67f0: e3e02000 mvn r2, #0
free (current);
67f4: e1a00004 mov r0, r4
return AIO_NOTCANCELED;
else
{
rtems_chain_extract (node);
current->aiocbp->error_code = ECANCELED;
current->aiocbp->return_value = -1;
67f8: e5832034 str r2, [r3, #52] ; 0x34
free (current);
67fc: ebfff038 bl 28e4 <free>
}
return AIO_CANCELED;
6800: e3a00000 mov r0, #0
6804: e8bd8010 pop {r4, pc}
*/
int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp)
{
if (rtems_chain_is_empty (chain))
return AIO_ALLDONE;
6808: e3a00002 mov r0, #2
current->aiocbp->return_value = -1;
free (current);
}
return AIO_CANCELED;
}
680c: e8bd8010 pop {r4, pc}
0000b228 <rtems_bdbuf_add_to_modified_list_after_access>:
}
static void
rtems_bdbuf_add_to_modified_list_after_access (rtems_bdbuf_buffer *bd)
{
if (bdbuf_cache.sync_active && bdbuf_cache.sync_device == bd->dd)
b228: e59f3098 ldr r3, [pc, #152] ; b2c8 <rtems_bdbuf_add_to_modified_list_after_access+0xa0>
b22c: e5d32030 ldrb r2, [r3, #48] ; 0x30
b230: e3520000 cmp r2, #0
}
}
static void
rtems_bdbuf_add_to_modified_list_after_access (rtems_bdbuf_buffer *bd)
{
b234: e92d4010 push {r4, lr}
b238: e1a04000 mov r4, r0
if (bdbuf_cache.sync_active && bdbuf_cache.sync_device == bd->dd)
b23c: 0a000007 beq b260 <rtems_bdbuf_add_to_modified_list_after_access+0x38>
b240: e5932038 ldr r2, [r3, #56] ; 0x38 <== NOT EXECUTED
b244: e5903014 ldr r3, [r0, #20] <== NOT EXECUTED
b248: e1520003 cmp r2, r3 <== NOT EXECUTED
b24c: 1a000003 bne b260 <rtems_bdbuf_add_to_modified_list_after_access+0x38><== NOT EXECUTED
{
rtems_bdbuf_unlock_cache ();
b250: ebffff37 bl af34 <rtems_bdbuf_unlock_cache> <== NOT EXECUTED
/*
* Wait for the sync lock.
*/
rtems_bdbuf_lock_sync ();
b254: ebffff28 bl aefc <rtems_bdbuf_lock_sync> <== NOT EXECUTED
rtems_bdbuf_unlock_sync ();
b258: ebffff3e bl af58 <rtems_bdbuf_unlock_sync> <== NOT EXECUTED
rtems_bdbuf_lock_cache ();
b25c: ebffff1b bl aed0 <rtems_bdbuf_lock_cache> <== NOT EXECUTED
* difficult question. Is a snapshot of a block that is changing better than
* nothing being written? We have tended to think we should hold changes for
* only a specific period of time even if still changing and get onto disk
* and letting the file system try and recover this position if it can.
*/
if (bd->state == RTEMS_BDBUF_STATE_ACCESS_CACHED
b260: e5943020 ldr r3, [r4, #32]
b264: e3530003 cmp r3, #3
b268: 13530005 cmpne r3, #5
|| bd->state == RTEMS_BDBUF_STATE_ACCESS_EMPTY)
bd->hold_timer = bdbuf_config.swap_block_hold;
b26c: 059f3058 ldreq r3, [pc, #88] ; b2cc <rtems_bdbuf_add_to_modified_list_after_access+0xa4>
b270: 05933010 ldreq r3, [r3, #16]
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
b274: e59f004c ldr r0, [pc, #76] ; b2c8 <rtems_bdbuf_add_to_modified_list_after_access+0xa0>
b278: 0584302c streq r3, [r4, #44] ; 0x2c
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
b27c: e3a03007 mov r3, #7
b280: e5843020 str r3, [r4, #32]
b284: e5903054 ldr r3, [r0, #84] ; 0x54
the_node->next = tail;
b288: e2802050 add r2, r0, #80 ; 0x50
b28c: e5842000 str r2, [r4]
tail->previous = the_node;
b290: e5804054 str r4, [r0, #84] ; 0x54
old_last->next = the_node;
b294: e5834000 str r4, [r3]
the_node->previous = old_last;
b298: e5843004 str r3, [r4, #4]
bd->hold_timer = bdbuf_config.swap_block_hold;
rtems_bdbuf_set_state (bd, RTEMS_BDBUF_STATE_MODIFIED);
rtems_chain_append_unprotected (&bdbuf_cache.modified, &bd->link);
if (bd->waiters)
b29c: e5943024 ldr r3, [r4, #36] ; 0x24
b2a0: e3530000 cmp r3, #0
b2a4: 0a000002 beq b2b4 <rtems_bdbuf_add_to_modified_list_after_access+0x8c>
rtems_bdbuf_wake (&bdbuf_cache.access_waiters);
b2a8: e2800064 add r0, r0, #100 ; 0x64
else if (rtems_bdbuf_has_buffer_waiters ())
rtems_bdbuf_wake_swapper ();
}
b2ac: e8bd4010 pop {r4, lr}
rtems_bdbuf_set_state (bd, RTEMS_BDBUF_STATE_MODIFIED);
rtems_chain_append_unprotected (&bdbuf_cache.modified, &bd->link);
if (bd->waiters)
rtems_bdbuf_wake (&bdbuf_cache.access_waiters);
b2b0: eaffffd2 b b200 <rtems_bdbuf_wake>
else if (rtems_bdbuf_has_buffer_waiters ())
b2b4: e5903074 ldr r3, [r0, #116] ; 0x74
b2b8: e3530000 cmp r3, #0
b2bc: 08bd8010 popeq {r4, pc}
rtems_bdbuf_wake_swapper ();
}
b2c0: e8bd4010 pop {r4, lr}
rtems_chain_append_unprotected (&bdbuf_cache.modified, &bd->link);
if (bd->waiters)
rtems_bdbuf_wake (&bdbuf_cache.access_waiters);
else if (rtems_bdbuf_has_buffer_waiters ())
rtems_bdbuf_wake_swapper ();
b2c4: eaffff2c b af7c <rtems_bdbuf_wake_swapper>
0000b02c <rtems_bdbuf_anonymous_wait>:
rtems_mode prev_mode;
/*
* Indicate we are waiting.
*/
++waiters->count;
b02c: e5903000 ldr r3, [r0]
b030: e2833001 add r3, r3, #1
* The function assumes the cache is locked on entry and it will be locked on
* exit.
*/
static void
rtems_bdbuf_anonymous_wait (rtems_bdbuf_waiters *waiters)
{
b034: e92d4030 push {r4, r5, lr}
rtems_mode prev_mode;
/*
* Indicate we are waiting.
*/
++waiters->count;
b038: e5803000 str r3, [r0]
* The function assumes the cache is locked on entry and it will be locked on
* exit.
*/
static void
rtems_bdbuf_anonymous_wait (rtems_bdbuf_waiters *waiters)
{
b03c: e1a04000 mov r4, r0
* blocking or just hits that window, and before this task has blocked on the
* semaphore. If the preempting task flushes the queue this task will not see
* the flush and may block for ever or until another transaction flushes this
* semaphore.
*/
prev_mode = rtems_bdbuf_disable_preemption ();
b040: ebffffe1 bl afcc <rtems_bdbuf_disable_preemption>
b044: e1a05000 mov r5, r0
/*
* Unlock the cache, wait, and lock the cache when we return.
*/
rtems_bdbuf_unlock_cache ();
b048: ebffffb9 bl af34 <rtems_bdbuf_unlock_cache>
sc = rtems_semaphore_obtain (waiters->sema, RTEMS_WAIT, RTEMS_BDBUF_WAIT_TIMEOUT);
b04c: e3a01000 mov r1, #0
b050: e5940004 ldr r0, [r4, #4]
b054: e1a02001 mov r2, r1
b058: ebfff085 bl 7274 <rtems_semaphore_obtain>
if (sc == RTEMS_TIMEOUT)
b05c: e3500006 cmp r0, #6
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_CACHE_WAIT_TO);
b060: 03a00003 moveq r0, #3
*/
rtems_bdbuf_unlock_cache ();
sc = rtems_semaphore_obtain (waiters->sema, RTEMS_WAIT, RTEMS_BDBUF_WAIT_TIMEOUT);
if (sc == RTEMS_TIMEOUT)
b064: 0a000002 beq b074 <rtems_bdbuf_anonymous_wait+0x48>
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_CACHE_WAIT_TO);
if (sc != RTEMS_UNSATISFIED)
b068: e350000d cmp r0, #13
b06c: 0a000001 beq b078 <rtems_bdbuf_anonymous_wait+0x4c>
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_CACHE_WAIT_2);
b070: e3a00002 mov r0, #2 <== NOT EXECUTED
b074: ebffff91 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
rtems_bdbuf_lock_cache ();
b078: ebffff94 bl aed0 <rtems_bdbuf_lock_cache>
rtems_bdbuf_restore_preemption (prev_mode);
b07c: e1a00005 mov r0, r5
b080: ebffffde bl b000 <rtems_bdbuf_restore_preemption>
--waiters->count;
b084: e5943000 ldr r3, [r4]
b088: e2433001 sub r3, r3, #1
b08c: e5843000 str r3, [r4]
}
b090: e8bd8030 pop {r4, r5, pc}
0000b2d0 <rtems_bdbuf_create_task.constprop.10>:
return NULL;
}
static rtems_status_code
rtems_bdbuf_create_task(
b2d0: e92d4073 push {r0, r1, r4, r5, r6, lr}
b2d4: e1a05003 mov r5, r3
rtems_task_argument arg,
rtems_id *id
)
{
rtems_status_code sc;
size_t stack_size = bdbuf_config.task_stack_size ?
b2d8: e59f3050 ldr r3, [pc, #80] ; b330 <rtems_bdbuf_create_task.constprop.10+0x60>
return NULL;
}
static rtems_status_code
rtems_bdbuf_create_task(
b2dc: e1a06002 mov r6, r2
rtems_task_argument arg,
rtems_id *id
)
{
rtems_status_code sc;
size_t stack_size = bdbuf_config.task_stack_size ?
b2e0: e593201c ldr r2, [r3, #28]
bdbuf_config.task_stack_size : RTEMS_BDBUF_TASK_STACK_SIZE_DEFAULT;
priority = priority != 0 ? priority : default_priority;
sc = rtems_task_create (name,
b2e4: e3a03000 mov r3, #0
b2e8: e1510003 cmp r1, r3
return NULL;
}
static rtems_status_code
rtems_bdbuf_create_task(
b2ec: e59d4018 ldr r4, [sp, #24]
size_t stack_size = bdbuf_config.task_stack_size ?
bdbuf_config.task_stack_size : RTEMS_BDBUF_TASK_STACK_SIZE_DEFAULT;
priority = priority != 0 ? priority : default_priority;
sc = rtems_task_create (name,
b2f0: 03a0100f moveq r1, #15
b2f4: e1520003 cmp r2, r3
b2f8: e88d0018 stm sp, {r3, r4}
b2fc: 03a02a01 moveq r2, #4096 ; 0x1000
b300: e3a03b01 mov r3, #1024 ; 0x400
b304: ebfff05b bl 7478 <rtems_task_create>
stack_size,
RTEMS_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR,
RTEMS_LOCAL | RTEMS_NO_FLOATING_POINT,
id);
if (sc == RTEMS_SUCCESSFUL)
b308: e3500000 cmp r0, #0
b30c: 1a000005 bne b328 <rtems_bdbuf_create_task.constprop.10+0x58>
sc = rtems_task_start (*id, entry, arg);
b310: e5940000 ldr r0, [r4]
b314: e1a01006 mov r1, r6
b318: e1a02005 mov r2, r5
return sc;
}
b31c: e28dd008 add sp, sp, #8
b320: e8bd4070 pop {r4, r5, r6, lr}
RTEMS_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR,
RTEMS_LOCAL | RTEMS_NO_FLOATING_POINT,
id);
if (sc == RTEMS_SUCCESSFUL)
sc = rtems_task_start (*id, entry, arg);
b324: eafff0e4 b 76bc <rtems_task_start>
return sc;
}
b328: e28dd008 add sp, sp, #8 <== NOT EXECUTED
b32c: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
0000aec0 <rtems_bdbuf_fatal>:
#define RTEMS_BDBUF_AVL_MAX_HEIGHT (32)
#endif
static void
rtems_bdbuf_fatal (rtems_fatal_code error)
{
aec0: e1a01000 mov r1, r0 <== NOT EXECUTED
aec4: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
rtems_fatal (RTEMS_FATAL_SOURCE_BDBUF, error);
aec8: e3a00003 mov r0, #3 <== NOT EXECUTED
aecc: ebfff297 bl 7930 <rtems_fatal> <== NOT EXECUTED
0000af28 <rtems_bdbuf_fatal_with_state>:
}
static void
rtems_bdbuf_fatal_with_state (rtems_bdbuf_buf_state state,
rtems_bdbuf_fatal_code error)
{
af28: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
rtems_bdbuf_fatal ((((uint32_t) state) << 16) | error);
af2c: e1810800 orr r0, r1, r0, lsl #16 <== NOT EXECUTED
af30: ebffffe2 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
0000c910 <rtems_bdbuf_get>:
rtems_status_code
rtems_bdbuf_get (rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer **bd_ptr)
{
c910: e92d4070 push {r4, r5, r6, lr}
c914: e1a04000 mov r4, r0
c918: e1a06001 mov r6, r1
c91c: e1a05002 mov r5, r2
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
rtems_blkdev_bnum media_block;
rtems_bdbuf_lock_cache ();
c920: ebfff96a bl aed0 <rtems_bdbuf_lock_cache>
rtems_blkdev_bnum block,
rtems_blkdev_bnum *media_block_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (block < dd->block_count)
c924: e5943028 ldr r3, [r4, #40] ; 0x28
c928: e1560003 cmp r6, r3
*/
*media_block_ptr = rtems_bdbuf_media_block (dd, block) + dd->start;
}
else
{
sc = RTEMS_INVALID_ID;
c92c: 23a06004 movcs r6, #4
rtems_bdbuf_get (rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer **bd_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
c930: 23a04000 movcs r4, #0
rtems_blkdev_bnum block,
rtems_blkdev_bnum *media_block_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (block < dd->block_count)
c934: 2a000022 bcs c9c4 <rtems_bdbuf_get+0xb4>
}
static rtems_blkdev_bnum
rtems_bdbuf_media_block (const rtems_disk_device *dd, rtems_blkdev_bnum block)
{
if (dd->block_to_media_block_shift >= 0)
c938: e5943030 ldr r3, [r4, #48] ; 0x30
c93c: e3530000 cmp r3, #0
return block << dd->block_to_media_block_shift;
c940: a1a06316 lslge r6, r6, r3
}
static rtems_blkdev_bnum
rtems_bdbuf_media_block (const rtems_disk_device *dd, rtems_blkdev_bnum block)
{
if (dd->block_to_media_block_shift >= 0)
c944: aa000007 bge c968 <rtems_bdbuf_get+0x58>
/*
* Change the block number for the block size to the block number for the media
* block size. We have to use 64bit maths. There is no short cut here.
*/
return (rtems_blkdev_bnum)
((((uint64_t) block) * dd->block_size) / dd->media_block_size);
c948: e5940024 ldr r0, [r4, #36] ; 0x24 <== NOT EXECUTED
c94c: e0832096 umull r2, r3, r6, r0 <== NOT EXECUTED
c950: e1a00002 mov r0, r2 <== NOT EXECUTED
c954: e1a01003 mov r1, r3 <== NOT EXECUTED
c958: e5942020 ldr r2, [r4, #32] <== NOT EXECUTED
c95c: e3a03000 mov r3, #0 <== NOT EXECUTED
c960: eb003c36 bl 1ba40 <__udivdi3> <== NOT EXECUTED
c964: e1a06000 mov r6, r0 <== NOT EXECUTED
/*
* Compute the media block number. Drivers work with media block number not
* the block number a BD may have as this depends on the block size set by
* the user.
*/
*media_block_ptr = rtems_bdbuf_media_block (dd, block) + dd->start;
c968: e5941018 ldr r1, [r4, #24]
*/
if (rtems_bdbuf_tracer)
printf ("bdbuf:get: %" PRIu32 " (%" PRIu32 ") (dev = %08x)\n",
media_block, block, (unsigned) dd->dev);
bd = rtems_bdbuf_get_buffer_for_access (dd, media_block);
c96c: e1a00004 mov r0, r4
c970: e0861001 add r1, r6, r1
c974: ebfffc39 bl ba60 <rtems_bdbuf_get_buffer_for_access>
c978: e1a04000 mov r4, r0
switch (bd->state)
c97c: e5900020 ldr r0, [r0, #32]
c980: e3500002 cmp r0, #2
c984: 0a000004 beq c99c <rtems_bdbuf_get+0x8c>
c988: e3500007 cmp r0, #7
c98c: 0a000008 beq c9b4 <rtems_bdbuf_get+0xa4>
c990: e3500001 cmp r0, #1
c994: 1a000008 bne c9bc <rtems_bdbuf_get+0xac>
c998: ea000001 b c9a4 <rtems_bdbuf_get+0x94>
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
c99c: e3a03003 mov r3, #3
c9a0: ea000000 b c9a8 <rtems_bdbuf_get+0x98>
c9a4: e3a03005 mov r3, #5
c9a8: e5843020 str r3, [r4, #32]
c9ac: e3a06000 mov r6, #0
c9b0: ea000003 b c9c4 <rtems_bdbuf_get+0xb4>
c9b4: e3a03004 mov r3, #4
c9b8: eafffffa b c9a8 <rtems_bdbuf_get+0x98>
* record of this so just gets the block to fill.
*/
rtems_bdbuf_set_state (bd, RTEMS_BDBUF_STATE_ACCESS_MODIFIED);
break;
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_2);
c9bc: e3a0100f mov r1, #15 <== NOT EXECUTED
c9c0: ebfff958 bl af28 <rtems_bdbuf_fatal_with_state> <== NOT EXECUTED
rtems_bdbuf_show_users ("get", bd);
rtems_bdbuf_show_usage ();
}
}
rtems_bdbuf_unlock_cache ();
c9c4: ebfff95a bl af34 <rtems_bdbuf_unlock_cache>
*bd_ptr = bd;
c9c8: e5854000 str r4, [r5]
return sc;
}
c9cc: e1a00006 mov r0, r6
c9d0: e8bd8070 pop {r4, r5, r6, pc}
0000ba60 <rtems_bdbuf_get_buffer_for_access>:
static rtems_bdbuf_buffer *
rtems_bdbuf_get_buffer_for_access (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
ba60: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
rtems_bdbuf_buffer *bd = NULL;
do
{
bd = rtems_bdbuf_avl_search (&bdbuf_cache.tree, dd, block);
ba64: e59f41b8 ldr r4, [pc, #440] ; bc24 <rtems_bdbuf_get_buffer_for_access+0x1c4>
}
static rtems_bdbuf_buffer *
rtems_bdbuf_get_buffer_for_access (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
ba68: e1a05000 mov r5, r0
ba6c: e1a06001 mov r6, r1
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
ba70: e284705c add r7, r4, #92 ; 0x5c
rtems_bdbuf_buffer *bd = NULL;
do
{
bd = rtems_bdbuf_avl_search (&bdbuf_cache.tree, dd, block);
ba74: e594003c ldr r0, [r4, #60] ; 0x3c
ba78: e1a01005 mov r1, r5
ba7c: e1a02006 mov r2, r6
ba80: ebfffdbd bl b17c <rtems_bdbuf_avl_search.isra.0>
if (bd != NULL)
ba84: e2508000 subs r8, r0, #0
ba88: 0a000033 beq bb5c <rtems_bdbuf_get_buffer_for_access+0xfc>
{
if (bd->group->bds_per_group != dd->bds_per_group)
ba8c: e5983028 ldr r3, [r8, #40] ; 0x28
ba90: e5932008 ldr r2, [r3, #8]
ba94: e5953034 ldr r3, [r5, #52] ; 0x34
ba98: e1520003 cmp r2, r3
ba9c: 0a00003a beq bb8c <rtems_bdbuf_get_buffer_for_access+0x12c>
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
baa0: e3a0a008 mov sl, #8
static bool
rtems_bdbuf_wait_for_recycle (rtems_bdbuf_buffer *bd)
{
while (true)
{
switch (bd->state)
baa4: e5980020 ldr r0, [r8, #32]
baa8: e350000a cmp r0, #10
baac: 979ff100 ldrls pc, [pc, r0, lsl #2]
bab0: ea000020 b bb38 <rtems_bdbuf_get_buffer_for_access+0xd8> <== NOT EXECUTED
bab4: 0000bb40 .word 0x0000bb40 <== NOT EXECUTED
bab8: 0000bb0c .word 0x0000bb0c <== NOT EXECUTED
babc: 0000bb0c .word 0x0000bb0c <== NOT EXECUTED
bac0: 0000bb1c .word 0x0000bb1c <== NOT EXECUTED
bac4: 0000bb1c .word 0x0000bb1c <== NOT EXECUTED
bac8: 0000bb1c .word 0x0000bb1c <== NOT EXECUTED
bacc: 0000bb1c .word 0x0000bb1c <== NOT EXECUTED
bad0: 0000bae0 .word 0x0000bae0 <== NOT EXECUTED
bad4: 0000bb28 .word 0x0000bb28 <== NOT EXECUTED
bad8: 0000bb28 .word 0x0000bb28 <== NOT EXECUTED
badc: 0000bb28 .word 0x0000bb28 <== NOT EXECUTED
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
bae0: e898000c ldm r8, {r2, r3} <== NOT EXECUTED
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
bae4: e588a020 str sl, [r8, #32] <== NOT EXECUTED
next->previous = previous;
bae8: e5823004 str r3, [r2, #4] <== NOT EXECUTED
previous->next = next;
baec: e5832000 str r2, [r3] <== NOT EXECUTED
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
baf0: e5943060 ldr r3, [r4, #96] ; 0x60 <== NOT EXECUTED
the_node->next = tail;
baf4: e5887000 str r7, [r8] <== NOT EXECUTED
tail->previous = the_node;
baf8: e5848060 str r8, [r4, #96] ; 0x60 <== NOT EXECUTED
old_last->next = the_node;
bafc: e5838000 str r8, [r3] <== NOT EXECUTED
the_node->previous = old_last;
bb00: e5883004 str r3, [r8, #4] <== NOT EXECUTED
rtems_bdbuf_request_sync_for_modified_buffer (rtems_bdbuf_buffer *bd)
{
rtems_bdbuf_set_state (bd, RTEMS_BDBUF_STATE_SYNC);
rtems_chain_extract_unprotected (&bd->link);
rtems_chain_append_unprotected (&bdbuf_cache.sync, &bd->link);
rtems_bdbuf_wake_swapper ();
bb04: ebfffd1c bl af7c <rtems_bdbuf_wake_swapper> <== NOT EXECUTED
bb08: eaffffe5 b baa4 <rtems_bdbuf_get_buffer_for_access+0x44> <== NOT EXECUTED
case RTEMS_BDBUF_STATE_MODIFIED:
rtems_bdbuf_request_sync_for_modified_buffer (bd);
break;
case RTEMS_BDBUF_STATE_CACHED:
case RTEMS_BDBUF_STATE_EMPTY:
if (bd->waiters == 0)
bb0c: e5983024 ldr r3, [r8, #36] ; 0x24
bb10: e3530000 cmp r3, #0
bb14: 0a000009 beq bb40 <rtems_bdbuf_get_buffer_for_access+0xe0>
bb18: ea000018 b bb80 <rtems_bdbuf_get_buffer_for_access+0x120>
}
case RTEMS_BDBUF_STATE_ACCESS_CACHED:
case RTEMS_BDBUF_STATE_ACCESS_EMPTY:
case RTEMS_BDBUF_STATE_ACCESS_MODIFIED:
case RTEMS_BDBUF_STATE_ACCESS_PURGED:
rtems_bdbuf_wait (bd, &bdbuf_cache.access_waiters);
bb1c: e1a00008 mov r0, r8
bb20: e59f1100 ldr r1, [pc, #256] ; bc28 <rtems_bdbuf_get_buffer_for_access+0x1c8>
bb24: ea000001 b bb30 <rtems_bdbuf_get_buffer_for_access+0xd0>
break;
case RTEMS_BDBUF_STATE_SYNC:
case RTEMS_BDBUF_STATE_TRANSFER:
case RTEMS_BDBUF_STATE_TRANSFER_PURGED:
rtems_bdbuf_wait (bd, &bdbuf_cache.transfer_waiters);
bb28: e59f10fc ldr r1, [pc, #252] ; bc2c <rtems_bdbuf_get_buffer_for_access+0x1cc><== NOT EXECUTED
bb2c: e1a00008 mov r0, r8 <== NOT EXECUTED
bb30: ebfffd57 bl b094 <rtems_bdbuf_wait>
bb34: eaffffda b baa4 <rtems_bdbuf_get_buffer_for_access+0x44>
break;
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_8);
bb38: e3a01014 mov r1, #20 <== NOT EXECUTED
bb3c: ea000031 b bc08 <rtems_bdbuf_get_buffer_for_access+0x1a8> <== NOT EXECUTED
{
if (bd->group->bds_per_group != dd->bds_per_group)
{
if (rtems_bdbuf_wait_for_recycle (bd))
{
rtems_bdbuf_remove_from_tree_and_lru_list (bd);
bb40: e1a00008 mov r0, r8 <== NOT EXECUTED
bb44: ebfffec9 bl b670 <rtems_bdbuf_remove_from_tree_and_lru_list><== NOT EXECUTED
rtems_bdbuf_make_free_and_add_to_lru_list (bd);
bb48: e1a00008 mov r0, r8 <== NOT EXECUTED
bb4c: ebfffc7a bl ad3c <rtems_bdbuf_make_free_and_add_to_lru_list><== NOT EXECUTED
rtems_bdbuf_wake (&bdbuf_cache.buffer_waiters);
bb50: e59f00d8 ldr r0, [pc, #216] ; bc30 <rtems_bdbuf_get_buffer_for_access+0x1d0><== NOT EXECUTED
bb54: ebfffda9 bl b200 <rtems_bdbuf_wake> <== NOT EXECUTED
bb58: eaffffc5 b ba74 <rtems_bdbuf_get_buffer_for_access+0x14> <== NOT EXECUTED
bd = NULL;
}
}
else
{
bd = rtems_bdbuf_get_buffer_from_lru_list (dd, block);
bb5c: e1a00005 mov r0, r5
bb60: e1a01006 mov r1, r6
bb64: ebfffed1 bl b6b0 <rtems_bdbuf_get_buffer_from_lru_list>
if (bd == NULL)
bb68: e2508000 subs r8, r0, #0
bb6c: 1a000006 bne bb8c <rtems_bdbuf_get_buffer_for_access+0x12c>
}
static void
rtems_bdbuf_wait_for_buffer (void)
{
if (!rtems_chain_is_empty (&bdbuf_cache.modified))
bb70: e594204c ldr r2, [r4, #76] ; 0x4c
bb74: e59f30b8 ldr r3, [pc, #184] ; bc34 <rtems_bdbuf_get_buffer_for_access+0x1d4>
bb78: e1520003 cmp r2, r3
rtems_bdbuf_wake_swapper ();
bb7c: 1bfffcfe blne af7c <rtems_bdbuf_wake_swapper>
rtems_bdbuf_anonymous_wait (&bdbuf_cache.buffer_waiters);
bb80: e59f00a8 ldr r0, [pc, #168] ; bc30 <rtems_bdbuf_get_buffer_for_access+0x1d0>
bb84: ebfffd28 bl b02c <rtems_bdbuf_anonymous_wait>
bb88: eaffffb9 b ba74 <rtems_bdbuf_get_buffer_for_access+0x14>
static void
rtems_bdbuf_wait_for_access (rtems_bdbuf_buffer *bd)
{
while (true)
{
switch (bd->state)
bb8c: e5980020 ldr r0, [r8, #32]
bb90: e2403001 sub r3, r0, #1
bb94: e3530009 cmp r3, #9
bb98: 979ff103 ldrls pc, [pc, r3, lsl #2]
bb9c: ea000018 b bc04 <rtems_bdbuf_get_buffer_for_access+0x1a4> <== NOT EXECUTED
bba0: 0000bc0c .word 0x0000bc0c <== NOT EXECUTED
bba4: 0000bbd8 .word 0x0000bbd8 <== NOT EXECUTED
bba8: 0000bbe8 .word 0x0000bbe8 <== NOT EXECUTED
bbac: 0000bbe8 .word 0x0000bbe8 <== NOT EXECUTED
bbb0: 0000bbe8 .word 0x0000bbe8 <== NOT EXECUTED
bbb4: 0000bbe8 .word 0x0000bbe8 <== NOT EXECUTED
bbb8: 0000bbc8 .word 0x0000bbc8 <== NOT EXECUTED
bbbc: 0000bbf4 .word 0x0000bbf4 <== NOT EXECUTED
bbc0: 0000bbf4 .word 0x0000bbf4 <== NOT EXECUTED
bbc4: 0000bbf4 .word 0x0000bbf4 <== NOT EXECUTED
}
static void
rtems_bdbuf_group_release (rtems_bdbuf_buffer *bd)
{
--bd->group->users;
bbc8: e5983028 ldr r3, [r8, #40] ; 0x28
bbcc: e593200c ldr r2, [r3, #12]
bbd0: e2422001 sub r2, r2, #1
bbd4: e583200c str r2, [r3, #12]
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
bbd8: e898000c ldm r8, {r2, r3}
next->previous = previous;
bbdc: e5823004 str r3, [r2, #4]
previous->next = next;
bbe0: e5832000 str r2, [r3]
bbe4: ea000008 b bc0c <rtems_bdbuf_get_buffer_for_access+0x1ac>
return;
case RTEMS_BDBUF_STATE_ACCESS_CACHED:
case RTEMS_BDBUF_STATE_ACCESS_EMPTY:
case RTEMS_BDBUF_STATE_ACCESS_MODIFIED:
case RTEMS_BDBUF_STATE_ACCESS_PURGED:
rtems_bdbuf_wait (bd, &bdbuf_cache.access_waiters);
bbe8: e1a00008 mov r0, r8
bbec: e59f1034 ldr r1, [pc, #52] ; bc28 <rtems_bdbuf_get_buffer_for_access+0x1c8>
bbf0: ea000001 b bbfc <rtems_bdbuf_get_buffer_for_access+0x19c>
break;
case RTEMS_BDBUF_STATE_SYNC:
case RTEMS_BDBUF_STATE_TRANSFER:
case RTEMS_BDBUF_STATE_TRANSFER_PURGED:
rtems_bdbuf_wait (bd, &bdbuf_cache.transfer_waiters);
bbf4: e59f1030 ldr r1, [pc, #48] ; bc2c <rtems_bdbuf_get_buffer_for_access+0x1cc>
bbf8: e1a00008 mov r0, r8
bbfc: ebfffd24 bl b094 <rtems_bdbuf_wait>
bc00: eaffffe1 b bb8c <rtems_bdbuf_get_buffer_for_access+0x12c>
break;
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_7);
bc04: e3a01013 mov r1, #19 <== NOT EXECUTED
bc08: ebfffcc6 bl af28 <rtems_bdbuf_fatal_with_state> <== NOT EXECUTED
}
static void
rtems_bdbuf_group_obtain (rtems_bdbuf_buffer *bd)
{
++bd->group->users;
bc0c: e5983028 ldr r3, [r8, #40] ; 0x28
bc10: e593200c ldr r2, [r3, #12]
bc14: e2822001 add r2, r2, #1
bc18: e583200c str r2, [r3, #12]
rtems_bdbuf_wait_for_access (bd);
rtems_bdbuf_group_obtain (bd);
return bd;
}
bc1c: e1a00008 mov r0, r8
bc20: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
0000ba08 <rtems_bdbuf_get_buffer_for_read_ahead>:
rtems_bdbuf_get_buffer_for_read_ahead (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
rtems_bdbuf_buffer *bd = NULL;
bd = rtems_bdbuf_avl_search (&bdbuf_cache.tree, dd, block);
ba08: e59f304c ldr r3, [pc, #76] ; ba5c <rtems_bdbuf_get_buffer_for_read_ahead+0x54>
}
static rtems_bdbuf_buffer *
rtems_bdbuf_get_buffer_for_read_ahead (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
ba0c: e92d4030 push {r4, r5, lr}
ba10: e1a05000 mov r5, r0
ba14: e1a04001 mov r4, r1
rtems_bdbuf_buffer *bd = NULL;
bd = rtems_bdbuf_avl_search (&bdbuf_cache.tree, dd, block);
ba18: e593003c ldr r0, [r3, #60] ; 0x3c
ba1c: e1a01005 mov r1, r5
ba20: e1a02004 mov r2, r4
ba24: ebfffdd4 bl b17c <rtems_bdbuf_avl_search.isra.0>
if (bd == NULL)
ba28: e3500000 cmp r0, #0
ba2c: 1a000008 bne ba54 <rtems_bdbuf_get_buffer_for_read_ahead+0x4c>
{
bd = rtems_bdbuf_get_buffer_from_lru_list (dd, block);
ba30: e1a00005 mov r0, r5
ba34: e1a01004 mov r1, r4
ba38: ebffff1c bl b6b0 <rtems_bdbuf_get_buffer_from_lru_list>
if (bd != NULL)
ba3c: e3500000 cmp r0, #0
}
static void
rtems_bdbuf_group_obtain (rtems_bdbuf_buffer *bd)
{
++bd->group->users;
ba40: 15903028 ldrne r3, [r0, #40] ; 0x28
ba44: 1593200c ldrne r2, [r3, #12]
ba48: 12822001 addne r2, r2, #1
ba4c: 1583200c strne r2, [r3, #12]
ba50: e8bd8030 pop {r4, r5, pc}
else
/*
* The buffer is in the cache. So it is already available or in use, and
* thus no need for a read ahead.
*/
bd = NULL;
ba54: e3a00000 mov r0, #0 <== NOT EXECUTED
return bd;
}
ba58: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
0000b6b0 <rtems_bdbuf_get_buffer_from_lru_list>:
}
static rtems_bdbuf_buffer *
rtems_bdbuf_get_buffer_from_lru_list (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
b6b0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
b6b4: e59f7340 ldr r7, [pc, #832] ; b9fc <rtems_bdbuf_get_buffer_from_lru_list+0x34c>
b6b8: e24dd088 sub sp, sp, #136 ; 0x88
b6bc: e1a06000 mov r6, r0
b6c0: e58d1004 str r1, [sp, #4]
b6c4: e5975040 ldr r5, [r7, #64] ; 0x40
bufs_per_bd = bdbuf_cache.max_bds_per_group / group->bds_per_group;
for (b = 0, bd = group->bdbuf;
b < group->bds_per_group;
b++, bd += bufs_per_bd)
b6c8: e3a09038 mov r9, #56 ; 0x38
rtems_bdbuf_get_buffer_from_lru_list (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
rtems_chain_node *node = rtems_chain_first (&bdbuf_cache.lru);
while (!rtems_chain_is_tail (&bdbuf_cache.lru, node))
b6cc: ea0000c2 b b9dc <rtems_bdbuf_get_buffer_from_lru_list+0x32c>
bd->group->bds_per_group, dd->bds_per_group);
/*
* If nobody waits for this BD, we may recycle it.
*/
if (bd->waiters == 0)
b6d0: e5953024 ldr r3, [r5, #36] ; 0x24
b6d4: e3530000 cmp r3, #0
b6d8: 1a0000be bne b9d8 <rtems_bdbuf_get_buffer_from_lru_list+0x328>
{
if (bd->group->bds_per_group == dd->bds_per_group)
b6dc: e5954028 ldr r4, [r5, #40] ; 0x28
b6e0: e5968034 ldr r8, [r6, #52] ; 0x34
b6e4: e5941008 ldr r1, [r4, #8]
b6e8: e1510008 cmp r1, r8
b6ec: 1a000003 bne b700 <rtems_bdbuf_get_buffer_from_lru_list+0x50>
{
rtems_bdbuf_remove_from_tree_and_lru_list (bd);
b6f0: e1a00005 mov r0, r5
b6f4: ebffffdd bl b670 <rtems_bdbuf_remove_from_tree_and_lru_list>
b6f8: e1a00005 mov r0, r5
b6fc: ea000024 b b794 <rtems_bdbuf_get_buffer_from_lru_list+0xe4>
empty_bd = bd;
}
else if (bd->group->users == 0)
b700: e594b00c ldr fp, [r4, #12]
b704: e35b0000 cmp fp, #0
b708: 1a0000b2 bne b9d8 <rtems_bdbuf_get_buffer_from_lru_list+0x328>
if (rtems_bdbuf_tracer)
printf ("bdbuf:realloc: %tu: %zd -> %zd\n",
group - bdbuf_cache.groups, group->bds_per_group,
new_bds_per_group);
bufs_per_bd = bdbuf_cache.max_bds_per_group / group->bds_per_group;
b70c: e5970020 ldr r0, [r7, #32]
b710: eb003b8e bl 1a550 <__aeabi_uidiv>
for (b = 0, bd = group->bdbuf;
b714: e594a010 ldr sl, [r4, #16]
b < group->bds_per_group;
b++, bd += bufs_per_bd)
b718: e0030099 mul r3, r9, r0
b71c: ea000005 b b738 <rtems_bdbuf_get_buffer_from_lru_list+0x88>
rtems_bdbuf_remove_from_tree_and_lru_list (bd);
b720: e1a0000a mov r0, sl
b724: e58d3000 str r3, [sp]
b728: ebffffd0 bl b670 <rtems_bdbuf_remove_from_tree_and_lru_list>
bufs_per_bd = bdbuf_cache.max_bds_per_group / group->bds_per_group;
for (b = 0, bd = group->bdbuf;
b < group->bds_per_group;
b++, bd += bufs_per_bd)
b72c: e59d3000 ldr r3, [sp]
b730: e28bb001 add fp, fp, #1
b734: e08aa003 add sl, sl, r3
group - bdbuf_cache.groups, group->bds_per_group,
new_bds_per_group);
bufs_per_bd = bdbuf_cache.max_bds_per_group / group->bds_per_group;
for (b = 0, bd = group->bdbuf;
b738: e5942008 ldr r2, [r4, #8]
b73c: e15b0002 cmp fp, r2
b740: 3afffff6 bcc b720 <rtems_bdbuf_get_buffer_from_lru_list+0x70>
b < group->bds_per_group;
b++, bd += bufs_per_bd)
rtems_bdbuf_remove_from_tree_and_lru_list (bd);
group->bds_per_group = new_bds_per_group;
b744: e5848008 str r8, [r4, #8]
bufs_per_bd = bdbuf_cache.max_bds_per_group / new_bds_per_group;
b748: e1a01008 mov r1, r8
b74c: e5970020 ldr r0, [r7, #32]
b750: eb003b7e bl 1a550 <__aeabi_uidiv>
for (b = 1, bd = group->bdbuf + bufs_per_bd;
b754: e00b0099 mul fp, r9, r0
b758: e594a010 ldr sl, [r4, #16]
b75c: e3a08001 mov r8, #1
b760: e08aa00b add sl, sl, fp
b764: ea000003 b b778 <rtems_bdbuf_get_buffer_from_lru_list+0xc8>
b < group->bds_per_group;
b++, bd += bufs_per_bd)
rtems_bdbuf_make_free_and_add_to_lru_list (bd);
b768: e1a0000a mov r0, sl
b76c: ebfffd72 bl ad3c <rtems_bdbuf_make_free_and_add_to_lru_list>
group->bds_per_group = new_bds_per_group;
bufs_per_bd = bdbuf_cache.max_bds_per_group / new_bds_per_group;
for (b = 1, bd = group->bdbuf + bufs_per_bd;
b < group->bds_per_group;
b++, bd += bufs_per_bd)
b770: e2888001 add r8, r8, #1
b774: e08aa00b add sl, sl, fp
rtems_bdbuf_remove_from_tree_and_lru_list (bd);
group->bds_per_group = new_bds_per_group;
bufs_per_bd = bdbuf_cache.max_bds_per_group / new_bds_per_group;
for (b = 1, bd = group->bdbuf + bufs_per_bd;
b778: e5943008 ldr r3, [r4, #8]
b77c: e1580003 cmp r8, r3
b780: 3afffff8 bcc b768 <rtems_bdbuf_get_buffer_from_lru_list+0xb8>
b < group->bds_per_group;
b++, bd += bufs_per_bd)
rtems_bdbuf_make_free_and_add_to_lru_list (bd);
if (b > 1)
b784: e3580001 cmp r8, #1
rtems_bdbuf_wake (&bdbuf_cache.buffer_waiters);
b788: 859f0270 ldrhi r0, [pc, #624] ; ba00 <rtems_bdbuf_get_buffer_from_lru_list+0x350>
b78c: 8bfffe9b blhi b200 <rtems_bdbuf_wake>
return group->bdbuf;
b790: e5940010 ldr r0, [r4, #16]
}
else if (bd->group->users == 0)
empty_bd = rtems_bdbuf_group_realloc (bd->group, dd->bds_per_group);
}
if (empty_bd != NULL)
b794: e3500000 cmp r0, #0
b798: 0a00008e beq b9d8 <rtems_bdbuf_get_buffer_from_lru_list+0x328>
rtems_bdbuf_setup_empty_buffer (rtems_bdbuf_buffer *bd,
rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
bd->dd = dd ;
bd->block = block;
b79c: e59d3004 ldr r3, [sp, #4]
b7a0: e5803018 str r3, [r0, #24]
bd->avl.left = NULL;
b7a4: e3a03000 mov r3, #0
static void
rtems_bdbuf_setup_empty_buffer (rtems_bdbuf_buffer *bd,
rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
bd->dd = dd ;
b7a8: e5806014 str r6, [r0, #20]
bd->block = block;
bd->avl.left = NULL;
b7ac: e5803008 str r3, [r0, #8]
bd->avl.right = NULL;
b7b0: e580300c str r3, [r0, #12]
rtems_bdbuf_buffer* node)
{
const rtems_disk_device *dd = node->dd;
rtems_blkdev_bnum block = node->block;
rtems_bdbuf_buffer* p = *root;
b7b4: e59f2240 ldr r2, [pc, #576] ; b9fc <rtems_bdbuf_get_buffer_from_lru_list+0x34c>
{
bd->dd = dd ;
bd->block = block;
bd->avl.left = NULL;
bd->avl.right = NULL;
bd->waiters = 0;
b7b8: e5803024 str r3, [r0, #36] ; 0x24
rtems_bdbuf_buffer* node)
{
const rtems_disk_device *dd = node->dd;
rtems_blkdev_bnum block = node->block;
rtems_bdbuf_buffer* p = *root;
b7bc: e592303c ldr r3, [r2, #60] ; 0x3c
rtems_bdbuf_buffer* buf_stack[RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer** buf_prev = buf_stack;
bool modified = false;
if (p == NULL)
b7c0: e3530000 cmp r3, #0
rtems_bdbuf_buffer* p = *root;
rtems_bdbuf_buffer* q;
rtems_bdbuf_buffer* p1;
rtems_bdbuf_buffer* p2;
rtems_bdbuf_buffer* buf_stack[RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer** buf_prev = buf_stack;
b7c4: 128d5008 addne r5, sp, #8
*buf_prev++ = p;
if (((uintptr_t) p->dd < (uintptr_t) dd)
|| ((p->dd == dd) && (p->block < block)))
{
p->avl.cache = 1;
b7c8: 13a04001 movne r4, #1
break;
}
}
else if ((p->dd != dd) || (p->block != block))
{
p->avl.cache = -1;
b7cc: 13e0c000 mvnne ip, #0
rtems_bdbuf_buffer* buf_stack[RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer** buf_prev = buf_stack;
bool modified = false;
if (p == NULL)
b7d0: 1a000017 bne b834 <rtems_bdbuf_get_buffer_from_lru_list+0x184>
{
*root = node;
b7d4: e582003c str r0, [r2, #60] ; 0x3c
node->avl.left = NULL;
b7d8: e5803008 str r3, [r0, #8]
node->avl.right = NULL;
b7dc: e580300c str r3, [r0, #12]
node->avl.bal = 0;
b7e0: e5c03011 strb r3, [r0, #17]
b7e4: ea000078 b b9cc <rtems_bdbuf_get_buffer_from_lru_list+0x31c>
while (p != NULL)
{
*buf_prev++ = p;
if (((uintptr_t) p->dd < (uintptr_t) dd)
|| ((p->dd == dd) && (p->block < block)))
b7e8: 1a00000a bne b818 <rtems_bdbuf_get_buffer_from_lru_list+0x168>
b7ec: e5932018 ldr r2, [r3, #24]
b7f0: e59d7004 ldr r7, [sp, #4]
b7f4: e1520007 cmp r2, r7
b7f8: 2a000005 bcs b814 <rtems_bdbuf_get_buffer_from_lru_list+0x164>
{
p->avl.cache = 1;
q = p->avl.right;
b7fc: e593200c ldr r2, [r3, #12]
if (q == NULL)
b800: e3520000 cmp r2, #0
*buf_prev++ = p;
if (((uintptr_t) p->dd < (uintptr_t) dd)
|| ((p->dd == dd) && (p->block < block)))
{
p->avl.cache = 1;
b804: e5c34010 strb r4, [r3, #16]
q = p->avl.right;
if (q == NULL)
b808: 1a000007 bne b82c <rtems_bdbuf_get_buffer_from_lru_list+0x17c>
{
q = node;
p->avl.right = q = node;
b80c: e583000c str r0, [r3, #12]
b810: ea00000d b b84c <rtems_bdbuf_get_buffer_from_lru_list+0x19c>
break;
}
}
else if ((p->dd != dd) || (p->block != block))
b814: 0a000076 beq b9f4 <rtems_bdbuf_get_buffer_from_lru_list+0x344>
{
p->avl.cache = -1;
q = p->avl.left;
b818: e5932008 ldr r2, [r3, #8]
if (q == NULL)
b81c: e3520000 cmp r2, #0
break;
}
}
else if ((p->dd != dd) || (p->block != block))
{
p->avl.cache = -1;
b820: e5c3c010 strb ip, [r3, #16]
q = p->avl.left;
if (q == NULL)
{
q = node;
p->avl.left = q;
b824: 05830008 streq r0, [r3, #8]
b828: 0a000007 beq b84c <rtems_bdbuf_get_buffer_from_lru_list+0x19c>
rtems_bdbuf_buffer* buf_stack[RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer** buf_prev = buf_stack;
bool modified = false;
if (p == NULL)
b82c: e1a05001 mov r5, r1
b830: e1a03002 mov r3, r2
while (p != NULL)
{
*buf_prev++ = p;
if (((uintptr_t) p->dd < (uintptr_t) dd)
b834: e5932014 ldr r2, [r3, #20]
return 0;
}
while (p != NULL)
{
*buf_prev++ = p;
b838: e1a01005 mov r1, r5
if (((uintptr_t) p->dd < (uintptr_t) dd)
b83c: e1520006 cmp r2, r6
return 0;
}
while (p != NULL)
{
*buf_prev++ = p;
b840: e4813004 str r3, [r1], #4
if (((uintptr_t) p->dd < (uintptr_t) dd)
b844: 3affffec bcc b7fc <rtems_bdbuf_get_buffer_from_lru_list+0x14c>
b848: eaffffe6 b b7e8 <rtems_bdbuf_get_buffer_from_lru_list+0x138>
}
p = q;
}
q->avl.left = q->avl.right = NULL;
b84c: e3a01000 mov r1, #0
b850: e580100c str r1, [r0, #12]
b854: e5801008 str r1, [r0, #8]
q->avl.bal = 0;
b858: e5c01011 strb r1, [r0, #17]
p->avl.bal = 0;
modified = false;
break;
case 0:
p->avl.bal = 1;
b85c: e3a06001 mov r6, #1
default:
break;
}
}
q = p;
if (buf_prev > buf_stack)
b860: e28d7008 add r7, sp, #8
b864: ea000000 b b86c <rtems_bdbuf_get_buffer_from_lru_list+0x1bc>
q->avl.left = q->avl.right = NULL;
q->avl.bal = 0;
modified = true;
buf_prev--;
while (modified)
b868: e1a0300c mov r3, ip
{
if (p->avl.cache == -1)
b86c: e1d321d0 ldrsb r2, [r3, #16]
b870: e3720001 cmn r2, #1
b874: e1d3c1d1 ldrsb ip, [r3, #17]
b878: 1a00001f bne b8fc <rtems_bdbuf_get_buffer_from_lru_list+0x24c>
{
switch (p->avl.bal)
b87c: e35c0000 cmp ip, #0
p->avl.bal = 0;
modified = false;
break;
case 0:
p->avl.bal = -1;
b880: 05c32011 strbeq r2, [r3, #17]
while (modified)
{
if (p->avl.cache == -1)
{
switch (p->avl.bal)
b884: 0a000042 beq b994 <rtems_bdbuf_get_buffer_from_lru_list+0x2e4>
b888: e35c0001 cmp ip, #1
b88c: 0a000021 beq b918 <rtems_bdbuf_get_buffer_from_lru_list+0x268>
b890: e37c0001 cmn ip, #1
b894: 1a00003e bne b994 <rtems_bdbuf_get_buffer_from_lru_list+0x2e4>
case 0:
p->avl.bal = -1;
break;
case -1:
p1 = p->avl.left;
b898: e5934008 ldr r4, [r3, #8]
if (p1->avl.bal == -1) /* simple LL-turn */
b89c: e1d421d1 ldrsb r2, [r4, #17]
b8a0: e3720001 cmn r2, #1
b8a4: e594200c ldr r2, [r4, #12]
{
p->avl.left = p1->avl.right;
b8a8: 05832008 streq r2, [r3, #8]
p1->avl.right = p;
b8ac: 0584300c streq r3, [r4, #12]
p->avl.bal = 0;
b8b0: 05c31011 strbeq r1, [r3, #17]
b8b4: 01a02004 moveq r2, r4
b8b8: 0a000031 beq b984 <rtems_bdbuf_get_buffer_from_lru_list+0x2d4>
p = p1;
}
else /* double LR-turn */
{
p2 = p1->avl.right;
p1->avl.right = p2->avl.left;
b8bc: e5928008 ldr r8, [r2, #8]
b8c0: e584800c str r8, [r4, #12]
p2->avl.left = p1;
p->avl.left = p2->avl.right;
b8c4: e592800c ldr r8, [r2, #12]
}
else /* double LR-turn */
{
p2 = p1->avl.right;
p1->avl.right = p2->avl.left;
p2->avl.left = p1;
b8c8: e5824008 str r4, [r2, #8]
p->avl.left = p2->avl.right;
b8cc: e5838008 str r8, [r3, #8]
p2->avl.right = p;
if (p2->avl.bal == -1) p->avl.bal = +1; else p->avl.bal = 0;
b8d0: e1d281d1 ldrsb r8, [r2, #17]
b8d4: e3780001 cmn r8, #1
b8d8: 13a08000 movne r8, #0
b8dc: 03a08001 moveq r8, #1
b8e0: e5c38011 strb r8, [r3, #17]
{
p2 = p1->avl.right;
p1->avl.right = p2->avl.left;
p2->avl.left = p1;
p->avl.left = p2->avl.right;
p2->avl.right = p;
b8e4: e582300c str r3, [r2, #12]
if (p2->avl.bal == -1) p->avl.bal = +1; else p->avl.bal = 0;
if (p2->avl.bal == +1) p1->avl.bal = -1; else p1->avl.bal = 0;
b8e8: e1d231d1 ldrsb r3, [r2, #17]
b8ec: e3530001 cmp r3, #1
b8f0: 11a0c001 movne ip, r1
b8f4: e5c4c011 strb ip, [r4, #17]
b8f8: ea000021 b b984 <rtems_bdbuf_get_buffer_from_lru_list+0x2d4>
break;
}
}
else
{
switch (p->avl.bal)
b8fc: e35c0000 cmp ip, #0
p->avl.bal = 0;
modified = false;
break;
case 0:
p->avl.bal = 1;
b900: 05c36011 strbeq r6, [r3, #17]
break;
}
}
else
{
switch (p->avl.bal)
b904: 0a000022 beq b994 <rtems_bdbuf_get_buffer_from_lru_list+0x2e4>
b908: e35c0001 cmp ip, #1
b90c: 0a000003 beq b920 <rtems_bdbuf_get_buffer_from_lru_list+0x270>
b910: e37c0001 cmn ip, #1
b914: 1a00001e bne b994 <rtems_bdbuf_get_buffer_from_lru_list+0x2e4>
{
case -1:
p->avl.bal = 0;
b918: e5c31011 strb r1, [r3, #17]
b91c: ea00001a b b98c <rtems_bdbuf_get_buffer_from_lru_list+0x2dc>
case 0:
p->avl.bal = 1;
break;
case 1:
p1 = p->avl.right;
b920: e593c00c ldr ip, [r3, #12]
if (p1->avl.bal == 1) /* simple RR-turn */
b924: e1dc21d1 ldrsb r2, [ip, #17]
b928: e3520001 cmp r2, #1
b92c: e59c2008 ldr r2, [ip, #8]
{
p->avl.right = p1->avl.left;
b930: 0583200c streq r2, [r3, #12]
p1->avl.left = p;
b934: 058c3008 streq r3, [ip, #8]
p->avl.bal = 0;
b938: 05c31011 strbeq r1, [r3, #17]
b93c: 01a0200c moveq r2, ip
b940: 0a00000f beq b984 <rtems_bdbuf_get_buffer_from_lru_list+0x2d4>
p = p1;
}
else /* double RL-turn */
{
p2 = p1->avl.left;
p1->avl.left = p2->avl.right;
b944: e592400c ldr r4, [r2, #12]
b948: e58c4008 str r4, [ip, #8]
p2->avl.right = p1;
p->avl.right = p2->avl.left;
b94c: e5924008 ldr r4, [r2, #8]
}
else /* double RL-turn */
{
p2 = p1->avl.left;
p1->avl.left = p2->avl.right;
p2->avl.right = p1;
b950: e582c00c str ip, [r2, #12]
p->avl.right = p2->avl.left;
b954: e583400c str r4, [r3, #12]
p2->avl.left = p;
if (p2->avl.bal == +1) p->avl.bal = -1; else p->avl.bal = 0;
b958: e1d241d1 ldrsb r4, [r2, #17]
b95c: e3540001 cmp r4, #1
b960: 03a040ff moveq r4, #255 ; 0xff
b964: 13a04000 movne r4, #0
b968: e5c34011 strb r4, [r3, #17]
{
p2 = p1->avl.left;
p1->avl.left = p2->avl.right;
p2->avl.right = p1;
p->avl.right = p2->avl.left;
p2->avl.left = p;
b96c: e5823008 str r3, [r2, #8]
if (p2->avl.bal == +1) p->avl.bal = -1; else p->avl.bal = 0;
if (p2->avl.bal == -1) p1->avl.bal = +1; else p1->avl.bal = 0;
b970: e1d231d1 ldrsb r3, [r2, #17]
b974: e3730001 cmn r3, #1
b978: 11a03001 movne r3, r1
b97c: 01a03006 moveq r3, r6
b980: e5cc3011 strb r3, [ip, #17]
p = p2;
}
p->avl.bal = 0;
b984: e5c21011 strb r1, [r2, #17]
b988: e1a03002 mov r3, r2
modified = false;
b98c: e3a02000 mov r2, #0
b990: ea000000 b b998 <rtems_bdbuf_get_buffer_from_lru_list+0x2e8>
break;
}
}
else
{
switch (p->avl.bal)
b994: e3a02001 mov r2, #1
default:
break;
}
}
q = p;
if (buf_prev > buf_stack)
b998: e1550007 cmp r5, r7
b99c: 9a000008 bls b9c4 <rtems_bdbuf_get_buffer_from_lru_list+0x314>
{
p = *--buf_prev;
b9a0: e515c004 ldr ip, [r5, #-4]
if (p->avl.cache == -1)
b9a4: e1dc41d0 ldrsb r4, [ip, #16]
b9a8: e3740001 cmn r4, #1
{
p->avl.left = q;
b9ac: 058c3008 streq r3, [ip, #8]
}
else
{
p->avl.right = q;
b9b0: 158c300c strne r3, [ip, #12]
q->avl.left = q->avl.right = NULL;
q->avl.bal = 0;
modified = true;
buf_prev--;
while (modified)
b9b4: e3520000 cmp r2, #0
p->avl.right = q;
}
}
else
{
*root = p;
b9b8: e2455004 sub r5, r5, #4
q->avl.left = q->avl.right = NULL;
q->avl.bal = 0;
modified = true;
buf_prev--;
while (modified)
b9bc: 1affffa9 bne b868 <rtems_bdbuf_get_buffer_from_lru_list+0x1b8>
b9c0: ea000001 b b9cc <rtems_bdbuf_get_buffer_from_lru_list+0x31c>
p->avl.right = q;
}
}
else
{
*root = p;
b9c4: e59f2030 ldr r2, [pc, #48] ; b9fc <rtems_bdbuf_get_buffer_from_lru_list+0x34c>
b9c8: e582303c str r3, [r2, #60] ; 0x3c
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
b9cc: e3a03001 mov r3, #1
b9d0: e5803020 str r3, [r0, #32]
if (empty_bd != NULL)
{
rtems_bdbuf_setup_empty_buffer (empty_bd, dd, block);
return empty_bd;
b9d4: ea000004 b b9ec <rtems_bdbuf_get_buffer_from_lru_list+0x33c>
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Next(
Chain_Node *the_node
)
{
return the_node->next;
b9d8: e5955000 ldr r5, [r5]
rtems_bdbuf_get_buffer_from_lru_list (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
rtems_chain_node *node = rtems_chain_first (&bdbuf_cache.lru);
while (!rtems_chain_is_tail (&bdbuf_cache.lru, node))
b9dc: e59f3020 ldr r3, [pc, #32] ; ba04 <rtems_bdbuf_get_buffer_from_lru_list+0x354>
b9e0: e1550003 cmp r5, r3
b9e4: 1affff39 bne b6d0 <rtems_bdbuf_get_buffer_from_lru_list+0x20>
}
node = rtems_chain_next (node);
}
return NULL;
b9e8: e3a00000 mov r0, #0
}
b9ec: e28dd088 add sp, sp, #136 ; 0x88
b9f0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
bd->avl.left = NULL;
bd->avl.right = NULL;
bd->waiters = 0;
if (rtems_bdbuf_avl_insert (&bdbuf_cache.tree, bd) != 0)
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_RECYCLE);
b9f4: e3a00008 mov r0, #8 <== NOT EXECUTED
b9f8: ebfffd30 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
0000c4f8 <rtems_bdbuf_init>:
*
* @return rtems_status_code The initialisation status.
*/
rtems_status_code
rtems_bdbuf_init (void)
{
c4f8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_mode prev_mode;
if (rtems_bdbuf_tracer)
printf ("bdbuf:init\n");
if (rtems_interrupt_is_in_progress())
c4fc: e59f33dc ldr r3, [pc, #988] ; c8e0 <rtems_bdbuf_init+0x3e8>
c500: e5933000 ldr r3, [r3]
c504: e3530000 cmp r3, #0
*
* @return rtems_status_code The initialisation status.
*/
rtems_status_code
rtems_bdbuf_init (void)
{
c508: e24dd018 sub sp, sp, #24
if (rtems_bdbuf_tracer)
printf ("bdbuf:init\n");
if (rtems_interrupt_is_in_progress())
return RTEMS_CALLED_FROM_ISR;
c50c: 13a00012 movne r0, #18
rtems_mode prev_mode;
if (rtems_bdbuf_tracer)
printf ("bdbuf:init\n");
if (rtems_interrupt_is_in_progress())
c510: 1a0000f0 bne c8d8 <rtems_bdbuf_init+0x3e0>
return RTEMS_CALLED_FROM_ISR;
/*
* Check the configuration table values.
*/
if ((bdbuf_config.buffer_max % bdbuf_config.buffer_min) != 0)
c514: e59f63c8 ldr r6, [pc, #968] ; c8e4 <rtems_bdbuf_init+0x3ec>
c518: e2864024 add r4, r6, #36 ; 0x24
c51c: e8940210 ldm r4, {r4, r9}
c520: e1a00009 mov r0, r9
c524: e1a01004 mov r1, r4
c528: eb00384e bl 1a668 <__umodsi3>
c52c: e3500000 cmp r0, #0
return RTEMS_INVALID_NUMBER;
c530: 13a0000a movne r0, #10
return RTEMS_CALLED_FROM_ISR;
/*
* Check the configuration table values.
*/
if ((bdbuf_config.buffer_max % bdbuf_config.buffer_min) != 0)
c534: 1a0000e7 bne c8d8 <rtems_bdbuf_init+0x3e0>
/*
* We use a special variable to manage the initialisation incase we have
* completing threads doing this. You may get errors if the another thread
* makes a call and we have not finished initialisation.
*/
prev_mode = rtems_bdbuf_disable_preemption ();
c538: ebfffaa3 bl afcc <rtems_bdbuf_disable_preemption>
if (bdbuf_cache.initialised)
c53c: e59f53a4 ldr r5, [pc, #932] ; c8e8 <rtems_bdbuf_init+0x3f0>
c540: e5d58095 ldrb r8, [r5, #149] ; 0x95
c544: e3580000 cmp r8, #0
/*
* We use a special variable to manage the initialisation incase we have
* completing threads doing this. You may get errors if the another thread
* makes a call and we have not finished initialisation.
*/
prev_mode = rtems_bdbuf_disable_preemption ();
c548: e1a0a000 mov sl, r0
if (bdbuf_cache.initialised)
c54c: 0a000002 beq c55c <rtems_bdbuf_init+0x64>
{
rtems_bdbuf_restore_preemption (prev_mode);
c550: ebfffaaa bl b000 <rtems_bdbuf_restore_preemption> <== NOT EXECUTED
return RTEMS_RESOURCE_IN_USE;
c554: e3a0000c mov r0, #12 <== NOT EXECUTED
c558: ea0000de b c8d8 <rtems_bdbuf_init+0x3e0> <== NOT EXECUTED
}
memset(&bdbuf_cache, 0, sizeof(bdbuf_cache));
c55c: e1a01008 mov r1, r8
c560: e3a02098 mov r2, #152 ; 0x98
bdbuf_cache.initialised = true;
c564: e3a07001 mov r7, #1
{
rtems_bdbuf_restore_preemption (prev_mode);
return RTEMS_RESOURCE_IN_USE;
}
memset(&bdbuf_cache, 0, sizeof(bdbuf_cache));
c568: e1a00005 mov r0, r5
c56c: eb0016b1 bl 12038 <memset>
bdbuf_cache.initialised = true;
rtems_bdbuf_restore_preemption (prev_mode);
c570: e1a0000a mov r0, sl
rtems_bdbuf_restore_preemption (prev_mode);
return RTEMS_RESOURCE_IN_USE;
}
memset(&bdbuf_cache, 0, sizeof(bdbuf_cache));
bdbuf_cache.initialised = true;
c574: e5c57095 strb r7, [r5, #149] ; 0x95
rtems_bdbuf_restore_preemption (prev_mode);
c578: ebfffaa0 bl b000 <rtems_bdbuf_restore_preemption>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
c57c: e285300c add r3, r5, #12
c580: e5853008 str r3, [r5, #8]
head->previous = NULL;
tail->previous = head;
c584: e2853008 add r3, r5, #8
c588: e5853010 str r3, [r5, #16]
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
c58c: e2853044 add r3, r5, #68 ; 0x44
c590: e5853040 str r3, [r5, #64] ; 0x40
head->previous = NULL;
tail->previous = head;
c594: e2853040 add r3, r5, #64 ; 0x40
c598: e5853048 str r3, [r5, #72] ; 0x48
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
c59c: e2853050 add r3, r5, #80 ; 0x50
c5a0: e585304c str r3, [r5, #76] ; 0x4c
head->previous = NULL;
tail->previous = head;
c5a4: e285304c add r3, r5, #76 ; 0x4c
c5a8: e5853054 str r3, [r5, #84] ; 0x54
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
c5ac: e285305c add r3, r5, #92 ; 0x5c
c5b0: e5853058 str r3, [r5, #88] ; 0x58
head->previous = NULL;
tail->previous = head;
c5b4: e2853058 add r3, r5, #88 ; 0x58
c5b8: e5853060 str r3, [r5, #96] ; 0x60
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
c5bc: e285308c add r3, r5, #140 ; 0x8c
c5c0: e5853088 str r3, [r5, #136] ; 0x88
head->previous = NULL;
tail->previous = head;
c5c4: e2853088 add r3, r5, #136 ; 0x88
c5c8: e5853090 str r3, [r5, #144] ; 0x90
rtems_chain_initialize_empty (&bdbuf_cache.read_ahead_chain);
/*
* Create the locks for the cache.
*/
sc = rtems_semaphore_create (rtems_build_name ('B', 'D', 'C', 'l'),
c5cc: e2853028 add r3, r5, #40 ; 0x28
*/
cache_aligment = 32; /* FIXME rtems_cache_get_data_line_size() */
if (cache_aligment <= 0)
cache_aligment = CPU_ALIGNMENT;
bdbuf_cache.sync_device = BDBUF_INVALID_DEV;
c5d0: e5858038 str r8, [r5, #56] ; 0x38
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
c5d4: e585800c str r8, [r5, #12]
c5d8: e5858044 str r8, [r5, #68] ; 0x44
c5dc: e5858050 str r8, [r5, #80] ; 0x50
c5e0: e585805c str r8, [r5, #92] ; 0x5c
c5e4: e585808c str r8, [r5, #140] ; 0x8c
rtems_chain_initialize_empty (&bdbuf_cache.read_ahead_chain);
/*
* Create the locks for the cache.
*/
sc = rtems_semaphore_create (rtems_build_name ('B', 'D', 'C', 'l'),
c5e8: e59f02fc ldr r0, [pc, #764] ; c8ec <rtems_bdbuf_init+0x3f4>
c5ec: e58d3000 str r3, [sp]
c5f0: e1a01007 mov r1, r7
c5f4: e1a03008 mov r3, r8
c5f8: e3a02054 mov r2, #84 ; 0x54
c5fc: ebffea8d bl 7038 <rtems_semaphore_create>
1, RTEMS_BDBUF_CACHE_LOCK_ATTRIBS, 0,
&bdbuf_cache.lock);
if (sc != RTEMS_SUCCESSFUL)
c600: e2508000 subs r8, r0, #0
c604: 1a000093 bne c858 <rtems_bdbuf_init+0x360>
goto error;
rtems_bdbuf_lock_cache ();
c608: ebfffa30 bl aed0 <rtems_bdbuf_lock_cache>
sc = rtems_semaphore_create (rtems_build_name ('B', 'D', 'C', 's'),
c60c: e285302c add r3, r5, #44 ; 0x2c
c610: e58d3000 str r3, [sp]
c614: e1a01007 mov r1, r7
c618: e59f02d0 ldr r0, [pc, #720] ; c8f0 <rtems_bdbuf_init+0x3f8>
c61c: e3a02054 mov r2, #84 ; 0x54
c620: e1a03008 mov r3, r8
c624: ebffea83 bl 7038 <rtems_semaphore_create>
1, RTEMS_BDBUF_CACHE_LOCK_ATTRIBS, 0,
&bdbuf_cache.sync_lock);
if (sc != RTEMS_SUCCESSFUL)
c628: e2501000 subs r1, r0, #0
c62c: 1a000089 bne c858 <rtems_bdbuf_init+0x360>
goto error;
sc = rtems_semaphore_create (rtems_build_name ('B', 'D', 'C', 'a'),
c630: e2853068 add r3, r5, #104 ; 0x68
c634: e58d3000 str r3, [sp]
c638: e59f02b4 ldr r0, [pc, #692] ; c8f4 <rtems_bdbuf_init+0x3fc>
c63c: e1a03001 mov r3, r1
c640: e3a02024 mov r2, #36 ; 0x24
c644: ebffea7b bl 7038 <rtems_semaphore_create>
0, RTEMS_BDBUF_CACHE_WAITER_ATTRIBS, 0,
&bdbuf_cache.access_waiters.sema);
if (sc != RTEMS_SUCCESSFUL)
c648: e2501000 subs r1, r0, #0
c64c: 1a000081 bne c858 <rtems_bdbuf_init+0x360>
goto error;
sc = rtems_semaphore_create (rtems_build_name ('B', 'D', 'C', 't'),
c650: e2853070 add r3, r5, #112 ; 0x70
c654: e58d3000 str r3, [sp]
c658: e59f0298 ldr r0, [pc, #664] ; c8f8 <rtems_bdbuf_init+0x400>
c65c: e1a03001 mov r3, r1
c660: e3a02024 mov r2, #36 ; 0x24
c664: ebffea73 bl 7038 <rtems_semaphore_create>
0, RTEMS_BDBUF_CACHE_WAITER_ATTRIBS, 0,
&bdbuf_cache.transfer_waiters.sema);
if (sc != RTEMS_SUCCESSFUL)
c668: e2501000 subs r1, r0, #0
c66c: 1a000079 bne c858 <rtems_bdbuf_init+0x360>
goto error;
sc = rtems_semaphore_create (rtems_build_name ('B', 'D', 'C', 'b'),
c670: e2853078 add r3, r5, #120 ; 0x78
c674: e58d3000 str r3, [sp]
c678: e59f027c ldr r0, [pc, #636] ; c8fc <rtems_bdbuf_init+0x404>
c67c: e3a02024 mov r2, #36 ; 0x24
c680: e1a03001 mov r3, r1
c684: ebffea6b bl 7038 <rtems_semaphore_create>
0, RTEMS_BDBUF_CACHE_WAITER_ATTRIBS, 0,
&bdbuf_cache.buffer_waiters.sema);
if (sc != RTEMS_SUCCESSFUL)
c688: e3500000 cmp r0, #0
c68c: 1a000071 bne c858 <rtems_bdbuf_init+0x360>
/*
* Compute the various number of elements in the cache.
*/
bdbuf_cache.buffer_min_count =
bdbuf_config.size / bdbuf_config.buffer_min;
c690: e5960020 ldr r0, [r6, #32]
c694: e1a01004 mov r1, r4
c698: eb0037ac bl 1a550 <__aeabi_uidiv>
bdbuf_cache.max_bds_per_group =
bdbuf_config.buffer_max / bdbuf_config.buffer_min;
c69c: e1a01004 mov r1, r4
/*
* Compute the various number of elements in the cache.
*/
bdbuf_cache.buffer_min_count =
bdbuf_config.size / bdbuf_config.buffer_min;
c6a0: e1a06000 mov r6, r0
goto error;
/*
* Compute the various number of elements in the cache.
*/
bdbuf_cache.buffer_min_count =
c6a4: e585001c str r0, [r5, #28]
bdbuf_config.size / bdbuf_config.buffer_min;
bdbuf_cache.max_bds_per_group =
bdbuf_config.buffer_max / bdbuf_config.buffer_min;
c6a8: e1a00009 mov r0, r9
c6ac: eb0037a7 bl 1a550 <__aeabi_uidiv>
c6b0: e1a01000 mov r1, r0
/*
* Compute the various number of elements in the cache.
*/
bdbuf_cache.buffer_min_count =
bdbuf_config.size / bdbuf_config.buffer_min;
bdbuf_cache.max_bds_per_group =
c6b4: e5850020 str r0, [r5, #32]
bdbuf_config.buffer_max / bdbuf_config.buffer_min;
bdbuf_cache.group_count =
bdbuf_cache.buffer_min_count / bdbuf_cache.max_bds_per_group;
c6b8: e1a00006 mov r0, r6
c6bc: eb0037a3 bl 1a550 <__aeabi_uidiv>
/*
* Allocate the memory for the buffer descriptors.
*/
bdbuf_cache.bds = calloc (sizeof (rtems_bdbuf_buffer),
c6c0: e1a01006 mov r1, r6
*/
bdbuf_cache.buffer_min_count =
bdbuf_config.size / bdbuf_config.buffer_min;
bdbuf_cache.max_bds_per_group =
bdbuf_config.buffer_max / bdbuf_config.buffer_min;
bdbuf_cache.group_count =
c6c4: e585007c str r0, [r5, #124] ; 0x7c
bdbuf_cache.buffer_min_count / bdbuf_cache.max_bds_per_group;
c6c8: e1a07000 mov r7, r0
/*
* Allocate the memory for the buffer descriptors.
*/
bdbuf_cache.bds = calloc (sizeof (rtems_bdbuf_buffer),
c6cc: e3a00038 mov r0, #56 ; 0x38
c6d0: ebffdaa2 bl 3160 <calloc>
bdbuf_cache.buffer_min_count);
if (!bdbuf_cache.bds)
c6d4: e3500000 cmp r0, #0
bdbuf_cache.buffer_min_count / bdbuf_cache.max_bds_per_group;
/*
* Allocate the memory for the buffer descriptors.
*/
bdbuf_cache.bds = calloc (sizeof (rtems_bdbuf_buffer),
c6d8: e5850014 str r0, [r5, #20]
bdbuf_cache.buffer_min_count);
if (!bdbuf_cache.bds)
c6dc: 0a00005d beq c858 <rtems_bdbuf_init+0x360>
goto error;
/*
* Allocate the memory for the buffer descriptors.
*/
bdbuf_cache.groups = calloc (sizeof (rtems_bdbuf_group),
c6e0: e3a00014 mov r0, #20
c6e4: e1a01007 mov r1, r7
c6e8: ebffda9c bl 3160 <calloc>
bdbuf_cache.group_count);
if (!bdbuf_cache.groups)
c6ec: e3500000 cmp r0, #0
goto error;
/*
* Allocate the memory for the buffer descriptors.
*/
bdbuf_cache.groups = calloc (sizeof (rtems_bdbuf_group),
c6f0: e5850080 str r0, [r5, #128] ; 0x80
bdbuf_cache.group_count);
if (!bdbuf_cache.groups)
c6f4: 0a000057 beq c858 <rtems_bdbuf_init+0x360>
* aligned. It is possible to free the memory allocated by rtems_memalign()
* with free(). Return 0 if allocated.
*
* The memory allocate allows a
*/
if (rtems_memalign ((void **) &bdbuf_cache.buffers,
c6f8: e59f51e8 ldr r5, [pc, #488] ; c8e8 <rtems_bdbuf_init+0x3f0>
c6fc: e3a01020 mov r1, #32
c700: e2850018 add r0, r5, #24
c704: e0020694 mul r2, r4, r6
c708: eb0006f2 bl e2d8 <rtems_memalign>
c70c: e2508000 subs r8, r0, #0
c710: 1a000050 bne c858 <rtems_bdbuf_init+0x360>
* The cache is empty after opening so we need to add all the buffers to it
* and initialise the groups.
*/
for (b = 0, group = bdbuf_cache.groups,
bd = bdbuf_cache.bds, buffer = bdbuf_cache.buffers;
b < bdbuf_cache.buffer_min_count;
c714: e595201c ldr r2, [r5, #28]
bd->group = group;
bd->buffer = buffer;
rtems_chain_append_unprotected (&bdbuf_cache.lru, &bd->link);
if ((b % bdbuf_cache.max_bds_per_group) ==
c718: e5953020 ldr r3, [r5, #32]
/*
* The cache is empty after opening so we need to add all the buffers to it
* and initialise the groups.
*/
for (b = 0, group = bdbuf_cache.groups,
bd = bdbuf_cache.bds, buffer = bdbuf_cache.buffers;
c71c: e285a014 add sl, r5, #20
/*
* The cache is empty after opening so we need to add all the buffers to it
* and initialise the groups.
*/
for (b = 0, group = bdbuf_cache.groups,
c720: e5957080 ldr r7, [r5, #128] ; 0x80
bd = bdbuf_cache.bds, buffer = bdbuf_cache.buffers;
c724: e89a0c00 ldm sl, {sl, fp}
b < bdbuf_cache.buffer_min_count;
c728: e58d200c str r2, [sp, #12]
bd->buffer = buffer;
rtems_chain_append_unprotected (&bdbuf_cache.lru, &bd->link);
if ((b % bdbuf_cache.max_bds_per_group) ==
(bdbuf_cache.max_bds_per_group - 1))
c72c: e2432001 sub r2, r3, #1
c730: e58d2010 str r2, [sp, #16]
/*
* The cache is empty after opening so we need to add all the buffers to it
* and initialise the groups.
*/
for (b = 0, group = bdbuf_cache.groups,
c734: e1a09007 mov r9, r7
c738: e58d7014 str r7, [sp, #20]
bd = bdbuf_cache.bds, buffer = bdbuf_cache.buffers;
c73c: e1a0600a mov r6, sl
b < bdbuf_cache.buffer_min_count;
b++, bd++, buffer += bdbuf_config.buffer_min)
{
bd->dd = BDBUF_INVALID_DEV;
c740: e1a02008 mov r2, r8
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
c744: e285c044 add ip, r5, #68 ; 0x44
c748: e1a07003 mov r7, r3
/*
* The cache is empty after opening so we need to add all the buffers to it
* and initialise the groups.
*/
for (b = 0, group = bdbuf_cache.groups,
c74c: ea000014 b c7a4 <rtems_bdbuf_init+0x2ac>
bd = bdbuf_cache.bds, buffer = bdbuf_cache.buffers;
b < bdbuf_cache.buffer_min_count;
b++, bd++, buffer += bdbuf_config.buffer_min)
{
bd->dd = BDBUF_INVALID_DEV;
c750: e5862014 str r2, [r6, #20]
bd->group = group;
c754: e5869028 str r9, [r6, #40] ; 0x28
bd->buffer = buffer;
c758: e586b01c str fp, [r6, #28]
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
c75c: e5951048 ldr r1, [r5, #72] ; 0x48
rtems_chain_append_unprotected (&bdbuf_cache.lru, &bd->link);
if ((b % bdbuf_cache.max_bds_per_group) ==
c760: e1a00008 mov r0, r8
the_node->next = tail;
c764: e586c000 str ip, [r6]
tail->previous = the_node;
old_last->next = the_node;
c768: e5816000 str r6, [r1]
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
c76c: e5856048 str r6, [r5, #72] ; 0x48
old_last->next = the_node;
the_node->previous = old_last;
c770: e5861004 str r1, [r6, #4]
c774: e1a01007 mov r1, r7
c778: e58d2008 str r2, [sp, #8]
c77c: e58dc004 str ip, [sp, #4]
c780: eb0037b8 bl 1a668 <__umodsi3>
c784: e59d3010 ldr r3, [sp, #16]
c788: e59d2008 ldr r2, [sp, #8]
c78c: e1500003 cmp r0, r3
c790: e59dc004 ldr ip, [sp, #4]
(bdbuf_cache.max_bds_per_group - 1))
group++;
c794: 02899014 addeq r9, r9, #20
* and initialise the groups.
*/
for (b = 0, group = bdbuf_cache.groups,
bd = bdbuf_cache.bds, buffer = bdbuf_cache.buffers;
b < bdbuf_cache.buffer_min_count;
b++, bd++, buffer += bdbuf_config.buffer_min)
c798: e2888001 add r8, r8, #1
c79c: e2866038 add r6, r6, #56 ; 0x38
c7a0: e08bb004 add fp, fp, r4
/*
* The cache is empty after opening so we need to add all the buffers to it
* and initialise the groups.
*/
for (b = 0, group = bdbuf_cache.groups,
c7a4: e59d300c ldr r3, [sp, #12]
c7a8: e1580003 cmp r8, r3
c7ac: e59f1134 ldr r1, [pc, #308] ; c8e8 <rtems_bdbuf_init+0x3f0>
c7b0: 1affffe6 bne c750 <rtems_bdbuf_init+0x258>
b < bdbuf_cache.group_count;
b++,
group++,
bd += bdbuf_cache.max_bds_per_group)
{
group->bds_per_group = bdbuf_cache.max_bds_per_group;
c7b4: e5912020 ldr r2, [r1, #32]
}
for (b = 0,
group = bdbuf_cache.groups,
bd = bdbuf_cache.bds;
b < bdbuf_cache.group_count;
c7b8: e591007c ldr r0, [r1, #124] ; 0x7c
b++,
group++,
bd += bdbuf_cache.max_bds_per_group)
c7bc: e3a01038 mov r1, #56 ; 0x38
c7c0: e59d7014 ldr r7, [sp, #20]
c7c4: e0010192 mul r1, r2, r1
c7c8: e3a03000 mov r3, #0
c7cc: ea000004 b c7e4 <rtems_bdbuf_init+0x2ec>
{
group->bds_per_group = bdbuf_cache.max_bds_per_group;
group->bdbuf = bd;
c7d0: e587a010 str sl, [r7, #16]
b < bdbuf_cache.group_count;
b++,
group++,
bd += bdbuf_cache.max_bds_per_group)
{
group->bds_per_group = bdbuf_cache.max_bds_per_group;
c7d4: e5872008 str r2, [r7, #8]
for (b = 0,
group = bdbuf_cache.groups,
bd = bdbuf_cache.bds;
b < bdbuf_cache.group_count;
b++,
c7d8: e2833001 add r3, r3, #1
group++,
c7dc: e2877014 add r7, r7, #20
bd += bdbuf_cache.max_bds_per_group)
c7e0: e08aa001 add sl, sl, r1
if ((b % bdbuf_cache.max_bds_per_group) ==
(bdbuf_cache.max_bds_per_group - 1))
group++;
}
for (b = 0,
c7e4: e1530000 cmp r3, r0
c7e8: 1afffff8 bne c7d0 <rtems_bdbuf_init+0x2d8>
/*
* Create and start swapout task. This task will create and manage the worker
* threads.
*/
bdbuf_cache.swapout_enabled = true;
c7ec: e59f40f4 ldr r4, [pc, #244] ; c8e8 <rtems_bdbuf_init+0x3f0>
sc = rtems_bdbuf_create_task (rtems_build_name('B', 'S', 'W', 'P'),
c7f0: e59f50ec ldr r5, [pc, #236] ; c8e4 <rtems_bdbuf_init+0x3ec>
/*
* Create and start swapout task. This task will create and manage the worker
* threads.
*/
bdbuf_cache.swapout_enabled = true;
c7f4: e3a06001 mov r6, #1
c7f8: e5c46004 strb r6, [r4, #4]
sc = rtems_bdbuf_create_task (rtems_build_name('B', 'S', 'W', 'P'),
c7fc: e3a03000 mov r3, #0
c800: e59f00f8 ldr r0, [pc, #248] ; c900 <rtems_bdbuf_init+0x408>
c804: e5951008 ldr r1, [r5, #8]
c808: e59f20f4 ldr r2, [pc, #244] ; c904 <rtems_bdbuf_init+0x40c>
c80c: e58d4000 str r4, [sp]
c810: ebfffaae bl b2d0 <rtems_bdbuf_create_task.constprop.10>
bdbuf_config.swapout_priority,
RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT,
rtems_bdbuf_swapout_task,
0,
&bdbuf_cache.swapout);
if (sc != RTEMS_SUCCESSFUL)
c814: e2503000 subs r3, r0, #0
c818: 1a00000e bne c858 <rtems_bdbuf_init+0x360>
goto error;
if (bdbuf_config.max_read_ahead_blocks > 0)
c81c: e5952000 ldr r2, [r5]
c820: e3520000 cmp r2, #0
c824: 0a000008 beq c84c <rtems_bdbuf_init+0x354>
{
bdbuf_cache.read_ahead_enabled = true;
c828: e5c46094 strb r6, [r4, #148] ; 0x94
sc = rtems_bdbuf_create_task (rtems_build_name('B', 'R', 'D', 'A'),
c82c: e59f00d4 ldr r0, [pc, #212] ; c908 <rtems_bdbuf_init+0x410>
c830: e2844084 add r4, r4, #132 ; 0x84
c834: e595102c ldr r1, [r5, #44] ; 0x2c
c838: e59f20cc ldr r2, [pc, #204] ; c90c <rtems_bdbuf_init+0x414>
c83c: e58d4000 str r4, [sp]
c840: ebfffaa2 bl b2d0 <rtems_bdbuf_create_task.constprop.10>
bdbuf_config.read_ahead_priority,
RTEMS_BDBUF_READ_AHEAD_TASK_PRIORITY_DEFAULT,
rtems_bdbuf_read_ahead_task,
0,
&bdbuf_cache.read_ahead_task);
if (sc != RTEMS_SUCCESSFUL)
c844: e3500000 cmp r0, #0
c848: 1a000002 bne c858 <rtems_bdbuf_init+0x360>
goto error;
}
rtems_bdbuf_unlock_cache ();
c84c: ebfff9b8 bl af34 <rtems_bdbuf_unlock_cache>
return RTEMS_SUCCESSFUL;
c850: e3a00000 mov r0, #0
c854: ea00001f b c8d8 <rtems_bdbuf_init+0x3e0>
error:
if (bdbuf_cache.read_ahead_task != 0)
c858: e59f4088 ldr r4, [pc, #136] ; c8e8 <rtems_bdbuf_init+0x3f0><== NOT EXECUTED
c85c: e5940084 ldr r0, [r4, #132] ; 0x84 <== NOT EXECUTED
c860: e3500000 cmp r0, #0 <== NOT EXECUTED
rtems_task_delete (bdbuf_cache.read_ahead_task);
c864: 1bffeb55 blne 75c0 <rtems_task_delete> <== NOT EXECUTED
if (bdbuf_cache.swapout != 0)
c868: e5940000 ldr r0, [r4] <== NOT EXECUTED
c86c: e3500000 cmp r0, #0 <== NOT EXECUTED
rtems_task_delete (bdbuf_cache.swapout);
c870: 1bffeb52 blne 75c0 <rtems_task_delete> <== NOT EXECUTED
free (bdbuf_cache.buffers);
c874: e5940018 ldr r0, [r4, #24] <== NOT EXECUTED
c878: ebffdaec bl 3430 <free> <== NOT EXECUTED
free (bdbuf_cache.groups);
c87c: e5940080 ldr r0, [r4, #128] ; 0x80 <== NOT EXECUTED
c880: ebffdaea bl 3430 <free> <== NOT EXECUTED
free (bdbuf_cache.bds);
c884: e5940014 ldr r0, [r4, #20] <== NOT EXECUTED
c888: ebffdae8 bl 3430 <free> <== NOT EXECUTED
rtems_semaphore_delete (bdbuf_cache.buffer_waiters.sema);
c88c: e5940078 ldr r0, [r4, #120] ; 0x78 <== NOT EXECUTED
c890: ebffea50 bl 71d8 <rtems_semaphore_delete> <== NOT EXECUTED
rtems_semaphore_delete (bdbuf_cache.access_waiters.sema);
c894: e5940068 ldr r0, [r4, #104] ; 0x68 <== NOT EXECUTED
c898: ebffea4e bl 71d8 <rtems_semaphore_delete> <== NOT EXECUTED
rtems_semaphore_delete (bdbuf_cache.transfer_waiters.sema);
c89c: e5940070 ldr r0, [r4, #112] ; 0x70 <== NOT EXECUTED
c8a0: ebffea4c bl 71d8 <rtems_semaphore_delete> <== NOT EXECUTED
rtems_semaphore_delete (bdbuf_cache.sync_lock);
c8a4: e594002c ldr r0, [r4, #44] ; 0x2c <== NOT EXECUTED
c8a8: ebffea4a bl 71d8 <rtems_semaphore_delete> <== NOT EXECUTED
if (bdbuf_cache.lock != 0)
c8ac: e5943028 ldr r3, [r4, #40] ; 0x28 <== NOT EXECUTED
c8b0: e3530000 cmp r3, #0 <== NOT EXECUTED
c8b4: 0a000003 beq c8c8 <rtems_bdbuf_init+0x3d0> <== NOT EXECUTED
{
rtems_bdbuf_unlock_cache ();
c8b8: ebfff99d bl af34 <rtems_bdbuf_unlock_cache> <== NOT EXECUTED
rtems_semaphore_delete (bdbuf_cache.lock);
c8bc: e59f3024 ldr r3, [pc, #36] ; c8e8 <rtems_bdbuf_init+0x3f0> <== NOT EXECUTED
c8c0: e5930028 ldr r0, [r3, #40] ; 0x28 <== NOT EXECUTED
c8c4: ebffea43 bl 71d8 <rtems_semaphore_delete> <== NOT EXECUTED
}
bdbuf_cache.initialised = false;
c8c8: e59f3018 ldr r3, [pc, #24] ; c8e8 <rtems_bdbuf_init+0x3f0> <== NOT EXECUTED
c8cc: e3a02000 mov r2, #0 <== NOT EXECUTED
c8d0: e5c32095 strb r2, [r3, #149] ; 0x95 <== NOT EXECUTED
return RTEMS_UNSATISFIED;
c8d4: e3a0000d mov r0, #13 <== NOT EXECUTED
}
c8d8: e28dd018 add sp, sp, #24
c8dc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000aed0 <rtems_bdbuf_lock_cache>:
* Lock the cache. A single task can nest calls.
*/
static void
rtems_bdbuf_lock_cache (void)
{
rtems_bdbuf_lock (bdbuf_cache.lock, RTEMS_BDBUF_FATAL_CACHE_LOCK);
aed0: e59f3020 ldr r3, [pc, #32] ; aef8 <rtems_bdbuf_lock_cache+0x28>
* @param fatal_error_code The error code if the call fails.
*/
static void
rtems_bdbuf_lock (rtems_id lock, uint32_t fatal_error_code)
{
rtems_status_code sc = rtems_semaphore_obtain (lock,
aed4: e3a01000 mov r1, #0
/**
* Lock the cache. A single task can nest calls.
*/
static void
rtems_bdbuf_lock_cache (void)
{
aed8: e52de004 push {lr} ; (str lr, [sp, #-4]!)
* @param fatal_error_code The error code if the call fails.
*/
static void
rtems_bdbuf_lock (rtems_id lock, uint32_t fatal_error_code)
{
rtems_status_code sc = rtems_semaphore_obtain (lock,
aedc: e5930028 ldr r0, [r3, #40] ; 0x28
aee0: e1a02001 mov r2, r1
aee4: ebfff0e2 bl 7274 <rtems_semaphore_obtain>
RTEMS_WAIT,
RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
aee8: e3500000 cmp r0, #0
aeec: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
rtems_bdbuf_fatal (fatal_error_code);
aef0: e3a00000 mov r0, #0 <== NOT EXECUTED
aef4: ebfffff1 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
0000aefc <rtems_bdbuf_lock_sync>:
* Lock the cache's sync. A single task can nest calls.
*/
static void
rtems_bdbuf_lock_sync (void)
{
rtems_bdbuf_lock (bdbuf_cache.sync_lock, RTEMS_BDBUF_FATAL_SYNC_LOCK);
aefc: e59f3020 ldr r3, [pc, #32] ; af24 <rtems_bdbuf_lock_sync+0x28>
* @param fatal_error_code The error code if the call fails.
*/
static void
rtems_bdbuf_lock (rtems_id lock, uint32_t fatal_error_code)
{
rtems_status_code sc = rtems_semaphore_obtain (lock,
af00: e3a01000 mov r1, #0
/**
* Lock the cache's sync. A single task can nest calls.
*/
static void
rtems_bdbuf_lock_sync (void)
{
af04: e52de004 push {lr} ; (str lr, [sp, #-4]!)
* @param fatal_error_code The error code if the call fails.
*/
static void
rtems_bdbuf_lock (rtems_id lock, uint32_t fatal_error_code)
{
rtems_status_code sc = rtems_semaphore_obtain (lock,
af08: e593002c ldr r0, [r3, #44] ; 0x2c
af0c: e1a02001 mov r2, r1
af10: ebfff0d7 bl 7274 <rtems_semaphore_obtain>
RTEMS_WAIT,
RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
af14: e3500000 cmp r0, #0
af18: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
rtems_bdbuf_fatal (fatal_error_code);
af1c: e3a00019 mov r0, #25 <== NOT EXECUTED
af20: ebffffe6 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
0000ce30 <rtems_bdbuf_purge_dev>:
}
}
void
rtems_bdbuf_purge_dev (rtems_disk_device *dd)
{
ce30: e92d41f0 push {r4, r5, r6, r7, r8, lr}
ce34: e24dd08c sub sp, sp, #140 ; 0x8c
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ce38: e28d3080 add r3, sp, #128 ; 0x80
ce3c: e1a06000 mov r6, r0
head->previous = NULL;
ce40: e3a08000 mov r8, #0
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ce44: e28d7084 add r7, sp, #132 ; 0x84
head->previous = NULL;
tail->previous = head;
ce48: e58d3088 str r3, [sp, #136] ; 0x88
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
ce4c: e58d8084 str r8, [sp, #132] ; 0x84
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
ce50: e58d7080 str r7, [sp, #128] ; 0x80
rtems_chain_control purge_list;
rtems_chain_initialize_empty (&purge_list);
rtems_bdbuf_lock_cache ();
ce54: ebfff81d bl aed0 <rtems_bdbuf_lock_cache>
}
static void
rtems_bdbuf_read_ahead_reset (rtems_disk_device *dd)
{
rtems_bdbuf_read_ahead_cancel (dd);
ce58: e1a00006 mov r0, r6
ce5c: ebfff8d9 bl b1c8 <rtems_bdbuf_read_ahead_cancel>
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
ce60: e3e03000 mvn r3, #0
ce64: e586306c str r3, [r6, #108] ; 0x6c
rtems_bdbuf_gather_for_purge (rtems_chain_control *purge_list,
const rtems_disk_device *dd)
{
rtems_bdbuf_buffer *stack [RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer **prev = stack;
rtems_bdbuf_buffer *cur = bdbuf_cache.tree;
ce68: e59f3184 ldr r3, [pc, #388] ; cff4 <rtems_bdbuf_purge_dev+0x1c4>
*prev = NULL;
ce6c: e28d508c add r5, sp, #140 ; 0x8c
ce70: e525808c str r8, [r5, #-140]! ; 0x8c
rtems_bdbuf_gather_for_purge (rtems_chain_control *purge_list,
const rtems_disk_device *dd)
{
rtems_bdbuf_buffer *stack [RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer **prev = stack;
rtems_bdbuf_buffer *cur = bdbuf_cache.tree;
ce74: e593403c ldr r4, [r3, #60] ; 0x3c
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
ce78: e3a08006 mov r8, #6
ce7c: ea00003e b cf7c <rtems_bdbuf_purge_dev+0x14c>
*prev = NULL;
while (cur != NULL)
{
if (cur->dd == dd)
ce80: e5943014 ldr r3, [r4, #20]
ce84: e1530006 cmp r3, r6
ce88: 1a000024 bne cf20 <rtems_bdbuf_purge_dev+0xf0>
{
switch (cur->state)
ce8c: e5943020 ldr r3, [r4, #32]
ce90: e353000a cmp r3, #10
ce94: 979ff103 ldrls pc, [pc, r3, lsl #2]
ce98: ea00001e b cf18 <rtems_bdbuf_purge_dev+0xe8> <== NOT EXECUTED
ce9c: 0000cf20 .word 0x0000cf20 <== NOT EXECUTED
cea0: 0000cf20 .word 0x0000cf20 <== NOT EXECUTED
cea4: 0000cee0 .word 0x0000cee0 <== NOT EXECUTED
cea8: 0000cf10 .word 0x0000cf10 <== NOT EXECUTED
ceac: 0000cf10 .word 0x0000cf10 <== NOT EXECUTED
ceb0: 0000cf10 .word 0x0000cf10 <== NOT EXECUTED
ceb4: 0000cf20 .word 0x0000cf20 <== NOT EXECUTED
ceb8: 0000ced0 .word 0x0000ced0 <== NOT EXECUTED
cebc: 0000cec8 .word 0x0000cec8 <== NOT EXECUTED
cec0: 0000cf04 .word 0x0000cf04 <== NOT EXECUTED
cec4: 0000cf20 .word 0x0000cf20 <== NOT EXECUTED
case RTEMS_BDBUF_STATE_EMPTY:
case RTEMS_BDBUF_STATE_ACCESS_PURGED:
case RTEMS_BDBUF_STATE_TRANSFER_PURGED:
break;
case RTEMS_BDBUF_STATE_SYNC:
rtems_bdbuf_wake (&bdbuf_cache.transfer_waiters);
cec8: e59f0128 ldr r0, [pc, #296] ; cff8 <rtems_bdbuf_purge_dev+0x1c8>
cecc: ebfff8cb bl b200 <rtems_bdbuf_wake>
}
static void
rtems_bdbuf_group_release (rtems_bdbuf_buffer *bd)
{
--bd->group->users;
ced0: e5943028 ldr r3, [r4, #40] ; 0x28
ced4: e593200c ldr r2, [r3, #12]
ced8: e2422001 sub r2, r2, #1
cedc: e583200c str r2, [r3, #12]
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
cee0: e894000c ldm r4, {r2, r3}
next->previous = previous;
cee4: e5823004 str r3, [r2, #4]
previous->next = next;
cee8: e5832000 str r2, [r3]
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
ceec: e59d3088 ldr r3, [sp, #136] ; 0x88
the_node->next = tail;
cef0: e5847000 str r7, [r4]
tail->previous = the_node;
cef4: e58d4088 str r4, [sp, #136] ; 0x88
old_last->next = the_node;
cef8: e5834000 str r4, [r3]
the_node->previous = old_last;
cefc: e5843004 str r3, [r4, #4]
cf00: ea000006 b cf20 <rtems_bdbuf_purge_dev+0xf0>
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
cf04: e3a0300a mov r3, #10
cf08: e5843020 str r3, [r4, #32]
cf0c: ea000003 b cf20 <rtems_bdbuf_purge_dev+0xf0>
cf10: e5848020 str r8, [r4, #32]
cf14: ea000001 b cf20 <rtems_bdbuf_purge_dev+0xf0>
case RTEMS_BDBUF_STATE_ACCESS_EMPTY:
case RTEMS_BDBUF_STATE_ACCESS_MODIFIED:
rtems_bdbuf_set_state (cur, RTEMS_BDBUF_STATE_ACCESS_PURGED);
break;
default:
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_STATE_11);
cf18: e3a00017 mov r0, #23 <== NOT EXECUTED
cf1c: ebfff7e7 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
}
}
if (cur->avl.left != NULL)
cf20: e5943008 ldr r3, [r4, #8]
cf24: e3530000 cmp r3, #0
cf28: 1a000003 bne cf3c <rtems_bdbuf_purge_dev+0x10c>
/* Left */
++prev;
*prev = cur;
cur = cur->avl.left;
}
else if (cur->avl.right != NULL)
cf2c: e594300c ldr r3, [r4, #12]
cf30: e3530000 cmp r3, #0
cf34: 01a01005 moveq r1, r5
cf38: 0a000003 beq cf4c <rtems_bdbuf_purge_dev+0x11c>
{
/* Right */
++prev;
*prev = cur;
cf3c: e5854004 str r4, [r5, #4]
cur = cur->avl.left;
}
else if (cur->avl.right != NULL)
{
/* Right */
++prev;
cf40: e2855004 add r5, r5, #4
cf44: ea00000b b cf78 <rtems_bdbuf_purge_dev+0x148>
}
}
void
rtems_bdbuf_purge_dev (rtems_disk_device *dd)
{
cf48: e1a04003 mov r4, r3
*prev = cur;
cur = cur->avl.right;
}
else
{
while (*prev != NULL
cf4c: e5913000 ldr r3, [r1]
cf50: e3530000 cmp r3, #0
}
else if (cur->avl.right != NULL)
{
/* Right */
++prev;
*prev = cur;
cf54: e1a05001 mov r5, r1
cur = cur->avl.right;
}
else
{
while (*prev != NULL
cf58: e2411004 sub r1, r1, #4
cf5c: 0a000005 beq cf78 <rtems_bdbuf_purge_dev+0x148>
&& (cur == (*prev)->avl.right || (*prev)->avl.right == NULL))
cf60: e593200c ldr r2, [r3, #12]
cf64: e1540002 cmp r4, r2
cf68: 0afffff6 beq cf48 <rtems_bdbuf_purge_dev+0x118>
cf6c: e3520000 cmp r2, #0
cf70: 0afffff4 beq cf48 <rtems_bdbuf_purge_dev+0x118>
cf74: ea00001c b cfec <rtems_bdbuf_purge_dev+0x1bc>
}
if (cur->avl.left != NULL)
{
/* Left */
++prev;
cf78: e1a04003 mov r4, r3
rtems_bdbuf_buffer **prev = stack;
rtems_bdbuf_buffer *cur = bdbuf_cache.tree;
*prev = NULL;
while (cur != NULL)
cf7c: e3540000 cmp r4, #0
cf80: 1affffbe bne ce80 <rtems_bdbuf_purge_dev+0x50>
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
cf84: e28d6080 add r6, sp, #128 ; 0x80
cf88: e2868004 add r8, r6, #4
cf8c: e3a07001 mov r7, #1
cf90: ea000003 b cfa4 <rtems_bdbuf_purge_dev+0x174>
{
rtems_bdbuf_make_empty (bd);
if (bd->waiters == 0)
{
rtems_bdbuf_remove_from_tree (bd);
cf94: e1a00005 mov r0, r5
cf98: ebfff8e5 bl b334 <rtems_bdbuf_remove_from_tree>
rtems_bdbuf_make_free_and_add_to_lru_list (bd);
cf9c: e1a00005 mov r0, r5
cfa0: ebfff765 bl ad3c <rtems_bdbuf_make_free_and_add_to_lru_list>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
cfa4: e59d5080 ldr r5, [sp, #128] ; 0x80
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
cfa8: e1550008 cmp r5, r8
cfac: 0a000008 beq cfd4 <rtems_bdbuf_purge_dev+0x1a4>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
cfb0: e5953000 ldr r3, [r5]
head->next = new_first;
new_first->previous = head;
cfb4: e5836004 str r6, [r3, #4]
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
cfb8: e58d3080 str r3, [sp, #128] ; 0x80
while ((node = rtems_chain_get_unprotected (purge_list)) != NULL)
{
rtems_bdbuf_buffer *bd = (rtems_bdbuf_buffer *) node;
if (bd->waiters == 0)
cfbc: e5953024 ldr r3, [r5, #36] ; 0x24
wake_buffer_waiters = true;
cfc0: e3530000 cmp r3, #0
cfc4: 03a04001 moveq r4, #1
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
cfc8: e5857020 str r7, [r5, #32]
static void
rtems_bdbuf_discard_buffer (rtems_bdbuf_buffer *bd)
{
rtems_bdbuf_make_empty (bd);
if (bd->waiters == 0)
cfcc: 1afffff4 bne cfa4 <rtems_bdbuf_purge_dev+0x174>
cfd0: eaffffef b cf94 <rtems_bdbuf_purge_dev+0x164>
wake_buffer_waiters = true;
rtems_bdbuf_discard_buffer (bd);
}
if (wake_buffer_waiters)
cfd4: e3540000 cmp r4, #0
rtems_bdbuf_wake (&bdbuf_cache.buffer_waiters);
cfd8: 159f001c ldrne r0, [pc, #28] ; cffc <rtems_bdbuf_purge_dev+0x1cc>
cfdc: 1bfff887 blne b200 <rtems_bdbuf_wake>
rtems_chain_initialize_empty (&purge_list);
rtems_bdbuf_lock_cache ();
rtems_bdbuf_read_ahead_reset (dd);
rtems_bdbuf_gather_for_purge (&purge_list, dd);
rtems_bdbuf_purge_list (&purge_list);
rtems_bdbuf_unlock_cache ();
cfe0: ebfff7d3 bl af34 <rtems_bdbuf_unlock_cache>
}
cfe4: e28dd08c add sp, sp, #140 ; 0x8c
cfe8: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
cur = *prev;
--prev;
}
if (*prev != NULL)
/* Right */
cur = (*prev)->avl.right;
cfec: e1a03002 mov r3, r2
cff0: eaffffe0 b cf78 <rtems_bdbuf_purge_dev+0x148>
0000c9d4 <rtems_bdbuf_read>:
rtems_status_code
rtems_bdbuf_read (rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer **bd_ptr)
{
c9d4: e92d41f0 push {r4, r5, r6, r7, r8, lr}
c9d8: e1a04000 mov r4, r0
c9dc: e1a05001 mov r5, r1
c9e0: e1a06002 mov r6, r2
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
rtems_blkdev_bnum media_block;
rtems_bdbuf_lock_cache ();
c9e4: ebfff939 bl aed0 <rtems_bdbuf_lock_cache>
rtems_blkdev_bnum block,
rtems_blkdev_bnum *media_block_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (block < dd->block_count)
c9e8: e5943028 ldr r3, [r4, #40] ; 0x28
c9ec: e1550003 cmp r5, r3
rtems_bdbuf_read (rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer **bd_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *bd = NULL;
c9f0: 23a07000 movcs r7, #0
*/
*media_block_ptr = rtems_bdbuf_media_block (dd, block) + dd->start;
}
else
{
sc = RTEMS_INVALID_ID;
c9f4: 23a08004 movcs r8, #4
rtems_blkdev_bnum block,
rtems_blkdev_bnum *media_block_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (block < dd->block_count)
c9f8: 2a000064 bcs cb90 <rtems_bdbuf_read+0x1bc>
}
static rtems_blkdev_bnum
rtems_bdbuf_media_block (const rtems_disk_device *dd, rtems_blkdev_bnum block)
{
if (dd->block_to_media_block_shift >= 0)
c9fc: e5943030 ldr r3, [r4, #48] ; 0x30
ca00: e3530000 cmp r3, #0
return block << dd->block_to_media_block_shift;
ca04: a1a03315 lslge r3, r5, r3
}
static rtems_blkdev_bnum
rtems_bdbuf_media_block (const rtems_disk_device *dd, rtems_blkdev_bnum block)
{
if (dd->block_to_media_block_shift >= 0)
ca08: aa000007 bge ca2c <rtems_bdbuf_read+0x58>
/*
* Change the block number for the block size to the block number for the media
* block size. We have to use 64bit maths. There is no short cut here.
*/
return (rtems_blkdev_bnum)
((((uint64_t) block) * dd->block_size) / dd->media_block_size);
ca0c: e5940024 ldr r0, [r4, #36] ; 0x24 <== NOT EXECUTED
ca10: e0832095 umull r2, r3, r5, r0 <== NOT EXECUTED
ca14: e1a00002 mov r0, r2 <== NOT EXECUTED
ca18: e1a01003 mov r1, r3 <== NOT EXECUTED
ca1c: e5942020 ldr r2, [r4, #32] <== NOT EXECUTED
ca20: e3a03000 mov r3, #0 <== NOT EXECUTED
ca24: eb003c05 bl 1ba40 <__udivdi3> <== NOT EXECUTED
ca28: e1a03000 mov r3, r0 <== NOT EXECUTED
/*
* Compute the media block number. Drivers work with media block number not
* the block number a BD may have as this depends on the block size set by
* the user.
*/
*media_block_ptr = rtems_bdbuf_media_block (dd, block) + dd->start;
ca2c: e5941018 ldr r1, [r4, #24]
{
if (rtems_bdbuf_tracer)
printf ("bdbuf:read: %" PRIu32 " (%" PRIu32 ") (dev = %08x)\n",
media_block + dd->start, block, (unsigned) dd->dev);
bd = rtems_bdbuf_get_buffer_for_access (dd, media_block);
ca30: e1a00004 mov r0, r4
ca34: e0831001 add r1, r3, r1
ca38: ebfffc08 bl ba60 <rtems_bdbuf_get_buffer_for_access>
ca3c: e1a07000 mov r7, r0
switch (bd->state)
ca40: e5900020 ldr r0, [r0, #32]
ca44: e3500002 cmp r0, #2
ca48: 0a000004 beq ca60 <rtems_bdbuf_read+0x8c>
ca4c: e3500007 cmp r0, #7
ca50: 0a000007 beq ca74 <rtems_bdbuf_read+0xa0>
ca54: e3500001 cmp r0, #1
ca58: 1a000029 bne cb04 <rtems_bdbuf_read+0x130>
ca5c: ea00000b b ca90 <rtems_bdbuf_read+0xbc>
{
case RTEMS_BDBUF_STATE_CACHED:
++dd->stats.read_hits;
ca60: e5943044 ldr r3, [r4, #68] ; 0x44
ca64: e2833001 add r3, r3, #1
ca68: e5843044 str r3, [r4, #68] ; 0x44
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
ca6c: e3a03003 mov r3, #3
ca70: ea000003 b ca84 <rtems_bdbuf_read+0xb0>
case RTEMS_BDBUF_STATE_CACHED:
++dd->stats.read_hits;
rtems_bdbuf_set_state (bd, RTEMS_BDBUF_STATE_ACCESS_CACHED);
break;
case RTEMS_BDBUF_STATE_MODIFIED:
++dd->stats.read_hits;
ca74: e5943044 ldr r3, [r4, #68] ; 0x44
ca78: e2833001 add r3, r3, #1
ca7c: e5843044 str r3, [r4, #68] ; 0x44
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
ca80: e3a03004 mov r3, #4
ca84: e5873020 str r3, [r7, #32]
ca88: e3a08000 mov r8, #0
ca8c: ea00001e b cb0c <rtems_bdbuf_read+0x138>
case RTEMS_BDBUF_STATE_MODIFIED:
++dd->stats.read_hits;
rtems_bdbuf_set_state (bd, RTEMS_BDBUF_STATE_ACCESS_MODIFIED);
break;
case RTEMS_BDBUF_STATE_EMPTY:
++dd->stats.read_misses;
ca90: e5943048 ldr r3, [r4, #72] ; 0x48
ca94: e2833001 add r3, r3, #1
ca98: e5843048 str r3, [r4, #72] ; 0x48
static void
rtems_bdbuf_set_read_ahead_trigger (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
if (dd->read_ahead.trigger != block)
ca9c: e594306c ldr r3, [r4, #108] ; 0x6c
caa0: e1530005 cmp r3, r5
caa4: 0a000005 beq cac0 <rtems_bdbuf_read+0xec>
{
rtems_bdbuf_read_ahead_cancel (dd);
caa8: e1a00004 mov r0, r4
caac: ebfff9c5 bl b1c8 <rtems_bdbuf_read_ahead_cancel>
dd->read_ahead.trigger = block + 1;
cab0: e2853001 add r3, r5, #1
cab4: e584306c str r3, [r4, #108] ; 0x6c
dd->read_ahead.next = block + 2;
cab8: e2853002 add r3, r5, #2
cabc: e5843070 str r3, [r4, #112] ; 0x70
rtems_bdbuf_set_state (bd, RTEMS_BDBUF_STATE_ACCESS_MODIFIED);
break;
case RTEMS_BDBUF_STATE_EMPTY:
++dd->stats.read_misses;
rtems_bdbuf_set_read_ahead_trigger (dd, block);
sc = rtems_bdbuf_execute_read_request (dd, bd, 1);
cac0: e1a01007 mov r1, r7
cac4: e1a00004 mov r0, r4
cac8: e3a02001 mov r2, #1
cacc: ebfffe05 bl c2e8 <rtems_bdbuf_execute_read_request>
if (sc == RTEMS_SUCCESSFUL)
cad0: e2508000 subs r8, r0, #0
rtems_chain_extract_unprotected (&bd->link);
rtems_bdbuf_group_obtain (bd);
}
else
{
bd = NULL;
cad4: 13a07000 movne r7, #0
break;
case RTEMS_BDBUF_STATE_EMPTY:
++dd->stats.read_misses;
rtems_bdbuf_set_read_ahead_trigger (dd, block);
sc = rtems_bdbuf_execute_read_request (dd, bd, 1);
if (sc == RTEMS_SUCCESSFUL)
cad8: 1a00000b bne cb0c <rtems_bdbuf_read+0x138>
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
cadc: e3a03003 mov r3, #3
cae0: e5873020 str r3, [r7, #32]
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
cae4: e897000c ldm r7, {r2, r3}
next->previous = previous;
cae8: e5823004 str r3, [r2, #4]
previous->next = next;
caec: e5832000 str r2, [r3]
}
static void
rtems_bdbuf_group_obtain (rtems_bdbuf_buffer *bd)
{
++bd->group->users;
caf0: e5973028 ldr r3, [r7, #40] ; 0x28
caf4: e593200c ldr r2, [r3, #12]
caf8: e2822001 add r2, r2, #1
cafc: e583200c str r2, [r3, #12]
cb00: ea000001 b cb0c <rtems_bdbuf_read+0x138>
{
bd = NULL;
}
break;
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_4);
cb04: e3a01010 mov r1, #16 <== NOT EXECUTED
cb08: ebfff906 bl af28 <rtems_bdbuf_fatal_with_state> <== NOT EXECUTED
static void
rtems_bdbuf_check_read_ahead_trigger (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
if (bdbuf_cache.read_ahead_task != 0
cb0c: e59f308c ldr r3, [pc, #140] ; cba0 <rtems_bdbuf_read+0x1cc>
cb10: e5930084 ldr r0, [r3, #132] ; 0x84
cb14: e3500000 cmp r0, #0
cb18: 0a00001c beq cb90 <rtems_bdbuf_read+0x1bc>
&& dd->read_ahead.trigger == block
cb1c: e594306c ldr r3, [r4, #108] ; 0x6c
cb20: e1530005 cmp r3, r5
cb24: 1a000019 bne cb90 <rtems_bdbuf_read+0x1bc>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
cb28: e5943064 ldr r3, [r4, #100] ; 0x64
cb2c: e3530000 cmp r3, #0
cb30: 13a03000 movne r3, #0
cb34: 1a000002 bne cb44 <rtems_bdbuf_read+0x170>
dd->read_ahead.next = block + 2;
}
}
rtems_status_code
rtems_bdbuf_read (rtems_disk_device *dd,
cb38: e5943068 ldr r3, [r4, #104] ; 0x68
cb3c: e2733001 rsbs r3, r3, #1
cb40: 33a03000 movcc r3, #0
rtems_bdbuf_check_read_ahead_trigger (rtems_disk_device *dd,
rtems_blkdev_bnum block)
{
if (bdbuf_cache.read_ahead_task != 0
&& dd->read_ahead.trigger == block
&& !rtems_bdbuf_is_read_ahead_active (dd))
cb44: e3530000 cmp r3, #0
cb48: 0a000010 beq cb90 <rtems_bdbuf_read+0x1bc>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
cb4c: e59f504c ldr r5, [pc, #76] ; cba0 <rtems_bdbuf_read+0x1cc>
{
rtems_status_code sc;
rtems_chain_control *chain = &bdbuf_cache.read_ahead_chain;
if (rtems_chain_is_empty (chain))
cb50: e5952088 ldr r2, [r5, #136] ; 0x88
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
cb54: e285308c add r3, r5, #140 ; 0x8c
cb58: e1520003 cmp r2, r3
cb5c: 1a000004 bne cb74 <rtems_bdbuf_read+0x1a0>
{
sc = rtems_event_send (bdbuf_cache.read_ahead_task,
cb60: e3a01002 mov r1, #2
cb64: ebffe8b9 bl 6e50 <rtems_event_send>
RTEMS_BDBUF_READ_AHEAD_WAKE_UP);
if (sc != RTEMS_SUCCESSFUL)
cb68: e3500000 cmp r0, #0
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_RA_WAKE_UP);
cb6c: 13a00007 movne r0, #7
cb70: 1bfff8d2 blne aec0 <rtems_bdbuf_fatal>
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
cb74: e5953090 ldr r3, [r5, #144] ; 0x90
the_node->next = tail;
cb78: e59f1024 ldr r1, [pc, #36] ; cba4 <rtems_bdbuf_read+0x1d0>
}
rtems_chain_append_unprotected (chain, &dd->read_ahead.node);
cb7c: e2842064 add r2, r4, #100 ; 0x64
cb80: e5841064 str r1, [r4, #100] ; 0x64
tail->previous = the_node;
cb84: e5852090 str r2, [r5, #144] ; 0x90
old_last->next = the_node;
cb88: e5832000 str r2, [r3]
the_node->previous = old_last;
cb8c: e5843068 str r3, [r4, #104] ; 0x68
}
rtems_bdbuf_check_read_ahead_trigger (dd, block);
}
rtems_bdbuf_unlock_cache ();
cb90: ebfff8e7 bl af34 <rtems_bdbuf_unlock_cache>
*bd_ptr = bd;
cb94: e5867000 str r7, [r6]
return sc;
}
cb98: e1a00008 mov r0, r8
cb9c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
0000c3d0 <rtems_bdbuf_read_ahead_task>:
return sc;
}
static rtems_task
rtems_bdbuf_read_ahead_task (rtems_task_argument arg)
{
c3d0: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
rtems_chain_control *chain = &bdbuf_cache.read_ahead_chain;
while (bdbuf_cache.read_ahead_enabled)
c3d4: e59f6110 ldr r6, [pc, #272] ; c4ec <rtems_bdbuf_read_ahead_task+0x11c>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
c3d8: e286808c add r8, r6, #140 ; 0x8c
c3dc: ea00003d b c4d8 <rtems_bdbuf_read_ahead_task+0x108>
{
rtems_chain_node *node;
rtems_bdbuf_wait_for_event (RTEMS_BDBUF_READ_AHEAD_WAKE_UP);
c3e0: e3a00002 mov r0, #2
c3e4: ebfffb41 bl b0f0 <rtems_bdbuf_wait_for_event>
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
new_first->previous = head;
c3e8: e59f7100 ldr r7, [pc, #256] ; c4f0 <rtems_bdbuf_read_ahead_task+0x120>
rtems_bdbuf_lock_cache ();
c3ec: ebfffab7 bl aed0 <rtems_bdbuf_lock_cache>
while ((node = rtems_chain_get_unprotected (chain)) != NULL)
c3f0: ea00002a b c4a0 <rtems_bdbuf_read_ahead_task+0xd0>
}
static rtems_blkdev_bnum
rtems_bdbuf_media_block (const rtems_disk_device *dd, rtems_blkdev_bnum block)
{
if (dd->block_to_media_block_shift >= 0)
c3f4: e5140034 ldr r0, [r4, #-52] ; 0x34
c3f8: e3500000 cmp r0, #0
return block << dd->block_to_media_block_shift;
c3fc: a1a00015 lslge r0, r5, r0
}
static rtems_blkdev_bnum
rtems_bdbuf_media_block (const rtems_disk_device *dd, rtems_blkdev_bnum block)
{
if (dd->block_to_media_block_shift >= 0)
c400: aa000006 bge c420 <rtems_bdbuf_read_ahead_task+0x50>
/*
* Change the block number for the block size to the block number for the media
* block size. We have to use 64bit maths. There is no short cut here.
*/
return (rtems_blkdev_bnum)
((((uint64_t) block) * dd->block_size) / dd->media_block_size);
c404: e5140040 ldr r0, [r4, #-64] ; 0x40 <== NOT EXECUTED
c408: e0832590 umull r2, r3, r0, r5 <== NOT EXECUTED
c40c: e1a00002 mov r0, r2 <== NOT EXECUTED
c410: e1a01003 mov r1, r3 <== NOT EXECUTED
c414: e5142044 ldr r2, [r4, #-68] ; 0x44 <== NOT EXECUTED
c418: e3a03000 mov r3, #0 <== NOT EXECUTED
c41c: eb003d87 bl 1ba40 <__udivdi3> <== NOT EXECUTED
/*
* Compute the media block number. Drivers work with media block number not
* the block number a BD may have as this depends on the block size set by
* the user.
*/
*media_block_ptr = rtems_bdbuf_media_block (dd, block) + dd->start;
c420: e514104c ldr r1, [r4, #-76] ; 0x4c
c424: e3a03000 mov r3, #0
c428: e0801001 add r1, r0, r1
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
c42c: e3a02000 mov r2, #0
rtems_status_code sc =
rtems_bdbuf_get_media_block (dd, block, &media_block);
rtems_chain_set_off_chain (&dd->read_ahead.node);
if (sc == RTEMS_SUCCESSFUL)
c430: e1530002 cmp r3, r2
rtems_bdbuf_execute_read_request (dd, bd, transfer_count);
}
}
else
{
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
c434: 13e03000 mvnne r3, #0
c438: e5842004 str r2, [r4, #4]
c43c: e5842000 str r2, [r4]
c440: 15843008 strne r3, [r4, #8]
rtems_status_code sc =
rtems_bdbuf_get_media_block (dd, block, &media_block);
rtems_chain_set_off_chain (&dd->read_ahead.node);
if (sc == RTEMS_SUCCESSFUL)
c444: 1a000015 bne c4a0 <rtems_bdbuf_read_ahead_task+0xd0>
rtems_bdbuf_wait_for_event (RTEMS_BDBUF_READ_AHEAD_WAKE_UP);
rtems_bdbuf_lock_cache ();
while ((node = rtems_chain_get_unprotected (chain)) != NULL)
{
rtems_disk_device *dd = (rtems_disk_device *)
c448: e244a064 sub sl, r4, #100 ; 0x64
rtems_chain_set_off_chain (&dd->read_ahead.node);
if (sc == RTEMS_SUCCESSFUL)
{
rtems_bdbuf_buffer *bd =
c44c: e1a0000a mov r0, sl
c450: ebfffd6c bl ba08 <rtems_bdbuf_get_buffer_for_read_ahead>
rtems_bdbuf_get_buffer_for_read_ahead (dd, media_block);
if (bd != NULL)
c454: e2501000 subs r1, r0, #0
c458: 0a000010 beq c4a0 <rtems_bdbuf_read_ahead_task+0xd0>
{
uint32_t transfer_count = dd->block_count - block;
uint32_t max_transfer_count = bdbuf_config.max_read_ahead_blocks;
c45c: e59f3090 ldr r3, [pc, #144] ; c4f4 <rtems_bdbuf_read_ahead_task+0x124>
rtems_bdbuf_buffer *bd =
rtems_bdbuf_get_buffer_for_read_ahead (dd, media_block);
if (bd != NULL)
{
uint32_t transfer_count = dd->block_count - block;
c460: e514203c ldr r2, [r4, #-60] ; 0x3c
uint32_t max_transfer_count = bdbuf_config.max_read_ahead_blocks;
c464: e5933000 ldr r3, [r3]
rtems_bdbuf_buffer *bd =
rtems_bdbuf_get_buffer_for_read_ahead (dd, media_block);
if (bd != NULL)
{
uint32_t transfer_count = dd->block_count - block;
c468: e0652002 rsb r2, r5, r2
uint32_t max_transfer_count = bdbuf_config.max_read_ahead_blocks;
if (transfer_count >= max_transfer_count)
c46c: e1520003 cmp r2, r3
{
transfer_count = max_transfer_count;
dd->read_ahead.trigger = block + transfer_count / 2;
c470: 208520a3 addcs r2, r5, r3, lsr #1
dd->read_ahead.next = block + transfer_count;
}
else
{
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
c474: 33e03000 mvncc r3, #0
if (transfer_count >= max_transfer_count)
{
transfer_count = max_transfer_count;
dd->read_ahead.trigger = block + transfer_count / 2;
dd->read_ahead.next = block + transfer_count;
c478: 20835005 addcs r5, r3, r5
uint32_t max_transfer_count = bdbuf_config.max_read_ahead_blocks;
if (transfer_count >= max_transfer_count)
{
transfer_count = max_transfer_count;
dd->read_ahead.trigger = block + transfer_count / 2;
c47c: 25842008 strcs r2, [r4, #8]
dd->read_ahead.next = block + transfer_count;
}
else
{
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
c480: 35843008 strcc r3, [r4, #8]
if (transfer_count >= max_transfer_count)
{
transfer_count = max_transfer_count;
dd->read_ahead.trigger = block + transfer_count / 2;
dd->read_ahead.next = block + transfer_count;
c484: 21a02003 movcs r2, r3
else
{
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
}
++dd->stats.read_ahead_transfers;
c488: e5143018 ldr r3, [r4, #-24]
c48c: e2833001 add r3, r3, #1
if (transfer_count >= max_transfer_count)
{
transfer_count = max_transfer_count;
dd->read_ahead.trigger = block + transfer_count / 2;
dd->read_ahead.next = block + transfer_count;
c490: 2584500c strcs r5, [r4, #12]
else
{
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
}
++dd->stats.read_ahead_transfers;
c494: e5043018 str r3, [r4, #-24]
rtems_bdbuf_execute_read_request (dd, bd, transfer_count);
c498: e1a0000a mov r0, sl
c49c: ebffff91 bl c2e8 <rtems_bdbuf_execute_read_request>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
c4a0: e5964088 ldr r4, [r6, #136] ; 0x88
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
c4a4: e1540008 cmp r4, r8
c4a8: 0a000009 beq c4d4 <rtems_bdbuf_read_ahead_task+0x104>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
c4ac: e5943000 ldr r3, [r4]
while ((node = rtems_chain_get_unprotected (chain)) != NULL)
{
rtems_disk_device *dd = (rtems_disk_device *)
((char *) node - offsetof (rtems_disk_device, read_ahead.node));
rtems_blkdev_bnum block = dd->read_ahead.next;
c4b0: e594500c ldr r5, [r4, #12]
head->next = new_first;
c4b4: e5863088 str r3, [r6, #136] ; 0x88
new_first->previous = head;
c4b8: e5837004 str r7, [r3, #4]
rtems_blkdev_bnum block,
rtems_blkdev_bnum *media_block_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (block < dd->block_count)
c4bc: e514303c ldr r3, [r4, #-60] ; 0x3c
c4c0: e1550003 cmp r5, r3
while ((node = rtems_chain_get_unprotected (chain)) != NULL)
{
rtems_disk_device *dd = (rtems_disk_device *)
((char *) node - offsetof (rtems_disk_device, read_ahead.node));
rtems_blkdev_bnum block = dd->read_ahead.next;
rtems_blkdev_bnum media_block = 0;
c4c4: 23a01000 movcs r1, #0
*/
*media_block_ptr = rtems_bdbuf_media_block (dd, block) + dd->start;
}
else
{
sc = RTEMS_INVALID_ID;
c4c8: 23a03004 movcs r3, #4
rtems_blkdev_bnum block,
rtems_blkdev_bnum *media_block_ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (block < dd->block_count)
c4cc: 2affffd6 bcs c42c <rtems_bdbuf_read_ahead_task+0x5c>
c4d0: eaffffc7 b c3f4 <rtems_bdbuf_read_ahead_task+0x24>
{
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
}
}
rtems_bdbuf_unlock_cache ();
c4d4: ebfffa96 bl af34 <rtems_bdbuf_unlock_cache>
static rtems_task
rtems_bdbuf_read_ahead_task (rtems_task_argument arg)
{
rtems_chain_control *chain = &bdbuf_cache.read_ahead_chain;
while (bdbuf_cache.read_ahead_enabled)
c4d8: e5d60094 ldrb r0, [r6, #148] ; 0x94
c4dc: e3500000 cmp r0, #0
c4e0: 1affffbe bne c3e0 <rtems_bdbuf_read_ahead_task+0x10>
rtems_bdbuf_unlock_cache ();
}
rtems_task_delete (RTEMS_SELF);
}
c4e4: e8bd45f0 pop {r4, r5, r6, r7, r8, sl, lr} <== NOT EXECUTED
}
rtems_bdbuf_unlock_cache ();
}
rtems_task_delete (RTEMS_SELF);
c4e8: eaffec34 b 75c0 <rtems_task_delete> <== NOT EXECUTED
0000cba8 <rtems_bdbuf_release>:
return RTEMS_SUCCESSFUL;
}
rtems_status_code
rtems_bdbuf_release (rtems_bdbuf_buffer *bd)
{
cba8: e92d4010 push {r4, lr}
}
static rtems_status_code
rtems_bdbuf_check_bd_and_lock_cache (rtems_bdbuf_buffer *bd, const char *kind)
{
if (bd == NULL)
cbac: e2504000 subs r4, r0, #0
cbb0: 0a000027 beq cc54 <rtems_bdbuf_release+0xac>
if (rtems_bdbuf_tracer)
{
printf ("bdbuf:%s: %" PRIu32 "\n", kind, bd->block);
rtems_bdbuf_show_users (kind, bd);
}
rtems_bdbuf_lock_cache();
cbb4: ebfff8c5 bl aed0 <rtems_bdbuf_lock_cache>
sc = rtems_bdbuf_check_bd_and_lock_cache (bd, "release");
if (sc != RTEMS_SUCCESSFUL)
return sc;
switch (bd->state)
cbb8: e5940020 ldr r0, [r4, #32]
cbbc: e2403003 sub r3, r0, #3
cbc0: e3530003 cmp r3, #3
cbc4: 979ff103 ldrls pc, [pc, r3, lsl #2]
cbc8: ea00001c b cc40 <rtems_bdbuf_release+0x98> <== NOT EXECUTED
cbcc: 0000cbdc .word 0x0000cbdc <== NOT EXECUTED
cbd0: 0000cc34 .word 0x0000cc34 <== NOT EXECUTED
cbd4: 0000cc28 .word 0x0000cc28 <== NOT EXECUTED
cbd8: 0000cc28 .word 0x0000cc28 <== NOT EXECUTED
}
static void
rtems_bdbuf_group_release (rtems_bdbuf_buffer *bd)
{
--bd->group->users;
cbdc: e5943028 ldr r3, [r4, #40] ; 0x28
cbe0: e593200c ldr r2, [r3, #12]
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
cbe4: e59f0070 ldr r0, [pc, #112] ; cc5c <rtems_bdbuf_release+0xb4>
cbe8: e2422001 sub r2, r2, #1
cbec: e583200c str r2, [r3, #12]
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
cbf0: e3a03002 mov r3, #2
cbf4: e5843020 str r3, [r4, #32]
cbf8: e5903048 ldr r3, [r0, #72] ; 0x48
the_node->next = tail;
cbfc: e2802044 add r2, r0, #68 ; 0x44
tail->previous = the_node;
cc00: e5804048 str r4, [r0, #72] ; 0x48
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
cc04: e5842000 str r2, [r4]
tail->previous = the_node;
old_last->next = the_node;
the_node->previous = old_last;
cc08: e5843004 str r3, [r4, #4]
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
old_last->next = the_node;
cc0c: e5834000 str r4, [r3]
rtems_bdbuf_add_to_lru_list_after_access (rtems_bdbuf_buffer *bd)
{
rtems_bdbuf_group_release (bd);
rtems_bdbuf_make_cached_and_add_to_lru_list (bd);
if (bd->waiters)
cc10: e5943024 ldr r3, [r4, #36] ; 0x24
cc14: e3530000 cmp r3, #0
rtems_bdbuf_wake (&bdbuf_cache.access_waiters);
cc18: 12800064 addne r0, r0, #100 ; 0x64
else
rtems_bdbuf_wake (&bdbuf_cache.buffer_waiters);
cc1c: 02800074 addeq r0, r0, #116 ; 0x74
cc20: ebfff976 bl b200 <rtems_bdbuf_wake>
cc24: ea000007 b cc48 <rtems_bdbuf_release+0xa0>
case RTEMS_BDBUF_STATE_ACCESS_CACHED:
rtems_bdbuf_add_to_lru_list_after_access (bd);
break;
case RTEMS_BDBUF_STATE_ACCESS_EMPTY:
case RTEMS_BDBUF_STATE_ACCESS_PURGED:
rtems_bdbuf_discard_buffer_after_access (bd);
cc28: e1a00004 mov r0, r4
cc2c: ebfffc01 bl bc38 <rtems_bdbuf_discard_buffer_after_access>
break;
cc30: ea000004 b cc48 <rtems_bdbuf_release+0xa0>
case RTEMS_BDBUF_STATE_ACCESS_MODIFIED:
rtems_bdbuf_add_to_modified_list_after_access (bd);
cc34: e1a00004 mov r0, r4
cc38: ebfff97a bl b228 <rtems_bdbuf_add_to_modified_list_after_access>
break;
cc3c: ea000001 b cc48 <rtems_bdbuf_release+0xa0>
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_0);
cc40: e3a0100e mov r1, #14 <== NOT EXECUTED
cc44: ebfff8b7 bl af28 <rtems_bdbuf_fatal_with_state> <== NOT EXECUTED
}
if (rtems_bdbuf_tracer)
rtems_bdbuf_show_usage ();
rtems_bdbuf_unlock_cache ();
cc48: ebfff8b9 bl af34 <rtems_bdbuf_unlock_cache>
return RTEMS_SUCCESSFUL;
cc4c: e3a00000 mov r0, #0
cc50: e8bd8010 pop {r4, pc}
static rtems_status_code
rtems_bdbuf_check_bd_and_lock_cache (rtems_bdbuf_buffer *bd, const char *kind)
{
if (bd == NULL)
return RTEMS_INVALID_ADDRESS;
cc54: e3a00009 mov r0, #9 <== NOT EXECUTED
rtems_bdbuf_show_usage ();
rtems_bdbuf_unlock_cache ();
return RTEMS_SUCCESSFUL;
}
cc58: e8bd8010 pop {r4, pc} <== NOT EXECUTED
0000cc60 <rtems_bdbuf_release_modified>:
rtems_status_code
rtems_bdbuf_release_modified (rtems_bdbuf_buffer *bd)
{
cc60: e92d4010 push {r4, lr}
}
static rtems_status_code
rtems_bdbuf_check_bd_and_lock_cache (rtems_bdbuf_buffer *bd, const char *kind)
{
if (bd == NULL)
cc64: e2504000 subs r4, r0, #0
cc68: 0a000013 beq ccbc <rtems_bdbuf_release_modified+0x5c>
if (rtems_bdbuf_tracer)
{
printf ("bdbuf:%s: %" PRIu32 "\n", kind, bd->block);
rtems_bdbuf_show_users (kind, bd);
}
rtems_bdbuf_lock_cache();
cc6c: ebfff897 bl aed0 <rtems_bdbuf_lock_cache>
sc = rtems_bdbuf_check_bd_and_lock_cache (bd, "release modified");
if (sc != RTEMS_SUCCESSFUL)
return sc;
switch (bd->state)
cc70: e5940020 ldr r0, [r4, #32]
cc74: e3500003 cmp r0, #3
cc78: 3a00000a bcc cca8 <rtems_bdbuf_release_modified+0x48>
cc7c: e3500005 cmp r0, #5
cc80: 9a000002 bls cc90 <rtems_bdbuf_release_modified+0x30>
cc84: e3500006 cmp r0, #6
cc88: 1a000006 bne cca8 <rtems_bdbuf_release_modified+0x48>
cc8c: ea000002 b cc9c <rtems_bdbuf_release_modified+0x3c>
{
case RTEMS_BDBUF_STATE_ACCESS_CACHED:
case RTEMS_BDBUF_STATE_ACCESS_EMPTY:
case RTEMS_BDBUF_STATE_ACCESS_MODIFIED:
rtems_bdbuf_add_to_modified_list_after_access (bd);
cc90: e1a00004 mov r0, r4
cc94: ebfff963 bl b228 <rtems_bdbuf_add_to_modified_list_after_access>
break;
cc98: ea000004 b ccb0 <rtems_bdbuf_release_modified+0x50>
case RTEMS_BDBUF_STATE_ACCESS_PURGED:
rtems_bdbuf_discard_buffer_after_access (bd);
cc9c: e1a00004 mov r0, r4
cca0: ebfffbe4 bl bc38 <rtems_bdbuf_discard_buffer_after_access>
break;
cca4: ea000001 b ccb0 <rtems_bdbuf_release_modified+0x50>
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_6);
cca8: e3a01012 mov r1, #18 <== NOT EXECUTED
ccac: ebfff89d bl af28 <rtems_bdbuf_fatal_with_state> <== NOT EXECUTED
}
if (rtems_bdbuf_tracer)
rtems_bdbuf_show_usage ();
rtems_bdbuf_unlock_cache ();
ccb0: ebfff89f bl af34 <rtems_bdbuf_unlock_cache>
return RTEMS_SUCCESSFUL;
ccb4: e3a00000 mov r0, #0
ccb8: e8bd8010 pop {r4, pc}
static rtems_status_code
rtems_bdbuf_check_bd_and_lock_cache (rtems_bdbuf_buffer *bd, const char *kind)
{
if (bd == NULL)
return RTEMS_INVALID_ADDRESS;
ccbc: e3a00009 mov r0, #9 <== NOT EXECUTED
rtems_bdbuf_show_usage ();
rtems_bdbuf_unlock_cache ();
return RTEMS_SUCCESSFUL;
}
ccc0: e8bd8010 pop {r4, pc} <== NOT EXECUTED
0000b334 <rtems_bdbuf_remove_from_tree>:
return bdbuf_cache.buffer_waiters.count;
}
static void
rtems_bdbuf_remove_from_tree (rtems_bdbuf_buffer *bd)
{
b334: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
const rtems_bdbuf_buffer* node)
{
const rtems_disk_device *dd = node->dd;
rtems_blkdev_bnum block = node->block;
rtems_bdbuf_buffer* p = *root;
b338: e59f332c ldr r3, [pc, #812] ; b66c <rtems_bdbuf_remove_from_tree+0x338>
return bdbuf_cache.buffer_waiters.count;
}
static void
rtems_bdbuf_remove_from_tree (rtems_bdbuf_buffer *bd)
{
b33c: e24dd080 sub sp, sp, #128 ; 0x80
*/
static int
rtems_bdbuf_avl_remove(rtems_bdbuf_buffer** root,
const rtems_bdbuf_buffer* node)
{
const rtems_disk_device *dd = node->dd;
b340: e5907014 ldr r7, [r0, #20]
rtems_blkdev_bnum block = node->block;
b344: e5906018 ldr r6, [r0, #24]
rtems_bdbuf_buffer* buf_stack[RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer** buf_prev = buf_stack;
bool modified = false;
memset (buf_stack, 0, sizeof(buf_stack));
b348: e3a01000 mov r1, #0
b34c: e3a02080 mov r2, #128 ; 0x80
return bdbuf_cache.buffer_waiters.count;
}
static void
rtems_bdbuf_remove_from_tree (rtems_bdbuf_buffer *bd)
{
b350: e1a05000 mov r5, r0
rtems_bdbuf_buffer* buf_stack[RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer** buf_prev = buf_stack;
bool modified = false;
memset (buf_stack, 0, sizeof(buf_stack));
b354: e1a0000d mov r0, sp
const rtems_bdbuf_buffer* node)
{
const rtems_disk_device *dd = node->dd;
rtems_blkdev_bnum block = node->block;
rtems_bdbuf_buffer* p = *root;
b358: e593403c ldr r4, [r3, #60] ; 0x3c
rtems_bdbuf_buffer* buf_stack[RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer** buf_prev = buf_stack;
bool modified = false;
memset (buf_stack, 0, sizeof(buf_stack));
b35c: eb001b35 bl 12038 <memset>
rtems_bdbuf_buffer* r;
rtems_bdbuf_buffer* s;
rtems_bdbuf_buffer* p1;
rtems_bdbuf_buffer* p2;
rtems_bdbuf_buffer* buf_stack[RTEMS_BDBUF_AVL_MAX_HEIGHT];
rtems_bdbuf_buffer** buf_prev = buf_stack;
b360: e1a0100d mov r1, sp
*buf_prev++ = p;
if (((uintptr_t) p->dd < (uintptr_t) dd)
|| ((p->dd == dd) && (p->block < block)))
{
p->avl.cache = 1;
b364: e3a02001 mov r2, #1
p = p->avl.right;
}
else if ((p->dd != dd) || (p->block != block))
{
p->avl.cache = -1;
b368: e3e03000 mvn r3, #0
b36c: ea00000d b b3a8 <rtems_bdbuf_remove_from_tree+0x74>
while (p != NULL)
{
*buf_prev++ = p;
if (((uintptr_t) p->dd < (uintptr_t) dd)
b370: e594c014 ldr ip, [r4, #20]
b374: e15c0007 cmp ip, r7
memset (buf_stack, 0, sizeof(buf_stack));
while (p != NULL)
{
*buf_prev++ = p;
b378: e4814004 str r4, [r1], #4
if (((uintptr_t) p->dd < (uintptr_t) dd)
b37c: 3a000003 bcc b390 <rtems_bdbuf_remove_from_tree+0x5c>
|| ((p->dd == dd) && (p->block < block)))
b380: 1a000006 bne b3a0 <rtems_bdbuf_remove_from_tree+0x6c>
b384: e594c018 ldr ip, [r4, #24]
b388: e15c0006 cmp ip, r6
b38c: 2a000002 bcs b39c <rtems_bdbuf_remove_from_tree+0x68>
{
p->avl.cache = 1;
b390: e5c42010 strb r2, [r4, #16]
p = p->avl.right;
b394: e594400c ldr r4, [r4, #12]
b398: ea000002 b b3a8 <rtems_bdbuf_remove_from_tree+0x74>
}
else if ((p->dd != dd) || (p->block != block))
b39c: 0a000005 beq b3b8 <rtems_bdbuf_remove_from_tree+0x84>
{
p->avl.cache = -1;
b3a0: e5c43010 strb r3, [r4, #16]
p = p->avl.left;
b3a4: e5944008 ldr r4, [r4, #8]
bool modified = false;
memset (buf_stack, 0, sizeof(buf_stack));
while (p != NULL)
b3a8: e3540000 cmp r4, #0
p = p->avl.right;
}
else if ((p->dd != dd) || (p->block != block))
{
p->avl.cache = -1;
p = p->avl.left;
b3ac: e1a00001 mov r0, r1
bool modified = false;
memset (buf_stack, 0, sizeof(buf_stack));
while (p != NULL)
b3b0: 1affffee bne b370 <rtems_bdbuf_remove_from_tree+0x3c>
b3b4: ea0000a7 b b658 <rtems_bdbuf_remove_from_tree+0x324> <== NOT EXECUTED
}
q = p;
buf_prev--;
if (buf_prev > buf_stack)
b3b8: e1a0300d mov r3, sp
b3bc: e1500003 cmp r0, r3
{
p = NULL;
}
/* at this moment q - is a node to delete, p is q's parent */
if (q->avl.right == NULL)
b3c0: e594300c ldr r3, [r4, #12]
q = p;
buf_prev--;
if (buf_prev > buf_stack)
{
p = *(buf_prev - 1);
b3c4: 8511c008 ldrhi ip, [r1, #-8]
}
else
{
p = NULL;
b3c8: 93a0c000 movls ip, #0
}
/* at this moment q - is a node to delete, p is q's parent */
if (q->avl.right == NULL)
b3cc: e3530000 cmp r3, #0
b3d0: 1a000004 bne b3e8 <rtems_bdbuf_remove_from_tree+0xb4>
{
r = q->avl.left;
b3d4: e5943008 ldr r3, [r4, #8]
if (r != NULL)
b3d8: e3530000 cmp r3, #0
{
r->avl.bal = 0;
b3dc: 13a02000 movne r2, #0
b3e0: 15c32011 strbne r2, [r3, #17]
b3e4: ea000021 b b470 <rtems_bdbuf_remove_from_tree+0x13c>
{
rtems_bdbuf_buffer **t;
r = q->avl.right;
if (r->avl.left == NULL)
b3e8: e5932008 ldr r2, [r3, #8]
b3ec: e3520000 cmp r2, #0
b3f0: 11a02003 movne r2, r3
b3f4: 11a05003 movne r5, r3
b3f8: 11a00001 movne r0, r1
while (s->avl.left != NULL)
{
*buf_prev++ = r = s;
s = r->avl.left;
r->avl.cache = -1;
b3fc: 13e07000 mvnne r7, #0
b400: 1a00000c bne b438 <rtems_bdbuf_remove_from_tree+0x104>
r = q->avl.right;
if (r->avl.left == NULL)
{
r->avl.left = q->avl.left;
b404: e5942008 ldr r2, [r4, #8]
b408: e5832008 str r2, [r3, #8]
r->avl.bal = q->avl.bal;
b40c: e5d42011 ldrb r2, [r4, #17]
b410: e5c32011 strb r2, [r3, #17]
r->avl.cache = 1;
b414: e3a02001 mov r2, #1
b418: e5c32010 strb r2, [r3, #16]
*buf_prev++ = q = r;
b41c: e5013004 str r3, [r1, #-4]
b420: e1a00001 mov r0, r1
b424: ea000011 b b470 <rtems_bdbuf_remove_from_tree+0x13c>
t = buf_prev++;
s = r;
while (s->avl.left != NULL)
{
*buf_prev++ = r = s;
b428: e4802004 str r2, [r0], #4
s = r->avl.left;
r->avl.cache = -1;
b42c: e5c27010 strb r7, [r2, #16]
b430: e1a05002 mov r5, r2
b434: e1a02006 mov r2, r6
else
{
t = buf_prev++;
s = r;
while (s->avl.left != NULL)
b438: e5926008 ldr r6, [r2, #8]
b43c: e3560000 cmp r6, #0
b440: 1afffff8 bne b428 <rtems_bdbuf_remove_from_tree+0xf4>
*buf_prev++ = r = s;
s = r->avl.left;
r->avl.cache = -1;
}
s->avl.left = q->avl.left;
b444: e5946008 ldr r6, [r4, #8]
b448: e5826008 str r6, [r2, #8]
r->avl.left = s->avl.right;
b44c: e592600c ldr r6, [r2, #12]
s->avl.right = q->avl.right;
b450: e582300c str r3, [r2, #12]
s->avl.bal = q->avl.bal;
b454: e5d43011 ldrb r3, [r4, #17]
s = r->avl.left;
r->avl.cache = -1;
}
s->avl.left = q->avl.left;
r->avl.left = s->avl.right;
b458: e5856008 str r6, [r5, #8]
s->avl.right = q->avl.right;
s->avl.bal = q->avl.bal;
b45c: e5c23011 strb r3, [r2, #17]
s->avl.cache = 1;
*t = q = s;
b460: e5012004 str r2, [r1, #-4]
s->avl.left = q->avl.left;
r->avl.left = s->avl.right;
s->avl.right = q->avl.right;
s->avl.bal = q->avl.bal;
s->avl.cache = 1;
b464: e3a03001 mov r3, #1
b468: e5c23010 strb r3, [r2, #16]
*t = q = s;
b46c: e1a03002 mov r3, r2
}
}
if (p != NULL)
b470: e35c0000 cmp ip, #0
p->avl.right = q;
}
}
else
{
*root = q;
b474: 059f21f0 ldreq r2, [pc, #496] ; b66c <rtems_bdbuf_remove_from_tree+0x338>
b478: 0582303c streq r3, [r2, #60] ; 0x3c
*t = q = s;
}
}
if (p != NULL)
b47c: 0a000003 beq b490 <rtems_bdbuf_remove_from_tree+0x15c>
{
if (p->avl.cache == -1)
b480: e1dc21d0 ldrsb r2, [ip, #16]
b484: e3720001 cmn r2, #1
{
p->avl.left = q;
}
else
{
p->avl.right = q;
b488: 158c300c strne r3, [ip, #12]
if (p != NULL)
{
if (p->avl.cache == -1)
{
p->avl.left = q;
b48c: 058c3008 streq r3, [ip, #8]
modified = true;
while (modified)
{
if (buf_prev > buf_stack)
b490: e1a0600d mov r6, sp
b494: e1500006 cmp r0, r6
b498: 9a000071 bls b664 <rtems_bdbuf_remove_from_tree+0x330>
p->avl.right = q;
}
}
else
{
*root = q;
b49c: e1a04000 mov r4, r0
case +1:
p->avl.bal = 0;
break;
case 0:
p->avl.bal = -1;
b4a0: e3e07000 mvn r7, #0
{
/* rebalance right branch */
switch (p->avl.bal)
{
case +1:
p->avl.bal = 0;
b4a4: e3a0c000 mov ip, #0
}
}
else
{
/* rebalance right branch */
switch (p->avl.bal)
b4a8: e3a05001 mov r5, #1
default:
break;
}
}
if (buf_prev > buf_stack)
b4ac: e1a0600d mov r6, sp
while (modified)
{
if (buf_prev > buf_stack)
{
p = *--buf_prev;
b4b0: e5143004 ldr r3, [r4, #-4]
else
{
break;
}
if (p->avl.cache == -1)
b4b4: e1d3a1d0 ldrsb sl, [r3, #16]
b4b8: e37a0001 cmn sl, #1
b4bc: e1d321d1 ldrsb r2, [r3, #17]
b4c0: 1a00002a bne b570 <rtems_bdbuf_remove_from_tree+0x23c>
{
/* rebalance left branch */
switch (p->avl.bal)
b4c4: e3520000 cmp r2, #0
{
case -1:
p->avl.bal = 0;
break;
case 0:
p->avl.bal = 1;
b4c8: 05c35011 strbeq r5, [r3, #17]
}
if (p->avl.cache == -1)
{
/* rebalance left branch */
switch (p->avl.bal)
b4cc: 0a000052 beq b61c <rtems_bdbuf_remove_from_tree+0x2e8>
b4d0: e3520001 cmp r2, #1
b4d4: 0a000002 beq b4e4 <rtems_bdbuf_remove_from_tree+0x1b0>
b4d8: e3720001 cmn r2, #1
{
case -1:
p->avl.bal = 0;
b4dc: 05c3c011 strbeq ip, [r3, #17]
b4e0: ea00004c b b618 <rtems_bdbuf_remove_from_tree+0x2e4>
p->avl.bal = 1;
modified = false;
break;
case +1:
p1 = p->avl.right;
b4e4: e593100c ldr r1, [r3, #12]
if (p1->avl.bal >= 0) /* simple RR-turn */
b4e8: e1d101d1 ldrsb r0, [r1, #17]
b4ec: e3500000 cmp r0, #0
b4f0: e5d18011 ldrb r8, [r1, #17]
b4f4: e5910008 ldr r0, [r1, #8]
b4f8: ba000009 blt b524 <rtems_bdbuf_remove_from_tree+0x1f0>
{
p->avl.right = p1->avl.left;
p1->avl.left = p;
if (p1->avl.bal == 0)
b4fc: e3580000 cmp r8, #0
case +1:
p1 = p->avl.right;
if (p1->avl.bal >= 0) /* simple RR-turn */
{
p->avl.right = p1->avl.left;
b500: e583000c str r0, [r3, #12]
p1->avl.left = p;
b504: e5813008 str r3, [r1, #8]
p1->avl.bal = -1;
modified = false;
}
else
{
p->avl.bal = 0;
b508: 15c3c011 strbne ip, [r3, #17]
p->avl.right = p1->avl.left;
p1->avl.left = p;
if (p1->avl.bal == 0)
{
p1->avl.bal = -1;
b50c: 05c1a011 strbeq sl, [r1, #17]
b510: 01a03001 moveq r3, r1
modified = false;
b514: 01a02008 moveq r2, r8
}
else
{
p->avl.bal = 0;
p1->avl.bal = 0;
b518: 15c1c011 strbne ip, [r1, #17]
if (p1->avl.bal >= 0) /* simple RR-turn */
{
p->avl.right = p1->avl.left;
p1->avl.left = p;
if (p1->avl.bal == 0)
b51c: 1a000029 bne b5c8 <rtems_bdbuf_remove_from_tree+0x294>
b520: ea00003d b b61c <rtems_bdbuf_remove_from_tree+0x2e8>
}
else /* double RL-turn */
{
p2 = p1->avl.left;
p1->avl.left = p2->avl.right;
b524: e590800c ldr r8, [r0, #12]
b528: e5818008 str r8, [r1, #8]
p2->avl.right = p1;
p->avl.right = p2->avl.left;
b52c: e5908008 ldr r8, [r0, #8]
else /* double RL-turn */
{
p2 = p1->avl.left;
p1->avl.left = p2->avl.right;
p2->avl.right = p1;
b530: e580100c str r1, [r0, #12]
p->avl.right = p2->avl.left;
b534: e583800c str r8, [r3, #12]
p2->avl.left = p;
if (p2->avl.bal == +1) p->avl.bal = -1; else p->avl.bal = 0;
b538: e1d081d1 ldrsb r8, [r0, #17]
b53c: e3580001 cmp r8, #1
b540: 03a080ff moveq r8, #255 ; 0xff
b544: 13a08000 movne r8, #0
b548: e5c38011 strb r8, [r3, #17]
p2 = p1->avl.left;
p1->avl.left = p2->avl.right;
p2->avl.right = p1;
p->avl.right = p2->avl.left;
p2->avl.left = p;
b54c: e5803008 str r3, [r0, #8]
if (p2->avl.bal == +1) p->avl.bal = -1; else p->avl.bal = 0;
if (p2->avl.bal == -1) p1->avl.bal = 1; else p1->avl.bal = 0;
b550: e1d031d1 ldrsb r3, [r0, #17]
b554: e3730001 cmn r3, #1
b558: 13a03000 movne r3, #0
b55c: 03a03001 moveq r3, #1
b560: e5c13011 strb r3, [r1, #17]
p = p2;
p2->avl.bal = 0;
b564: e5c0c011 strb ip, [r0, #17]
b568: e1a03000 mov r3, r0
b56c: ea00002a b b61c <rtems_bdbuf_remove_from_tree+0x2e8>
}
}
else
{
/* rebalance right branch */
switch (p->avl.bal)
b570: e3520000 cmp r2, #0
case +1:
p->avl.bal = 0;
break;
case 0:
p->avl.bal = -1;
b574: 05c37011 strbeq r7, [r3, #17]
}
}
else
{
/* rebalance right branch */
switch (p->avl.bal)
b578: 0a000027 beq b61c <rtems_bdbuf_remove_from_tree+0x2e8>
b57c: e3520001 cmp r2, #1
{
case +1:
p->avl.bal = 0;
b580: 05c3c011 strbeq ip, [r3, #17]
}
}
else
{
/* rebalance right branch */
switch (p->avl.bal)
b584: 0a000024 beq b61c <rtems_bdbuf_remove_from_tree+0x2e8>
b588: e3720001 cmn r2, #1
b58c: 1a000021 bne b618 <rtems_bdbuf_remove_from_tree+0x2e4>
p->avl.bal = -1;
modified = false;
break;
case -1:
p1 = p->avl.left;
b590: e5931008 ldr r1, [r3, #8]
if (p1->avl.bal <= 0) /* simple LL-turn */
b594: e1d101d1 ldrsb r0, [r1, #17]
b598: e3500000 cmp r0, #0
b59c: e5d12011 ldrb r2, [r1, #17]
b5a0: e591000c ldr r0, [r1, #12]
b5a4: ca000009 bgt b5d0 <rtems_bdbuf_remove_from_tree+0x29c>
{
p->avl.left = p1->avl.right;
p1->avl.right = p;
if (p1->avl.bal == 0)
b5a8: e3520000 cmp r2, #0
p1->avl.bal = 1;
modified = false;
}
else
{
p->avl.bal = 0;
b5ac: 15c3c011 strbne ip, [r3, #17]
case -1:
p1 = p->avl.left;
if (p1->avl.bal <= 0) /* simple LL-turn */
{
p->avl.left = p1->avl.right;
b5b0: e5830008 str r0, [r3, #8]
p1->avl.right = p;
b5b4: e581300c str r3, [r1, #12]
modified = false;
}
else
{
p->avl.bal = 0;
p1->avl.bal = 0;
b5b8: 15c1c011 strbne ip, [r1, #17]
b5bc: 11a03001 movne r3, r1
if (p1->avl.bal <= 0) /* simple LL-turn */
{
p->avl.left = p1->avl.right;
p1->avl.right = p;
if (p1->avl.bal == 0)
b5c0: 1a000014 bne b618 <rtems_bdbuf_remove_from_tree+0x2e4>
{
p1->avl.bal = 1;
b5c4: e5c15011 strb r5, [r1, #17]
b5c8: e1a03001 mov r3, r1
b5cc: ea000012 b b61c <rtems_bdbuf_remove_from_tree+0x2e8>
}
else /* double LR-turn */
{
p2 = p1->avl.right;
p1->avl.right = p2->avl.left;
b5d0: e5902008 ldr r2, [r0, #8]
b5d4: e581200c str r2, [r1, #12]
p2->avl.left = p1;
p->avl.left = p2->avl.right;
b5d8: e590200c ldr r2, [r0, #12]
else /* double LR-turn */
{
p2 = p1->avl.right;
p1->avl.right = p2->avl.left;
p2->avl.left = p1;
b5dc: e5801008 str r1, [r0, #8]
p->avl.left = p2->avl.right;
b5e0: e5832008 str r2, [r3, #8]
p2->avl.right = p;
if (p2->avl.bal == -1) p->avl.bal = 1; else p->avl.bal = 0;
b5e4: e1d021d1 ldrsb r2, [r0, #17]
b5e8: e3720001 cmn r2, #1
b5ec: 13a02000 movne r2, #0
b5f0: 03a02001 moveq r2, #1
b5f4: e5c32011 strb r2, [r3, #17]
p2 = p1->avl.right;
p1->avl.right = p2->avl.left;
p2->avl.left = p1;
p->avl.left = p2->avl.right;
p2->avl.right = p;
b5f8: e580300c str r3, [r0, #12]
if (p2->avl.bal == -1) p->avl.bal = 1; else p->avl.bal = 0;
if (p2->avl.bal == +1) p1->avl.bal = -1; else p1->avl.bal = 0;
b5fc: e1d031d1 ldrsb r3, [r0, #17]
b600: e3530001 cmp r3, #1
b604: 03a030ff moveq r3, #255 ; 0xff
b608: 13a03000 movne r3, #0
b60c: e5c13011 strb r3, [r1, #17]
p = p2;
p2->avl.bal = 0;
b610: e5c0c011 strb ip, [r0, #17]
b614: e1a03000 mov r3, r0
}
}
else
{
/* rebalance right branch */
switch (p->avl.bal)
b618: e3a02001 mov r2, #1
{
return bdbuf_cache.buffer_waiters.count;
}
static void
rtems_bdbuf_remove_from_tree (rtems_bdbuf_buffer *bd)
b61c: e2440004 sub r0, r4, #4
default:
break;
}
}
if (buf_prev > buf_stack)
b620: e1500006 cmp r0, r6
b624: 9a000008 bls b64c <rtems_bdbuf_remove_from_tree+0x318>
{
q = *(buf_prev - 1);
b628: e5141008 ldr r1, [r4, #-8]
if (q->avl.cache == -1)
b62c: e1d141d0 ldrsb r4, [r1, #16]
b630: e3740001 cmn r4, #1
{
q->avl.left = p;
b634: 05813008 streq r3, [r1, #8]
}
else
{
q->avl.right = p;
b638: 1581300c strne r3, [r1, #12]
*root = q;
}
modified = true;
while (modified)
b63c: e3520000 cmp r2, #0
q->avl.right = p;
}
}
else
{
*root = p;
b640: e1a04000 mov r4, r0
*root = q;
}
modified = true;
while (modified)
b644: 1affff99 bne b4b0 <rtems_bdbuf_remove_from_tree+0x17c>
b648: ea000005 b b664 <rtems_bdbuf_remove_from_tree+0x330>
q->avl.right = p;
}
}
else
{
*root = p;
b64c: e59f2018 ldr r2, [pc, #24] ; b66c <rtems_bdbuf_remove_from_tree+0x338>
b650: e582303c str r3, [r2, #60] ; 0x3c
b654: ea000002 b b664 <rtems_bdbuf_remove_from_tree+0x330>
static void
rtems_bdbuf_remove_from_tree (rtems_bdbuf_buffer *bd)
{
if (rtems_bdbuf_avl_remove (&bdbuf_cache.tree, bd) != 0)
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_TREE_RM);
b658: e5950020 ldr r0, [r5, #32] <== NOT EXECUTED
b65c: e3a0101b mov r1, #27 <== NOT EXECUTED
b660: ebfffe30 bl af28 <rtems_bdbuf_fatal_with_state> <== NOT EXECUTED
}
b664: e28dd080 add sp, sp, #128 ; 0x80
b668: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
0000b670 <rtems_bdbuf_remove_from_tree_and_lru_list>:
static void
rtems_bdbuf_remove_from_tree_and_lru_list (rtems_bdbuf_buffer *bd)
{
switch (bd->state)
b670: e5903020 ldr r3, [r0, #32]
b674: e3530000 cmp r3, #0
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_TREE_RM);
}
static void
rtems_bdbuf_remove_from_tree_and_lru_list (rtems_bdbuf_buffer *bd)
{
b678: e92d4010 push {r4, lr}
b67c: e1a04000 mov r4, r0
switch (bd->state)
b680: 0a000006 beq b6a0 <rtems_bdbuf_remove_from_tree_and_lru_list+0x30>
b684: e3530002 cmp r3, #2
b688: 1a000001 bne b694 <rtems_bdbuf_remove_from_tree_and_lru_list+0x24>
{
case RTEMS_BDBUF_STATE_FREE:
break;
case RTEMS_BDBUF_STATE_CACHED:
rtems_bdbuf_remove_from_tree (bd);
b68c: ebffff28 bl b334 <rtems_bdbuf_remove_from_tree>
break;
b690: ea000002 b b6a0 <rtems_bdbuf_remove_from_tree_and_lru_list+0x30>
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_10);
b694: e1a00003 mov r0, r3 <== NOT EXECUTED
b698: e3a01016 mov r1, #22 <== NOT EXECUTED
b69c: ebfffe21 bl af28 <rtems_bdbuf_fatal_with_state> <== NOT EXECUTED
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
b6a0: e894000c ldm r4, {r2, r3}
next->previous = previous;
b6a4: e5823004 str r3, [r2, #4]
previous->next = next;
b6a8: e5832000 str r2, [r3]
}
rtems_chain_extract_unprotected (&bd->link);
}
b6ac: e8bd8010 pop {r4, pc}
0000bf80 <rtems_bdbuf_swapout_task>:
* not this.
* @return rtems_task Not used.
*/
static rtems_task
rtems_bdbuf_swapout_task (rtems_task_argument arg)
{
bf80: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_bdbuf_swapout_transfer transfer;
uint32_t period_in_ticks;
const uint32_t period_in_msecs = bdbuf_config.swapout_period;
bf84: e59f62b4 ldr r6, [pc, #692] ; c240 <rtems_bdbuf_swapout_task+0x2c0>
* not this.
* @return rtems_task Not used.
*/
static rtems_task
rtems_bdbuf_swapout_task (rtems_task_argument arg)
{
bf88: e24dd028 sub sp, sp, #40 ; 0x28
rtems_bdbuf_swapout_transfer transfer;
uint32_t period_in_ticks;
const uint32_t period_in_msecs = bdbuf_config.swapout_period;
bf8c: e596b00c ldr fp, [r6, #12]
uint32_t timer_delta;
transfer.write_req = rtems_bdbuf_swapout_writereq_alloc ();
bf90: ebfffc66 bl b130 <rtems_bdbuf_swapout_writereq_alloc>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
bf94: e28d300c add r3, sp, #12
head->previous = NULL;
tail->previous = head;
bf98: e58d3014 str r3, [sp, #20]
transfer.syncing = false;
/*
* Localise the period.
*/
period_in_ticks = RTEMS_MICROSECONDS_TO_TICKS (period_in_msecs * 1000);
bf9c: e59f32a0 ldr r3, [pc, #672] ; c244 <rtems_bdbuf_swapout_task+0x2c4>
rtems_bdbuf_swapout_transfer transfer;
uint32_t period_in_ticks;
const uint32_t period_in_msecs = bdbuf_config.swapout_period;
uint32_t timer_delta;
transfer.write_req = rtems_bdbuf_swapout_writereq_alloc ();
bfa0: e58d0020 str r0, [sp, #32]
transfer.syncing = false;
/*
* Localise the period.
*/
period_in_ticks = RTEMS_MICROSECONDS_TO_TICKS (period_in_msecs * 1000);
bfa4: e3a00ffa mov r0, #1000 ; 0x3e8
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
bfa8: e28d2010 add r2, sp, #16
head->previous = NULL;
bfac: e3a04000 mov r4, #0
bfb0: e593100c ldr r1, [r3, #12]
bfb4: e000009b mul r0, fp, r0
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
bfb8: e58d200c str r2, [sp, #12]
head->previous = NULL;
bfbc: e58d4010 str r4, [sp, #16]
const uint32_t period_in_msecs = bdbuf_config.swapout_period;
uint32_t timer_delta;
transfer.write_req = rtems_bdbuf_swapout_writereq_alloc ();
rtems_chain_initialize_empty (&transfer.bds);
transfer.dd = BDBUF_INVALID_DEV;
bfc0: e58d4018 str r4, [sp, #24]
transfer.syncing = false;
bfc4: e5cd401c strb r4, [sp, #28]
/*
* Localise the period.
*/
period_in_ticks = RTEMS_MICROSECONDS_TO_TICKS (period_in_msecs * 1000);
bfc8: eb003960 bl 1a550 <__aeabi_uidiv>
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
bfcc: e59f5274 ldr r5, [pc, #628] ; c248 <rtems_bdbuf_swapout_task+0x2c8>
bfd0: e58d0008 str r0, [sp, #8]
rtems_bdbuf_swapout_workers_open (void)
{
rtems_status_code sc;
size_t w;
rtems_bdbuf_lock_cache ();
bfd4: ebfffbbd bl aed0 <rtems_bdbuf_lock_cache>
for (w = 0; w < bdbuf_config.swapout_workers; w++)
bfd8: e5968014 ldr r8, [r6, #20]
bfdc: ea000023 b c070 <rtems_bdbuf_swapout_task+0xf0>
{
rtems_bdbuf_swapout_worker* worker;
worker = malloc (sizeof (rtems_bdbuf_swapout_worker));
bfe0: e3a00028 mov r0, #40 ; 0x28 <== NOT EXECUTED
bfe4: ebffde3f bl 38e8 <malloc> <== NOT EXECUTED
if (!worker)
bfe8: e2507000 subs r7, r0, #0 <== NOT EXECUTED
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_SO_WK_NOMEM);
bfec: 03a0000a moveq r0, #10 <== NOT EXECUTED
bff0: 0a00001c beq c068 <rtems_bdbuf_swapout_task+0xe8> <== NOT EXECUTED
bff4: e5953010 ldr r3, [r5, #16] <== NOT EXECUTED
the_node->next = tail;
bff8: e59f224c ldr r2, [pc, #588] ; c24c <rtems_bdbuf_swapout_task+0x2cc><== NOT EXECUTED
tail->previous = the_node;
old_last->next = the_node;
the_node->previous = old_last;
bffc: e5873004 str r3, [r7, #4] <== NOT EXECUTED
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
c000: e5872000 str r2, [r7] <== NOT EXECUTED
tail->previous = the_node;
old_last->next = the_node;
c004: e5837000 str r7, [r3] <== NOT EXECUTED
rtems_chain_append_unprotected (&bdbuf_cache.swapout_workers, &worker->link);
worker->enabled = true;
c008: e3a03001 mov r3, #1 <== NOT EXECUTED
c00c: e5c7300c strb r3, [r7, #12] <== NOT EXECUTED
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
c010: e5857010 str r7, [r5, #16] <== NOT EXECUTED
worker->transfer.write_req = rtems_bdbuf_swapout_writereq_alloc ();
c014: ebfffc45 bl b130 <rtems_bdbuf_swapout_writereq_alloc> <== NOT EXECUTED
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 );
c018: e2873014 add r3, r7, #20 <== NOT EXECUTED
c01c: e5870024 str r0, [r7, #36] ; 0x24 <== NOT EXECUTED
head->next = tail;
c020: e5873010 str r3, [r7, #16] <== NOT EXECUTED
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 );
c024: e2872010 add r2, r7, #16 <== NOT EXECUTED
head->next = tail;
head->previous = NULL;
c028: e3a03000 mov r3, #0 <== NOT EXECUTED
rtems_chain_initialize_empty (&worker->transfer.bds);
worker->transfer.dd = BDBUF_INVALID_DEV;
sc = rtems_bdbuf_create_task (rtems_build_name('B', 'D', 'o', 'a' + w),
c02c: e59f021c ldr r0, [pc, #540] ; c250 <rtems_bdbuf_swapout_task+0x2d0><== NOT EXECUTED
c030: e5873014 str r3, [r7, #20] <== NOT EXECUTED
tail->previous = head;
c034: e5872018 str r2, [r7, #24] <== NOT EXECUTED
rtems_chain_append_unprotected (&bdbuf_cache.swapout_workers, &worker->link);
worker->enabled = true;
worker->transfer.write_req = rtems_bdbuf_swapout_writereq_alloc ();
rtems_chain_initialize_empty (&worker->transfer.bds);
worker->transfer.dd = BDBUF_INVALID_DEV;
c038: e587301c str r3, [r7, #28] <== NOT EXECUTED
sc = rtems_bdbuf_create_task (rtems_build_name('B', 'D', 'o', 'a' + w),
c03c: e2872008 add r2, r7, #8 <== NOT EXECUTED
* @param arg A pointer to the global cache data. Use the global variable and
* not this.
* @return rtems_task Not used.
*/
static rtems_task
rtems_bdbuf_swapout_task (rtems_task_argument arg)
c040: e2843061 add r3, r4, #97 ; 0x61 <== NOT EXECUTED
worker->transfer.write_req = rtems_bdbuf_swapout_writereq_alloc ();
rtems_chain_initialize_empty (&worker->transfer.bds);
worker->transfer.dd = BDBUF_INVALID_DEV;
sc = rtems_bdbuf_create_task (rtems_build_name('B', 'D', 'o', 'a' + w),
c044: e58d2000 str r2, [sp] <== NOT EXECUTED
c048: e1830000 orr r0, r3, r0 <== NOT EXECUTED
c04c: e5961018 ldr r1, [r6, #24] <== NOT EXECUTED
c050: e59f21fc ldr r2, [pc, #508] ; c254 <rtems_bdbuf_swapout_task+0x2d4><== NOT EXECUTED
c054: e1a03007 mov r3, r7 <== NOT EXECUTED
c058: ebfffc9c bl b2d0 <rtems_bdbuf_create_task.constprop.10> <== NOT EXECUTED
bdbuf_config.swapout_worker_priority,
RTEMS_BDBUF_SWAPOUT_WORKER_TASK_PRIORITY_DEFAULT,
rtems_bdbuf_swapout_worker_task,
(rtems_task_argument) worker,
&worker->id);
if (sc != RTEMS_SUCCESSFUL)
c05c: e3500000 cmp r0, #0 <== NOT EXECUTED
c060: 0a000001 beq c06c <rtems_bdbuf_swapout_task+0xec> <== NOT EXECUTED
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_SO_WK_CREATE);
c064: e3a0000d mov r0, #13 <== NOT EXECUTED
c068: ebfffb94 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
rtems_status_code sc;
size_t w;
rtems_bdbuf_lock_cache ();
for (w = 0; w < bdbuf_config.swapout_workers; w++)
c06c: e2844001 add r4, r4, #1 <== NOT EXECUTED
c070: e1540008 cmp r4, r8
c074: 3affffd9 bcc bfe0 <rtems_bdbuf_swapout_task+0x60>
/*
* Create the worker threads.
*/
rtems_bdbuf_swapout_workers_open ();
while (bdbuf_cache.swapout_enabled)
c078: e59f51c8 ldr r5, [pc, #456] ; c248 <rtems_bdbuf_swapout_task+0x2c8>
&worker->id);
if (sc != RTEMS_SUCCESSFUL)
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_SO_WK_CREATE);
}
rtems_bdbuf_unlock_cache ();
c07c: ebfffbac bl af34 <rtems_bdbuf_unlock_cache>
* here. We do not know the worker is the last in a sequence of sync writes
* until after we have it running so we do not know to tell it to release the
* lock. The simplest solution is to get the main swap out task perform all
* sync operations.
*/
if (bdbuf_cache.sync_active)
c080: e1a0a005 mov sl, r5
c084: ea000056 b c1e4 <rtems_bdbuf_swapout_task+0x264>
}
transfered_buffers = true;
}
if (bdbuf_cache.sync_active && !transfered_buffers)
c088: e3a08000 mov r8, #0
c08c: ea000000 b c094 <rtems_bdbuf_swapout_task+0x114>
/*
* Create the worker threads.
*/
rtems_bdbuf_swapout_workers_open ();
while (bdbuf_cache.swapout_enabled)
c090: e3a08001 mov r8, #1
rtems_bdbuf_swapout_transfer* transfer)
{
rtems_bdbuf_swapout_worker* worker;
bool transfered_buffers = false;
rtems_bdbuf_lock_cache ();
c094: ebfffb8d bl aed0 <rtems_bdbuf_lock_cache>
* here. We do not know the worker is the last in a sequence of sync writes
* until after we have it running so we do not know to tell it to release the
* lock. The simplest solution is to get the main swap out task perform all
* sync operations.
*/
if (bdbuf_cache.sync_active)
c098: e5d53030 ldrb r3, [r5, #48] ; 0x30
c09c: e3530000 cmp r3, #0
worker = NULL;
c0a0: 13a07000 movne r7, #0
* here. We do not know the worker is the last in a sequence of sync writes
* until after we have it running so we do not know to tell it to release the
* lock. The simplest solution is to get the main swap out task perform all
* sync operations.
*/
if (bdbuf_cache.sync_active)
c0a4: 1a00000a bne c0d4 <rtems_bdbuf_swapout_task+0x154>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
c0a8: e5957008 ldr r7, [r5, #8]
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
c0ac: e59f1198 ldr r1, [pc, #408] ; c24c <rtems_bdbuf_swapout_task+0x2cc>
c0b0: e1570001 cmp r7, r1
c0b4: 0a000005 beq c0d0 <rtems_bdbuf_swapout_task+0x150>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
c0b8: e1a04007 mov r4, r7 <== NOT EXECUTED
c0bc: e4942010 ldr r2, [r4], #16 <== NOT EXECUTED
head->next = new_first;
new_first->previous = head;
c0c0: e2411004 sub r1, r1, #4 <== NOT EXECUTED
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
head->next = new_first;
c0c4: e5852008 str r2, [r5, #8] <== NOT EXECUTED
new_first->previous = head;
c0c8: e5821004 str r1, [r2, #4] <== NOT EXECUTED
c0cc: ea000001 b c0d8 <rtems_bdbuf_swapout_task+0x158> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
c0d0: e1a07003 mov r7, r3
/*
* Extact all the buffers we find for a specific device. The device is
* the first one we find on a modified list. Process the sync queue of
* buffers first.
*/
if (rtems_bdbuf_swapout_processing (timer_delta,
c0d4: e28d400c add r4, sp, #12
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 );
c0d8: e2842004 add r2, r4, #4
head->next = tail;
c0dc: e5842000 str r2, [r4]
head->previous = NULL;
c0e0: e3a02000 mov r2, #0
/*
* When the sync is for a device limit the sync to that device. If the sync
* is for a buffer handle process the devices in the order on the sync
* list. This means the dev is BDBUF_INVALID_DEV.
*/
if (bdbuf_cache.sync_active)
c0e4: e1530002 cmp r3, r2
transfer = &worker->transfer;
}
rtems_chain_initialize_empty (&transfer->bds);
transfer->dd = BDBUF_INVALID_DEV;
transfer->syncing = bdbuf_cache.sync_active;
c0e8: e5c43010 strb r3, [r4, #16]
* When the sync is for a device limit the sync to that device. If the sync
* is for a buffer handle process the devices in the order on the sync
* list. This means the dev is BDBUF_INVALID_DEV.
*/
if (bdbuf_cache.sync_active)
transfer->dd = bdbuf_cache.sync_device;
c0ec: 15953038 ldrne r3, [r5, #56] ; 0x38
/*
* If we have any buffers in the sync queue move them to the modified
* list. The first sync buffer will select the device we use.
*/
rtems_bdbuf_swapout_modified_processing (&transfer->dd,
c0f0: e284600c add r6, r4, #12
if (worker)
transfer = &worker->transfer;
}
rtems_chain_initialize_empty (&transfer->bds);
transfer->dd = BDBUF_INVALID_DEV;
c0f4: e584200c str r2, [r4, #12]
tail->previous = head;
c0f8: e9840014 stmib r4, {r2, r4}
* When the sync is for a device limit the sync to that device. If the sync
* is for a buffer handle process the devices in the order on the sync
* list. This means the dev is BDBUF_INVALID_DEV.
*/
if (bdbuf_cache.sync_active)
transfer->dd = bdbuf_cache.sync_device;
c0fc: 1584300c strne r3, [r4, #12]
/*
* If we have any buffers in the sync queue move them to the modified
* list. The first sync buffer will select the device we use.
*/
rtems_bdbuf_swapout_modified_processing (&transfer->dd,
c100: e1a00006 mov r0, r6
c104: e59f114c ldr r1, [pc, #332] ; c258 <rtems_bdbuf_swapout_task+0x2d8>
c108: e1a02004 mov r2, r4
c10c: e3a03001 mov r3, #1
c110: e3a09000 mov r9, #0
c114: e88d0a00 stm sp, {r9, fp}
c118: ebfffb12 bl ad68 <rtems_bdbuf_swapout_modified_processing>
timer_delta);
/*
* Process the cache's modified list.
*/
rtems_bdbuf_swapout_modified_processing (&transfer->dd,
c11c: e5d53030 ldrb r3, [r5, #48] ; 0x30
c120: e1a02004 mov r2, r4
c124: e1a00006 mov r0, r6
c128: e59f112c ldr r1, [pc, #300] ; c25c <rtems_bdbuf_swapout_task+0x2dc>
c12c: e88d0900 stm sp, {r8, fp}
c130: ebfffb0c bl ad68 <rtems_bdbuf_swapout_modified_processing>
/*
* We have all the buffers that have been modified for this device so the
* cache can be unlocked because the state of each buffer has been set to
* TRANSFER.
*/
rtems_bdbuf_unlock_cache ();
c134: ebfffb7e bl af34 <rtems_bdbuf_unlock_cache>
/*
* If there are buffers to transfer to the media transfer them.
*/
if (!rtems_chain_is_empty (&transfer->bds))
c138: e5942000 ldr r2, [r4]
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
c13c: e2843004 add r3, r4, #4
c140: e1520003 cmp r2, r3
c144: 0a00000b beq c178 <rtems_bdbuf_swapout_task+0x1f8>
{
if (worker)
c148: e1570009 cmp r7, r9
c14c: 0a000006 beq c16c <rtems_bdbuf_swapout_task+0x1ec>
{
rtems_status_code sc = rtems_event_send (worker->id,
c150: e5970008 ldr r0, [r7, #8] <== NOT EXECUTED
c154: e3a01004 mov r1, #4 <== NOT EXECUTED
c158: ebffeb3c bl 6e50 <rtems_event_send> <== NOT EXECUTED
RTEMS_BDBUF_SWAPOUT_SYNC);
if (sc != RTEMS_SUCCESSFUL)
c15c: e1500009 cmp r0, r9 <== NOT EXECUTED
c160: 0a000003 beq c174 <rtems_bdbuf_swapout_task+0x1f4> <== NOT EXECUTED
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_SO_WAKE_2);
c164: e3a0000c mov r0, #12 <== NOT EXECUTED
c168: eaffffbe b c068 <rtems_bdbuf_swapout_task+0xe8> <== NOT EXECUTED
}
else
{
rtems_bdbuf_swapout_write (transfer);
c16c: e1a00004 mov r0, r4
c170: ebffff2a bl be20 <rtems_bdbuf_swapout_write>
}
transfered_buffers = true;
c174: e3a09001 mov r9, #1
}
if (bdbuf_cache.sync_active && !transfered_buffers)
c178: e5d58030 ldrb r8, [r5, #48] ; 0x30
c17c: e3580000 cmp r8, #0
c180: 0a00000c beq c1b8 <rtems_bdbuf_swapout_task+0x238>
c184: e3590000 cmp r9, #0
c188: 1affffbe bne c088 <rtems_bdbuf_swapout_task+0x108>
{
rtems_id sync_requester;
rtems_bdbuf_lock_cache ();
c18c: ebfffb4f bl aed0 <rtems_bdbuf_lock_cache>
sync_requester = bdbuf_cache.sync_requester;
c190: e59a4034 ldr r4, [sl, #52] ; 0x34
bdbuf_cache.sync_active = false;
c194: e5ca9030 strb r9, [sl, #48] ; 0x30
bdbuf_cache.sync_requester = 0;
c198: e58a9034 str r9, [sl, #52] ; 0x34
rtems_bdbuf_unlock_cache ();
c19c: ebfffb64 bl af34 <rtems_bdbuf_unlock_cache>
if (sync_requester)
c1a0: e3540000 cmp r4, #0
c1a4: 0a000005 beq c1c0 <rtems_bdbuf_swapout_task+0x240>
c1a8: e1a00004 mov r0, r4
c1ac: e3a01102 mov r1, #-2147483648 ; 0x80000000
c1b0: ebffec9c bl 7428 <rtems_event_system_send>
c1b4: ea000001 b c1c0 <rtems_bdbuf_swapout_task+0x240>
/*
* Extact all the buffers we find for a specific device. The device is
* the first one we find on a modified list. Process the sync queue of
* buffers first.
*/
if (rtems_bdbuf_swapout_processing (timer_delta,
c1b8: e3590000 cmp r9, #0
c1bc: 1affffb4 bne c094 <rtems_bdbuf_swapout_task+0x114>
*/
update_timers = false;
}
while (transfered_buffers);
sc = rtems_event_receive (RTEMS_BDBUF_SWAPOUT_SYNC,
c1c0: e3a00004 mov r0, #4
c1c4: e3a01000 mov r1, #0
c1c8: e59d2008 ldr r2, [sp, #8]
c1cc: e28d3024 add r3, sp, #36 ; 0x24
c1d0: ebffeabf bl 6cd4 <rtems_event_receive>
RTEMS_EVENT_ALL | RTEMS_WAIT,
period_in_ticks,
&out);
if ((sc != RTEMS_SUCCESSFUL) && (sc != RTEMS_TIMEOUT))
c1d4: e3500006 cmp r0, #6
c1d8: 13500000 cmpne r0, #0
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_SWAPOUT_RE);
c1dc: 13a00018 movne r0, #24
c1e0: 1affffa0 bne c068 <rtems_bdbuf_swapout_task+0xe8>
/*
* Create the worker threads.
*/
rtems_bdbuf_swapout_workers_open ();
while (bdbuf_cache.swapout_enabled)
c1e4: e5d57004 ldrb r7, [r5, #4]
c1e8: e3570000 cmp r7, #0
c1ec: e59f6054 ldr r6, [pc, #84] ; c248 <rtems_bdbuf_swapout_task+0x2c8>
c1f0: 1affffa6 bne c090 <rtems_bdbuf_swapout_task+0x110>
static void
rtems_bdbuf_swapout_workers_close (void)
{
rtems_chain_node* node;
rtems_bdbuf_lock_cache ();
c1f4: ebfffb35 bl aed0 <rtems_bdbuf_lock_cache> <== NOT EXECUTED
node = rtems_chain_first (&bdbuf_cache.swapout_workers);
while (!rtems_chain_is_tail (&bdbuf_cache.swapout_workers, node))
{
rtems_bdbuf_swapout_worker* worker = (rtems_bdbuf_swapout_worker*) node;
worker->enabled = false;
c1f8: e1a05007 mov r5, r7 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
c1fc: e5964008 ldr r4, [r6, #8] <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
c200: e286600c add r6, r6, #12 <== NOT EXECUTED
c204: ea000004 b c21c <rtems_bdbuf_swapout_task+0x29c> <== NOT EXECUTED
c208: e5c4500c strb r5, [r4, #12] <== NOT EXECUTED
rtems_event_send (worker->id, RTEMS_BDBUF_SWAPOUT_SYNC);
c20c: e5940008 ldr r0, [r4, #8] <== NOT EXECUTED
c210: e3a01004 mov r1, #4 <== NOT EXECUTED
c214: ebffeb0d bl 6e50 <rtems_event_send> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Next(
Chain_Node *the_node
)
{
return the_node->next;
c218: e5944000 ldr r4, [r4] <== NOT EXECUTED
rtems_chain_node* node;
rtems_bdbuf_lock_cache ();
node = rtems_chain_first (&bdbuf_cache.swapout_workers);
while (!rtems_chain_is_tail (&bdbuf_cache.swapout_workers, node))
c21c: e1540006 cmp r4, r6 <== NOT EXECUTED
c220: 1afffff8 bne c208 <rtems_bdbuf_swapout_task+0x288> <== NOT EXECUTED
worker->enabled = false;
rtems_event_send (worker->id, RTEMS_BDBUF_SWAPOUT_SYNC);
node = rtems_chain_next (node);
}
rtems_bdbuf_unlock_cache ();
c224: ebfffb42 bl af34 <rtems_bdbuf_unlock_cache> <== NOT EXECUTED
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_SWAPOUT_RE);
}
rtems_bdbuf_swapout_workers_close ();
free (transfer.write_req);
c228: e59d0020 ldr r0, [sp, #32] <== NOT EXECUTED
c22c: ebffdc7f bl 3430 <free> <== NOT EXECUTED
rtems_task_delete (RTEMS_SELF);
c230: e3a00000 mov r0, #0 <== NOT EXECUTED
c234: ebffece1 bl 75c0 <rtems_task_delete> <== NOT EXECUTED
}
c238: e28dd028 add sp, sp, #40 ; 0x28 <== NOT EXECUTED
c23c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
0000c260 <rtems_bdbuf_swapout_worker_task>:
* @param arg A pointer to the worker thread's private data.
* @return rtems_task Not used.
*/
static rtems_task
rtems_bdbuf_swapout_worker_task (rtems_task_argument arg)
{
c260: e92d41f0 push {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
c264: e59f5078 ldr r5, [pc, #120] ; c2e4 <rtems_bdbuf_swapout_worker_task+0x84><== NOT EXECUTED
c268: e1a04000 mov r4, r0 <== NOT EXECUTED
while (worker->enabled)
{
rtems_bdbuf_wait_for_event (RTEMS_BDBUF_SWAPOUT_SYNC);
rtems_bdbuf_swapout_write (&worker->transfer);
c26c: e2807010 add r7, r0, #16 <== NOT EXECUTED
the_node->next = tail;
c270: e285800c add r8, r5, #12 <== NOT EXECUTED
static rtems_task
rtems_bdbuf_swapout_worker_task (rtems_task_argument arg)
{
rtems_bdbuf_swapout_worker* worker = (rtems_bdbuf_swapout_worker*) arg;
while (worker->enabled)
c274: ea000010 b c2bc <rtems_bdbuf_swapout_worker_task+0x5c> <== NOT EXECUTED
{
rtems_bdbuf_wait_for_event (RTEMS_BDBUF_SWAPOUT_SYNC);
c278: e3a00004 mov r0, #4 <== NOT EXECUTED
c27c: ebfffb9b bl b0f0 <rtems_bdbuf_wait_for_event> <== NOT EXECUTED
rtems_bdbuf_swapout_write (&worker->transfer);
c280: e1a00007 mov r0, r7 <== NOT EXECUTED
c284: ebfffee5 bl be20 <rtems_bdbuf_swapout_write> <== NOT EXECUTED
rtems_bdbuf_lock_cache ();
c288: ebfffb10 bl aed0 <rtems_bdbuf_lock_cache> <== NOT EXECUTED
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 );
c28c: e2843014 add r3, r4, #20 <== NOT EXECUTED
head->next = tail;
c290: e5843010 str r3, [r4, #16] <== NOT EXECUTED
head->previous = NULL;
c294: e3a03000 mov r3, #0 <== NOT EXECUTED
rtems_chain_initialize_empty (&worker->transfer.bds);
worker->transfer.dd = BDBUF_INVALID_DEV;
c298: e584301c str r3, [r4, #28] <== NOT EXECUTED
c29c: e5843014 str r3, [r4, #20] <== NOT EXECUTED
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
c2a0: e5953010 ldr r3, [r5, #16] <== NOT EXECUTED
the_node->next = tail;
c2a4: e5848000 str r8, [r4] <== NOT EXECUTED
tail->previous = the_node;
c2a8: e5854010 str r4, [r5, #16] <== NOT EXECUTED
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
tail->previous = head;
c2ac: e5847018 str r7, [r4, #24] <== NOT EXECUTED
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
old_last->next = the_node;
c2b0: e5834000 str r4, [r3] <== NOT EXECUTED
the_node->previous = old_last;
c2b4: e5843004 str r3, [r4, #4] <== NOT EXECUTED
rtems_chain_append_unprotected (&bdbuf_cache.swapout_workers, &worker->link);
rtems_bdbuf_unlock_cache ();
c2b8: ebfffb1d bl af34 <rtems_bdbuf_unlock_cache> <== NOT EXECUTED
static rtems_task
rtems_bdbuf_swapout_worker_task (rtems_task_argument arg)
{
rtems_bdbuf_swapout_worker* worker = (rtems_bdbuf_swapout_worker*) arg;
while (worker->enabled)
c2bc: e5d4600c ldrb r6, [r4, #12] <== NOT EXECUTED
c2c0: e3560000 cmp r6, #0 <== NOT EXECUTED
c2c4: 1affffeb bne c278 <rtems_bdbuf_swapout_worker_task+0x18> <== NOT EXECUTED
rtems_chain_append_unprotected (&bdbuf_cache.swapout_workers, &worker->link);
rtems_bdbuf_unlock_cache ();
}
free (worker->transfer.write_req);
c2c8: e5940024 ldr r0, [r4, #36] ; 0x24 <== NOT EXECUTED
c2cc: ebffdc57 bl 3430 <free> <== NOT EXECUTED
free (worker);
c2d0: e1a00004 mov r0, r4 <== NOT EXECUTED
c2d4: ebffdc55 bl 3430 <free> <== NOT EXECUTED
rtems_task_delete (RTEMS_SELF);
c2d8: e1a00006 mov r0, r6 <== NOT EXECUTED
}
c2dc: e8bd41f0 pop {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
}
free (worker->transfer.write_req);
free (worker);
rtems_task_delete (RTEMS_SELF);
c2e0: eaffecb6 b 75c0 <rtems_task_delete> <== NOT EXECUTED
0000be20 <rtems_bdbuf_swapout_write>:
printf ("bdbuf:swapout transfer: %08x\n", (unsigned) transfer->dd->dev);
/*
* If there are buffers to transfer to the media transfer them.
*/
if (!rtems_chain_is_empty (&transfer->bds))
be20: e5903000 ldr r3, [r0]
*
* @param transfer The transfer transaction.
*/
static void
rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
{
be24: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
be28: e2807004 add r7, r0, #4
printf ("bdbuf:swapout transfer: %08x\n", (unsigned) transfer->dd->dev);
/*
* If there are buffers to transfer to the media transfer them.
*/
if (!rtems_chain_is_empty (&transfer->bds))
be2c: e1530007 cmp r3, r7
*
* @param transfer The transfer transaction.
*/
static void
rtems_bdbuf_swapout_write (rtems_bdbuf_swapout_transfer* transfer)
{
be30: e1a04000 mov r4, r0
printf ("bdbuf:swapout transfer: %08x\n", (unsigned) transfer->dd->dev);
/*
* If there are buffers to transfer to the media transfer them.
*/
if (!rtems_chain_is_empty (&transfer->bds))
be34: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
* The last block number used when the driver only supports
* continuous blocks in a single request.
*/
uint32_t last_block = 0;
rtems_disk_device *dd = transfer->dd;
be38: e590500c ldr r5, [r0, #12]
uint32_t media_blocks_per_block = dd->media_blocks_per_block;
bool need_continuous_blocks =
(dd->phys_dev->capabilities & RTEMS_BLKDEV_CAP_MULTISECTOR_CONT) != 0;
be3c: e5953008 ldr r3, [r5, #8]
be40: e593900c ldr r9, [r3, #12]
* should be possible to make this change with little effect in this
* code. The array that is passed is broken in design and should be
* removed. Merging members of a struct into the first member is
* trouble waiting to happen.
*/
transfer->write_req->status = RTEMS_RESOURCE_IN_USE;
be44: e5903014 ldr r3, [r0, #20]
transfer->write_req->bufnum = 0;
be48: e3a06000 mov r6, #0
* should be possible to make this change with little effect in this
* code. The array that is passed is broken in design and should be
* removed. Merging members of a struct into the first member is
* trouble waiting to happen.
*/
transfer->write_req->status = RTEMS_RESOURCE_IN_USE;
be4c: e3a0200c mov r2, #12
* continuous blocks in a single request.
*/
uint32_t last_block = 0;
rtems_disk_device *dd = transfer->dd;
uint32_t media_blocks_per_block = dd->media_blocks_per_block;
be50: e595a02c ldr sl, [r5, #44] ; 0x2c
bool need_continuous_blocks =
(dd->phys_dev->capabilities & RTEMS_BLKDEV_CAP_MULTISECTOR_CONT) != 0;
be54: e2099001 and r9, r9, #1
* should be possible to make this change with little effect in this
* code. The array that is passed is broken in design and should be
* removed. Merging members of a struct into the first member is
* trouble waiting to happen.
*/
transfer->write_req->status = RTEMS_RESOURCE_IN_USE;
be58: e583200c str r2, [r3, #12]
transfer->write_req->bufnum = 0;
be5c: e5836010 str r6, [r3, #16]
while ((node = rtems_chain_get_unprotected(&transfer->bds)) != NULL)
{
rtems_bdbuf_buffer* bd = (rtems_bdbuf_buffer*) node;
bool write = false;
be60: e1a0b006 mov fp, r6
* Perform the transfer if there are no more buffers, or the transfer
* size has reached the configured max. value.
*/
if (rtems_chain_is_empty (&transfer->bds) ||
(transfer->write_req->bufnum >= bdbuf_config.max_write_blocks))
be64: e59f8110 ldr r8, [pc, #272] ; bf7c <rtems_bdbuf_swapout_write+0x15c>
* trouble waiting to happen.
*/
transfer->write_req->status = RTEMS_RESOURCE_IN_USE;
transfer->write_req->bufnum = 0;
while ((node = rtems_chain_get_unprotected(&transfer->bds)) != NULL)
be68: ea00002e b bf28 <rtems_bdbuf_swapout_write+0x108>
if (rtems_bdbuf_tracer)
printf ("bdbuf:swapout write: bd:%" PRIu32 ", bufnum:%" PRIu32 " mode:%s\n",
bd->block, transfer->write_req->bufnum,
need_continuous_blocks ? "MULTI" : "SCAT");
if (need_continuous_blocks && transfer->write_req->bufnum &&
be6c: e5941014 ldr r1, [r4, #20]
be70: e5911010 ldr r1, [r1, #16]
be74: e3510000 cmp r1, #0
be78: 0a000009 beq bea4 <rtems_bdbuf_swapout_write+0x84>
be7c: e5930018 ldr r0, [r3, #24]
bd->block != last_block + media_blocks_per_block)
be80: e086100a add r1, r6, sl
if (rtems_bdbuf_tracer)
printf ("bdbuf:swapout write: bd:%" PRIu32 ", bufnum:%" PRIu32 " mode:%s\n",
bd->block, transfer->write_req->bufnum,
need_continuous_blocks ? "MULTI" : "SCAT");
if (need_continuous_blocks && transfer->write_req->bufnum &&
be84: e1500001 cmp r0, r1
be88: 0a000005 beq bea4 <rtems_bdbuf_swapout_write+0x84>
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
be8c: e5834004 str r4, [r3, #4]
before_node = after_node->next;
after_node->next = the_node;
be90: e5843000 str r3, [r4]
the_node->next = before_node;
before_node->previous = the_node;
be94: e5823004 str r3, [r2, #4]
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
be98: e5832000 str r2, [r3]
bd->block != last_block + media_blocks_per_block)
{
rtems_chain_prepend_unprotected (&transfer->bds, &bd->link);
write = true;
be9c: e3a03001 mov r3, #1
bea0: ea00000e b bee0 <rtems_bdbuf_swapout_write+0xc0>
}
else
{
rtems_blkdev_sg_buffer* buf;
buf = &transfer->write_req->bufs[transfer->write_req->bufnum];
bea4: e5942014 ldr r2, [r4, #20]
bea8: e592c010 ldr ip, [r2, #16]
transfer->write_req->bufnum++;
buf->user = bd;
buf->block = bd->block;
beac: e5936018 ldr r6, [r3, #24]
write = true;
}
else
{
rtems_blkdev_sg_buffer* buf;
buf = &transfer->write_req->bufs[transfer->write_req->bufnum];
beb0: e1a0020c lsl r0, ip, #4
beb4: e2800018 add r0, r0, #24
transfer->write_req->bufnum++;
beb8: e28cc001 add ip, ip, #1
bebc: e582c010 str ip, [r2, #16]
write = true;
}
else
{
rtems_blkdev_sg_buffer* buf;
buf = &transfer->write_req->bufs[transfer->write_req->bufnum];
bec0: e0821000 add r1, r2, r0
transfer->write_req->bufnum++;
buf->user = bd;
buf->block = bd->block;
bec4: e7826000 str r6, [r2, r0]
buf->length = dd->block_size;
bec8: e5952024 ldr r2, [r5, #36] ; 0x24
else
{
rtems_blkdev_sg_buffer* buf;
buf = &transfer->write_req->bufs[transfer->write_req->bufnum];
transfer->write_req->bufnum++;
buf->user = bd;
becc: e581300c str r3, [r1, #12]
buf->block = bd->block;
buf->length = dd->block_size;
buf->buffer = bd->buffer;
bed0: e593301c ldr r3, [r3, #28]
rtems_blkdev_sg_buffer* buf;
buf = &transfer->write_req->bufs[transfer->write_req->bufnum];
transfer->write_req->bufnum++;
buf->user = bd;
buf->block = bd->block;
buf->length = dd->block_size;
bed4: e5812004 str r2, [r1, #4]
buf->buffer = bd->buffer;
bed8: e5813008 str r3, [r1, #8]
transfer->write_req->bufnum = 0;
while ((node = rtems_chain_get_unprotected(&transfer->bds)) != NULL)
{
rtems_bdbuf_buffer* bd = (rtems_bdbuf_buffer*) node;
bool write = false;
bedc: e3a03000 mov r3, #0
/*
* Perform the transfer if there are no more buffers, or the transfer
* size has reached the configured max. value.
*/
if (rtems_chain_is_empty (&transfer->bds) ||
bee0: e5942000 ldr r2, [r4]
bee4: e1520007 cmp r2, r7
bee8: 0a000006 beq bf08 <rtems_bdbuf_swapout_write+0xe8>
(transfer->write_req->bufnum >= bdbuf_config.max_write_blocks))
beec: e5942014 ldr r2, [r4, #20]
/*
* Perform the transfer if there are no more buffers, or the transfer
* size has reached the configured max. value.
*/
if (rtems_chain_is_empty (&transfer->bds) ||
bef0: e5921010 ldr r1, [r2, #16]
bef4: e5982004 ldr r2, [r8, #4]
bef8: e1510002 cmp r1, r2
befc: 2a000001 bcs bf08 <rtems_bdbuf_swapout_write+0xe8>
(transfer->write_req->bufnum >= bdbuf_config.max_write_blocks))
write = true;
if (write)
bf00: e3530000 cmp r3, #0
bf04: 0a000007 beq bf28 <rtems_bdbuf_swapout_write+0x108>
{
rtems_bdbuf_execute_transfer_request (dd, transfer->write_req, false);
bf08: e3a02000 mov r2, #0
bf0c: e1a00005 mov r0, r5
bf10: e5941014 ldr r1, [r4, #20]
bf14: ebffff5d bl bc90 <rtems_bdbuf_execute_transfer_request>
transfer->write_req->status = RTEMS_RESOURCE_IN_USE;
bf18: e5943014 ldr r3, [r4, #20]
bf1c: e3a0200c mov r2, #12
bf20: e583200c str r2, [r3, #12]
transfer->write_req->bufnum = 0;
bf24: e583b010 str fp, [r3, #16]
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
bf28: e5943000 ldr r3, [r4]
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
bf2c: e1530007 cmp r3, r7
bf30: 0a000005 beq bf4c <rtems_bdbuf_swapout_write+0x12c>
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
bf34: e5932000 ldr r2, [r3]
if (rtems_bdbuf_tracer)
printf ("bdbuf:swapout write: bd:%" PRIu32 ", bufnum:%" PRIu32 " mode:%s\n",
bd->block, transfer->write_req->bufnum,
need_continuous_blocks ? "MULTI" : "SCAT");
if (need_continuous_blocks && transfer->write_req->bufnum &&
bf38: e3590000 cmp r9, #0
head->next = new_first;
bf3c: e5842000 str r2, [r4]
new_first->previous = head;
bf40: e5824004 str r4, [r2, #4]
bf44: 1affffc8 bne be6c <rtems_bdbuf_swapout_write+0x4c>
bf48: eaffffd5 b bea4 <rtems_bdbuf_swapout_write+0x84>
/*
* If sync'ing and the deivce is capability of handling a sync IO control
* call perform the call.
*/
if (transfer->syncing &&
bf4c: e5d43010 ldrb r3, [r4, #16]
bf50: e3530000 cmp r3, #0
bf54: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
(dd->phys_dev->capabilities & RTEMS_BLKDEV_CAP_SYNC))
bf58: e5950008 ldr r0, [r5, #8]
bf5c: e590300c ldr r3, [r0, #12]
/*
* If sync'ing and the deivce is capability of handling a sync IO control
* call perform the call.
*/
if (transfer->syncing &&
bf60: e3130002 tst r3, #2
bf64: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
(dd->phys_dev->capabilities & RTEMS_BLKDEV_CAP_SYNC))
{
/* int result = */ dd->ioctl (dd->phys_dev, RTEMS_BLKDEV_REQ_SYNC, NULL);
bf68: e3a01002 mov r1, #2 <== NOT EXECUTED
bf6c: e3a02000 mov r2, #0 <== NOT EXECUTED
bf70: e1a0e00f mov lr, pc <== NOT EXECUTED
bf74: e595f038 ldr pc, [r5, #56] ; 0x38 <== NOT EXECUTED
bf78: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
0000ccc4 <rtems_bdbuf_sync>:
rtems_status_code
rtems_bdbuf_sync (rtems_bdbuf_buffer *bd)
{
ccc4: e92d4010 push {r4, lr}
}
static rtems_status_code
rtems_bdbuf_check_bd_and_lock_cache (rtems_bdbuf_buffer *bd, const char *kind)
{
if (bd == NULL)
ccc8: e2504000 subs r4, r0, #0
cccc: 0a000041 beq cdd8 <rtems_bdbuf_sync+0x114>
if (rtems_bdbuf_tracer)
{
printf ("bdbuf:%s: %" PRIu32 "\n", kind, bd->block);
rtems_bdbuf_show_users (kind, bd);
}
rtems_bdbuf_lock_cache();
ccd0: ebfff87e bl aed0 <rtems_bdbuf_lock_cache>
sc = rtems_bdbuf_check_bd_and_lock_cache (bd, "sync");
if (sc != RTEMS_SUCCESSFUL)
return sc;
switch (bd->state)
ccd4: e5940020 ldr r0, [r4, #32]
ccd8: e3500003 cmp r0, #3
ccdc: 3a000038 bcc cdc4 <rtems_bdbuf_sync+0x100>
cce0: e3500005 cmp r0, #5
cce4: 9a000002 bls ccf4 <rtems_bdbuf_sync+0x30>
cce8: e3500006 cmp r0, #6
ccec: 1a000034 bne cdc4 <rtems_bdbuf_sync+0x100>
ccf0: ea000030 b cdb8 <rtems_bdbuf_sync+0xf4>
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
ccf4: e59f00e4 ldr r0, [pc, #228] ; cde0 <rtems_bdbuf_sync+0x11c>
}
static void
rtems_bdbuf_set_state (rtems_bdbuf_buffer *bd, rtems_bdbuf_buf_state state)
{
bd->state = state;
ccf8: e3a03008 mov r3, #8
ccfc: e5843020 str r3, [r4, #32]
cd00: e5903060 ldr r3, [r0, #96] ; 0x60
the_node->next = tail;
cd04: e280205c add r2, r0, #92 ; 0x5c
cd08: e5842000 str r2, [r4]
tail->previous = the_node;
cd0c: e5804060 str r4, [r0, #96] ; 0x60
old_last->next = the_node;
cd10: e5834000 str r4, [r3]
the_node->previous = old_last;
cd14: e5843004 str r3, [r4, #4]
{
rtems_bdbuf_set_state (bd, RTEMS_BDBUF_STATE_SYNC);
rtems_chain_append_unprotected (&bdbuf_cache.sync, &bd->link);
if (bd->waiters)
cd18: e5943024 ldr r3, [r4, #36] ; 0x24
cd1c: e3530000 cmp r3, #0
rtems_bdbuf_wake (&bdbuf_cache.access_waiters);
cd20: 12800064 addne r0, r0, #100 ; 0x64
cd24: 1bfff935 blne b200 <rtems_bdbuf_wake>
rtems_bdbuf_wake_swapper ();
cd28: ebfff893 bl af7c <rtems_bdbuf_wake_swapper>
static void
rtems_bdbuf_wait_for_sync_done (rtems_bdbuf_buffer *bd)
{
while (true)
{
switch (bd->state)
cd2c: e5940020 ldr r0, [r4, #32]
cd30: e2403001 sub r3, r0, #1
cd34: e3530009 cmp r3, #9
cd38: 979ff103 ldrls pc, [pc, r3, lsl #2]
cd3c: ea00000d b cd78 <rtems_bdbuf_sync+0xb4> <== NOT EXECUTED
cd40: 0000cd80 .word 0x0000cd80 <== NOT EXECUTED
cd44: 0000cd80 .word 0x0000cd80 <== NOT EXECUTED
cd48: 0000cd80 .word 0x0000cd80 <== NOT EXECUTED
cd4c: 0000cd80 .word 0x0000cd80 <== NOT EXECUTED
cd50: 0000cd80 .word 0x0000cd80 <== NOT EXECUTED
cd54: 0000cd80 .word 0x0000cd80 <== NOT EXECUTED
cd58: 0000cd80 .word 0x0000cd80 <== NOT EXECUTED
cd5c: 0000cd68 .word 0x0000cd68 <== NOT EXECUTED
cd60: 0000cd68 .word 0x0000cd68 <== NOT EXECUTED
cd64: 0000cd68 .word 0x0000cd68 <== NOT EXECUTED
case RTEMS_BDBUF_STATE_ACCESS_PURGED:
return;
case RTEMS_BDBUF_STATE_SYNC:
case RTEMS_BDBUF_STATE_TRANSFER:
case RTEMS_BDBUF_STATE_TRANSFER_PURGED:
rtems_bdbuf_wait (bd, &bdbuf_cache.transfer_waiters);
cd68: e1a00004 mov r0, r4
cd6c: e59f1070 ldr r1, [pc, #112] ; cde4 <rtems_bdbuf_sync+0x120>
cd70: ebfff8c7 bl b094 <rtems_bdbuf_wait>
cd74: eaffffec b cd2c <rtems_bdbuf_sync+0x68>
break;
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_9);
cd78: e3a01015 mov r1, #21 <== NOT EXECUTED
cd7c: ea000011 b cdc8 <rtems_bdbuf_sync+0x104> <== NOT EXECUTED
rtems_bdbuf_wait_for_sync_done (bd);
/*
* We may have created a cached or empty buffer which may be recycled.
*/
if (bd->waiters == 0
cd80: e5942024 ldr r2, [r4, #36] ; 0x24
cd84: e3520000 cmp r2, #0
cd88: 1a00000f bne cdcc <rtems_bdbuf_sync+0x108>
&& (bd->state == RTEMS_BDBUF_STATE_CACHED
cd8c: e3530001 cmp r3, #1
cd90: 8a00000d bhi cdcc <rtems_bdbuf_sync+0x108>
|| bd->state == RTEMS_BDBUF_STATE_EMPTY))
{
if (bd->state == RTEMS_BDBUF_STATE_EMPTY)
cd94: e3500001 cmp r0, #1
cd98: 1a000003 bne cdac <rtems_bdbuf_sync+0xe8>
{
rtems_bdbuf_remove_from_tree (bd);
cd9c: e1a00004 mov r0, r4
cda0: ebfff963 bl b334 <rtems_bdbuf_remove_from_tree>
rtems_bdbuf_make_free_and_add_to_lru_list (bd);
cda4: e1a00004 mov r0, r4
cda8: ebfff7e3 bl ad3c <rtems_bdbuf_make_free_and_add_to_lru_list>
}
rtems_bdbuf_wake (&bdbuf_cache.buffer_waiters);
cdac: e59f0034 ldr r0, [pc, #52] ; cde8 <rtems_bdbuf_sync+0x124>
cdb0: ebfff912 bl b200 <rtems_bdbuf_wake>
cdb4: ea000004 b cdcc <rtems_bdbuf_sync+0x108>
case RTEMS_BDBUF_STATE_ACCESS_EMPTY:
case RTEMS_BDBUF_STATE_ACCESS_MODIFIED:
rtems_bdbuf_sync_after_access (bd);
break;
case RTEMS_BDBUF_STATE_ACCESS_PURGED:
rtems_bdbuf_discard_buffer_after_access (bd);
cdb8: e1a00004 mov r0, r4
cdbc: ebfffb9d bl bc38 <rtems_bdbuf_discard_buffer_after_access>
break;
cdc0: ea000001 b cdcc <rtems_bdbuf_sync+0x108>
default:
rtems_bdbuf_fatal_with_state (bd->state, RTEMS_BDBUF_FATAL_STATE_5);
cdc4: e3a01011 mov r1, #17 <== NOT EXECUTED
cdc8: ebfff856 bl af28 <rtems_bdbuf_fatal_with_state> <== NOT EXECUTED
}
if (rtems_bdbuf_tracer)
rtems_bdbuf_show_usage ();
rtems_bdbuf_unlock_cache ();
cdcc: ebfff858 bl af34 <rtems_bdbuf_unlock_cache>
return RTEMS_SUCCESSFUL;
cdd0: e3a00000 mov r0, #0
cdd4: e8bd8010 pop {r4, pc}
static rtems_status_code
rtems_bdbuf_check_bd_and_lock_cache (rtems_bdbuf_buffer *bd, const char *kind)
{
if (bd == NULL)
return RTEMS_INVALID_ADDRESS;
cdd8: e3a00009 mov r0, #9 <== NOT EXECUTED
rtems_bdbuf_show_usage ();
rtems_bdbuf_unlock_cache ();
return RTEMS_SUCCESSFUL;
}
cddc: e8bd8010 pop {r4, pc} <== NOT EXECUTED
0000af34 <rtems_bdbuf_unlock_cache>:
* Unlock the cache.
*/
static void
rtems_bdbuf_unlock_cache (void)
{
rtems_bdbuf_unlock (bdbuf_cache.lock, RTEMS_BDBUF_FATAL_CACHE_UNLOCK);
af34: e59f3018 ldr r3, [pc, #24] ; af54 <rtems_bdbuf_unlock_cache+0x20>
/**
* Unlock the cache.
*/
static void
rtems_bdbuf_unlock_cache (void)
{
af38: e52de004 push {lr} ; (str lr, [sp, #-4]!)
* @param fatal_error_code The error code if the call fails.
*/
static void
rtems_bdbuf_unlock (rtems_id lock, uint32_t fatal_error_code)
{
rtems_status_code sc = rtems_semaphore_release (lock);
af3c: e5930028 ldr r0, [r3, #40] ; 0x28
af40: ebfff112 bl 7390 <rtems_semaphore_release>
if (sc != RTEMS_SUCCESSFUL)
af44: e3500000 cmp r0, #0
af48: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
rtems_bdbuf_fatal (fatal_error_code);
af4c: e3a00001 mov r0, #1 <== NOT EXECUTED
af50: ebffffda bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
0000af58 <rtems_bdbuf_unlock_sync>:
* Unlock the cache's sync lock. Any blocked writers are woken.
*/
static void
rtems_bdbuf_unlock_sync (void)
{
rtems_bdbuf_unlock (bdbuf_cache.sync_lock,
af58: e59f3018 ldr r3, [pc, #24] ; af78 <rtems_bdbuf_unlock_sync+0x20>
/**
* Unlock the cache's sync lock. Any blocked writers are woken.
*/
static void
rtems_bdbuf_unlock_sync (void)
{
af5c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
* @param fatal_error_code The error code if the call fails.
*/
static void
rtems_bdbuf_unlock (rtems_id lock, uint32_t fatal_error_code)
{
rtems_status_code sc = rtems_semaphore_release (lock);
af60: e593002c ldr r0, [r3, #44] ; 0x2c
af64: ebfff109 bl 7390 <rtems_semaphore_release>
if (sc != RTEMS_SUCCESSFUL)
af68: e3500000 cmp r0, #0
af6c: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
rtems_bdbuf_fatal (fatal_error_code);
af70: e3a0001a mov r0, #26 <== NOT EXECUTED
af74: ebffffd1 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
0000b0f0 <rtems_bdbuf_wait_for_event>:
return RTEMS_UNSATISFIED;
}
static void
rtems_bdbuf_wait_for_event (rtems_event_set event)
{
b0f0: e92d4011 push {r0, r4, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_event_set out = 0;
b0f4: e3a01000 mov r1, #0
b0f8: e28d3004 add r3, sp, #4
b0fc: e5231004 str r1, [r3, #-4]!
sc = rtems_event_receive (event,
b100: e1a02001 mov r2, r1
b104: e1a0300d mov r3, sp
return RTEMS_UNSATISFIED;
}
static void
rtems_bdbuf_wait_for_event (rtems_event_set event)
{
b108: e1a04000 mov r4, r0
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_event_set out = 0;
sc = rtems_event_receive (event,
b10c: ebffeef0 bl 6cd4 <rtems_event_receive>
RTEMS_EVENT_ALL | RTEMS_WAIT,
RTEMS_NO_TIMEOUT,
&out);
if (sc != RTEMS_SUCCESSFUL || out != event)
b110: e3500000 cmp r0, #0
b114: 1a000002 bne b124 <rtems_bdbuf_wait_for_event+0x34>
b118: e59d3000 ldr r3, [sp]
b11c: e1530004 cmp r3, r4
b120: 0a000001 beq b12c <rtems_bdbuf_wait_for_event+0x3c>
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_WAIT_EVNT);
b124: e3a0001c mov r0, #28 <== NOT EXECUTED
b128: ebffff64 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
}
b12c: e8bd8018 pop {r3, r4, pc}
0000b200 <rtems_bdbuf_wake>:
static void
rtems_bdbuf_wake (const rtems_bdbuf_waiters *waiters)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (waiters->count > 0)
b200: e5903000 ldr r3, [r0]
b204: e3530000 cmp r3, #0
* Wake a blocked resource. The resource has a counter that lets us know if
* there are any waiters.
*/
static void
rtems_bdbuf_wake (const rtems_bdbuf_waiters *waiters)
{
b208: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (waiters->count > 0)
b20c: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
{
sc = rtems_semaphore_flush (waiters->sema);
b210: e5900004 ldr r0, [r0, #4]
b214: eb000f4f bl ef58 <rtems_semaphore_flush>
if (sc != RTEMS_SUCCESSFUL)
b218: e3500000 cmp r0, #0
b21c: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_CACHE_WAKE);
b220: e3a00004 mov r0, #4 <== NOT EXECUTED
b224: ebffff25 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
0000af7c <rtems_bdbuf_wake_swapper>:
}
static void
rtems_bdbuf_wake_swapper (void)
{
rtems_status_code sc = rtems_event_send (bdbuf_cache.swapout,
af7c: e59f301c ldr r3, [pc, #28] ; afa0 <rtems_bdbuf_wake_swapper+0x24>
}
}
static void
rtems_bdbuf_wake_swapper (void)
{
af80: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_status_code sc = rtems_event_send (bdbuf_cache.swapout,
af84: e5930000 ldr r0, [r3]
af88: e3a01004 mov r1, #4
af8c: ebffefaf bl 6e50 <rtems_event_send>
RTEMS_BDBUF_SWAPOUT_SYNC);
if (sc != RTEMS_SUCCESSFUL)
af90: e3500000 cmp r0, #0
af94: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
rtems_bdbuf_fatal (RTEMS_BDBUF_FATAL_SO_WAKE_1);
af98: e3a0000b mov r0, #11 <== NOT EXECUTED
af9c: ebffffc7 bl aec0 <rtems_bdbuf_fatal> <== NOT EXECUTED
00001cb4 <rtems_bdpart_create>:
const rtems_bdpart_format *format,
rtems_bdpart_partition *pt,
const unsigned *dist,
size_t count
)
{
1cb4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
&& format->mbr.dos_compatibility;
1cb8: e2516000 subs r6, r1, #0
const rtems_bdpart_format *format,
rtems_bdpart_partition *pt,
const unsigned *dist,
size_t count
)
{
1cbc: e24dd014 sub sp, sp, #20
1cc0: e58d2004 str r2, [sp, #4]
1cc4: e1a08003 mov r8, r3
1cc8: e59d4038 ldr r4, [sp, #56] ; 0x38
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
&& format->mbr.dos_compatibility;
1ccc: 01a0a006 moveq sl, r6
1cd0: 0a000003 beq 1ce4 <rtems_bdpart_create+0x30>
size_t count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
1cd4: e5963000 ldr r3, [r6]
1cd8: e3530000 cmp r3, #0
&& format->mbr.dos_compatibility;
1cdc: 05d6a008 ldrbeq sl, [r6, #8]
1ce0: 13a0a000 movne sl, #0
rtems_blkdev_bnum disk_end = 0;
1ce4: e3a03000 mov r3, #0
rtems_blkdev_bnum pos = 0;
rtems_blkdev_bnum dist_sum = 0;
rtems_blkdev_bnum record_space =
1ce8: e21aa0ff ands sl, sl, #255 ; 0xff
1cec: 03a05001 moveq r5, #1
1cf0: 13a0503f movne r5, #63 ; 0x3f
rtems_blkdev_bnum overhead = 0;
rtems_blkdev_bnum free_space = 0;
size_t i = 0;
/* Check if we have something to do */
if (count == 0) {
1cf4: e1540003 cmp r4, r3
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
&& format->mbr.dos_compatibility;
rtems_blkdev_bnum disk_end = 0;
1cf8: e58d3010 str r3, [sp, #16]
size_t i = 0;
/* Check if we have something to do */
if (count == 0) {
/* Nothing to do */
return RTEMS_SUCCESSFUL;
1cfc: 01a07004 moveq r7, r4
rtems_blkdev_bnum overhead = 0;
rtems_blkdev_bnum free_space = 0;
size_t i = 0;
/* Check if we have something to do */
if (count == 0) {
1d00: 0a000062 beq 1e90 <rtems_bdpart_create+0x1dc>
/* Nothing to do */
return RTEMS_SUCCESSFUL;
}
/* Check parameter */
if (format == NULL || pt == NULL || dist == NULL) {
1d04: e59d2004 ldr r2, [sp, #4]
1d08: e1560003 cmp r6, r3
1d0c: 11520003 cmpne r2, r3
1d10: 13a01000 movne r1, #0
1d14: 03a01001 moveq r1, #1
1d18: 0a000059 beq 1e84 <rtems_bdpart_create+0x1d0>
1d1c: e1580003 cmp r8, r3
1d20: 0a000057 beq 1e84 <rtems_bdpart_create+0x1d0>
return RTEMS_INVALID_ADDRESS;
}
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, NULL, NULL, &disk_end);
1d24: e1a02001 mov r2, r1
1d28: e28d3010 add r3, sp, #16
1d2c: eb000107 bl 2150 <rtems_bdpart_get_disk_data>
if (sc != RTEMS_SUCCESSFUL) {
1d30: e2507000 subs r7, r0, #0
1d34: 1a000055 bne 1e90 <rtems_bdpart_create+0x1dc>
1d38: e1a03008 mov r3, r8
1d3c: e1a0c008 mov ip, r8
1d40: e1a00007 mov r0, r7
1d44: e1a01007 mov r1, r7
/* Get distribution sum and check for overflow */
for (i = 0; i < count; ++i) {
unsigned prev_sum = dist_sum;
dist_sum += dist [i];
1d48: e49c2004 ldr r2, [ip], #4
if (dist_sum < prev_sum) {
1d4c: e0921001 adds r1, r2, r1
1d50: 2a00004d bcs 1e8c <rtems_bdpart_create+0x1d8>
return RTEMS_INVALID_NUMBER;
}
if (dist [i] == 0) {
1d54: e3520000 cmp r2, #0
1d58: 0a00004b beq 1e8c <rtems_bdpart_create+0x1d8>
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
/* Get distribution sum and check for overflow */
for (i = 0; i < count; ++i) {
1d5c: e2800001 add r0, r0, #1
1d60: e1500004 cmp r0, r4
1d64: 1afffff7 bne 1d48 <rtems_bdpart_create+0x94>
return RTEMS_INVALID_NUMBER;
}
}
/* Check format */
if (format->type != RTEMS_BDPART_FORMAT_MBR) {
1d68: e5962000 ldr r2, [r6]
1d6c: e3520000 cmp r2, #0
1d70: e58d1008 str r1, [sp, #8]
return RTEMS_NOT_IMPLEMENTED;
1d74: 13a07018 movne r7, #24
return RTEMS_INVALID_NUMBER;
}
}
/* Check format */
if (format->type != RTEMS_BDPART_FORMAT_MBR) {
1d78: 1a000044 bne 1e90 <rtems_bdpart_create+0x1dc>
return RTEMS_NOT_IMPLEMENTED;
}
/* Align end of disk on cylinder boundary if necessary */
if (dos_compatibility) {
1d7c: e35a0000 cmp sl, #0
1d80: 0a000007 beq 1da4 <rtems_bdpart_create+0xf0>
disk_end -= (disk_end % record_space);
1d84: e59d6010 ldr r6, [sp, #16]
1d88: e1a01005 mov r1, r5
1d8c: e1a00006 mov r0, r6
1d90: e58d3000 str r3, [sp]
1d94: eb007666 bl 1f734 <__umodsi3>
1d98: e0600006 rsb r0, r0, r6
1d9c: e58d0010 str r0, [sp, #16]
1da0: e59d3000 ldr r3, [sp]
/*
* In case we need an extended partition and logical partitions we have to
* account for the space of each EBR.
*/
if (count > 4) {
1da4: e3540004 cmp r4, #4
overhead += (count - 3) * record_space;
1da8: 82442003 subhi r2, r4, #3
1dac: 80225295 mlahi r2, r5, r2, r5
/*
* We need at least space for the MBR and the compatibility space for the
* first primary partition.
*/
overhead += record_space;
1db0: 91a02005 movls r2, r5
/*
* Account space to align every partition on cylinder boundaries if
* necessary.
*/
if (dos_compatibility) {
1db4: e35a0000 cmp sl, #0
overhead += (count - 1) * record_space;
1db8: 12441001 subne r1, r4, #1
1dbc: 10222591 mlane r2, r1, r5, r2
}
/* Check disk space */
if ((overhead + count) > disk_end) {
1dc0: e59d9010 ldr r9, [sp, #16]
1dc4: e0821004 add r1, r2, r4
1dc8: e1510009 cmp r1, r9
return RTEMS_IO_ERROR;
1dcc: 83a0701b movhi r7, #27
if (dos_compatibility) {
overhead += (count - 1) * record_space;
}
/* Check disk space */
if ((overhead + count) > disk_end) {
1dd0: 8a00002e bhi 1e90 <rtems_bdpart_create+0x1dc>
/* Begin of first primary partition */
pos = record_space;
/* Space for partitions */
free_space = disk_end - overhead;
1dd4: e0622009 rsb r2, r2, r9
1dd8: e59da004 ldr sl, [sp, #4]
for (i = 0; i < count; ++i) {
1ddc: e58d900c str r9, [sp, #12]
if ((overhead + count) > disk_end) {
return RTEMS_IO_ERROR;
}
/* Begin of first primary partition */
pos = record_space;
1de0: e1a06005 mov r6, r5
/* Space for partitions */
free_space = disk_end - overhead;
for (i = 0; i < count; ++i) {
1de4: e3a08000 mov r8, #0
1de8: e1a0c007 mov ip, r7
1dec: e1a09002 mov r9, r2
1df0: e1a0b003 mov fp, r3
rtems_bdpart_partition *p = pt + i;
/* Partition size */
rtems_blkdev_bnum s = free_space * dist [i];
1df4: e49b1004 ldr r1, [fp], #4
1df8: e0000199 mul r0, r9, r1
if (s < free_space || s < dist [i]) {
1dfc: e1500009 cmp r0, r9
1e00: 3a000021 bcc 1e8c <rtems_bdpart_create+0x1d8>
1e04: e1500001 cmp r0, r1
1e08: 3a00001f bcc 1e8c <rtems_bdpart_create+0x1d8>
/* TODO: Calculate without overflow */
return RTEMS_INVALID_NUMBER;
}
s /= dist_sum;
1e0c: e59d1008 ldr r1, [sp, #8]
1e10: e58dc000 str ip, [sp]
1e14: eb007600 bl 1f61c <__aeabi_uidiv>
/* Ensure that the partition is not empty */
if (s == 0) {
s = 1;
1e18: e3500000 cmp r0, #0
1e1c: 11a07000 movne r7, r0
1e20: 03a07001 moveq r7, #1
}
/* Align partition upwards */
s += record_space - (s % record_space);
1e24: e1a00007 mov r0, r7
1e28: e1a01005 mov r1, r5
1e2c: eb007640 bl 1f734 <__umodsi3>
1e30: e0877005 add r7, r7, r5
/* Reserve space for the EBR if necessary */
if (count > 4 && i > 2) {
1e34: e3580002 cmp r8, #2
1e38: 83540004 cmphi r4, #4
pos += record_space;
1e3c: 80866005 addhi r6, r6, r5
if (s == 0) {
s = 1;
}
/* Align partition upwards */
s += record_space - (s % record_space);
1e40: e0607007 rsb r7, r0, r7
pos = record_space;
/* Space for partitions */
free_space = disk_end - overhead;
for (i = 0; i < count; ++i) {
1e44: e2888001 add r8, r8, #1
/* Align partition upwards */
s += record_space - (s % record_space);
/* Reserve space for the EBR if necessary */
if (count > 4 && i > 2) {
1e48: e59dc000 ldr ip, [sp]
pos = record_space;
/* Space for partitions */
free_space = disk_end - overhead;
for (i = 0; i < count; ++i) {
1e4c: e1580004 cmp r8, r4
if (count > 4 && i > 2) {
pos += record_space;
}
/* Partition begin and end */
p->begin = pos;
1e50: e58a6000 str r6, [sl]
pos += s;
1e54: e0866007 add r6, r6, r7
p->end = pos;
1e58: e58a6004 str r6, [sl, #4]
pos = record_space;
/* Space for partitions */
free_space = disk_end - overhead;
for (i = 0; i < count; ++i) {
1e5c: e28aa030 add sl, sl, #48 ; 0x30
1e60: 1affffe3 bne 1df4 <rtems_bdpart_create+0x140>
pos += s;
p->end = pos;
}
/* Expand the last partition to the disk end */
pt [count - 1].end = disk_end;
1e64: e59d2004 ldr r2, [sp, #4]
1e68: e2488001 sub r8, r8, #1
1e6c: e3a03030 mov r3, #48 ; 0x30
1e70: e0282893 mla r8, r3, r8, r2
1e74: e59d900c ldr r9, [sp, #12]
1e78: e1a0700c mov r7, ip
1e7c: e5889004 str r9, [r8, #4]
return RTEMS_SUCCESSFUL;
1e80: ea000002 b 1e90 <rtems_bdpart_create+0x1dc>
return RTEMS_SUCCESSFUL;
}
/* Check parameter */
if (format == NULL || pt == NULL || dist == NULL) {
return RTEMS_INVALID_ADDRESS;
1e84: e3a07009 mov r7, #9 <== NOT EXECUTED
1e88: ea000000 b 1e90 <rtems_bdpart_create+0x1dc> <== NOT EXECUTED
/* Partition size */
rtems_blkdev_bnum s = free_space * dist [i];
if (s < free_space || s < dist [i]) {
/* TODO: Calculate without overflow */
return RTEMS_INVALID_NUMBER;
1e8c: e3a0700a mov r7, #10 <== NOT EXECUTED
/* Expand the last partition to the disk end */
pt [count - 1].end = disk_end;
return RTEMS_SUCCESSFUL;
}
1e90: e1a00007 mov r0, r7
1e94: e28dd014 add sp, sp, #20
1e98: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00001e9c <rtems_bdpart_dump>:
{
uuid_unparse_lower( type, str);
}
void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
{
1e9c: e92d40f0 push {r4, r5, r6, r7, lr}
1ea0: e1a04000 mov r4, r0
1ea4: e24dd038 sub sp, sp, #56 ; 0x38
size_t i = 0;
printf(
1ea8: e59f00d4 ldr r0, [pc, #212] ; 1f84 <bsp_section_rodata_size+0xc0>
{
uuid_unparse_lower( type, str);
}
void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
{
1eac: e1a06001 mov r6, r1
"------------+------------+-----------------------------------------------------\n"
" BEGIN | END | TYPE\n"
"------------+------------+-----------------------------------------------------\n"
);
for (i = 0; i < count; ++i) {
1eb0: e3a05000 mov r5, #0
void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
{
size_t i = 0;
printf(
1eb4: eb004577 bl 13498 <puts>
"------------+------------+-----------------------------------------------------\n"
" BEGIN | END | TYPE\n"
"------------+------------+-----------------------------------------------------\n"
);
for (i = 0; i < count; ++i) {
1eb8: ea00002b b 1f6c <bsp_section_rodata_size+0xa8>
const rtems_bdpart_partition *p = pt + i;
const char *type = NULL;
char type_buffer [52];
uint8_t type_mbr = 0;
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
1ebc: e2847008 add r7, r4, #8
for (i = 0; i < count; ++i) {
const rtems_bdpart_partition *p = pt + i;
const char *type = NULL;
char type_buffer [52];
uint8_t type_mbr = 0;
1ec0: e3a03000 mov r3, #0
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
1ec4: e1a00007 mov r0, r7
1ec8: e28d1037 add r1, sp, #55 ; 0x37
for (i = 0; i < count; ++i) {
const rtems_bdpart_partition *p = pt + i;
const char *type = NULL;
char type_buffer [52];
uint8_t type_mbr = 0;
1ecc: e5cd3037 strb r3, [sp, #55] ; 0x37
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
1ed0: eb000094 bl 2128 <rtems_bdpart_to_mbr_partition_type>
1ed4: e3500000 cmp r0, #0
1ed8: 0a000018 beq 1f40 <bsp_section_rodata_size+0x7c>
switch (type_mbr) {
1edc: e5dd3037 ldrb r3, [sp, #55] ; 0x37
1ee0: e353000b cmp r3, #11
break;
case RTEMS_BDPART_MBR_FAT_16_LBA:
type = "FAT 16 LBA";
break;
case RTEMS_BDPART_MBR_FAT_32:
type = "FAT 32";
1ee4: 059f309c ldreq r3, [pc, #156] ; 1f88 <bsp_section_rodata_size+0xc4>
const char *type = NULL;
char type_buffer [52];
uint8_t type_mbr = 0;
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
switch (type_mbr) {
1ee8: 0a00001a beq 1f58 <bsp_section_rodata_size+0x94>
1eec: 8a000005 bhi 1f08 <bsp_section_rodata_size+0x44> <== NOT EXECUTED
1ef0: e3530001 cmp r3, #1 <== NOT EXECUTED
case RTEMS_BDPART_MBR_FAT_12:
type = "FAT 12";
1ef4: 059f3090 ldreq r3, [pc, #144] ; 1f8c <bsp_section_rodata_size+0xc8><== NOT EXECUTED
const char *type = NULL;
char type_buffer [52];
uint8_t type_mbr = 0;
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
switch (type_mbr) {
1ef8: 0a000016 beq 1f58 <bsp_section_rodata_size+0x94> <== NOT EXECUTED
1efc: e3530004 cmp r3, #4 <== NOT EXECUTED
1f00: 1a000009 bne 1f2c <bsp_section_rodata_size+0x68> <== NOT EXECUTED
1f04: ea000012 b 1f54 <bsp_section_rodata_size+0x90> <== NOT EXECUTED
1f08: e353000e cmp r3, #14 <== NOT EXECUTED
break;
case RTEMS_BDPART_MBR_FAT_16:
type = "FAT 16";
break;
case RTEMS_BDPART_MBR_FAT_16_LBA:
type = "FAT 16 LBA";
1f0c: 059f307c ldreq r3, [pc, #124] ; 1f90 <bsp_section_rodata_size+0xcc><== NOT EXECUTED
const char *type = NULL;
char type_buffer [52];
uint8_t type_mbr = 0;
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
switch (type_mbr) {
1f10: 0a000010 beq 1f58 <bsp_section_rodata_size+0x94> <== NOT EXECUTED
1f14: e35300da cmp r3, #218 ; 0xda <== NOT EXECUTED
break;
case RTEMS_BDPART_MBR_FAT_32_LBA:
type = "FAT 32 LBA";
break;
case RTEMS_BDPART_MBR_DATA:
type = "DATA";
1f18: 059f3074 ldreq r3, [pc, #116] ; 1f94 <bsp_section_rodata_size+0xd0><== NOT EXECUTED
const char *type = NULL;
char type_buffer [52];
uint8_t type_mbr = 0;
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
switch (type_mbr) {
1f1c: 0a00000d beq 1f58 <bsp_section_rodata_size+0x94> <== NOT EXECUTED
1f20: e353000c cmp r3, #12 <== NOT EXECUTED
break;
case RTEMS_BDPART_MBR_FAT_32:
type = "FAT 32";
break;
case RTEMS_BDPART_MBR_FAT_32_LBA:
type = "FAT 32 LBA";
1f24: 059f306c ldreq r3, [pc, #108] ; 1f98 <bsp_section_rodata_size+0xd4><== NOT EXECUTED
break;
1f28: 0a00000a beq 1f58 <bsp_section_rodata_size+0x94> <== NOT EXECUTED
case RTEMS_BDPART_MBR_DATA:
type = "DATA";
break;
default:
snprintf( type_buffer, sizeof( type_buffer), "0x%02" PRIx8, type_mbr);
1f2c: e1a0000d mov r0, sp <== NOT EXECUTED
1f30: e3a01034 mov r1, #52 ; 0x34 <== NOT EXECUTED
1f34: e59f2060 ldr r2, [pc, #96] ; 1f9c <bsp_section_rodata_size+0xd8><== NOT EXECUTED
1f38: eb0045f4 bl 13710 <snprintf> <== NOT EXECUTED
1f3c: ea000002 b 1f4c <bsp_section_rodata_size+0x88> <== NOT EXECUTED
static void rtems_bdpart_type_to_string(
const uuid_t type,
char str [37]
)
{
uuid_unparse_lower( type, str);
1f40: e1a00007 mov r0, r7 <== NOT EXECUTED
1f44: e1a0100d mov r1, sp <== NOT EXECUTED
1f48: eb002866 bl c0e8 <uuid_unparse_lower> <== NOT EXECUTED
type = type_buffer;
break;
}
} else {
rtems_bdpart_type_to_string( p->type, type_buffer);
type = type_buffer;
1f4c: e1a0300d mov r3, sp <== NOT EXECUTED
1f50: ea000000 b 1f58 <bsp_section_rodata_size+0x94> <== NOT EXECUTED
switch (type_mbr) {
case RTEMS_BDPART_MBR_FAT_12:
type = "FAT 12";
break;
case RTEMS_BDPART_MBR_FAT_16:
type = "FAT 16";
1f54: e59f3044 ldr r3, [pc, #68] ; 1fa0 <bsp_section_rodata_size+0xdc><== NOT EXECUTED
} else {
rtems_bdpart_type_to_string( p->type, type_buffer);
type = type_buffer;
}
printf(
1f58: e8940006 ldm r4, {r1, r2}
1f5c: e59f0040 ldr r0, [pc, #64] ; 1fa4 <bsp_section_rodata_size+0xe0>
1f60: eb004515 bl 133bc <printf>
"------------+------------+-----------------------------------------------------\n"
" BEGIN | END | TYPE\n"
"------------+------------+-----------------------------------------------------\n"
);
for (i = 0; i < count; ++i) {
1f64: e2855001 add r5, r5, #1
1f68: e2844030 add r4, r4, #48 ; 0x30
1f6c: e1550006 cmp r5, r6
1f70: 1affffd1 bne 1ebc <rtems_bdpart_dump+0x20>
p->end,
type
);
}
puts( "------------+------------+-----------------------------------------------------");
1f74: e59f002c ldr r0, [pc, #44] ; 1fa8 <bsp_section_rodata_size+0xe4>
1f78: eb004546 bl 13498 <puts>
}
1f7c: e28dd038 add sp, sp, #56 ; 0x38
1f80: e8bd80f0 pop {r4, r5, r6, r7, pc}
00002150 <rtems_bdpart_get_disk_data>:
const char *disk_name,
int *fd_ptr,
rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *disk_end
)
{
2150: e92d40f1 push {r0, r4, r5, r6, r7, lr}
2154: e1a05001 mov r5, r1
2158: e1a07003 mov r7, r3
rtems_disk_device *dd = NULL;
rtems_blkdev_bnum disk_begin = 0;
rtems_blkdev_bnum block_size = 0;
/* Open device file */
fd = open( disk_name, O_RDWR);
215c: e3a01002 mov r1, #2
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
int rv = 0;
int fd = -1;
rtems_disk_device *dd = NULL;
2160: e3a03000 mov r3, #0
const char *disk_name,
int *fd_ptr,
rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *disk_end
)
{
2164: e1a04002 mov r4, r2
rtems_status_code sc = RTEMS_SUCCESSFUL;
int rv = 0;
int fd = -1;
rtems_disk_device *dd = NULL;
2168: e58d3000 str r3, [sp]
rtems_blkdev_bnum disk_begin = 0;
rtems_blkdev_bnum block_size = 0;
/* Open device file */
fd = open( disk_name, O_RDWR);
216c: eb000c34 bl 5244 <open>
if (fd < 0) {
2170: e2506000 subs r6, r0, #0
2174: ba000010 blt 21bc <rtems_bdpart_get_disk_data+0x6c>
static inline int rtems_disk_fd_get_disk_device(
int fd,
rtems_disk_device **dd_ptr
)
{
return ioctl(fd, RTEMS_BLKIO_GETDISKDEV, dd_ptr);
2178: e59f107c ldr r1, [pc, #124] ; 21fc <rtems_bdpart_get_disk_data+0xac>
217c: e1a0200d mov r2, sp
2180: eb00091c bl 45f8 <ioctl>
goto error;
}
/* Get disk handle */
rv = rtems_disk_fd_get_disk_device( fd, &dd);
if (rv != 0) {
2184: e3500000 cmp r0, #0
2188: 1a00000b bne 21bc <rtems_bdpart_get_disk_data+0x6c>
sc = RTEMS_INVALID_NAME;
goto error;
}
/* Get disk begin, end and block size */
disk_begin = dd->start;
218c: e59d3000 ldr r3, [sp]
*disk_end = dd->size;
2190: e593101c ldr r1, [r3, #28]
sc = RTEMS_INVALID_NAME;
goto error;
}
/* Get disk begin, end and block size */
disk_begin = dd->start;
2194: e5932018 ldr r2, [r3, #24]
*disk_end = dd->size;
2198: e5871000 str r1, [r7]
block_size = dd->block_size;
/* Check block size */
if (block_size < RTEMS_BDPART_BLOCK_SIZE) {
219c: e5933024 ldr r3, [r3, #36] ; 0x24
21a0: e3530c02 cmp r3, #512 ; 0x200
sc = RTEMS_IO_ERROR;
21a4: 33a0701b movcc r7, #27
disk_begin = dd->start;
*disk_end = dd->size;
block_size = dd->block_size;
/* Check block size */
if (block_size < RTEMS_BDPART_BLOCK_SIZE) {
21a8: 3a000004 bcc 21c0 <rtems_bdpart_get_disk_data+0x70>
int *fd_ptr,
rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *disk_end
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
21ac: e3520000 cmp r2, #0
21b0: 13a0701b movne r7, #27
21b4: 03a07000 moveq r7, #0
21b8: ea000000 b 21c0 <rtems_bdpart_get_disk_data+0x70>
}
/* Get disk handle */
rv = rtems_disk_fd_get_disk_device( fd, &dd);
if (rv != 0) {
sc = RTEMS_INVALID_NAME;
21bc: e3a07003 mov r7, #3 <== NOT EXECUTED
goto error;
}
error:
if (sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL) {
21c0: e2773001 rsbs r3, r7, #1
21c4: 33a03000 movcc r3, #0
21c8: e3550000 cmp r5, #0
21cc: 03a03000 moveq r3, #0
21d0: e3530000 cmp r3, #0
21d4: 0a000004 beq 21ec <rtems_bdpart_get_disk_data+0x9c>
21d8: e3540000 cmp r4, #0
*fd_ptr = fd;
*dd_ptr = dd;
21dc: 159d3000 ldrne r3, [sp]
}
error:
if (sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL) {
*fd_ptr = fd;
21e0: 15856000 strne r6, [r5]
*dd_ptr = dd;
21e4: 15843000 strne r3, [r4]
goto error;
}
error:
if (sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL) {
21e8: 1a000001 bne 21f4 <rtems_bdpart_get_disk_data+0xa4>
*fd_ptr = fd;
*dd_ptr = dd;
} else {
close( fd);
21ec: e1a00006 mov r0, r6
21f0: eb0007ed bl 41ac <close>
}
return sc;
}
21f4: e1a00007 mov r0, r7
21f8: e8bd80f8 pop {r3, r4, r5, r6, r7, pc}
0001dfc8 <rtems_bdpart_mount>:
const char *disk_name,
const rtems_bdpart_partition *pt __attribute__((unused)),
size_t count,
const char *mount_base
)
{
1dfc8: e92d4ff3 push {r0, r1, r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
rtems_status_code esc = RTEMS_SUCCESSFUL;
const char *disk_file_name = strrchr( disk_name, '/');
1dfcc: e3a0102f mov r1, #47 ; 0x2f <== NOT EXECUTED
const char *disk_name,
const rtems_bdpart_partition *pt __attribute__((unused)),
size_t count,
const char *mount_base
)
{
1dfd0: e1a0b003 mov fp, r3 <== NOT EXECUTED
1dfd4: e58d2004 str r2, [sp, #4] <== NOT EXECUTED
1dfd8: e1a04000 mov r4, r0 <== NOT EXECUTED
rtems_status_code esc = RTEMS_SUCCESSFUL;
const char *disk_file_name = strrchr( disk_name, '/');
1dfdc: eb006dcf bl 39720 <strrchr> <== NOT EXECUTED
1dfe0: e1a0a000 mov sl, r0 <== NOT EXECUTED
char *logical_disk_name = NULL;
char *logical_disk_marker = NULL;
char *mount_point = NULL;
char *mount_marker = NULL;
size_t disk_file_name_size = 0;
size_t disk_name_size = strlen( disk_name);
1dfe4: e1a00004 mov r0, r4 <== NOT EXECUTED
1dfe8: eb0069ae bl 386a8 <strlen> <== NOT EXECUTED
1dfec: e1a06000 mov r6, r0 <== NOT EXECUTED
size_t mount_base_size = strlen( mount_base);
1dff0: e1a0000b mov r0, fp <== NOT EXECUTED
1dff4: eb0069ab bl 386a8 <strlen> <== NOT EXECUTED
1dff8: e1a07000 mov r7, r0 <== NOT EXECUTED
size_t i = 0;
/* Create logical disk name base */
logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
1dffc: e2860004 add r0, r6, #4 <== NOT EXECUTED
1e000: ebff93ba bl 2ef0 <malloc> <== NOT EXECUTED
if (logical_disk_name == NULL) {
1e004: e2505000 subs r5, r0, #0 <== NOT EXECUTED
return RTEMS_NO_MEMORY;
1e008: 03a0601a moveq r6, #26 <== NOT EXECUTED
size_t mount_base_size = strlen( mount_base);
size_t i = 0;
/* Create logical disk name base */
logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
if (logical_disk_name == NULL) {
1e00c: 0a000044 beq 1e124 <rtems_bdpart_mount+0x15c> <== NOT EXECUTED
return RTEMS_NO_MEMORY;
}
strncpy( logical_disk_name, disk_name, disk_name_size);
1e010: e1a01004 mov r1, r4 <== NOT EXECUTED
1e014: e1a02006 mov r2, r6 <== NOT EXECUTED
1e018: eb006a44 bl 38930 <strncpy> <== NOT EXECUTED
/* Get disk file name */
if (disk_file_name != NULL) {
1e01c: e35a0000 cmp sl, #0 <== NOT EXECUTED
disk_file_name += 1;
disk_file_name_size = strlen( disk_file_name);
} else {
disk_file_name = disk_name;
disk_file_name_size = disk_name_size;
1e020: 01a08006 moveq r8, r6 <== NOT EXECUTED
/* Get disk file name */
if (disk_file_name != NULL) {
disk_file_name += 1;
disk_file_name_size = strlen( disk_file_name);
} else {
disk_file_name = disk_name;
1e024: 01a0a004 moveq sl, r4 <== NOT EXECUTED
return RTEMS_NO_MEMORY;
}
strncpy( logical_disk_name, disk_name, disk_name_size);
/* Get disk file name */
if (disk_file_name != NULL) {
1e028: 0a000003 beq 1e03c <rtems_bdpart_mount+0x74> <== NOT EXECUTED
disk_file_name += 1;
1e02c: e28aa001 add sl, sl, #1 <== NOT EXECUTED
disk_file_name_size = strlen( disk_file_name);
1e030: e1a0000a mov r0, sl <== NOT EXECUTED
1e034: eb00699b bl 386a8 <strlen> <== NOT EXECUTED
1e038: e1a08000 mov r8, r0 <== NOT EXECUTED
disk_file_name = disk_name;
disk_file_name_size = disk_name_size;
}
/* Create mount point base */
mount_point = malloc( mount_base_size + 1 + disk_file_name_size + RTEMS_BDPART_NUMBER_SIZE);
1e03c: e0889007 add r9, r8, r7 <== NOT EXECUTED
1e040: e2890005 add r0, r9, #5 <== NOT EXECUTED
1e044: ebff93a9 bl 2ef0 <malloc> <== NOT EXECUTED
if (mount_point == NULL) {
1e048: e2504000 subs r4, r0, #0 <== NOT EXECUTED
esc = RTEMS_NO_MEMORY;
1e04c: 03a0601a moveq r6, #26 <== NOT EXECUTED
disk_file_name_size = disk_name_size;
}
/* Create mount point base */
mount_point = malloc( mount_base_size + 1 + disk_file_name_size + RTEMS_BDPART_NUMBER_SIZE);
if (mount_point == NULL) {
1e050: 0a00002f beq 1e114 <rtems_bdpart_mount+0x14c> <== NOT EXECUTED
esc = RTEMS_NO_MEMORY;
goto cleanup;
}
strncpy( mount_point, mount_base, mount_base_size);
1e054: e1a02007 mov r2, r7 <== NOT EXECUTED
1e058: e1a0100b mov r1, fp <== NOT EXECUTED
1e05c: eb006a33 bl 38930 <strncpy> <== NOT EXECUTED
mount_point [mount_base_size] = '/';
1e060: e3a0302f mov r3, #47 ; 0x2f <== NOT EXECUTED
strncpy( mount_point + mount_base_size + 1, disk_file_name, disk_file_name_size);
1e064: e2870001 add r0, r7, #1 <== NOT EXECUTED
if (mount_point == NULL) {
esc = RTEMS_NO_MEMORY;
goto cleanup;
}
strncpy( mount_point, mount_base, mount_base_size);
mount_point [mount_base_size] = '/';
1e068: e7c43007 strb r3, [r4, r7] <== NOT EXECUTED
strncpy( mount_point + mount_base_size + 1, disk_file_name, disk_file_name_size);
1e06c: e0840000 add r0, r4, r0 <== NOT EXECUTED
1e070: e1a0100a mov r1, sl <== NOT EXECUTED
1e074: e1a02008 mov r2, r8 <== NOT EXECUTED
/* Markers */
logical_disk_marker = logical_disk_name + disk_name_size;
mount_marker = mount_point + mount_base_size + 1 + disk_file_name_size;
1e078: e2899001 add r9, r9, #1 <== NOT EXECUTED
esc = RTEMS_NO_MEMORY;
goto cleanup;
}
strncpy( mount_point, mount_base, mount_base_size);
mount_point [mount_base_size] = '/';
strncpy( mount_point + mount_base_size + 1, disk_file_name, disk_file_name_size);
1e07c: eb006a2b bl 38930 <strncpy> <== NOT EXECUTED
/* Markers */
logical_disk_marker = logical_disk_name + disk_name_size;
1e080: e0856006 add r6, r5, r6 <== NOT EXECUTED
mount_marker = mount_point + mount_base_size + 1 + disk_file_name_size;
1e084: e0849009 add r9, r4, r9 <== NOT EXECUTED
/* Mount supported file systems for each partition */
for (i = 0; i < count; ++i) {
1e088: e3a07000 mov r7, #0 <== NOT EXECUTED
1e08c: ea000018 b 1e0f4 <rtems_bdpart_mount+0x12c> <== NOT EXECUTED
/* Create logical disk name */
int rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
1e090: e2877001 add r7, r7, #1 <== NOT EXECUTED
1e094: e1a00006 mov r0, r6 <== NOT EXECUTED
1e098: e3a01004 mov r1, #4 <== NOT EXECUTED
1e09c: e59f2088 ldr r2, [pc, #136] ; 1e12c <rtems_bdpart_mount+0x164><== NOT EXECUTED
1e0a0: e1a03007 mov r3, r7 <== NOT EXECUTED
1e0a4: eb006574 bl 3767c <snprintf> <== NOT EXECUTED
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
1e0a8: e3500003 cmp r0, #3 <== NOT EXECUTED
1e0ac: ca000015 bgt 1e108 <rtems_bdpart_mount+0x140> <== NOT EXECUTED
esc = RTEMS_INVALID_NAME;
goto cleanup;
}
/* Create mount point */
strncpy( mount_marker, logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE);
1e0b0: e1a01006 mov r1, r6 <== NOT EXECUTED
1e0b4: e3a02004 mov r2, #4 <== NOT EXECUTED
1e0b8: e1a00009 mov r0, r9 <== NOT EXECUTED
1e0bc: eb006a1b bl 38930 <strncpy> <== NOT EXECUTED
rv = rtems_mkdir( mount_point, S_IRWXU | S_IRWXG | S_IRWXO);
1e0c0: e1a00004 mov r0, r4 <== NOT EXECUTED
1e0c4: e59f1064 ldr r1, [pc, #100] ; 1e130 <rtems_bdpart_mount+0x168><== NOT EXECUTED
1e0c8: eb000daf bl 2178c <rtems_mkdir> <== NOT EXECUTED
if (rv != 0) {
1e0cc: e2503000 subs r3, r0, #0 <== NOT EXECUTED
1e0d0: 1a00000e bne 1e110 <rtems_bdpart_mount+0x148> <== NOT EXECUTED
esc = RTEMS_IO_ERROR;
goto cleanup;
}
/* Mount */
rv = mount(
1e0d4: e1a00005 mov r0, r5 <== NOT EXECUTED
1e0d8: e1a01004 mov r1, r4 <== NOT EXECUTED
1e0dc: e59f2050 ldr r2, [pc, #80] ; 1e134 <rtems_bdpart_mount+0x16c><== NOT EXECUTED
1e0e0: e58d3000 str r3, [sp] <== NOT EXECUTED
1e0e4: ebff93fb bl 30d8 <mount> <== NOT EXECUTED
mount_point,
"msdos",
0,
NULL
);
if (rv != 0) {
1e0e8: e3500000 cmp r0, #0 <== NOT EXECUTED
rmdir( mount_point);
1e0ec: 11a00004 movne r0, r4 <== NOT EXECUTED
1e0f0: 1b000d7a blne 216e0 <rmdir> <== NOT EXECUTED
/* Markers */
logical_disk_marker = logical_disk_name + disk_name_size;
mount_marker = mount_point + mount_base_size + 1 + disk_file_name_size;
/* Mount supported file systems for each partition */
for (i = 0; i < count; ++i) {
1e0f4: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
1e0f8: e1570003 cmp r7, r3 <== NOT EXECUTED
1e0fc: 1affffe3 bne 1e090 <rtems_bdpart_mount+0xc8> <== NOT EXECUTED
const rtems_bdpart_partition *pt __attribute__((unused)),
size_t count,
const char *mount_base
)
{
rtems_status_code esc = RTEMS_SUCCESSFUL;
1e100: e3a06000 mov r6, #0 <== NOT EXECUTED
1e104: ea000002 b 1e114 <rtems_bdpart_mount+0x14c> <== NOT EXECUTED
/* Mount supported file systems for each partition */
for (i = 0; i < count; ++i) {
/* Create logical disk name */
int rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
esc = RTEMS_INVALID_NAME;
1e108: e3a06003 mov r6, #3 <== NOT EXECUTED
1e10c: ea000000 b 1e114 <rtems_bdpart_mount+0x14c> <== NOT EXECUTED
/* Create mount point */
strncpy( mount_marker, logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE);
rv = rtems_mkdir( mount_point, S_IRWXU | S_IRWXG | S_IRWXO);
if (rv != 0) {
esc = RTEMS_IO_ERROR;
1e110: e3a0601b mov r6, #27 <== NOT EXECUTED
}
}
cleanup:
free( logical_disk_name);
1e114: e1a00005 mov r0, r5 <== NOT EXECUTED
1e118: ebff92af bl 2bdc <free> <== NOT EXECUTED
free( mount_point);
1e11c: e1a00004 mov r0, r4 <== NOT EXECUTED
1e120: ebff92ad bl 2bdc <free> <== NOT EXECUTED
return esc;
}
1e124: e1a00006 mov r0, r6 <== NOT EXECUTED
1e128: e8bd8ffc pop {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
00002200 <rtems_bdpart_read>:
const char *disk_name,
rtems_bdpart_format *format,
rtems_bdpart_partition *pt,
size_t *count
)
{
2200: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
rtems_bdpart_partition *p = pt - 1;
const rtems_bdpart_partition *p_end = pt + (count != NULL ? *count : 0);
2204: e2534000 subs r4, r3, #0
2208: 15943000 ldrne r3, [r4]
const char *disk_name,
rtems_bdpart_format *format,
rtems_bdpart_partition *pt,
size_t *count
)
{
220c: e1a05002 mov r5, r2
2210: e1a06001 mov r6, r1
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
rtems_bdpart_partition *p = pt - 1;
const rtems_bdpart_partition *p_end = pt + (count != NULL ? *count : 0);
2214: 13a08030 movne r8, #48 ; 0x30
const char *disk_name,
rtems_bdpart_format *format,
rtems_bdpart_partition *pt,
size_t *count
)
{
2218: e24dd018 sub sp, sp, #24
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
221c: e3a02000 mov r2, #0
rtems_bdpart_partition *p = pt - 1;
const rtems_bdpart_partition *p_end = pt + (count != NULL ? *count : 0);
2220: 10080893 mulne r8, r3, r8
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
rtems_bdpart_partition *p = pt - 1;
2224: e2451030 sub r1, r5, #48 ; 0x30
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
rtems_blkdev_bnum disk_end = 0;
size_t i = 0;
const uint8_t *data = NULL;
int fd = -1;
2228: e3e03000 mvn r3, #0
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
rtems_bdpart_partition *p = pt - 1;
const rtems_bdpart_partition *p_end = pt + (count != NULL ? *count : 0);
222c: 01a08004 moveq r8, r4
const uint8_t *data = NULL;
int fd = -1;
rtems_disk_device *dd = NULL;
/* Check parameter */
if (format == NULL || pt == NULL || count == NULL) {
2230: e3560000 cmp r6, #0
2234: 13550000 cmpne r5, #0
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
rtems_blkdev_bnum disk_end = 0;
size_t i = 0;
const uint8_t *data = NULL;
int fd = -1;
2238: e58d3010 str r3, [sp, #16]
size_t *count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
223c: e58d2000 str r2, [sp]
rtems_bdpart_partition *p = pt - 1;
2240: e58d1004 str r1, [sp, #4]
const rtems_bdpart_partition *p_end = pt + (count != NULL ? *count : 0);
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
2244: e58d2008 str r2, [sp, #8]
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
rtems_blkdev_bnum disk_end = 0;
2248: e58d200c str r2, [sp, #12]
size_t i = 0;
const uint8_t *data = NULL;
int fd = -1;
rtems_disk_device *dd = NULL;
224c: e58d2014 str r2, [sp, #20]
/* Check parameter */
if (format == NULL || pt == NULL || count == NULL) {
2250: 13a03000 movne r3, #0
2254: 03a03001 moveq r3, #1
2258: 0a000077 beq 243c <rtems_bdpart_read+0x23c>
225c: e3540000 cmp r4, #0
2260: 0a000075 beq 243c <rtems_bdpart_read+0x23c>
return RTEMS_INVALID_ADDRESS;
}
/* Set count to a save value */
*count = 0;
2264: e5843000 str r3, [r4]
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
2268: e28d1010 add r1, sp, #16
226c: e28d2014 add r2, sp, #20
2270: e28d300c add r3, sp, #12
2274: ebffffb5 bl 2150 <rtems_bdpart_get_disk_data>
if (sc != RTEMS_SUCCESSFUL) {
2278: e2501000 subs r1, r0, #0
227c: 1a000071 bne 2448 <rtems_bdpart_read+0x248>
return sc;
}
/* Read MBR */
sc = rtems_bdpart_read_record( dd, 0, &block);
2280: e59d0014 ldr r0, [sp, #20]
2284: e1a0200d mov r2, sp
2288: ebffff4f bl 1fcc <rtems_bdpart_read_record>
if (sc != RTEMS_SUCCESSFUL) {
228c: e2503000 subs r3, r0, #0
2290: 1a00005e bne 2410 <rtems_bdpart_read+0x210>
esc = sc;
goto cleanup;
}
/* Read the first partition entry */
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
2294: e59d3000 ldr r3, [sp]
2298: e593a01c ldr sl, [r3, #28]
229c: e28a7f6f add r7, sl, #444 ; 0x1bc
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
rtems_bdpart_partition *p = pt - 1;
const rtems_bdpart_partition *p_end = pt + (count != NULL ? *count : 0);
22a0: e0858008 add r8, r5, r8
esc = sc;
goto cleanup;
}
/* Read the first partition entry */
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
22a4: e2877002 add r7, r7, #2
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin);
22a8: e28d9004 add r9, sp, #4
22ac: e28db008 add fp, sp, #8
22b0: e1a0300b mov r3, fp
22b4: e1a00007 mov r0, r7
22b8: e1a01009 mov r1, r9
22bc: e1a02008 mov r2, r8
22c0: ebffff68 bl 2068 <rtems_bdpart_read_mbr_partition>
if (sc != RTEMS_SUCCESSFUL) {
22c4: e2503000 subs r3, r0, #0
22c8: 1a000050 bne 2410 <rtems_bdpart_read+0x210>
if (block != NULL) {
rtems_bdbuf_release( block);
}
return esc;
}
22cc: e59d2004 ldr r2, [sp, #4]
esc = sc;
goto cleanup;
}
/* Determine if we have a MBR or GPT format */
if (rtems_bdpart_mbr_partition_type( p->type) == RTEMS_BDPART_MBR_GPT) {
22d0: e5d22008 ldrb r2, [r2, #8]
22d4: e35200ee cmp r2, #238 ; 0xee
esc = RTEMS_NOT_IMPLEMENTED;
22d8: 03a04018 moveq r4, #24
esc = sc;
goto cleanup;
}
/* Determine if we have a MBR or GPT format */
if (rtems_bdpart_mbr_partition_type( p->type) == RTEMS_BDPART_MBR_GPT) {
22dc: 0a00004e beq 241c <rtems_bdpart_read+0x21c>
esc = RTEMS_NOT_IMPLEMENTED;
goto cleanup;
}
/* Set format */
format->type = RTEMS_BDPART_FORMAT_MBR;
22e0: e5863000 str r3, [r6]
format->mbr.disk_id = rtems_uint32_from_little_endian(
block->buffer + RTEMS_BDPART_MBR_OFFSET_DISK_ID
22e4: e59d3000 ldr r3, [sp]
goto cleanup;
}
/* Set format */
format->type = RTEMS_BDPART_FORMAT_MBR;
format->mbr.disk_id = rtems_uint32_from_little_endian(
22e8: e593001c ldr r0, [r3, #28]
22ec: e2800f6e add r0, r0, #440 ; 0x1b8
22f0: ebffff2d bl 1fac <rtems_uint32_from_little_endian>
}
return RTEMS_SUCCESSFUL;
}
rtems_status_code rtems_bdpart_read(
22f4: e28aaf7b add sl, sl, #492 ; 0x1ec
/* Set format */
format->type = RTEMS_BDPART_FORMAT_MBR;
format->mbr.disk_id = rtems_uint32_from_little_endian(
block->buffer + RTEMS_BDPART_MBR_OFFSET_DISK_ID
);
format->mbr.dos_compatibility = true;
22f8: e3a03001 mov r3, #1
goto cleanup;
}
/* Set format */
format->type = RTEMS_BDPART_FORMAT_MBR;
format->mbr.disk_id = rtems_uint32_from_little_endian(
22fc: e5860004 str r0, [r6, #4]
block->buffer + RTEMS_BDPART_MBR_OFFSET_DISK_ID
);
format->mbr.dos_compatibility = true;
2300: e5c63008 strb r3, [r6, #8]
}
return RTEMS_SUCCESSFUL;
}
rtems_status_code rtems_bdpart_read(
2304: e28a6002 add r6, sl, #2
/* Iterate through the rest of the primary partition table */
for (i = 1; i < 4; ++i) {
data += RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE;
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin);
2308: e1a0a009 mov sl, r9
);
format->mbr.dos_compatibility = true;
/* Iterate through the rest of the primary partition table */
for (i = 1; i < 4; ++i) {
data += RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE;
230c: e2877010 add r7, r7, #16
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin);
2310: e1a0300b mov r3, fp
2314: e1a00007 mov r0, r7
2318: e1a0100a mov r1, sl
231c: e1a02008 mov r2, r8
2320: ebffff50 bl 2068 <rtems_bdpart_read_mbr_partition>
if (sc != RTEMS_SUCCESSFUL) {
2324: e2503000 subs r3, r0, #0
2328: 1a000038 bne 2410 <rtems_bdpart_read+0x210>
block->buffer + RTEMS_BDPART_MBR_OFFSET_DISK_ID
);
format->mbr.dos_compatibility = true;
/* Iterate through the rest of the primary partition table */
for (i = 1; i < 4; ++i) {
232c: e1570006 cmp r7, r6
2330: 1afffff5 bne 230c <rtems_bdpart_read+0x10c>
goto cleanup;
}
}
/* Iterate through the logical partitions within the extended partition */
ebr = ep_begin;
2334: e59d6008 ldr r6, [sp, #8]
while (ebr != 0) {
2338: ea000029 b 23e4 <rtems_bdpart_read+0x1e4>
rtems_blkdev_bnum tmp = 0;
/* Read EBR */
sc = rtems_bdpart_read_record( dd, ebr, &block);
233c: e59d0014 ldr r0, [sp, #20]
2340: e1a01006 mov r1, r6
2344: e1a0200d mov r2, sp
2348: ebffff1f bl 1fcc <rtems_bdpart_read_record>
if (sc != RTEMS_SUCCESSFUL) {
234c: e2503000 subs r3, r0, #0
2350: 1a00002e bne 2410 <rtems_bdpart_read+0x210>
goto cleanup;
}
/* Read first partition entry */
sc = rtems_bdpart_read_mbr_partition(
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0,
2354: e59d2000 ldr r2, [sp]
esc = sc;
goto cleanup;
}
/* Read first partition entry */
sc = rtems_bdpart_read_mbr_partition(
2358: e592001c ldr r0, [r2, #28]
235c: e2800f6f add r0, r0, #444 ; 0x1bc
2360: e2800002 add r0, r0, #2
2364: e1a0100a mov r1, sl
2368: e1a02008 mov r2, r8
236c: ebffff3d bl 2068 <rtems_bdpart_read_mbr_partition>
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0,
&p,
p_end,
NULL
);
if (sc != RTEMS_SUCCESSFUL) {
2370: e2503000 subs r3, r0, #0
2374: 1a000025 bne 2410 <rtems_bdpart_read+0x210>
esc = sc;
goto cleanup;
}
/* Adjust partition begin */
tmp = p->begin + ebr;
2378: e59d3004 ldr r3, [sp, #4]
237c: e5931000 ldr r1, [r3]
2380: e0862001 add r2, r6, r1
if (tmp > p->begin) {
2384: e1520001 cmp r2, r1
2388: 9a000022 bls 2418 <rtems_bdpart_read+0x218>
p->begin = tmp;
238c: e5832000 str r2, [r3]
esc = RTEMS_IO_ERROR;
goto cleanup;
}
/* Adjust partition end */
tmp = p->end + ebr;
2390: e5932004 ldr r2, [r3, #4]
2394: e0866002 add r6, r6, r2
if (tmp > p->end) {
2398: e1560002 cmp r6, r2
239c: 9a00001d bls 2418 <rtems_bdpart_read+0x218>
p->end = tmp;
23a0: e5836004 str r6, [r3, #4]
goto cleanup;
}
/* Read second partition entry for next EBR block */
ebr = rtems_bdpart_next_ebr(
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_1
23a4: e59d3000 ldr r3, [sp]
23a8: e593701c ldr r7, [r3, #28]
}
static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data)
{
rtems_blkdev_bnum begin =
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
23ac: e2870f75 add r0, r7, #468 ; 0x1d4
== RTEMS_BDPART_MBR_SIGNATURE_1;
}
static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data)
{
rtems_blkdev_bnum begin =
23b0: e2800002 add r0, r0, #2
23b4: ebfffefc bl 1fac <rtems_uint32_from_little_endian>
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
if (type == RTEMS_BDPART_MBR_EXTENDED) {
23b8: e5d731d2 ldrb r3, [r7, #466] ; 0x1d2
23bc: e3530005 cmp r3, #5
== RTEMS_BDPART_MBR_SIGNATURE_1;
}
static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data)
{
rtems_blkdev_bnum begin =
23c0: e1a06000 mov r6, r0
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
if (type == RTEMS_BDPART_MBR_EXTENDED) {
23c4: 1a000008 bne 23ec <rtems_bdpart_read+0x1ec>
/* Read second partition entry for next EBR block */
ebr = rtems_bdpart_next_ebr(
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_1
);
if (ebr != 0) {
23c8: e3500000 cmp r0, #0
23cc: 0a000006 beq 23ec <rtems_bdpart_read+0x1ec>
/* Adjust partition EBR block index */
tmp = ebr + ep_begin;
23d0: e59d3008 ldr r3, [sp, #8]
23d4: e0803003 add r3, r0, r3
if (tmp > ebr) {
23d8: e1530000 cmp r3, r0
23dc: 9a00000d bls 2418 <rtems_bdpart_read+0x218>
23e0: e1a06003 mov r6, r3
}
}
/* Iterate through the logical partitions within the extended partition */
ebr = ep_begin;
while (ebr != 0) {
23e4: e3560000 cmp r6, #0
23e8: 1affffd3 bne 233c <rtems_bdpart_read+0x13c>
}
}
}
/* Return partition count */
*count = (size_t) (p - pt + 1);
23ec: e59d3004 ldr r3, [sp, #4]
23f0: e0655003 rsb r5, r5, r3
23f4: e59f3058 ldr r3, [pc, #88] ; 2454 <rtems_bdpart_read+0x254>
23f8: e1a05245 asr r5, r5, #4
23fc: e0050593 mul r5, r3, r5
2400: e2855001 add r5, r5, #1
2404: e5845000 str r5, [r4]
rtems_bdpart_partition *pt,
size_t *count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
2408: e3a04000 mov r4, #0
240c: ea000002 b 241c <rtems_bdpart_read+0x21c>
esc = sc;
goto cleanup;
}
/* Read first partition entry */
sc = rtems_bdpart_read_mbr_partition(
2410: e1a04003 mov r4, r3 <== NOT EXECUTED
2414: ea000000 b 241c <rtems_bdpart_read+0x21c> <== NOT EXECUTED
/* Adjust partition EBR block index */
tmp = ebr + ep_begin;
if (tmp > ebr) {
ebr = tmp;
} else {
esc = RTEMS_IO_ERROR;
2418: e3a0401b mov r4, #27 <== NOT EXECUTED
/* Return partition count */
*count = (size_t) (p - pt + 1);
cleanup:
if (fd >= 0) {
241c: e59d0010 ldr r0, [sp, #16]
2420: e3500000 cmp r0, #0
close( fd);
2424: ab000760 blge 41ac <close>
}
if (block != NULL) {
2428: e59d0000 ldr r0, [sp]
242c: e3500000 cmp r0, #0
2430: 0a000003 beq 2444 <rtems_bdpart_read+0x244>
rtems_bdbuf_release( block);
2434: eb002ecf bl df78 <rtems_bdbuf_release>
2438: ea000001 b 2444 <rtems_bdpart_read+0x244>
int fd = -1;
rtems_disk_device *dd = NULL;
/* Check parameter */
if (format == NULL || pt == NULL || count == NULL) {
return RTEMS_INVALID_ADDRESS;
243c: e3a01009 mov r1, #9 <== NOT EXECUTED
2440: ea000000 b 2448 <rtems_bdpart_read+0x248> <== NOT EXECUTED
if (block != NULL) {
rtems_bdbuf_release( block);
}
return esc;
2444: e1a01004 mov r1, r4
}
2448: e1a00001 mov r0, r1
244c: e28dd018 add sp, sp, #24
2450: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00002068 <rtems_bdpart_read_mbr_partition>:
const uint8_t *data,
rtems_bdpart_partition **p,
const rtems_bdpart_partition *p_end,
rtems_blkdev_bnum *ep_begin
)
{
2068: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
206c: e1a04000 mov r4, r0
rtems_blkdev_bnum begin =
2070: e2800008 add r0, r0, #8
const uint8_t *data,
rtems_bdpart_partition **p,
const rtems_bdpart_partition *p_end,
rtems_blkdev_bnum *ep_begin
)
{
2074: e1a05001 mov r5, r1
2078: e1a0a002 mov sl, r2
207c: e1a09003 mov r9, r3
rtems_blkdev_bnum begin =
2080: ebffffc9 bl 1fac <rtems_uint32_from_little_endian>
2084: e1a07000 mov r7, r0
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
rtems_blkdev_bnum size =
2088: e284000c add r0, r4, #12
208c: ebffffc6 bl 1fac <rtems_uint32_from_little_endian>
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_SIZE);
rtems_blkdev_bnum end = begin + size;
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
2090: e5d46004 ldrb r6, [r4, #4]
if (type == RTEMS_BDPART_MBR_EMPTY) {
2094: e3560000 cmp r6, #0
return RTEMS_SUCCESSFUL;
2098: 01a00006 moveq r0, r6
rtems_blkdev_bnum size =
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_SIZE);
rtems_blkdev_bnum end = begin + size;
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
if (type == RTEMS_BDPART_MBR_EMPTY) {
209c: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc}
return RTEMS_SUCCESSFUL;
} else if (*p == p_end) {
20a0: e5953000 ldr r3, [r5]
20a4: e153000a cmp r3, sl
return RTEMS_TOO_MANY;
20a8: 03a00005 moveq r0, #5
rtems_blkdev_bnum end = begin + size;
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
if (type == RTEMS_BDPART_MBR_EMPTY) {
return RTEMS_SUCCESSFUL;
} else if (*p == p_end) {
20ac: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc}
{
rtems_blkdev_bnum begin =
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
rtems_blkdev_bnum size =
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_SIZE);
rtems_blkdev_bnum end = begin + size;
20b0: e0808007 add r8, r0, r7
if (type == RTEMS_BDPART_MBR_EMPTY) {
return RTEMS_SUCCESSFUL;
} else if (*p == p_end) {
return RTEMS_TOO_MANY;
} else if (begin >= end) {
20b4: e1570008 cmp r7, r8
return RTEMS_IO_ERROR;
20b8: 23a0001b movcs r0, #27
if (type == RTEMS_BDPART_MBR_EMPTY) {
return RTEMS_SUCCESSFUL;
} else if (*p == p_end) {
return RTEMS_TOO_MANY;
} else if (begin >= end) {
20bc: 28bd87f0 popcs {r4, r5, r6, r7, r8, r9, sl, pc}
return RTEMS_IO_ERROR;
} else if (type == RTEMS_BDPART_MBR_EXTENDED) {
20c0: e3560005 cmp r6, #5
20c4: 1a000004 bne 20dc <rtems_bdpart_read_mbr_partition+0x74>
if (ep_begin != NULL) {
20c8: e3590000 cmp r9, #0
*ep_begin = begin;
20cc: 15897000 strne r7, [r9]
(*p)->end = end;
rtems_bdpart_to_partition_type( type, (*p)->type);
(*p)->flags = data [RTEMS_BDPART_MBR_OFFSET_FLAGS];
}
return RTEMS_SUCCESSFUL;
20d0: 13a00000 movne r0, #0
} else if (*p == p_end) {
return RTEMS_TOO_MANY;
} else if (begin >= end) {
return RTEMS_IO_ERROR;
} else if (type == RTEMS_BDPART_MBR_EXTENDED) {
if (ep_begin != NULL) {
20d4: 18bd87f0 popne {r4, r5, r6, r7, r8, r9, sl, pc}
20d8: ea000010 b 2120 <rtems_bdpart_read_mbr_partition+0xb8> <== NOT EXECUTED
*ep_begin = begin;
}
} else {
/* Increment partition index */
++(*p);
20dc: e2830030 add r0, r3, #48 ; 0x30
/* Clear partition */
memset( *p, 0, sizeof( rtems_bdpart_partition));
20e0: e3a02030 mov r2, #48 ; 0x30
20e4: e3a01000 mov r1, #0
if (ep_begin != NULL) {
*ep_begin = begin;
}
} else {
/* Increment partition index */
++(*p);
20e8: e5850000 str r0, [r5]
/* Clear partition */
memset( *p, 0, sizeof( rtems_bdpart_partition));
20ec: eb004469 bl 13298 <memset>
/* Set values */
(*p)->begin = begin;
20f0: e5951000 ldr r1, [r5]
(*p)->end = end;
rtems_bdpart_to_partition_type( type, (*p)->type);
20f4: e1a00006 mov r0, r6
/* Clear partition */
memset( *p, 0, sizeof( rtems_bdpart_partition));
/* Set values */
(*p)->begin = begin;
(*p)->end = end;
20f8: e8810180 stm r1, {r7, r8}
rtems_bdpart_to_partition_type( type, (*p)->type);
20fc: e2811008 add r1, r1, #8
2100: ebffffd2 bl 2050 <rtems_bdpart_to_partition_type>
(*p)->flags = data [RTEMS_BDPART_MBR_OFFSET_FLAGS];
2104: e5953000 ldr r3, [r5]
2108: e5d41000 ldrb r1, [r4]
210c: e3a02000 mov r2, #0
2110: e5831028 str r1, [r3, #40] ; 0x28
2114: e583202c str r2, [r3, #44] ; 0x2c
}
return RTEMS_SUCCESSFUL;
2118: e1a00002 mov r0, r2
211c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
2120: e1a00009 mov r0, r9 <== NOT EXECUTED
}
2124: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} <== NOT EXECUTED
00001fcc <rtems_bdpart_read_record>:
static rtems_status_code rtems_bdpart_read_record(
rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_bdbuf_buffer **block
)
{
1fcc: e92d4070 push {r4, r5, r6, lr}
1fd0: e1a05000 mov r5, r0
rtems_status_code sc = RTEMS_SUCCESSFUL;
/* Release previous block if necessary */
if (*block != NULL) {
1fd4: e5920000 ldr r0, [r2]
1fd8: e3500000 cmp r0, #0
static rtems_status_code rtems_bdpart_read_record(
rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_bdbuf_buffer **block
)
{
1fdc: e1a06001 mov r6, r1
1fe0: e1a04002 mov r4, r2
rtems_status_code sc = RTEMS_SUCCESSFUL;
/* Release previous block if necessary */
if (*block != NULL) {
1fe4: 0a000002 beq 1ff4 <bsp_section_bss_size+0x20>
sc = rtems_bdbuf_release( *block);
1fe8: eb002fe2 bl df78 <rtems_bdbuf_release>
if (sc != RTEMS_SUCCESSFUL) {
1fec: e3500000 cmp r0, #0
1ff0: 18bd8070 popne {r4, r5, r6, pc}
return sc;
}
}
/* Read the record block */
sc = rtems_bdbuf_read( dd, index, block);
1ff4: e1a00005 mov r0, r5
1ff8: e1a01006 mov r1, r6
1ffc: e1a02004 mov r2, r4
2000: eb002f67 bl dda4 <rtems_bdbuf_read>
if (sc != RTEMS_SUCCESSFUL) {
2004: e3500000 cmp r0, #0
2008: 18bd8070 popne {r4, r5, r6, pc}
return sc;
}
/* just in case block did not get filled in */
if ( *block == NULL ) {
200c: e5943000 ldr r3, [r4]
2010: e3530000 cmp r3, #0
2014: 0a00000b beq 2048 <bsp_section_bss_size+0x74>
return RTEMS_INVALID_ADDRESS;
}
/* Check MBR signature */
if (!rtems_bdpart_is_valid_record( (*block)->buffer)) {
2018: e593301c ldr r3, [r3, #28]
static bool rtems_bdpart_is_valid_record( const uint8_t *data)
{
return data [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0]
== RTEMS_BDPART_MBR_SIGNATURE_0
&& data [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1]
201c: e5d321fe ldrb r2, [r3, #510] ; 0x1fe
2020: e3520055 cmp r2, #85 ; 0x55
2024: 1a000003 bne 2038 <bsp_section_bss_size+0x64>
}
return RTEMS_SUCCESSFUL;
}
static rtems_status_code rtems_bdpart_read_record(
2028: e5d301ff ldrb r0, [r3, #511] ; 0x1ff
202c: e24030aa sub r3, r0, #170 ; 0xaa
2030: e2730000 rsbs r0, r3, #0
2034: e0a00003 adc r0, r0, r3
return RTEMS_INVALID_ADDRESS;
}
/* Check MBR signature */
if (!rtems_bdpart_is_valid_record( (*block)->buffer)) {
return RTEMS_IO_ERROR;
2038: e31000ff tst r0, #255 ; 0xff
203c: 13a00000 movne r0, #0
2040: 03a0001b moveq r0, #27
2044: e8bd8070 pop {r4, r5, r6, pc}
return sc;
}
/* just in case block did not get filled in */
if ( *block == NULL ) {
return RTEMS_INVALID_ADDRESS;
2048: e3a00009 mov r0, #9 <== NOT EXECUTED
if (!rtems_bdpart_is_valid_record( (*block)->buffer)) {
return RTEMS_IO_ERROR;
}
return RTEMS_SUCCESSFUL;
}
204c: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
00002458 <rtems_bdpart_register>:
rtems_status_code rtems_bdpart_register(
const char *disk_name,
const rtems_bdpart_partition *pt,
size_t count
)
{
2458: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
rtems_blkdev_bnum disk_end = 0;
245c: e3a04000 mov r4, #0
rtems_status_code rtems_bdpart_register(
const char *disk_name,
const rtems_bdpart_partition *pt,
size_t count
)
{
2460: e24dd01c sub sp, sp, #28
2464: e1a08000 mov r8, r0
2468: e1a0b001 mov fp, r1
246c: e58d200c str r2, [sp, #12]
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
rtems_blkdev_bnum disk_end = 0;
2470: e58d4010 str r4, [sp, #16]
dev_t disk = 0;
dev_t logical_disk = 0;
char *logical_disk_name = NULL;
char *logical_disk_marker = NULL;
size_t disk_name_size = strlen( disk_name);
2474: eb00479f bl 142f8 <strlen>
size_t i = 0;
int fd = -1;
2478: e3e03000 mvn r3, #0
247c: e58d3014 str r3, [sp, #20]
rtems_blkdev_bnum disk_end = 0;
dev_t disk = 0;
dev_t logical_disk = 0;
char *logical_disk_name = NULL;
char *logical_disk_marker = NULL;
size_t disk_name_size = strlen( disk_name);
2480: e1a05000 mov r5, r0
size_t i = 0;
int fd = -1;
rtems_disk_device *dd = NULL;
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
2484: e28d1014 add r1, sp, #20
2488: e1a00008 mov r0, r8
248c: e28d2018 add r2, sp, #24
2490: e28d3010 add r3, sp, #16
char *logical_disk_name = NULL;
char *logical_disk_marker = NULL;
size_t disk_name_size = strlen( disk_name);
size_t i = 0;
int fd = -1;
rtems_disk_device *dd = NULL;
2494: e58d4018 str r4, [sp, #24]
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
2498: ebffff2c bl 2150 <rtems_bdpart_get_disk_data>
if (sc != RTEMS_SUCCESSFUL) {
249c: e2504000 subs r4, r0, #0
24a0: 1a00002f bne 2564 <rtems_bdpart_register+0x10c>
static inline dev_t rtems_disk_get_device_identifier(
const rtems_disk_device *dd
)
{
return dd->dev;
24a4: e59d3018 ldr r3, [sp, #24]
return sc;
}
disk = rtems_disk_get_device_identifier( dd);
close( fd);
24a8: e59d0014 ldr r0, [sp, #20]
24ac: e8930600 ldm r3, {r9, sl}
24b0: eb00073d bl 41ac <close>
/* Get the disk device identifier */
rtems_filesystem_split_dev_t( disk, major, minor);
/* Create logical disk name */
logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
24b4: e2850004 add r0, r5, #4
24b8: eb00094d bl 49f4 <malloc>
if (logical_disk_name == NULL) {
24bc: e2506000 subs r6, r0, #0
)
{
union __rtems_dev_t temp;
temp.device = device;
return temp.__overlay.minor;
24c0: e1a0700a mov r7, sl
return RTEMS_NO_MEMORY;
24c4: 03a0401a moveq r4, #26
/* Get the disk device identifier */
rtems_filesystem_split_dev_t( disk, major, minor);
/* Create logical disk name */
logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
if (logical_disk_name == NULL) {
24c8: 0a000025 beq 2564 <rtems_bdpart_register+0x10c>
return RTEMS_NO_MEMORY;
}
strncpy( logical_disk_name, disk_name, disk_name_size);
24cc: e1a01008 mov r1, r8
24d0: e1a02005 mov r2, r5
logical_disk_marker = logical_disk_name + disk_name_size;
24d4: e0868005 add r8, r6, r5
/* Create logical disk name */
logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
if (logical_disk_name == NULL) {
return RTEMS_NO_MEMORY;
}
strncpy( logical_disk_name, disk_name, disk_name_size);
24d8: eb0047ee bl 14498 <strncpy>
logical_disk_marker = logical_disk_name + disk_name_size;
24dc: e1a0500b mov r5, fp
/* Create a logical disk for each partition */
for (i = 0; i < count; ++i) {
24e0: ea000015 b 253c <rtems_bdpart_register+0xe4>
/* Create a new device identifier */
logical_disk = rtems_filesystem_make_dev_t( major, minor);
/* Set partition number for logical disk name */
rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
24e4: e2844001 add r4, r4, #1
24e8: e1a00008 mov r0, r8
24ec: e3a01004 mov r1, #4
24f0: e59f2078 ldr r2, [pc, #120] ; 2570 <rtems_bdpart_register+0x118>
24f4: e1a03004 mov r3, r4
24f8: eb004484 bl 13710 <snprintf>
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
24fc: e3500003 cmp r0, #3
for (i = 0; i < count; ++i) {
const rtems_bdpart_partition *p = pt + i;
int rv = 0;
/* New minor number */
++minor;
2500: e2877001 add r7, r7, #1
/* Create a new device identifier */
logical_disk = rtems_filesystem_make_dev_t( major, minor);
/* Set partition number for logical disk name */
rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
2504: ca000011 bgt 2550 <rtems_bdpart_register+0xf8>
/* Create logical disk */
sc = rtems_disk_create_log(
logical_disk,
disk,
p->begin,
p->end - p->begin,
2508: e5953000 ldr r3, [r5]
esc = RTEMS_INVALID_NAME;
goto cleanup;
}
/* Create logical disk */
sc = rtems_disk_create_log(
250c: e58d3000 str r3, [sp]
2510: e5952004 ldr r2, [r5, #4]
2514: e0633002 rsb r3, r3, r2
2518: e98d0048 stmib sp, {r3, r6}
251c: e1a00009 mov r0, r9
2520: e1a01007 mov r1, r7
2524: e1a02009 mov r2, r9
2528: e1a0300a mov r3, sl
252c: eb0002f0 bl 30f4 <rtems_disk_create_log>
disk,
p->begin,
p->end - p->begin,
logical_disk_name
);
if (sc != RTEMS_SUCCESSFUL) {
2530: e3500000 cmp r0, #0
esc = RTEMS_INVALID_NAME;
goto cleanup;
}
/* Create logical disk */
sc = rtems_disk_create_log(
2534: e2855030 add r5, r5, #48 ; 0x30
disk,
p->begin,
p->end - p->begin,
logical_disk_name
);
if (sc != RTEMS_SUCCESSFUL) {
2538: 1a000006 bne 2558 <rtems_bdpart_register+0x100>
}
strncpy( logical_disk_name, disk_name, disk_name_size);
logical_disk_marker = logical_disk_name + disk_name_size;
/* Create a logical disk for each partition */
for (i = 0; i < count; ++i) {
253c: e59d300c ldr r3, [sp, #12]
2540: e1540003 cmp r4, r3
2544: 1affffe6 bne 24e4 <rtems_bdpart_register+0x8c>
const rtems_bdpart_partition *pt,
size_t count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
2548: e3a04000 mov r4, #0
254c: ea000002 b 255c <rtems_bdpart_register+0x104>
logical_disk = rtems_filesystem_make_dev_t( major, minor);
/* Set partition number for logical disk name */
rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
esc = RTEMS_INVALID_NAME;
2550: e3a04003 mov r4, #3 <== NOT EXECUTED
2554: ea000000 b 255c <rtems_bdpart_register+0x104> <== NOT EXECUTED
goto cleanup;
}
/* Create logical disk */
sc = rtems_disk_create_log(
2558: e1a04000 mov r4, r0 <== NOT EXECUTED
}
}
cleanup:
free( logical_disk_name);
255c: e1a00006 mov r0, r6
2560: eb0007b3 bl 4434 <free>
return esc;
}
2564: e1a00004 mov r0, r4
2568: e28dd01c add sp, sp, #28
256c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0001e138 <rtems_bdpart_unmount>:
const char *disk_name,
const rtems_bdpart_partition *pt __attribute__((unused)),
size_t count,
const char *mount_base
)
{
1e138: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr} <== NOT EXECUTED
rtems_status_code esc = RTEMS_SUCCESSFUL;
const char *disk_file_name = strrchr( disk_name, '/');
1e13c: e3a0102f mov r1, #47 ; 0x2f <== NOT EXECUTED
const char *disk_name,
const rtems_bdpart_partition *pt __attribute__((unused)),
size_t count,
const char *mount_base
)
{
1e140: e1a09003 mov r9, r3 <== NOT EXECUTED
1e144: e1a04000 mov r4, r0 <== NOT EXECUTED
1e148: e1a06002 mov r6, r2 <== NOT EXECUTED
rtems_status_code esc = RTEMS_SUCCESSFUL;
const char *disk_file_name = strrchr( disk_name, '/');
1e14c: eb006d73 bl 39720 <strrchr> <== NOT EXECUTED
1e150: e1a0a000 mov sl, r0 <== NOT EXECUTED
char *mount_point = NULL;
char *mount_marker = NULL;
size_t disk_file_name_size = 0;
size_t disk_name_size = strlen( disk_name);
1e154: e1a00004 mov r0, r4 <== NOT EXECUTED
1e158: eb006952 bl 386a8 <strlen> <== NOT EXECUTED
1e15c: e1a08000 mov r8, r0 <== NOT EXECUTED
size_t mount_base_size = strlen( mount_base);
1e160: e1a00009 mov r0, r9 <== NOT EXECUTED
1e164: eb00694f bl 386a8 <strlen> <== NOT EXECUTED
size_t i = 0;
/* Get disk file name */
if (disk_file_name != NULL) {
1e168: e35a0000 cmp sl, #0 <== NOT EXECUTED
const char *disk_file_name = strrchr( disk_name, '/');
char *mount_point = NULL;
char *mount_marker = NULL;
size_t disk_file_name_size = 0;
size_t disk_name_size = strlen( disk_name);
size_t mount_base_size = strlen( mount_base);
1e16c: e1a05000 mov r5, r0 <== NOT EXECUTED
/* Get disk file name */
if (disk_file_name != NULL) {
disk_file_name += 1;
disk_file_name_size = strlen( disk_file_name);
} else {
disk_file_name = disk_name;
1e170: 01a0a004 moveq sl, r4 <== NOT EXECUTED
size_t disk_name_size = strlen( disk_name);
size_t mount_base_size = strlen( mount_base);
size_t i = 0;
/* Get disk file name */
if (disk_file_name != NULL) {
1e174: 0a000003 beq 1e188 <rtems_bdpart_unmount+0x50> <== NOT EXECUTED
disk_file_name += 1;
1e178: e28aa001 add sl, sl, #1 <== NOT EXECUTED
disk_file_name_size = strlen( disk_file_name);
1e17c: e1a0000a mov r0, sl <== NOT EXECUTED
1e180: eb006948 bl 386a8 <strlen> <== NOT EXECUTED
1e184: e1a08000 mov r8, r0 <== NOT EXECUTED
disk_file_name = disk_name;
disk_file_name_size = disk_name_size;
}
/* Create mount point base */
mount_point = malloc( mount_base_size + 1 + disk_file_name_size + RTEMS_BDPART_NUMBER_SIZE);
1e188: e0887005 add r7, r8, r5 <== NOT EXECUTED
1e18c: e2870005 add r0, r7, #5 <== NOT EXECUTED
1e190: ebff9356 bl 2ef0 <malloc> <== NOT EXECUTED
if (mount_point == NULL) {
1e194: e2504000 subs r4, r0, #0 <== NOT EXECUTED
esc = RTEMS_NO_MEMORY;
1e198: 03a0501a moveq r5, #26 <== NOT EXECUTED
disk_file_name_size = disk_name_size;
}
/* Create mount point base */
mount_point = malloc( mount_base_size + 1 + disk_file_name_size + RTEMS_BDPART_NUMBER_SIZE);
if (mount_point == NULL) {
1e19c: 0a000024 beq 1e234 <rtems_bdpart_unmount+0xfc> <== NOT EXECUTED
esc = RTEMS_NO_MEMORY;
goto cleanup;
}
strncpy( mount_point, mount_base, mount_base_size);
1e1a0: e1a02005 mov r2, r5 <== NOT EXECUTED
1e1a4: e1a01009 mov r1, r9 <== NOT EXECUTED
1e1a8: eb0069e0 bl 38930 <strncpy> <== NOT EXECUTED
mount_point [mount_base_size] = '/';
1e1ac: e3a0302f mov r3, #47 ; 0x2f <== NOT EXECUTED
strncpy( mount_point + mount_base_size + 1, disk_file_name, disk_file_name_size);
1e1b0: e2850001 add r0, r5, #1 <== NOT EXECUTED
if (mount_point == NULL) {
esc = RTEMS_NO_MEMORY;
goto cleanup;
}
strncpy( mount_point, mount_base, mount_base_size);
mount_point [mount_base_size] = '/';
1e1b4: e7c43005 strb r3, [r4, r5] <== NOT EXECUTED
strncpy( mount_point + mount_base_size + 1, disk_file_name, disk_file_name_size);
1e1b8: e0840000 add r0, r4, r0 <== NOT EXECUTED
1e1bc: e1a0100a mov r1, sl <== NOT EXECUTED
1e1c0: e1a02008 mov r2, r8 <== NOT EXECUTED
/* Marker */
mount_marker = mount_point + mount_base_size + 1 + disk_file_name_size;
1e1c4: e2877001 add r7, r7, #1 <== NOT EXECUTED
esc = RTEMS_NO_MEMORY;
goto cleanup;
}
strncpy( mount_point, mount_base, mount_base_size);
mount_point [mount_base_size] = '/';
strncpy( mount_point + mount_base_size + 1, disk_file_name, disk_file_name_size);
1e1c8: eb0069d8 bl 38930 <strncpy> <== NOT EXECUTED
/* Marker */
mount_marker = mount_point + mount_base_size + 1 + disk_file_name_size;
1e1cc: e0847007 add r7, r4, r7 <== NOT EXECUTED
/* Mount supported file systems for each partition */
for (i = 0; i < count; ++i) {
1e1d0: e3a05000 mov r5, #0 <== NOT EXECUTED
1e1d4: ea00000f b 1e218 <rtems_bdpart_unmount+0xe0> <== NOT EXECUTED
/* Create mount point */
int rv = snprintf( mount_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
1e1d8: e2855001 add r5, r5, #1 <== NOT EXECUTED
1e1dc: e1a00007 mov r0, r7 <== NOT EXECUTED
1e1e0: e3a01004 mov r1, #4 <== NOT EXECUTED
1e1e4: e59f2058 ldr r2, [pc, #88] ; 1e244 <rtems_bdpart_unmount+0x10c><== NOT EXECUTED
1e1e8: e1a03005 mov r3, r5 <== NOT EXECUTED
1e1ec: eb006522 bl 3767c <snprintf> <== NOT EXECUTED
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
1e1f0: e3500003 cmp r0, #3 <== NOT EXECUTED
1e1f4: ca00000b bgt 1e228 <rtems_bdpart_unmount+0xf0> <== NOT EXECUTED
esc = RTEMS_INVALID_NAME;
goto cleanup;
}
/* Unmount */
rv = unmount( mount_point);
1e1f8: e1a00004 mov r0, r4 <== NOT EXECUTED
1e1fc: eb000ed4 bl 21d54 <unmount> <== NOT EXECUTED
if (rv == 0) {
1e200: e3500000 cmp r0, #0 <== NOT EXECUTED
1e204: 1a000003 bne 1e218 <rtems_bdpart_unmount+0xe0> <== NOT EXECUTED
/* Remove mount point */
rv = rmdir( mount_point);
1e208: e1a00004 mov r0, r4 <== NOT EXECUTED
1e20c: eb000d33 bl 216e0 <rmdir> <== NOT EXECUTED
if (rv != 0) {
1e210: e3500000 cmp r0, #0 <== NOT EXECUTED
1e214: 1a000005 bne 1e230 <rtems_bdpart_unmount+0xf8> <== NOT EXECUTED
/* Marker */
mount_marker = mount_point + mount_base_size + 1 + disk_file_name_size;
/* Mount supported file systems for each partition */
for (i = 0; i < count; ++i) {
1e218: e1550006 cmp r5, r6 <== NOT EXECUTED
1e21c: 1affffed bne 1e1d8 <rtems_bdpart_unmount+0xa0> <== NOT EXECUTED
const rtems_bdpart_partition *pt __attribute__((unused)),
size_t count,
const char *mount_base
)
{
rtems_status_code esc = RTEMS_SUCCESSFUL;
1e220: e3a05000 mov r5, #0 <== NOT EXECUTED
1e224: ea000002 b 1e234 <rtems_bdpart_unmount+0xfc> <== NOT EXECUTED
/* Mount supported file systems for each partition */
for (i = 0; i < count; ++i) {
/* Create mount point */
int rv = snprintf( mount_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
esc = RTEMS_INVALID_NAME;
1e228: e3a05003 mov r5, #3 <== NOT EXECUTED
1e22c: ea000000 b 1e234 <rtems_bdpart_unmount+0xfc> <== NOT EXECUTED
rv = unmount( mount_point);
if (rv == 0) {
/* Remove mount point */
rv = rmdir( mount_point);
if (rv != 0) {
esc = RTEMS_IO_ERROR;
1e230: e3a0501b mov r5, #27 <== NOT EXECUTED
}
}
cleanup:
free( mount_point);
1e234: e1a00004 mov r0, r4 <== NOT EXECUTED
1e238: ebff9267 bl 2bdc <free> <== NOT EXECUTED
return esc;
}
1e23c: e1a00005 mov r0, r5 <== NOT EXECUTED
1e240: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} <== NOT EXECUTED
000025b4 <rtems_bdpart_unregister>:
rtems_status_code rtems_bdpart_unregister(
const char *disk_name,
const rtems_bdpart_partition *pt __attribute__((unused)),
size_t count
)
{
25b4: e92d41f7 push {r0, r1, r2, r4, r5, r6, r7, r8, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
rtems_blkdev_bnum disk_end = 0;
25b8: e3a03000 mov r3, #0
rtems_status_code rtems_bdpart_unregister(
const char *disk_name,
const rtems_bdpart_partition *pt __attribute__((unused)),
size_t count
)
{
25bc: e1a04002 mov r4, r2
rtems_device_minor_number minor = 0;
rtems_blkdev_bnum disk_end = 0;
dev_t disk = 0;
dev_t logical_disk = 0;
size_t i = 0;
int fd = -1;
25c0: e3e02000 mvn r2, #0
rtems_disk_device *dd = NULL;
25c4: e98d000c stmib sp, {r2, r3}
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
rtems_blkdev_bnum disk_end = 0;
25c8: e58d3000 str r3, [sp]
size_t i = 0;
int fd = -1;
rtems_disk_device *dd = NULL;
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
25cc: e28d1004 add r1, sp, #4
25d0: e28d2008 add r2, sp, #8
25d4: e1a0300d mov r3, sp
25d8: ebfffedc bl 2150 <rtems_bdpart_get_disk_data>
if (sc != RTEMS_SUCCESSFUL) {
25dc: e2505000 subs r5, r0, #0
25e0: 1a000011 bne 262c <rtems_bdpart_unregister+0x78>
25e4: e59d3008 ldr r3, [sp, #8]
return sc;
}
disk = rtems_disk_get_device_identifier( dd);
close( fd);
25e8: e59d0004 ldr r0, [sp, #4]
25ec: e5938000 ldr r8, [r3]
25f0: e5937004 ldr r7, [r3, #4]
/* Get the disk device identifier */
rtems_filesystem_split_dev_t( disk, major, minor);
/* Create a logical disk for each partition */
for (i = 0; i < count; ++i) {
25f4: e1a06005 mov r6, r5
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
disk = rtems_disk_get_device_identifier( dd);
close( fd);
25f8: eb0006eb bl 41ac <close>
/* Get the disk device identifier */
rtems_filesystem_split_dev_t( disk, major, minor);
/* Create a logical disk for each partition */
for (i = 0; i < count; ++i) {
25fc: ea000006 b 261c <rtems_bdpart_unregister+0x68>
/* New minor number */
++minor;
2600: e2877001 add r7, r7, #1
/* Get the device identifier */
logical_disk = rtems_filesystem_make_dev_t( major, minor);
/* Delete logical disk */
sc = rtems_disk_delete( logical_disk);
2604: e1a00008 mov r0, r8
2608: e1a01007 mov r1, r7
260c: eb000253 bl 2f60 <rtems_disk_delete>
if (sc != RTEMS_SUCCESSFUL) {
2610: e3500000 cmp r0, #0
2614: 1a000003 bne 2628 <rtems_bdpart_unregister+0x74>
/* Get the disk device identifier */
rtems_filesystem_split_dev_t( disk, major, minor);
/* Create a logical disk for each partition */
for (i = 0; i < count; ++i) {
2618: e2866001 add r6, r6, #1
261c: e1560004 cmp r6, r4
2620: 1afffff6 bne 2600 <rtems_bdpart_unregister+0x4c>
2624: ea000000 b 262c <rtems_bdpart_unregister+0x78>
/* Get the device identifier */
logical_disk = rtems_filesystem_make_dev_t( major, minor);
/* Delete logical disk */
sc = rtems_disk_delete( logical_disk);
2628: e1a05000 mov r5, r0 <== NOT EXECUTED
return sc;
}
}
return RTEMS_SUCCESSFUL;
}
262c: e1a00005 mov r0, r5
2630: e8bd81fe pop {r1, r2, r3, r4, r5, r6, r7, r8, pc}
00002710 <rtems_bdpart_write>:
const char *disk_name,
const rtems_bdpart_format *format,
const rtems_bdpart_partition *pt,
size_t count
)
{
2710: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
&& format->mbr.dos_compatibility;
2714: e2514000 subs r4, r1, #0
const char *disk_name,
const rtems_bdpart_format *format,
const rtems_bdpart_partition *pt,
size_t count
)
{
2718: e24dd024 sub sp, sp, #36 ; 0x24
271c: e1a05002 mov r5, r2
2720: e1a0a003 mov sl, r3
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
&& format->mbr.dos_compatibility;
2724: 01a08004 moveq r8, r4
2728: 0a000003 beq 273c <rtems_bdpart_write+0x2c>
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
272c: e5943000 ldr r3, [r4]
2730: e3530000 cmp r3, #0
&& format->mbr.dos_compatibility;
2734: 05d48008 ldrbeq r8, [r4, #8]
2738: 13a08000 movne r8, #0
rtems_bdbuf_buffer *block = NULL;
273c: e3a03000 mov r3, #0
rtems_blkdev_bnum disk_end = 0;
rtems_blkdev_bnum record_space =
2740: e21880ff ands r8, r8, #255 ; 0xff
2744: 03a0b001 moveq fp, #1
2748: 13a0b03f movne fp, #63 ; 0x3f
dos_compatibility ? RTEMS_BDPART_MBR_CYLINDER_SIZE : 1;
size_t ppc = 0; /* Primary partition count */
size_t i = 0;
uint8_t *data = NULL;
int fd = -1;
274c: e3e02000 mvn r2, #0
rtems_disk_device *dd = NULL;
/* Check if we have something to do */
if (count == 0) {
2750: e15a0003 cmp sl, r3
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
&& format->mbr.dos_compatibility;
rtems_bdbuf_buffer *block = NULL;
2754: e58d3010 str r3, [sp, #16]
rtems_blkdev_bnum disk_end = 0;
2758: e58d3014 str r3, [sp, #20]
rtems_blkdev_bnum record_space =
dos_compatibility ? RTEMS_BDPART_MBR_CYLINDER_SIZE : 1;
size_t ppc = 0; /* Primary partition count */
size_t i = 0;
uint8_t *data = NULL;
int fd = -1;
275c: e58d2018 str r2, [sp, #24]
rtems_disk_device *dd = NULL;
2760: e58d301c str r3, [sp, #28]
/* Check if we have something to do */
if (count == 0) {
/* Nothing to do */
return RTEMS_SUCCESSFUL;
2764: 01a0000a moveq r0, sl
uint8_t *data = NULL;
int fd = -1;
rtems_disk_device *dd = NULL;
/* Check if we have something to do */
if (count == 0) {
2768: 0a0000bf beq 2a6c <rtems_bdpart_write+0x35c>
/* Nothing to do */
return RTEMS_SUCCESSFUL;
}
/* Check parameter */
if (format == NULL || pt == NULL) {
276c: e1540003 cmp r4, r3
2770: 11550003 cmpne r5, r3
return RTEMS_INVALID_ADDRESS;
2774: 03a00009 moveq r0, #9
/* Nothing to do */
return RTEMS_SUCCESSFUL;
}
/* Check parameter */
if (format == NULL || pt == NULL) {
2778: 0a0000bb beq 2a6c <rtems_bdpart_write+0x35c>
return RTEMS_INVALID_ADDRESS;
}
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
277c: e28d1018 add r1, sp, #24
2780: e28d201c add r2, sp, #28
2784: e28d3014 add r3, sp, #20
2788: ebfffe70 bl 2150 <rtems_bdpart_get_disk_data>
if (sc != RTEMS_SUCCESSFUL) {
278c: e3500000 cmp r0, #0
2790: 1a0000b5 bne 2a6c <rtems_bdpart_write+0x35c>
return sc;
}
/* Align end of disk on cylinder boundary if necessary */
if (dos_compatibility) {
2794: e3580000 cmp r8, #0
2798: 0a000005 beq 27b4 <rtems_bdpart_write+0xa4>
disk_end -= (disk_end % record_space);
279c: e59d6014 ldr r6, [sp, #20]
27a0: e1a0100b mov r1, fp
27a4: e1a00006 mov r0, r6
27a8: eb0073e1 bl 1f734 <__umodsi3>
27ac: e0600006 rsb r0, r0, r6
27b0: e58d0014 str r0, [sp, #20]
/* Check that we have a consistent partition table */
for (i = 0; i < count; ++i) {
const rtems_bdpart_partition *p = pt + i;
/* Check that begin and end are proper within the disk */
if (p->begin >= disk_end || p->end > disk_end) {
27b4: e59d1014 ldr r1, [sp, #20]
27b8: e1a06005 mov r6, r5
27bc: e1a03005 mov r3, r5
if (dos_compatibility) {
disk_end -= (disk_end % record_space);
}
/* Check that we have a consistent partition table */
for (i = 0; i < count; ++i) {
27c0: e3a07000 mov r7, #0
const rtems_bdpart_partition *p = pt + i;
/* Check that begin and end are proper within the disk */
if (p->begin >= disk_end || p->end > disk_end) {
27c4: e5932000 ldr r2, [r3]
27c8: e1520001 cmp r2, r1
27cc: 2a000098 bcs 2a34 <rtems_bdpart_write+0x324>
27d0: e5930004 ldr r0, [r3, #4]
27d4: e1500001 cmp r0, r1
27d8: 8a000095 bhi 2a34 <rtems_bdpart_write+0x324>
esc = RTEMS_INVALID_NUMBER;
goto cleanup;
}
/* Check that begin and end are valid */
if (p->begin >= p->end) {
27dc: e1520000 cmp r2, r0
27e0: 2a000093 bcs 2a34 <rtems_bdpart_write+0x324>
esc = RTEMS_INVALID_NUMBER;
goto cleanup;
}
/* Check that partitions do not overlap */
if (i > 0 && pt [i - 1].end > p->begin) {
27e4: e3570000 cmp r7, #0
27e8: 0a000002 beq 27f8 <rtems_bdpart_write+0xe8>
27ec: e513002c ldr r0, [r3, #-44] ; 0x2c
27f0: e1500002 cmp r0, r2
27f4: 8a00008e bhi 2a34 <rtems_bdpart_write+0x324>
if (dos_compatibility) {
disk_end -= (disk_end % record_space);
}
/* Check that we have a consistent partition table */
for (i = 0; i < count; ++i) {
27f8: e2877001 add r7, r7, #1
27fc: e157000a cmp r7, sl
2800: e2833030 add r3, r3, #48 ; 0x30
2804: 1affffee bne 27c4 <rtems_bdpart_write+0xb4>
goto cleanup;
}
}
/* Check format */
if (format->type != RTEMS_BDPART_FORMAT_MBR) {
2808: e5943000 ldr r3, [r4]
280c: e3530000 cmp r3, #0
esc = RTEMS_NOT_IMPLEMENTED;
2810: 13a04018 movne r4, #24
goto cleanup;
}
}
/* Check format */
if (format->type != RTEMS_BDPART_FORMAT_MBR) {
2814: 1a00008d bne 2a50 <rtems_bdpart_write+0x340>
* Set primary partition count. If we have more than four partitions we need
* an extended partition which will contain the partitions of number four and
* above as logical partitions. If we have four or less partitions we can
* use the primary partition table.
*/
ppc = count <= 4 ? count : 3;
2818: e3570004 cmp r7, #4
281c: 83a07003 movhi r7, #3
/*
* Check that the first primary partition starts at head one and sector one
* under the virtual one head and 63 sectors geometry if necessary.
*/
if (dos_compatibility && pt [0].begin != RTEMS_BDPART_MBR_CYLINDER_SIZE) {
2820: e3580000 cmp r8, #0
2824: 1a000007 bne 2848 <rtems_bdpart_write+0x138>
* The space for the EBR and maybe some space which is needed for DOS
* compatibility resides between the partitions. So there have to be gaps of
* the appropriate size between the partitions.
*/
for (i = ppc; i < count; ++i) {
if ((pt [i].begin - pt [i - 1].end) < record_space) {
2828: e3a03030 mov r3, #48 ; 0x30
282c: e0000793 mul r0, r3, r7
2830: e0851000 add r1, r5, r0
2834: e58d000c str r0, [sp, #12]
2838: e58d1008 str r1, [sp, #8]
283c: e1a02001 mov r2, r1
RTEMS_BDPART_MBR_SIGNATURE_1;
return RTEMS_SUCCESSFUL;
}
rtems_status_code rtems_bdpart_write(
2840: e1a03007 mov r3, r7
2844: ea00000b b 2878 <rtems_bdpart_write+0x168>
/*
* Check that the first primary partition starts at head one and sector one
* under the virtual one head and 63 sectors geometry if necessary.
*/
if (dos_compatibility && pt [0].begin != RTEMS_BDPART_MBR_CYLINDER_SIZE) {
2848: e5953000 ldr r3, [r5]
284c: e353003f cmp r3, #63 ; 0x3f
2850: 1a000077 bne 2a34 <rtems_bdpart_write+0x324>
2854: eafffff3 b 2828 <rtems_bdpart_write+0x118>
RTEMS_BDPART_MBR_SIGNATURE_1;
return RTEMS_SUCCESSFUL;
}
rtems_status_code rtems_bdpart_write(
2858: e1a01002 mov r1, r2
* The space for the EBR and maybe some space which is needed for DOS
* compatibility resides between the partitions. So there have to be gaps of
* the appropriate size between the partitions.
*/
for (i = ppc; i < count; ++i) {
if ((pt [i].begin - pt [i - 1].end) < record_space) {
285c: e5910000 ldr r0, [r1]
2860: e511102c ldr r1, [r1, #-44] ; 0x2c
2864: e0611000 rsb r1, r1, r0
2868: e151000b cmp r1, fp
RTEMS_BDPART_MBR_SIGNATURE_1;
return RTEMS_SUCCESSFUL;
}
rtems_status_code rtems_bdpart_write(
286c: e2822030 add r2, r2, #48 ; 0x30
* The space for the EBR and maybe some space which is needed for DOS
* compatibility resides between the partitions. So there have to be gaps of
* the appropriate size between the partitions.
*/
for (i = ppc; i < count; ++i) {
if ((pt [i].begin - pt [i - 1].end) < record_space) {
2870: 3a00006f bcc 2a34 <rtems_bdpart_write+0x324>
* Each logical partition is described via one EBR preceding the partition.
* The space for the EBR and maybe some space which is needed for DOS
* compatibility resides between the partitions. So there have to be gaps of
* the appropriate size between the partitions.
*/
for (i = ppc; i < count; ++i) {
2874: e2833001 add r3, r3, #1
2878: e153000a cmp r3, sl
287c: 3afffff5 bcc 2858 <rtems_bdpart_write+0x148>
2880: e3a09000 mov r9, #0
2884: e1a08005 mov r8, r5
}
}
/* Check that we can convert the parition descriptions to the MBR format */
for (i = 0; i < count; ++i) {
uint8_t type = 0;
2888: e1a0c009 mov ip, r9
const rtems_bdpart_partition *p = pt + i;
/* Check type */
if (!rtems_bdpart_to_mbr_partition_type( p->type, &type)) {
288c: e2880008 add r0, r8, #8
2890: e28d1023 add r1, sp, #35 ; 0x23
}
}
/* Check that we can convert the parition descriptions to the MBR format */
for (i = 0; i < count; ++i) {
uint8_t type = 0;
2894: e5cdc023 strb ip, [sp, #35] ; 0x23
const rtems_bdpart_partition *p = pt + i;
/* Check type */
if (!rtems_bdpart_to_mbr_partition_type( p->type, &type)) {
2898: e58dc004 str ip, [sp, #4]
289c: ebfffe21 bl 2128 <rtems_bdpart_to_mbr_partition_type>
28a0: e3500000 cmp r0, #0
28a4: e59dc004 ldr ip, [sp, #4]
28a8: 0a000063 beq 2a3c <rtems_bdpart_write+0x32c>
28ac: e2888030 add r8, r8, #48 ; 0x30
esc = RTEMS_INVALID_ID;
goto cleanup;
}
/* Check flags */
if (p->flags > 0xffU) {
28b0: e918000c ldmdb r8, {r2, r3}
28b4: e3a000ff mov r0, #255 ; 0xff
28b8: e3a01000 mov r1, #0
28bc: e1510003 cmp r1, r3
28c0: 01500002 cmpeq r0, r2
28c4: 3a00005c bcc 2a3c <rtems_bdpart_write+0x32c>
goto cleanup;
}
}
/* Check that we can convert the parition descriptions to the MBR format */
for (i = 0; i < count; ++i) {
28c8: e2899001 add r9, r9, #1
28cc: e159000a cmp r9, sl
28d0: 1affffed bne 288c <rtems_bdpart_write+0x17c>
/* Check ID */
/* TODO */
}
/* New MBR */
sc = rtems_bdpart_new_record( dd, 0, &block);
28d4: e59d001c ldr r0, [sp, #28]
28d8: e3a01000 mov r1, #0
28dc: e28d2010 add r2, sp, #16
28e0: ebffff68 bl 2688 <rtems_bdpart_new_record>
if (sc != RTEMS_SUCCESSFUL) {
28e4: e3500000 cmp r0, #0
28e8: 1a000057 bne 2a4c <rtems_bdpart_write+0x33c>
}
/* Write disk ID */
rtems_uint32_to_little_endian(
format->mbr.disk_id,
block->buffer + RTEMS_BDPART_MBR_OFFSET_DISK_ID
28ec: e59d3010 ldr r3, [sp, #16]
esc = sc;
goto cleanup;
}
/* Write disk ID */
rtems_uint32_to_little_endian(
28f0: e593301c ldr r3, [r3, #28]
28f4: e5942004 ldr r2, [r4, #4]
28f8: e1a04000 mov r4, r0
28fc: e2844001 add r4, r4, #1
2900: e3540004 cmp r4, #4
data [i] = (uint8_t) value;
2904: e5c321b8 strb r2, [r3, #440] ; 0x1b8
value >>= 8;
2908: e1a02422 lsr r2, r2, #8
static inline void rtems_uint32_to_little_endian( uint32_t value, uint8_t *data)
{
size_t i = 0;
for (i = 0; i < 4; ++i) {
290c: e2833001 add r3, r3, #1
2910: 1afffff9 bne 28fc <rtems_bdpart_write+0x1ec>
format->mbr.disk_id,
block->buffer + RTEMS_BDPART_MBR_OFFSET_DISK_ID
);
/* Write primary partition table */
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
2914: e59d3010 ldr r3, [sp, #16]
2918: e593901c ldr r9, [r3, #28]
291c: e2899f6f add r9, r9, #444 ; 0x1bc
2920: e2899002 add r9, r9, #2
2924: e1a04009 mov r4, r9
for (i = 0; i < ppc; ++i) {
2928: e3a08000 mov r8, #0
292c: ea000009 b 2958 <rtems_bdpart_write+0x248>
const rtems_bdpart_partition *p = pt + i;
/* Write partition entry */
rtems_bdpart_write_mbr_partition(
2930: e8960006 ldm r6, {r1, r2}
2934: e5d60028 ldrb r0, [r6, #40] ; 0x28
2938: e5d63008 ldrb r3, [r6, #8]
293c: e0612002 rsb r2, r1, r2
2940: e58d0000 str r0, [sp]
2944: e1a00004 mov r0, r4
2948: ebffff39 bl 2634 <rtems_bdpart_write_mbr_partition>
p->end - p->begin,
rtems_bdpart_mbr_partition_type( p->type),
(uint8_t) p->flags
);
data += RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE;
294c: e2844010 add r4, r4, #16
block->buffer + RTEMS_BDPART_MBR_OFFSET_DISK_ID
);
/* Write primary partition table */
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
for (i = 0; i < ppc; ++i) {
2950: e2888001 add r8, r8, #1
2954: e2866030 add r6, r6, #48 ; 0x30
2958: e1580007 cmp r8, r7
295c: 1afffff3 bne 2930 <rtems_bdpart_write+0x220>
data += RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE;
}
/* Write extended partition with logical partitions if necessary */
if (ppc != count) {
2960: e157000a cmp r7, sl
block->buffer + RTEMS_BDPART_MBR_OFFSET_DISK_ID
);
/* Write primary partition table */
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
for (i = 0; i < ppc; ++i) {
2964: e0890207 add r0, r9, r7, lsl #4
data += RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE;
}
/* Write extended partition with logical partitions if necessary */
if (ppc != count) {
2968: 0a000035 beq 2a44 <rtems_bdpart_write+0x334>
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
/* Begin of extended partition */
rtems_blkdev_bnum ep_begin = pt [ppc].begin - record_space;
296c: e59d100c ldr r1, [sp, #12]
2970: e7956001 ldr r6, [r5, r1]
/* Write extended partition */
rtems_bdpart_write_mbr_partition(
2974: e59d2014 ldr r2, [sp, #20]
/* Write extended partition with logical partitions if necessary */
if (ppc != count) {
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
/* Begin of extended partition */
rtems_blkdev_bnum ep_begin = pt [ppc].begin - record_space;
2978: e06b6006 rsb r6, fp, r6
/* Write extended partition */
rtems_bdpart_write_mbr_partition(
297c: e3a08000 mov r8, #0
2980: e1a01006 mov r1, r6
2984: e0662002 rsb r2, r6, r2
2988: e3a03005 mov r3, #5
298c: e58d8000 str r8, [sp]
RTEMS_BDPART_MBR_EXTENDED,
0
);
/* Write logical partitions */
for (i = ppc; i < count; ++i) {
2990: e1a05007 mov r5, r7
/* Begin of extended partition */
rtems_blkdev_bnum ep_begin = pt [ppc].begin - record_space;
/* Write extended partition */
rtems_bdpart_write_mbr_partition(
2994: ebffff26 bl 2634 <rtems_bdpart_write_mbr_partition>
2998: e59d4008 ldr r4, [sp, #8]
RTEMS_BDPART_MBR_EXTENDED,
0
);
/* Write logical partitions */
for (i = ppc; i < count; ++i) {
299c: ea000021 b 2a28 <rtems_bdpart_write+0x318>
const rtems_bdpart_partition *p = pt + i;
/* Write second partition entry */
if (i > ppc) {
29a0: e1550007 cmp r5, r7
29a4: 9a00000b bls 29d8 <rtems_bdpart_write+0x2c8>
rtems_blkdev_bnum begin = p->begin - record_space;
rtems_bdpart_write_mbr_partition(
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_1,
29a8: e59d2010 ldr r2, [sp, #16]
for (i = ppc; i < count; ++i) {
const rtems_bdpart_partition *p = pt + i;
/* Write second partition entry */
if (i > ppc) {
rtems_blkdev_bnum begin = p->begin - record_space;
29ac: e5943000 ldr r3, [r4]
rtems_bdpart_write_mbr_partition(
29b0: e592001c ldr r0, [r2, #28]
29b4: e59d2014 ldr r2, [sp, #20]
for (i = ppc; i < count; ++i) {
const rtems_bdpart_partition *p = pt + i;
/* Write second partition entry */
if (i > ppc) {
rtems_blkdev_bnum begin = p->begin - record_space;
29b8: e06b3003 rsb r3, fp, r3
rtems_bdpart_write_mbr_partition(
29bc: e2800f73 add r0, r0, #460 ; 0x1cc
29c0: e0661003 rsb r1, r6, r3
29c4: e0632002 rsb r2, r3, r2
29c8: e2800002 add r0, r0, #2
29cc: e3a03005 mov r3, #5
29d0: e58d8000 str r8, [sp]
29d4: ebffff16 bl 2634 <rtems_bdpart_write_mbr_partition>
0
);
}
/* New EBR */
ebr = p->begin - record_space;
29d8: e5941000 ldr r1, [r4]
sc = rtems_bdpart_new_record( dd, ebr, &block);
29dc: e59d001c ldr r0, [sp, #28]
29e0: e06b1001 rsb r1, fp, r1
29e4: e28d2010 add r2, sp, #16
29e8: ebffff26 bl 2688 <rtems_bdpart_new_record>
if (sc != RTEMS_SUCCESSFUL) {
29ec: e3500000 cmp r0, #0
29f0: 1a000015 bne 2a4c <rtems_bdpart_write+0x33c>
goto cleanup;
}
/* Write first partition entry */
rtems_bdpart_write_mbr_partition(
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0,
29f4: e59d3010 ldr r3, [sp, #16]
esc = sc;
goto cleanup;
}
/* Write first partition entry */
rtems_bdpart_write_mbr_partition(
29f8: e593001c ldr r0, [r3, #28]
29fc: e5d41028 ldrb r1, [r4, #40] ; 0x28
2a00: e2800f6f add r0, r0, #444 ; 0x1bc
2a04: e894000c ldm r4, {r2, r3}
2a08: e0432002 sub r2, r3, r2
2a0c: e2800002 add r0, r0, #2
2a10: e5d43008 ldrb r3, [r4, #8]
2a14: e58d1000 str r1, [sp]
2a18: e1a0100b mov r1, fp
2a1c: ebffff04 bl 2634 <rtems_bdpart_write_mbr_partition>
RTEMS_BDPART_MBR_EXTENDED,
0
);
/* Write logical partitions */
for (i = ppc; i < count; ++i) {
2a20: e2855001 add r5, r5, #1
2a24: e2844030 add r4, r4, #48 ; 0x30
2a28: e155000a cmp r5, sl
2a2c: 3affffdb bcc 29a0 <rtems_bdpart_write+0x290>
2a30: ea000003 b 2a44 <rtems_bdpart_write+0x334>
* compatibility resides between the partitions. So there have to be gaps of
* the appropriate size between the partitions.
*/
for (i = ppc; i < count; ++i) {
if ((pt [i].begin - pt [i - 1].end) < record_space) {
esc = RTEMS_INVALID_NUMBER;
2a34: e3a0400a mov r4, #10 <== NOT EXECUTED
2a38: ea000004 b 2a50 <rtems_bdpart_write+0x340> <== NOT EXECUTED
goto cleanup;
}
/* Check flags */
if (p->flags > 0xffU) {
esc = RTEMS_INVALID_ID;
2a3c: e3a04004 mov r4, #4 <== NOT EXECUTED
2a40: ea000002 b 2a50 <rtems_bdpart_write+0x340> <== NOT EXECUTED
const rtems_bdpart_partition *pt,
size_t count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
2a44: e3a04000 mov r4, #0
2a48: ea000000 b 2a50 <rtems_bdpart_write+0x340>
);
}
/* New EBR */
ebr = p->begin - record_space;
sc = rtems_bdpart_new_record( dd, ebr, &block);
2a4c: e1a04000 mov r4, r0 <== NOT EXECUTED
}
}
cleanup:
if (fd >= 0) {
2a50: e59d0018 ldr r0, [sp, #24]
2a54: e3500000 cmp r0, #0
close( fd);
2a58: ab0005d3 blge 41ac <close>
}
if (block != NULL) {
2a5c: e59d0010 ldr r0, [sp, #16]
2a60: e3500000 cmp r0, #0
rtems_bdbuf_sync( block);
2a64: 1b002d8a blne e094 <rtems_bdbuf_sync>
}
return esc;
2a68: e1a00004 mov r0, r4
}
2a6c: e28dd024 add sp, sp, #36 ; 0x24
2a70: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000d33c <rtems_blkdev_generic_write>:
void * arg)
{
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
d33c: e5923000 ldr r3, [r2]
rtems_device_driver
rtems_blkdev_generic_write(
rtems_device_major_number major __attribute__((unused)),
rtems_device_minor_number minor __attribute__((unused)),
void * arg)
{
d340: e92d4ff7 push {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
d344: e593902c ldr r9, [r3, #44] ; 0x2c
rtems_device_driver
rtems_blkdev_generic_write(
rtems_device_major_number major __attribute__((unused)),
rtems_device_minor_number minor __attribute__((unused)),
void * arg)
{
d348: e1a04002 mov r4, r2
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
uint32_t block_size = dd->block_size;
d34c: e5997024 ldr r7, [r9, #36] ; 0x24
char *buf = args->buffer;
d350: e592b00c ldr fp, [r2, #12]
uint32_t count = args->count;
d354: e5925010 ldr r5, [r2, #16]
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
d358: e992000c ldmib r2, {r2, r3}
d35c: e3a08000 mov r8, #0
d360: e88d000c stm sp, {r2, r3}
d364: e1a00002 mov r0, r2
d368: e1a01003 mov r1, r3
d36c: e1a02007 mov r2, r7
d370: e1a03008 mov r3, r8
d374: eb003768 bl 1b11c <__divdi3>
uint32_t blkofs = (uint32_t) (args->offset % block_size);
d378: e1a02007 mov r2, r7
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
uint32_t block_size = dd->block_size;
char *buf = args->buffer;
uint32_t count = args->count;
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
d37c: e1a06000 mov r6, r0
uint32_t blkofs = (uint32_t) (args->offset % block_size);
d380: e1a03008 mov r3, r8
d384: e89d0003 ldm sp, {r0, r1}
d388: eb00389e bl 1b608 <__moddi3>
args->bytes_moved = 0;
d38c: e5848018 str r8, [r4, #24]
rtems_disk_device *dd = iop->data1;
uint32_t block_size = dd->block_size;
char *buf = args->buffer;
uint32_t count = args->count;
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
uint32_t blkofs = (uint32_t) (args->offset % block_size);
d390: e1a0a000 mov sl, r0
args->bytes_moved = 0;
while (count > 0)
d394: ea00001e b d414 <rtems_blkdev_generic_write+0xd8>
{
rtems_bdbuf_buffer *diskbuf;
uint32_t copy;
if ((blkofs == 0) && (count >= block_size))
d398: e1550007 cmp r5, r7
d39c: 235a0000 cmpcs sl, #0
rc = rtems_bdbuf_get(dd, block, &diskbuf);
d3a0: e1a00009 mov r0, r9
d3a4: e1a01006 mov r1, r6
d3a8: e28d2008 add r2, sp, #8
while (count > 0)
{
rtems_bdbuf_buffer *diskbuf;
uint32_t copy;
if ((blkofs == 0) && (count >= block_size))
d3ac: 1a000001 bne d3b8 <rtems_blkdev_generic_write+0x7c>
rc = rtems_bdbuf_get(dd, block, &diskbuf);
d3b0: ebfffd56 bl c910 <rtems_bdbuf_get>
d3b4: ea000000 b d3bc <rtems_blkdev_generic_write+0x80>
else
rc = rtems_bdbuf_read(dd, block, &diskbuf);
d3b8: ebfffd85 bl c9d4 <rtems_bdbuf_read> <== NOT EXECUTED
if (rc != RTEMS_SUCCESSFUL)
d3bc: e3500000 cmp r0, #0
d3c0: 1a000016 bne d420 <rtems_blkdev_generic_write+0xe4>
break;
copy = block_size - blkofs;
if (copy > count)
copy = count;
memcpy((char *)diskbuf->buffer + blkofs, buf, copy);
d3c4: e59d3008 ldr r3, [sp, #8]
else
rc = rtems_bdbuf_read(dd, block, &diskbuf);
if (rc != RTEMS_SUCCESSFUL)
break;
copy = block_size - blkofs;
d3c8: e06a8007 rsb r8, sl, r7
if (copy > count)
copy = count;
memcpy((char *)diskbuf->buffer + blkofs, buf, copy);
d3cc: e593001c ldr r0, [r3, #28]
else
rc = rtems_bdbuf_read(dd, block, &diskbuf);
if (rc != RTEMS_SUCCESSFUL)
break;
copy = block_size - blkofs;
d3d0: e1580005 cmp r8, r5
d3d4: 21a08005 movcs r8, r5
if (copy > count)
copy = count;
memcpy((char *)diskbuf->buffer + blkofs, buf, copy);
d3d8: e1a0100b mov r1, fp
d3dc: e1a02008 mov r2, r8
d3e0: e080000a add r0, r0, sl
d3e4: eb0012dd bl 11f60 <memcpy>
args->bytes_moved += copy;
d3e8: e5943018 ldr r3, [r4, #24]
d3ec: e0833008 add r3, r3, r8
d3f0: e5843018 str r3, [r4, #24]
rc = rtems_bdbuf_release_modified(diskbuf);
d3f4: e59d0008 ldr r0, [sp, #8]
d3f8: ebfffe18 bl cc60 <rtems_bdbuf_release_modified>
if (rc != RTEMS_SUCCESSFUL)
d3fc: e3500000 cmp r0, #0
d400: 1a000006 bne d420 <rtems_blkdev_generic_write+0xe4>
break;
count -= copy;
d404: e0685005 rsb r5, r8, r5
buf += copy;
d408: e08bb008 add fp, fp, r8
blkofs = 0;
block++;
d40c: e2866001 add r6, r6, #1
if (rc != RTEMS_SUCCESSFUL)
break;
count -= copy;
buf += copy;
blkofs = 0;
d410: e1a0a000 mov sl, r0
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
uint32_t blkofs = (uint32_t) (args->offset % block_size);
args->bytes_moved = 0;
while (count > 0)
d414: e3550000 cmp r5, #0
d418: 1affffde bne d398 <rtems_blkdev_generic_write+0x5c>
d41c: e1a00005 mov r0, r5
blkofs = 0;
block++;
}
return rc;
}
d420: e8bd8ffe pop {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000260c <rtems_blkdev_imfs_fsync_or_fdatasync>:
}
static int rtems_blkdev_imfs_fsync_or_fdatasync(
rtems_libio_t *iop
)
{
260c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
static inline void *IMFS_generic_get_context_by_node(
const IMFS_jnode_t *node
)
{
return node->info.generic.context;
2610: e5903018 ldr r3, [r0, #24]
int rv = 0;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
rtems_status_code sc = rtems_bdbuf_syncdev(dd);
2614: e5930050 ldr r0, [r3, #80] ; 0x50
2618: eb002ca0 bl d8a0 <rtems_bdbuf_syncdev>
if (sc != RTEMS_SUCCESSFUL) {
261c: e3500000 cmp r0, #0
2620: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
errno = EIO;
2624: eb003d86 bl 11c44 <__errno> <== NOT EXECUTED
2628: e3a03005 mov r3, #5 <== NOT EXECUTED
262c: e5803000 str r3, [r0] <== NOT EXECUTED
2630: e3e00000 mvn r0, #0 <== NOT EXECUTED
rv = -1;
}
return rv;
}
2634: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
00002638 <rtems_blkdev_imfs_ioctl>:
void *buffer
)
{
int rv = 0;
if (request != RTEMS_BLKIO_REQUEST) {
2638: e59f3034 ldr r3, [pc, #52] ; 2674 <rtems_blkdev_imfs_ioctl+0x3c>
263c: e1510003 cmp r1, r3
static int rtems_blkdev_imfs_ioctl(
rtems_libio_t *iop,
uint32_t request,
void *buffer
)
{
2640: e52de004 push {lr} ; (str lr, [sp, #-4]!)
int rv = 0;
if (request != RTEMS_BLKIO_REQUEST) {
2644: 0a000005 beq 2660 <rtems_blkdev_imfs_ioctl+0x28>
2648: e5903018 ldr r3, [r0, #24]
264c: e5933050 ldr r3, [r3, #80] ; 0x50
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
rv = (*dd->ioctl)(dd, request, buffer);
2650: e1a00003 mov r0, r3
2654: e1a0e00f mov lr, pc
2658: e593f038 ldr pc, [r3, #56] ; 0x38
265c: e49df004 pop {pc} ; (ldr pc, [sp], #4)
} else {
/*
* It is not allowed to directly access the driver circumventing the cache.
*/
errno = EINVAL;
2660: eb003d77 bl 11c44 <__errno> <== NOT EXECUTED
2664: e3a03016 mov r3, #22 <== NOT EXECUTED
2668: e5803000 str r3, [r0] <== NOT EXECUTED
266c: e3e00000 mvn r0, #0 <== NOT EXECUTED
rv = -1;
}
return rv;
}
2670: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
00002490 <rtems_blkdev_imfs_read>:
static ssize_t rtems_blkdev_imfs_read(
rtems_libio_t *iop,
void *buffer,
size_t count
)
{
2490: e92d4fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
2494: e5903018 ldr r3, [r0, #24]
2498: e593b050 ldr fp, [r3, #80] ; 0x50
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
249c: e9900018 ldmib r0, {r3, r4}
24a0: e88d0018 stm sp, {r3, r4}
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
24a4: e59b4024 ldr r4, [fp, #36] ; 0x24
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
24a8: e1a05fc4 asr r5, r4, #31
24ac: e1a03005 mov r3, r5
static ssize_t rtems_blkdev_imfs_read(
rtems_libio_t *iop,
void *buffer,
size_t count
)
{
24b0: e1a0a001 mov sl, r1
24b4: e1a09002 mov r9, r2
24b8: e1a06000 mov r6, r0
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
24bc: e1a02004 mov r2, r4
24c0: e89d0003 ldm sp, {r0, r1}
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
24c4: e58d4008 str r4, [sp, #8]
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
24c8: eb0064d4 bl 1b820 <__divdi3>
ssize_t block_offset = (ssize_t) (offset % block_size);
24cc: e1a02004 mov r2, r4
24d0: e1a03005 mov r3, r5
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
24d4: e1a07000 mov r7, r0
ssize_t block_offset = (ssize_t) (offset % block_size);
24d8: e89d0003 ldm sp, {r0, r1}
24dc: eb00660a bl 1bd0c <__moddi3>
char *dst = buffer;
24e0: e1a0500a mov r5, sl
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
ssize_t block_offset = (ssize_t) (offset % block_size);
24e4: e1a08000 mov r8, r0
)
{
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
24e8: e1a04009 mov r4, r9
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
ssize_t block_offset = (ssize_t) (offset % block_size);
char *dst = buffer;
while (remaining > 0) {
24ec: ea000019 b 2558 <rtems_blkdev_imfs_read+0xc8>
rtems_bdbuf_buffer *bd;
rtems_status_code sc = rtems_bdbuf_read(dd, block, &bd);
24f0: e1a0000b mov r0, fp
24f4: e1a01007 mov r1, r7
24f8: e28d200c add r2, sp, #12
24fc: eb002be1 bl d488 <rtems_bdbuf_read>
if (sc == RTEMS_SUCCESSFUL) {
2500: e3500000 cmp r0, #0
2504: 1a00001c bne 257c <rtems_blkdev_imfs_read+0xec>
ssize_t copy = block_size - block_offset;
2508: e59d3008 ldr r3, [sp, #8]
250c: e068a003 rsb sl, r8, r3
if (copy > remaining) {
copy = remaining;
}
memcpy(dst, (char *) bd->buffer + block_offset, (size_t) copy);
2510: e59d300c ldr r3, [sp, #12]
2514: e593101c ldr r1, [r3, #28]
while (remaining > 0) {
rtems_bdbuf_buffer *bd;
rtems_status_code sc = rtems_bdbuf_read(dd, block, &bd);
if (sc == RTEMS_SUCCESSFUL) {
ssize_t copy = block_size - block_offset;
2518: e15a0004 cmp sl, r4
251c: a1a0a004 movge sl, r4
if (copy > remaining) {
copy = remaining;
}
memcpy(dst, (char *) bd->buffer + block_offset, (size_t) copy);
2520: e0811008 add r1, r1, r8
2524: e1a0200a mov r2, sl
2528: e1a00005 mov r0, r5
252c: eb00402b bl 125e0 <memcpy>
sc = rtems_bdbuf_release(bd);
2530: e59d000c ldr r0, [sp, #12]
2534: eb002c48 bl d65c <rtems_bdbuf_release>
if (sc == RTEMS_SUCCESSFUL) {
2538: e2508000 subs r8, r0, #0
block_offset = 0;
remaining -= copy;
253c: 006a4004 rsbeq r4, sl, r4
dst += copy;
2540: 0085500a addeq r5, r5, sl
++block;
2544: 02877001 addeq r7, r7, #1
2548: 0a000002 beq 2558 <rtems_blkdev_imfs_read+0xc8>
} else {
remaining = -1;
254c: e3e04000 mvn r4, #0 <== NOT EXECUTED
2550: e3540000 cmp r4, #0 <== NOT EXECUTED
2554: ea000001 b 2560 <rtems_blkdev_imfs_read+0xd0> <== NOT EXECUTED
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
ssize_t block_offset = (ssize_t) (offset % block_size);
char *dst = buffer;
while (remaining > 0) {
2558: e3540000 cmp r4, #0
255c: caffffe3 bgt 24f0 <rtems_blkdev_imfs_read+0x60>
} else {
remaining = -1;
}
}
if (remaining >= 0) {
2560: 1a000005 bne 257c <rtems_blkdev_imfs_read+0xec>
iop->offset += count;
2564: e996000c ldmib r6, {r2, r3}
2568: e0922009 adds r2, r2, r9
256c: e2a33000 adc r3, r3, #0
2570: e986000c stmib r6, {r2, r3}
rv = (ssize_t) count;
2574: e1a00009 mov r0, r9
2578: ea000003 b 258c <rtems_blkdev_imfs_read+0xfc>
} else {
errno = EIO;
257c: eb003db0 bl 11c44 <__errno> <== NOT EXECUTED
2580: e3a03005 mov r3, #5 <== NOT EXECUTED
2584: e5803000 str r3, [r0] <== NOT EXECUTED
rv = -1;
2588: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return rv;
}
258c: e28dd010 add sp, sp, #16
2590: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000235c <rtems_blkdev_imfs_write>:
static ssize_t rtems_blkdev_imfs_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
235c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
2360: e5903018 ldr r3, [r0, #24]
2364: e593b050 ldr fp, [r3, #80] ; 0x50
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
2368: e9900018 ldmib r0, {r3, r4}
static ssize_t rtems_blkdev_imfs_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
236c: e24dd014 sub sp, sp, #20
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
2370: e58d3008 str r3, [sp, #8]
2374: e58d400c str r4, [sp, #12]
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
2378: e59b4024 ldr r4, [fp, #36] ; 0x24
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
237c: e1a05fc4 asr r5, r4, #31
2380: e1a03005 mov r3, r5
static ssize_t rtems_blkdev_imfs_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
2384: e58d2004 str r2, [sp, #4]
2388: e1a06000 mov r6, r0
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
238c: e1a02004 mov r2, r4
static ssize_t rtems_blkdev_imfs_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
)
{
2390: e1a07001 mov r7, r1
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
2394: e28d1008 add r1, sp, #8
2398: e8910003 ldm r1, {r0, r1}
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
239c: e58d4000 str r4, [sp]
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
23a0: eb00651e bl 1b820 <__divdi3>
ssize_t block_offset = (ssize_t) (offset % block_size);
23a4: e1a02004 mov r2, r4
23a8: e1a03005 mov r3, r5
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
23ac: e1a09000 mov r9, r0
ssize_t block_offset = (ssize_t) (offset % block_size);
23b0: e28d1008 add r1, sp, #8
23b4: e8910003 ldm r1, {r0, r1}
23b8: eb006653 bl 1bd0c <__moddi3>
)
{
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
23bc: e59d4004 ldr r4, [sp, #4]
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
ssize_t block_offset = (ssize_t) (offset % block_size);
23c0: e1a05000 mov r5, r0
const char *src = buffer;
while (remaining > 0) {
23c4: ea000021 b 2450 <bsp_section_bss_size+0x5c>
rtems_status_code sc;
rtems_bdbuf_buffer *bd;
if (block_offset == 0 && remaining >= block_size) {
23c8: e59d1000 ldr r1, [sp]
23cc: e1540001 cmp r4, r1
23d0: a3550000 cmpge r5, #0
sc = rtems_bdbuf_get(dd, block, &bd);
23d4: e1a0000b mov r0, fp
23d8: e1a01009 mov r1, r9
23dc: e28d2010 add r2, sp, #16
while (remaining > 0) {
rtems_status_code sc;
rtems_bdbuf_buffer *bd;
if (block_offset == 0 && remaining >= block_size) {
23e0: 1a000001 bne 23ec <rtems_blkdev_imfs_write+0x90>
sc = rtems_bdbuf_get(dd, block, &bd);
23e4: eb002bf6 bl d3c4 <rtems_bdbuf_get>
23e8: ea000000 b 23f0 <rtems_blkdev_imfs_write+0x94>
} else {
sc = rtems_bdbuf_read(dd, block, &bd);
23ec: eb002c25 bl d488 <rtems_bdbuf_read>
}
if (sc == RTEMS_SUCCESSFUL) {
23f0: e3500000 cmp r0, #0
rtems_bdbuf_buffer *bd;
if (block_offset == 0 && remaining >= block_size) {
sc = rtems_bdbuf_get(dd, block, &bd);
} else {
sc = rtems_bdbuf_read(dd, block, &bd);
23f4: e1a08000 mov r8, r0
}
if (sc == RTEMS_SUCCESSFUL) {
23f8: 1a00001e bne 2478 <bsp_section_bss_size+0x84>
ssize_t copy = block_size - block_offset;
23fc: e59d3000 ldr r3, [sp]
2400: e065a003 rsb sl, r5, r3
if (copy > remaining) {
copy = remaining;
}
memcpy((char *) bd->buffer + block_offset, src, (size_t) copy);
2404: e59d3010 ldr r3, [sp, #16]
2408: e593001c ldr r0, [r3, #28]
} else {
sc = rtems_bdbuf_read(dd, block, &bd);
}
if (sc == RTEMS_SUCCESSFUL) {
ssize_t copy = block_size - block_offset;
240c: e15a0004 cmp sl, r4
2410: a1a0a004 movge sl, r4
if (copy > remaining) {
copy = remaining;
}
memcpy((char *) bd->buffer + block_offset, src, (size_t) copy);
2414: e1a01007 mov r1, r7
2418: e1a0200a mov r2, sl
241c: e0800005 add r0, r0, r5
2420: eb00406e bl 125e0 <memcpy>
sc = rtems_bdbuf_release_modified(bd);
2424: e59d0010 ldr r0, [sp, #16]
2428: eb002cb9 bl d714 <rtems_bdbuf_release_modified>
if (sc == RTEMS_SUCCESSFUL) {
242c: e3500000 cmp r0, #0
block_offset = 0;
remaining -= copy;
2430: 006a4004 rsbeq r4, sl, r4
src += copy;
2434: 0087700a addeq r7, r7, sl
++block;
2438: 02899001 addeq r9, r9, #1
memcpy((char *) bd->buffer + block_offset, src, (size_t) copy);
sc = rtems_bdbuf_release_modified(bd);
if (sc == RTEMS_SUCCESSFUL) {
block_offset = 0;
243c: 01a05008 moveq r5, r8
2440: 0a000002 beq 2450 <bsp_section_bss_size+0x5c>
remaining -= copy;
src += copy;
++block;
} else {
remaining = -1;
2444: e3e04000 mvn r4, #0 <== NOT EXECUTED
2448: e3540000 cmp r4, #0 <== NOT EXECUTED
244c: ea000001 b 2458 <bsp_section_bss_size+0x64> <== NOT EXECUTED
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
ssize_t block_offset = (ssize_t) (offset % block_size);
const char *src = buffer;
while (remaining > 0) {
2450: e3540000 cmp r4, #0
2454: caffffdb bgt 23c8 <rtems_blkdev_imfs_write+0x6c>
} else {
remaining = -1;
}
}
if (remaining >= 0) {
2458: 1a000006 bne 2478 <bsp_section_bss_size+0x84>
iop->offset += count;
245c: e996000c ldmib r6, {r2, r3}
2460: e59d4004 ldr r4, [sp, #4]
2464: e0922004 adds r2, r2, r4
2468: e2a33000 adc r3, r3, #0
246c: e986000c stmib r6, {r2, r3}
rv = (ssize_t) count;
2470: e1a00004 mov r0, r4
2474: ea000003 b 2488 <bsp_section_bss_size+0x94>
} else {
errno = EIO;
2478: eb003df1 bl 11c44 <__errno> <== NOT EXECUTED
247c: e3a03005 mov r3, #5 <== NOT EXECUTED
2480: e5803000 str r3, [r0] <== NOT EXECUTED
rv = -1;
2484: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return rv;
}
2488: e28dd014 add sp, sp, #20
248c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000d138 <rtems_blkdev_ioctl>:
rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
{
rtems_status_code sc;
int rc = 0;
switch (req)
d138: e59fc108 ldr ip, [pc, #264] ; d248 <rtems_blkdev_ioctl+0x110>
d13c: e151000c cmp r1, ip
#include <rtems/blkdev.h>
#include <rtems/bdbuf.h>
int
rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
{
d140: e52de004 push {lr} ; (str lr, [sp, #-4]!)
d144: e1a03000 mov r3, r0
rtems_status_code sc;
int rc = 0;
switch (req)
d148: 0a000020 beq d1d0 <rtems_blkdev_ioctl+0x98>
d14c: 8a00000e bhi d18c <rtems_blkdev_ioctl+0x54>
d150: e59fc0f4 ldr ip, [pc, #244] ; d24c <rtems_blkdev_ioctl+0x114>
d154: e151000c cmp r1, ip
d158: 0a00002d beq d214 <rtems_blkdev_ioctl+0xdc>
d15c: 8a000003 bhi d170 <rtems_blkdev_ioctl+0x38>
d160: e59f30e8 ldr r3, [pc, #232] ; d250 <rtems_blkdev_ioctl+0x118>
d164: e1510003 cmp r1, r3
d168: 1a000031 bne d234 <rtems_blkdev_ioctl+0xfc>
d16c: ea000020 b d1f4 <rtems_blkdev_ioctl+0xbc>
d170: e59fc0dc ldr ip, [pc, #220] ; d254 <rtems_blkdev_ioctl+0x11c>
d174: e151000c cmp r1, ip
d178: 0a00002a beq d228 <rtems_blkdev_ioctl+0xf0>
d17c: e59f00d4 ldr r0, [pc, #212] ; d258 <rtems_blkdev_ioctl+0x120>
d180: e1510000 cmp r1, r0
d184: 1a00002a bne d234 <rtems_blkdev_ioctl+0xfc>
d188: ea00000e b d1c8 <rtems_blkdev_ioctl+0x90>
d18c: e59fc0c8 ldr ip, [pc, #200] ; d25c <rtems_blkdev_ioctl+0x124>
d190: e151000c cmp r1, ip
d194: 0a00000e beq d1d4 <rtems_blkdev_ioctl+0x9c>
d198: 8a000003 bhi d1ac <rtems_blkdev_ioctl+0x74>
d19c: e59f00bc ldr r0, [pc, #188] ; d260 <rtems_blkdev_ioctl+0x128>
d1a0: e1510000 cmp r1, r0
d1a4: 1a000022 bne d234 <rtems_blkdev_ioctl+0xfc>
d1a8: ea00000f b d1ec <rtems_blkdev_ioctl+0xb4>
d1ac: e59f30b0 ldr r3, [pc, #176] ; d264 <rtems_blkdev_ioctl+0x12c>
d1b0: e1510003 cmp r1, r3
d1b4: 0a000018 beq d21c <rtems_blkdev_ioctl+0xe4>
d1b8: e243311f sub r3, r3, #-1073741817 ; 0xc0000007
d1bc: e1510003 cmp r1, r3
d1c0: 1a00001b bne d234 <rtems_blkdev_ioctl+0xfc>
d1c4: ea000004 b d1dc <rtems_blkdev_ioctl+0xa4>
{
case RTEMS_BLKIO_GETMEDIABLKSIZE:
*(uint32_t *) argp = dd->media_block_size;
d1c8: e5933020 ldr r3, [r3, #32]
d1cc: ea000000 b d1d4 <rtems_blkdev_ioctl+0x9c>
break;
case RTEMS_BLKIO_GETBLKSIZE:
*(uint32_t *) argp = dd->block_size;
d1d0: e5903024 ldr r3, [r0, #36] ; 0x24
d1d4: e5823000 str r3, [r2]
d1d8: ea000013 b d22c <rtems_blkdev_ioctl+0xf4>
break;
case RTEMS_BLKIO_SETBLKSIZE:
sc = rtems_bdbuf_set_block_size(dd, *(uint32_t *) argp, true);
d1dc: e5921000 ldr r1, [r2]
d1e0: e3a02001 mov r2, #1
d1e4: ebffff85 bl d000 <rtems_bdbuf_set_block_size>
d1e8: ea000002 b d1f8 <rtems_blkdev_ioctl+0xc0>
rc = -1;
}
break;
case RTEMS_BLKIO_GETSIZE:
*(rtems_blkdev_bnum *) argp = dd->size;
d1ec: e593301c ldr r3, [r3, #28]
d1f0: eafffff7 b d1d4 <rtems_blkdev_ioctl+0x9c>
break;
case RTEMS_BLKIO_SYNCDEV:
sc = rtems_bdbuf_syncdev(dd);
d1f4: ebfffefc bl cdec <rtems_bdbuf_syncdev>
if (sc != RTEMS_SUCCESSFUL) {
d1f8: e3500000 cmp r0, #0
d1fc: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
errno = EIO;
d200: eb00111c bl 11678 <__errno> <== NOT EXECUTED
d204: e3a03005 mov r3, #5 <== NOT EXECUTED
d208: e5803000 str r3, [r0] <== NOT EXECUTED
rc = -1;
d20c: e3e00000 mvn r0, #0 <== NOT EXECUTED
d210: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
case RTEMS_BLKIO_GETDISKDEV:
*(rtems_disk_device **) argp = dd;
break;
case RTEMS_BLKIO_PURGEDEV:
rtems_bdbuf_purge_dev(dd);
d214: ebffff05 bl ce30 <rtems_bdbuf_purge_dev>
d218: ea000003 b d22c <rtems_blkdev_ioctl+0xf4>
break;
case RTEMS_BLKIO_GETDEVSTATS:
rtems_bdbuf_get_device_stats(dd, (rtems_blkdev_stats *) argp);
d21c: e1a01002 mov r1, r2
d220: ebffffaf bl d0e4 <rtems_bdbuf_get_device_stats>
d224: ea000000 b d22c <rtems_blkdev_ioctl+0xf4>
break;
case RTEMS_BLKIO_RESETDEVSTATS:
rtems_bdbuf_reset_device_stats(dd);
d228: ebffffb9 bl d114 <rtems_bdbuf_reset_device_stats>
int
rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
{
rtems_status_code sc;
int rc = 0;
d22c: e3a00000 mov r0, #0
rtems_bdbuf_get_device_stats(dd, (rtems_blkdev_stats *) argp);
break;
case RTEMS_BLKIO_RESETDEVSTATS:
rtems_bdbuf_reset_device_stats(dd);
break;
d230: e49df004 pop {pc} ; (ldr pc, [sp], #4)
default:
errno = EINVAL;
d234: eb00110f bl 11678 <__errno>
d238: e3a03016 mov r3, #22
d23c: e5803000 str r3, [r0]
rc = -1;
d240: e3e00000 mvn r0, #0
break;
}
return rc;
}
d244: e49df004 pop {pc} ; (ldr pc, [sp], #4)
0001ed10 <rtems_blkstats>:
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
void rtems_blkstats(FILE *output, const char *device, bool reset)
{
1ed10: e92d4070 push {r4, r5, r6, lr} <== NOT EXECUTED
1ed14: e1a04000 mov r4, r0 <== NOT EXECUTED
1ed18: e24dd068 sub sp, sp, #104 ; 0x68 <== NOT EXECUTED
int fd = open(device, O_RDONLY);
1ed1c: e1a00001 mov r0, r1 <== NOT EXECUTED
1ed20: e3a01000 mov r1, #0 <== NOT EXECUTED
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
void rtems_blkstats(FILE *output, const char *device, bool reset)
{
1ed24: e20260ff and r6, r2, #255 ; 0xff <== NOT EXECUTED
int fd = open(device, O_RDONLY);
1ed28: ebff9284 bl 3740 <open> <== NOT EXECUTED
if (fd >= 0) {
1ed2c: e2505000 subs r5, r0, #0 <== NOT EXECUTED
1ed30: ba00003c blt 1ee28 <rtems_blkstats+0x118> <== NOT EXECUTED
struct stat st;
int rv;
rv = fstat(fd, &st);
1ed34: e1a0100d mov r1, sp <== NOT EXECUTED
1ed38: eb000628 bl 205e0 <fstat> <== NOT EXECUTED
if (rv == 0) {
1ed3c: e3500000 cmp r0, #0 <== NOT EXECUTED
1ed40: 1a000026 bne 1ede0 <rtems_blkstats+0xd0> <== NOT EXECUTED
if (S_ISBLK(st.st_mode)) {
1ed44: e59d300c ldr r3, [sp, #12] <== NOT EXECUTED
1ed48: e2033a0f and r3, r3, #61440 ; 0xf000 <== NOT EXECUTED
1ed4c: e3530a06 cmp r3, #24576 ; 0x6000 <== NOT EXECUTED
1ed50: 1a00001e bne 1edd0 <rtems_blkstats+0xc0> <== NOT EXECUTED
if (reset) {
1ed54: e3560000 cmp r6, #0 <== NOT EXECUTED
return ioctl(fd, RTEMS_BLKIO_GETDEVSTATS, stats);
}
static inline int rtems_disk_fd_reset_device_stats(int fd)
{
return ioctl(fd, RTEMS_BLKIO_RESETDEVSTATS);
1ed58: e1a00005 mov r0, r5 <== NOT EXECUTED
1ed5c: 0a00000a beq 1ed8c <rtems_blkstats+0x7c> <== NOT EXECUTED
1ed60: e59f10e4 ldr r1, [pc, #228] ; 1ee4c <rtems_blkstats+0x13c> <== NOT EXECUTED
1ed64: eb0008ab bl 21018 <ioctl> <== NOT EXECUTED
rv = rtems_disk_fd_reset_device_stats(fd);
if (rv != 0) {
1ed68: e3500000 cmp r0, #0 <== NOT EXECUTED
1ed6c: 0a000022 beq 1edfc <rtems_blkstats+0xec> <== NOT EXECUTED
fprintf(output, "error: reset stats: %s\n", strerror(errno));
1ed70: eb004ad5 bl 318cc <__errno> <== NOT EXECUTED
1ed74: e5900000 ldr r0, [r0] <== NOT EXECUTED
1ed78: eb006624 bl 38610 <strerror> <== NOT EXECUTED
1ed7c: e59f10cc ldr r1, [pc, #204] ; 1ee50 <rtems_blkstats+0x140> <== NOT EXECUTED
1ed80: e1a02000 mov r2, r0 <== NOT EXECUTED
1ed84: e1a00004 mov r0, r4 <== NOT EXECUTED
1ed88: ea00001a b 1edf8 <rtems_blkstats+0xe8> <== NOT EXECUTED
static inline int rtems_disk_fd_get_device_stats(
int fd,
rtems_blkdev_stats *stats
)
{
return ioctl(fd, RTEMS_BLKIO_GETDEVSTATS, stats);
1ed8c: e59f10c0 ldr r1, [pc, #192] ; 1ee54 <rtems_blkstats+0x144> <== NOT EXECUTED
1ed90: e28d2048 add r2, sp, #72 ; 0x48 <== NOT EXECUTED
1ed94: eb00089f bl 21018 <ioctl> <== NOT EXECUTED
}
} else {
rtems_blkdev_stats stats;
rv = rtems_disk_fd_get_device_stats(fd, &stats);
if (rv == 0) {
1ed98: e3500000 cmp r0, #0 <== NOT EXECUTED
1ed9c: 1a000004 bne 1edb4 <rtems_blkstats+0xa4> <== NOT EXECUTED
rtems_blkdev_print_stats(
1eda0: e28d0048 add r0, sp, #72 ; 0x48 <== NOT EXECUTED
1eda4: e59f10ac ldr r1, [pc, #172] ; 1ee58 <rtems_blkstats+0x148> <== NOT EXECUTED
1eda8: e1a02004 mov r2, r4 <== NOT EXECUTED
1edac: eb00002f bl 1ee70 <rtems_blkdev_print_stats> <== NOT EXECUTED
1edb0: ea000011 b 1edfc <rtems_blkstats+0xec> <== NOT EXECUTED
&stats,
(rtems_printk_plugin_t) fprintf,
output
);
} else {
fprintf(output, "error: get stats: %s\n", strerror(errno));
1edb4: eb004ac4 bl 318cc <__errno> <== NOT EXECUTED
1edb8: e5900000 ldr r0, [r0] <== NOT EXECUTED
1edbc: eb006613 bl 38610 <strerror> <== NOT EXECUTED
1edc0: e59f1094 ldr r1, [pc, #148] ; 1ee5c <rtems_blkstats+0x14c> <== NOT EXECUTED
1edc4: e1a02000 mov r2, r0 <== NOT EXECUTED
1edc8: e1a00004 mov r0, r4 <== NOT EXECUTED
1edcc: ea000009 b 1edf8 <rtems_blkstats+0xe8> <== NOT EXECUTED
}
}
} else {
fprintf(output, "error: not a block device\n");
1edd0: e1a01004 mov r1, r4 <== NOT EXECUTED
1edd4: e59f0084 ldr r0, [pc, #132] ; 1ee60 <rtems_blkstats+0x150> <== NOT EXECUTED
1edd8: eb004db8 bl 324c0 <fputs> <== NOT EXECUTED
1eddc: ea000006 b 1edfc <rtems_blkstats+0xec> <== NOT EXECUTED
}
} else {
fprintf(output, "error: get file stats: %s\n", strerror(errno));
1ede0: eb004ab9 bl 318cc <__errno> <== NOT EXECUTED
1ede4: e5900000 ldr r0, [r0] <== NOT EXECUTED
1ede8: eb006608 bl 38610 <strerror> <== NOT EXECUTED
1edec: e59f1070 ldr r1, [pc, #112] ; 1ee64 <rtems_blkstats+0x154> <== NOT EXECUTED
1edf0: e1a02000 mov r2, r0 <== NOT EXECUTED
1edf4: e1a00004 mov r0, r4 <== NOT EXECUTED
1edf8: eb004d5b bl 3236c <fprintf> <== NOT EXECUTED
}
rv = close(fd);
1edfc: e1a00005 mov r0, r5 <== NOT EXECUTED
1ee00: eb00057e bl 20400 <close> <== NOT EXECUTED
if (rv != 0) {
1ee04: e3500000 cmp r0, #0 <== NOT EXECUTED
1ee08: 0a00000d beq 1ee44 <rtems_blkstats+0x134> <== NOT EXECUTED
fprintf(output, "error: close device: %s\n", strerror(errno));
1ee0c: eb004aae bl 318cc <__errno> <== NOT EXECUTED
1ee10: e5900000 ldr r0, [r0] <== NOT EXECUTED
1ee14: eb0065fd bl 38610 <strerror> <== NOT EXECUTED
1ee18: e59f1048 ldr r1, [pc, #72] ; 1ee68 <rtems_blkstats+0x158> <== NOT EXECUTED
1ee1c: e1a02000 mov r2, r0 <== NOT EXECUTED
1ee20: e1a00004 mov r0, r4 <== NOT EXECUTED
1ee24: ea000005 b 1ee40 <rtems_blkstats+0x130> <== NOT EXECUTED
}
} else {
fprintf(output, "error: open device: %s\n", strerror(errno));
1ee28: eb004aa7 bl 318cc <__errno> <== NOT EXECUTED
1ee2c: e5900000 ldr r0, [r0] <== NOT EXECUTED
1ee30: eb0065f6 bl 38610 <strerror> <== NOT EXECUTED
1ee34: e59f1030 ldr r1, [pc, #48] ; 1ee6c <rtems_blkstats+0x15c> <== NOT EXECUTED
1ee38: e1a02000 mov r2, r0 <== NOT EXECUTED
1ee3c: e1a00004 mov r0, r4 <== NOT EXECUTED
1ee40: eb004d49 bl 3236c <fprintf> <== NOT EXECUTED
}
}
1ee44: e28dd068 add sp, sp, #104 ; 0x68 <== NOT EXECUTED
1ee48: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
000026a4 <rtems_cpu_usage_report_with_plugin>:
*/
void rtems_cpu_usage_report_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
26a4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
uint32_t seconds, nanoseconds;
#else
uint32_t total_units = 0;
#endif
if ( !print )
26a8: e251a000 subs sl, r1, #0
*/
void rtems_cpu_usage_report_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
26ac: e24dd048 sub sp, sp, #72 ; 0x48
26b0: e1a0b000 mov fp, r0
uint32_t seconds, nanoseconds;
#else
uint32_t total_units = 0;
#endif
if ( !print )
26b4: 0a000080 beq 28bc <rtems_cpu_usage_report_with_plugin+0x218>
static inline void _Timestamp64_implementation_Set_to_zero(
Timestamp64_Control *_time
)
{
*_time = 0;
26b8: e3a02000 mov r2, #0
26bc: e3a03000 mov r3, #0
26c0: e58d2030 str r2, [sp, #48] ; 0x30
26c4: e58d3034 str r3, [sp, #52] ; 0x34
* 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__
_Timestamp_Set_to_zero( &total );
uptime_at_last_reset = CPU_usage_Uptime_at_last_reset;
26c8: e59f31f4 ldr r3, [pc, #500] ; 28c4 <rtems_cpu_usage_report_with_plugin+0x220>
26cc: e8930006 ldm r3, {r1, r2}
26d0: e58d1010 str r1, [sp, #16]
26d4: e58d2014 str r2, [sp, #20]
}
}
}
#endif
(*print)(
26d8: e59f11e8 ldr r1, [pc, #488] ; 28c8 <rtems_cpu_usage_report_with_plugin+0x224>
26dc: e1a0e00f mov lr, pc
26e0: e12fff1a bx sl
26e4: e59f81e0 ldr r8, [pc, #480] ; 28cc <rtems_cpu_usage_report_with_plugin+0x228>
Thread_Control *the_thread,
Timestamp_Control *time_of_context_switch
)
{
#ifndef RTEMS_SMP
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
26e8: e59f91e0 ldr r9, [pc, #480] ; 28d0 <rtems_cpu_usage_report_with_plugin+0x22c>
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
26ec: e5b83004 ldr r3, [r8, #4]!
26f0: e5936004 ldr r6, [r3, #4]
if ( information ) {
26f4: e3560000 cmp r6, #0
26f8: 13a07001 movne r7, #1
26fc: 1a000053 bne 2850 <rtems_cpu_usage_report_with_plugin+0x1ac>
2700: ea000055 b 285c <rtems_cpu_usage_report_with_plugin+0x1b8> <== NOT EXECUTED
for ( i=1 ; i <= information->maximum ; i++ ) {
the_thread = (Thread_Control *)information->local_table[ i ];
2704: e596301c ldr r3, [r6, #28]
2708: e7934107 ldr r4, [r3, r7, lsl #2]
if ( !the_thread )
270c: e3540000 cmp r4, #0
2710: 0a00004d beq 284c <rtems_cpu_usage_report_with_plugin+0x1a8>
continue;
rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
2714: e3a0100d mov r1, #13
2718: e28d2018 add r2, sp, #24
271c: e5940008 ldr r0, [r4, #8]
2720: eb00121b bl 6f94 <rtems_object_get_name>
(*print)(
2724: e5942008 ldr r2, [r4, #8]
2728: e28d3018 add r3, sp, #24
272c: e1a0000b mov r0, fp
2730: e59f119c ldr r1, [pc, #412] ; 28d4 <rtems_cpu_usage_report_with_plugin+0x230>
2734: e1a0e00f mov lr, pc
2738: e12fff1a bx sl
/*
* If this is the currently executing thread, account for time
* since the last context switch.
*/
ran = the_thread->cpu_time_used;
273c: e2843080 add r3, r4, #128 ; 0x80
2740: e893000c ldm r3, {r2, r3}
2744: e58d2038 str r2, [sp, #56] ; 0x38
2748: e58d303c str r3, [sp, #60] ; 0x3c
Thread_Control *the_thread,
Timestamp_Control *time_of_context_switch
)
{
#ifndef RTEMS_SMP
if ( _Thread_Executing->Object.id == the_thread->Object.id ) {
274c: e5993008 ldr r3, [r9, #8]
2750: e5932008 ldr r2, [r3, #8]
2754: e5943008 ldr r3, [r4, #8]
2758: e1520003 cmp r2, r3
275c: 1a00000f bne 27a0 <rtems_cpu_usage_report_with_plugin+0xfc>
*/
static inline void _TOD_Get_uptime(
Timestamp_Control *time
)
{
_TOD_Get_with_nanoseconds( time, &_TOD.uptime );
2760: e59f1170 ldr r1, [pc, #368] ; 28d8 <rtems_cpu_usage_report_with_plugin+0x234>
2764: e28d0028 add r0, sp, #40 ; 0x28
*time_of_context_switch = _Thread_Time_of_last_context_switch;
2768: e2895014 add r5, r9, #20
276c: e8950030 ldm r5, {r4, r5}
2770: eb0016c3 bl 8284 <_TOD_Get_with_nanoseconds>
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
2774: e28d1028 add r1, sp, #40 ; 0x28
2778: e8910003 ldm r1, {r0, r1}
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
277c: e28d3038 add r3, sp, #56 ; 0x38
2780: e893000c ldm r3, {r2, r3}
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
2784: e0500004 subs r0, r0, r4
2788: e0c11005 sbc r1, r1, r5
static inline void _Timestamp64_implementation_Add_to(
Timestamp64_Control *_time,
const Timestamp64_Control *_add
)
{
*_time += *_add;
278c: e0922000 adds r2, r2, r0
2790: e0a33001 adc r3, r3, r1
2794: e58d2038 str r2, [sp, #56] ; 0x38
2798: e58d303c str r3, [sp, #60] ; 0x3c
279c: ea000002 b 27ac <rtems_cpu_usage_report_with_plugin+0x108>
27a0: e28d0028 add r0, sp, #40 ; 0x28
27a4: e59f112c ldr r1, [pc, #300] ; 28d8 <rtems_cpu_usage_report_with_plugin+0x234>
27a8: eb0016b5 bl 8284 <_TOD_Get_with_nanoseconds>
const Timestamp64_Control *_start,
const Timestamp64_Control *_end,
Timestamp64_Control *_result
)
{
*_result = *_end - *_start;
27ac: e28d1010 add r1, sp, #16
27b0: e8910003 ldm r1, {r0, r1}
27b4: e28d3028 add r3, sp, #40 ; 0x28
27b8: e893000c ldm r3, {r2, r3}
27bc: e0522000 subs r2, r2, r0
27c0: e0c33001 sbc r3, r3, r1
27c4: e58d2030 str r2, [sp, #48] ; 0x30
27c8: e58d3034 str r3, [sp, #52] ; 0x34
_Timestamp_Add_to( &ran, &used );
} else {
_TOD_Get_uptime( &uptime );
}
_Timestamp_Subtract( &uptime_at_last_reset, &uptime, &total );
_Timestamp_Divide( &ran, &total, &ival, &fval );
27cc: e28d0038 add r0, sp, #56 ; 0x38
27d0: e28d1030 add r1, sp, #48 ; 0x30
27d4: e28d2040 add r2, sp, #64 ; 0x40
27d8: e28d3044 add r3, sp, #68 ; 0x44
27dc: eb001f82 bl a5ec <_Timestamp64_Divide>
/*
* Print the information
*/
seconds = _Timestamp_Get_seconds( &ran );
27e0: e28d2038 add r2, sp, #56 ; 0x38
27e4: e8920006 ldm r2, {r1, r2}
static inline uint32_t _Timestamp64_implementation_Get_seconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time / 1000000000L);
27e8: e3a03000 mov r3, #0
27ec: e58d1008 str r1, [sp, #8]
27f0: e58d200c str r2, [sp, #12]
27f4: e1a00001 mov r0, r1
27f8: e1a01002 mov r1, r2
27fc: e59f20d8 ldr r2, [pc, #216] ; 28dc <rtems_cpu_usage_report_with_plugin+0x238>
2800: eb005a58 bl 19168 <__divdi3>
static inline uint32_t _Timestamp64_implementation_Get_nanoseconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time % 1000000000L);
2804: e59f20d0 ldr r2, [pc, #208] ; 28dc <rtems_cpu_usage_report_with_plugin+0x238>
2808: e3a03000 mov r3, #0
static inline uint32_t _Timestamp64_implementation_Get_seconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time / 1000000000L);
280c: e1a04000 mov r4, r0
static inline uint32_t _Timestamp64_implementation_Get_nanoseconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time % 1000000000L);
2810: e28d1008 add r1, sp, #8
2814: e8910003 ldm r1, {r0, r1}
2818: eb005b8d bl 19654 <__moddi3>
nanoseconds = _Timestamp_Get_nanoseconds( &ran ) /
281c: e3a01ffa mov r1, #1000 ; 0x3e8
2820: eb00575d bl 1859c <__aeabi_uidiv>
TOD_NANOSECONDS_PER_MICROSECOND;
(*print)( context,
2824: e59d2040 ldr r2, [sp, #64] ; 0x40
2828: e58d2000 str r2, [sp]
282c: e59d2044 ldr r2, [sp, #68] ; 0x44
/*
* Print the information
*/
seconds = _Timestamp_Get_seconds( &ran );
nanoseconds = _Timestamp_Get_nanoseconds( &ran ) /
2830: e1a03000 mov r3, r0
TOD_NANOSECONDS_PER_MICROSECOND;
(*print)( context,
2834: e58d2004 str r2, [sp, #4]
2838: e1a0000b mov r0, fp
283c: e59f109c ldr r1, [pc, #156] ; 28e0 <rtems_cpu_usage_report_with_plugin+0x23c>
2840: e1a02004 mov r2, r4
2844: e1a0e00f mov lr, pc
2848: e12fff1a bx sl
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
if ( information ) {
for ( i=1 ; i <= information->maximum ; i++ ) {
284c: e2877001 add r7, r7, #1
2850: e1d631b0 ldrh r3, [r6, #16]
2854: e1570003 cmp r7, r3
2858: 9affffa9 bls 2704 <rtems_cpu_usage_report_with_plugin+0x60>
" ID | NAME | TICKS | PERCENT\n"
#endif
"------------+----------------------------------------+---------------+---------\n"
);
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
285c: e59f2080 ldr r2, [pc, #128] ; 28e4 <rtems_cpu_usage_report_with_plugin+0x240>
2860: e1580002 cmp r8, r2
2864: 1affffa0 bne 26ec <rtems_cpu_usage_report_with_plugin+0x48>
}
}
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
seconds = _Timestamp_Get_seconds( &total );
2868: e28d7030 add r7, sp, #48 ; 0x30
286c: e89700c0 ldm r7, {r6, r7}
static inline uint32_t _Timestamp64_implementation_Get_seconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time / 1000000000L);
2870: e59f2064 ldr r2, [pc, #100] ; 28dc <rtems_cpu_usage_report_with_plugin+0x238>
2874: e3a03000 mov r3, #0
2878: e1a00006 mov r0, r6
287c: e1a01007 mov r1, r7
2880: eb005a38 bl 19168 <__divdi3>
static inline uint32_t _Timestamp64_implementation_Get_nanoseconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time % 1000000000L);
2884: e59f2050 ldr r2, [pc, #80] ; 28dc <rtems_cpu_usage_report_with_plugin+0x238>
2888: e3a03000 mov r3, #0
static inline uint32_t _Timestamp64_implementation_Get_seconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time / 1000000000L);
288c: e1a04000 mov r4, r0
static inline uint32_t _Timestamp64_implementation_Get_nanoseconds(
const Timestamp64_Control *_time
)
{
return (uint32_t) (*_time % 1000000000L);
2890: e1a01007 mov r1, r7
2894: e1a00006 mov r0, r6
2898: eb005b6d bl 19654 <__moddi3>
nanoseconds = _Timestamp_Get_nanoseconds( &total ) /
289c: e3a01ffa mov r1, #1000 ; 0x3e8
28a0: eb00573d bl 1859c <__aeabi_uidiv>
TOD_NANOSECONDS_PER_MICROSECOND;
(*print)(
28a4: e59f103c ldr r1, [pc, #60] ; 28e8 <rtems_cpu_usage_report_with_plugin+0x244>
}
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
seconds = _Timestamp_Get_seconds( &total );
nanoseconds = _Timestamp_Get_nanoseconds( &total ) /
28a8: e1a03000 mov r3, r0
TOD_NANOSECONDS_PER_MICROSECOND;
(*print)(
28ac: e1a02004 mov r2, r4
28b0: e1a0000b mov r0, fp
28b4: e1a0e00f mov lr, pc
28b8: e12fff1a bx sl
"-------------------------------------------------------------------------------\n",
_Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset,
total_units
);
#endif
}
28bc: e28dd048 add sp, sp, #72 ; 0x48
28c0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00002518 <rtems_disk_delete>:
}
}
rtems_status_code
rtems_disk_delete(dev_t dev)
{
2518: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
251c: e24dd014 sub sp, sp, #20
2520: e1a04000 mov r4, r0
2524: e1a05001 mov r5, r1
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_disk_device *dd = NULL;
sc = disk_lock();
2528: ebffff82 bl 2338 <disk_lock>
if (sc != RTEMS_SUCCESSFUL) {
252c: e2508000 subs r8, r0, #0
2530: 1a000059 bne 269c <rtems_disk_delete+0x184>
return sc;
}
dd = get_disk_entry(dev, true);
2534: e1a00004 mov r0, r4
2538: e1a01005 mov r1, r5
253c: e3a02001 mov r2, #1
2540: ebffff48 bl 2268 <get_disk_entry>
if (dd == NULL) {
2544: e2503000 subs r3, r0, #0
2548: 1a000002 bne 2558 <rtems_disk_delete+0x40>
disk_unlock();
254c: ebffff85 bl 2368 <disk_unlock> <== NOT EXECUTED
return RTEMS_INVALID_ID;
2550: e3a08004 mov r8, #4 <== NOT EXECUTED
2554: ea000050 b 269c <rtems_disk_delete+0x184> <== NOT EXECUTED
}
dd->deleted = true;
2558: e3a0b001 mov fp, #1
255c: e5c3b040 strb fp, [r3, #64] ; 0x40
}
static void
rtems_disk_cleanup(rtems_disk_device *disk_to_remove)
{
rtems_disk_device *const physical_disk = disk_to_remove->phys_dev;
2560: e5934008 ldr r4, [r3, #8]
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
if (physical_disk->deleted) {
2564: e5d42040 ldrb r2, [r4, #64] ; 0x40
2568: e3520000 cmp r2, #0
256c: 0a00003d beq 2668 <rtems_disk_delete+0x150>
dev_t dev = physical_disk->dev;
2570: e894000c ldm r4, {r2, r3}
unsigned deleted_count = 0;
2574: e1a09008 mov r9, r8
rtems_disk_device *const physical_disk = disk_to_remove->phys_dev;
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
if (physical_disk->deleted) {
dev_t dev = physical_disk->dev;
2578: e58d200c str r2, [sp, #12]
257c: e58d3010 str r3, [sp, #16]
unsigned deleted_count = 0;
for (major = 0; major < disktab_size; ++major) {
2580: e1a06008 mov r6, r8
2584: e59f711c ldr r7, [pc, #284] ; 26a8 <rtems_disk_delete+0x190>
2588: e1a0a008 mov sl, r8
258c: e1a05004 mov r5, r4
2590: ea000023 b 2624 <rtems_disk_delete+0x10c>
rtems_disk_device_table *dtab = disktab + major;
2594: e5978004 ldr r8, [r7, #4]
for (minor = 0; minor < dtab->size; ++minor) {
2598: e3a04000 mov r4, #0
if (physical_disk->deleted) {
dev_t dev = physical_disk->dev;
unsigned deleted_count = 0;
for (major = 0; major < disktab_size; ++major) {
rtems_disk_device_table *dtab = disktab + major;
259c: e0888186 add r8, r8, r6, lsl #3
25a0: e58da000 str sl, [sp]
25a4: ea000019 b 2610 <rtems_disk_delete+0xf8>
for (minor = 0; minor < dtab->size; ++minor) {
rtems_disk_device *dd = dtab->minor [minor];
25a8: e5981000 ldr r1, [r8]
25ac: e7910104 ldr r0, [r1, r4, lsl #2]
if (dd != NULL && dd->phys_dev->dev == dev && dd != physical_disk) {
25b0: e3500000 cmp r0, #0
for (major = 0; major < disktab_size; ++major) {
rtems_disk_device_table *dtab = disktab + major;
for (minor = 0; minor < dtab->size; ++minor) {
rtems_disk_device *dd = dtab->minor [minor];
25b4: e1a0c104 lsl ip, r4, #2
if (dd != NULL && dd->phys_dev->dev == dev && dd != physical_disk) {
25b8: 0a000013 beq 260c <rtems_disk_delete+0xf4>
25bc: e590e008 ldr lr, [r0, #8]
25c0: e28d300c add r3, sp, #12
25c4: e893000c ldm r3, {r2, r3}
25c8: e89e0c00 ldm lr, {sl, fp}
25cc: e15b0003 cmp fp, r3
25d0: 015a0002 cmpeq sl, r2
25d4: 13a03000 movne r3, #0
25d8: 03a03001 moveq r3, #1
25dc: e1500005 cmp r0, r5
25e0: 03a03000 moveq r3, #0
25e4: 12033001 andne r3, r3, #1
25e8: e3530000 cmp r3, #0
25ec: 0a000006 beq 260c <rtems_disk_delete+0xf4>
if (dd->uses == 0) {
25f0: e5903014 ldr r3, [r0, #20]
25f4: e3530000 cmp r3, #0
++deleted_count;
dtab->minor [minor] = NULL;
free_disk_device(dd);
} else {
dd->deleted = true;
25f8: 13a03001 movne r3, #1
25fc: 15c03040 strbne r3, [r0, #64] ; 0x40
rtems_disk_device *dd = dtab->minor [minor];
if (dd != NULL && dd->phys_dev->dev == dev && dd != physical_disk) {
if (dd->uses == 0) {
++deleted_count;
dtab->minor [minor] = NULL;
2600: 0781300c streq r3, [r1, ip]
for (minor = 0; minor < dtab->size; ++minor) {
rtems_disk_device *dd = dtab->minor [minor];
if (dd != NULL && dd->phys_dev->dev == dev && dd != physical_disk) {
if (dd->uses == 0) {
++deleted_count;
2604: 02899001 addeq r9, r9, #1
dtab->minor [minor] = NULL;
free_disk_device(dd);
2608: 0bffff38 bleq 22f0 <free_disk_device>
unsigned deleted_count = 0;
for (major = 0; major < disktab_size; ++major) {
rtems_disk_device_table *dtab = disktab + major;
for (minor = 0; minor < dtab->size; ++minor) {
260c: e2844001 add r4, r4, #1
2610: e5983004 ldr r3, [r8, #4]
2614: e1540003 cmp r4, r3
2618: 3affffe2 bcc 25a8 <rtems_disk_delete+0x90>
261c: e59da000 ldr sl, [sp]
if (physical_disk->deleted) {
dev_t dev = physical_disk->dev;
unsigned deleted_count = 0;
for (major = 0; major < disktab_size; ++major) {
2620: e2866001 add r6, r6, #1
2624: e5973000 ldr r3, [r7]
2628: e1560003 cmp r6, r3
262c: 3affffd8 bcc 2594 <rtems_disk_delete+0x7c>
}
}
}
}
physical_disk->uses -= deleted_count;
2630: e5953014 ldr r3, [r5, #20]
2634: e0699003 rsb r9, r9, r3
if (physical_disk->uses == 0) {
2638: e3590000 cmp r9, #0
263c: e1a0800a mov r8, sl
2640: e1a04005 mov r4, r5
}
}
}
}
physical_disk->uses -= deleted_count;
2644: e5859014 str r9, [r5, #20]
if (physical_disk->uses == 0) {
2648: 1a000012 bne 2698 <rtems_disk_delete+0x180>
rtems_filesystem_split_dev_t(physical_disk->dev, major, minor);
disktab [major].minor [minor] = NULL;
264c: e59f3054 ldr r3, [pc, #84] ; 26a8 <rtems_disk_delete+0x190>
}
}
physical_disk->uses -= deleted_count;
if (physical_disk->uses == 0) {
rtems_filesystem_split_dev_t(physical_disk->dev, major, minor);
2650: e8950006 ldm r5, {r1, r2}
disktab [major].minor [minor] = NULL;
2654: e5933004 ldr r3, [r3, #4]
2658: e7933181 ldr r3, [r3, r1, lsl #3]
free_disk_device(physical_disk);
265c: e1a00005 mov r0, r5
}
physical_disk->uses -= deleted_count;
if (physical_disk->uses == 0) {
rtems_filesystem_split_dev_t(physical_disk->dev, major, minor);
disktab [major].minor [minor] = NULL;
2660: e7839102 str r9, [r3, r2, lsl #2]
2664: ea00000a b 2694 <rtems_disk_delete+0x17c>
free_disk_device(physical_disk);
}
} else {
if (disk_to_remove->uses == 0) {
2668: e5932014 ldr r2, [r3, #20]
266c: e3520000 cmp r2, #0
2670: 1a000008 bne 2698 <rtems_disk_delete+0x180>
--physical_disk->uses;
2674: e5942014 ldr r2, [r4, #20]
2678: e2422001 sub r2, r2, #1
267c: e5842014 str r2, [r4, #20]
rtems_filesystem_split_dev_t(disk_to_remove->dev, major, minor);
2680: e8930006 ldm r3, {r1, r2}
disktab [major].minor [minor] = NULL;
2684: e59f301c ldr r3, [pc, #28] ; 26a8 <rtems_disk_delete+0x190>
2688: e5933004 ldr r3, [r3, #4]
268c: e7933181 ldr r3, [r3, r1, lsl #3]
2690: e7838102 str r8, [r3, r2, lsl #2]
free_disk_device(disk_to_remove);
2694: ebffff15 bl 22f0 <free_disk_device>
}
dd->deleted = true;
rtems_disk_cleanup(dd);
disk_unlock();
2698: ebffff32 bl 2368 <disk_unlock>
return RTEMS_SUCCESSFUL;
}
269c: e1a00008 mov r0, r8
26a0: e28dd014 add sp, sp, #20
26a4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
000029c8 <rtems_disk_io_initialize>:
rtems_status_code
rtems_disk_io_initialize(void)
{
29c8: e92d4031 push {r0, r4, r5, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_device_major_number size = DISKTAB_INITIAL_SIZE;
if (disktab_size > 0) {
29cc: e59f408c ldr r4, [pc, #140] ; 2a60 <rtems_disk_io_initialize+0x98>
29d0: e5945000 ldr r5, [r4]
29d4: e3550000 cmp r5, #0
return RTEMS_SUCCESSFUL;
29d8: 13a00000 movne r0, #0
rtems_disk_io_initialize(void)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_device_major_number size = DISKTAB_INITIAL_SIZE;
if (disktab_size > 0) {
29dc: 1a00001e bne 2a5c <rtems_disk_io_initialize+0x94>
return RTEMS_SUCCESSFUL;
}
disktab = calloc(size, sizeof(rtems_disk_device_table));
29e0: e3a00008 mov r0, #8
29e4: e1a01000 mov r1, r0
29e8: eb0001dc bl 3160 <calloc>
if (disktab == NULL) {
29ec: e3500000 cmp r0, #0
if (disktab_size > 0) {
return RTEMS_SUCCESSFUL;
}
disktab = calloc(size, sizeof(rtems_disk_device_table));
29f0: e5840004 str r0, [r4, #4]
if (disktab == NULL) {
29f4: 0a000017 beq 2a58 <rtems_disk_io_initialize+0x90>
return RTEMS_NO_MEMORY;
}
diskdevs_protected = false;
sc = rtems_semaphore_create(
29f8: e2843008 add r3, r4, #8
29fc: e58d3000 str r3, [sp]
2a00: e59f005c ldr r0, [pc, #92] ; 2a64 <rtems_disk_io_initialize+0x9c>
2a04: e3a01001 mov r1, #1
2a08: e3a02010 mov r2, #16
2a0c: e1a03005 mov r3, r5
disktab = calloc(size, sizeof(rtems_disk_device_table));
if (disktab == NULL) {
return RTEMS_NO_MEMORY;
}
diskdevs_protected = false;
2a10: e5c4500c strb r5, [r4, #12]
sc = rtems_semaphore_create(
2a14: eb001187 bl 7038 <rtems_semaphore_create>
RTEMS_FIFO | RTEMS_BINARY_SEMAPHORE | RTEMS_NO_INHERIT_PRIORITY
| RTEMS_NO_PRIORITY_CEILING | RTEMS_LOCAL,
0,
&diskdevs_mutex
);
if (sc != RTEMS_SUCCESSFUL) {
2a18: e3500000 cmp r0, #0
2a1c: 0a000002 beq 2a2c <rtems_disk_io_initialize+0x64>
free(disktab);
2a20: e5940004 ldr r0, [r4, #4] <== NOT EXECUTED
2a24: eb000281 bl 3430 <free> <== NOT EXECUTED
2a28: ea00000a b 2a58 <rtems_disk_io_initialize+0x90> <== NOT EXECUTED
return RTEMS_NO_MEMORY;
}
sc = rtems_bdbuf_init();
2a2c: eb0026b1 bl c4f8 <rtems_bdbuf_init>
if (sc != RTEMS_SUCCESSFUL) {
2a30: e3500000 cmp r0, #0
free(disktab);
return RTEMS_UNSATISFIED;
}
disktab_size = size;
2a34: 03a03008 moveq r3, #8
2a38: 05843000 streq r3, [r4]
return RTEMS_NO_MEMORY;
}
sc = rtems_bdbuf_init();
if (sc != RTEMS_SUCCESSFUL) {
2a3c: 0a000006 beq 2a5c <rtems_disk_io_initialize+0x94>
rtems_semaphore_delete(diskdevs_mutex);
2a40: e5940008 ldr r0, [r4, #8] <== NOT EXECUTED
2a44: eb0011e3 bl 71d8 <rtems_semaphore_delete> <== NOT EXECUTED
free(disktab);
2a48: e5940004 ldr r0, [r4, #4] <== NOT EXECUTED
2a4c: eb000277 bl 3430 <free> <== NOT EXECUTED
return RTEMS_UNSATISFIED;
2a50: e3a0000d mov r0, #13 <== NOT EXECUTED
2a54: ea000000 b 2a5c <rtems_disk_io_initialize+0x94> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
}
disktab = calloc(size, sizeof(rtems_disk_device_table));
if (disktab == NULL) {
return RTEMS_NO_MEMORY;
2a58: e3a0001a mov r0, #26 <== NOT EXECUTED
}
disktab_size = size;
return RTEMS_SUCCESSFUL;
}
2a5c: e8bd8038 pop {r3, r4, r5, pc}
000028dc <rtems_disk_next>:
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_disk_device_table *dtab = NULL;
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
if (dev != (dev_t) -1) {
28dc: e3e02000 mvn r2, #0
28e0: e3e03000 mvn r3, #0
28e4: e1510003 cmp r1, r3
28e8: 01500002 cmpeq r0, r2
return RTEMS_SUCCESSFUL;
}
rtems_disk_device *
rtems_disk_next(dev_t dev)
{
28ec: e92d40f0 push {r4, r5, r6, r7, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_disk_device_table *dtab = NULL;
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
if (dev != (dev_t) -1) {
28f0: 0a000007 beq 2914 <rtems_disk_next+0x38>
rtems_filesystem_split_dev_t(dev, major, minor);
/* If minor wraps around */
if ((minor + 1) < minor) {
28f4: e2914001 adds r4, r1, #1
dev_t device
)
{
union __rtems_dev_t temp;
temp.device = device;
28f8: e1a05000 mov r5, r0
return temp.__overlay.major;
28fc: 31a05000 movcc r5, r0
2900: 3a000005 bcc 291c <rtems_disk_next+0x40>
/* If major wraps around */
if ((major + 1) < major) {
2904: e2955001 adds r5, r5, #1 <== NOT EXECUTED
return NULL;
}
++major;
minor = 0;
2908: 33a04000 movcc r4, #0 <== NOT EXECUTED
rtems_filesystem_split_dev_t(dev, major, minor);
/* If minor wraps around */
if ((minor + 1) < minor) {
/* If major wraps around */
if ((major + 1) < major) {
290c: 3a000002 bcc 291c <rtems_disk_next+0x40> <== NOT EXECUTED
2910: ea000027 b 29b4 <rtems_disk_next+0xd8> <== NOT EXECUTED
rtems_disk_next(dev_t dev)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_disk_device_table *dtab = NULL;
rtems_device_major_number major = 0;
rtems_device_minor_number minor = 0;
2914: e3a04000 mov r4, #0
rtems_disk_device *
rtems_disk_next(dev_t dev)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_disk_device_table *dtab = NULL;
rtems_device_major_number major = 0;
2918: e1a05004 mov r5, r4
} else {
++minor;
}
}
sc = disk_lock();
291c: ebfffe85 bl 2338 <disk_lock>
if (sc != RTEMS_SUCCESSFUL) {
2920: e2506000 subs r6, r0, #0
2924: 1a000024 bne 29bc <rtems_disk_next+0xe0>
return NULL;
}
if (major >= disktab_size) {
2928: e59f3094 ldr r3, [pc, #148] ; 29c4 <rtems_disk_next+0xe8>
292c: e5931000 ldr r1, [r3]
2930: e1550001 cmp r5, r1
disk_unlock();
return NULL;
}
dtab = disktab + major;
2934: 35932004 ldrcc r2, [r3, #4]
2938: 30826185 addcc r6, r2, r5, lsl #3
sc = disk_lock();
if (sc != RTEMS_SUCCESSFUL) {
return NULL;
}
if (major >= disktab_size) {
293c: 3a000002 bcc 294c <rtems_disk_next+0x70>
disk_unlock();
2940: ebfffe88 bl 2368 <disk_unlock> <== NOT EXECUTED
return NULL;
2944: e1a00006 mov r0, r6 <== NOT EXECUTED
2948: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
}
dtab = disktab + major;
while (true) {
if (dtab->minor == NULL || minor >= dtab->size) {
294c: e5963000 ldr r3, [r6]
2950: e3530000 cmp r3, #0
2954: 0a000002 beq 2964 <rtems_disk_next+0x88>
2958: e5960004 ldr r0, [r6, #4]
295c: e1540000 cmp r4, r0
2960: 3a000007 bcc 2984 <rtems_disk_next+0xa8>
minor = 0;
++major;
2964: e2855001 add r5, r5, #1
if (major >= disktab_size) {
2968: e1550001 cmp r5, r1
296c: 3a000001 bcc 2978 <rtems_disk_next+0x9c>
disk_unlock();
2970: ebfffe7c bl 2368 <disk_unlock>
2974: ea00000e b 29b4 <rtems_disk_next+0xd8>
return NULL;
}
dtab = disktab + major;
2978: e0826185 add r6, r2, r5, lsl #3
}
dtab = disktab + major;
while (true) {
if (dtab->minor == NULL || minor >= dtab->size) {
minor = 0;
297c: e3a04000 mov r4, #0
if (major >= disktab_size) {
disk_unlock();
return NULL;
}
dtab = disktab + major;
2980: eafffff1 b 294c <rtems_disk_next+0x70>
} else if (dtab->minor [minor] == NULL) {
2984: e7933104 ldr r3, [r3, r4, lsl #2]
2988: e3530000 cmp r3, #0
298c: e1a07104 lsl r7, r4, #2
++minor;
2990: 02844001 addeq r4, r4, #1
2994: 0affffec beq 294c <rtems_disk_next+0x70>
} else {
++dtab->minor [minor]->uses;
2998: e5932014 ldr r2, [r3, #20]
299c: e2822001 add r2, r2, #1
29a0: e5832014 str r2, [r3, #20]
disk_unlock();
29a4: ebfffe6f bl 2368 <disk_unlock>
return dtab->minor [minor];
29a8: e5963000 ldr r3, [r6]
29ac: e7930007 ldr r0, [r3, r7]
29b0: e8bd80f0 pop {r4, r5, r6, r7, pc}
/* If minor wraps around */
if ((minor + 1) < minor) {
/* If major wraps around */
if ((major + 1) < major) {
return NULL;
29b4: e3a00000 mov r0, #0
29b8: e8bd80f0 pop {r4, r5, r6, r7, pc}
}
}
sc = disk_lock();
if (sc != RTEMS_SUCCESSFUL) {
return NULL;
29bc: e3a00000 mov r0, #0 <== NOT EXECUTED
disk_unlock();
return dtab->minor [minor];
}
}
}
29c0: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
0000282c <rtems_disk_obtain>:
return RTEMS_SUCCESSFUL;
}
rtems_disk_device *
rtems_disk_obtain(dev_t dev)
{
282c: e92d40f0 push {r4, r5, r6, r7, lr}
2830: e1a06000 mov r6, r0
2834: e1a07001 mov r7, r1
uint32_t level;
#if defined(ARM_MULTILIB_ARCH_V4)
uint32_t arm_switch_reg;
__asm__ volatile (
2838: e10f4000 mrs r4, CPSR
283c: e3843080 orr r3, r4, #128 ; 0x80
2840: e129f003 msr CPSR_fc, r3
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_disk_device *dd = NULL;
rtems_interrupt_level level;
rtems_interrupt_disable(level);
if (!diskdevs_protected) {
2844: e59f3048 ldr r3, [pc, #72] ; 2894 <rtems_disk_obtain+0x68>
2848: e5d3200c ldrb r2, [r3, #12]
284c: e21220ff ands r2, r2, #255 ; 0xff
2850: 1a000003 bne 2864 <rtems_disk_obtain+0x38>
/* Frequent and quickest case */
dd = get_disk_entry(dev, false);
2854: ebfffe83 bl 2268 <get_disk_entry>
2858: e1a05000 mov r5, r0
static inline void arm_interrupt_enable( uint32_t level )
{
#if defined(ARM_MULTILIB_ARCH_V4)
ARM_SWITCH_REGISTERS;
__asm__ volatile (
285c: e129f004 msr CPSR_fc, r4
2860: ea000009 b 288c <rtems_disk_obtain+0x60>
2864: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED
rtems_interrupt_enable(level);
} else {
rtems_interrupt_enable(level);
sc = disk_lock();
2868: ebfffeb2 bl 2338 <disk_lock> <== NOT EXECUTED
if (sc == RTEMS_SUCCESSFUL) {
286c: e2502000 subs r2, r0, #0 <== NOT EXECUTED
rtems_disk_device *
rtems_disk_obtain(dev_t dev)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_disk_device *dd = NULL;
2870: 13a05000 movne r5, #0 <== NOT EXECUTED
rtems_interrupt_enable(level);
} else {
rtems_interrupt_enable(level);
sc = disk_lock();
if (sc == RTEMS_SUCCESSFUL) {
2874: 1a000004 bne 288c <rtems_disk_obtain+0x60> <== NOT EXECUTED
dd = get_disk_entry(dev, false);
2878: e1a00006 mov r0, r6 <== NOT EXECUTED
287c: e1a01007 mov r1, r7 <== NOT EXECUTED
2880: ebfffe78 bl 2268 <get_disk_entry> <== NOT EXECUTED
2884: e1a05000 mov r5, r0 <== NOT EXECUTED
disk_unlock();
2888: ebfffeb6 bl 2368 <disk_unlock> <== NOT EXECUTED
}
}
return dd;
}
288c: e1a00005 mov r0, r5
2890: e8bd80f0 pop {r4, r5, r6, r7, pc}
00000698 <rtems_fdisk_abort>:
* @param format The format string. See printf for details.
* @param ... The arguments for the format text.
*/
static void
rtems_fdisk_abort (const char *format, ...)
{
698: e92d000f push {r0, r1, r2, r3} <== NOT EXECUTED
69c: e92d4011 push {r0, r4, lr} <== NOT EXECUTED
va_list args;
va_start (args, format);
fprintf (stderr, "fdisk:abort:");
6a0: e59f404c ldr r4, [pc, #76] ; 6f4 <bsp_section_fast_text_load_begin+0x5c><== NOT EXECUTED
*/
static void
rtems_fdisk_abort (const char *format, ...)
{
va_list args;
va_start (args, format);
6a4: e28d3010 add r3, sp, #16 <== NOT EXECUTED
6a8: e58d3000 str r3, [sp] <== NOT EXECUTED
fprintf (stderr, "fdisk:abort:");
6ac: e5943000 ldr r3, [r4] <== NOT EXECUTED
6b0: e59f0040 ldr r0, [pc, #64] ; 6f8 <bsp_section_fast_text_load_begin+0x60><== NOT EXECUTED
6b4: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
6b8: eb007604 bl 1ded0 <fputs> <== NOT EXECUTED
vfprintf (stderr, format, args);
6bc: e5943000 ldr r3, [r4] <== NOT EXECUTED
6c0: e59d2000 ldr r2, [sp] <== NOT EXECUTED
6c4: e593000c ldr r0, [r3, #12] <== NOT EXECUTED
6c8: e59d100c ldr r1, [sp, #12] <== NOT EXECUTED
6cc: eb0098bb bl 269c0 <vfprintf> <== NOT EXECUTED
fprintf (stderr, "\n");
6d0: e5943000 ldr r3, [r4] <== NOT EXECUTED
6d4: e3a0000a mov r0, #10 <== NOT EXECUTED
6d8: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
6dc: eb0075c6 bl 1ddfc <fputc> <== NOT EXECUTED
fflush (stderr);
6e0: e5943000 ldr r3, [r4] <== NOT EXECUTED
6e4: e593000c ldr r0, [r3, #12] <== NOT EXECUTED
6e8: eb0074b6 bl 1d9c8 <fflush> <== NOT EXECUTED
va_end (args);
exit (1);
6ec: e3a00001 mov r0, #1 <== NOT EXECUTED
6f0: eb0073bb bl 1d5e4 <exit> <== NOT EXECUTED
000041c4 <rtems_fdisk_compact>:
* used segments that will fit. The used queue is sorted on the least
* number of active pages.
*/
static int
rtems_fdisk_compact (rtems_flashdisk* fd)
{
41c4: e92d47f7 push {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, lr}
static bool
rtems_fdisk_is_erased_blocks_starvation (rtems_flashdisk* fd)
{
bool starvation = fd->erased_blocks < fd->starvation_threshold;
if (starvation)
41c8: e5903024 ldr r3, [r0, #36] ; 0x24
41cc: e5902028 ldr r2, [r0, #40] ; 0x28
41d0: e1520003 cmp r2, r3
* used segments that will fit. The used queue is sorted on the least
* number of active pages.
*/
static int
rtems_fdisk_compact (rtems_flashdisk* fd)
{
41d4: e1a04000 mov r4, r0
static bool
rtems_fdisk_is_erased_blocks_starvation (rtems_flashdisk* fd)
{
bool starvation = fd->erased_blocks < fd->starvation_threshold;
if (starvation)
41d8: 2a000009 bcs 4204 <rtems_fdisk_compact+0x40>
fd->starvations++;
41dc: e5903070 ldr r3, [r0, #112] ; 0x70
41e0: e2833001 add r3, r3, #1
41e4: e5803070 str r3, [r0, #112] ; 0x70
uint32_t pages;
if (rtems_fdisk_is_erased_blocks_starvation (fd))
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " resolve starvation");
41e8: e59f11a0 ldr r1, [pc, #416] ; 4390 <rtems_fdisk_compact+0x1cc>
41ec: ebfffd77 bl 37d0 <rtems_fdisk_printf>
#endif
ssc = rtems_fdisk_segment_queue_pop_head (&fd->used);
41f0: e2840040 add r0, r4, #64 ; 0x40
41f4: ebfffcba bl 34e4 <rtems_fdisk_segment_queue_pop_head>
if (!ssc)
41f8: e2505000 subs r5, r0, #0
41fc: 1a000008 bne 4224 <rtems_fdisk_compact+0x60>
4200: ea000002 b 4210 <rtems_fdisk_compact+0x4c> <== NOT EXECUTED
* compaction or less delay when compacting but it may mean the disk
* will fill.
*/
while (ssc &&
((pages + ssc->pages_active) < dst_pages) &&
4204: e3a06000 mov r6, #0
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " compacting");
#endif
dsc = rtems_fdisk_seg_most_available (&fd->available);
4208: e284a034 add sl, r4, #52 ; 0x34
420c: ea000057 b 4370 <rtems_fdisk_compact+0x1ac>
rtems_fdisk_printf (fd, " resolve starvation");
#endif
ssc = rtems_fdisk_segment_queue_pop_head (&fd->used);
if (!ssc)
ssc = rtems_fdisk_segment_queue_pop_head (&fd->available);
4210: e2840034 add r0, r4, #52 ; 0x34 <== NOT EXECUTED
4214: ebfffcb2 bl 34e4 <rtems_fdisk_segment_queue_pop_head> <== NOT EXECUTED
if (ssc)
4218: e2505000 subs r5, r0, #0 <== NOT EXECUTED
return EIO;
}
}
else
{
rtems_fdisk_error ("compacting: nothing to recycle");
421c: 059f0170 ldreq r0, [pc, #368] ; 4394 <rtems_fdisk_compact+0x1d0><== NOT EXECUTED
ssc = rtems_fdisk_segment_queue_pop_head (&fd->used);
if (!ssc)
ssc = rtems_fdisk_segment_queue_pop_head (&fd->available);
if (ssc)
4220: 0a000014 beq 4278 <rtems_fdisk_compact+0xb4> <== NOT EXECUTED
{
dsc = rtems_fdisk_seg_most_available (&fd->available);
4224: e2840034 add r0, r4, #52 ; 0x34
4228: ebfffd38 bl 3710 <rtems_fdisk_seg_most_available>
if (dsc)
422c: e2502000 subs r2, r0, #0
4230: 0a000006 beq 4250 <rtems_fdisk_compact+0x8c>
{
ret = rtems_fdisk_recycle_segment (fd, ssc, dsc, &pages);
4234: e1a00004 mov r0, r4
4238: e1a01005 mov r1, r5
423c: e28d3008 add r3, sp, #8
4240: ebfffef2 bl 3e10 <rtems_fdisk_recycle_segment>
if (ret)
4244: e3500000 cmp r0, #0
4248: 0affffed beq 4204 <rtems_fdisk_compact+0x40>
424c: ea00004a b 437c <rtems_fdisk_compact+0x1b8> <== NOT EXECUTED
return ret;
}
else
{
rtems_fdisk_error ("compacting: starvation");
4250: e59f0140 ldr r0, [pc, #320] ; 4398 <rtems_fdisk_compact+0x1d4><== NOT EXECUTED
4254: ea000007 b 4278 <rtems_fdisk_compact+0xb4> <== NOT EXECUTED
{
uint32_t dst_pages;
uint32_t segments;
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " compacting");
4258: e59f113c ldr r1, [pc, #316] ; 439c <rtems_fdisk_compact+0x1d8>
425c: e1a00004 mov r0, r4
4260: ebfffd5a bl 37d0 <rtems_fdisk_printf>
#endif
dsc = rtems_fdisk_seg_most_available (&fd->available);
4264: e1a0000a mov r0, sl
4268: ebfffd28 bl 3710 <rtems_fdisk_seg_most_available>
if (dsc == 0)
426c: e2507000 subs r7, r0, #0
4270: 1a000003 bne 4284 <rtems_fdisk_compact+0xc0>
{
rtems_fdisk_error ("compacting: no available segments to compact too");
4274: e59f0124 ldr r0, [pc, #292] ; 43a0 <rtems_fdisk_compact+0x1dc><== NOT EXECUTED
4278: ebfffe1f bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
return EIO;
427c: e3a00005 mov r0, #5 <== NOT EXECUTED
4280: ea00003d b 437c <rtems_fdisk_compact+0x1b8> <== NOT EXECUTED
}
ssc = fd->used.head;
dst_pages = rtems_fdisk_seg_pages_available (dsc);
4284: ebfffd19 bl 36f0 <rtems_fdisk_seg_pages_available>
segments = 0;
pages = 0;
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " dsc:%02d-%03d: most available",
4288: e2872008 add r2, r7, #8
428c: e892000c ldm r2, {r2, r3}
rtems_fdisk_error ("compacting: no available segments to compact too");
return EIO;
}
ssc = fd->used.head;
dst_pages = rtems_fdisk_seg_pages_available (dsc);
4290: e1a09000 mov r9, r0
segments = 0;
pages = 0;
4294: e3a08000 mov r8, #0
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " dsc:%02d-%03d: most available",
4298: e1a00004 mov r0, r4
429c: e59f1100 ldr r1, [pc, #256] ; 43a4 <rtems_fdisk_compact+0x1e0>
{
rtems_fdisk_error ("compacting: no available segments to compact too");
return EIO;
}
ssc = fd->used.head;
42a0: e5945040 ldr r5, [r4, #64] ; 0x40
dst_pages = rtems_fdisk_seg_pages_available (dsc);
segments = 0;
pages = 0;
42a4: e58d8008 str r8, [sp, #8]
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " dsc:%02d-%03d: most available",
42a8: ebfffd48 bl 37d0 <rtems_fdisk_printf>
42ac: e59d3008 ldr r3, [sp, #8]
* we handle during one compaction. A lower number means less aggressive
* compaction or less delay when compacting but it may mean the disk
* will fill.
*/
while (ssc &&
42b0: ea000002 b 42c0 <rtems_fdisk_compact+0xfc>
((pages + ssc->pages_active) < dst_pages) &&
((compacted_segs + segments) < fd->compact_segs))
{
pages += ssc->pages_active;
segments++;
ssc = ssc->next;
42b4: e5955000 ldr r5, [r5]
while (ssc &&
((pages + ssc->pages_active) < dst_pages) &&
((compacted_segs + segments) < fd->compact_segs))
{
pages += ssc->pages_active;
segments++;
42b8: e2888001 add r8, r8, #1
while (ssc &&
((pages + ssc->pages_active) < dst_pages) &&
((compacted_segs + segments) < fd->compact_segs))
{
pages += ssc->pages_active;
42bc: e1a03002 mov r3, r2
* we handle during one compaction. A lower number means less aggressive
* compaction or less delay when compacting but it may mean the disk
* will fill.
*/
while (ssc &&
42c0: e3550000 cmp r5, #0
42c4: 058d3008 streq r3, [sp, #8]
42c8: 0a00000b beq 42fc <rtems_fdisk_compact+0x138>
((pages + ssc->pages_active) < dst_pages) &&
42cc: e595201c ldr r2, [r5, #28]
42d0: e0832002 add r2, r3, r2
* we handle during one compaction. A lower number means less aggressive
* compaction or less delay when compacting but it may mean the disk
* will fill.
*/
while (ssc &&
42d4: e1520009 cmp r2, r9
42d8: 2a000028 bcs 4380 <rtems_fdisk_compact+0x1bc>
((pages + ssc->pages_active) < dst_pages) &&
42dc: e594100c ldr r1, [r4, #12]
((compacted_segs + segments) < fd->compact_segs))
42e0: e0880006 add r0, r8, r6
* compaction or less delay when compacting but it may mean the disk
* will fill.
*/
while (ssc &&
((pages + ssc->pages_active) < dst_pages) &&
42e4: e1500001 cmp r0, r1
42e8: 3afffff1 bcc 42b4 <rtems_fdisk_compact+0xf0>
42ec: ea000023 b 4380 <rtems_fdisk_compact+0x1bc> <== NOT EXECUTED
* We need a source segment and have pages to copy and
* compacting one segment to another is silly. Compaction needs
* to free at least one more segment.
*/
if (!ssc || (pages == 0) || ((compacted_segs + segments) == 1))
42f0: e0866008 add r6, r6, r8
42f4: e3560001 cmp r6, #1
42f8: 1a000004 bne 4310 <rtems_fdisk_compact+0x14c>
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " nothing to compact");
42fc: e1a00004 mov r0, r4
4300: e59f10a0 ldr r1, [pc, #160] ; 43a8 <rtems_fdisk_compact+0x1e4>
4304: ebfffd31 bl 37d0 <rtems_fdisk_printf>
}
compacted_segs += segments;
}
return 0;
4308: e3a00000 mov r0, #0
if (!ssc || (pages == 0) || ((compacted_segs + segments) == 1))
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " nothing to compact");
#endif
break;
430c: ea00001a b 437c <rtems_fdisk_compact+0x1b8>
}
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " ssc scan: %d-%d: p=%ld, seg=%ld",
4310: e88d0108 stm sp, {r3, r8}
4314: e2852008 add r2, r5, #8
4318: e59f108c ldr r1, [pc, #140] ; 43ac <rtems_fdisk_compact+0x1e8>
431c: e892000c ldm r2, {r2, r3}
4320: e1a00004 mov r0, r4
4324: ebfffd29 bl 37d0 <rtems_fdisk_printf>
ssc->device, ssc->segment,
pages, segments);
#endif
rtems_fdisk_segment_queue_remove (&fd->available, dsc);
4328: e1a0000a mov r0, sl
432c: e1a01007 mov r1, r7
4330: ebfffc88 bl 3558 <rtems_fdisk_segment_queue_remove>
* We now copy the pages to the new segment.
*/
while (pages)
{
ssc = rtems_fdisk_segment_queue_pop_head (&fd->used);
4334: e2845040 add r5, r4, #64 ; 0x40
/*
* We now copy the pages to the new segment.
*/
while (pages)
4338: ea000009 b 4364 <rtems_fdisk_compact+0x1a0>
{
ssc = rtems_fdisk_segment_queue_pop_head (&fd->used);
433c: e1a00005 mov r0, r5
4340: ebfffc67 bl 34e4 <rtems_fdisk_segment_queue_pop_head>
if (ssc)
4344: e2501000 subs r1, r0, #0
4348: 0a000005 beq 4364 <rtems_fdisk_compact+0x1a0>
{
ret = rtems_fdisk_recycle_segment (fd, ssc, dsc, &pages);
434c: e1a00004 mov r0, r4
4350: e1a02007 mov r2, r7
4354: e28d3008 add r3, sp, #8
4358: ebfffeac bl 3e10 <rtems_fdisk_recycle_segment>
if (ret)
435c: e3500000 cmp r0, #0
4360: 1a000005 bne 437c <rtems_fdisk_compact+0x1b8>
/*
* We now copy the pages to the new segment.
*/
while (pages)
4364: e59d3008 ldr r3, [sp, #8]
4368: e3530000 cmp r3, #0
436c: 1afffff2 bne 433c <rtems_fdisk_compact+0x178>
rtems_fdisk_error ("compacting: nothing to recycle");
return EIO;
}
}
while (fd->used.head)
4370: e5940040 ldr r0, [r4, #64] ; 0x40
4374: e3500000 cmp r0, #0
4378: 1affffb6 bne 4258 <rtems_fdisk_compact+0x94>
compacted_segs += segments;
}
return 0;
}
437c: e8bd87fe pop {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, pc}
* We need a source segment and have pages to copy and
* compacting one segment to another is silly. Compaction needs
* to free at least one more segment.
*/
if (!ssc || (pages == 0) || ((compacted_segs + segments) == 1))
4380: e3530000 cmp r3, #0
rtems_fdisk_error ("compacting: nothing to recycle");
return EIO;
}
}
while (fd->used.head)
4384: e58d3008 str r3, [sp, #8]
* We need a source segment and have pages to copy and
* compacting one segment to another is silly. Compaction needs
* to free at least one more segment.
*/
if (!ssc || (pages == 0) || ((compacted_segs + segments) == 1))
4388: 1affffd8 bne 42f0 <rtems_fdisk_compact+0x12c>
438c: eaffffda b 42fc <rtems_fdisk_compact+0x138>
00003b6c <rtems_fdisk_erase_segment>:
/**
* Erase the segment.
*/
static int
rtems_fdisk_erase_segment (rtems_flashdisk* fd, rtems_fdisk_segment_ctl* sc)
{
3b6c: e92d41f1 push {r0, r4, r5, r6, r7, r8, lr}
3b70: e1a04001 mov r4, r1
uint32_t device;
uint32_t segment;
const rtems_fdisk_segment_desc* sd;
const rtems_fdisk_driver_handlers* ops;
device = sc->device;
segment = sc->segment;
3b74: e2811008 add r1, r1, #8
3b78: e8910006 ldm r1, {r1, r2}
/**
* Erase the segment.
*/
static int
rtems_fdisk_erase_segment (rtems_flashdisk* fd, rtems_fdisk_segment_ctl* sc)
{
3b7c: e1a05000 mov r5, r0
static const rtems_fdisk_segment_desc*
rtems_fdisk_seg_descriptor (const rtems_flashdisk* fd,
uint32_t device,
uint32_t segment)
{
return fd->devices[device].segments[segment].descriptor;
3b80: e3a0000c mov r0, #12
3b84: e0000091 mul r0, r1, r0
3b88: e595c02c ldr ip, [r5, #44] ; 0x2c
3b8c: e08c3000 add r3, ip, r0
3b90: e79c0000 ldr r0, [ip, r0]
3b94: e3a0c030 mov ip, #48 ; 0x30
3b98: e020029c mla r0, ip, r2, r0
const rtems_fdisk_segment_desc* sd;
const rtems_fdisk_driver_handlers* ops;
device = sc->device;
segment = sc->segment;
sd = rtems_fdisk_seg_descriptor (fd, device, segment);
ops = fd->devices[device].descriptor->flash_ops;
3b9c: e5933008 ldr r3, [r3, #8]
ret = ops->erase (sd, device, segment);
3ba0: e5900004 ldr r0, [r0, #4]
3ba4: e5933008 ldr r3, [r3, #8]
3ba8: e1a0e00f mov lr, pc
3bac: e593f010 ldr pc, [r3, #16]
if (ret)
3bb0: e2506000 subs r6, r0, #0
3bb4: 0a000012 beq 3c04 <rtems_fdisk_erase_segment+0x98>
{
rtems_fdisk_error (" erase-segment:%02d-%03d: " \
3bb8: e5948008 ldr r8, [r4, #8] <== NOT EXECUTED
3bbc: e594700c ldr r7, [r4, #12] <== NOT EXECUTED
3bc0: eb007047 bl 1fce4 <strerror> <== NOT EXECUTED
3bc4: e1a01008 mov r1, r8 <== NOT EXECUTED
3bc8: e1a03000 mov r3, r0 <== NOT EXECUTED
3bcc: e1a02007 mov r2, r7 <== NOT EXECUTED
3bd0: e59f008c ldr r0, [pc, #140] ; 3c64 <rtems_fdisk_erase_segment+0xf8><== NOT EXECUTED
3bd4: e58d6000 str r6, [sp] <== NOT EXECUTED
3bd8: ebffffc7 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
"segment erase failed: %s (%d)",
sc->device, sc->segment, strerror (ret), ret);
sc->failed = true;
3bdc: e3a03001 mov r3, #1 <== NOT EXECUTED
3be0: e5843028 str r3, [r4, #40] ; 0x28 <== NOT EXECUTED
*/
static bool
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
3be4: e5953058 ldr r3, [r5, #88] ; 0x58 <== NOT EXECUTED
3be8: ea000002 b 3bf8 <rtems_fdisk_erase_segment+0x8c> <== NOT EXECUTED
while (it)
{
if (it == sc)
3bec: e1530004 cmp r3, r4 <== NOT EXECUTED
3bf0: 0a000017 beq 3c54 <rtems_fdisk_erase_segment+0xe8> <== NOT EXECUTED
return true;
it = it->next;
3bf4: e5933000 ldr r3, [r3] <== NOT EXECUTED
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
3bf8: e3530000 cmp r3, #0 <== NOT EXECUTED
3bfc: 1afffffa bne 3bec <rtems_fdisk_erase_segment+0x80> <== NOT EXECUTED
3c00: ea000015 b 3c5c <rtems_fdisk_erase_segment+0xf0> <== NOT EXECUTED
if (!rtems_fdisk_segment_queue_present (&fd->failed, sc))
rtems_fdisk_segment_queue_push_tail (&fd->failed, sc);
return ret;
}
fd->erased_blocks += sc->pages;
3c04: e5952028 ldr r2, [r5, #40] ; 0x28
3c08: e5943014 ldr r3, [r4, #20]
3c0c: e0823003 add r3, r2, r3
3c10: e5853028 str r3, [r5, #40] ; 0x28
sc->erased++;
3c14: e594302c ldr r3, [r4, #44] ; 0x2c
3c18: e2833001 add r3, r3, #1
3c1c: e584302c str r3, [r4, #44] ; 0x2c
memset (sc->page_descriptors, 0xff, sc->pages_desc * fd->block_size);
3c20: e5942018 ldr r2, [r4, #24]
3c24: e5953014 ldr r3, [r5, #20]
3c28: e5940010 ldr r0, [r4, #16]
3c2c: e3a010ff mov r1, #255 ; 0xff
3c30: e0020293 mul r2, r3, r2
3c34: eb006b0b bl 1e868 <memset>
sc->pages_active = 0;
3c38: e584601c str r6, [r4, #28]
sc->pages_used = 0;
3c3c: e5846020 str r6, [r4, #32]
sc->pages_bad = 0;
3c40: e5846024 str r6, [r4, #36] ; 0x24
sc->failed = false;
3c44: e5846028 str r6, [r4, #40] ; 0x28
/*
* Push to the tail of the available queue. It is a very
* simple type of wear reduction. Every other available
* segment will now get a go.
*/
rtems_fdisk_segment_queue_push_tail (&fd->available, sc);
3c48: e2850034 add r0, r5, #52 ; 0x34
3c4c: e1a01004 mov r1, r4
3c50: ebfffe31 bl 351c <rtems_fdisk_segment_queue_push_tail>
return 0;
}
3c54: e1a00006 mov r0, r6
3c58: e8bd81f8 pop {r3, r4, r5, r6, r7, r8, pc}
rtems_fdisk_error (" erase-segment:%02d-%03d: " \
"segment erase failed: %s (%d)",
sc->device, sc->segment, strerror (ret), ret);
sc->failed = true;
if (!rtems_fdisk_segment_queue_present (&fd->failed, sc))
rtems_fdisk_segment_queue_push_tail (&fd->failed, sc);
3c5c: e2850058 add r0, r5, #88 ; 0x58 <== NOT EXECUTED
3c60: eafffff9 b 3c4c <rtems_fdisk_erase_segment+0xe0> <== NOT EXECUTED
00003afc <rtems_fdisk_error>:
* @param ... The arguments for the format text.
* @return int The number of bytes written to the output.
*/
static int
rtems_fdisk_error (const char *format, ...)
{
3afc: e92d000f push {r0, r1, r2, r3} <== NOT EXECUTED
3b00: e92d4031 push {r0, r4, r5, lr} <== NOT EXECUTED
int ret;
va_list args;
va_start (args, format);
fprintf (stderr, "fdisk:error:");
3b04: e59f4058 ldr r4, [pc, #88] ; 3b64 <rtems_fdisk_error+0x68> <== NOT EXECUTED
static int
rtems_fdisk_error (const char *format, ...)
{
int ret;
va_list args;
va_start (args, format);
3b08: e28d3014 add r3, sp, #20 <== NOT EXECUTED
3b0c: e58d3000 str r3, [sp] <== NOT EXECUTED
fprintf (stderr, "fdisk:error:");
3b10: e5943000 ldr r3, [r4] <== NOT EXECUTED
3b14: e59f004c ldr r0, [pc, #76] ; 3b68 <rtems_fdisk_error+0x6c> <== NOT EXECUTED
3b18: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
3b1c: eb0068eb bl 1ded0 <fputs> <== NOT EXECUTED
ret = vfprintf (stderr, format, args);
3b20: e5943000 ldr r3, [r4] <== NOT EXECUTED
3b24: e59d2000 ldr r2, [sp] <== NOT EXECUTED
3b28: e59d1010 ldr r1, [sp, #16] <== NOT EXECUTED
3b2c: e593000c ldr r0, [r3, #12] <== NOT EXECUTED
3b30: eb008ba2 bl 269c0 <vfprintf> <== NOT EXECUTED
fprintf (stderr, "\n");
3b34: e5943000 ldr r3, [r4] <== NOT EXECUTED
{
int ret;
va_list args;
va_start (args, format);
fprintf (stderr, "fdisk:error:");
ret = vfprintf (stderr, format, args);
3b38: e1a05000 mov r5, r0 <== NOT EXECUTED
fprintf (stderr, "\n");
3b3c: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
3b40: e3a0000a mov r0, #10 <== NOT EXECUTED
3b44: eb0068ac bl 1ddfc <fputc> <== NOT EXECUTED
fflush (stderr);
3b48: e5943000 ldr r3, [r4] <== NOT EXECUTED
3b4c: e593000c ldr r0, [r3, #12] <== NOT EXECUTED
3b50: eb00679c bl 1d9c8 <fflush> <== NOT EXECUTED
va_end (args);
return ret;
}
3b54: e1a00005 mov r0, r5 <== NOT EXECUTED
3b58: e8bd4038 pop {r3, r4, r5, lr} <== NOT EXECUTED
3b5c: e28dd010 add sp, sp, #16 <== NOT EXECUTED
3b60: e12fff1e bx lr <== NOT EXECUTED
00003750 <rtems_fdisk_info>:
* @param ... The arguments for the format text.
* @return int The number of bytes written to the output.
*/
static int
rtems_fdisk_info (const rtems_flashdisk* fd, const char *format, ...)
{
3750: e92d000e push {r1, r2, r3}
int ret = 0;
if (fd->info_level >= 2)
3754: e590306c ldr r3, [r0, #108] ; 0x6c
3758: e3530001 cmp r3, #1
* @param ... The arguments for the format text.
* @return int The number of bytes written to the output.
*/
static int
rtems_fdisk_info (const rtems_flashdisk* fd, const char *format, ...)
{
375c: e92d4031 push {r0, r4, r5, lr}
int ret = 0;
3760: 93a05000 movls r5, #0
if (fd->info_level >= 2)
3764: 9a000013 bls 37b8 <rtems_fdisk_info+0x68>
{
va_list args;
va_start (args, format);
fprintf (stdout, "fdisk:");
3768: e59f4058 ldr r4, [pc, #88] ; 37c8 <rtems_fdisk_info+0x78> <== NOT EXECUTED
{
int ret = 0;
if (fd->info_level >= 2)
{
va_list args;
va_start (args, format);
376c: e28d3014 add r3, sp, #20 <== NOT EXECUTED
3770: e58d3000 str r3, [sp] <== NOT EXECUTED
fprintf (stdout, "fdisk:");
3774: e5943000 ldr r3, [r4] <== NOT EXECUTED
3778: e59f004c ldr r0, [pc, #76] ; 37cc <rtems_fdisk_info+0x7c> <== NOT EXECUTED
377c: e5931008 ldr r1, [r3, #8] <== NOT EXECUTED
3780: eb0069d2 bl 1ded0 <fputs> <== NOT EXECUTED
ret = vfprintf (stdout, format, args);
3784: e5943000 ldr r3, [r4] <== NOT EXECUTED
3788: e59d1010 ldr r1, [sp, #16] <== NOT EXECUTED
378c: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
3790: e59d2000 ldr r2, [sp] <== NOT EXECUTED
3794: eb008c89 bl 269c0 <vfprintf> <== NOT EXECUTED
fprintf (stdout, "\n");
3798: e5943000 ldr r3, [r4] <== NOT EXECUTED
if (fd->info_level >= 2)
{
va_list args;
va_start (args, format);
fprintf (stdout, "fdisk:");
ret = vfprintf (stdout, format, args);
379c: e1a05000 mov r5, r0 <== NOT EXECUTED
fprintf (stdout, "\n");
37a0: e5931008 ldr r1, [r3, #8] <== NOT EXECUTED
37a4: e3a0000a mov r0, #10 <== NOT EXECUTED
37a8: eb006993 bl 1ddfc <fputc> <== NOT EXECUTED
fflush (stdout);
37ac: e5943000 ldr r3, [r4] <== NOT EXECUTED
37b0: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
37b4: eb006883 bl 1d9c8 <fflush> <== NOT EXECUTED
va_end (args);
}
return ret;
}
37b8: e1a00005 mov r0, r5
37bc: e8bd4038 pop {r3, r4, r5, lr}
37c0: e28dd00c add sp, sp, #12
37c4: e12fff1e bx lr
000058c4 <rtems_fdisk_initialize>:
*/
rtems_device_driver
rtems_fdisk_initialize (rtems_device_major_number major,
rtems_device_minor_number minor,
void* arg __attribute__((unused)))
{
58c4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
58c8: e24dd03c sub sp, sp, #60 ; 0x3c
58cc: e58d001c str r0, [sp, #28]
const rtems_flashdisk_config* c = rtems_flashdisk_configuration;
rtems_flashdisk* fd;
rtems_status_code sc;
sc = rtems_disk_io_initialize ();
58d0: ebfff6b9 bl 33bc <rtems_disk_io_initialize>
if (sc != RTEMS_SUCCESSFUL)
58d4: e2507000 subs r7, r0, #0
58d8: 1a000124 bne 5d70 <rtems_fdisk_initialize+0x4ac>
static rtems_status_code
rtems_fdisk_crc16_gen_factors (uint16_t pattern)
{
uint32_t b;
rtems_fdisk_crc16_factor = malloc (sizeof (uint16_t) * 256);
58dc: e3a00c02 mov r0, #512 ; 0x200
58e0: eb00053a bl 6dd0 <malloc>
58e4: e59f34c0 ldr r3, [pc, #1216] ; 5dac <rtems_fdisk_initialize+0x4e8>
if (!rtems_fdisk_crc16_factor)
58e8: e3500000 cmp r0, #0
static rtems_status_code
rtems_fdisk_crc16_gen_factors (uint16_t pattern)
{
uint32_t b;
rtems_fdisk_crc16_factor = malloc (sizeof (uint16_t) * 256);
58ec: e5830008 str r0, [r3, #8]
if (!rtems_fdisk_crc16_factor)
58f0: 0a00011d beq 5d6c <rtems_fdisk_initialize+0x4a8>
for (b = 0; b < 256; b++)
{
uint32_t i;
uint16_t v = b;
for (i = 8; i--;)
v = v & 1 ? (v >> 1) ^ pattern : v >> 1;
58f4: e59f24b4 ldr r2, [pc, #1204] ; 5db0 <rtems_fdisk_initialize+0x4ec>
return RTEMS_NO_MEMORY;
for (b = 0; b < 256; b++)
{
uint32_t i;
uint16_t v = b;
58f8: e1a03807 lsl r3, r7, #16
58fc: e1a03823 lsr r3, r3, #16
5900: e3a04009 mov r4, #9
5904: ea000004 b 591c <rtems_fdisk_initialize+0x58>
for (i = 8; i--;)
v = v & 1 ? (v >> 1) ^ pattern : v >> 1;
5908: e3130001 tst r3, #1
590c: e1a030a3 lsr r3, r3, #1
5910: 10233002 eorne r3, r3, r2
5914: 11a03803 lslne r3, r3, #16
5918: 11a03823 lsrne r3, r3, #16
for (b = 0; b < 256; b++)
{
uint32_t i;
uint16_t v = b;
for (i = 8; i--;)
591c: e2544001 subs r4, r4, #1
5920: 1afffff8 bne 5908 <rtems_fdisk_initialize+0x44>
rtems_fdisk_crc16_factor = malloc (sizeof (uint16_t) * 256);
if (!rtems_fdisk_crc16_factor)
return RTEMS_NO_MEMORY;
for (b = 0; b < 256; b++)
5924: e2877001 add r7, r7, #1
5928: e3570c01 cmp r7, #256 ; 0x100
{
uint32_t i;
uint16_t v = b;
for (i = 8; i--;)
v = v & 1 ? (v >> 1) ^ pattern : v >> 1;
rtems_fdisk_crc16_factor[b] = v & 0xffff;
592c: e0c030b2 strh r3, [r0], #2
rtems_fdisk_crc16_factor = malloc (sizeof (uint16_t) * 256);
if (!rtems_fdisk_crc16_factor)
return RTEMS_NO_MEMORY;
for (b = 0; b < 256; b++)
5930: 1afffff0 bne 58f8 <rtems_fdisk_initialize+0x34>
5934: ea000110 b 5d7c <rtems_fdisk_initialize+0x4b8>
if (!rtems_flashdisks)
return RTEMS_NO_MEMORY;
for (minor = 0; minor < rtems_flashdisk_configuration_size; minor++, c++)
{
char name[] = RTEMS_FLASHDISK_DEVICE_BASE_NAME "a";
5938: e3a0200a mov r2, #10
593c: e28d0030 add r0, sp, #48 ; 0x30
5940: e59f146c ldr r1, [pc, #1132] ; 5db4 <rtems_fdisk_initialize+0x4f0>
5944: eb006344 bl 1e65c <memcpy>
uint32_t blocks = 0;
int ret;
fd = &rtems_flashdisks[minor];
name [sizeof(RTEMS_FLASHDISK_DEVICE_BASE_NAME)] += minor;
5948: e5dd2039 ldrb r2, [sp, #57] ; 0x39
594c: e0862002 add r2, r6, r2
5950: e5cd2039 strb r2, [sp, #57] ; 0x39
dev_t dev = rtems_filesystem_make_dev_t (major, minor);
uint32_t device;
uint32_t blocks = 0;
int ret;
fd = &rtems_flashdisks[minor];
5954: e5943000 ldr r3, [r4]
5958: e59dc018 ldr ip, [sp, #24]
name [sizeof(RTEMS_FLASHDISK_DEVICE_BASE_NAME)] += minor;
fd->major = major;
595c: e59d001c ldr r0, [sp, #28]
dev_t dev = rtems_filesystem_make_dev_t (major, minor);
uint32_t device;
uint32_t blocks = 0;
int ret;
fd = &rtems_flashdisks[minor];
5960: e083400c add r4, r3, ip
name [sizeof(RTEMS_FLASHDISK_DEVICE_BASE_NAME)] += minor;
fd->major = major;
5964: e783000c str r0, [r3, ip]
fd->minor = minor;
fd->flags = c->flags;
5968: e595300c ldr r3, [r5, #12]
596c: e5843008 str r3, [r4, #8]
fd->compact_segs = c->compact_segs;
5970: e5953014 ldr r3, [r5, #20]
5974: e584300c str r3, [r4, #12]
fd->avail_compact_segs = c->avail_compact_segs;
5978: e5953018 ldr r3, [r5, #24]
597c: e5843010 str r3, [r4, #16]
fd->block_size = c->block_size;
fd->unavail_blocks = c->unavail_blocks;
5980: e5953010 ldr r3, [r5, #16]
fd->major = major;
fd->minor = minor;
fd->flags = c->flags;
fd->compact_segs = c->compact_segs;
fd->avail_compact_segs = c->avail_compact_segs;
fd->block_size = c->block_size;
5984: e595b000 ldr fp, [r5]
fd->unavail_blocks = c->unavail_blocks;
fd->info_level = c->info_level;
for (device = 0; device < c->device_count; device++)
5988: e5952004 ldr r2, [r5, #4]
fd->minor = minor;
fd->flags = c->flags;
fd->compact_segs = c->compact_segs;
fd->avail_compact_segs = c->avail_compact_segs;
fd->block_size = c->block_size;
fd->unavail_blocks = c->unavail_blocks;
598c: e5843020 str r3, [r4, #32]
fd->info_level = c->info_level;
5990: e595301c ldr r3, [r5, #28]
for (device = 0; device < c->device_count; device++)
5994: e3a08000 mov r8, #0
fd->flags = c->flags;
fd->compact_segs = c->compact_segs;
fd->avail_compact_segs = c->avail_compact_segs;
fd->block_size = c->block_size;
fd->unavail_blocks = c->unavail_blocks;
fd->info_level = c->info_level;
5998: e584306c str r3, [r4, #108] ; 0x6c
for (device = 0; device < c->device_count; device++)
599c: e58d2020 str r2, [sp, #32]
fd = &rtems_flashdisks[minor];
name [sizeof(RTEMS_FLASHDISK_DEVICE_BASE_NAME)] += minor;
fd->major = major;
fd->minor = minor;
59a0: e5846004 str r6, [r4, #4]
fd->flags = c->flags;
fd->compact_segs = c->compact_segs;
fd->avail_compact_segs = c->avail_compact_segs;
fd->block_size = c->block_size;
59a4: e584b014 str fp, [r4, #20]
for (minor = 0; minor < rtems_flashdisk_configuration_size; minor++, c++)
{
char name[] = RTEMS_FLASHDISK_DEVICE_BASE_NAME "a";
dev_t dev = rtems_filesystem_make_dev_t (major, minor);
uint32_t device;
uint32_t blocks = 0;
59a8: e1a07008 mov r7, r8
fd->avail_compact_segs = c->avail_compact_segs;
fd->block_size = c->block_size;
fd->unavail_blocks = c->unavail_blocks;
fd->info_level = c->info_level;
for (device = 0; device < c->device_count; device++)
59ac: e1a09008 mov r9, r8
59b0: e1a02006 mov r2, r6
59b4: e1a03004 mov r3, r4
59b8: ea000026 b 5a58 <rtems_fdisk_initialize+0x194>
blocks += rtems_fdisk_blocks_in_device (&c->devices[device],
59bc: e5951008 ldr r1, [r5, #8]
59c0: e081c008 add ip, r1, r8
rtems_fdisk_blocks_in_device (const rtems_fdisk_device_desc* dd,
uint32_t page_size)
{
uint32_t count = 0;
uint32_t s;
for (s = 0; s < dd->segment_count; s++)
59c4: e7911008 ldr r1, [r1, r8]
59c8: e3a04000 mov r4, #0
fd->block_size = c->block_size;
fd->unavail_blocks = c->unavail_blocks;
fd->info_level = c->info_level;
for (device = 0; device < c->device_count; device++)
blocks += rtems_fdisk_blocks_in_device (&c->devices[device],
59cc: e58dc024 str ip, [sp, #36] ; 0x24
rtems_fdisk_blocks_in_device (const rtems_fdisk_device_desc* dd,
uint32_t page_size)
{
uint32_t count = 0;
uint32_t s;
for (s = 0; s < dd->segment_count; s++)
59d0: e58d1028 str r1, [sp, #40] ; 0x28
59d4: e1a0a004 mov sl, r4
*/
static uint32_t
rtems_fdisk_blocks_in_device (const rtems_fdisk_device_desc* dd,
uint32_t page_size)
{
uint32_t count = 0;
59d8: e1a06004 mov r6, r4
59dc: ea000017 b 5a40 <rtems_fdisk_initialize+0x17c>
uint32_t s;
for (s = 0; s < dd->segment_count; s++)
{
const rtems_fdisk_segment_desc* sd = &dd->segments[s];
59e0: e59d0024 ldr r0, [sp, #36] ; 0x24
59e4: e590c004 ldr ip, [r0, #4]
59e8: e08c1004 add r1, ip, r4
*/
static uint32_t
rtems_fdisk_pages_in_segment (const rtems_fdisk_segment_desc* sd,
uint32_t page_size)
{
return sd->size / page_size;
59ec: e5910008 ldr r0, [r1, #8]
59f0: e1a0100b mov r1, fp
59f4: e58d2010 str r2, [sp, #16]
59f8: e58d300c str r3, [sp, #12]
59fc: e58dc014 str ip, [sp, #20]
5a00: ebffefce bl 1940 <__aeabi_uidiv>
rtems_fdisk_page_desc_pages (const rtems_fdisk_segment_desc* sd,
uint32_t page_size)
{
uint32_t pages = rtems_fdisk_pages_in_segment (sd, page_size);
uint32_t bytes = pages * sizeof (rtems_fdisk_page_desc);
return ((bytes - 1) / page_size) + 1;
5a04: e2401001 sub r1, r0, #1
static uint32_t
rtems_fdisk_page_desc_pages (const rtems_fdisk_segment_desc* sd,
uint32_t page_size)
{
uint32_t pages = rtems_fdisk_pages_in_segment (sd, page_size);
uint32_t bytes = pages * sizeof (rtems_fdisk_page_desc);
5a08: e1a00180 lsl r0, r0, #3
return ((bytes - 1) / page_size) + 1;
5a0c: e58d102c str r1, [sp, #44] ; 0x2c
5a10: e2400001 sub r0, r0, #1
5a14: e1a0100b mov r1, fp
5a18: ebffefc8 bl 1940 <__aeabi_uidiv>
uint32_t s;
for (s = 0; s < dd->segment_count; s++)
{
const rtems_fdisk_segment_desc* sd = &dd->segments[s];
count +=
(rtems_fdisk_pages_in_segment (sd, page_size) -
5a1c: e59d102c ldr r1, [sp, #44] ; 0x2c
rtems_fdisk_page_desc_pages (sd, page_size)) * sd->count;
5a20: e59dc014 ldr ip, [sp, #20]
uint32_t s;
for (s = 0; s < dd->segment_count; s++)
{
const rtems_fdisk_segment_desc* sd = &dd->segments[s];
count +=
(rtems_fdisk_pages_in_segment (sd, page_size) -
5a24: e0600001 rsb r0, r0, r1
rtems_fdisk_page_desc_pages (sd, page_size)) * sd->count;
5a28: e19c10b4 ldrh r1, [ip, r4]
uint32_t count = 0;
uint32_t s;
for (s = 0; s < dd->segment_count; s++)
{
const rtems_fdisk_segment_desc* sd = &dd->segments[s];
count +=
5a2c: e0266091 mla r6, r1, r0, r6
rtems_fdisk_blocks_in_device (const rtems_fdisk_device_desc* dd,
uint32_t page_size)
{
uint32_t count = 0;
uint32_t s;
for (s = 0; s < dd->segment_count; s++)
5a30: e59d300c ldr r3, [sp, #12]
5a34: e59d2010 ldr r2, [sp, #16]
5a38: e28aa001 add sl, sl, #1
5a3c: e284400c add r4, r4, #12
5a40: e59dc028 ldr ip, [sp, #40] ; 0x28
5a44: e15a000c cmp sl, ip
5a48: 1affffe4 bne 59e0 <rtems_fdisk_initialize+0x11c>
fd->block_size = c->block_size;
fd->unavail_blocks = c->unavail_blocks;
fd->info_level = c->info_level;
for (device = 0; device < c->device_count; device++)
blocks += rtems_fdisk_blocks_in_device (&c->devices[device],
5a4c: e0877006 add r7, r7, r6
fd->avail_compact_segs = c->avail_compact_segs;
fd->block_size = c->block_size;
fd->unavail_blocks = c->unavail_blocks;
fd->info_level = c->info_level;
for (device = 0; device < c->device_count; device++)
5a50: e2899001 add r9, r9, #1
5a54: e288800c add r8, r8, #12
5a58: e59dc020 ldr ip, [sp, #32]
5a5c: e159000c cmp r9, ip
5a60: 1affffd5 bne 59bc <rtems_fdisk_initialize+0xf8>
c->block_size);
/*
* One copy buffer of a page size.
*/
fd->copy_buffer = malloc (c->block_size);
5a64: e1a0000b mov r0, fp
5a68: e1a04003 mov r4, r3
5a6c: e1a06002 mov r6, r2
5a70: eb0004d6 bl 6dd0 <malloc>
if (!fd->copy_buffer)
5a74: e3500000 cmp r0, #0
c->block_size);
/*
* One copy buffer of a page size.
*/
fd->copy_buffer = malloc (c->block_size);
5a78: e5840068 str r0, [r4, #104] ; 0x68
if (!fd->copy_buffer)
5a7c: 0a0000ba beq 5d6c <rtems_fdisk_initialize+0x4a8>
return RTEMS_NO_MEMORY;
fd->blocks = calloc (blocks, sizeof (rtems_fdisk_block_ctl));
5a80: e1a00007 mov r0, r7
5a84: e3a01008 mov r1, #8
5a88: eb000282 bl 6498 <calloc>
if (!fd->blocks)
5a8c: e3500000 cmp r0, #0
*/
fd->copy_buffer = malloc (c->block_size);
if (!fd->copy_buffer)
return RTEMS_NO_MEMORY;
fd->blocks = calloc (blocks, sizeof (rtems_fdisk_block_ctl));
5a90: e5840018 str r0, [r4, #24]
if (!fd->blocks)
5a94: 0a0000b4 beq 5d6c <rtems_fdisk_initialize+0x4a8>
return RTEMS_NO_MEMORY;
fd->block_count = blocks;
5a98: e584701c str r7, [r4, #28]
fd->devices = calloc (c->device_count, sizeof (rtems_fdisk_device_ctl));
5a9c: e1a00009 mov r0, r9
5aa0: e3a0100c mov r1, #12
5aa4: eb00027b bl 6498 <calloc>
if (!fd->devices)
5aa8: e3500000 cmp r0, #0
if (!fd->blocks)
return RTEMS_NO_MEMORY;
fd->block_count = blocks;
fd->devices = calloc (c->device_count, sizeof (rtems_fdisk_device_ctl));
5aac: e584002c str r0, [r4, #44] ; 0x2c
if (!fd->devices)
5ab0: 0a0000ad beq 5d6c <rtems_fdisk_initialize+0x4a8>
return RTEMS_NO_MEMORY;
sc = rtems_semaphore_create (rtems_build_name ('F', 'D', 'S', 'K'), 1,
5ab4: e2843064 add r3, r4, #100 ; 0x64
5ab8: e58d3000 str r3, [sp]
5abc: e59f02f4 ldr r0, [pc, #756] ; 5db8 <rtems_fdisk_initialize+0x4f4>
5ac0: e3a01001 mov r1, #1
5ac4: e3a02054 mov r2, #84 ; 0x54
5ac8: e3a03000 mov r3, #0
5acc: eb00140d bl ab08 <rtems_semaphore_create>
RTEMS_PRIORITY | RTEMS_BINARY_SEMAPHORE |
RTEMS_INHERIT_PRIORITY, 0, &fd->lock);
if (sc != RTEMS_SUCCESSFUL)
5ad0: e2508000 subs r8, r0, #0
5ad4: 0a000009 beq 5b00 <rtems_fdisk_initialize+0x23c>
{
rtems_fdisk_error ("disk lock create failed");
5ad8: e59f02dc ldr r0, [pc, #732] ; 5dbc <rtems_fdisk_initialize+0x4f8><== NOT EXECUTED
5adc: ebfff806 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
free (fd->copy_buffer);
5ae0: e5940068 ldr r0, [r4, #104] ; 0x68 <== NOT EXECUTED
5ae4: eb000349 bl 6810 <free> <== NOT EXECUTED
free (fd->blocks);
5ae8: e5940018 ldr r0, [r4, #24] <== NOT EXECUTED
5aec: eb000347 bl 6810 <free> <== NOT EXECUTED
free (fd->devices);
5af0: e594002c ldr r0, [r4, #44] ; 0x2c <== NOT EXECUTED
5af4: eb000345 bl 6810 <free> <== NOT EXECUTED
fd->devices = calloc (c->device_count, sizeof (rtems_fdisk_device_ctl));
if (!fd->devices)
return RTEMS_NO_MEMORY;
sc = rtems_semaphore_create (rtems_build_name ('F', 'D', 'S', 'K'), 1,
5af8: e1a07008 mov r7, r8 <== NOT EXECUTED
{
rtems_fdisk_error ("disk lock create failed");
free (fd->copy_buffer);
free (fd->blocks);
free (fd->devices);
return sc;
5afc: ea00009b b 5d70 <rtems_fdisk_initialize+0x4ac> <== NOT EXECUTED
}
sc = rtems_disk_create_phys(dev, c->block_size,
5b00: e59f22b8 ldr r2, [pc, #696] ; 5dc0 <rtems_fdisk_initialize+0x4fc>
5b04: e5943020 ldr r3, [r4, #32]
5b08: e88d0104 stm sp, {r2, r8}
blocks - fd->unavail_blocks,
rtems_fdisk_ioctl, NULL, name);
5b0c: e28d2030 add r2, sp, #48 ; 0x30
free (fd->blocks);
free (fd->devices);
return sc;
}
sc = rtems_disk_create_phys(dev, c->block_size,
5b10: e58d2008 str r2, [sp, #8]
5b14: e0633007 rsb r3, r3, r7
5b18: e59d001c ldr r0, [sp, #28]
5b1c: e1a01006 mov r1, r6
5b20: e5952000 ldr r2, [r5]
5b24: ebfff590 bl 316c <rtems_disk_create_phys>
blocks - fd->unavail_blocks,
rtems_fdisk_ioctl, NULL, name);
if (sc != RTEMS_SUCCESSFUL)
5b28: e2507000 subs r7, r0, #0
5b2c: 0a000052 beq 5c7c <rtems_fdisk_initialize+0x3b8>
{
rtems_semaphore_delete (fd->lock);
5b30: e5940064 ldr r0, [r4, #100] ; 0x64 <== NOT EXECUTED
5b34: eb00145b bl aca8 <rtems_semaphore_delete> <== NOT EXECUTED
rtems_disk_delete (dev);
5b38: e1a01006 mov r1, r6 <== NOT EXECUTED
5b3c: e59d001c ldr r0, [sp, #28] <== NOT EXECUTED
5b40: ebfff4f1 bl 2f0c <rtems_disk_delete> <== NOT EXECUTED
free (fd->copy_buffer);
5b44: e5940068 ldr r0, [r4, #104] ; 0x68 <== NOT EXECUTED
5b48: eb000330 bl 6810 <free> <== NOT EXECUTED
free (fd->blocks);
5b4c: e5940018 ldr r0, [r4, #24] <== NOT EXECUTED
5b50: eb00032e bl 6810 <free> <== NOT EXECUTED
free (fd->devices);
5b54: e594002c ldr r0, [r4, #44] ; 0x2c <== NOT EXECUTED
5b58: eb00032c bl 6810 <free> <== NOT EXECUTED
rtems_fdisk_error ("disk create phy failed");
5b5c: e59f0260 ldr r0, [pc, #608] ; 5dc4 <rtems_fdisk_initialize+0x500><== NOT EXECUTED
5b60: ebfff7e5 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
return sc;
5b64: ea000081 b 5d70 <rtems_fdisk_initialize+0x4ac> <== NOT EXECUTED
{
rtems_fdisk_segment_ctl* sc;
uint32_t segment_count;
uint32_t segment;
segment_count = rtems_fdisk_count_segments (&c->devices[device]);
5b68: e5953008 ldr r3, [r5, #8]
static uint32_t
rtems_fdisk_count_segments (const rtems_fdisk_device_desc* dd)
{
uint32_t count = 0;
uint32_t segment;
for (segment = 0; segment < dd->segment_count; segment++)
5b6c: e3a02000 mov r2, #0
{
rtems_fdisk_segment_ctl* sc;
uint32_t segment_count;
uint32_t segment;
segment_count = rtems_fdisk_count_segments (&c->devices[device]);
5b70: e0839007 add r9, r3, r7
static uint32_t
rtems_fdisk_count_segments (const rtems_fdisk_device_desc* dd)
{
uint32_t count = 0;
uint32_t segment;
for (segment = 0; segment < dd->segment_count; segment++)
5b74: e1a01002 mov r1, r2
5b78: e7933007 ldr r3, [r3, r7]
* Count the segments for a device.
*/
static uint32_t
rtems_fdisk_count_segments (const rtems_fdisk_device_desc* dd)
{
uint32_t count = 0;
5b7c: e1a0a002 mov sl, r2
5b80: ea000004 b 5b98 <rtems_fdisk_initialize+0x2d4>
uint32_t segment;
for (segment = 0; segment < dd->segment_count; segment++)
count += dd->segments[segment].count;
5b84: e5990004 ldr r0, [r9, #4]
5b88: e19000b2 ldrh r0, [r0, r2]
static uint32_t
rtems_fdisk_count_segments (const rtems_fdisk_device_desc* dd)
{
uint32_t count = 0;
uint32_t segment;
for (segment = 0; segment < dd->segment_count; segment++)
5b8c: e2811001 add r1, r1, #1
count += dd->segments[segment].count;
5b90: e08aa000 add sl, sl, r0
static uint32_t
rtems_fdisk_count_segments (const rtems_fdisk_device_desc* dd)
{
uint32_t count = 0;
uint32_t segment;
for (segment = 0; segment < dd->segment_count; segment++)
5b94: e282200c add r2, r2, #12
5b98: e1510003 cmp r1, r3
5b9c: 1afffff8 bne 5b84 <rtems_fdisk_initialize+0x2c0>
uint32_t segment_count;
uint32_t segment;
segment_count = rtems_fdisk_count_segments (&c->devices[device]);
fd->devices[device].segments = calloc (segment_count,
5ba0: e594b02c ldr fp, [r4, #44] ; 0x2c
5ba4: e1a0000a mov r0, sl
5ba8: e08b2007 add r2, fp, r7
5bac: e3a01030 mov r1, #48 ; 0x30
5bb0: e58d300c str r3, [sp, #12]
5bb4: e58d2020 str r2, [sp, #32]
5bb8: eb000236 bl 6498 <calloc>
sizeof (rtems_fdisk_segment_ctl));
if (!fd->devices[device].segments)
5bbc: e3500000 cmp r0, #0
uint32_t segment_count;
uint32_t segment;
segment_count = rtems_fdisk_count_segments (&c->devices[device]);
fd->devices[device].segments = calloc (segment_count,
5bc0: e78b0007 str r0, [fp, r7]
sizeof (rtems_fdisk_segment_ctl));
if (!fd->devices[device].segments)
5bc4: e59d300c ldr r3, [sp, #12]
5bc8: 1a000021 bne 5c54 <rtems_fdisk_initialize+0x390>
{
rtems_disk_delete (dev);
5bcc: e1a01006 mov r1, r6 <== NOT EXECUTED
5bd0: e59d001c ldr r0, [sp, #28] <== NOT EXECUTED
5bd4: ebfff4cc bl 2f0c <rtems_disk_delete> <== NOT EXECUTED
rtems_semaphore_delete (fd->lock);
5bd8: e5940064 ldr r0, [r4, #100] ; 0x64 <== NOT EXECUTED
5bdc: eb001431 bl aca8 <rtems_semaphore_delete> <== NOT EXECUTED
free (fd->copy_buffer);
5be0: e5940068 ldr r0, [r4, #104] ; 0x68 <== NOT EXECUTED
5be4: eb000309 bl 6810 <free> <== NOT EXECUTED
free (fd->blocks);
5be8: e5940018 ldr r0, [r4, #24] <== NOT EXECUTED
5bec: eb000307 bl 6810 <free> <== NOT EXECUTED
free (fd->devices);
5bf0: e594002c ldr r0, [r4, #44] ; 0x2c <== NOT EXECUTED
5bf4: eb000305 bl 6810 <free> <== NOT EXECUTED
5bf8: ea00005b b 5d6c <rtems_fdisk_initialize+0x4a8> <== NOT EXECUTED
for (segment = 0; segment < c->devices[device].segment_count; segment++)
{
const rtems_fdisk_segment_desc* sd;
uint32_t seg_segment;
sd = &c->devices[device].segments[segment];
5bfc: e5992004 ldr r2, [r9, #4]
5c00: e082c001 add ip, r2, r1
5c04: e58dc024 str ip, [sp, #36] ; 0x24
for (seg_segment = 0; seg_segment < sd->count; seg_segment++, sc++)
5c08: e192b0b1 ldrh fp, [r2, r1]
5c0c: e3a0c000 mov ip, #0
5c10: e1a02000 mov r2, r0
5c14: e58d3028 str r3, [sp, #40] ; 0x28
5c18: ea000005 b 5c34 <rtems_fdisk_initialize+0x370>
{
sc->descriptor = sd;
5c1c: e59d3024 ldr r3, [sp, #36] ; 0x24
sc->device = device;
sc->segment = seg_segment;
5c20: e9821108 stmib r2, {r3, r8, ip}
sc->erased = 0;
5c24: e3a03000 mov r3, #0
5c28: e582302c str r3, [r2, #44] ; 0x2c
const rtems_fdisk_segment_desc* sd;
uint32_t seg_segment;
sd = &c->devices[device].segments[segment];
for (seg_segment = 0; seg_segment < sd->count; seg_segment++, sc++)
5c2c: e28cc001 add ip, ip, #1
5c30: e2822030 add r2, r2, #48 ; 0x30
5c34: e15c000b cmp ip, fp
5c38: 3afffff7 bcc 5c1c <rtems_fdisk_initialize+0x358>
5c3c: e3a0c030 mov ip, #48 ; 0x30
5c40: e59d3028 ldr r3, [sp, #40] ; 0x28
5c44: e0200b9c mla r0, ip, fp, r0
return RTEMS_NO_MEMORY;
}
sc = fd->devices[device].segments;
for (segment = 0; segment < c->devices[device].segment_count; segment++)
5c48: e28ee001 add lr, lr, #1
5c4c: e281100c add r1, r1, #12
5c50: ea000001 b 5c5c <rtems_fdisk_initialize+0x398>
segment_count = rtems_fdisk_count_segments (&c->devices[device]);
fd->devices[device].segments = calloc (segment_count,
sizeof (rtems_fdisk_segment_ctl));
if (!fd->devices[device].segments)
5c54: e3a01000 mov r1, #0
5c58: e1a0e001 mov lr, r1
return RTEMS_NO_MEMORY;
}
sc = fd->devices[device].segments;
for (segment = 0; segment < c->devices[device].segment_count; segment++)
5c5c: e15e0003 cmp lr, r3
5c60: 1affffe5 bne 5bfc <rtems_fdisk_initialize+0x338>
sc->segment = seg_segment;
sc->erased = 0;
}
}
fd->devices[device].segment_count = segment_count;
5c64: e59d2020 ldr r2, [sp, #32]
free (fd->devices);
rtems_fdisk_error ("disk create phy failed");
return sc;
}
for (device = 0; device < c->device_count; device++)
5c68: e2888001 add r8, r8, #1
sc->segment = seg_segment;
sc->erased = 0;
}
}
fd->devices[device].segment_count = segment_count;
5c6c: e582a004 str sl, [r2, #4]
fd->devices[device].descriptor = &c->devices[device];
5c70: e5829008 str r9, [r2, #8]
free (fd->devices);
rtems_fdisk_error ("disk create phy failed");
return sc;
}
for (device = 0; device < c->device_count; device++)
5c74: e287700c add r7, r7, #12
5c78: ea000000 b 5c80 <rtems_fdisk_initialize+0x3bc>
}
sc = rtems_disk_create_phys(dev, c->block_size,
blocks - fd->unavail_blocks,
rtems_fdisk_ioctl, NULL, name);
if (sc != RTEMS_SUCCESSFUL)
5c7c: e1a08007 mov r8, r7
free (fd->devices);
rtems_fdisk_error ("disk create phy failed");
return sc;
}
for (device = 0; device < c->device_count; device++)
5c80: e5953004 ldr r3, [r5, #4]
5c84: e1580003 cmp r8, r3
5c88: 3affffb6 bcc 5b68 <rtems_fdisk_initialize+0x2a4>
fd->devices[device].segment_count = segment_count;
fd->devices[device].descriptor = &c->devices[device];
}
fd->device_count = c->device_count;
5c8c: e5843030 str r3, [r4, #48] ; 0x30
ret = rtems_fdisk_recover_block_mappings (fd);
5c90: e1a00004 mov r0, r4
5c94: ebfff9c5 bl 43b0 <rtems_fdisk_recover_block_mappings>
if (ret)
5c98: e2507000 subs r7, r0, #0
5c9c: 0a00000f beq 5ce0 <rtems_fdisk_initialize+0x41c>
{
rtems_disk_delete (dev);
5ca0: e1a01006 mov r1, r6 <== NOT EXECUTED
5ca4: e59d001c ldr r0, [sp, #28] <== NOT EXECUTED
5ca8: ebfff497 bl 2f0c <rtems_disk_delete> <== NOT EXECUTED
rtems_semaphore_delete (fd->lock);
5cac: e5940064 ldr r0, [r4, #100] ; 0x64 <== NOT EXECUTED
5cb0: eb0013fc bl aca8 <rtems_semaphore_delete> <== NOT EXECUTED
free (fd->copy_buffer);
5cb4: e5940068 ldr r0, [r4, #104] ; 0x68 <== NOT EXECUTED
5cb8: eb0002d4 bl 6810 <free> <== NOT EXECUTED
free (fd->blocks);
5cbc: e5940018 ldr r0, [r4, #24] <== NOT EXECUTED
5cc0: eb0002d2 bl 6810 <free> <== NOT EXECUTED
free (fd->devices);
5cc4: e594002c ldr r0, [r4, #44] ; 0x2c <== NOT EXECUTED
5cc8: eb0002d0 bl 6810 <free> <== NOT EXECUTED
rtems_fdisk_error ("recovery of disk failed: %s (%d)",
5ccc: e1a00007 mov r0, r7 <== NOT EXECUTED
5cd0: eb006803 bl 1fce4 <strerror> <== NOT EXECUTED
5cd4: e1a01000 mov r1, r0 <== NOT EXECUTED
5cd8: e59f00e8 ldr r0, [pc, #232] ; 5dc8 <rtems_fdisk_initialize+0x504><== NOT EXECUTED
5cdc: ea000015 b 5d38 <rtems_fdisk_initialize+0x474> <== NOT EXECUTED
strerror (ret), ret);
return ret;
}
ret = rtems_fdisk_compact (fd);
5ce0: e1a00004 mov r0, r4
5ce4: ebfff936 bl 41c4 <rtems_fdisk_compact>
5ce8: e59dc018 ldr ip, [sp, #24]
if (ret)
5cec: e2507000 subs r7, r0, #0
rtems_fdisk_error ("recovery of disk failed: %s (%d)",
strerror (ret), ret);
return ret;
}
ret = rtems_fdisk_compact (fd);
5cf0: e28cc074 add ip, ip, #116 ; 0x74
5cf4: e58dc018 str ip, [sp, #24]
if (ret)
5cf8: 0a000011 beq 5d44 <rtems_fdisk_initialize+0x480>
{
rtems_disk_delete (dev);
5cfc: e1a01006 mov r1, r6 <== NOT EXECUTED
5d00: e59d001c ldr r0, [sp, #28] <== NOT EXECUTED
5d04: ebfff480 bl 2f0c <rtems_disk_delete> <== NOT EXECUTED
rtems_semaphore_delete (fd->lock);
5d08: e5940064 ldr r0, [r4, #100] ; 0x64 <== NOT EXECUTED
5d0c: eb0013e5 bl aca8 <rtems_semaphore_delete> <== NOT EXECUTED
free (fd->copy_buffer);
5d10: e5940068 ldr r0, [r4, #104] ; 0x68 <== NOT EXECUTED
5d14: eb0002bd bl 6810 <free> <== NOT EXECUTED
free (fd->blocks);
5d18: e5940018 ldr r0, [r4, #24] <== NOT EXECUTED
5d1c: eb0002bb bl 6810 <free> <== NOT EXECUTED
free (fd->devices);
5d20: e594002c ldr r0, [r4, #44] ; 0x2c <== NOT EXECUTED
5d24: eb0002b9 bl 6810 <free> <== NOT EXECUTED
rtems_fdisk_error ("compacting of disk failed: %s (%d)",
5d28: e1a00007 mov r0, r7 <== NOT EXECUTED
5d2c: eb0067ec bl 1fce4 <strerror> <== NOT EXECUTED
5d30: e1a01000 mov r1, r0 <== NOT EXECUTED
5d34: e59f0090 ldr r0, [pc, #144] ; 5dcc <rtems_fdisk_initialize+0x508><== NOT EXECUTED
5d38: e1a02007 mov r2, r7 <== NOT EXECUTED
5d3c: ebfff76e bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
strerror (ret), ret);
return ret;
5d40: ea00000a b 5d70 <rtems_fdisk_initialize+0x4ac> <== NOT EXECUTED
sizeof (rtems_flashdisk));
if (!rtems_flashdisks)
return RTEMS_NO_MEMORY;
for (minor = 0; minor < rtems_flashdisk_configuration_size; minor++, c++)
5d44: e2866001 add r6, r6, #1
5d48: e2855020 add r5, r5, #32
5d4c: e59f307c ldr r3, [pc, #124] ; 5dd0 <rtems_fdisk_initialize+0x50c>
5d50: e5933000 ldr r3, [r3]
5d54: e1560003 cmp r6, r3
5d58: e59f404c ldr r4, [pc, #76] ; 5dac <rtems_fdisk_initialize+0x4e8>
5d5c: 3afffef5 bcc 5938 <rtems_fdisk_initialize+0x74>
strerror (ret), ret);
return ret;
}
}
rtems_flashdisk_count = rtems_flashdisk_configuration_size;
5d60: e5843004 str r3, [r4, #4]
return RTEMS_SUCCESSFUL;
5d64: e3a07000 mov r7, #0
5d68: ea000000 b 5d70 <rtems_fdisk_initialize+0x4ac>
rtems_flashdisks = calloc (rtems_flashdisk_configuration_size,
sizeof (rtems_flashdisk));
if (!rtems_flashdisks)
return RTEMS_NO_MEMORY;
5d6c: e3a0701a mov r7, #26 <== NOT EXECUTED
}
rtems_flashdisk_count = rtems_flashdisk_configuration_size;
return RTEMS_SUCCESSFUL;
}
5d70: e1a00007 mov r0, r7
5d74: e28dd03c add sp, sp, #60 ; 0x3c
5d78: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
sc = rtems_fdisk_crc16_gen_factors (0x8408);
if (sc != RTEMS_SUCCESSFUL)
return sc;
rtems_flashdisks = calloc (rtems_flashdisk_configuration_size,
5d7c: e59f304c ldr r3, [pc, #76] ; 5dd0 <rtems_fdisk_initialize+0x50c>
5d80: e3a01074 mov r1, #116 ; 0x74
5d84: e5930000 ldr r0, [r3]
5d88: eb0001c2 bl 6498 <calloc>
5d8c: e59f3018 ldr r3, [pc, #24] ; 5dac <rtems_fdisk_initialize+0x4e8>
sizeof (rtems_flashdisk));
if (!rtems_flashdisks)
5d90: e3500000 cmp r0, #0
sc = rtems_fdisk_crc16_gen_factors (0x8408);
if (sc != RTEMS_SUCCESSFUL)
return sc;
rtems_flashdisks = calloc (rtems_flashdisk_configuration_size,
5d94: e5830000 str r0, [r3]
sizeof (rtems_flashdisk));
if (!rtems_flashdisks)
5d98: 0afffff3 beq 5d6c <rtems_fdisk_initialize+0x4a8>
5d9c: e58d4018 str r4, [sp, #24]
5da0: e59f502c ldr r5, [pc, #44] ; 5dd4 <rtems_fdisk_initialize+0x510>
5da4: e1a06004 mov r6, r4
5da8: eaffffe7 b 5d4c <rtems_fdisk_initialize+0x488>
000046cc <rtems_fdisk_ioctl>:
* @param argp IOCTL argument.
* @retval The IOCTL return value
*/
static int
rtems_fdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
{
46cc: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
46d0: e24dd064 sub sp, sp, #100 ; 0x64
46d4: e1a07001 mov r7, r1
46d8: e1a04002 mov r4, r2
dev_t device
)
{
union __rtems_dev_t temp;
temp.device = device;
46dc: e5908004 ldr r8, [r0, #4]
46e0: e1a0a000 mov sl, r0
dev_t dev = rtems_disk_get_device_identifier (dd);
rtems_device_minor_number minor = rtems_filesystem_dev_minor_t (dev);
rtems_blkdev_request* r = argp;
rtems_status_code sc;
errno = 0;
46e4: eb0063ba bl 1d5d4 <__errno>
sc = rtems_semaphore_obtain (rtems_flashdisks[minor].lock, RTEMS_WAIT, 0);
46e8: e3a03074 mov r3, #116 ; 0x74
46ec: e00c0893 mul ip, r3, r8
46f0: e59f6f90 ldr r6, [pc, #3984] ; 5688 <bsp_section_rodata_size+0x7d4>
46f4: e5963000 ldr r3, [r6]
dev_t dev = rtems_disk_get_device_identifier (dd);
rtems_device_minor_number minor = rtems_filesystem_dev_minor_t (dev);
rtems_blkdev_request* r = argp;
rtems_status_code sc;
errno = 0;
46f8: e3a01000 mov r1, #0
sc = rtems_semaphore_obtain (rtems_flashdisks[minor].lock, RTEMS_WAIT, 0);
46fc: e083300c add r3, r3, ip
dev_t dev = rtems_disk_get_device_identifier (dd);
rtems_device_minor_number minor = rtems_filesystem_dev_minor_t (dev);
rtems_blkdev_request* r = argp;
rtems_status_code sc;
errno = 0;
4700: e5801000 str r1, [r0]
sc = rtems_semaphore_obtain (rtems_flashdisks[minor].lock, RTEMS_WAIT, 0);
4704: e1a02001 mov r2, r1
4708: e5930064 ldr r0, [r3, #100] ; 0x64
470c: e58dc034 str ip, [sp, #52] ; 0x34
4710: eb00198b bl ad44 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL)
4714: e2505000 subs r5, r0, #0
4718: 1a00045a bne 5888 <bsp_section_rodata_size+0x9d4>
errno = EIO;
else
{
errno = 0;
471c: eb0063ac bl 1d5d4 <__errno>
switch (req)
4720: e59f3f64 ldr r3, [pc, #3940] ; 568c <bsp_section_rodata_size+0x7d8>
4724: e1570003 cmp r7, r3
sc = rtems_semaphore_obtain (rtems_flashdisks[minor].lock, RTEMS_WAIT, 0);
if (sc != RTEMS_SUCCESSFUL)
errno = EIO;
else
{
errno = 0;
4728: e5805000 str r5, [r0]
switch (req)
472c: 0a0002b5 beq 5208 <bsp_section_rodata_size+0x354>
4730: 8a000007 bhi 4754 <rtems_fdisk_ioctl+0x88>
4734: e2433002 sub r3, r3, #2
4738: e1570003 cmp r7, r3
473c: 0a000294 beq 5194 <bsp_section_rodata_size+0x2e0>
4740: 8a00029b bhi 51b4 <bsp_section_rodata_size+0x300>
4744: e2433001 sub r3, r3, #1
4748: e1570003 cmp r7, r3
474c: 1a000441 bne 5858 <bsp_section_rodata_size+0x9a4>
4750: ea000257 b 50b4 <bsp_section_rodata_size+0x200> <== NOT EXECUTED
4754: e59f3f34 ldr r3, [pc, #3892] ; 5690 <bsp_section_rodata_size+0x7dc>
4758: e1570003 cmp r7, r3
475c: 0a000313 beq 53b0 <bsp_section_rodata_size+0x4fc>
4760: 3a00030d bcc 539c <bsp_section_rodata_size+0x4e8>
4764: e59f3f28 ldr r3, [pc, #3880] ; 5694 <bsp_section_rodata_size+0x7e0>
4768: e1570003 cmp r7, r3
476c: 1a000439 bne 5858 <bsp_section_rodata_size+0x9a4>
{
case RTEMS_BLKIO_REQUEST:
if ((minor >= rtems_flashdisk_count) ||
4770: e5963004 ldr r3, [r6, #4]
4774: e1580003 cmp r8, r3
4778: 2a000005 bcs 4794 <rtems_fdisk_ioctl+0xc8>
(rtems_flashdisks[minor].device_count == 0))
477c: e5963000 ldr r3, [r6]
4780: e59dc034 ldr ip, [sp, #52] ; 0x34
4784: e083300c add r3, r3, ip
{
errno = 0;
switch (req)
{
case RTEMS_BLKIO_REQUEST:
if ((minor >= rtems_flashdisk_count) ||
4788: e5933030 ldr r3, [r3, #48] ; 0x30
478c: e3530000 cmp r3, #0
4790: 1a000002 bne 47a0 <rtems_fdisk_ioctl+0xd4>
(rtems_flashdisks[minor].device_count == 0))
{
errno = ENODEV;
4794: eb00638e bl 1d5d4 <__errno> <== NOT EXECUTED
4798: e3a03013 mov r3, #19 <== NOT EXECUTED
479c: ea000242 b 50ac <bsp_section_rodata_size+0x1f8> <== NOT EXECUTED
}
else
{
switch (r->req)
47a0: e5945000 ldr r5, [r4]
47a4: e3550000 cmp r5, #0
47a8: 0a000002 beq 47b8 <rtems_fdisk_ioctl+0xec>
47ac: e3550001 cmp r5, #1
47b0: 1a00023b bne 50a4 <bsp_section_rodata_size+0x1f0>
47b4: ea0000b8 b 4a9c <rtems_fdisk_ioctl+0x3d0>
{
case RTEMS_BLKDEV_REQ_READ:
errno = rtems_fdisk_read (&rtems_flashdisks[minor], r);
47b8: eb006385 bl 1d5d4 <__errno>
47bc: e5966000 ldr r6, [r6]
47c0: e59dc034 ldr ip, [sp, #52] ; 0x34
47c4: e58d0044 str r0, [sp, #68] ; 0x44
47c8: e086600c add r6, r6, ip
* @retval 0 Always. The request done callback contains the status.
*/
static int
rtems_fdisk_read (rtems_flashdisk* fd, rtems_blkdev_request* req)
{
rtems_blkdev_sg_buffer* sg = req->bufs;
47cc: e2848018 add r8, r4, #24
uint32_t buf;
int ret = 0;
for (buf = 0; (ret == 0) && (buf < req->bufnum); buf++, sg++)
47d0: e58d5038 str r5, [sp, #56] ; 0x38
47d4: e1a09004 mov r9, r4
47d8: ea0000a0 b 4a60 <rtems_fdisk_ioctl+0x394>
{
uint8_t* data;
uint32_t fb;
uint32_t b;
fb = sg->length / fd->block_size;
47dc: e5980004 ldr r0, [r8, #4]
47e0: e5961014 ldr r1, [r6, #20]
47e4: ebfff455 bl 1940 <__aeabi_uidiv>
data = sg->buffer;
for (b = 0; b < fb; b++, data += fd->block_size)
47e8: e3a0c000 mov ip, #0
for (buf = 0; (ret == 0) && (buf < req->bufnum); buf++, sg++)
{
uint8_t* data;
uint32_t fb;
uint32_t b;
fb = sg->length / fd->block_size;
47ec: e58d003c str r0, [sp, #60] ; 0x3c
data = sg->buffer;
47f0: e5987008 ldr r7, [r8, #8]
for (b = 0; b < fb; b++, data += fd->block_size)
47f4: e58dc030 str ip, [sp, #48] ; 0x30
47f8: e58d902c str r9, [sp, #44] ; 0x2c
47fc: ea00008b b 4a30 <rtems_fdisk_ioctl+0x364>
{
ret = rtems_fdisk_read_block (fd, sg->block + b, data);
4800: e5985000 ldr r5, [r8]
4804: e59dc030 ldr ip, [sp, #48] ; 0x30
4808: e08c5005 add r5, ip, r5
rtems_fdisk_block_ctl* bc;
rtems_fdisk_segment_ctl* sc;
rtems_fdisk_page_desc* pd;
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "read-block:%d", block);
480c: e1a00006 mov r0, r6
4810: e59f1e80 ldr r1, [pc, #3712] ; 5698 <bsp_section_rodata_size+0x7e4>
4814: e1a02005 mov r2, r5
4818: ebfffbcc bl 3750 <rtems_fdisk_info>
/*
* Broken out to allow info messages when testing.
*/
if (block >= (fd->block_count - fd->unavail_blocks))
481c: e286e01c add lr, r6, #28
4820: e89e4008 ldm lr, {r3, lr}
4824: e043300e sub r3, r3, lr
4828: e1550003 cmp r5, r3
482c: 3a000004 bcc 4844 <rtems_fdisk_ioctl+0x178>
{
rtems_fdisk_error ("read-block: block out of range: %d", block);
4830: e1a01005 mov r1, r5 <== NOT EXECUTED
4834: e59f0e60 ldr r0, [pc, #3680] ; 569c <bsp_section_rodata_size+0x7e8><== NOT EXECUTED
4838: e59d902c ldr r9, [sp, #44] ; 0x2c <== NOT EXECUTED
483c: ebfffcae bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
4840: ea000078 b 4a28 <rtems_fdisk_ioctl+0x35c> <== NOT EXECUTED
return EIO;
}
bc = &fd->blocks[block];
4844: e5963018 ldr r3, [r6, #24]
if (!bc->segment)
4848: e7934185 ldr r4, [r3, r5, lsl #3]
484c: e3540000 cmp r4, #0
{
rtems_fdisk_error ("read-block: block out of range: %d", block);
return EIO;
}
bc = &fd->blocks[block];
4850: e083a185 add sl, r3, r5, lsl #3
if (!bc->segment)
4854: 1a000008 bne 487c <rtems_fdisk_ioctl+0x1b0>
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "read-block: no segment mapping: %d", block);
4858: e1a02005 mov r2, r5
485c: e1a00006 mov r0, r6
4860: e59f1e38 ldr r1, [pc, #3640] ; 56a0 <bsp_section_rodata_size+0x7ec>
4864: ebfffbb9 bl 3750 <rtems_fdisk_info>
#endif
memset (buffer, 0xff, fd->block_size);
4868: e1a00007 mov r0, r7
486c: e3a010ff mov r1, #255 ; 0xff
4870: e5962014 ldr r2, [r6, #20]
4874: eb0067fb bl 1e868 <memset>
4878: ea00040b b 58ac <bsp_section_rodata_size+0x9f8>
sc = fd->blocks[block].segment;
pd = &sc->page_descriptors[bc->page];
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd,
487c: e5940014 ldr r0, [r4, #20]
4880: e58d0040 str r0, [sp, #64] ; 0x40
4884: e5940024 ldr r0, [r4, #36] ; 0x24
4888: e594e020 ldr lr, [r4, #32]
488c: e594101c ldr r1, [r4, #28]
4890: e58d004c str r0, [sp, #76] ; 0x4c
4894: e5940000 ldr r0, [r4]
4898: e58de048 str lr, [sp, #72] ; 0x48
489c: e59fee00 ldr lr, [pc, #3584] ; 56a4 <bsp_section_rodata_size+0x7f0>
48a0: e3500000 cmp r0, #0
48a4: e58d1054 str r1, [sp, #84] ; 0x54
48a8: e59f1df8 ldr r1, [pc, #3576] ; 56a8 <bsp_section_rodata_size+0x7f4>
48ac: 11a0100e movne r1, lr
memset (buffer, 0xff, fd->block_size);
return 0;
}
sc = fd->blocks[block].segment;
pd = &sc->page_descriptors[bc->page];
48b0: e59a2004 ldr r2, [sl, #4]
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd,
48b4: e58d1050 str r1, [sp, #80] ; 0x50
48b8: e594100c ldr r1, [r4, #12]
memset (buffer, 0xff, fd->block_size);
return 0;
}
sc = fd->blocks[block].segment;
pd = &sc->page_descriptors[bc->page];
48bc: e594b010 ldr fp, [r4, #16]
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd,
48c0: e5943008 ldr r3, [r4, #8]
memset (buffer, 0xff, fd->block_size);
return 0;
}
sc = fd->blocks[block].segment;
pd = &sc->page_descriptors[bc->page];
48c4: e1a0c182 lsl ip, r2, #3
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd,
48c8: e88d0006 stm sp, {r1, r2}
48cc: e59d2040 ldr r2, [sp, #64] ; 0x40
48d0: e59d0048 ldr r0, [sp, #72] ; 0x48
48d4: e58d2008 str r2, [sp, #8]
48d8: e59d104c ldr r1, [sp, #76] ; 0x4c
48dc: e59d2050 ldr r2, [sp, #80] ; 0x50
48e0: e59de054 ldr lr, [sp, #84] ; 0x54
48e4: e58d0010 str r0, [sp, #16]
48e8: e58d1014 str r1, [sp, #20]
48ec: e58de00c str lr, [sp, #12]
48f0: e58d2018 str r2, [sp, #24]
memset (buffer, 0xff, fd->block_size);
return 0;
}
sc = fd->blocks[block].segment;
pd = &sc->page_descriptors[bc->page];
48f4: e08b900c add r9, fp, ip
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd,
48f8: e1d920b2 ldrh r2, [r9, #2]
48fc: e58d201c str r2, [sp, #28]
4900: e19b20bc ldrh r2, [fp, ip]
4904: e58d2020 str r2, [sp, #32]
4908: e5992004 ldr r2, [r9, #4]
490c: e1a00006 mov r0, r6
4910: e58d2024 str r2, [sp, #36] ; 0x24
4914: e59f1d90 ldr r1, [pc, #3472] ; 56ac <bsp_section_rodata_size+0x7f8>
4918: e1a02005 mov r2, r5
491c: e58dc028 str ip, [sp, #40] ; 0x28
4920: ebfffb8a bl 3750 <rtems_fdisk_info>
* only set a flag by changing it from 1 to 0.
*/
static bool
rtems_fdisk_page_desc_flags_set (rtems_fdisk_page_desc* pd, uint16_t flags)
{
return (pd->flags & flags) == 0 ? true : false;
4924: e1d930b2 ldrh r3, [r9, #2]
sc->pages, sc->pages_active, sc->pages_used, sc->pages_bad,
sc->next ? "set" : "null",
pd->flags, pd->crc, pd->block);
#endif
if (rtems_fdisk_page_desc_flags_set (pd, RTEMS_FDISK_PAGE_ACTIVE))
4928: e3130001 tst r3, #1
492c: 1a000035 bne 4a08 <rtems_fdisk_ioctl+0x33c>
{
if (rtems_fdisk_page_desc_flags_clear (pd, RTEMS_FDISK_PAGE_USED))
4930: e3130002 tst r3, #2
4934: e59a2004 ldr r2, [sl, #4]
4938: 0a00002e beq 49f8 <rtems_fdisk_ioctl+0x32c>
/*
* We use the segment page offset not the page number used in the
* driver. This skips the page descriptors.
*/
int ret = rtems_fdisk_seg_read_page (fd, sc,
493c: e5941018 ldr r1, [r4, #24]
rtems_fdisk_segment_ctl* sc,
uint32_t page,
void* buffer)
{
return rtems_fdisk_seg_read (fd, sc,
page * fd->block_size, buffer, fd->block_size);
4940: e5963014 ldr r3, [r6, #20]
/*
* We use the segment page offset not the page number used in the
* driver. This skips the page descriptors.
*/
int ret = rtems_fdisk_seg_read_page (fd, sc,
4944: e0812002 add r2, r1, r2
rtems_fdisk_seg_read_page (const rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* sc,
uint32_t page,
void* buffer)
{
return rtems_fdisk_seg_read (fd, sc,
4948: e58d3000 str r3, [sp]
494c: e0020293 mul r2, r3, r2
4950: e1a00006 mov r0, r6
4954: e1a03007 mov r3, r7
4958: e1a01004 mov r1, r4
495c: ebfffbbb bl 3850 <rtems_fdisk_seg_read>
* driver. This skips the page descriptors.
*/
int ret = rtems_fdisk_seg_read_page (fd, sc,
bc->page + sc->pages_desc, buffer);
if (ret)
4960: e2503000 subs r3, r0, #0
4964: e59dc028 ldr ip, [sp, #40] ; 0x28
4968: 0a00000d beq 49a4 <rtems_fdisk_ioctl+0x2d8>
496c: e1a0b003 mov fp, r3 <== NOT EXECUTED
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd,
4970: e5945008 ldr r5, [r4, #8] <== NOT EXECUTED
4974: e59a7004 ldr r7, [sl, #4] <== NOT EXECUTED
4978: e594400c ldr r4, [r4, #12] <== NOT EXECUTED
497c: e59d902c ldr r9, [sp, #44] ; 0x2c <== NOT EXECUTED
4980: eb006cd7 bl 1fce4 <strerror> <== NOT EXECUTED
4984: e59f1d24 ldr r1, [pc, #3364] ; 56b0 <bsp_section_rodata_size+0x7fc><== NOT EXECUTED
4988: e98d0801 stmib sp, {r0, fp} <== NOT EXECUTED
498c: e1a02005 mov r2, r5 <== NOT EXECUTED
4990: e1a00006 mov r0, r6 <== NOT EXECUTED
4994: e1a03004 mov r3, r4 <== NOT EXECUTED
4998: e58d7000 str r7, [sp] <== NOT EXECUTED
499c: ebfffb6b bl 3750 <rtems_fdisk_info> <== NOT EXECUTED
49a0: ea000020 b 4a28 <rtems_fdisk_ioctl+0x35c> <== NOT EXECUTED
{
uint16_t cs = 0xffff;
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
cs = rtems_fdisk_calc_crc16 (cs, *buffer);
49a4: e59fecdc ldr lr, [pc, #3292] ; 5688 <bsp_section_rodata_size+0x7d4>
strerror (ret), ret);
#endif
return ret;
}
cs = rtems_fdisk_page_checksum (buffer, fd->block_size);
49a8: e5960014 ldr r0, [r6, #20]
{
uint16_t cs = 0xffff;
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
cs = rtems_fdisk_calc_crc16 (cs, *buffer);
49ac: e59e1008 ldr r1, [lr, #8]
* Calculate the checksum of a page in a segment.
*/
static uint16_t
rtems_fdisk_page_checksum (const uint8_t* buffer, uint32_t page_size)
{
uint16_t cs = 0xffff;
49b0: e59f2cfc ldr r2, [pc, #3324] ; 56b4 <bsp_section_rodata_size+0x800>
49b4: ea000005 b 49d0 <rtems_fdisk_ioctl+0x304>
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
cs = rtems_fdisk_calc_crc16 (cs, *buffer);
49b8: e7d7e003 ldrb lr, [r7, r3]
49bc: e02e2002 eor r2, lr, r2
49c0: e20220ff and r2, r2, #255 ; 0xff
49c4: e1a02082 lsl r2, r2, #1
49c8: e19120b2 ldrh r2, [r1, r2]
rtems_fdisk_page_checksum (const uint8_t* buffer, uint32_t page_size)
{
uint16_t cs = 0xffff;
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
49cc: e2833001 add r3, r3, #1
49d0: e1530000 cmp r3, r0
49d4: 1afffff7 bne 49b8 <rtems_fdisk_ioctl+0x2ec>
return ret;
}
cs = rtems_fdisk_page_checksum (buffer, fd->block_size);
if (cs == pd->crc)
49d8: e19b30bc ldrh r3, [fp, ip]
49dc: e1520003 cmp r2, r3
49e0: 0a0003b1 beq 58ac <bsp_section_rodata_size+0x9f8>
return 0;
rtems_fdisk_error ("read-block: crc failure: %d: buffer:%04x page:%04x",
49e4: e1a01005 mov r1, r5 <== NOT EXECUTED
49e8: e59f0cc8 ldr r0, [pc, #3272] ; 56b8 <bsp_section_rodata_size+0x804><== NOT EXECUTED
49ec: e59d902c ldr r9, [sp, #44] ; 0x2c <== NOT EXECUTED
49f0: ebfffc41 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
49f4: ea00000b b 4a28 <rtems_fdisk_ioctl+0x35c> <== NOT EXECUTED
49f8: e59d902c ldr r9, [sp, #44] ; 0x2c <== NOT EXECUTED
block, cs, pd->crc);
}
else
{
rtems_fdisk_error ("read-block: block points to used page: %d: %d-%d-%d",
49fc: e58d2000 str r2, [sp] <== NOT EXECUTED
4a00: e59f0cb4 ldr r0, [pc, #3252] ; 56bc <bsp_section_rodata_size+0x808><== NOT EXECUTED
4a04: ea000003 b 4a18 <rtems_fdisk_ioctl+0x34c> <== NOT EXECUTED
block, sc->device, sc->segment, bc->page);
}
}
else
{
rtems_fdisk_error ("read-block: block page not active: %d: %d-%d-%d",
4a08: e59a3004 ldr r3, [sl, #4] <== NOT EXECUTED
4a0c: e59d902c ldr r9, [sp, #44] ; 0x2c <== NOT EXECUTED
4a10: e58d3000 str r3, [sp] <== NOT EXECUTED
4a14: e59f0ca4 ldr r0, [pc, #3236] ; 56c0 <bsp_section_rodata_size+0x80c><== NOT EXECUTED
4a18: e2842008 add r2, r4, #8 <== NOT EXECUTED
4a1c: e1a01005 mov r1, r5 <== NOT EXECUTED
4a20: e892000c ldm r2, {r2, r3} <== NOT EXECUTED
4a24: ebfffc34 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
uint8_t* data;
uint32_t fb;
uint32_t b;
fb = sg->length / fd->block_size;
data = sg->buffer;
for (b = 0; b < fb; b++, data += fd->block_size)
4a28: e3a03001 mov r3, #1 <== NOT EXECUTED
4a2c: ea000005 b 4a48 <rtems_fdisk_ioctl+0x37c> <== NOT EXECUTED
4a30: e59dc030 ldr ip, [sp, #48] ; 0x30
4a34: e59de03c ldr lr, [sp, #60] ; 0x3c
4a38: e15c000e cmp ip, lr
4a3c: 1affff6f bne 4800 <rtems_fdisk_ioctl+0x134>
4a40: e59d902c ldr r9, [sp, #44] ; 0x2c
4a44: e3a03000 mov r3, #0
{
rtems_blkdev_sg_buffer* sg = req->bufs;
uint32_t buf;
int ret = 0;
for (buf = 0; (ret == 0) && (buf < req->bufnum); buf++, sg++)
4a48: e59dc038 ldr ip, [sp, #56] ; 0x38
4a4c: e3530000 cmp r3, #0
4a50: e28cc001 add ip, ip, #1
4a54: e58dc038 str ip, [sp, #56] ; 0x38
4a58: e2888010 add r8, r8, #16
4a5c: 1a000006 bne 4a7c <rtems_fdisk_ioctl+0x3b0>
4a60: e5993010 ldr r3, [r9, #16]
4a64: e59dc038 ldr ip, [sp, #56] ; 0x38
4a68: e15c0003 cmp ip, r3
4a6c: 3affff5a bcc 47dc <rtems_fdisk_ioctl+0x110>
4a70: e1a04009 mov r4, r9
if (ret)
break;
}
}
rtems_blkdev_request_done (req, ret ? RTEMS_IO_ERROR : RTEMS_SUCCESSFUL);
4a74: e3a01000 mov r1, #0
4a78: ea000001 b 4a84 <rtems_fdisk_ioctl+0x3b8>
4a7c: e1a04009 mov r4, r9 <== NOT EXECUTED
4a80: e3a0101b mov r1, #27 <== NOT EXECUTED
static inline void rtems_blkdev_request_done(
rtems_blkdev_request *req,
rtems_status_code status
)
{
(*req->done)(req, status);
4a84: e1a00004 mov r0, r4
4a88: e1a0e00f mov lr, pc
4a8c: e594f004 ldr pc, [r4, #4]
else
{
switch (r->req)
{
case RTEMS_BLKDEV_REQ_READ:
errno = rtems_fdisk_read (&rtems_flashdisks[minor], r);
4a90: e3a03000 mov r3, #0
4a94: e59dc044 ldr ip, [sp, #68] ; 0x44
4a98: ea00017f b 509c <bsp_section_rodata_size+0x1e8>
break;
case RTEMS_BLKDEV_REQ_WRITE:
errno = rtems_fdisk_write (&rtems_flashdisks[minor], r);
4a9c: eb0062cc bl 1d5d4 <__errno>
4aa0: e59f3be0 ldr r3, [pc, #3040] ; 5688 <bsp_section_rodata_size+0x7d4>
4aa4: e59dc034 ldr ip, [sp, #52] ; 0x34
4aa8: e5935000 ldr r5, [r3]
4aac: e085500c add r5, r5, ip
* @retval 0 Always. The request done callback contains the status.
*/
static int
rtems_fdisk_write (rtems_flashdisk* fd, rtems_blkdev_request* req)
{
rtems_blkdev_sg_buffer* sg = req->bufs;
4ab0: e284c018 add ip, r4, #24
4ab4: e58dc02c str ip, [sp, #44] ; 0x2c
uint32_t buf;
int ret = 0;
for (buf = 0; (ret == 0) && (buf < req->bufnum); buf++, sg++)
4ab8: e3a0c000 mov ip, #0
case RTEMS_BLKDEV_REQ_READ:
errno = rtems_fdisk_read (&rtems_flashdisks[minor], r);
break;
case RTEMS_BLKDEV_REQ_WRITE:
errno = rtems_fdisk_write (&rtems_flashdisks[minor], r);
4abc: e58d004c str r0, [sp, #76] ; 0x4c
{
rtems_blkdev_sg_buffer* sg = req->bufs;
uint32_t buf;
int ret = 0;
for (buf = 0; (ret == 0) && (buf < req->bufnum); buf++, sg++)
4ac0: e58dc044 str ip, [sp, #68] ; 0x44
4ac4: e1a0b004 mov fp, r4
4ac8: ea000165 b 5064 <bsp_section_rodata_size+0x1b0>
{
uint8_t* data;
uint32_t fb;
uint32_t b;
fb = sg->length / fd->block_size;
4acc: e59dc02c ldr ip, [sp, #44] ; 0x2c
4ad0: e5951014 ldr r1, [r5, #20]
4ad4: e59c0004 ldr r0, [ip, #4]
4ad8: ebfff398 bl 1940 <__aeabi_uidiv>
data = sg->buffer;
4adc: e59dc02c ldr ip, [sp, #44] ; 0x2c
4ae0: e59c9008 ldr r9, [ip, #8]
for (b = 0; b < fb; b++, data += fd->block_size)
4ae4: e3a0c000 mov ip, #0
for (buf = 0; (ret == 0) && (buf < req->bufnum); buf++, sg++)
{
uint8_t* data;
uint32_t fb;
uint32_t b;
fb = sg->length / fd->block_size;
4ae8: e58d0050 str r0, [sp, #80] ; 0x50
data = sg->buffer;
for (b = 0; b < fb; b++, data += fd->block_size)
4aec: e58dc038 str ip, [sp, #56] ; 0x38
4af0: e58db030 str fp, [sp, #48] ; 0x30
4af4: ea00014a b 5024 <bsp_section_rodata_size+0x170>
{
ret = rtems_fdisk_write_block (fd, sg->block + b, data);
4af8: e59dc02c ldr ip, [sp, #44] ; 0x2c
4afc: e59c6000 ldr r6, [ip]
4b00: e59dc038 ldr ip, [sp, #56] ; 0x38
4b04: e08c6006 add r6, ip, r6
rtems_fdisk_page_desc* pd;
uint32_t page;
int ret;
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "write-block:%d", block);
4b08: e1a00005 mov r0, r5
4b0c: e59f1bb0 ldr r1, [pc, #2992] ; 56c4 <bsp_section_rodata_size+0x810>
4b10: e1a02006 mov r2, r6
4b14: ebfffb0d bl 3750 <rtems_fdisk_info>
/*
* Broken out to allow info messages when testing.
*/
if (block >= (fd->block_count - fd->unavail_blocks))
4b18: e285e01c add lr, r5, #28
4b1c: e89e4008 ldm lr, {r3, lr}
4b20: e043300e sub r3, r3, lr
4b24: e1560003 cmp r6, r3
4b28: 3a000004 bcc 4b40 <rtems_fdisk_ioctl+0x474>
{
rtems_fdisk_error ("write-block: block out of range: %d", block);
4b2c: e1a01006 mov r1, r6 <== NOT EXECUTED
4b30: e59f0b90 ldr r0, [pc, #2960] ; 56c8 <bsp_section_rodata_size+0x814><== NOT EXECUTED
4b34: e59db030 ldr fp, [sp, #48] ; 0x30 <== NOT EXECUTED
4b38: ebfffbef bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
4b3c: ea00012f b 5000 <bsp_section_rodata_size+0x14c> <== NOT EXECUTED
return EIO;
}
bc = &fd->blocks[block];
4b40: e595c018 ldr ip, [r5, #24]
/*
* Does the page exist in flash ?
*/
if (bc->segment)
4b44: e79c4186 ldr r4, [ip, r6, lsl #3]
4b48: e3540000 cmp r4, #0
{
rtems_fdisk_error ("write-block: block out of range: %d", block);
return EIO;
}
bc = &fd->blocks[block];
4b4c: e58dc03c str ip, [sp, #60] ; 0x3c
4b50: e08ca186 add sl, ip, r6, lsl #3
/*
* Does the page exist in flash ?
*/
if (bc->segment)
4b54: 0a000080 beq 4d5c <rtems_fdisk_ioctl+0x690>
{
sc = bc->segment;
pd = &sc->page_descriptors[bc->page];
4b58: e594c010 ldr ip, [r4, #16]
4b5c: e58dc054 str ip, [sp, #84] ; 0x54
4b60: e59ac004 ldr ip, [sl, #4]
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%02d-%03d-%03d: flag used",
4b64: e58dc000 str ip, [sp]
4b68: e2842008 add r2, r4, #8
4b6c: e892000c ldm r2, {r2, r3}
4b70: e59f1b54 ldr r1, [pc, #2900] ; 56cc <bsp_section_rodata_size+0x818>
4b74: e1a00005 mov r0, r5
* Does the page exist in flash ?
*/
if (bc->segment)
{
sc = bc->segment;
pd = &sc->page_descriptors[bc->page];
4b78: e58dc040 str ip, [sp, #64] ; 0x40
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%02d-%03d-%03d: flag used",
4b7c: ebfffaf3 bl 3750 <rtems_fdisk_info>
#endif
/*
* The page exists in flash so see if the page has been changed.
*/
if (rtems_fdisk_seg_verify_page (fd, sc->device, sc->segment,
4b80: e5942018 ldr r2, [r4, #24]
4b84: e59a3004 ldr r3, [sl, #4]
uint32_t segment,
uint32_t page,
const void* buffer)
{
return rtems_fdisk_seg_verify (fd, device, segment,
page * fd->block_size, buffer, fd->block_size);
4b88: e5958014 ldr r8, [r5, #20]
#endif
/*
* The page exists in flash so see if the page has been changed.
*/
if (rtems_fdisk_seg_verify_page (fd, sc->device, sc->segment,
4b8c: e284b008 add fp, r4, #8
4b90: e89b1800 ldm fp, {fp, ip}
4b94: e0823003 add r3, r2, r3
uint32_t device,
uint32_t segment,
uint32_t page,
const void* buffer)
{
return rtems_fdisk_seg_verify (fd, device, segment,
4b98: e00e0398 mul lr, r8, r3
static const rtems_fdisk_segment_desc*
rtems_fdisk_seg_descriptor (const rtems_flashdisk* fd,
uint32_t device,
uint32_t segment)
{
return fd->devices[device].segments[segment].descriptor;
4b9c: e3a0300c mov r3, #12
4ba0: e003039b mul r3, fp, r3
4ba4: e595102c ldr r1, [r5, #44] ; 0x2c
4ba8: e0812003 add r2, r1, r3
4bac: e7913003 ldr r3, [r1, r3]
4bb0: e3a01030 mov r1, #48 ; 0x30
4bb4: e0233c91 mla r3, r1, ip, r3
4bb8: e5933004 ldr r3, [r3, #4]
4bbc: e58d3058 str r3, [sp, #88] ; 0x58
uint32_t size)
{
const rtems_fdisk_segment_desc* sd;
const rtems_fdisk_driver_handlers* ops;
sd = rtems_fdisk_seg_descriptor (fd, device, segment);
ops = fd->devices[device].descriptor->flash_ops;
4bc0: e5923008 ldr r3, [r2, #8]
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " seg-verify: %02d-%03d: o=%08x s=%d",
4bc4: e59f1b04 ldr r1, [pc, #2820] ; 56d0 <bsp_section_rodata_size+0x81c>
uint32_t size)
{
const rtems_fdisk_segment_desc* sd;
const rtems_fdisk_driver_handlers* ops;
sd = rtems_fdisk_seg_descriptor (fd, device, segment);
ops = fd->devices[device].descriptor->flash_ops;
4bc8: e5937008 ldr r7, [r3, #8]
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " seg-verify: %02d-%03d: o=%08x s=%d",
4bcc: e1a0200b mov r2, fp
4bd0: e1a0300c mov r3, ip
4bd4: e1a00005 mov r0, r5
uint32_t device,
uint32_t segment,
uint32_t page,
const void* buffer)
{
return rtems_fdisk_seg_verify (fd, device, segment,
4bd8: e58de048 str lr, [sp, #72] ; 0x48
const rtems_fdisk_segment_desc* sd;
const rtems_fdisk_driver_handlers* ops;
sd = rtems_fdisk_seg_descriptor (fd, device, segment);
ops = fd->devices[device].descriptor->flash_ops;
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " seg-verify: %02d-%03d: o=%08x s=%d",
4bdc: e58de000 str lr, [sp]
4be0: e58dc028 str ip, [sp, #40] ; 0x28
4be4: e58d8004 str r8, [sp, #4]
4be8: ebfffaf8 bl 37d0 <rtems_fdisk_printf>
device, segment, offset, size);
#endif
return ops->verify (sd, device, segment, offset, buffer, size);
4bec: e59dc028 ldr ip, [sp, #40] ; 0x28
4bf0: e58d9000 str r9, [sp]
4bf4: e58d8004 str r8, [sp, #4]
4bf8: e59d0058 ldr r0, [sp, #88] ; 0x58
4bfc: e1a0100b mov r1, fp
4c00: e1a0200c mov r2, ip
4c04: e59d3048 ldr r3, [sp, #72] ; 0x48
4c08: e1a0e00f mov lr, pc
4c0c: e597f00c ldr pc, [r7, #12]
#endif
/*
* The page exists in flash so see if the page has been changed.
*/
if (rtems_fdisk_seg_verify_page (fd, sc->device, sc->segment,
4c10: e3500000 cmp r0, #0
4c14: 1a000009 bne 4c40 <rtems_fdisk_ioctl+0x574>
bc->page + sc->pages_desc, buffer) == 0)
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "write-block:%d=>%02d-%03d-%03d: page verified",
4c18: e594300c ldr r3, [r4, #12]
4c1c: e58d3000 str r3, [sp]
4c20: e59a3004 ldr r3, [sl, #4]
4c24: e58d3004 str r3, [sp, #4]
4c28: e1a00005 mov r0, r5
4c2c: e59f1aa0 ldr r1, [pc, #2720] ; 56d4 <bsp_section_rodata_size+0x820>
4c30: e1a02006 mov r2, r6
4c34: e5943008 ldr r3, [r4, #8]
4c38: ebfffac4 bl 3750 <rtems_fdisk_info>
4c3c: ea0000f3 b 5010 <bsp_section_rodata_size+0x15c>
* Does the page exist in flash ?
*/
if (bc->segment)
{
sc = bc->segment;
pd = &sc->page_descriptors[bc->page];
4c40: e59dc054 ldr ip, [sp, #84] ; 0x54
4c44: e59de040 ldr lr, [sp, #64] ; 0x40
4c48: e08c718e add r7, ip, lr, lsl #3
* Set the flags. Setting means clear the bit to 0.
*/
static void
rtems_fdisk_page_desc_set_flags (rtems_fdisk_page_desc* pd, uint16_t flags)
{
pd->flags &= ~flags;
4c4c: e1d730b2 ldrh r3, [r7, #2]
4c50: e3c33002 bic r3, r3, #2
4c54: e1c730b2 strh r3, [r7, #2]
* matches the flash device.
*/
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_USED);
ret = rtems_fdisk_seg_write_page_desc_flags (fd, sc, bc->page, pd);
4c58: e59a8004 ldr r8, [sl, #4]
uint32_t page,
const rtems_fdisk_page_desc* page_desc)
{
uint32_t offset = ((page * sizeof (rtems_fdisk_page_desc)) +
((uint8_t*) &page_desc->flags) - ((uint8_t*) page_desc));
if ((fd->flags & RTEMS_FDISK_BLANK_CHECK_BEFORE_WRITE))
4c5c: e5953008 ldr r3, [r5, #8]
rtems_fdisk_seg_write_page_desc_flags (const rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* sc,
uint32_t page,
const rtems_fdisk_page_desc* page_desc)
{
uint32_t offset = ((page * sizeof (rtems_fdisk_page_desc)) +
4c60: e1a0b188 lsl fp, r8, #3
((uint8_t*) &page_desc->flags) - ((uint8_t*) page_desc));
if ((fd->flags & RTEMS_FDISK_BLANK_CHECK_BEFORE_WRITE))
4c64: e3130008 tst r3, #8
rtems_fdisk_segment_ctl* sc,
uint32_t page,
const rtems_fdisk_page_desc* page_desc)
{
uint32_t offset = ((page * sizeof (rtems_fdisk_page_desc)) +
((uint8_t*) &page_desc->flags) - ((uint8_t*) page_desc));
4c68: e28bb002 add fp, fp, #2
if ((fd->flags & RTEMS_FDISK_BLANK_CHECK_BEFORE_WRITE))
4c6c: 0a000014 beq 4cc4 <rtems_fdisk_ioctl+0x5f8>
{
uint16_t flash_flags;
int ret;
ret = rtems_fdisk_seg_read (fd, sc, offset,
4c70: e3a03002 mov r3, #2
4c74: e58d3000 str r3, [sp]
4c78: e1a00005 mov r0, r5
4c7c: e28d3062 add r3, sp, #98 ; 0x62
4c80: e1a01004 mov r1, r4
4c84: e1a0200b mov r2, fp
4c88: ebfffaf0 bl 3850 <rtems_fdisk_seg_read>
&flash_flags, sizeof (flash_flags));
if (ret)
4c8c: e2503000 subs r3, r0, #0
4c90: 1a000014 bne 4ce8 <rtems_fdisk_ioctl+0x61c>
return ret;
if ((flash_flags & page_desc->flags) != page_desc->flags)
4c94: e1d730b2 ldrh r3, [r7, #2]
4c98: e1dd26b2 ldrh r2, [sp, #98] ; 0x62
4c9c: e0031002 and r1, r3, r2
4ca0: e1510003 cmp r1, r3
4ca4: 0a000006 beq 4cc4 <rtems_fdisk_ioctl+0x5f8>
{
rtems_fdisk_error (" seg-write-page-flags: %02d-%03d-%03d: "
4ca8: e88d000c stm sp, {r2, r3} <== NOT EXECUTED
4cac: e2841008 add r1, r4, #8 <== NOT EXECUTED
4cb0: e8910006 ldm r1, {r1, r2} <== NOT EXECUTED
4cb4: e1a03008 mov r3, r8 <== NOT EXECUTED
4cb8: e59f0a18 ldr r0, [pc, #2584] ; 56d8 <bsp_section_rodata_size+0x824><== NOT EXECUTED
4cbc: ebfffb8e bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
4cc0: ea000018 b 4d28 <rtems_fdisk_ioctl+0x65c> <== NOT EXECUTED
sc->device, sc->segment, page,
flash_flags, page_desc->flags);
return ret;
}
}
return rtems_fdisk_seg_write (fd, sc, offset,
4cc4: e3a03002 mov r3, #2
4cc8: e58d3000 str r3, [sp]
4ccc: e1a00005 mov r0, r5
4cd0: e0873003 add r3, r7, r3
4cd4: e1a01004 mov r1, r4
4cd8: e1a0200b mov r2, fp
4cdc: ebfffb17 bl 3940 <rtems_fdisk_seg_write>
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_USED);
ret = rtems_fdisk_seg_write_page_desc_flags (fd, sc, bc->page, pd);
if (ret)
4ce0: e2503000 subs r3, r0, #0
4ce4: 0a00000f beq 4d28 <rtems_fdisk_ioctl+0x65c>
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%02d-%03d-%03d: " \
4ce8: e1a00003 mov r0, r3 <== NOT EXECUTED
4cec: e5948008 ldr r8, [r4, #8] <== NOT EXECUTED
4cf0: e594700c ldr r7, [r4, #12] <== NOT EXECUTED
4cf4: e59ab004 ldr fp, [sl, #4] <== NOT EXECUTED
4cf8: e58d3028 str r3, [sp, #40] ; 0x28 <== NOT EXECUTED
4cfc: eb006bf8 bl 1fce4 <strerror> <== NOT EXECUTED
4d00: e59d3028 ldr r3, [sp, #40] ; 0x28 <== NOT EXECUTED
4d04: e58d0004 str r0, [sp, #4] <== NOT EXECUTED
4d08: e58d3008 str r3, [sp, #8] <== NOT EXECUTED
4d0c: e1a00005 mov r0, r5 <== NOT EXECUTED
4d10: e59f19c4 ldr r1, [pc, #2500] ; 56dc <bsp_section_rodata_size+0x828><== NOT EXECUTED
4d14: e1a02008 mov r2, r8 <== NOT EXECUTED
4d18: e1a03007 mov r3, r7 <== NOT EXECUTED
4d1c: e58db000 str fp, [sp] <== NOT EXECUTED
4d20: ebfffa8a bl 3750 <rtems_fdisk_info> <== NOT EXECUTED
4d24: ea000005 b 4d40 <rtems_fdisk_ioctl+0x674> <== NOT EXECUTED
strerror (ret), ret);
#endif
}
else
{
sc->pages_active--;
4d28: e594301c ldr r3, [r4, #28]
4d2c: e2433001 sub r3, r3, #1
4d30: e584301c str r3, [r4, #28]
sc->pages_used++;
4d34: e5943020 ldr r3, [r4, #32]
4d38: e2833001 add r3, r3, #1
4d3c: e5843020 str r3, [r4, #32]
/*
* If possible reuse this segment. This will mean the segment
* needs to be removed from the available list and placed
* back if space is still available.
*/
rtems_fdisk_queue_segment (fd, sc);
4d40: e1a00005 mov r0, r5
4d44: e1a01004 mov r1, r4
4d48: ebfffbc6 bl 3c68 <rtems_fdisk_queue_segment>
/*
* If no background compacting then compact in the forground.
* If we compact we ignore the error as there is little we
* can do from here. The write may will work.
*/
if ((fd->flags & RTEMS_FDISK_BACKGROUND_COMPACT) == 0)
4d4c: e5953008 ldr r3, [r5, #8]
4d50: e3130002 tst r3, #2
rtems_fdisk_compact (fd);
4d54: 01a00005 moveq r0, r5
4d58: 0bfffd19 bleq 41c4 <rtems_fdisk_compact>
* Count the number of elements on the list.
*/
static uint32_t
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
4d5c: e5952034 ldr r2, [r5, #52] ; 0x34
uint32_t count = 0;
4d60: e3a03000 mov r3, #0
4d64: ea000001 b 4d70 <rtems_fdisk_ioctl+0x6a4>
while (sc)
{
count++;
sc = sc->next;
4d68: e5922000 ldr r2, [r2]
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
{
count++;
4d6c: e2833001 add r3, r3, #1
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
4d70: e3520000 cmp r2, #0
4d74: 1afffffb bne 4d68 <rtems_fdisk_ioctl+0x69c>
/*
* Is it time to compact the disk ?
*
* We override the background compaction configruation.
*/
if (rtems_fdisk_segment_count_queue (&fd->available) <=
4d78: e5952010 ldr r2, [r5, #16]
4d7c: e1530002 cmp r3, r2
fd->avail_compact_segs)
rtems_fdisk_compact (fd);
4d80: 91a00005 movls r0, r5
4d84: 9bfffd0e blls 41c4 <rtems_fdisk_compact>
/*
* Get the next avaliable segment.
*/
sc = rtems_fdisk_segment_queue_pop_head (&fd->available);
4d88: e2857034 add r7, r5, #52 ; 0x34
4d8c: e1a00007 mov r0, r7
4d90: ebfff9d3 bl 34e4 <rtems_fdisk_segment_queue_pop_head>
/*
* Is the flash disk full ?
*/
if (!sc)
4d94: e2504000 subs r4, r0, #0
4d98: 1a00000c bne 4dd0 <rtems_fdisk_ioctl+0x704>
{
/*
* If compacting is configured for the background do it now
* to see if we can get some space back.
*/
if ((fd->flags & RTEMS_FDISK_BACKGROUND_COMPACT))
4d9c: e5953008 ldr r3, [r5, #8] <== NOT EXECUTED
4da0: e3130002 tst r3, #2 <== NOT EXECUTED
rtems_fdisk_compact (fd);
4da4: 11a00005 movne r0, r5 <== NOT EXECUTED
4da8: 1bfffd05 blne 41c4 <rtems_fdisk_compact> <== NOT EXECUTED
/*
* Try again for some free space.
*/
sc = rtems_fdisk_segment_queue_pop_head (&fd->available);
4dac: e1a00007 mov r0, r7 <== NOT EXECUTED
4db0: ebfff9cb bl 34e4 <rtems_fdisk_segment_queue_pop_head> <== NOT EXECUTED
if (!sc)
4db4: e2504000 subs r4, r0, #0 <== NOT EXECUTED
4db8: 1a000004 bne 4dd0 <rtems_fdisk_ioctl+0x704> <== NOT EXECUTED
{
rtems_fdisk_error ("write-block: no available pages");
4dbc: e59f091c ldr r0, [pc, #2332] ; 56e0 <bsp_section_rodata_size+0x82c><== NOT EXECUTED
4dc0: e59db030 ldr fp, [sp, #48] ; 0x30 <== NOT EXECUTED
return ENOSPC;
4dc4: e3a0601c mov r6, #28 <== NOT EXECUTED
*/
sc = rtems_fdisk_segment_queue_pop_head (&fd->available);
if (!sc)
{
rtems_fdisk_error ("write-block: no available pages");
4dc8: ebfffb4b bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
4dcc: ea00009c b 5044 <bsp_section_rodata_size+0x190> <== NOT EXECUTED
return ENOSPC;
}
}
#if RTEMS_FDISK_TRACE
if (fd->info_level >= 3)
4dd0: e595306c ldr r3, [r5, #108] ; 0x6c
4dd4: e3530002 cmp r3, #2
4dd8: 9a00000b bls 4e0c <rtems_fdisk_ioctl+0x740>
{
char queues[5];
rtems_fdisk_queue_status (fd, sc, queues);
4ddc: e28d705c add r7, sp, #92 ; 0x5c <== NOT EXECUTED
4de0: e1a00005 mov r0, r5 <== NOT EXECUTED
4de4: e1a01004 mov r1, r4 <== NOT EXECUTED
4de8: e1a02007 mov r2, r7 <== NOT EXECUTED
4dec: ebfffa06 bl 360c <rtems_fdisk_queue_status> <== NOT EXECUTED
rtems_fdisk_info (fd, " write:%d=>%02d-%03d: queue check: %s",
4df0: e594300c ldr r3, [r4, #12] <== NOT EXECUTED
4df4: e88d0088 stm sp, {r3, r7} <== NOT EXECUTED
4df8: e1a00005 mov r0, r5 <== NOT EXECUTED
4dfc: e59f18e0 ldr r1, [pc, #2272] ; 56e4 <bsp_section_rodata_size+0x830><== NOT EXECUTED
4e00: e1a02006 mov r2, r6 <== NOT EXECUTED
4e04: e5943008 ldr r3, [r4, #8] <== NOT EXECUTED
4e08: ebfffa50 bl 3750 <rtems_fdisk_info> <== NOT EXECUTED
/*
* Find the next avaliable page in the segment.
*/
pd = sc->page_descriptors;
4e0c: e5948010 ldr r8, [r4, #16]
for (page = 0; page < sc->pages; page++, pd++)
4e10: e3a07000 mov r7, #0
4e14: ea00006c b 4fcc <bsp_section_rodata_size+0x118>
{
if (rtems_fdisk_page_desc_erased (pd))
4e18: e1a00008 mov r0, r8
4e1c: ebfffa29 bl 36c8 <rtems_fdisk_page_desc_erased>
4e20: e3500000 cmp r0, #0
4e24: 0a000066 beq 4fc4 <bsp_section_rodata_size+0x110>
{
uint16_t cs = 0xffff;
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
cs = rtems_fdisk_calc_crc16 (cs, *buffer);
4e28: e59f2858 ldr r2, [pc, #2136] ; 5688 <bsp_section_rodata_size+0x7d4>
for (page = 0; page < sc->pages; page++, pd++)
{
if (rtems_fdisk_page_desc_erased (pd))
{
pd->crc = rtems_fdisk_page_checksum (buffer, fd->block_size);
4e2c: e5950014 ldr r0, [r5, #20]
{
uint16_t cs = 0xffff;
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
cs = rtems_fdisk_calc_crc16 (cs, *buffer);
4e30: e5921008 ldr r1, [r2, #8]
rtems_fdisk_page_checksum (const uint8_t* buffer, uint32_t page_size)
{
uint16_t cs = 0xffff;
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
4e34: e3a03000 mov r3, #0
* Calculate the checksum of a page in a segment.
*/
static uint16_t
rtems_fdisk_page_checksum (const uint8_t* buffer, uint32_t page_size)
{
uint16_t cs = 0xffff;
4e38: e59f2874 ldr r2, [pc, #2164] ; 56b4 <bsp_section_rodata_size+0x800>
4e3c: ea000005 b 4e58 <rtems_fdisk_ioctl+0x78c>
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
cs = rtems_fdisk_calc_crc16 (cs, *buffer);
4e40: e7d9c003 ldrb ip, [r9, r3]
4e44: e02c2002 eor r2, ip, r2
4e48: e20220ff and r2, r2, #255 ; 0xff
4e4c: e1a02082 lsl r2, r2, #1
4e50: e19120b2 ldrh r2, [r1, r2]
rtems_fdisk_page_checksum (const uint8_t* buffer, uint32_t page_size)
{
uint16_t cs = 0xffff;
uint32_t i;
for (i = 0; i < page_size; i++, buffer++)
4e54: e2833001 add r3, r3, #1
4e58: e1530000 cmp r3, r0
4e5c: 1afffff7 bne 4e40 <rtems_fdisk_ioctl+0x774>
bc->page = page;
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_ACTIVE);
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%d=>%02d-%03d-%03d: write: " \
4e60: e5940020 ldr r0, [r4, #32]
4e64: e594e01c ldr lr, [r4, #28]
if (rtems_fdisk_page_desc_erased (pd))
{
pd->crc = rtems_fdisk_page_checksum (buffer, fd->block_size);
pd->block = block;
bc->segment = sc;
4e68: e59dc03c ldr ip, [sp, #60] ; 0x3c
bc->page = page;
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_ACTIVE);
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%d=>%02d-%03d-%03d: write: " \
4e6c: e58d0040 str r0, [sp, #64] ; 0x40
4e70: e5940000 ldr r0, [r4]
for (page = 0; page < sc->pages; page++, pd++)
{
if (rtems_fdisk_page_desc_erased (pd))
{
pd->crc = rtems_fdisk_page_checksum (buffer, fd->block_size);
4e74: e1c820b0 strh r2, [r8]
pd->block = block;
4e78: e5886004 str r6, [r8, #4]
* Set the flags. Setting means clear the bit to 0.
*/
static void
rtems_fdisk_page_desc_set_flags (rtems_fdisk_page_desc* pd, uint16_t flags)
{
pd->flags &= ~flags;
4e7c: e1d810b2 ldrh r1, [r8, #2]
if (rtems_fdisk_page_desc_erased (pd))
{
pd->crc = rtems_fdisk_page_checksum (buffer, fd->block_size);
pd->block = block;
bc->segment = sc;
4e80: e78c4186 str r4, [ip, r6, lsl #3]
bc->page = page;
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_ACTIVE);
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%d=>%02d-%03d-%03d: write: " \
4e84: e58de03c str lr, [sp, #60] ; 0x3c
4e88: e594c024 ldr ip, [r4, #36] ; 0x24
4e8c: e59fe814 ldr lr, [pc, #2068] ; 56a8 <bsp_section_rodata_size+0x7f4>
4e90: e3500000 cmp r0, #0
4e94: e59d003c ldr r0, [sp, #60] ; 0x3c
* Set the flags. Setting means clear the bit to 0.
*/
static void
rtems_fdisk_page_desc_set_flags (rtems_fdisk_page_desc* pd, uint16_t flags)
{
pd->flags &= ~flags;
4e98: e3c11001 bic r1, r1, #1
bc->page = page;
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_ACTIVE);
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%d=>%02d-%03d-%03d: write: " \
4e9c: e58dc048 str ip, [sp, #72] ; 0x48
4ea0: e59fc7fc ldr ip, [pc, #2044] ; 56a4 <bsp_section_rodata_size+0x7f0>
4ea4: 01a0c00e moveq ip, lr
4ea8: e594e00c ldr lr, [r4, #12]
{
pd->crc = rtems_fdisk_page_checksum (buffer, fd->block_size);
pd->block = block;
bc->segment = sc;
bc->page = page;
4eac: e58a7004 str r7, [sl, #4]
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_ACTIVE);
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%d=>%02d-%03d-%03d: write: " \
4eb0: e5943008 ldr r3, [r4, #8]
* Set the flags. Setting means clear the bit to 0.
*/
static void
rtems_fdisk_page_desc_set_flags (rtems_fdisk_page_desc* pd, uint16_t flags)
{
pd->flags &= ~flags;
4eb4: e1c810b2 strh r1, [r8, #2]
bc->page = page;
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_ACTIVE);
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " write:%d=>%02d-%03d-%03d: write: " \
4eb8: e58d000c str r0, [sp, #12]
4ebc: e59d0048 ldr r0, [sp, #72] ; 0x48
4ec0: e58de000 str lr, [sp]
4ec4: e59de040 ldr lr, [sp, #64] ; 0x40
4ec8: e58d0014 str r0, [sp, #20]
4ecc: e58d101c str r1, [sp, #28]
4ed0: e58d2020 str r2, [sp, #32]
4ed4: e59f180c ldr r1, [pc, #2060] ; 56e8 <bsp_section_rodata_size+0x834>
4ed8: e1a02006 mov r2, r6
4edc: e1a00005 mov r0, r5
4ee0: e58de010 str lr, [sp, #16]
4ee4: e58dc018 str ip, [sp, #24]
4ee8: e58d6024 str r6, [sp, #36] ; 0x24
4eec: e98d0880 stmib sp, {r7, fp}
4ef0: ebfffa16 bl 3750 <rtems_fdisk_info>
/*
* We use the segment page offset not the page number used in the
* driver. This skips the page descriptors.
*/
ret = rtems_fdisk_seg_write_page (fd, sc, page + sc->pages_desc, buffer);
4ef4: e5942018 ldr r2, [r4, #24]
4ef8: e1a00005 mov r0, r5
4efc: e1a01004 mov r1, r4
4f00: e0872002 add r2, r7, r2
4f04: e1a03009 mov r3, r9
4f08: ebfffac4 bl 3a20 <rtems_fdisk_seg_write_page>
if (ret)
4f0c: e2506000 subs r6, r0, #0
4f10: 0a000009 beq 4f3c <bsp_section_rodata_size+0x88>
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "write-block:%02d-%03d-%03d: write page failed: " \
4f14: e594a008 ldr sl, [r4, #8] <== NOT EXECUTED
4f18: e594800c ldr r8, [r4, #12] <== NOT EXECUTED
4f1c: eb006b70 bl 1fce4 <strerror> <== NOT EXECUTED
4f20: e58d7000 str r7, [sp] <== NOT EXECUTED
4f24: e98d0041 stmib sp, {r0, r6} <== NOT EXECUTED
4f28: e59f17bc ldr r1, [pc, #1980] ; 56ec <bsp_section_rodata_size+0x838><== NOT EXECUTED
4f2c: e1a00005 mov r0, r5 <== NOT EXECUTED
4f30: e1a0200a mov r2, sl <== NOT EXECUTED
4f34: e1a03008 mov r3, r8 <== NOT EXECUTED
4f38: ea000013 b 4f8c <bsp_section_rodata_size+0xd8> <== NOT EXECUTED
strerror (ret), ret);
#endif
}
else
{
ret = rtems_fdisk_seg_write_page_desc (fd, sc, page, pd);
4f3c: e1a03008 mov r3, r8
4f40: e1a00005 mov r0, r5
4f44: e1a01004 mov r1, r4
4f48: e1a02007 mov r2, r7
4f4c: ebfffa9e bl 39cc <rtems_fdisk_seg_write_page_desc>
if (ret)
4f50: e2506000 subs r6, r0, #0
strerror (ret), ret);
#endif
}
else
{
sc->pages_active++;
4f54: 0594301c ldreq r3, [r4, #28]
4f58: 02833001 addeq r3, r3, #1
4f5c: 0584301c streq r3, [r4, #28]
#endif
}
else
{
ret = rtems_fdisk_seg_write_page_desc (fd, sc, page, pd);
if (ret)
4f60: 0a00000a beq 4f90 <bsp_section_rodata_size+0xdc>
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "write-block:%02d-%03d-%03d: " \
4f64: e5948008 ldr r8, [r4, #8] <== NOT EXECUTED
4f68: e594700c ldr r7, [r4, #12] <== NOT EXECUTED
4f6c: e59aa004 ldr sl, [sl, #4] <== NOT EXECUTED
4f70: eb006b5b bl 1fce4 <strerror> <== NOT EXECUTED
4f74: e58da000 str sl, [sp] <== NOT EXECUTED
4f78: e59f1770 ldr r1, [pc, #1904] ; 56f0 <bsp_section_rodata_size+0x83c><== NOT EXECUTED
4f7c: e98d0041 stmib sp, {r0, r6} <== NOT EXECUTED
4f80: e1a02008 mov r2, r8 <== NOT EXECUTED
4f84: e1a00005 mov r0, r5 <== NOT EXECUTED
4f88: e1a03007 mov r3, r7 <== NOT EXECUTED
4f8c: ebfff9ef bl 3750 <rtems_fdisk_info> <== NOT EXECUTED
{
sc->pages_active++;
}
}
rtems_fdisk_queue_segment (fd, sc);
4f90: e1a00005 mov r0, r5
4f94: e1a01004 mov r1, r4
4f98: ebfffb32 bl 3c68 <rtems_fdisk_queue_segment>
static bool
rtems_fdisk_is_erased_blocks_starvation (rtems_flashdisk* fd)
{
bool starvation = fd->erased_blocks < fd->starvation_threshold;
if (starvation)
4f9c: e5952028 ldr r2, [r5, #40] ; 0x28
4fa0: e5953024 ldr r3, [r5, #36] ; 0x24
4fa4: e1520003 cmp r2, r3
4fa8: 2a000016 bcs 5008 <bsp_section_rodata_size+0x154>
fd->starvations++;
4fac: e5953070 ldr r3, [r5, #112] ; 0x70
4fb0: e2833001 add r3, r3, #1
4fb4: e5853070 str r3, [r5, #112] ; 0x70
}
rtems_fdisk_queue_segment (fd, sc);
if (rtems_fdisk_is_erased_blocks_starvation (fd))
rtems_fdisk_compact (fd);
4fb8: e1a00005 mov r0, r5
4fbc: ebfffc80 bl 41c4 <rtems_fdisk_compact>
4fc0: ea000010 b 5008 <bsp_section_rodata_size+0x154>
* Find the next avaliable page in the segment.
*/
pd = sc->page_descriptors;
for (page = 0; page < sc->pages; page++, pd++)
4fc4: e2877001 add r7, r7, #1
4fc8: e2888008 add r8, r8, #8
4fcc: e594b014 ldr fp, [r4, #20]
4fd0: e157000b cmp r7, fp
4fd4: 3affff8f bcc 4e18 <rtems_fdisk_ioctl+0x74c>
return ret;
}
}
rtems_fdisk_error ("write-block: no erased page descs in segment: %d-%d",
4fd8: e2841008 add r1, r4, #8 <== NOT EXECUTED
4fdc: e8910006 ldm r1, {r1, r2} <== NOT EXECUTED
4fe0: e59f070c ldr r0, [pc, #1804] ; 56f4 <bsp_section_rodata_size+0x840><== NOT EXECUTED
4fe4: e59db030 ldr fp, [sp, #48] ; 0x30 <== NOT EXECUTED
4fe8: ebfffac3 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
sc->device, sc->segment);
sc->failed = true;
4fec: e3a03001 mov r3, #1 <== NOT EXECUTED
4ff0: e5843028 str r3, [r4, #40] ; 0x28 <== NOT EXECUTED
rtems_fdisk_queue_segment (fd, sc);
4ff4: e1a00005 mov r0, r5 <== NOT EXECUTED
4ff8: e1a01004 mov r1, r4 <== NOT EXECUTED
4ffc: ebfffb19 bl 3c68 <rtems_fdisk_queue_segment> <== NOT EXECUTED
return EIO;
5000: e3a06005 mov r6, #5 <== NOT EXECUTED
5004: ea00000e b 5044 <bsp_section_rodata_size+0x190> <== NOT EXECUTED
fb = sg->length / fd->block_size;
data = sg->buffer;
for (b = 0; b < fb; b++, data += fd->block_size)
{
ret = rtems_fdisk_write_block (fd, sg->block + b, data);
if (ret)
5008: e3560000 cmp r6, #0
500c: 1a00000b bne 5040 <bsp_section_rodata_size+0x18c>
uint8_t* data;
uint32_t fb;
uint32_t b;
fb = sg->length / fd->block_size;
data = sg->buffer;
for (b = 0; b < fb; b++, data += fd->block_size)
5010: e59dc038 ldr ip, [sp, #56] ; 0x38
5014: e5953014 ldr r3, [r5, #20]
5018: e28cc001 add ip, ip, #1
501c: e58dc038 str ip, [sp, #56] ; 0x38
5020: e0899003 add r9, r9, r3
5024: e59dc038 ldr ip, [sp, #56] ; 0x38
5028: e59de050 ldr lr, [sp, #80] ; 0x50
502c: e15c000e cmp ip, lr
5030: 1afffeb0 bne 4af8 <rtems_fdisk_ioctl+0x42c>
5034: e59db030 ldr fp, [sp, #48] ; 0x30
5038: e3a06000 mov r6, #0
503c: ea000000 b 5044 <bsp_section_rodata_size+0x190>
5040: e59db030 ldr fp, [sp, #48] ; 0x30 <== NOT EXECUTED
{
rtems_blkdev_sg_buffer* sg = req->bufs;
uint32_t buf;
int ret = 0;
for (buf = 0; (ret == 0) && (buf < req->bufnum); buf++, sg++)
5044: e59dc044 ldr ip, [sp, #68] ; 0x44
5048: e28cc001 add ip, ip, #1
504c: e58dc044 str ip, [sp, #68] ; 0x44
5050: e59dc02c ldr ip, [sp, #44] ; 0x2c
5054: e3560000 cmp r6, #0
5058: e28cc010 add ip, ip, #16
505c: e58dc02c str ip, [sp, #44] ; 0x2c
5060: 1a000006 bne 5080 <bsp_section_rodata_size+0x1cc>
5064: e59b3010 ldr r3, [fp, #16]
5068: e59dc044 ldr ip, [sp, #68] ; 0x44
506c: e15c0003 cmp ip, r3
5070: 3afffe95 bcc 4acc <rtems_fdisk_ioctl+0x400>
5074: e1a0400b mov r4, fp
if (ret)
break;
}
}
rtems_blkdev_request_done (req, ret ? RTEMS_IO_ERROR : RTEMS_SUCCESSFUL);
5078: e3a01000 mov r1, #0
507c: ea000001 b 5088 <bsp_section_rodata_size+0x1d4>
5080: e1a0400b mov r4, fp <== NOT EXECUTED
5084: e3a0101b mov r1, #27 <== NOT EXECUTED
5088: e1a00004 mov r0, r4
508c: e1a0e00f mov lr, pc
5090: e594f004 ldr pc, [r4, #4]
case RTEMS_BLKDEV_REQ_READ:
errno = rtems_fdisk_read (&rtems_flashdisks[minor], r);
break;
case RTEMS_BLKDEV_REQ_WRITE:
errno = rtems_fdisk_write (&rtems_flashdisks[minor], r);
5094: e59dc04c ldr ip, [sp, #76] ; 0x4c
5098: e3a03000 mov r3, #0
509c: e58c3000 str r3, [ip]
break;
50a0: ea0001f0 b 5868 <bsp_section_rodata_size+0x9b4>
default:
errno = EINVAL;
50a4: eb00614a bl 1d5d4 <__errno> <== NOT EXECUTED
50a8: e3a03016 mov r3, #22 <== NOT EXECUTED
50ac: e5803000 str r3, [r0] <== NOT EXECUTED
break;
50b0: ea0001ec b 5868 <bsp_section_rodata_size+0x9b4> <== NOT EXECUTED
}
}
break;
case RTEMS_FDISK_IOCTL_ERASE_DISK:
errno = rtems_fdisk_erase_disk (&rtems_flashdisks[minor]);
50b4: eb006146 bl 1d5d4 <__errno> <== NOT EXECUTED
50b8: e5964000 ldr r4, [r6] <== NOT EXECUTED
50bc: e59dc034 ldr ip, [sp, #52] ; 0x34 <== NOT EXECUTED
50c0: e084400c add r4, r4, ip <== NOT EXECUTED
50c4: e1a07000 mov r7, r0 <== NOT EXECUTED
{
uint32_t device;
int ret;
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "erase-disk");
50c8: e59f1628 ldr r1, [pc, #1576] ; 56f8 <bsp_section_rodata_size+0x844><== NOT EXECUTED
50cc: e1a00004 mov r0, r4 <== NOT EXECUTED
50d0: ebfff99e bl 3750 <rtems_fdisk_info> <== NOT EXECUTED
*/
static int
rtems_fdisk_erase_flash (const rtems_flashdisk* fd)
{
uint32_t device;
for (device = 0; device < fd->device_count; device++)
50d4: e1a06005 mov r6, r5 <== NOT EXECUTED
50d8: ea000015 b 5134 <bsp_section_rodata_size+0x280> <== NOT EXECUTED
{
int ret;
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " erase-flash:%02d", device);
50dc: e59f1618 ldr r1, [pc, #1560] ; 56fc <bsp_section_rodata_size+0x848><== NOT EXECUTED
50e0: e1a02006 mov r2, r6 <== NOT EXECUTED
50e4: e1a00004 mov r0, r4 <== NOT EXECUTED
50e8: ebfff998 bl 3750 <rtems_fdisk_info> <== NOT EXECUTED
*/
static int
rtems_fdisk_device_erase (const rtems_flashdisk* fd, uint32_t device)
{
const rtems_fdisk_driver_handlers* ops;
ops = fd->devices[device].descriptor->flash_ops;
50ec: e594302c ldr r3, [r4, #44] ; 0x2c <== NOT EXECUTED
50f0: e0833005 add r3, r3, r5 <== NOT EXECUTED
50f4: e5933008 ldr r3, [r3, #8] <== NOT EXECUTED
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " device-erase: %02d", device);
50f8: e59f1600 ldr r1, [pc, #1536] ; 5700 <bsp_section_rodata_size+0x84c><== NOT EXECUTED
50fc: e1a02006 mov r2, r6 <== NOT EXECUTED
5100: e1a00004 mov r0, r4 <== NOT EXECUTED
*/
static int
rtems_fdisk_device_erase (const rtems_flashdisk* fd, uint32_t device)
{
const rtems_fdisk_driver_handlers* ops;
ops = fd->devices[device].descriptor->flash_ops;
5104: e5938008 ldr r8, [r3, #8] <== NOT EXECUTED
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " device-erase: %02d", device);
5108: ebfff9b0 bl 37d0 <rtems_fdisk_printf> <== NOT EXECUTED
#endif
return ops->erase_device (fd->devices[device].descriptor, device);
510c: e594302c ldr r3, [r4, #44] ; 0x2c <== NOT EXECUTED
5110: e0833005 add r3, r3, r5 <== NOT EXECUTED
5114: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
5118: e1a01006 mov r1, r6 <== NOT EXECUTED
511c: e1a0e00f mov lr, pc <== NOT EXECUTED
5120: e598f014 ldr pc, [r8, #20] <== NOT EXECUTED
rtems_fdisk_info (fd, " erase-flash:%02d", device);
#endif
ret = rtems_fdisk_device_erase (fd, device);
if (ret != 0)
5124: e3500000 cmp r0, #0 <== NOT EXECUTED
const rtems_fdisk_driver_handlers* ops;
ops = fd->devices[device].descriptor->flash_ops;
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " device-erase: %02d", device);
#endif
return ops->erase_device (fd->devices[device].descriptor, device);
5128: e285500c add r5, r5, #12 <== NOT EXECUTED
rtems_fdisk_info (fd, " erase-flash:%02d", device);
#endif
ret = rtems_fdisk_device_erase (fd, device);
if (ret != 0)
512c: 1a000016 bne 518c <bsp_section_rodata_size+0x2d8> <== NOT EXECUTED
*/
static int
rtems_fdisk_erase_flash (const rtems_flashdisk* fd)
{
uint32_t device;
for (device = 0; device < fd->device_count; device++)
5130: e2866001 add r6, r6, #1 <== NOT EXECUTED
5134: e5943030 ldr r3, [r4, #48] ; 0x30 <== NOT EXECUTED
5138: e1560003 cmp r6, r3 <== NOT EXECUTED
513c: 3affffe6 bcc 50dc <bsp_section_rodata_size+0x228> <== NOT EXECUTED
5140: e3a05000 mov r5, #0 <== NOT EXECUTED
5144: e1a06005 mov r6, r5 <== NOT EXECUTED
5148: ea000009 b 5174 <bsp_section_rodata_size+0x2c0> <== NOT EXECUTED
if (ret == 0)
{
for (device = 0; device < fd->device_count; device++)
{
if (!fd->devices[device].segments)
514c: e594302c ldr r3, [r4, #44] ; 0x2c <== NOT EXECUTED
5150: e7933005 ldr r3, [r3, r5] <== NOT EXECUTED
5154: e3530000 cmp r3, #0 <== NOT EXECUTED
5158: 0a00000a beq 5188 <bsp_section_rodata_size+0x2d4> <== NOT EXECUTED
return ENOMEM;
ret = rtems_fdisk_recover_block_mappings (fd);
515c: e1a00004 mov r0, r4 <== NOT EXECUTED
5160: ebfffc92 bl 43b0 <rtems_fdisk_recover_block_mappings> <== NOT EXECUTED
if (ret)
5164: e3500000 cmp r0, #0 <== NOT EXECUTED
for (device = 0; device < fd->device_count; device++)
{
if (!fd->devices[device].segments)
return ENOMEM;
ret = rtems_fdisk_recover_block_mappings (fd);
5168: e285500c add r5, r5, #12 <== NOT EXECUTED
if (ret)
516c: 1a000006 bne 518c <bsp_section_rodata_size+0x2d8> <== NOT EXECUTED
ret = rtems_fdisk_erase_flash (fd);
if (ret == 0)
{
for (device = 0; device < fd->device_count; device++)
5170: e2866001 add r6, r6, #1 <== NOT EXECUTED
5174: e5943030 ldr r3, [r4, #48] ; 0x30 <== NOT EXECUTED
5178: e1560003 cmp r6, r3 <== NOT EXECUTED
517c: 3afffff2 bcc 514c <bsp_section_rodata_size+0x298> <== NOT EXECUTED
5180: e3a00000 mov r0, #0 <== NOT EXECUTED
5184: ea000000 b 518c <bsp_section_rodata_size+0x2d8> <== NOT EXECUTED
{
if (!fd->devices[device].segments)
return ENOMEM;
5188: e3a0000c mov r0, #12 <== NOT EXECUTED
}
}
break;
case RTEMS_FDISK_IOCTL_ERASE_DISK:
errno = rtems_fdisk_erase_disk (&rtems_flashdisks[minor]);
518c: e5870000 str r0, [r7] <== NOT EXECUTED
break;
5190: ea0001b4 b 5868 <bsp_section_rodata_size+0x9b4> <== NOT EXECUTED
case RTEMS_FDISK_IOCTL_COMPACT:
errno = rtems_fdisk_compact (&rtems_flashdisks[minor]);
5194: eb00610e bl 1d5d4 <__errno> <== NOT EXECUTED
5198: e59dc034 ldr ip, [sp, #52] ; 0x34 <== NOT EXECUTED
519c: e1a04000 mov r4, r0 <== NOT EXECUTED
51a0: e5960000 ldr r0, [r6] <== NOT EXECUTED
51a4: e080000c add r0, r0, ip <== NOT EXECUTED
51a8: ebfffc05 bl 41c4 <rtems_fdisk_compact> <== NOT EXECUTED
51ac: e5840000 str r0, [r4] <== NOT EXECUTED
break;
51b0: ea0001ac b 5868 <bsp_section_rodata_size+0x9b4> <== NOT EXECUTED
case RTEMS_FDISK_IOCTL_ERASE_USED:
errno = rtems_fdisk_erase_used (&rtems_flashdisks[minor]);
51b4: eb006106 bl 1d5d4 <__errno> <== NOT EXECUTED
51b8: e5964000 ldr r4, [r6] <== NOT EXECUTED
51bc: e59dc034 ldr ip, [sp, #52] ; 0x34 <== NOT EXECUTED
51c0: e084400c add r4, r4, ip <== NOT EXECUTED
51c4: e1a07000 mov r7, r0 <== NOT EXECUTED
rtems_fdisk_erase_used (rtems_flashdisk* fd)
{
rtems_fdisk_segment_ctl* sc;
int latched_ret = 0;
while ((sc = rtems_fdisk_segment_queue_pop_head (&fd->erase)))
51c8: e284604c add r6, r4, #76 ; 0x4c <== NOT EXECUTED
51cc: ea000007 b 51f0 <bsp_section_rodata_size+0x33c> <== NOT EXECUTED
{
/*
* The segment will either end up on the available queue or
* the failed queue.
*/
int ret = rtems_fdisk_erase_segment (fd, sc);
51d0: e1a00004 mov r0, r4 <== NOT EXECUTED
51d4: ebfffa64 bl 3b6c <rtems_fdisk_erase_segment> <== NOT EXECUTED
if (ret && !latched_ret)
51d8: e2903000 adds r3, r0, #0 <== NOT EXECUTED
51dc: 13a03001 movne r3, #1 <== NOT EXECUTED
51e0: e3550000 cmp r5, #0 <== NOT EXECUTED
51e4: 13a03000 movne r3, #0 <== NOT EXECUTED
51e8: e3530000 cmp r3, #0 <== NOT EXECUTED
51ec: 11a05000 movne r5, r0 <== NOT EXECUTED
rtems_fdisk_erase_used (rtems_flashdisk* fd)
{
rtems_fdisk_segment_ctl* sc;
int latched_ret = 0;
while ((sc = rtems_fdisk_segment_queue_pop_head (&fd->erase)))
51f0: e1a00006 mov r0, r6 <== NOT EXECUTED
51f4: ebfff8ba bl 34e4 <rtems_fdisk_segment_queue_pop_head> <== NOT EXECUTED
51f8: e2501000 subs r1, r0, #0 <== NOT EXECUTED
51fc: 1afffff3 bne 51d0 <bsp_section_rodata_size+0x31c> <== NOT EXECUTED
case RTEMS_FDISK_IOCTL_COMPACT:
errno = rtems_fdisk_compact (&rtems_flashdisks[minor]);
break;
case RTEMS_FDISK_IOCTL_ERASE_USED:
errno = rtems_fdisk_erase_used (&rtems_flashdisks[minor]);
5200: e5875000 str r5, [r7] <== NOT EXECUTED
break;
5204: ea000197 b 5868 <bsp_section_rodata_size+0x9b4> <== NOT EXECUTED
case RTEMS_FDISK_IOCTL_MONITORING:
errno = rtems_fdisk_monitoring_data (&rtems_flashdisks[minor],
5208: eb0060f1 bl 1d5d4 <__errno> <== NOT EXECUTED
520c: e5962000 ldr r2, [r6] <== NOT EXECUTED
5210: e59dc034 ldr ip, [sp, #52] ; 0x34 <== NOT EXECUTED
5214: e082200c add r2, r2, ip <== NOT EXECUTED
rtems_fdisk_monitor_data* data)
{
uint32_t i;
uint32_t j;
data->block_size = fd->block_size;
5218: e5923014 ldr r3, [r2, #20] <== NOT EXECUTED
data->block_count = fd->block_count;
data->unavail_blocks = fd->unavail_blocks;
521c: e5921020 ldr r1, [r2, #32] <== NOT EXECUTED
data->device_count = fd->device_count;
5220: e5926030 ldr r6, [r2, #48] ; 0x30 <== NOT EXECUTED
rtems_fdisk_monitor_data* data)
{
uint32_t i;
uint32_t j;
data->block_size = fd->block_size;
5224: e5843000 str r3, [r4] <== NOT EXECUTED
data->block_count = fd->block_count;
5228: e592301c ldr r3, [r2, #28] <== NOT EXECUTED
data->unavail_blocks = fd->unavail_blocks;
522c: e5841008 str r1, [r4, #8] <== NOT EXECUTED
{
uint32_t i;
uint32_t j;
data->block_size = fd->block_size;
data->block_count = fd->block_count;
5230: e5843004 str r3, [r4, #4] <== NOT EXECUTED
data->unavail_blocks = fd->unavail_blocks;
data->device_count = fd->device_count;
5234: e584600c str r6, [r4, #12] <== NOT EXECUTED
data->blocks_used = 0;
5238: e5845018 str r5, [r4, #24] <== NOT EXECUTED
523c: ea000006 b 525c <bsp_section_rodata_size+0x3a8> <== NOT EXECUTED
for (i = 0; i < fd->block_count; i++)
if (fd->blocks[i].segment)
5240: e5921018 ldr r1, [r2, #24] <== NOT EXECUTED
5244: e7911185 ldr r1, [r1, r5, lsl #3] <== NOT EXECUTED
5248: e3510000 cmp r1, #0 <== NOT EXECUTED
data->blocks_used++;
524c: 15941018 ldrne r1, [r4, #24] <== NOT EXECUTED
5250: 12811001 addne r1, r1, #1 <== NOT EXECUTED
5254: 15841018 strne r1, [r4, #24] <== NOT EXECUTED
data->block_count = fd->block_count;
data->unavail_blocks = fd->unavail_blocks;
data->device_count = fd->device_count;
data->blocks_used = 0;
for (i = 0; i < fd->block_count; i++)
5258: e2855001 add r5, r5, #1 <== NOT EXECUTED
525c: e1550003 cmp r5, r3 <== NOT EXECUTED
5260: 1afffff6 bne 5240 <bsp_section_rodata_size+0x38c> <== NOT EXECUTED
* Count the number of elements on the list.
*/
static uint32_t
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
5264: e5923034 ldr r3, [r2, #52] ; 0x34 <== NOT EXECUTED
uint32_t count = 0;
5268: e3a01000 mov r1, #0 <== NOT EXECUTED
526c: ea000001 b 5278 <bsp_section_rodata_size+0x3c4> <== NOT EXECUTED
while (sc)
{
count++;
sc = sc->next;
5270: e5933000 ldr r3, [r3] <== NOT EXECUTED
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
{
count++;
5274: e2811001 add r1, r1, #1 <== NOT EXECUTED
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
5278: e3530000 cmp r3, #0 <== NOT EXECUTED
527c: 1afffffb bne 5270 <bsp_section_rodata_size+0x3bc> <== NOT EXECUTED
data->blocks_used = 0;
for (i = 0; i < fd->block_count; i++)
if (fd->blocks[i].segment)
data->blocks_used++;
data->segs_available = rtems_fdisk_segment_count_queue (&fd->available);
5280: e584101c str r1, [r4, #28] <== NOT EXECUTED
* Count the number of elements on the list.
*/
static uint32_t
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
5284: e5921040 ldr r1, [r2, #64] ; 0x40 <== NOT EXECUTED
5288: ea000001 b 5294 <bsp_section_rodata_size+0x3e0> <== NOT EXECUTED
uint32_t count = 0;
while (sc)
{
count++;
sc = sc->next;
528c: e5911000 ldr r1, [r1] <== NOT EXECUTED
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
{
count++;
5290: e2833001 add r3, r3, #1 <== NOT EXECUTED
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
5294: e3510000 cmp r1, #0 <== NOT EXECUTED
5298: 1afffffb bne 528c <bsp_section_rodata_size+0x3d8> <== NOT EXECUTED
for (i = 0; i < fd->block_count; i++)
if (fd->blocks[i].segment)
data->blocks_used++;
data->segs_available = rtems_fdisk_segment_count_queue (&fd->available);
data->segs_used = rtems_fdisk_segment_count_queue (&fd->used);
529c: e5843020 str r3, [r4, #32] <== NOT EXECUTED
* Count the number of elements on the list.
*/
static uint32_t
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
52a0: e5923058 ldr r3, [r2, #88] ; 0x58 <== NOT EXECUTED
52a4: ea000001 b 52b0 <bsp_section_rodata_size+0x3fc> <== NOT EXECUTED
uint32_t count = 0;
while (sc)
{
count++;
sc = sc->next;
52a8: e5933000 ldr r3, [r3] <== NOT EXECUTED
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
{
count++;
52ac: e2811001 add r1, r1, #1 <== NOT EXECUTED
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
52b0: e3530000 cmp r3, #0 <== NOT EXECUTED
52b4: 1afffffb bne 52a8 <bsp_section_rodata_size+0x3f4> <== NOT EXECUTED
if (fd->blocks[i].segment)
data->blocks_used++;
data->segs_available = rtems_fdisk_segment_count_queue (&fd->available);
data->segs_used = rtems_fdisk_segment_count_queue (&fd->used);
data->segs_failed = rtems_fdisk_segment_count_queue (&fd->failed);
52b8: e5841024 str r1, [r4, #36] ; 0x24 <== NOT EXECUTED
data->segment_count = 0;
52bc: e5843010 str r3, [r4, #16] <== NOT EXECUTED
data->page_count = 0;
52c0: e5843014 str r3, [r4, #20] <== NOT EXECUTED
data->pages_desc = 0;
52c4: e584302c str r3, [r4, #44] ; 0x2c <== NOT EXECUTED
data->pages_active = 0;
52c8: e5843030 str r3, [r4, #48] ; 0x30 <== NOT EXECUTED
data->pages_used = 0;
52cc: e5843034 str r3, [r4, #52] ; 0x34 <== NOT EXECUTED
data->pages_bad = 0;
52d0: e5843038 str r3, [r4, #56] ; 0x38 <== NOT EXECUTED
data->seg_erases = 0;
52d4: e5843028 str r3, [r4, #40] ; 0x28 <== NOT EXECUTED
for (i = 0; i < fd->device_count; i++)
52d8: e1a0e003 mov lr, r3 <== NOT EXECUTED
52dc: ea000028 b 5384 <bsp_section_rodata_size+0x4d0> <== NOT EXECUTED
{
data->segment_count += fd->devices[i].segment_count;
52e0: e592802c ldr r8, [r2, #44] ; 0x2c <== NOT EXECUTED
52e4: e0888003 add r8, r8, r3 <== NOT EXECUTED
52e8: e5987004 ldr r7, [r8, #4] <== NOT EXECUTED
52ec: e5941010 ldr r1, [r4, #16] <== NOT EXECUTED
52f0: e3a0c000 mov ip, #0 <== NOT EXECUTED
52f4: e0811007 add r1, r1, r7 <== NOT EXECUTED
52f8: e5841010 str r1, [r4, #16] <== NOT EXECUTED
for (j = 0; j < fd->devices[i].segment_count; j++)
52fc: e1a0500c mov r5, ip <== NOT EXECUTED
5300: ea00001b b 5374 <bsp_section_rodata_size+0x4c0> <== NOT EXECUTED
{
rtems_fdisk_segment_ctl* sc = &fd->devices[i].segments[j];
5304: e5981000 ldr r1, [r8] <== NOT EXECUTED
5308: e081100c add r1, r1, ip <== NOT EXECUTED
data->page_count += sc->pages;
530c: e591a014 ldr sl, [r1, #20] <== NOT EXECUTED
5310: e5949014 ldr r9, [r4, #20] <== NOT EXECUTED
5314: e089a00a add sl, r9, sl <== NOT EXECUTED
5318: e584a014 str sl, [r4, #20] <== NOT EXECUTED
data->pages_desc += sc->pages_desc;
531c: e594902c ldr r9, [r4, #44] ; 0x2c <== NOT EXECUTED
5320: e591a018 ldr sl, [r1, #24] <== NOT EXECUTED
5324: e089a00a add sl, r9, sl <== NOT EXECUTED
5328: e584a02c str sl, [r4, #44] ; 0x2c <== NOT EXECUTED
data->pages_active += sc->pages_active;
532c: e5949030 ldr r9, [r4, #48] ; 0x30 <== NOT EXECUTED
5330: e591a01c ldr sl, [r1, #28] <== NOT EXECUTED
5334: e089a00a add sl, r9, sl <== NOT EXECUTED
5338: e584a030 str sl, [r4, #48] ; 0x30 <== NOT EXECUTED
data->pages_used += sc->pages_used;
533c: e5949034 ldr r9, [r4, #52] ; 0x34 <== NOT EXECUTED
5340: e591a020 ldr sl, [r1, #32] <== NOT EXECUTED
5344: e089a00a add sl, r9, sl <== NOT EXECUTED
5348: e584a034 str sl, [r4, #52] ; 0x34 <== NOT EXECUTED
data->pages_bad += sc->pages_bad;
534c: e5949038 ldr r9, [r4, #56] ; 0x38 <== NOT EXECUTED
5350: e591a024 ldr sl, [r1, #36] ; 0x24 <== NOT EXECUTED
5354: e089a00a add sl, r9, sl <== NOT EXECUTED
data->seg_erases += sc->erased;
5358: e591102c ldr r1, [r1, #44] ; 0x2c <== NOT EXECUTED
data->page_count += sc->pages;
data->pages_desc += sc->pages_desc;
data->pages_active += sc->pages_active;
data->pages_used += sc->pages_used;
data->pages_bad += sc->pages_bad;
535c: e584a038 str sl, [r4, #56] ; 0x38 <== NOT EXECUTED
data->seg_erases += sc->erased;
5360: e594a028 ldr sl, [r4, #40] ; 0x28 <== NOT EXECUTED
5364: e08a1001 add r1, sl, r1 <== NOT EXECUTED
5368: e5841028 str r1, [r4, #40] ; 0x28 <== NOT EXECUTED
for (i = 0; i < fd->device_count; i++)
{
data->segment_count += fd->devices[i].segment_count;
for (j = 0; j < fd->devices[i].segment_count; j++)
536c: e2855001 add r5, r5, #1 <== NOT EXECUTED
5370: e28cc030 add ip, ip, #48 ; 0x30 <== NOT EXECUTED
5374: e1550007 cmp r5, r7 <== NOT EXECUTED
5378: 1affffe1 bne 5304 <bsp_section_rodata_size+0x450> <== NOT EXECUTED
data->pages_active = 0;
data->pages_used = 0;
data->pages_bad = 0;
data->seg_erases = 0;
for (i = 0; i < fd->device_count; i++)
537c: e28ee001 add lr, lr, #1 <== NOT EXECUTED
5380: e283300c add r3, r3, #12 <== NOT EXECUTED
5384: e15e0006 cmp lr, r6 <== NOT EXECUTED
5388: 1affffd4 bne 52e0 <bsp_section_rodata_size+0x42c> <== NOT EXECUTED
data->pages_bad += sc->pages_bad;
data->seg_erases += sc->erased;
}
}
data->info_level = fd->info_level;
538c: e592306c ldr r3, [r2, #108] ; 0x6c <== NOT EXECUTED
5390: e584303c str r3, [r4, #60] ; 0x3c <== NOT EXECUTED
case RTEMS_FDISK_IOCTL_ERASE_USED:
errno = rtems_fdisk_erase_used (&rtems_flashdisks[minor]);
break;
case RTEMS_FDISK_IOCTL_MONITORING:
errno = rtems_fdisk_monitoring_data (&rtems_flashdisks[minor],
5394: e3a03000 mov r3, #0 <== NOT EXECUTED
5398: eaffff43 b 50ac <bsp_section_rodata_size+0x1f8> <== NOT EXECUTED
(rtems_fdisk_monitor_data*) argp);
break;
case RTEMS_FDISK_IOCTL_INFO_LEVEL:
rtems_flashdisks[minor].info_level = (uintptr_t) argp;
539c: e5963000 ldr r3, [r6] <== NOT EXECUTED
53a0: e59dc034 ldr ip, [sp, #52] ; 0x34 <== NOT EXECUTED
53a4: e083300c add r3, r3, ip <== NOT EXECUTED
53a8: e583406c str r4, [r3, #108] ; 0x6c <== NOT EXECUTED
break;
53ac: ea00012d b 5868 <bsp_section_rodata_size+0x9b4> <== NOT EXECUTED
case RTEMS_FDISK_IOCTL_PRINT_STATUS:
errno = rtems_fdisk_print_status (&rtems_flashdisks[minor]);
53b0: eb006087 bl 1d5d4 <__errno>
53b4: e5963000 ldr r3, [r6]
53b8: e59dc034 ldr ip, [sp, #52] ; 0x34
53bc: e083400c add r4, r3, ip
*/
static int
rtems_fdisk_print_status (rtems_flashdisk* fd)
{
#if RTEMS_FDISK_TRACE
uint32_t current_info_level = fd->info_level;
53c0: e594c06c ldr ip, [r4, #108] ; 0x6c
53c4: e58dc03c str ip, [sp, #60] ; 0x3c
uint32_t count;
uint32_t device;
fd->info_level = 3;
rtems_fdisk_printf (fd,
53c8: e59dc034 ldr ip, [sp, #52] ; 0x34
uint32_t current_info_level = fd->info_level;
uint32_t total;
uint32_t count;
uint32_t device;
fd->info_level = 3;
53cc: e3a02003 mov r2, #3
case RTEMS_FDISK_IOCTL_INFO_LEVEL:
rtems_flashdisks[minor].info_level = (uintptr_t) argp;
break;
case RTEMS_FDISK_IOCTL_PRINT_STATUS:
errno = rtems_fdisk_print_status (&rtems_flashdisks[minor]);
53d0: e58d0044 str r0, [sp, #68] ; 0x44
uint32_t current_info_level = fd->info_level;
uint32_t total;
uint32_t count;
uint32_t device;
fd->info_level = 3;
53d4: e584206c str r2, [r4, #108] ; 0x6c
rtems_fdisk_printf (fd,
53d8: e59f1324 ldr r1, [pc, #804] ; 5704 <bsp_section_rodata_size+0x850>
53dc: e793200c ldr r2, [r3, ip]
53e0: e1a00004 mov r0, r4
53e4: e5943004 ldr r3, [r4, #4]
53e8: ebfff8f8 bl 37d0 <rtems_fdisk_printf>
"Flash Disk Driver Status : %d.%d", fd->major, fd->minor);
rtems_fdisk_printf (fd, "Block count\t%d", fd->block_count);
53ec: e59f1314 ldr r1, [pc, #788] ; 5708 <bsp_section_rodata_size+0x854>
53f0: e594201c ldr r2, [r4, #28]
53f4: e1a00004 mov r0, r4
53f8: ebfff8f4 bl 37d0 <rtems_fdisk_printf>
rtems_fdisk_printf (fd, "Unavail blocks\t%d", fd->unavail_blocks);
53fc: e59f1308 ldr r1, [pc, #776] ; 570c <bsp_section_rodata_size+0x858>
5400: e5942020 ldr r2, [r4, #32]
5404: e1a00004 mov r0, r4
5408: ebfff8f0 bl 37d0 <rtems_fdisk_printf>
rtems_fdisk_printf (fd, "Starvation threshold\t%d", fd->starvation_threshold);
540c: e59f12fc ldr r1, [pc, #764] ; 5710 <bsp_section_rodata_size+0x85c>
5410: e5942024 ldr r2, [r4, #36] ; 0x24
5414: e1a00004 mov r0, r4
5418: ebfff8ec bl 37d0 <rtems_fdisk_printf>
rtems_fdisk_printf (fd, "Starvations\t%d", fd->starvations);
541c: e1a00004 mov r0, r4
5420: e59f12ec ldr r1, [pc, #748] ; 5714 <bsp_section_rodata_size+0x860>
5424: e5942070 ldr r2, [r4, #112] ; 0x70
5428: ebfff8e8 bl 37d0 <rtems_fdisk_printf>
* Count the number of elements on the list.
*/
static uint32_t
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
542c: e5947034 ldr r7, [r4, #52] ; 0x34
5430: ea000001 b 543c <bsp_section_rodata_size+0x588>
uint32_t count = 0;
while (sc)
{
count++;
sc = sc->next;
5434: e5977000 ldr r7, [r7]
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
{
count++;
5438: e2855001 add r5, r5, #1
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
543c: e3570000 cmp r7, #0
5440: 1afffffb bne 5434 <bsp_section_rodata_size+0x580>
rtems_fdisk_printf (fd, "Unavail blocks\t%d", fd->unavail_blocks);
rtems_fdisk_printf (fd, "Starvation threshold\t%d", fd->starvation_threshold);
rtems_fdisk_printf (fd, "Starvations\t%d", fd->starvations);
count = rtems_fdisk_segment_count_queue (&fd->available);
total = count;
rtems_fdisk_printf (fd, "Available queue\t%ld (%ld)",
5444: e1a02005 mov r2, r5
5448: e1a00004 mov r0, r4
544c: e59f12c4 ldr r1, [pc, #708] ; 5718 <bsp_section_rodata_size+0x864>
5450: e594303c ldr r3, [r4, #60] ; 0x3c
5454: ebfff8dd bl 37d0 <rtems_fdisk_printf>
* Count the number of elements on the list.
*/
static uint32_t
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
5458: e5946040 ldr r6, [r4, #64] ; 0x40
uint32_t count = 0;
545c: e1a02007 mov r2, r7
5460: ea000001 b 546c <bsp_section_rodata_size+0x5b8>
while (sc)
{
count++;
sc = sc->next;
5464: e5966000 ldr r6, [r6]
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
{
count++;
5468: e2822001 add r2, r2, #1
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
546c: e3560000 cmp r6, #0
5470: 1afffffb bne 5464 <bsp_section_rodata_size+0x5b0>
total = count;
rtems_fdisk_printf (fd, "Available queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->available));
count = rtems_fdisk_segment_count_queue (&fd->used);
total += count;
rtems_fdisk_printf (fd, "Used queue\t%ld (%ld)",
5474: e1a00004 mov r0, r4
5478: e59f129c ldr r1, [pc, #668] ; 571c <bsp_section_rodata_size+0x868>
547c: e5943048 ldr r3, [r4, #72] ; 0x48
count = rtems_fdisk_segment_count_queue (&fd->available);
total = count;
rtems_fdisk_printf (fd, "Available queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->available));
count = rtems_fdisk_segment_count_queue (&fd->used);
total += count;
5480: e0828005 add r8, r2, r5
rtems_fdisk_printf (fd, "Used queue\t%ld (%ld)",
5484: ebfff8d1 bl 37d0 <rtems_fdisk_printf>
* Count the number of elements on the list.
*/
static uint32_t
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
5488: e594504c ldr r5, [r4, #76] ; 0x4c
uint32_t count = 0;
548c: e1a02006 mov r2, r6
5490: ea000001 b 549c <bsp_section_rodata_size+0x5e8>
while (sc)
{
count++;
sc = sc->next;
5494: e5955000 ldr r5, [r5] <== NOT EXECUTED
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
{
count++;
5498: e2822001 add r2, r2, #1 <== NOT EXECUTED
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
549c: e3550000 cmp r5, #0
54a0: 1afffffb bne 5494 <bsp_section_rodata_size+0x5e0>
total += count;
rtems_fdisk_printf (fd, "Used queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->used));
count = rtems_fdisk_segment_count_queue (&fd->erase);
total += count;
rtems_fdisk_printf (fd, "Erase queue\t%ld (%ld)",
54a4: e1a00004 mov r0, r4
54a8: e59f1270 ldr r1, [pc, #624] ; 5720 <bsp_section_rodata_size+0x86c>
54ac: e5943054 ldr r3, [r4, #84] ; 0x54
count = rtems_fdisk_segment_count_queue (&fd->used);
total += count;
rtems_fdisk_printf (fd, "Used queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->used));
count = rtems_fdisk_segment_count_queue (&fd->erase);
total += count;
54b0: e0888002 add r8, r8, r2
rtems_fdisk_printf (fd, "Erase queue\t%ld (%ld)",
54b4: ebfff8c5 bl 37d0 <rtems_fdisk_printf>
* Count the number of elements on the list.
*/
static uint32_t
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
54b8: e5946058 ldr r6, [r4, #88] ; 0x58
uint32_t count = 0;
54bc: e1a02005 mov r2, r5
54c0: ea000001 b 54cc <bsp_section_rodata_size+0x618>
while (sc)
{
count++;
sc = sc->next;
54c4: e5966000 ldr r6, [r6] <== NOT EXECUTED
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
{
count++;
54c8: e2822001 add r2, r2, #1 <== NOT EXECUTED
rtems_fdisk_segment_count_queue (rtems_fdisk_segment_ctl_queue* queue)
{
rtems_fdisk_segment_ctl* sc = queue->head;
uint32_t count = 0;
while (sc)
54cc: e3560000 cmp r6, #0
54d0: 1afffffb bne 54c4 <bsp_section_rodata_size+0x610>
total += count;
rtems_fdisk_printf (fd, "Erase queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->erase));
count = rtems_fdisk_segment_count_queue (&fd->failed);
total += count;
rtems_fdisk_printf (fd, "Failed queue\t%ld (%ld)",
54d4: e59f1248 ldr r1, [pc, #584] ; 5724 <bsp_section_rodata_size+0x870>
54d8: e5943060 ldr r3, [r4, #96] ; 0x60
54dc: e1a00004 mov r0, r4
count = rtems_fdisk_segment_count_queue (&fd->erase);
total += count;
rtems_fdisk_printf (fd, "Erase queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->erase));
count = rtems_fdisk_segment_count_queue (&fd->failed);
total += count;
54e0: e0888002 add r8, r8, r2
rtems_fdisk_printf (fd, "Failed queue\t%ld (%ld)",
54e4: ebfff8b9 bl 37d0 <rtems_fdisk_printf>
count, rtems_fdisk_segment_queue_count (&fd->failed));
count = 0;
for (device = 0; device < fd->device_count; device++)
54e8: e5941030 ldr r1, [r4, #48] ; 0x30
54ec: e1a02006 mov r2, r6
count = rtems_fdisk_segment_count_queue (&fd->failed);
total += count;
rtems_fdisk_printf (fd, "Failed queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->failed));
count = 0;
54f0: e1a03006 mov r3, r6
54f4: ea000005 b 5510 <bsp_section_rodata_size+0x65c>
for (device = 0; device < fd->device_count; device++)
count += fd->devices[device].segment_count;
54f8: e594002c ldr r0, [r4, #44] ; 0x2c
54fc: e0800006 add r0, r0, r6
5500: e5900004 ldr r0, [r0, #4]
total += count;
rtems_fdisk_printf (fd, "Failed queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->failed));
count = 0;
for (device = 0; device < fd->device_count; device++)
5504: e2822001 add r2, r2, #1
count += fd->devices[device].segment_count;
5508: e0833000 add r3, r3, r0
total += count;
rtems_fdisk_printf (fd, "Failed queue\t%ld (%ld)",
count, rtems_fdisk_segment_queue_count (&fd->failed));
count = 0;
for (device = 0; device < fd->device_count; device++)
550c: e286600c add r6, r6, #12
5510: e1520001 cmp r2, r1
5514: 1afffff7 bne 54f8 <bsp_section_rodata_size+0x644>
count += fd->devices[device].segment_count;
rtems_fdisk_printf (fd, "Queue total\t%ld of %ld, %s", total, count,
5518: e59f1208 ldr r1, [pc, #520] ; 5728 <bsp_section_rodata_size+0x874>
551c: e59f2208 ldr r2, [pc, #520] ; 572c <bsp_section_rodata_size+0x878>
5520: e1580003 cmp r8, r3
5524: 11a02001 movne r2, r1
5528: e58d2000 str r2, [sp]
552c: e59f11fc ldr r1, [pc, #508] ; 5730 <bsp_section_rodata_size+0x87c>
5530: e1a02008 mov r2, r8
5534: e1a00004 mov r0, r4
5538: ebfff8a4 bl 37d0 <rtems_fdisk_printf>
total == count ? "ok" : "MISSING");
rtems_fdisk_printf (fd, "Device count\t%d", fd->device_count);
553c: e3a0a000 mov sl, #0
5540: e1a00004 mov r0, r4
5544: e59f11e8 ldr r1, [pc, #488] ; 5734 <bsp_section_rodata_size+0x880>
5548: e5942030 ldr r2, [r4, #48] ; 0x30
554c: ebfff89f bl 37d0 <rtems_fdisk_printf>
for (device = 0; device < fd->device_count; device++)
5550: e58da02c str sl, [sp, #44] ; 0x2c
5554: ea0000a3 b 57e8 <bsp_section_rodata_size+0x934>
{
uint32_t block;
uint32_t seg;
rtems_fdisk_printf (fd, " Device\t\t%ld", device);
5558: e59f11d8 ldr r1, [pc, #472] ; 5738 <bsp_section_rodata_size+0x884>
555c: e59d202c ldr r2, [sp, #44] ; 0x2c
5560: e1a00004 mov r0, r4
5564: ebfff899 bl 37d0 <rtems_fdisk_printf>
rtems_fdisk_printf (fd, " Segment count\t%ld",
5568: e594302c ldr r3, [r4, #44] ; 0x2c
556c: e083300a add r3, r3, sl
5570: e1a00004 mov r0, r4
5574: e59f11c0 ldr r1, [pc, #448] ; 573c <bsp_section_rodata_size+0x888>
5578: e5932004 ldr r2, [r3, #4]
557c: e3a09000 mov r9, #0
5580: ebfff892 bl 37d0 <rtems_fdisk_printf>
fd->devices[device].segment_count);
for (seg = 0; seg < fd->devices[device].segment_count; seg++)
5584: e1a0b009 mov fp, r9
5588: ea00008d b 57c4 <bsp_section_rodata_size+0x910>
{
rtems_fdisk_segment_ctl* sc = &fd->devices[device].segments[seg];
558c: e793500a ldr r5, [r3, sl]
5590: e0855009 add r5, r5, r9
uint32_t page;
uint32_t erased = 0;
uint32_t active = 0;
uint32_t used = 0;
bool is_active = false;
5594: e3a07000 mov r7, #0
char queues[5];
rtems_fdisk_queue_status (fd, sc, queues);
5598: e1a00004 mov r0, r4
559c: e1a01005 mov r1, r5
55a0: e28d205c add r2, sp, #92 ; 0x5c
55a4: ebfff818 bl 360c <rtems_fdisk_queue_status>
for (page = 0; page < sc->pages; page++)
55a8: e1a08007 mov r8, r7
55ac: e58d9040 str r9, [sp, #64] ; 0x40
{
rtems_fdisk_segment_ctl* sc = &fd->devices[device].segments[seg];
uint32_t page;
uint32_t erased = 0;
uint32_t active = 0;
uint32_t used = 0;
55b0: e58d7038 str r7, [sp, #56] ; 0x38
55b4: e1a0900a mov r9, sl
for (seg = 0; seg < fd->devices[device].segment_count; seg++)
{
rtems_fdisk_segment_ctl* sc = &fd->devices[device].segments[seg];
uint32_t page;
uint32_t erased = 0;
55b8: e58d7030 str r7, [sp, #48] ; 0x30
55bc: e1a0a007 mov sl, r7
55c0: ea000026 b 5660 <bsp_section_rodata_size+0x7ac>
rtems_fdisk_queue_status (fd, sc, queues);
for (page = 0; page < sc->pages; page++)
{
if (rtems_fdisk_page_desc_erased (&sc->page_descriptors[page]))
55c4: e5956010 ldr r6, [r5, #16]
55c8: e0866188 add r6, r6, r8, lsl #3
55cc: e1a00006 mov r0, r6
55d0: ebfff83c bl 36c8 <rtems_fdisk_page_desc_erased>
55d4: e3500000 cmp r0, #0
erased++;
55d8: 159dc030 ldrne ip, [sp, #48] ; 0x30
55dc: 128cc001 addne ip, ip, #1
55e0: 158dc030 strne ip, [sp, #48] ; 0x30
rtems_fdisk_queue_status (fd, sc, queues);
for (page = 0; page < sc->pages; page++)
{
if (rtems_fdisk_page_desc_erased (&sc->page_descriptors[page]))
55e4: 1a000008 bne 560c <bsp_section_rodata_size+0x758>
* only set a flag by changing it from 1 to 0.
*/
static bool
rtems_fdisk_page_desc_flags_set (rtems_fdisk_page_desc* pd, uint16_t flags)
{
return (pd->flags & flags) == 0 ? true : false;
55e8: e1d630b2 ldrh r3, [r6, #2]
for (page = 0; page < sc->pages; page++)
{
if (rtems_fdisk_page_desc_erased (&sc->page_descriptors[page]))
erased++;
else if (rtems_fdisk_page_desc_flags_set (&sc->page_descriptors[page],
55ec: e3130001 tst r3, #1
55f0: 1a000005 bne 560c <bsp_section_rodata_size+0x758>
RTEMS_FDISK_PAGE_ACTIVE))
{
if (rtems_fdisk_page_desc_flags_set (&sc->page_descriptors[page],
55f4: e3130002 tst r3, #2
RTEMS_FDISK_PAGE_USED))
used++;
55f8: 059dc038 ldreq ip, [sp, #56] ; 0x38
55fc: 028cc001 addeq ip, ip, #1
5600: 058dc038 streq ip, [sp, #56] ; 0x38
else
{
active++;
5604: 128aa001 addne sl, sl, #1
is_active = true;
5608: 13a07001 movne r7, #1
}
}
for (block = 0; block < fd->block_count; block++)
560c: e3a06000 mov r6, #0
5610: ea00000e b 5650 <bsp_section_rodata_size+0x79c>
{
if ((fd->blocks[block].segment == sc) &&
5614: e5943018 ldr r3, [r4, #24]
5618: e0832186 add r2, r3, r6, lsl #3
561c: e7933186 ldr r3, [r3, r6, lsl #3]
5620: e1530005 cmp r3, r5
5624: 1a000008 bne 564c <bsp_section_rodata_size+0x798>
5628: e5923004 ldr r3, [r2, #4]
562c: e1530008 cmp r3, r8
5630: 1a000005 bne 564c <bsp_section_rodata_size+0x798>
(fd->blocks[block].page == page) && !is_active)
5634: e3570000 cmp r7, #0
rtems_fdisk_printf (fd,
5638: 01a00004 moveq r0, r4
563c: 059f10fc ldreq r1, [pc, #252] ; 5740 <bsp_section_rodata_size+0x88c>
5640: 01a02008 moveq r2, r8
5644: 01a03006 moveq r3, r6
5648: 0bfff860 bleq 37d0 <rtems_fdisk_printf>
active++;
is_active = true;
}
}
for (block = 0; block < fd->block_count; block++)
564c: e2866001 add r6, r6, #1
5650: e594301c ldr r3, [r4, #28]
5654: e1560003 cmp r6, r3
5658: 3affffed bcc 5614 <bsp_section_rodata_size+0x760>
bool is_active = false;
char queues[5];
rtems_fdisk_queue_status (fd, sc, queues);
for (page = 0; page < sc->pages; page++)
565c: e2888001 add r8, r8, #1
5660: e5951014 ldr r1, [r5, #20]
5664: e1580001 cmp r8, r1
5668: 3affffd5 bcc 55c4 <bsp_section_rodata_size+0x710>
page, block);
}
}
count = 0;
for (block = 0; block < fd->block_count; block++)
566c: e3a03000 mov r3, #0
5670: e1a0c00a mov ip, sl
5674: e594001c ldr r0, [r4, #28]
5678: e1a0a009 mov sl, r9
567c: e1a02003 mov r2, r3
5680: e59d9040 ldr r9, [sp, #64] ; 0x40
5684: ea000037 b 5768 <bsp_section_rodata_size+0x8b4>
5688: 00043168 .word 0x00043168
568c: 20004283 .word 0x20004283 <== NOT EXECUTED
5690: 20004285 .word 0x20004285 <== NOT EXECUTED
5694: c0184201 .word 0xc0184201 <== NOT EXECUTED
5698: 0002e4bf .word 0x0002e4bf <== NOT EXECUTED
569c: 0002e4cd .word 0x0002e4cd <== NOT EXECUTED
56a0: 0002e4f0 .word 0x0002e4f0 <== NOT EXECUTED
56a4: 000303ea .word 0x000303ea <== NOT EXECUTED
56a8: 0002e109 .word 0x0002e109 <== NOT EXECUTED
56ac: 0002e513 .word 0x0002e513 <== NOT EXECUTED
56b0: 0002e55a .word 0x0002e55a <== NOT EXECUTED
56b4: 0000ffff .word 0x0000ffff <== NOT EXECUTED
56b8: 0002e58f .word 0x0002e58f <== NOT EXECUTED
56bc: 0002e5c2 .word 0x0002e5c2 <== NOT EXECUTED
56c0: 0002e5f6 .word 0x0002e5f6 <== NOT EXECUTED
56c4: 0002e626 .word 0x0002e626 <== NOT EXECUTED
56c8: 0002e635 .word 0x0002e635 <== NOT EXECUTED
56cc: 0002e659 .word 0x0002e659 <== NOT EXECUTED
56d0: 0002e67a .word 0x0002e67a <== NOT EXECUTED
56d4: 0002e69f .word 0x0002e69f <== NOT EXECUTED
56d8: 0002e6cd .word 0x0002e6cd <== NOT EXECUTED
56dc: 0002e717 .word 0x0002e717 <== NOT EXECUTED
56e0: 0002e753 .word 0x0002e753 <== NOT EXECUTED
56e4: 0002e773 .word 0x0002e773 <== NOT EXECUTED
56e8: 0002e799 .word 0x0002e799 <== NOT EXECUTED
56ec: 0002e7e8 .word 0x0002e7e8 <== NOT EXECUTED
56f0: 0002e81f .word 0x0002e81f <== NOT EXECUTED
56f4: 0002e85b .word 0x0002e85b <== NOT EXECUTED
56f8: 0002e88f .word 0x0002e88f <== NOT EXECUTED
56fc: 0002e89a .word 0x0002e89a <== NOT EXECUTED
5700: 0002e8ac .word 0x0002e8ac <== NOT EXECUTED
5704: 0002e8c0 .word 0x0002e8c0 <== NOT EXECUTED
5708: 0002e8e1 .word 0x0002e8e1 <== NOT EXECUTED
570c: 0002e8f0 .word 0x0002e8f0 <== NOT EXECUTED
5710: 0002e902 .word 0x0002e902 <== NOT EXECUTED
5714: 0002e91a .word 0x0002e91a <== NOT EXECUTED
5718: 0002e929 .word 0x0002e929 <== NOT EXECUTED
571c: 0002e943 .word 0x0002e943 <== NOT EXECUTED
5720: 0002e958 .word 0x0002e958 <== NOT EXECUTED
5724: 0002e96e .word 0x0002e96e <== NOT EXECUTED
5728: 0002e4b7 .word 0x0002e4b7 <== NOT EXECUTED
572c: 0002e4b4 .word 0x0002e4b4 <== NOT EXECUTED
5730: 0002e985 .word 0x0002e985 <== NOT EXECUTED
5734: 0002e9a0 .word 0x0002e9a0 <== NOT EXECUTED
5738: 0002e9b0 .word 0x0002e9b0 <== NOT EXECUTED
573c: 0002e9bd .word 0x0002e9bd <== NOT EXECUTED
5740: 0002e9d1 .word 0x0002e9d1 <== NOT EXECUTED
5744: 0002e9fe .word 0x0002e9fe <== NOT EXECUTED
5748: 0002ea3a .word 0x0002ea3a <== NOT EXECUTED
574c: 0002ea45 .word 0x0002ea45 <== NOT EXECUTED
5750: 00043168 .word 0x00043168 <== NOT EXECUTED
{
if (fd->blocks[block].segment == sc)
5754: e594e018 ldr lr, [r4, #24]
5758: e79ee183 ldr lr, [lr, r3, lsl #3]
575c: e15e0005 cmp lr, r5
count++;
5760: 02822001 addeq r2, r2, #1
page, block);
}
}
count = 0;
for (block = 0; block < fd->block_count; block++)
5764: e2833001 add r3, r3, #1
5768: e1530000 cmp r3, r0
576c: 1afffff8 bne 5754 <bsp_section_rodata_size+0x8a0>
rtems_fdisk_printf (fd, " %3ld %s p:%3ld a:%3ld/%3ld" \
" u:%3ld/%3ld e:%3ld/%3ld br:%ld",
seg, queues,
sc->pages, sc->pages_active, active,
sc->pages_used, used, erased,
sc->pages - (sc->pages_active +
5770: e595301c ldr r3, [r5, #28]
sc->pages_used + sc->pages_bad),
5774: e5950020 ldr r0, [r5, #32]
{
if (fd->blocks[block].segment == sc)
count++;
}
rtems_fdisk_printf (fd, " %3ld %s p:%3ld a:%3ld/%3ld" \
5778: e88d100a stm sp, {r1, r3, ip}
577c: e59dc038 ldr ip, [sp, #56] ; 0x38
5780: e58dc010 str ip, [sp, #16]
5784: e59dc030 ldr ip, [sp, #48] ; 0x30
5788: e58d000c str r0, [sp, #12]
578c: e58dc014 str ip, [sp, #20]
* @param req IOCTL request code.
* @param argp IOCTL argument.
* @retval The IOCTL return value
*/
static int
rtems_fdisk_ioctl (rtems_disk_device *dd, uint32_t req, void* argp)
5790: e595c024 ldr ip, [r5, #36] ; 0x24
5794: e080000c add r0, r0, ip
5798: e0803003 add r3, r0, r3
{
if (fd->blocks[block].segment == sc)
count++;
}
rtems_fdisk_printf (fd, " %3ld %s p:%3ld a:%3ld/%3ld" \
579c: e0631001 rsb r1, r3, r1
57a0: e58d1018 str r1, [sp, #24]
57a4: e58d201c str r2, [sp, #28]
57a8: e1a00004 mov r0, r4
57ac: e1a0200b mov r2, fp
57b0: e51f1074 ldr r1, [pc, #-116] ; 5744 <bsp_section_rodata_size+0x890>
57b4: e28d305c add r3, sp, #92 ; 0x5c
57b8: ebfff804 bl 37d0 <rtems_fdisk_printf>
rtems_fdisk_printf (fd, " Device\t\t%ld", device);
rtems_fdisk_printf (fd, " Segment count\t%ld",
fd->devices[device].segment_count);
for (seg = 0; seg < fd->devices[device].segment_count; seg++)
57bc: e28bb001 add fp, fp, #1
57c0: e2899030 add r9, r9, #48 ; 0x30
57c4: e594302c ldr r3, [r4, #44] ; 0x2c
57c8: e083200a add r2, r3, sl
57cc: e5922004 ldr r2, [r2, #4]
57d0: e15b0002 cmp fp, r2
57d4: 3affff6c bcc 558c <bsp_section_rodata_size+0x6d8>
rtems_fdisk_printf (fd, "Queue total\t%ld of %ld, %s", total, count,
total == count ? "ok" : "MISSING");
rtems_fdisk_printf (fd, "Device count\t%d", fd->device_count);
for (device = 0; device < fd->device_count; device++)
57d8: e59dc02c ldr ip, [sp, #44] ; 0x2c
57dc: e28cc001 add ip, ip, #1
57e0: e58dc02c str ip, [sp, #44] ; 0x2c
57e4: e28aa00c add sl, sl, #12
57e8: e5943030 ldr r3, [r4, #48] ; 0x30
57ec: e59dc02c ldr ip, [sp, #44] ; 0x2c
57f0: e15c0003 cmp ip, r3
57f4: 3affff57 bcc 5558 <bsp_section_rodata_size+0x6a4>
}
{
rtems_fdisk_segment_ctl* sc = fd->used.head;
int count = 0;
rtems_fdisk_printf (fd, "Used List:");
57f8: e1a00004 mov r0, r4
57fc: e51f10bc ldr r1, [pc, #-188] ; 5748 <bsp_section_rodata_size+0x894>
count);
}
}
{
rtems_fdisk_segment_ctl* sc = fd->used.head;
5800: e5945040 ldr r5, [r4, #64] ; 0x40
int count = 0;
5804: e3a06000 mov r6, #0
rtems_fdisk_printf (fd, "Used List:");
5808: ebfff7f0 bl 37d0 <rtems_fdisk_printf>
580c: ea00000a b 583c <bsp_section_rodata_size+0x988>
while (sc)
{
rtems_fdisk_printf (fd, " %3d %02d:%03d u:%3ld",
5810: e595300c ldr r3, [r5, #12]
5814: e58d3000 str r3, [sp]
5818: e5953020 ldr r3, [r5, #32]
581c: e58d3004 str r3, [sp, #4]
5820: e1a02006 mov r2, r6
5824: e5953008 ldr r3, [r5, #8]
5828: e1a00004 mov r0, r4
582c: e51f10e8 ldr r1, [pc, #-232] ; 574c <bsp_section_rodata_size+0x898>
5830: ebfff7e6 bl 37d0 <rtems_fdisk_printf>
count, sc->device, sc->segment, sc->pages_used);
sc = sc->next;
5834: e5955000 ldr r5, [r5]
count++;
5838: e2866001 add r6, r6, #1
{
rtems_fdisk_segment_ctl* sc = fd->used.head;
int count = 0;
rtems_fdisk_printf (fd, "Used List:");
while (sc)
583c: e3550000 cmp r5, #0
5840: 1afffff2 bne 5810 <bsp_section_rodata_size+0x95c>
count, sc->device, sc->segment, sc->pages_used);
sc = sc->next;
count++;
}
}
fd->info_level = current_info_level;
5844: e59dc03c ldr ip, [sp, #60] ; 0x3c
5848: e584c06c str ip, [r4, #108] ; 0x6c
case RTEMS_FDISK_IOCTL_INFO_LEVEL:
rtems_flashdisks[minor].info_level = (uintptr_t) argp;
break;
case RTEMS_FDISK_IOCTL_PRINT_STATUS:
errno = rtems_fdisk_print_status (&rtems_flashdisks[minor]);
584c: e59dc044 ldr ip, [sp, #68] ; 0x44
5850: e58c5000 str r5, [ip]
break;
5854: ea000003 b 5868 <bsp_section_rodata_size+0x9b4>
default:
rtems_blkdev_ioctl (dd, req, argp);
5858: e1a0000a mov r0, sl
585c: e1a01007 mov r1, r7
5860: e1a02004 mov r2, r4
5864: eb003813 bl 138b8 <rtems_blkdev_ioctl>
break;
}
sc = rtems_semaphore_release (rtems_flashdisks[minor].lock);
5868: e51f3120 ldr r3, [pc, #-288] ; 5750 <bsp_section_rodata_size+0x89c>
586c: e59dc034 ldr ip, [sp, #52] ; 0x34
5870: e5933000 ldr r3, [r3]
5874: e083300c add r3, r3, ip
5878: e5930064 ldr r0, [r3, #100] ; 0x64
587c: eb001577 bl ae60 <rtems_semaphore_release>
if (sc != RTEMS_SUCCESSFUL)
5880: e3500000 cmp r0, #0
5884: 0a000002 beq 5894 <bsp_section_rodata_size+0x9e0>
errno = EIO;
5888: eb005f51 bl 1d5d4 <__errno> <== NOT EXECUTED
588c: e3a03005 mov r3, #5 <== NOT EXECUTED
5890: e5803000 str r3, [r0] <== NOT EXECUTED
}
return errno == 0 ? 0 : -1;
5894: eb005f4e bl 1d5d4 <__errno>
5898: e5900000 ldr r0, [r0]
589c: e3500000 cmp r0, #0
}
58a0: 13e00000 mvnne r0, #0
58a4: e28dd064 add sp, sp, #100 ; 0x64
58a8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
uint8_t* data;
uint32_t fb;
uint32_t b;
fb = sg->length / fd->block_size;
data = sg->buffer;
for (b = 0; b < fb; b++, data += fd->block_size)
58ac: e59dc030 ldr ip, [sp, #48] ; 0x30
58b0: e5963014 ldr r3, [r6, #20]
58b4: e28cc001 add ip, ip, #1
58b8: e58dc030 str ip, [sp, #48] ; 0x30
58bc: e0877003 add r7, r7, r3
58c0: eafffc5a b 4a30 <rtems_fdisk_ioctl+0x364>
00003c68 <rtems_fdisk_queue_segment>:
* @param fd The flash disk control table.
* @param sc The segment control table to be reallocated
*/
static void
rtems_fdisk_queue_segment (rtems_flashdisk* fd, rtems_fdisk_segment_ctl* sc)
{
3c68: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " queue-seg:%02d-%03d: p=%d a=%d u=%d b=%d f=%s n=%s",
3c6c: e591a028 ldr sl, [r1, #40] ; 0x28
* @param fd The flash disk control table.
* @param sc The segment control table to be reallocated
*/
static void
rtems_fdisk_queue_segment (rtems_flashdisk* fd, rtems_fdisk_segment_ctl* sc)
{
3c70: e1a04001 mov r4, r1
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " queue-seg:%02d-%03d: p=%d a=%d u=%d b=%d f=%s n=%s",
3c74: e5918014 ldr r8, [r1, #20]
3c78: e591701c ldr r7, [r1, #28]
3c7c: e2812008 add r2, r1, #8
3c80: e2816020 add r6, r1, #32
3c84: e5949000 ldr r9, [r4]
3c88: e59f116c ldr r1, [pc, #364] ; 3dfc <rtems_fdisk_queue_segment+0x194>
3c8c: e35a0000 cmp sl, #0
3c90: e59fa168 ldr sl, [pc, #360] ; 3e00 <rtems_fdisk_queue_segment+0x198>
3c94: e59fc168 ldr ip, [pc, #360] ; 3e04 <rtems_fdisk_queue_segment+0x19c>
3c98: 11a0c001 movne ip, r1
3c9c: e59f1164 ldr r1, [pc, #356] ; 3e08 <rtems_fdisk_queue_segment+0x1a0>
3ca0: e3590000 cmp r9, #0
* @param fd The flash disk control table.
* @param sc The segment control table to be reallocated
*/
static void
rtems_fdisk_queue_segment (rtems_flashdisk* fd, rtems_fdisk_segment_ctl* sc)
{
3ca4: e24dd018 sub sp, sp, #24
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " queue-seg:%02d-%03d: p=%d a=%d u=%d b=%d f=%s n=%s",
3ca8: e8964040 ldm r6, {r6, lr}
3cac: 11a0100a movne r1, sl
3cb0: e892000c ldm r2, {r2, r3}
3cb4: e58d1014 str r1, [sp, #20]
3cb8: e59f114c ldr r1, [pc, #332] ; 3e0c <rtems_fdisk_queue_segment+0x1a4>
* @param fd The flash disk control table.
* @param sc The segment control table to be reallocated
*/
static void
rtems_fdisk_queue_segment (rtems_flashdisk* fd, rtems_fdisk_segment_ctl* sc)
{
3cbc: e1a05000 mov r5, r0
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, " queue-seg:%02d-%03d: p=%d a=%d u=%d b=%d f=%s n=%s",
3cc0: e58d8000 str r8, [sp]
3cc4: e58d7004 str r7, [sp, #4]
3cc8: e58d6008 str r6, [sp, #8]
3ccc: e58de00c str lr, [sp, #12]
3cd0: e58dc010 str ip, [sp, #16]
3cd4: ebfffe9d bl 3750 <rtems_fdisk_info>
/*
* If the segment has failed then check the failed queue and append
* if not failed.
*/
if (sc->failed)
3cd8: e5943028 ldr r3, [r4, #40] ; 0x28
3cdc: e3530000 cmp r3, #0
*/
static bool
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
3ce0: 15953058 ldrne r3, [r5, #88] ; 0x58
/*
* If the segment has failed then check the failed queue and append
* if not failed.
*/
if (sc->failed)
3ce4: 1a000003 bne 3cf8 <rtems_fdisk_queue_segment+0x90>
3ce8: ea000005 b 3d04 <rtems_fdisk_queue_segment+0x9c>
{
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
{
if (it == sc)
3cec: e1530004 cmp r3, r4 <== NOT EXECUTED
3cf0: 0a00003f beq 3df4 <rtems_fdisk_queue_segment+0x18c> <== NOT EXECUTED
return true;
it = it->next;
3cf4: e5933000 ldr r3, [r3] <== NOT EXECUTED
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
3cf8: e3530000 cmp r3, #0 <== NOT EXECUTED
3cfc: 1afffffa bne 3cec <rtems_fdisk_queue_segment+0x84> <== NOT EXECUTED
3d00: ea000032 b 3dd0 <rtems_fdisk_queue_segment+0x168> <== NOT EXECUTED
}
/*
* Remove the queue from the available or used queue.
*/
rtems_fdisk_segment_queue_remove (&fd->available, sc);
3d04: e2856034 add r6, r5, #52 ; 0x34
3d08: e1a00006 mov r0, r6
3d0c: e1a01004 mov r1, r4
rtems_fdisk_segment_queue_remove (&fd->used, sc);
3d10: e2857040 add r7, r5, #64 ; 0x40
}
/*
* Remove the queue from the available or used queue.
*/
rtems_fdisk_segment_queue_remove (&fd->available, sc);
3d14: ebfffe0f bl 3558 <rtems_fdisk_segment_queue_remove>
rtems_fdisk_segment_queue_remove (&fd->used, sc);
3d18: e1a00007 mov r0, r7
3d1c: e1a01004 mov r1, r4
3d20: ebfffe0c bl 3558 <rtems_fdisk_segment_queue_remove>
* If they are and the driver has been configured to background
* erase place the segment on the used queue. If not configured
* to background erase perform the erase now.
*
*/
if (rtems_fdisk_seg_pages_available (sc) == 0)
3d24: e1a00004 mov r0, r4
3d28: ebfffe70 bl 36f0 <rtems_fdisk_seg_pages_available>
3d2c: e2508000 subs r8, r0, #0
* bit is cleared for that segment. When 32 erasers
* has occurred the page is re-written to the flash
* with all the counters updated with the number of
* bits cleared and all bits set back to 1.
*/
rtems_fdisk_segment_ctl* seg = fd->available.head;
3d30: 15955034 ldrne r5, [r5, #52] ; 0x34
* If they are and the driver has been configured to background
* erase place the segment on the used queue. If not configured
* to background erase perform the erase now.
*
*/
if (rtems_fdisk_seg_pages_available (sc) == 0)
3d34: 1a00001c bne 3dac <rtems_fdisk_queue_segment+0x144>
{
if (sc->pages_active)
3d38: e594301c ldr r3, [r4, #28]
3d3c: e3530000 cmp r3, #0
/*
* Keep the used queue sorted by the most number of used
* pages. When we compact we want to move the pages into
* a new segment and cover more than one segment.
*/
rtems_fdisk_segment_ctl* seg = fd->used.head;
3d40: 15951040 ldrne r1, [r5, #64] ; 0x40
* to background erase perform the erase now.
*
*/
if (rtems_fdisk_seg_pages_available (sc) == 0)
{
if (sc->pages_active)
3d44: 1a000005 bne 3d60 <rtems_fdisk_queue_segment+0xf8>
3d48: ea000009 b 3d74 <rtems_fdisk_queue_segment+0x10c> <== NOT EXECUTED
*/
rtems_fdisk_segment_ctl* seg = fd->used.head;
while (seg)
{
if (sc->pages_used > seg->pages_used)
3d4c: e5942020 ldr r2, [r4, #32]
3d50: e5913020 ldr r3, [r1, #32]
3d54: e1520003 cmp r2, r3
3d58: 8a000003 bhi 3d6c <rtems_fdisk_queue_segment+0x104>
break;
seg = seg->next;
3d5c: e5911000 ldr r1, [r1]
* pages. When we compact we want to move the pages into
* a new segment and cover more than one segment.
*/
rtems_fdisk_segment_ctl* seg = fd->used.head;
while (seg)
3d60: e3510000 cmp r1, #0
3d64: 1afffff8 bne 3d4c <rtems_fdisk_queue_segment+0xe4>
3d68: ea00001a b 3dd8 <rtems_fdisk_queue_segment+0x170>
break;
seg = seg->next;
}
if (seg)
rtems_fdisk_segment_queue_insert_before (&fd->used, seg, sc);
3d6c: e1a00007 mov r0, r7
3d70: ea000012 b 3dc0 <rtems_fdisk_queue_segment+0x158>
else
rtems_fdisk_segment_queue_push_tail (&fd->used, sc);
}
else
{
if ((fd->flags & RTEMS_FDISK_BACKGROUND_ERASE))
3d74: e5953008 ldr r3, [r5, #8] <== NOT EXECUTED
3d78: e3130001 tst r3, #1 <== NOT EXECUTED
rtems_fdisk_segment_queue_push_tail (&fd->erase, sc);
3d7c: 1285004c addne r0, r5, #76 ; 0x4c <== NOT EXECUTED
else
rtems_fdisk_segment_queue_push_tail (&fd->used, sc);
}
else
{
if ((fd->flags & RTEMS_FDISK_BACKGROUND_ERASE))
3d80: 1a000017 bne 3de4 <rtems_fdisk_queue_segment+0x17c> <== NOT EXECUTED
rtems_fdisk_segment_queue_push_tail (&fd->erase, sc);
else
rtems_fdisk_erase_segment (fd, sc);
3d84: e1a00005 mov r0, r5 <== NOT EXECUTED
3d88: e1a01004 mov r1, r4 <== NOT EXECUTED
if (seg)
rtems_fdisk_segment_queue_insert_before (&fd->available, seg, sc);
else
rtems_fdisk_segment_queue_push_tail (&fd->available, sc);
}
}
3d8c: e28dd018 add sp, sp, #24 <== NOT EXECUTED
3d90: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr} <== NOT EXECUTED
else
{
if ((fd->flags & RTEMS_FDISK_BACKGROUND_ERASE))
rtems_fdisk_segment_queue_push_tail (&fd->erase, sc);
else
rtems_fdisk_erase_segment (fd, sc);
3d94: eaffff74 b 3b6c <rtems_fdisk_erase_segment> <== NOT EXECUTED
rtems_fdisk_segment_ctl* seg = fd->available.head;
while (seg)
{
if (rtems_fdisk_seg_pages_available (sc) <
rtems_fdisk_seg_pages_available (seg))
3d98: e1a00005 mov r0, r5
3d9c: ebfffe53 bl 36f0 <rtems_fdisk_seg_pages_available>
*/
rtems_fdisk_segment_ctl* seg = fd->available.head;
while (seg)
{
if (rtems_fdisk_seg_pages_available (sc) <
3da0: e1580000 cmp r8, r0
3da4: 3a000003 bcc 3db8 <rtems_fdisk_queue_segment+0x150>
rtems_fdisk_seg_pages_available (seg))
break;
seg = seg->next;
3da8: e5955000 ldr r5, [r5]
* with all the counters updated with the number of
* bits cleared and all bits set back to 1.
*/
rtems_fdisk_segment_ctl* seg = fd->available.head;
while (seg)
3dac: e3550000 cmp r5, #0
3db0: 1afffff8 bne 3d98 <rtems_fdisk_queue_segment+0x130>
3db4: ea000009 b 3de0 <rtems_fdisk_queue_segment+0x178>
break;
seg = seg->next;
}
if (seg)
rtems_fdisk_segment_queue_insert_before (&fd->available, seg, sc);
3db8: e1a00006 mov r0, r6
3dbc: e1a01005 mov r1, r5
3dc0: e1a02004 mov r2, r4
else
rtems_fdisk_segment_queue_push_tail (&fd->available, sc);
}
}
3dc4: e28dd018 add sp, sp, #24
3dc8: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr}
break;
seg = seg->next;
}
if (seg)
rtems_fdisk_segment_queue_insert_before (&fd->available, seg, sc);
3dcc: eafffdfb b 35c0 <rtems_fdisk_segment_queue_insert_before>
* if not failed.
*/
if (sc->failed)
{
if (!rtems_fdisk_segment_queue_present (&fd->failed, sc))
rtems_fdisk_segment_queue_push_tail (&fd->failed, sc);
3dd0: e2850058 add r0, r5, #88 ; 0x58 <== NOT EXECUTED
3dd4: ea000002 b 3de4 <rtems_fdisk_queue_segment+0x17c> <== NOT EXECUTED
}
if (seg)
rtems_fdisk_segment_queue_insert_before (&fd->used, seg, sc);
else
rtems_fdisk_segment_queue_push_tail (&fd->used, sc);
3dd8: e1a00007 mov r0, r7
3ddc: ea000000 b 3de4 <rtems_fdisk_queue_segment+0x17c>
}
if (seg)
rtems_fdisk_segment_queue_insert_before (&fd->available, seg, sc);
else
rtems_fdisk_segment_queue_push_tail (&fd->available, sc);
3de0: e1a00006 mov r0, r6
3de4: e1a01004 mov r1, r4
}
}
3de8: e28dd018 add sp, sp, #24
3dec: e8bd47f0 pop {r4, r5, r6, r7, r8, r9, sl, lr}
}
if (seg)
rtems_fdisk_segment_queue_insert_before (&fd->available, seg, sc);
else
rtems_fdisk_segment_queue_push_tail (&fd->available, sc);
3df0: eafffdc9 b 351c <rtems_fdisk_segment_queue_push_tail>
}
}
3df4: e28dd018 add sp, sp, #24 <== NOT EXECUTED
3df8: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} <== NOT EXECUTED
0000360c <rtems_fdisk_queue_status>:
*/
static bool
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
360c: e5903034 ldr r3, [r0, #52] ; 0x34
3610: ea000002 b 3620 <rtems_fdisk_queue_status+0x14>
while (it)
{
if (it == sc)
3614: e1530001 cmp r3, r1
3618: 0a000004 beq 3630 <rtems_fdisk_queue_status+0x24>
return true;
it = it->next;
361c: e5933000 ldr r3, [r3]
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
3620: e3530000 cmp r3, #0
3624: 1afffffa bne 3614 <rtems_fdisk_queue_status+0x8>
static void
rtems_fdisk_queue_status (rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* sc,
char queues[5])
{
queues[0] = rtems_fdisk_segment_queue_present (&fd->available, sc) ? 'A' : '-';
3628: e3a0302d mov r3, #45 ; 0x2d
362c: ea000000 b 3634 <rtems_fdisk_queue_status+0x28>
3630: e3a03041 mov r3, #65 ; 0x41
3634: e5c23000 strb r3, [r2]
*/
static bool
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
3638: e5903040 ldr r3, [r0, #64] ; 0x40
363c: ea000002 b 364c <rtems_fdisk_queue_status+0x40>
while (it)
{
if (it == sc)
3640: e1530001 cmp r3, r1
3644: 0a000004 beq 365c <rtems_fdisk_queue_status+0x50>
return true;
it = it->next;
3648: e5933000 ldr r3, [r3]
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
364c: e3530000 cmp r3, #0
3650: 1afffffa bne 3640 <rtems_fdisk_queue_status+0x34>
rtems_fdisk_queue_status (rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* sc,
char queues[5])
{
queues[0] = rtems_fdisk_segment_queue_present (&fd->available, sc) ? 'A' : '-';
queues[1] = rtems_fdisk_segment_queue_present (&fd->used, sc) ? 'U' : '-';
3654: e3a0302d mov r3, #45 ; 0x2d
3658: ea000000 b 3660 <rtems_fdisk_queue_status+0x54>
365c: e3a03055 mov r3, #85 ; 0x55
3660: e5c23001 strb r3, [r2, #1]
*/
static bool
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
3664: e590304c ldr r3, [r0, #76] ; 0x4c
3668: ea000002 b 3678 <rtems_fdisk_queue_status+0x6c>
while (it)
{
if (it == sc)
366c: e1530001 cmp r3, r1 <== NOT EXECUTED
3670: 0a000004 beq 3688 <rtems_fdisk_queue_status+0x7c> <== NOT EXECUTED
return true;
it = it->next;
3674: e5933000 ldr r3, [r3] <== NOT EXECUTED
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
3678: e3530000 cmp r3, #0
367c: 1afffffa bne 366c <rtems_fdisk_queue_status+0x60>
rtems_fdisk_segment_ctl* sc,
char queues[5])
{
queues[0] = rtems_fdisk_segment_queue_present (&fd->available, sc) ? 'A' : '-';
queues[1] = rtems_fdisk_segment_queue_present (&fd->used, sc) ? 'U' : '-';
queues[2] = rtems_fdisk_segment_queue_present (&fd->erase, sc) ? 'E' : '-';
3680: e3a0302d mov r3, #45 ; 0x2d
3684: ea000000 b 368c <rtems_fdisk_queue_status+0x80>
3688: e3a03045 mov r3, #69 ; 0x45 <== NOT EXECUTED
368c: e5c23002 strb r3, [r2, #2]
*/
static bool
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
3690: e5903058 ldr r3, [r0, #88] ; 0x58
3694: ea000002 b 36a4 <rtems_fdisk_queue_status+0x98>
while (it)
{
if (it == sc)
3698: e1530001 cmp r3, r1 <== NOT EXECUTED
369c: 0a000004 beq 36b4 <rtems_fdisk_queue_status+0xa8> <== NOT EXECUTED
return true;
it = it->next;
36a0: e5933000 ldr r3, [r3] <== NOT EXECUTED
rtems_fdisk_segment_queue_present (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
36a4: e3530000 cmp r3, #0
36a8: 1afffffa bne 3698 <rtems_fdisk_queue_status+0x8c>
char queues[5])
{
queues[0] = rtems_fdisk_segment_queue_present (&fd->available, sc) ? 'A' : '-';
queues[1] = rtems_fdisk_segment_queue_present (&fd->used, sc) ? 'U' : '-';
queues[2] = rtems_fdisk_segment_queue_present (&fd->erase, sc) ? 'E' : '-';
queues[3] = rtems_fdisk_segment_queue_present (&fd->failed, sc) ? 'F' : '-';
36ac: e3a0302d mov r3, #45 ; 0x2d
36b0: ea000000 b 36b8 <rtems_fdisk_queue_status+0xac>
36b4: e3a03046 mov r3, #70 ; 0x46 <== NOT EXECUTED
36b8: e5c23003 strb r3, [r2, #3]
queues[4] = '\0';
36bc: e3a03000 mov r3, #0
36c0: e5c23004 strb r3, [r2, #4]
}
36c4: e12fff1e bx lr
000043b0 <rtems_fdisk_recover_block_mappings>:
/**
* Recover the block mappings from the devices.
*/
static int
rtems_fdisk_recover_block_mappings (rtems_flashdisk* fd)
{
43b0: e92d4fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
* Initialise the segment control queue.
*/
static void
rtems_fdisk_segment_queue_init (rtems_fdisk_segment_ctl_queue* queue)
{
queue->head = queue->tail = 0;
43b4: e3a09000 mov r9, #0
/**
* Recover the block mappings from the devices.
*/
static int
rtems_fdisk_recover_block_mappings (rtems_flashdisk* fd)
{
43b8: e1a04000 mov r4, r0
* Initialise the segment control queue.
*/
static void
rtems_fdisk_segment_queue_init (rtems_fdisk_segment_ctl_queue* queue)
{
queue->head = queue->tail = 0;
43bc: e5809038 str r9, [r0, #56] ; 0x38
43c0: e5809034 str r9, [r0, #52] ; 0x34
queue->count = 0;
43c4: e580903c str r9, [r0, #60] ; 0x3c
* Initialise the segment control queue.
*/
static void
rtems_fdisk_segment_queue_init (rtems_fdisk_segment_ctl_queue* queue)
{
queue->head = queue->tail = 0;
43c8: e5809044 str r9, [r0, #68] ; 0x44
43cc: e5809040 str r9, [r0, #64] ; 0x40
queue->count = 0;
43d0: e5809048 str r9, [r0, #72] ; 0x48
* Initialise the segment control queue.
*/
static void
rtems_fdisk_segment_queue_init (rtems_fdisk_segment_ctl_queue* queue)
{
queue->head = queue->tail = 0;
43d4: e5809050 str r9, [r0, #80] ; 0x50
43d8: e580904c str r9, [r0, #76] ; 0x4c
queue->count = 0;
43dc: e5809054 str r9, [r0, #84] ; 0x54
* Initialise the segment control queue.
*/
static void
rtems_fdisk_segment_queue_init (rtems_fdisk_segment_ctl_queue* queue)
{
queue->head = queue->tail = 0;
43e0: e580905c str r9, [r0, #92] ; 0x5c
43e4: e5809058 str r9, [r0, #88] ; 0x58
queue->count = 0;
43e8: e5809060 str r9, [r0, #96] ; 0x60
rtems_fdisk_segment_queue_init (&fd->failed);
/*
* Clear the lock mappings.
*/
memset (fd->blocks, 0, fd->block_count * sizeof (rtems_fdisk_block_ctl));
43ec: e2800018 add r0, r0, #24
43f0: e8900005 ldm r0, {r0, r2}
43f4: e1a01009 mov r1, r9
43f8: e1a02182 lsl r2, r2, #3
43fc: eb006919 bl 1e868 <memset>
/*
* Scan each segment or each device recovering the valid pages.
*/
fd->erased_blocks = 0;
fd->starvation_threshold = 0;
for (device = 0; device < fd->device_count; device++)
4400: e1a08009 mov r8, r9
memset (fd->blocks, 0, fd->block_count * sizeof (rtems_fdisk_block_ctl));
/*
* Scan each segment or each device recovering the valid pages.
*/
fd->erased_blocks = 0;
4404: e5849028 str r9, [r4, #40] ; 0x28
fd->starvation_threshold = 0;
4408: e5849024 str r9, [r4, #36] ; 0x24
for (device = 0; device < fd->device_count; device++)
440c: ea0000a0 b 4694 <rtems_fdisk_recover_block_mappings+0x2e4>
{
uint32_t segment;
for (segment = 0; segment < fd->devices[device].segment_count; segment++)
{
rtems_fdisk_segment_ctl* sc = &fd->devices[device].segments[segment];
4410: e7935009 ldr r5, [r3, r9]
rtems_fdisk_page_desc* pd;
uint32_t page;
int ret;
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "recover-block-mappings:%02d-%03d", device, segment);
4414: e1a02008 mov r2, r8
for (device = 0; device < fd->device_count; device++)
{
uint32_t segment;
for (segment = 0; segment < fd->devices[device].segment_count; segment++)
{
rtems_fdisk_segment_ctl* sc = &fd->devices[device].segments[segment];
4418: e085500b add r5, r5, fp
rtems_fdisk_page_desc* pd;
uint32_t page;
int ret;
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "recover-block-mappings:%02d-%03d", device, segment);
441c: e1a0300a mov r3, sl
4420: e59f1288 ldr r1, [pc, #648] ; 46b0 <rtems_fdisk_recover_block_mappings+0x300>
4424: e1a00004 mov r0, r4
{
uint32_t segment;
for (segment = 0; segment < fd->devices[device].segment_count; segment++)
{
rtems_fdisk_segment_ctl* sc = &fd->devices[device].segments[segment];
const rtems_fdisk_segment_desc* sd = sc->descriptor;
4428: e5956004 ldr r6, [r5, #4]
rtems_fdisk_page_desc* pd;
uint32_t page;
int ret;
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "recover-block-mappings:%02d-%03d", device, segment);
442c: ebfffcc7 bl 3750 <rtems_fdisk_info>
#endif
sc->pages_desc = rtems_fdisk_page_desc_pages (sd, fd->block_size);
4430: e5947014 ldr r7, [r4, #20]
*/
static uint32_t
rtems_fdisk_pages_in_segment (const rtems_fdisk_segment_desc* sd,
uint32_t page_size)
{
return sd->size / page_size;
4434: e5960008 ldr r0, [r6, #8]
4438: e1a01007 mov r1, r7
443c: ebfff53f bl 1940 <__aeabi_uidiv>
4440: e1a06000 mov r6, r0
static uint32_t
rtems_fdisk_page_desc_pages (const rtems_fdisk_segment_desc* sd,
uint32_t page_size)
{
uint32_t pages = rtems_fdisk_pages_in_segment (sd, page_size);
uint32_t bytes = pages * sizeof (rtems_fdisk_page_desc);
4444: e1a00180 lsl r0, r0, #3
return ((bytes - 1) / page_size) + 1;
4448: e2400001 sub r0, r0, #1
444c: e1a01007 mov r1, r7
4450: ebfff53a bl 1940 <__aeabi_uidiv>
#endif
sc->pages_desc = rtems_fdisk_page_desc_pages (sd, fd->block_size);
sc->pages =
rtems_fdisk_pages_in_segment (sd, fd->block_size) - sc->pages_desc;
if (sc->pages > fd->starvation_threshold)
4454: e5942024 ldr r2, [r4, #36] ; 0x24
rtems_fdisk_page_desc_pages (const rtems_fdisk_segment_desc* sd,
uint32_t page_size)
{
uint32_t pages = rtems_fdisk_pages_in_segment (sd, page_size);
uint32_t bytes = pages * sizeof (rtems_fdisk_page_desc);
return ((bytes - 1) / page_size) + 1;
4458: e2803001 add r3, r0, #1
rtems_fdisk_info (fd, "recover-block-mappings:%02d-%03d", device, segment);
#endif
sc->pages_desc = rtems_fdisk_page_desc_pages (sd, fd->block_size);
sc->pages =
rtems_fdisk_pages_in_segment (sd, fd->block_size) - sc->pages_desc;
445c: e0636006 rsb r6, r3, r6
if (sc->pages > fd->starvation_threshold)
4460: e1560002 cmp r6, r2
fd->starvation_threshold = sc->pages;
sc->pages_active = 0;
4464: e3a02000 mov r2, #0
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "recover-block-mappings:%02d-%03d", device, segment);
#endif
sc->pages_desc = rtems_fdisk_page_desc_pages (sd, fd->block_size);
4468: e5853018 str r3, [r5, #24]
sc->pages =
446c: e5856014 str r6, [r5, #20]
rtems_fdisk_pages_in_segment (sd, fd->block_size) - sc->pages_desc;
if (sc->pages > fd->starvation_threshold)
fd->starvation_threshold = sc->pages;
4470: 85846024 strhi r6, [r4, #36] ; 0x24
sc->pages_active = 0;
4474: e585201c str r2, [r5, #28]
sc->pages_used = 0;
4478: e5852020 str r2, [r5, #32]
sc->pages_bad = 0;
447c: e5852024 str r2, [r5, #36] ; 0x24
sc->failed = false;
4480: e5852028 str r2, [r5, #40] ; 0x28
if (!sc->page_descriptors)
4484: e5952010 ldr r2, [r5, #16]
4488: e3520000 cmp r2, #0
448c: 1a000004 bne 44a4 <rtems_fdisk_recover_block_mappings+0xf4>
sc->page_descriptors = malloc (sc->pages_desc * fd->block_size);
4490: e0000397 mul r0, r7, r3
4494: e58d300c str r3, [sp, #12]
4498: eb000a4c bl 6dd0 <malloc>
449c: e59d300c ldr r3, [sp, #12]
44a0: e5850010 str r0, [r5, #16]
if (!sc->page_descriptors)
44a4: e5956010 ldr r6, [r5, #16]
44a8: e3560000 cmp r6, #0
rtems_fdisk_abort ("no memory for page descriptors");
44ac: 059f0200 ldreq r0, [pc, #512] ; 46b4 <rtems_fdisk_recover_block_mappings+0x304>
44b0: 0bfff078 bleq 698 <rtems_fdisk_abort>
* descriptors.
*
* @todo It may be better to ask the driver to get these value
* so NAND flash could be better supported.
*/
ret = rtems_fdisk_seg_read (fd, sc, 0, (void*) pd,
44b4: e0070793 mul r7, r3, r7
44b8: e1a00004 mov r0, r4
44bc: e1a01005 mov r1, r5
44c0: e3a02000 mov r2, #0
44c4: e1a03006 mov r3, r6
44c8: e58d7000 str r7, [sp]
44cc: ebfffcdf bl 3850 <rtems_fdisk_seg_read>
sc->pages_desc * fd->block_size);
if (ret)
44d0: e2507000 subs r7, r0, #0
44d4: 0a00005c beq 464c <rtems_fdisk_recover_block_mappings+0x29c>
{
rtems_fdisk_error ("recover-block-mappings:%02d-%03d: " \
44d8: eb006e01 bl 1fce4 <strerror> <== NOT EXECUTED
44dc: e1a01008 mov r1, r8 <== NOT EXECUTED
44e0: e1a03000 mov r3, r0 <== NOT EXECUTED
44e4: e1a0200a mov r2, sl <== NOT EXECUTED
44e8: e59f01c8 ldr r0, [pc, #456] ; 46b8 <rtems_fdisk_recover_block_mappings+0x308><== NOT EXECUTED
44ec: e58d7000 str r7, [sp] <== NOT EXECUTED
44f0: ebfffd81 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
"read page desc failed: %s (%d)",
device, segment, strerror (ret), ret);
return ret;
44f4: ea00006a b 46a4 <rtems_fdisk_recover_block_mappings+0x2f4> <== NOT EXECUTED
* If the page is active see if the block is with-in range and
* if the block is a duplicate.
*/
for (page = 0; page < sc->pages; page++, pd++)
{
if (rtems_fdisk_page_desc_erased (pd))
44f8: e1a00006 mov r0, r6
44fc: ebfffc71 bl 36c8 <rtems_fdisk_page_desc_erased>
4500: e3500000 cmp r0, #0
4504: 0a000023 beq 4598 <rtems_fdisk_recover_block_mappings+0x1e8>
{
/*
* Is the page erased ?
*/
ret = rtems_fdisk_seg_blank_check_page (fd, sc,
4508: e5952018 ldr r2, [r5, #24]
rtems_fdisk_seg_blank_check_page (const rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* sc,
uint32_t page)
{
return rtems_fdisk_seg_blank_check (fd, sc,
page * fd->block_size, fd->block_size);
450c: e5943014 ldr r3, [r4, #20]
if (rtems_fdisk_page_desc_erased (pd))
{
/*
* Is the page erased ?
*/
ret = rtems_fdisk_seg_blank_check_page (fd, sc,
4510: e0872002 add r2, r7, r2
static int
rtems_fdisk_seg_blank_check_page (const rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* sc,
uint32_t page)
{
return rtems_fdisk_seg_blank_check (fd, sc,
4514: e0020293 mul r2, r3, r2
4518: e1a00004 mov r0, r4
451c: e1a01005 mov r1, r5
4520: ebfffce8 bl 38c8 <rtems_fdisk_seg_blank_check>
* Is the page erased ?
*/
ret = rtems_fdisk_seg_blank_check_page (fd, sc,
page + sc->pages_desc);
if (ret == 0)
4524: e3500000 cmp r0, #0
{
++fd->erased_blocks;
4528: 05943028 ldreq r3, [r4, #40] ; 0x28
452c: 02833001 addeq r3, r3, #1
4530: 05843028 streq r3, [r4, #40] ; 0x28
* Is the page erased ?
*/
ret = rtems_fdisk_seg_blank_check_page (fd, sc,
page + sc->pages_desc);
if (ret == 0)
4534: 0a000042 beq 4644 <rtems_fdisk_recover_block_mappings+0x294>
++fd->erased_blocks;
}
else
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_warning (fd, "page not blank: %d-%d-%d",
4538: e58d7000 str r7, [sp] <== NOT EXECUTED
453c: e5963004 ldr r3, [r6, #4] <== NOT EXECUTED
4540: e59f1174 ldr r1, [pc, #372] ; 46bc <rtems_fdisk_recover_block_mappings+0x30c><== NOT EXECUTED
4544: e58d3004 str r3, [sp, #4] <== NOT EXECUTED
4548: e1a02008 mov r2, r8 <== NOT EXECUTED
454c: e1a0300a mov r3, sl <== NOT EXECUTED
4550: e1a00004 mov r0, r4 <== NOT EXECUTED
4554: ebfffd49 bl 3a80 <rtems_fdisk_warning> <== NOT EXECUTED
* Set the flags. Setting means clear the bit to 0.
*/
static void
rtems_fdisk_page_desc_set_flags (rtems_fdisk_page_desc* pd, uint16_t flags)
{
pd->flags &= ~flags;
4558: e1d630b2 ldrh r3, [r6, #2] <== NOT EXECUTED
455c: e3c33002 bic r3, r3, #2 <== NOT EXECUTED
4560: e1c630b2 strh r3, [r6, #2] <== NOT EXECUTED
rtems_fdisk_warning (fd, "page not blank: %d-%d-%d",
device, segment, page, pd->block);
#endif
rtems_fdisk_page_desc_set_flags (pd, RTEMS_FDISK_PAGE_USED);
ret = rtems_fdisk_seg_write_page_desc (fd, sc,
4564: e1a00004 mov r0, r4 <== NOT EXECUTED
4568: e1a01005 mov r1, r5 <== NOT EXECUTED
456c: e1a02007 mov r2, r7 <== NOT EXECUTED
4570: e1a03006 mov r3, r6 <== NOT EXECUTED
4574: ebfffd14 bl 39cc <rtems_fdisk_seg_write_page_desc> <== NOT EXECUTED
page, pd);
if (ret)
4578: e3500000 cmp r0, #0 <== NOT EXECUTED
457c: 0a000008 beq 45a4 <rtems_fdisk_recover_block_mappings+0x1f4><== NOT EXECUTED
{
rtems_fdisk_error ("forcing page to used failed: %d-%d-%d",
4580: e1a01008 mov r1, r8 <== NOT EXECUTED
4584: e1a0200a mov r2, sl <== NOT EXECUTED
4588: e1a03007 mov r3, r7 <== NOT EXECUTED
458c: e59f012c ldr r0, [pc, #300] ; 46c0 <rtems_fdisk_recover_block_mappings+0x310><== NOT EXECUTED
4590: ebfffd59 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
4594: ea000002 b 45a4 <rtems_fdisk_recover_block_mappings+0x1f4> <== NOT EXECUTED
* only set a flag by changing it from 1 to 0.
*/
static bool
rtems_fdisk_page_desc_flags_set (rtems_fdisk_page_desc* pd, uint16_t flags)
{
return (pd->flags & flags) == 0 ? true : false;
4598: e1d630b2 ldrh r3, [r6, #2] <== NOT EXECUTED
sc->pages_used++;
}
}
else
{
if (rtems_fdisk_page_desc_flags_set (pd, RTEMS_FDISK_PAGE_USED))
459c: e3130002 tst r3, #2 <== NOT EXECUTED
45a0: 1a000003 bne 45b4 <rtems_fdisk_recover_block_mappings+0x204><== NOT EXECUTED
{
sc->pages_used++;
45a4: e5953020 ldr r3, [r5, #32] <== NOT EXECUTED
45a8: e2833001 add r3, r3, #1 <== NOT EXECUTED
45ac: e5853020 str r3, [r5, #32] <== NOT EXECUTED
45b0: ea000023 b 4644 <rtems_fdisk_recover_block_mappings+0x294> <== NOT EXECUTED
}
else if (rtems_fdisk_page_desc_flags_set (pd, RTEMS_FDISK_PAGE_ACTIVE))
45b4: e3130001 tst r3, #1 <== NOT EXECUTED
45b8: 1a00001e bne 4638 <rtems_fdisk_recover_block_mappings+0x288><== NOT EXECUTED
{
if (pd->block >= fd->block_count)
45bc: e5961004 ldr r1, [r6, #4] <== NOT EXECUTED
45c0: e594301c ldr r3, [r4, #28] <== NOT EXECUTED
45c4: e1510003 cmp r1, r3 <== NOT EXECUTED
45c8: 3a000007 bcc 45ec <rtems_fdisk_recover_block_mappings+0x23c><== NOT EXECUTED
{
#if RTEMS_FDISK_TRACE
rtems_fdisk_warning (fd,
45cc: e58d1004 str r1, [sp, #4] <== NOT EXECUTED
45d0: e1a00004 mov r0, r4 <== NOT EXECUTED
45d4: e59f10e8 ldr r1, [pc, #232] ; 46c4 <rtems_fdisk_recover_block_mappings+0x314><== NOT EXECUTED
45d8: e1a02008 mov r2, r8 <== NOT EXECUTED
45dc: e1a0300a mov r3, sl <== NOT EXECUTED
45e0: e58d7000 str r7, [sp] <== NOT EXECUTED
45e4: ebfffd25 bl 3a80 <rtems_fdisk_warning> <== NOT EXECUTED
45e8: ea000012 b 4638 <rtems_fdisk_recover_block_mappings+0x288> <== NOT EXECUTED
"invalid block number: %d-%d-%d: block: %d",
device, segment, page, pd->block);
#endif
sc->pages_bad++;
}
else if (fd->blocks[pd->block].segment)
45ec: e5940018 ldr r0, [r4, #24] <== NOT EXECUTED
45f0: e7902181 ldr r2, [r0, r1, lsl #3] <== NOT EXECUTED
45f4: e3520000 cmp r2, #0 <== NOT EXECUTED
45f8: e0803181 add r3, r0, r1, lsl #3 <== NOT EXECUTED
45fc: 0a000007 beq 4620 <rtems_fdisk_recover_block_mappings+0x270><== NOT EXECUTED
* each block so we can tell which is the later block when
* duplicates appear. A power down with a failed wirte could cause
* a duplicate.
*/
const rtems_fdisk_segment_ctl* bsc = fd->blocks[pd->block].segment;
rtems_fdisk_error ("duplicate block: %d-%d-%d: " \
4600: e88d0500 stm sp, {r8, sl} <== NOT EXECUTED
4604: e58d7008 str r7, [sp, #8] <== NOT EXECUTED
4608: e2821008 add r1, r2, #8 <== NOT EXECUTED
460c: e8910006 ldm r1, {r1, r2} <== NOT EXECUTED
4610: e5933004 ldr r3, [r3, #4] <== NOT EXECUTED
4614: e59f00ac ldr r0, [pc, #172] ; 46c8 <rtems_fdisk_recover_block_mappings+0x318><== NOT EXECUTED
4618: ebfffd37 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
461c: ea000005 b 4638 <rtems_fdisk_recover_block_mappings+0x288> <== NOT EXECUTED
/**
* @todo
* Add start up crc checks here.
*/
fd->blocks[pd->block].segment = sc;
fd->blocks[pd->block].page = page;
4620: e5837004 str r7, [r3, #4] <== NOT EXECUTED
/*
* The page is active.
*/
sc->pages_active++;
4624: e595301c ldr r3, [r5, #28] <== NOT EXECUTED
4628: e2833001 add r3, r3, #1 <== NOT EXECUTED
{
/**
* @todo
* Add start up crc checks here.
*/
fd->blocks[pd->block].segment = sc;
462c: e7805181 str r5, [r0, r1, lsl #3] <== NOT EXECUTED
fd->blocks[pd->block].page = page;
/*
* The page is active.
*/
sc->pages_active++;
4630: e585301c str r3, [r5, #28] <== NOT EXECUTED
4634: ea000002 b 4644 <rtems_fdisk_recover_block_mappings+0x294> <== NOT EXECUTED
}
}
else
sc->pages_bad++;
4638: e5953024 ldr r3, [r5, #36] ; 0x24 <== NOT EXECUTED
463c: e2833001 add r3, r3, #1 <== NOT EXECUTED
4640: e5853024 str r3, [r5, #36] ; 0x24 <== NOT EXECUTED
* are active and how many are used.
*
* If the page is active see if the block is with-in range and
* if the block is a duplicate.
*/
for (page = 0; page < sc->pages; page++, pd++)
4644: e2877001 add r7, r7, #1
4648: e2866008 add r6, r6, #8
464c: e5953014 ldr r3, [r5, #20]
4650: e1570003 cmp r7, r3
4654: 3affffa7 bcc 44f8 <rtems_fdisk_recover_block_mappings+0x148>
}
/*
* Place the segment on to the correct queue.
*/
rtems_fdisk_queue_segment (fd, sc);
4658: e1a00004 mov r0, r4
465c: e1a01005 mov r1, r5
4660: ebfffd80 bl 3c68 <rtems_fdisk_queue_segment>
fd->erased_blocks = 0;
fd->starvation_threshold = 0;
for (device = 0; device < fd->device_count; device++)
{
uint32_t segment;
for (segment = 0; segment < fd->devices[device].segment_count; segment++)
4664: e28aa001 add sl, sl, #1
4668: e28bb030 add fp, fp, #48 ; 0x30
466c: ea000001 b 4678 <rtems_fdisk_recover_block_mappings+0x2c8>
/*
* Scan each segment or each device recovering the valid pages.
*/
fd->erased_blocks = 0;
fd->starvation_threshold = 0;
for (device = 0; device < fd->device_count; device++)
4670: e3a0b000 mov fp, #0
4674: e1a0a00b mov sl, fp
{
uint32_t segment;
for (segment = 0; segment < fd->devices[device].segment_count; segment++)
4678: e594302c ldr r3, [r4, #44] ; 0x2c
467c: e0832009 add r2, r3, r9
4680: e5922004 ldr r2, [r2, #4]
4684: e15a0002 cmp sl, r2
4688: 3affff60 bcc 4410 <rtems_fdisk_recover_block_mappings+0x60>
/*
* Scan each segment or each device recovering the valid pages.
*/
fd->erased_blocks = 0;
fd->starvation_threshold = 0;
for (device = 0; device < fd->device_count; device++)
468c: e2888001 add r8, r8, #1
4690: e289900c add r9, r9, #12
4694: e5943030 ldr r3, [r4, #48] ; 0x30
4698: e1580003 cmp r8, r3
469c: 3afffff3 bcc 4670 <rtems_fdisk_recover_block_mappings+0x2c0>
*/
rtems_fdisk_queue_segment (fd, sc);
}
}
return 0;
46a0: e3a07000 mov r7, #0
}
46a4: e1a00007 mov r0, r7
46a8: e28dd010 add sp, sp, #16
46ac: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00003e10 <rtems_fdisk_recycle_segment>:
static int
rtems_fdisk_recycle_segment (rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* ssc,
rtems_fdisk_segment_ctl* dsc,
uint32_t *pages)
{
3e10: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
int ret;
uint32_t spage;
uint32_t used = 0;
uint32_t active = 0;
3e14: e3a0b000 mov fp, #0
static int
rtems_fdisk_recycle_segment (rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* ssc,
rtems_fdisk_segment_ctl* dsc,
uint32_t *pages)
{
3e18: e24dd02c sub sp, sp, #44 ; 0x2c
3e1c: e1a06002 mov r6, r2
/*
* Get new destination segment if necessary.
*/
dst_pages = rtems_fdisk_seg_pages_available (dsc);
if (dst_pages == 0)
dsc = rtems_fdisk_seg_most_available (&fd->available);
3e20: e2802034 add r2, r0, #52 ; 0x34
static int
rtems_fdisk_recycle_segment (rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* ssc,
rtems_fdisk_segment_ctl* dsc,
uint32_t *pages)
{
3e24: e1a04000 mov r4, r0
3e28: e1a05001 mov r5, r1
3e2c: e58d3020 str r3, [sp, #32]
int ret;
uint32_t spage;
uint32_t used = 0;
3e30: e58db01c str fp, [sp, #28]
uint32_t active = 0;
for (spage = 0; spage < ssc->pages; spage++)
3e34: e1a0a00b mov sl, fp
/*
* Get new destination segment if necessary.
*/
dst_pages = rtems_fdisk_seg_pages_available (dsc);
if (dst_pages == 0)
dsc = rtems_fdisk_seg_most_available (&fd->available);
3e38: e58d2028 str r2, [sp, #40] ; 0x28
int ret;
uint32_t spage;
uint32_t used = 0;
uint32_t active = 0;
for (spage = 0; spage < ssc->pages; spage++)
3e3c: ea0000c0 b 4144 <rtems_fdisk_recycle_segment+0x334>
{
rtems_fdisk_page_desc* spd = &ssc->page_descriptors[spage];
if (!dsc && ssc->pages_active > 0)
3e40: e3560000 cmp r6, #0
uint32_t used = 0;
uint32_t active = 0;
for (spage = 0; spage < ssc->pages; spage++)
{
rtems_fdisk_page_desc* spd = &ssc->page_descriptors[spage];
3e44: e5959010 ldr r9, [r5, #16]
if (!dsc && ssc->pages_active > 0)
3e48: 1a000005 bne 3e64 <rtems_fdisk_recycle_segment+0x54>
3e4c: e595301c ldr r3, [r5, #28]
3e50: e3530000 cmp r3, #0
3e54: 0a000002 beq 3e64 <rtems_fdisk_recycle_segment+0x54>
{
rtems_fdisk_error ("recycle: no available dst segment");
3e58: e59f0344 ldr r0, [pc, #836] ; 41a4 <rtems_fdisk_recycle_segment+0x394><== NOT EXECUTED
3e5c: ebffff26 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
3e60: ea00004d b 3f9c <rtems_fdisk_recycle_segment+0x18c> <== NOT EXECUTED
uint32_t used = 0;
uint32_t active = 0;
for (spage = 0; spage < ssc->pages; spage++)
{
rtems_fdisk_page_desc* spd = &ssc->page_descriptors[spage];
3e64: e089918a add r9, r9, sl, lsl #3
* only set a flag by changing it from 1 to 0.
*/
static bool
rtems_fdisk_page_desc_flags_set (rtems_fdisk_page_desc* pd, uint16_t flags)
{
return (pd->flags & flags) == 0 ? true : false;
3e68: e1d930b2 ldrh r3, [r9, #2]
{
rtems_fdisk_error ("recycle: no available dst segment");
return EIO;
}
if (rtems_fdisk_page_desc_flags_set (spd, RTEMS_FDISK_PAGE_ACTIVE) &&
3e6c: e2137001 ands r7, r3, #1
3e70: 1a0000a9 bne 411c <rtems_fdisk_recycle_segment+0x30c>
3e74: e3130002 tst r3, #2
* Find the next available page in a segment.
*/
static uint32_t
rtems_fdisk_seg_next_available_page (rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_page_desc* pd = &sc->page_descriptors[0];
3e78: 15963010 ldrne r3, [r6, #16]
3e7c: 158d3024 strne r3, [sp, #36] ; 0x24
3e80: 11a08003 movne r8, r3
{
rtems_fdisk_error ("recycle: no available dst segment");
return EIO;
}
if (rtems_fdisk_page_desc_flags_set (spd, RTEMS_FDISK_PAGE_ACTIVE) &&
3e84: 1a00002c bne 3f3c <rtems_fdisk_recycle_segment+0x12c>
3e88: ea0000a3 b 411c <rtems_fdisk_recycle_segment+0x30c>
{
rtems_fdisk_page_desc* pd = &sc->page_descriptors[0];
uint32_t page;
for (page = 0; page < sc->pages; page++, pd++)
if (rtems_fdisk_page_desc_erased (pd))
3e8c: e1a00008 mov r0, r8
3e90: ebfffe0c bl 36c8 <rtems_fdisk_page_desc_erased>
3e94: e3500000 cmp r0, #0
3e98: 0a000025 beq 3f34 <rtems_fdisk_recycle_segment+0x124>
rtems_fdisk_segment_queue_push_head (&fd->used, ssc);
return EIO;
}
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "recycle: %02d-%03d-%03d=>%02d-%03d-%03d",
3e9c: e58da000 str sl, [sp]
3ea0: e5963008 ldr r3, [r6, #8]
3ea4: e58d3004 str r3, [sp, #4]
3ea8: e596300c ldr r3, [r6, #12]
3eac: e58d700c str r7, [sp, #12]
3eb0: e58d3008 str r3, [sp, #8]
3eb4: e2852008 add r2, r5, #8
3eb8: e892000c ldm r2, {r2, r3}
3ebc: e59f12e4 ldr r1, [pc, #740] ; 41a8 <rtems_fdisk_recycle_segment+0x398>
3ec0: e1a00004 mov r0, r4
3ec4: ebfffe21 bl 3750 <rtems_fdisk_info>
ssc->device, ssc->segment, spage,
dsc->device, dsc->segment, dpage);
#endif
ret = rtems_fdisk_seg_copy_page (fd, ssc,
3ec8: e5958018 ldr r8, [r5, #24]
3ecc: e08a8008 add r8, sl, r8
3ed0: e596c018 ldr ip, [r6, #24]
rtems_fdisk_segment_ctl* dst_sc,
uint32_t dst_page)
{
int ret;
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " seg-copy-page: %02d-%03d~%03d=>%02d-%03d~%03d",
3ed4: e58d8000 str r8, [sp]
3ed8: e5963008 ldr r3, [r6, #8]
3edc: e58d3004 str r3, [sp, #4]
3ee0: e596300c ldr r3, [r6, #12]
#if RTEMS_FDISK_TRACE
rtems_fdisk_info (fd, "recycle: %02d-%03d-%03d=>%02d-%03d-%03d",
ssc->device, ssc->segment, spage,
dsc->device, dsc->segment, dpage);
#endif
ret = rtems_fdisk_seg_copy_page (fd, ssc,
3ee4: e087c00c add ip, r7, ip
rtems_fdisk_segment_ctl* dst_sc,
uint32_t dst_page)
{
int ret;
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, " seg-copy-page: %02d-%03d~%03d=>%02d-%03d~%03d",
3ee8: e58dc00c str ip, [sp, #12]
3eec: e58d3008 str r3, [sp, #8]
3ef0: e2852008 add r2, r5, #8
3ef4: e892000c ldm r2, {r2, r3}
3ef8: e59f12ac ldr r1, [pc, #684] ; 41ac <rtems_fdisk_recycle_segment+0x39c>
3efc: e1a00004 mov r0, r4
3f00: e58dc018 str ip, [sp, #24]
3f04: ebfffe31 bl 37d0 <rtems_fdisk_printf>
rtems_fdisk_segment_ctl* sc,
uint32_t page,
void* buffer)
{
return rtems_fdisk_seg_read (fd, sc,
page * fd->block_size, buffer, fd->block_size);
3f08: e5942014 ldr r2, [r4, #20]
rtems_fdisk_seg_read_page (const rtems_flashdisk* fd,
rtems_fdisk_segment_ctl* sc,
uint32_t page,
void* buffer)
{
return rtems_fdisk_seg_read (fd, sc,
3f0c: e1a00004 mov r0, r4
3f10: e58d2000 str r2, [sp]
3f14: e1a01005 mov r1, r5
3f18: e0020298 mul r2, r8, r2
3f1c: e5943068 ldr r3, [r4, #104] ; 0x68
3f20: ebfffe4a bl 3850 <rtems_fdisk_seg_read>
src_sc->device, src_sc->segment, src_page,
dst_sc->device, dst_sc->segment, dst_page);
#endif
ret = rtems_fdisk_seg_read_page (fd, src_sc, src_page,
fd->copy_buffer);
if (ret)
3f24: e2508000 subs r8, r0, #0
3f28: e59dc018 ldr ip, [sp, #24]
3f2c: 1a000023 bne 3fc0 <rtems_fdisk_recycle_segment+0x1b0>
3f30: ea00001b b 3fa4 <rtems_fdisk_recycle_segment+0x194>
rtems_fdisk_seg_next_available_page (rtems_fdisk_segment_ctl* sc)
{
rtems_fdisk_page_desc* pd = &sc->page_descriptors[0];
uint32_t page;
for (page = 0; page < sc->pages; page++, pd++)
3f34: e2877001 add r7, r7, #1
3f38: e2888008 add r8, r8, #8
3f3c: e5963014 ldr r3, [r6, #20]
3f40: e1570003 cmp r7, r3
3f44: 3affffd0 bcc 3e8c <rtems_fdisk_recycle_segment+0x7c>
active++;
if (dpage >= dsc->pages)
{
rtems_fdisk_error ("recycle: %02d-%03d: " \
3f48: e1a00006 mov r0, r6 <== NOT EXECUTED
3f4c: ebfffde7 bl 36f0 <rtems_fdisk_seg_pages_available> <== NOT EXECUTED
3f50: e2861008 add r1, r6, #8 <== NOT EXECUTED
3f54: e1a03000 mov r3, r0 <== NOT EXECUTED
3f58: e8910006 ldm r1, {r1, r2} <== NOT EXECUTED
3f5c: e59f024c ldr r0, [pc, #588] ; 41b0 <rtems_fdisk_recycle_segment+0x3a0><== NOT EXECUTED
3f60: ebfffee5 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
"no page desc available: %d",
dsc->device, dsc->segment,
rtems_fdisk_seg_pages_available (dsc));
dsc->failed = true;
3f64: e3a03001 mov r3, #1 <== NOT EXECUTED
3f68: e5863028 str r3, [r6, #40] ; 0x28 <== NOT EXECUTED
rtems_fdisk_queue_segment (fd, dsc);
3f6c: e1a00004 mov r0, r4 <== NOT EXECUTED
3f70: e1a01006 mov r1, r6 <== NOT EXECUTED
3f74: ebffff3b bl 3c68 <rtems_fdisk_queue_segment> <== NOT EXECUTED
rtems_fdisk_segment_queue_push_head (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
if (sc)
{
sc->next = queue->head;
3f78: e5943040 ldr r3, [r4, #64] ; 0x40 <== NOT EXECUTED
3f7c: e5853000 str r3, [r5] <== NOT EXECUTED
queue->head = sc;
if (queue->tail == 0)
3f80: e5943044 ldr r3, [r4, #68] ; 0x44 <== NOT EXECUTED
3f84: e3530000 cmp r3, #0 <== NOT EXECUTED
queue->tail = sc;
queue->count++;
3f88: e5943048 ldr r3, [r4, #72] ; 0x48 <== NOT EXECUTED
3f8c: e2833001 add r3, r3, #1 <== NOT EXECUTED
rtems_fdisk_segment_ctl* sc)
{
if (sc)
{
sc->next = queue->head;
queue->head = sc;
3f90: e5845040 str r5, [r4, #64] ; 0x40 <== NOT EXECUTED
if (queue->tail == 0)
queue->tail = sc;
3f94: 05845044 streq r5, [r4, #68] ; 0x44 <== NOT EXECUTED
queue->count++;
3f98: e5843048 str r3, [r4, #72] ; 0x48 <== NOT EXECUTED
dsc->device, dsc->segment,
rtems_fdisk_seg_pages_available (dsc));
dsc->failed = true;
rtems_fdisk_queue_segment (fd, dsc);
rtems_fdisk_segment_queue_push_head (&fd->used, ssc);
return EIO;
3f9c: e3a08005 mov r8, #5 <== NOT EXECUTED
3fa0: ea00007c b 4198 <rtems_fdisk_recycle_segment+0x388> <== NOT EXECUTED
#endif
ret = rtems_fdisk_seg_read_page (fd, src_sc, src_page,
fd->copy_buffer);
if (ret)
return ret;
return rtems_fdisk_seg_write_page (fd, dst_sc, dst_page,
3fa4: e1a00004 mov r0, r4
3fa8: e1a01006 mov r1, r6
3fac: e1a0200c mov r2, ip
3fb0: e5943068 ldr r3, [r4, #104] ; 0x68
3fb4: ebfffe99 bl 3a20 <rtems_fdisk_seg_write_page>
#endif
ret = rtems_fdisk_seg_copy_page (fd, ssc,
spage + ssc->pages_desc,
dsc,
dpage + dsc->pages_desc);
if (ret)
3fb8: e2508000 subs r8, r0, #0
3fbc: 0a00000f beq 4000 <rtems_fdisk_recycle_segment+0x1f0>
{
rtems_fdisk_error ("recycle: %02d-%03d-%03d=>" \
3fc0: e2862008 add r2, r6, #8 <== NOT EXECUTED
3fc4: e892000c ldm r2, {r2, r3} <== NOT EXECUTED
3fc8: e1a00008 mov r0, r8 <== NOT EXECUTED
3fcc: e58d2018 str r2, [sp, #24] <== NOT EXECUTED
3fd0: e58d3014 str r3, [sp, #20] <== NOT EXECUTED
3fd4: e595b008 ldr fp, [r5, #8] <== NOT EXECUTED
3fd8: e595900c ldr r9, [r5, #12] <== NOT EXECUTED
3fdc: eb006f40 bl 1fce4 <strerror> <== NOT EXECUTED
3fe0: e59d2018 ldr r2, [sp, #24] <== NOT EXECUTED
3fe4: e59d3014 ldr r3, [sp, #20] <== NOT EXECUTED
3fe8: e58d000c str r0, [sp, #12] <== NOT EXECUTED
3fec: e58d2000 str r2, [sp] <== NOT EXECUTED
3ff0: e98d0088 stmib sp, {r3, r7} <== NOT EXECUTED
3ff4: e58d8010 str r8, [sp, #16] <== NOT EXECUTED
3ff8: e59f01b4 ldr r0, [pc, #436] ; 41b4 <rtems_fdisk_recycle_segment+0x3a4><== NOT EXECUTED
3ffc: ea000017 b 4060 <rtems_fdisk_recycle_segment+0x250> <== NOT EXECUTED
uint32_t dst_pages;
rtems_fdisk_page_desc* dpd;
uint32_t dpage;
dpage = rtems_fdisk_seg_next_available_page (dsc);
dpd = &dsc->page_descriptors[dpage];
4000: e59d2024 ldr r2, [sp, #36] ; 0x24
rtems_fdisk_queue_segment (fd, dsc);
rtems_fdisk_segment_queue_push_head (&fd->used, ssc);
return ret;
}
*dpd = *spd;
4004: e8990003 ldm r9, {r0, r1}
uint32_t dst_pages;
rtems_fdisk_page_desc* dpd;
uint32_t dpage;
dpage = rtems_fdisk_seg_next_available_page (dsc);
dpd = &dsc->page_descriptors[dpage];
4008: e0823187 add r3, r2, r7, lsl #3
rtems_fdisk_queue_segment (fd, dsc);
rtems_fdisk_segment_queue_push_head (&fd->used, ssc);
return ret;
}
*dpd = *spd;
400c: e8830003 stm r3, {r0, r1}
ret = rtems_fdisk_seg_write_page_desc (fd,
4010: e1a02007 mov r2, r7
4014: e1a00004 mov r0, r4
4018: e1a01006 mov r1, r6
401c: ebfffe6a bl 39cc <rtems_fdisk_seg_write_page_desc>
dsc,
dpage, dpd);
if (ret)
4020: e2508000 subs r8, r0, #0
4024: 0a00001e beq 40a4 <rtems_fdisk_recycle_segment+0x294>
{
rtems_fdisk_error ("recycle: %02d-%03d-%03d=>" \
4028: e2862008 add r2, r6, #8 <== NOT EXECUTED
402c: e892000c ldm r2, {r2, r3} <== NOT EXECUTED
4030: e595b008 ldr fp, [r5, #8] <== NOT EXECUTED
4034: e58d2018 str r2, [sp, #24] <== NOT EXECUTED
4038: e58d3014 str r3, [sp, #20] <== NOT EXECUTED
403c: e595900c ldr r9, [r5, #12] <== NOT EXECUTED
4040: eb006f27 bl 1fce4 <strerror> <== NOT EXECUTED
4044: e59d3014 ldr r3, [sp, #20] <== NOT EXECUTED
4048: e59d2018 ldr r2, [sp, #24] <== NOT EXECUTED
404c: e98d0088 stmib sp, {r3, r7} <== NOT EXECUTED
4050: e58d000c str r0, [sp, #12] <== NOT EXECUTED
4054: e58d2000 str r2, [sp] <== NOT EXECUTED
4058: e58d8010 str r8, [sp, #16] <== NOT EXECUTED
405c: e59f0154 ldr r0, [pc, #340] ; 41b8 <rtems_fdisk_recycle_segment+0x3a8><== NOT EXECUTED
4060: e1a0300a mov r3, sl <== NOT EXECUTED
4064: e1a0100b mov r1, fp <== NOT EXECUTED
4068: e1a02009 mov r2, r9 <== NOT EXECUTED
406c: ebfffea2 bl 3afc <rtems_fdisk_error> <== NOT EXECUTED
"%02d-%03d-%03d: copy pd failed: %s (%d)",
ssc->device, ssc->segment, spage,
dsc->device, dsc->segment, dpage,
strerror (ret), ret);
rtems_fdisk_queue_segment (fd, dsc);
4070: e1a00004 mov r0, r4 <== NOT EXECUTED
4074: e1a01006 mov r1, r6 <== NOT EXECUTED
4078: ebfffefa bl 3c68 <rtems_fdisk_queue_segment> <== NOT EXECUTED
rtems_fdisk_segment_queue_push_head (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* sc)
{
if (sc)
{
sc->next = queue->head;
407c: e5943040 ldr r3, [r4, #64] ; 0x40 <== NOT EXECUTED
4080: e5853000 str r3, [r5] <== NOT EXECUTED
queue->head = sc;
if (queue->tail == 0)
4084: e5943044 ldr r3, [r4, #68] ; 0x44 <== NOT EXECUTED
4088: e3530000 cmp r3, #0 <== NOT EXECUTED
queue->tail = sc;
queue->count++;
408c: e5943048 ldr r3, [r4, #72] ; 0x48 <== NOT EXECUTED
4090: e2833001 add r3, r3, #1 <== NOT EXECUTED
rtems_fdisk_segment_ctl* sc)
{
if (sc)
{
sc->next = queue->head;
queue->head = sc;
4094: e5845040 str r5, [r4, #64] ; 0x40 <== NOT EXECUTED
if (queue->tail == 0)
queue->tail = sc;
4098: 05845044 streq r5, [r4, #68] ; 0x44 <== NOT EXECUTED
queue->count++;
409c: e5843048 str r3, [r4, #72] ; 0x48 <== NOT EXECUTED
40a0: ea00003c b 4198 <rtems_fdisk_recycle_segment+0x388> <== NOT EXECUTED
rtems_fdisk_queue_segment (fd, dsc);
rtems_fdisk_segment_queue_push_head (&fd->used, ssc);
return ret;
}
dsc->pages_active++;
40a4: e596301c ldr r3, [r6, #28]
40a8: e2833001 add r3, r3, #1
40ac: e586301c str r3, [r6, #28]
* segment will be erased. Power down could be a problem.
* We do the stats to make sure everything is as it should
* be.
*/
ssc->pages_active--;
40b0: e595301c ldr r3, [r5, #28]
40b4: e2433001 sub r3, r3, #1
40b8: e585301c str r3, [r5, #28]
ssc->pages_used++;
40bc: e5953020 ldr r3, [r5, #32]
40c0: e2833001 add r3, r3, #1
fd->blocks[spd->block].segment = dsc;
40c4: e5992004 ldr r2, [r9, #4]
* We do the stats to make sure everything is as it should
* be.
*/
ssc->pages_active--;
ssc->pages_used++;
40c8: e5853020 str r3, [r5, #32]
fd->blocks[spd->block].segment = dsc;
40cc: e5943018 ldr r3, [r4, #24]
40d0: e0831182 add r1, r3, r2, lsl #3
40d4: e7836182 str r6, [r3, r2, lsl #3]
fd->blocks[spd->block].page = dpage;
40d8: e5817004 str r7, [r1, #4]
/*
* Place the segment on to the correct queue.
*/
rtems_fdisk_queue_segment (fd, dsc);
40dc: e1a00004 mov r0, r4
40e0: e1a01006 mov r1, r6
40e4: ebfffedf bl 3c68 <rtems_fdisk_queue_segment>
/*
* Get new destination segment if necessary.
*/
dst_pages = rtems_fdisk_seg_pages_available (dsc);
40e8: e1a00006 mov r0, r6
40ec: ebfffd7f bl 36f0 <rtems_fdisk_seg_pages_available>
if (dst_pages == 0)
40f0: e3500000 cmp r0, #0
40f4: 1a000002 bne 4104 <rtems_fdisk_recycle_segment+0x2f4>
dsc = rtems_fdisk_seg_most_available (&fd->available);
40f8: e59d0028 ldr r0, [sp, #40] ; 0x28
40fc: ebfffd83 bl 3710 <rtems_fdisk_seg_most_available>
4100: e1a06000 mov r6, r0
(*pages)--;
4104: e59d2020 ldr r2, [sp, #32]
4108: e5923000 ldr r3, [r2]
410c: e2433001 sub r3, r3, #1
uint32_t dpage;
dpage = rtems_fdisk_seg_next_available_page (dsc);
dpd = &dsc->page_descriptors[dpage];
active++;
4110: e28bb001 add fp, fp, #1
*/
dst_pages = rtems_fdisk_seg_pages_available (dsc);
if (dst_pages == 0)
dsc = rtems_fdisk_seg_most_available (&fd->available);
(*pages)--;
4114: e5823000 str r3, [r2]
return EIO;
}
if (rtems_fdisk_page_desc_flags_set (spd, RTEMS_FDISK_PAGE_ACTIVE) &&
!rtems_fdisk_page_desc_flags_set (spd, RTEMS_FDISK_PAGE_USED))
{
4118: ea000008 b 4140 <rtems_fdisk_recycle_segment+0x330>
if (dst_pages == 0)
dsc = rtems_fdisk_seg_most_available (&fd->available);
(*pages)--;
}
else if (rtems_fdisk_page_desc_erased (spd))
411c: e1a00009 mov r0, r9
4120: ebfffd68 bl 36c8 <rtems_fdisk_page_desc_erased>
4124: e3500000 cmp r0, #0
{
--fd->erased_blocks;
4128: 15943028 ldrne r3, [r4, #40] ; 0x28
}
else
{
used++;
412c: 059d301c ldreq r3, [sp, #28]
(*pages)--;
}
else if (rtems_fdisk_page_desc_erased (spd))
{
--fd->erased_blocks;
4130: 12433001 subne r3, r3, #1
}
else
{
used++;
4134: 02833001 addeq r3, r3, #1
(*pages)--;
}
else if (rtems_fdisk_page_desc_erased (spd))
{
--fd->erased_blocks;
4138: 15843028 strne r3, [r4, #40] ; 0x28
}
else
{
used++;
413c: 058d301c streq r3, [sp, #28]
int ret;
uint32_t spage;
uint32_t used = 0;
uint32_t active = 0;
for (spage = 0; spage < ssc->pages; spage++)
4140: e28aa001 add sl, sl, #1
4144: e5953014 ldr r3, [r5, #20]
4148: e15a0003 cmp sl, r3
414c: 3affff3b bcc 3e40 <rtems_fdisk_recycle_segment+0x30>
used++;
}
}
#if RTEMS_FDISK_TRACE
rtems_fdisk_printf (fd, "ssc end: %d-%d: p=%ld, a=%ld, u=%ld",
4150: e59d2020 ldr r2, [sp, #32]
4154: e59d301c ldr r3, [sp, #28]
4158: e88d0804 stm sp, {r2, fp}
415c: e58d3008 str r3, [sp, #8]
4160: e2852008 add r2, r5, #8
4164: e59f1050 ldr r1, [pc, #80] ; 41bc <rtems_fdisk_recycle_segment+0x3ac>
4168: e1a00004 mov r0, r4
416c: e892000c ldm r2, {r2, r3}
4170: ebfffd96 bl 37d0 <rtems_fdisk_printf>
ssc->device, ssc->segment,
pages, active, used);
#endif
if (ssc->pages_active != 0)
4174: e595101c ldr r1, [r5, #28]
4178: e3510000 cmp r1, #0
{
rtems_fdisk_error ("compacting: ssc pages not 0: %d",
417c: 159f003c ldrne r0, [pc, #60] ; 41c0 <rtems_fdisk_recycle_segment+0x3b0>
4180: 1bfffe5d blne 3afc <rtems_fdisk_error>
ssc->pages_active);
}
ret = rtems_fdisk_erase_segment (fd, ssc);
4184: e1a00004 mov r0, r4
4188: e1a01005 mov r1, r5
return ret;
}
418c: e28dd02c add sp, sp, #44 ; 0x2c
4190: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr}
{
rtems_fdisk_error ("compacting: ssc pages not 0: %d",
ssc->pages_active);
}
ret = rtems_fdisk_erase_segment (fd, ssc);
4194: eafffe74 b 3b6c <rtems_fdisk_erase_segment>
return ret;
}
4198: e1a00008 mov r0, r8 <== NOT EXECUTED
419c: e28dd02c add sp, sp, #44 ; 0x2c <== NOT EXECUTED
41a0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
000035c0 <rtems_fdisk_segment_queue_insert_before>:
static void
rtems_fdisk_segment_queue_insert_before (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* item,
rtems_fdisk_segment_ctl* sc)
{
if (item)
35c0: e3510000 cmp r1, #0
{
rtems_fdisk_segment_ctl** prev = &queue->head;
35c4: 11a0c000 movne ip, r0
rtems_fdisk_segment_ctl* it = queue->head;
35c8: 15903000 ldrne r3, [r0]
static void
rtems_fdisk_segment_queue_insert_before (rtems_fdisk_segment_ctl_queue* queue,
rtems_fdisk_segment_ctl* item,
rtems_fdisk_segment_ctl* sc)
{
if (item)
35cc: 1a00000a bne 35fc <rtems_fdisk_segment_queue_insert_before+0x3c>
35d0: ea00000b b 3604 <rtems_fdisk_segment_queue_insert_before+0x44><== NOT EXECUTED
rtems_fdisk_segment_ctl** prev = &queue->head;
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
{
if (item == it)
35d4: e1510003 cmp r1, r3
35d8: 1a000005 bne 35f4 <rtems_fdisk_segment_queue_insert_before+0x34>
{
sc->next = item;
*prev = sc;
queue->count++;
35dc: e5903008 ldr r3, [r0, #8]
35e0: e2833001 add r3, r3, #1
while (it)
{
if (item == it)
{
sc->next = item;
35e4: e5821000 str r1, [r2]
*prev = sc;
35e8: e58c2000 str r2, [ip]
queue->count++;
35ec: e5803008 str r3, [r0, #8]
it = it->next;
}
}
rtems_fdisk_segment_queue_push_tail (queue, sc);
}
35f0: e12fff1e bx lr
*prev = sc;
queue->count++;
return;
}
prev = &it->next;
35f4: e1a0c003 mov ip, r3
it = it->next;
35f8: e5933000 ldr r3, [r3]
if (item)
{
rtems_fdisk_segment_ctl** prev = &queue->head;
rtems_fdisk_segment_ctl* it = queue->head;
while (it)
35fc: e3530000 cmp r3, #0
3600: 1afffff3 bne 35d4 <rtems_fdisk_segment_queue_insert_before+0x14>
prev = &it->next;
it = it->next;
}
}
rtems_fdisk_segment_queue_push_tail (queue, sc);
3604: e1a01002 mov r1, r2 <== NOT EXECUTED
3608: eaffffc3 b 351c <rtems_fdisk_segment_queue_push_tail> <== NOT EXECUTED
00003a80 <rtems_fdisk_warning>:
* @param ... The arguments for the format text.
* @return int The number of bytes written to the output.
*/
static int
rtems_fdisk_warning (const rtems_flashdisk* fd, const char *format, ...)
{
3a80: e92d000e push {r1, r2, r3} <== NOT EXECUTED
3a84: e92d4031 push {r0, r4, r5, lr} <== NOT EXECUTED
int ret = 0;
if (fd->info_level >= 1)
3a88: e590506c ldr r5, [r0, #108] ; 0x6c <== NOT EXECUTED
3a8c: e3550000 cmp r5, #0 <== NOT EXECUTED
3a90: 0a000013 beq 3ae4 <rtems_fdisk_warning+0x64> <== NOT EXECUTED
{
va_list args;
va_start (args, format);
fprintf (stdout, "fdisk:warning:");
3a94: e59f4058 ldr r4, [pc, #88] ; 3af4 <rtems_fdisk_warning+0x74><== NOT EXECUTED
{
int ret = 0;
if (fd->info_level >= 1)
{
va_list args;
va_start (args, format);
3a98: e28d3014 add r3, sp, #20 <== NOT EXECUTED
3a9c: e58d3000 str r3, [sp] <== NOT EXECUTED
fprintf (stdout, "fdisk:warning:");
3aa0: e5943000 ldr r3, [r4] <== NOT EXECUTED
3aa4: e59f004c ldr r0, [pc, #76] ; 3af8 <rtems_fdisk_warning+0x78><== NOT EXECUTED
3aa8: e5931008 ldr r1, [r3, #8] <== NOT EXECUTED
3aac: eb006907 bl 1ded0 <fputs> <== NOT EXECUTED
ret = vfprintf (stdout, format, args);
3ab0: e5943000 ldr r3, [r4] <== NOT EXECUTED
3ab4: e59d1010 ldr r1, [sp, #16] <== NOT EXECUTED
3ab8: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
3abc: e59d2000 ldr r2, [sp] <== NOT EXECUTED
3ac0: eb008bbe bl 269c0 <vfprintf> <== NOT EXECUTED
fprintf (stdout, "\n");
3ac4: e5943000 ldr r3, [r4] <== NOT EXECUTED
if (fd->info_level >= 1)
{
va_list args;
va_start (args, format);
fprintf (stdout, "fdisk:warning:");
ret = vfprintf (stdout, format, args);
3ac8: e1a05000 mov r5, r0 <== NOT EXECUTED
fprintf (stdout, "\n");
3acc: e5931008 ldr r1, [r3, #8] <== NOT EXECUTED
3ad0: e3a0000a mov r0, #10 <== NOT EXECUTED
3ad4: eb0068c8 bl 1ddfc <fputc> <== NOT EXECUTED
fflush (stdout);
3ad8: e5943000 ldr r3, [r4] <== NOT EXECUTED
3adc: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
3ae0: eb0067b8 bl 1d9c8 <fflush> <== NOT EXECUTED
va_end (args);
}
return ret;
}
3ae4: e1a00005 mov r0, r5 <== NOT EXECUTED
3ae8: e8bd4038 pop {r3, r4, r5, lr} <== NOT EXECUTED
3aec: e28dd00c add sp, sp, #12 <== NOT EXECUTED
3af0: e12fff1e bx lr <== NOT EXECUTED
000036c0 <rtems_filesystem_eval_path_recursive>:
void rtems_filesystem_eval_path_recursive(
rtems_filesystem_eval_path_context_t *ctx,
const char *path,
size_t pathlen
)
{
36c0: e92d41f0 push {r4, r5, r6, r7, r8, lr}
if (pathlen > 0) {
36c4: e2528000 subs r8, r2, #0
void rtems_filesystem_eval_path_recursive(
rtems_filesystem_eval_path_context_t *ctx,
const char *path,
size_t pathlen
)
{
36c8: e1a04000 mov r4, r0
36cc: e1a05001 mov r5, r1
if (pathlen > 0) {
36d0: 0a00001e beq 3750 <rtems_filesystem_eval_path_recursive+0x90>
if (ctx->recursionlevel < RTEMS_FILESYSTEM_SYMLOOP_MAX) {
36d4: e5903014 ldr r3, [r0, #20]
36d8: e353001f cmp r3, #31
36dc: ca000019 bgt 3748 <rtems_filesystem_eval_path_recursive+0x88>
const char *saved_path = ctx->path;
size_t saved_pathlen = ctx->pathlen;
if (rtems_filesystem_is_delimiter(path [0])) {
36e0: e5d13000 ldrb r3, [r1]
36e4: e353002f cmp r3, #47 ; 0x2f
36e8: 1353005c cmpne r3, #92 ; 0x5c
size_t pathlen
)
{
if (pathlen > 0) {
if (ctx->recursionlevel < RTEMS_FILESYSTEM_SYMLOOP_MAX) {
const char *saved_path = ctx->path;
36ec: e5907000 ldr r7, [r0]
size_t saved_pathlen = ctx->pathlen;
36f0: e5906004 ldr r6, [r0, #4]
if (rtems_filesystem_is_delimiter(path [0])) {
rtems_filesystem_eval_path_restart(ctx, &ctx->rootloc);
36f4: 02801030 addeq r1, r0, #48 ; 0x30
36f8: 0bffffd6 bleq 3658 <rtems_filesystem_eval_path_restart>
}
ctx->path = path;
ctx->pathlen = pathlen;
++ctx->recursionlevel;
36fc: e5943014 ldr r3, [r4, #20]
3700: e2833001 add r3, r3, #1
if (rtems_filesystem_is_delimiter(path [0])) {
rtems_filesystem_eval_path_restart(ctx, &ctx->rootloc);
}
ctx->path = path;
ctx->pathlen = pathlen;
3704: e8840120 stm r4, {r5, r8}
++ctx->recursionlevel;
3708: e5843014 str r3, [r4, #20]
while (ctx->pathlen > 0) {
370c: ea000004 b 3724 <rtems_filesystem_eval_path_recursive+0x64>
(*ctx->currentloc.mt_entry->ops->eval_path_h)(ctx);
3710: e594302c ldr r3, [r4, #44] ; 0x2c
3714: e1a00004 mov r0, r4
3718: e593300c ldr r3, [r3, #12]
371c: e1a0e00f mov lr, pc
3720: e593f008 ldr pc, [r3, #8]
ctx->path = path;
ctx->pathlen = pathlen;
++ctx->recursionlevel;
while (ctx->pathlen > 0) {
3724: e5943004 ldr r3, [r4, #4]
3728: e3530000 cmp r3, #0
372c: 1afffff7 bne 3710 <rtems_filesystem_eval_path_recursive+0x50>
(*ctx->currentloc.mt_entry->ops->eval_path_h)(ctx);
}
--ctx->recursionlevel;
3730: e5943014 ldr r3, [r4, #20]
3734: e2433001 sub r3, r3, #1
3738: e5843014 str r3, [r4, #20]
ctx->path = saved_path;
373c: e5847000 str r7, [r4]
ctx->pathlen = saved_pathlen;
3740: e5846004 str r6, [r4, #4]
rtems_filesystem_eval_path_error(ctx, ELOOP);
}
} else {
rtems_filesystem_eval_path_error(ctx, ENOENT);
}
}
3744: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
--ctx->recursionlevel;
ctx->path = saved_path;
ctx->pathlen = saved_pathlen;
} else {
rtems_filesystem_eval_path_error(ctx, ELOOP);
3748: e3a0105c mov r1, #92 ; 0x5c
374c: ea000000 b 3754 <rtems_filesystem_eval_path_recursive+0x94>
}
} else {
rtems_filesystem_eval_path_error(ctx, ENOENT);
3750: e3a01002 mov r1, #2 <== NOT EXECUTED
}
}
3754: e8bd41f0 pop {r4, r5, r6, r7, r8, lr}
ctx->pathlen = saved_pathlen;
} else {
rtems_filesystem_eval_path_error(ctx, ELOOP);
}
} else {
rtems_filesystem_eval_path_error(ctx, ENOENT);
3758: eafffeec b 3310 <rtems_filesystem_eval_path_error>
00002078 <rtems_filesystem_initialize>:
/*
* Default mode for created files.
*/
void rtems_filesystem_initialize( void )
{
2078: e92d4001 push {r0, lr}
int rv = 0;
const rtems_filesystem_mount_configuration *root_config =
&rtems_filesystem_root_configuration;
rv = mount(
207c: e59f3038 ldr r3, [pc, #56] ; 20bc <rtems_filesystem_initialize+0x44>
2080: e5932010 ldr r2, [r3, #16]
2084: e58d2000 str r2, [sp]
2088: e893000f ldm r3, {r0, r1, r2, r3}
208c: eb0001e4 bl 2824 <mount>
root_config->target,
root_config->filesystemtype,
root_config->options,
root_config->data
);
if ( rv != 0 )
2090: e3500000 cmp r0, #0
rtems_fatal_error_occurred( 0xABCD0002 );
2094: 159f0024 ldrne r0, [pc, #36] ; 20c0 <rtems_filesystem_initialize+0x48>
root_config->target,
root_config->filesystemtype,
root_config->options,
root_config->data
);
if ( rv != 0 )
2098: 1a000005 bne 20b4 <rtems_filesystem_initialize+0x3c>
*
* NOTE: UNIX root is 755 and owned by root/root (0/0). It is actually
* created that way by the IMFS.
*/
rv = mkdir( "/dev", 0777);
209c: e59f0020 ldr r0, [pc, #32] ; 20c4 <rtems_filesystem_initialize+0x4c>
20a0: e59f1020 ldr r1, [pc, #32] ; 20c8 <rtems_filesystem_initialize+0x50>
20a4: eb00019d bl 2720 <mkdir>
if ( rv != 0 )
20a8: e3500000 cmp r0, #0
20ac: 0a000001 beq 20b8 <rtems_filesystem_initialize+0x40>
rtems_fatal_error_occurred( 0xABCD0003 );
20b0: e59f0014 ldr r0, [pc, #20] ; 20cc <rtems_filesystem_initialize+0x54><== NOT EXECUTED
20b4: eb001185 bl 66d0 <rtems_fatal_error_occurred> <== NOT EXECUTED
* 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.
*/
}
20b8: e8bd8008 pop {r3, pc}
000038b8 <rtems_filesystem_location_remove_from_mt_entry>:
}
void rtems_filesystem_location_remove_from_mt_entry(
rtems_filesystem_location_info_t *loc
)
{
38b8: e92d4030 push {r4, r5, lr}
38bc: e1a04000 mov r4, r0
rtems_filesystem_mt_entry_declare_lock_context(lock_context);
bool do_unmount;
rtems_filesystem_mt_entry_lock(lock_context);
38c0: ebffffa5 bl 375c <arm_interrupt_disable>
38c4: e1a05000 mov r5, r0
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
38c8: e894000c ldm r4, {r2, r3}
rtems_chain_extract_unprotected(&loc->mt_entry_node);
do_unmount = rtems_filesystem_is_ready_for_unmount(loc->mt_entry);
38cc: e5940014 ldr r0, [r4, #20]
next->previous = previous;
38d0: e5823004 str r3, [r2, #4]
previous->next = next;
38d4: e5832000 str r2, [r3]
38d8: ebffffa3 bl 376c <rtems_filesystem_is_ready_for_unmount>
38dc: e129f005 msr CPSR_fc, r5
rtems_filesystem_mt_entry_unlock(lock_context);
if (do_unmount) {
38e0: e3500000 cmp r0, #0
38e4: 08bd8030 popeq {r4, r5, pc}
rtems_filesystem_do_unmount(loc->mt_entry);
38e8: e5940014 ldr r0, [r4, #20] <== NOT EXECUTED
}
}
38ec: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
rtems_chain_extract_unprotected(&loc->mt_entry_node);
do_unmount = rtems_filesystem_is_ready_for_unmount(loc->mt_entry);
rtems_filesystem_mt_entry_unlock(lock_context);
if (do_unmount) {
rtems_filesystem_do_unmount(loc->mt_entry);
38f0: eaffffd1 b 383c <rtems_filesystem_do_unmount> <== NOT EXECUTED
00003ab8 <rtems_filesystem_location_transform_to_global>:
}
rtems_filesystem_global_location_t *rtems_filesystem_location_transform_to_global(
rtems_filesystem_location_info_t *loc
)
{
3ab8: e92d4031 push {r0, r4, r5, lr}
3abc: e1a05000 mov r5, r0
rtems_filesystem_global_location_t *global_loc = malloc(sizeof(*global_loc));
3ac0: e3a00024 mov r0, #36 ; 0x24
3ac4: ebfffadc bl 263c <malloc>
if (global_loc != NULL) {
3ac8: e2504000 subs r4, r0, #0
3acc: 0a000009 beq 3af8 <rtems_filesystem_location_transform_to_global+0x40>
global_loc->reference_count = 1;
3ad0: e3a03001 mov r3, #1
3ad4: e5843018 str r3, [r4, #24]
global_loc->deferred_released_next = NULL;
3ad8: e3a03000 mov r3, #0
3adc: e584301c str r3, [r4, #28]
global_loc->deferred_released_count = 0;
3ae0: e5843020 str r3, [r4, #32]
rtems_filesystem_location_copy(&global_loc->location, loc);
3ae4: e1a01005 mov r1, r5
3ae8: ebffff36 bl 37c8 <rtems_filesystem_location_copy>
rtems_filesystem_location_remove_from_mt_entry(loc);
3aec: e1a00005 mov r0, r5
3af0: ebffff70 bl 38b8 <rtems_filesystem_location_remove_from_mt_entry>
3af4: ea000009 b 3b20 <rtems_filesystem_location_transform_to_global+0x68>
} else {
rtems_filesystem_location_free(loc);
3af8: e1a00005 mov r0, r5 <== NOT EXECUTED
3afc: eb0019e8 bl a2a4 <rtems_filesystem_location_free> <== NOT EXECUTED
);
static inline rtems_filesystem_global_location_t *
rtems_filesystem_global_location_obtain_null(void)
{
rtems_filesystem_global_location_t *global_loc = NULL;
3b00: e28d0004 add r0, sp, #4 <== NOT EXECUTED
3b04: e5204004 str r4, [r0, #-4]! <== NOT EXECUTED
return rtems_filesystem_global_location_obtain( &global_loc );
3b08: e1a0000d mov r0, sp <== NOT EXECUTED
3b0c: ebffffba bl 39fc <rtems_filesystem_global_location_obtain> <== NOT EXECUTED
3b10: e1a04000 mov r4, r0 <== NOT EXECUTED
global_loc = rtems_filesystem_global_location_obtain_null();
errno = ENOMEM;
3b14: eb002706 bl d734 <__errno> <== NOT EXECUTED
3b18: e3a0300c mov r3, #12 <== NOT EXECUTED
3b1c: e5803000 str r3, [r0] <== NOT EXECUTED
}
return global_loc;
}
3b20: e1a00004 mov r0, r4
3b24: e8bd8038 pop {r3, r4, r5, pc}
00002b84 <rtems_gxx_key_create>:
int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *))
{
2b84: e92d4070 push {r4, r5, r6, lr}
2b88: e1a06000 mov r6, r0
* 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 ) );
2b8c: e3a00008 mov r0, #8
}
return 0;
}
int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *))
{
2b90: e1a05001 mov r5, 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 ) );
2b94: eb0000e7 bl 2f38 <malloc>
2b98: e1a04000 mov r4, r0
*key = new_key;
2b9c: e5860000 str r0, [r6]
"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 );
2ba0: e1a01004 mov r1, r4
* deal with the value of the key, as used with the POSIX API.
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
*key = new_key;
new_key->val = NULL;
2ba4: e3a00000 mov r0, #0
"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 );
2ba8: e1a02005 mov r2, r5
*/
/* Do not pull your hair, trust me this works. :-) */
__gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) );
*key = new_key;
new_key->val = NULL;
new_key->dtor = dtor;
2bac: e8840021 stm r4, {r0, r5}
"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 );
2bb0: eb0010be bl 6eb0 <rtems_task_variable_add>
if ( status == RTEMS_SUCCESSFUL )
2bb4: e3500000 cmp r0, #0
2bb8: 08bd8070 popeq {r4, r5, r6, pc}
return 0;
free( new_key );
2bbc: e1a00004 mov r0, r4 <== NOT EXECUTED
2bc0: ebffff8c bl 29f8 <free> <== NOT EXECUTED
return -1;
2bc4: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
2bc8: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
000039b8 <rtems_ide_part_table_free>:
* RETURNS:
* N/A
*/
void
rtems_ide_part_table_free(rtems_disk_desc_t *disk_desc)
{
39b8: e92d4070 push {r4, r5, r6, lr} <== NOT EXECUTED
39bc: e1a06000 mov r6, r0 <== NOT EXECUTED
39c0: e1a05000 mov r5, r0 <== NOT EXECUTED
39c4: e3a04004 mov r4, #4 <== NOT EXECUTED
for (part_num = 0;
part_num < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
part_num++)
{
partition_free(disk_desc->partitions[part_num]);
39c8: e5950028 ldr r0, [r5, #40] ; 0x28 <== NOT EXECUTED
39cc: ebfffed9 bl 3538 <partition_free> <== NOT EXECUTED
static void
partition_table_free(rtems_disk_desc_t *disk_desc)
{
int part_num;
for (part_num = 0;
39d0: e2544001 subs r4, r4, #1 <== NOT EXECUTED
part_num < RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER;
part_num++)
{
partition_free(disk_desc->partitions[part_num]);
39d4: e2855004 add r5, r5, #4 <== NOT EXECUTED
static void
partition_table_free(rtems_disk_desc_t *disk_desc)
{
int part_num;
for (part_num = 0;
39d8: 1afffffa bne 39c8 <rtems_ide_part_table_free+0x10> <== NOT EXECUTED
part_num++)
{
partition_free(disk_desc->partitions[part_num]);
}
free(disk_desc);
39dc: e1a00006 mov r0, r6 <== NOT EXECUTED
*/
void
rtems_ide_part_table_free(rtems_disk_desc_t *disk_desc)
{
partition_table_free( disk_desc );
}
39e0: e8bd4070 pop {r4, r5, r6, lr} <== NOT EXECUTED
part_num++)
{
partition_free(disk_desc->partitions[part_num]);
}
free(disk_desc);
39e4: ea000292 b 4434 <free> <== NOT EXECUTED
000039e8 <rtems_ide_part_table_get>:
* RTEMS_INTERNAL_ERROR otherwise
*/
rtems_status_code
rtems_ide_part_table_get(const char *dev_name, rtems_disk_desc_t *disk_desc)
{
return partition_table_get( dev_name, disk_desc );
39e8: eaffff86 b 3808 <partition_table_get> <== NOT EXECUTED
000036b0 <rtems_libio_share_private_env>:
rtems_status_code rtems_libio_share_private_env(rtems_id task_id)
{
36b0: e92d4031 push {r0, r4, r5, lr}
36b4: e1a04000 mov r4, r0
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_id self_task_id = rtems_task_self();
36b8: eb00057a bl 4ca8 <rtems_task_self>
if (task_id != RTEMS_SELF && self_task_id != task_id) {
36bc: e1500004 cmp r0, r4
36c0: 13540000 cmpne r4, #0
36c4: 03a05000 moveq r5, #0
36c8: 13a05001 movne r5, #1
36cc: 0a00001f beq 3750 <rtems_libio_share_private_env+0xa0>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
36d0: e59f3080 ldr r3, [pc, #128] ; 3758 <rtems_libio_share_private_env+0xa8>
36d4: e5932000 ldr r2, [r3]
++level;
36d8: e2822001 add r2, r2, #1
_Thread_Dispatch_disable_level = level;
36dc: e5832000 str r2, [r3]
/*
* We have to disable the thread dispatching to prevent deletion of the
* environment in the meantime.
*/
_Thread_Disable_dispatch();
sc = rtems_task_variable_get(
36e0: e59f1074 ldr r1, [pc, #116] ; 375c <rtems_libio_share_private_env+0xac>
36e4: e1a0200d mov r2, sp
36e8: e1a00004 mov r0, r4
36ec: eb0005d2 bl 4e3c <rtems_task_variable_get>
task_id,
(void *) &rtems_current_user_env,
(void *) &env
);
if (sc == RTEMS_SUCCESSFUL) {
36f0: e2505000 subs r5, r0, #0
++env->reference_count;
36f4: 059d3000 ldreq r3, [sp]
36f8: 05932028 ldreq r2, [r3, #40] ; 0x28
36fc: 02822001 addeq r2, r2, #1
3700: 05832028 streq r2, [r3, #40] ; 0x28
} else {
sc = RTEMS_UNSATISFIED;
3704: 13a0500d movne r5, #13
}
_Thread_Enable_dispatch();
3708: eb000d2f bl 6bcc <_Thread_Enable_dispatch>
if (sc == RTEMS_SUCCESSFUL) {
370c: e3550000 cmp r5, #0
3710: 1a00000e bne 3750 <rtems_libio_share_private_env+0xa0>
sc = rtems_task_variable_add(
3714: e59f4040 ldr r4, [pc, #64] ; 375c <rtems_libio_share_private_env+0xac>
3718: e1a00005 mov r0, r5
371c: e1a01004 mov r1, r4
3720: e59f2038 ldr r2, [pc, #56] ; 3760 <rtems_libio_share_private_env+0xb0>
3724: eb00057c bl 4d1c <rtems_task_variable_add>
RTEMS_SELF,
(void **) &rtems_current_user_env,
free_user_env
);
if (sc == RTEMS_SUCCESSFUL) {
3728: e2505000 subs r5, r0, #0
372c: 1a000004 bne 3744 <rtems_libio_share_private_env+0x94>
free_user_env_protected(rtems_current_user_env);
3730: e5940000 ldr r0, [r4]
3734: ebffff94 bl 358c <free_user_env_protected>
rtems_current_user_env = env;
3738: e59d3000 ldr r3, [sp]
373c: e5843000 str r3, [r4]
3740: ea000002 b 3750 <rtems_libio_share_private_env+0xa0>
} else {
free_user_env_protected(env);
3744: e59d0000 ldr r0, [sp] <== NOT EXECUTED
3748: ebffff8f bl 358c <free_user_env_protected> <== NOT EXECUTED
sc = RTEMS_TOO_MANY;
374c: e3a05005 mov r5, #5 <== NOT EXECUTED
}
}
}
return sc;
}
3750: e1a00005 mov r0, r5
3754: e8bd8038 pop {r3, r4, r5, pc}
00003764 <rtems_libio_use_global_env>:
void rtems_libio_use_global_env(void)
{
3764: e92d4030 push {r4, r5, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_user_env_t *env = rtems_current_user_env;
bool uses_private_env = env != &rtems_global_user_env;
if (uses_private_env) {
3768: e59f402c ldr r4, [pc, #44] ; 379c <rtems_libio_use_global_env+0x38>
376c: e59f502c ldr r5, [pc, #44] ; 37a0 <rtems_libio_use_global_env+0x3c>
3770: e5943000 ldr r3, [r4]
3774: e1530005 cmp r3, r5
3778: 08bd8030 popeq {r4, r5, pc}
sc = rtems_task_variable_delete(
377c: e3a00000 mov r0, #0
3780: e1a01004 mov r1, r4
3784: eb00058e bl 4dc4 <rtems_task_variable_delete>
RTEMS_SELF,
(void **) &rtems_current_user_env
);
if (sc != RTEMS_SUCCESSFUL) {
3788: e3500000 cmp r0, #0
rtems_fatal_error_occurred(0xdeadbeef);
}
rtems_current_user_env = &rtems_global_user_env;
378c: 05845000 streq r5, [r4]
if (uses_private_env) {
sc = rtems_task_variable_delete(
RTEMS_SELF,
(void **) &rtems_current_user_env
);
if (sc != RTEMS_SUCCESSFUL) {
3790: 08bd8030 popeq {r4, r5, pc}
rtems_fatal_error_occurred(0xdeadbeef);
3794: e59f0008 ldr r0, [pc, #8] ; 37a4 <rtems_libio_use_global_env+0x40><== NOT EXECUTED
3798: eb000628 bl 5040 <rtems_fatal_error_occurred> <== NOT EXECUTED
000070b0 <rtems_rbheap_allocate>:
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
70b0: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
void *ptr = NULL;
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
70b4: e5906030 ldr r6, [r0, #48] ; 0x30
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
70b8: e1a05001 mov r5, r1
70bc: e1a04000 mov r4, r0
#include <stdlib.h>
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
70c0: e1a00001 mov r0, r1
70c4: e1a01006 mov r1, r6
70c8: eb00424f bl 17a0c <__umodsi3>
if (excess > 0) {
70cc: e3500000 cmp r0, #0
value += alignment - excess;
70d0: 10856006 addne r6, r5, r6
70d4: 10606006 rsbne r6, r0, r6
static uintptr_t align_up(uintptr_t alignment, uintptr_t value)
{
uintptr_t excess = value % alignment;
if (excess > 0) {
70d8: 01a06005 moveq r6, r5
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
70dc: e1550006 cmp r5, r6
70e0: 83a00000 movhi r0, #0
70e4: 93a00001 movls r0, #1
70e8: e3550000 cmp r5, #0
70ec: 03a00000 moveq r0, #0
70f0: e3500000 cmp r0, #0
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_First(
Chain_Control *the_chain
)
{
return _Chain_Head( the_chain )->next;
70f4: 11a02004 movne r2, r4
70f8: 14923004 ldrne r3, [r2], #4
size_t size
)
{
rtems_chain_node *current = rtems_chain_first(free_chain);
const rtems_chain_node *tail = rtems_chain_tail(free_chain);
rtems_rbheap_chunk *big_enough = NULL;
70fc: 13a07000 movne r7, #0
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
uintptr_t alignment = control->alignment;
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
7100: 1a000005 bne 711c <rtems_rbheap_allocate+0x6c>
7104: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
rtems_rbheap_chunk *big_enough = NULL;
while (current != tail && big_enough == NULL) {
rtems_rbheap_chunk *free_chunk = (rtems_rbheap_chunk *) current;
if (free_chunk->size >= size) {
7108: e593701c ldr r7, [r3, #28]
710c: e1570006 cmp r7, r6
7110: 21a07003 movcs r7, r3
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Next(
Chain_Node *the_node
)
{
return the_node->next;
7114: e5933000 ldr r3, [r3]
7118: 33a07000 movcc r7, #0
{
rtems_chain_node *current = rtems_chain_first(free_chain);
const rtems_chain_node *tail = rtems_chain_tail(free_chain);
rtems_rbheap_chunk *big_enough = NULL;
while (current != tail && big_enough == NULL) {
711c: e2778001 rsbs r8, r7, #1
7120: 33a08000 movcc r8, #0
7124: e1530002 cmp r3, r2
7128: 03a08000 moveq r8, #0
712c: e3580000 cmp r8, #0
7130: 1afffff4 bne 7108 <rtems_rbheap_allocate+0x58>
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
rtems_rbheap_chunk *free_chunk = search_free_chunk(free_chain, aligned_size);
if (free_chunk != NULL) {
7134: e3570000 cmp r7, #0
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
void *ptr = NULL;
7138: 01a00007 moveq r0, r7
uintptr_t aligned_size = align_up(alignment, size);
if (size > 0 && size <= aligned_size) {
rtems_rbheap_chunk *free_chunk = search_free_chunk(free_chain, aligned_size);
if (free_chunk != NULL) {
713c: 08bd87f0 popeq {r4, r5, r6, r7, r8, r9, sl, pc}
uintptr_t free_size = free_chunk->size;
7140: e597901c ldr r9, [r7, #28]
if (free_size > aligned_size) {
7144: e1590006 cmp r9, r6
7148: 9a00001f bls 71cc <rtems_rbheap_allocate+0x11c>
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
714c: e1a0a004 mov sl, r4
7150: e5ba500c ldr r5, [sl, #12]!
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
7154: e2843010 add r3, r4, #16
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
7158: e1550003 cmp r5, r3
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
715c: 15953000 ldrne r3, [r5]
head->next = new_first;
7160: 1584300c strne r3, [r4, #12]
new_first->previous = head;
7164: 1583a004 strne sl, [r3, #4]
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
7168: 1a000009 bne 7194 <rtems_rbheap_allocate+0xe4>
{
rtems_chain_control *chain = &control->spare_descriptor_chain;
rtems_chain_node *chunk = rtems_chain_get_unprotected(chain);
if (chunk == NULL) {
(*control->extend_descriptors)(control);
716c: e1a00004 mov r0, r4 <== NOT EXECUTED
7170: e1a0e00f mov lr, pc <== NOT EXECUTED
7174: e594f034 ldr pc, [r4, #52] ; 0x34 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_first(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_head( the_chain )->next;
7178: e594300c ldr r3, [r4, #12] <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
717c: e1530005 cmp r3, r5 <== NOT EXECUTED
7180: 0a000018 beq 71e8 <rtems_rbheap_allocate+0x138> <== NOT EXECUTED
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
7184: e5932000 ldr r2, [r3] <== NOT EXECUTED
head->next = new_first;
7188: e584200c str r2, [r4, #12] <== NOT EXECUTED
new_first->previous = head;
718c: e582a004 str sl, [r2, #4] <== NOT EXECUTED
7190: e1a05003 mov r5, r3 <== NOT EXECUTED
if (new_chunk != NULL) {
uintptr_t new_free_size = free_size - aligned_size;
free_chunk->size = new_free_size;
new_chunk->begin = free_chunk->begin + new_free_size;
7194: e5973018 ldr r3, [r7, #24]
if (free_size > aligned_size) {
rtems_rbheap_chunk *new_chunk = get_chunk(control);
if (new_chunk != NULL) {
uintptr_t new_free_size = free_size - aligned_size;
7198: e0669009 rsb r9, r6, r9
free_chunk->size = new_free_size;
719c: e587901c str r9, [r7, #28]
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
71a0: e1a01005 mov r1, r5
new_chunk->begin = free_chunk->begin + new_free_size;
71a4: e0899003 add r9, r9, r3
71a8: e3a03000 mov r3, #0
71ac: e5859018 str r9, [r5, #24]
new_chunk->size = aligned_size;
71b0: e585601c str r6, [r5, #28]
71b4: e5853004 str r3, [r5, #4]
71b8: e4813008 str r3, [r1], #8
static void insert_into_tree(
rtems_rbtree_control *tree,
rtems_rbheap_chunk *chunk
)
{
_RBTree_Insert_unprotected(tree, &chunk->tree_node);
71bc: e2840018 add r0, r4, #24
71c0: eb000650 bl 8b08 <_RBTree_Insert_unprotected>
free_chunk->size = new_free_size;
new_chunk->begin = free_chunk->begin + new_free_size;
new_chunk->size = aligned_size;
rtems_chain_set_off_chain(&new_chunk->chain_node);
insert_into_tree(chunk_tree, new_chunk);
ptr = (void *) new_chunk->begin;
71c4: e5950018 ldr r0, [r5, #24]
71c8: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
71cc: e897000c ldm r7, {r2, r3}
}
} else {
rtems_chain_extract_unprotected(&free_chunk->chain_node);
rtems_chain_set_off_chain(&free_chunk->chain_node);
ptr = (void *) free_chunk->begin;
71d0: e5970018 ldr r0, [r7, #24]
next->previous = previous;
71d4: e5823004 str r3, [r2, #4]
previous->next = next;
71d8: e5832000 str r2, [r3]
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
71dc: e5878004 str r8, [r7, #4]
71e0: e5878000 str r8, [r7]
71e4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
return big_enough;
}
void *rtems_rbheap_allocate(rtems_rbheap_control *control, size_t size)
{
void *ptr = NULL;
71e8: e1a00008 mov r0, r8 <== NOT EXECUTED
}
}
}
return ptr;
}
71ec: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc} <== NOT EXECUTED
00007374 <rtems_rbheap_extend_descriptors_with_malloc>:
void rtems_rbheap_extend_descriptors_with_malloc(rtems_rbheap_control *control)
{
7374: e92d4010 push {r4, lr} <== NOT EXECUTED
7378: e1a04000 mov r4, r0 <== NOT EXECUTED
rtems_rbheap_chunk *chunk = malloc(sizeof(*chunk));
737c: e3a00020 mov r0, #32 <== NOT EXECUTED
7380: ebffee8e bl 2dc0 <malloc> <== NOT EXECUTED
if (chunk != NULL) {
7384: e3500000 cmp r0, #0 <== NOT EXECUTED
7388: 08bd8010 popeq {r4, pc} <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
Chain_Control *the_chain,
Chain_Node *the_node
)
{
_Chain_Insert_unprotected(_Chain_Head(the_chain), the_node);
738c: e284300c add r3, r4, #12 <== NOT EXECUTED
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
7390: e5803004 str r3, [r0, #4] <== NOT EXECUTED
before_node = after_node->next;
7394: e594300c ldr r3, [r4, #12] <== NOT EXECUTED
after_node->next = the_node;
7398: e584000c str r0, [r4, #12] <== NOT EXECUTED
the_node->next = before_node;
before_node->previous = the_node;
739c: e5830004 str r0, [r3, #4] <== NOT EXECUTED
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
73a0: e5803000 str r3, [r0] <== NOT EXECUTED
73a4: e8bd8010 pop {r4, pc} <== NOT EXECUTED
000071f0 <rtems_rbheap_free>:
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
71f0: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (ptr != NULL) {
71f4: e2516000 subs r6, r1, #0
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
71f8: e24dd020 sub sp, sp, #32
71fc: e1a05000 mov r5, r0
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (ptr != NULL) {
7200: 0a000057 beq 7364 <rtems_rbheap_free+0x174>
#define NULL_PAGE rtems_rbheap_chunk_of_node(NULL)
static rtems_rbheap_chunk *find(rtems_rbtree_control *chunk_tree, uintptr_t key)
{
rtems_rbheap_chunk chunk = { .begin = key };
7204: e1a0000d mov r0, sp
7208: e3a01000 mov r1, #0
720c: e3a02020 mov r2, #32
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
7210: e3a04000 mov r4, #0
7214: eb002035 bl f2f0 <memset>
return rtems_rbheap_chunk_of_node(
7218: e08d3004 add r3, sp, r4
#define NULL_PAGE rtems_rbheap_chunk_of_node(NULL)
static rtems_rbheap_chunk *find(rtems_rbtree_control *chunk_tree, uintptr_t key)
{
rtems_rbheap_chunk chunk = { .begin = key };
721c: e58d6018 str r6, [sp, #24]
return rtems_rbheap_chunk_of_node(
7220: e2837008 add r7, r3, #8
RTEMS_INLINE_ROUTINE RBTree_Node *_RBTree_Find_unprotected(
RBTree_Control *the_rbtree,
RBTree_Node *the_node
)
{
RBTree_Node* iter_node = the_rbtree->root;
7224: e595601c ldr r6, [r5, #28]
7228: ea00000d b 7264 <rtems_rbheap_free+0x74>
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
compare_result = the_rbtree->compare_function(the_node, iter_node);
722c: e1a00007 mov r0, r7
7230: e1a01006 mov r1, r6
7234: e1a0e00f mov lr, pc
7238: e595f028 ldr pc, [r5, #40] ; 0x28
if ( _RBTree_Is_equal( compare_result ) ) {
723c: e3500000 cmp r0, #0
7240: 1a000003 bne 7254 <rtems_rbheap_free+0x64>
found = iter_node;
if ( the_rbtree->is_unique )
7244: e5d5302c ldrb r3, [r5, #44] ; 0x2c
7248: e3530000 cmp r3, #0
724c: 1a000007 bne 7270 <rtems_rbheap_free+0x80>
7250: e1a04006 mov r4, r6 <== NOT EXECUTED
break;
}
RBTree_Direction dir =
(RBTree_Direction) _RBTree_Is_greater( compare_result );
iter_node = iter_node->child[dir];
7254: e3500000 cmp r0, #0
7258: c3a00008 movgt r0, #8
725c: d3a00004 movle r0, #4
7260: e7906006 ldr r6, [r0, r6]
)
{
RBTree_Node* iter_node = the_rbtree->root;
RBTree_Node* found = NULL;
int compare_result;
while (iter_node) {
7264: e3560000 cmp r6, #0
7268: 1affffef bne 722c <rtems_rbheap_free+0x3c>
726c: e1a06004 mov r6, r4
7270: e2464008 sub r4, r6, #8
if (ptr != NULL) {
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
rtems_rbheap_chunk *chunk = find(chunk_tree, (uintptr_t) ptr);
if (chunk != NULL_PAGE) {
7274: e3740008 cmn r4, #8
check_and_merge(free_chain, chunk_tree, chunk, pred);
} else {
sc = RTEMS_INCORRECT_STATE;
}
} else {
sc = RTEMS_INVALID_ID;
7278: 03a06004 moveq r6, #4
if (ptr != NULL) {
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
rtems_rbheap_chunk *chunk = find(chunk_tree, (uintptr_t) ptr);
if (chunk != NULL_PAGE) {
727c: 0a000038 beq 7364 <rtems_rbheap_free+0x174>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
7280: e5163008 ldr r3, [r6, #-8]
7284: e3530000 cmp r3, #0
7288: 13a0a000 movne sl, #0
728c: 1a000002 bne 729c <rtems_rbheap_free+0xac>
add_to_chain(free_chain, b);
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
7290: e594a004 ldr sl, [r4, #4]
7294: e27aa001 rsbs sl, sl, #1
7298: 33a0a000 movcc sl, #0
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
rtems_rbheap_chunk *chunk = find(chunk_tree, (uintptr_t) ptr);
if (chunk != NULL_PAGE) {
if (!rtems_rbheap_is_chunk_free(chunk)) {
729c: e23aa001 eors sl, sl, #1
check_and_merge(free_chain, chunk_tree, chunk, succ);
add_to_chain(free_chain, chunk);
check_and_merge(free_chain, chunk_tree, chunk, pred);
} else {
sc = RTEMS_INCORRECT_STATE;
72a0: 13a0600e movne r6, #14
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
rtems_rbheap_chunk *chunk = find(chunk_tree, (uintptr_t) ptr);
if (chunk != NULL_PAGE) {
if (!rtems_rbheap_is_chunk_free(chunk)) {
72a4: 1a00002e bne 7364 <rtems_rbheap_free+0x174>
static rtems_rbheap_chunk *get_next(
const rtems_rbheap_chunk *chunk,
RBTree_Direction dir
)
{
return rtems_rbheap_chunk_of_node(
72a8: e2849008 add r9, r4, #8
72ac: e1a0100a mov r1, sl
72b0: e1a00009 mov r0, r9
72b4: eb000698 bl 8d1c <_RBTree_Next_unprotected>
72b8: e3a01001 mov r1, #1
72bc: e1a06000 mov r6, r0
72c0: e2408008 sub r8, r0, #8
72c4: e1a00009 mov r0, r9
72c8: eb000693 bl 8d1c <_RBTree_Next_unprotected>
72cc: e2403008 sub r3, r0, #8
rtems_rbtree_control *chunk_tree,
rtems_rbheap_chunk *a,
rtems_rbheap_chunk *b
)
{
if (b != NULL_PAGE && rtems_rbheap_is_chunk_free(b)) {
72d0: e3730008 cmn r3, #8
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (ptr != NULL) {
rtems_chain_control *free_chain = &control->free_chunk_chain;
rtems_rbtree_control *chunk_tree = &control->chunk_tree;
72d4: e2857018 add r7, r5, #24
rtems_rbtree_control *chunk_tree,
rtems_rbheap_chunk *a,
rtems_rbheap_chunk *b
)
{
if (b != NULL_PAGE && rtems_rbheap_is_chunk_free(b)) {
72d8: 0a00000a beq 7308 <rtems_rbheap_free+0x118>
72dc: e5102008 ldr r2, [r0, #-8]
72e0: e3520000 cmp r2, #0
72e4: 1a000002 bne 72f4 <rtems_rbheap_free+0x104>
add_to_chain(free_chain, b);
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
72e8: e510a004 ldr sl, [r0, #-4]
72ec: e27aa001 rsbs sl, sl, #1
72f0: 33a0a000 movcc sl, #0
rtems_rbtree_control *chunk_tree,
rtems_rbheap_chunk *a,
rtems_rbheap_chunk *b
)
{
if (b != NULL_PAGE && rtems_rbheap_is_chunk_free(b)) {
72f4: e35a0000 cmp sl, #0
72f8: 01a00005 moveq r0, r5
72fc: 01a01007 moveq r1, r7
7300: 01a02004 moveq r2, r4
7304: 0bffff08 bleq 6f2c <check_and_merge.part.1>
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
7308: e5953000 ldr r3, [r5]
730c: e3780008 cmn r8, #8
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
7310: e5845004 str r5, [r4, #4]
before_node = after_node->next;
after_node->next = the_node;
7314: e5854000 str r4, [r5]
the_node->next = before_node;
before_node->previous = the_node;
7318: e5834004 str r4, [r3, #4]
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
the_node->next = before_node;
731c: e5843000 str r3, [r4]
7320: 0a00000e beq 7360 <rtems_rbheap_free+0x170>
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_node_off_chain(
const Chain_Node *node
)
{
return (node->next == NULL) && (node->previous == NULL);
7324: e5163008 ldr r3, [r6, #-8]
7328: e3530000 cmp r3, #0
732c: 13a06000 movne r6, #0
7330: 1a000002 bne 7340 <rtems_rbheap_free+0x150>
add_to_chain(free_chain, b);
_RBTree_Extract_unprotected(chunk_tree, &b->tree_node);
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
7334: e5166004 ldr r6, [r6, #-4]
7338: e2766001 rsbs r6, r6, #1
733c: 33a06000 movcc r6, #0
rtems_rbtree_control *chunk_tree,
rtems_rbheap_chunk *a,
rtems_rbheap_chunk *b
)
{
if (b != NULL_PAGE && rtems_rbheap_is_chunk_free(b)) {
7340: e21660ff ands r6, r6, #255 ; 0xff
7344: 1a000005 bne 7360 <rtems_rbheap_free+0x170>
7348: e1a00005 mov r0, r5
734c: e1a01007 mov r1, r7
7350: e1a02004 mov r2, r4
7354: e1a03008 mov r3, r8
7358: ebfffef3 bl 6f2c <check_and_merge.part.1>
735c: ea000000 b 7364 <rtems_rbheap_free+0x174>
}
}
rtems_status_code rtems_rbheap_free(rtems_rbheap_control *control, void *ptr)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
7360: e3a06000 mov r6, #0
sc = RTEMS_INVALID_ID;
}
}
return sc;
}
7364: e1a00006 mov r0, r6
7368: e28dd020 add sp, sp, #32
736c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
00017288 <rtems_rfs_bitmap_map_clear_all>:
int
rtems_rfs_bitmap_map_clear_all (rtems_rfs_bitmap_control* control)
{
17288: e92d4011 push {r0, r4, lr}
rtems_rfs_bitmap_bit last_search_bit;
size_t elements;
int e;
int rc;
rc = rtems_rfs_bitmap_load_map (control, &map);
1728c: e1a0100d mov r1, sp
return 0;
}
int
rtems_rfs_bitmap_map_clear_all (rtems_rfs_bitmap_control* control)
{
17290: e1a04000 mov r4, r0
rtems_rfs_bitmap_bit last_search_bit;
size_t elements;
int e;
int rc;
rc = rtems_rfs_bitmap_load_map (control, &map);
17294: ebfffed4 bl 16dec <rtems_rfs_bitmap_load_map>
if (rc > 0)
17298: e3500000 cmp r0, #0
1729c: ca00001f bgt 17320 <rtems_rfs_bitmap_map_clear_all+0x98>
return rc;
elements = rtems_rfs_bitmap_elements (control->size);
172a0: e594100c ldr r1, [r4, #12]
172a4: e2411001 sub r1, r1, #1
172a8: e1a012a1 lsr r1, r1, #5
172ac: e2813001 add r3, r1, #1
control->free = elements;
172b0: e5843010 str r3, [r4, #16]
172b4: e59d0000 ldr r0, [sp]
for (e = 0; e < elements; e++)
172b8: e3a02000 mov r2, #0
map[e] = RTEMS_RFS_BITMAP_ELEMENT_CLEAR;
172bc: e3e0c000 mvn ip, #0
elements = rtems_rfs_bitmap_elements (control->size);
control->free = elements;
for (e = 0; e < elements; e++)
172c0: ea000001 b 172cc <rtems_rfs_bitmap_map_clear_all+0x44>
map[e] = RTEMS_RFS_BITMAP_ELEMENT_CLEAR;
172c4: e480c004 str ip, [r0], #4
elements = rtems_rfs_bitmap_elements (control->size);
control->free = elements;
for (e = 0; e < elements; e++)
172c8: e2822001 add r2, r2, #1
172cc: e1520003 cmp r2, r3
172d0: 3afffffb bcc 172c4 <rtems_rfs_bitmap_map_clear_all+0x3c>
* works.
*/
last_search_bit = rtems_rfs_bitmap_map_offset (elements);
if (last_search_bit == 0)
last_search_bit = rtems_rfs_bitmap_element_bits ();
172d4: e213201f ands r2, r3, #31
172d8: 03a02020 moveq r2, #32
elements = rtems_rfs_bitmap_elements (elements);
172dc: e1a0c2a1 lsr ip, r1, #5
for (e = 0; e < (elements - 1); e++)
172e0: e3a03000 mov r3, #0
172e4: e3e00000 mvn r0, #0
172e8: ea000001 b 172f4 <rtems_rfs_bitmap_map_clear_all+0x6c>
control->search_bits[e] = RTEMS_RFS_BITMAP_ELEMENT_CLEAR;
172ec: e7810103 str r0, [r1, r3, lsl #2] <== NOT EXECUTED
if (last_search_bit == 0)
last_search_bit = rtems_rfs_bitmap_element_bits ();
elements = rtems_rfs_bitmap_elements (elements);
for (e = 0; e < (elements - 1); e++)
172f0: e2833001 add r3, r3, #1 <== NOT EXECUTED
172f4: e153000c cmp r3, ip
172f8: e5941014 ldr r1, [r4, #20]
172fc: 1afffffa bne 172ec <rtems_rfs_bitmap_map_clear_all+0x64>
rtems_rfs_bitmap_element
rtems_rfs_bitmap_mask (unsigned int size)
{
rtems_rfs_bitmap_element mask = RTEMS_RFS_BITMAP_ELEMENT_FULL_MASK;
mask >>= (rtems_rfs_bitmap_element_bits () - size);
17300: e3e00000 mvn r0, #0
17304: e2622020 rsb r2, r2, #32
17308: e1a02230 lsr r2, r0, r2
elements = rtems_rfs_bitmap_elements (elements);
for (e = 0; e < (elements - 1); e++)
control->search_bits[e] = RTEMS_RFS_BITMAP_ELEMENT_CLEAR;
control->search_bits[elements - 1] =
1730c: e7812103 str r2, [r1, r3, lsl #2]
rtems_rfs_bitmap_merge (RTEMS_RFS_BITMAP_ELEMENT_CLEAR,
RTEMS_RFS_BITMAP_ELEMENT_SET,
rtems_rfs_bitmap_mask (last_search_bit));
rtems_rfs_buffer_mark_dirty (control->buffer);
17310: e5943000 ldr r3, [r4]
17314: e3a02001 mov r2, #1
17318: e5c32000 strb r2, [r3]
return 0;
1731c: e3a00000 mov r0, #0
}
17320: e8bd8018 pop {r3, r4, pc}
000170a8 <rtems_rfs_bitmap_map_set>:
int
rtems_rfs_bitmap_map_set (rtems_rfs_bitmap_control* control,
rtems_rfs_bitmap_bit bit)
{
170a8: e92d4071 push {r0, r4, r5, r6, lr}
170ac: e1a05001 mov r5, r1
rtems_rfs_bitmap_map map;
rtems_rfs_bitmap_map search_map;
int index;
int offset;
int rc;
rc = rtems_rfs_bitmap_load_map (control, &map);
170b0: e1a0100d mov r1, sp
}
int
rtems_rfs_bitmap_map_set (rtems_rfs_bitmap_control* control,
rtems_rfs_bitmap_bit bit)
{
170b4: e1a04000 mov r4, r0
rtems_rfs_bitmap_map map;
rtems_rfs_bitmap_map search_map;
int index;
int offset;
int rc;
rc = rtems_rfs_bitmap_load_map (control, &map);
170b8: ebffff4b bl 16dec <rtems_rfs_bitmap_load_map>
if (rc > 0)
170bc: e3500000 cmp r0, #0
170c0: ca000018 bgt 17128 <rtems_rfs_bitmap_map_set+0x80>
return rc;
if (bit >= control->size)
170c4: e594300c ldr r3, [r4, #12]
170c8: e1550003 cmp r5, r3
return EINVAL;
170cc: 23a00016 movcs r0, #22
int offset;
int rc;
rc = rtems_rfs_bitmap_load_map (control, &map);
if (rc > 0)
return rc;
if (bit >= control->size)
170d0: 2a000014 bcs 17128 <rtems_rfs_bitmap_map_set+0x80>
return EINVAL;
search_map = control->search_bits;
index = rtems_rfs_bitmap_map_index (bit);
offset = rtems_rfs_bitmap_map_offset (bit);
map[index] = rtems_rfs_bitmap_set (map[index], 1 << offset);
170d4: e59dc000 ldr ip, [sp]
if (rc > 0)
return rc;
if (bit >= control->size)
return EINVAL;
search_map = control->search_bits;
index = rtems_rfs_bitmap_map_index (bit);
170d8: e1a022c5 asr r2, r5, #5
*/
static rtems_rfs_bitmap_element
rtems_rfs_bitmap_set (rtems_rfs_bitmap_element target,
rtems_rfs_bitmap_element bits)
{
return RTEMS_RFS_BITMAP_SET_BITS (target, bits);
170dc: e79c0102 ldr r0, [ip, r2, lsl #2]
return rc;
if (bit >= control->size)
return EINVAL;
search_map = control->search_bits;
index = rtems_rfs_bitmap_map_index (bit);
offset = rtems_rfs_bitmap_map_offset (bit);
170e0: e205601f and r6, r5, #31
map[index] = rtems_rfs_bitmap_set (map[index], 1 << offset);
170e4: e3a03001 mov r3, #1
*/
static rtems_rfs_bitmap_element
rtems_rfs_bitmap_set (rtems_rfs_bitmap_element target,
rtems_rfs_bitmap_element bits)
{
return RTEMS_RFS_BITMAP_SET_BITS (target, bits);
170e8: e1c00613 bic r0, r0, r3, lsl r6
return EINVAL;
search_map = control->search_bits;
index = rtems_rfs_bitmap_map_index (bit);
offset = rtems_rfs_bitmap_map_offset (bit);
map[index] = rtems_rfs_bitmap_set (map[index], 1 << offset);
if (rtems_rfs_bitmap_match(map[index], RTEMS_RFS_BITMAP_ELEMENT_SET))
170ec: e3500000 cmp r0, #0
rc = rtems_rfs_bitmap_load_map (control, &map);
if (rc > 0)
return rc;
if (bit >= control->size)
return EINVAL;
search_map = control->search_bits;
170f0: e5941014 ldr r1, [r4, #20]
index = rtems_rfs_bitmap_map_index (bit);
offset = rtems_rfs_bitmap_map_offset (bit);
map[index] = rtems_rfs_bitmap_set (map[index], 1 << offset);
170f4: e78c0102 str r0, [ip, r2, lsl #2]
offset = rtems_rfs_bitmap_map_offset (bit);
search_map[index] = rtems_rfs_bitmap_set (search_map[index], 1 << offset);
control->free--;
rtems_rfs_buffer_mark_dirty (control->buffer);
}
return 0;
170f8: 13a00000 movne r0, #0
return EINVAL;
search_map = control->search_bits;
index = rtems_rfs_bitmap_map_index (bit);
offset = rtems_rfs_bitmap_map_offset (bit);
map[index] = rtems_rfs_bitmap_set (map[index], 1 << offset);
if (rtems_rfs_bitmap_match(map[index], RTEMS_RFS_BITMAP_ELEMENT_SET))
170fc: 1a000009 bne 17128 <rtems_rfs_bitmap_map_set+0x80>
{
bit = index;
index = rtems_rfs_bitmap_map_index (bit);
17100: e1a05545 asr r5, r5, #10 <== NOT EXECUTED
*/
static rtems_rfs_bitmap_element
rtems_rfs_bitmap_set (rtems_rfs_bitmap_element target,
rtems_rfs_bitmap_element bits)
{
return RTEMS_RFS_BITMAP_SET_BITS (target, bits);
17104: e791c105 ldr ip, [r1, r5, lsl #2] <== NOT EXECUTED
map[index] = rtems_rfs_bitmap_set (map[index], 1 << offset);
if (rtems_rfs_bitmap_match(map[index], RTEMS_RFS_BITMAP_ELEMENT_SET))
{
bit = index;
index = rtems_rfs_bitmap_map_index (bit);
offset = rtems_rfs_bitmap_map_offset (bit);
17108: e202201f and r2, r2, #31 <== NOT EXECUTED
*/
static rtems_rfs_bitmap_element
rtems_rfs_bitmap_set (rtems_rfs_bitmap_element target,
rtems_rfs_bitmap_element bits)
{
return RTEMS_RFS_BITMAP_SET_BITS (target, bits);
1710c: e1cc2213 bic r2, ip, r3, lsl r2 <== NOT EXECUTED
if (rtems_rfs_bitmap_match(map[index], RTEMS_RFS_BITMAP_ELEMENT_SET))
{
bit = index;
index = rtems_rfs_bitmap_map_index (bit);
offset = rtems_rfs_bitmap_map_offset (bit);
search_map[index] = rtems_rfs_bitmap_set (search_map[index], 1 << offset);
17110: e7812105 str r2, [r1, r5, lsl #2] <== NOT EXECUTED
control->free--;
17114: e5942010 ldr r2, [r4, #16] <== NOT EXECUTED
17118: e2422001 sub r2, r2, #1 <== NOT EXECUTED
1711c: e5842010 str r2, [r4, #16] <== NOT EXECUTED
rtems_rfs_buffer_mark_dirty (control->buffer);
17120: e5942000 ldr r2, [r4] <== NOT EXECUTED
17124: e5c23000 strb r3, [r2] <== NOT EXECUTED
}
return 0;
}
17128: e8bd8078 pop {r3, r4, r5, r6, pc}
00017078 <rtems_rfs_bitmap_mask>:
rtems_rfs_bitmap_mask (unsigned int size)
{
rtems_rfs_bitmap_element mask = RTEMS_RFS_BITMAP_ELEMENT_FULL_MASK;
mask >>= (rtems_rfs_bitmap_element_bits () - size);
return mask;
}
17078: e3e03000 mvn r3, #0 <== NOT EXECUTED
rtems_rfs_bitmap_element
rtems_rfs_bitmap_mask (unsigned int size)
{
rtems_rfs_bitmap_element mask = RTEMS_RFS_BITMAP_ELEMENT_FULL_MASK;
mask >>= (rtems_rfs_bitmap_element_bits () - size);
1707c: e2600020 rsb r0, r0, #32 <== NOT EXECUTED
return mask;
}
17080: e1a00033 lsr r0, r3, r0 <== NOT EXECUTED
17084: e12fff1e bx lr <== NOT EXECUTED
000176f8 <rtems_rfs_block_find_indirect>:
rtems_rfs_block_find_indirect (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* buffer,
rtems_rfs_block_no block,
int offset,
rtems_rfs_block_no* result)
{
176f8: e92d41f0 push {r4, r5, r6, r7, r8, lr}
176fc: e1a05003 mov r5, r3
/*
* If the handle has a buffer and this request is a different block the current
* buffer is released.
*/
rc = rtems_rfs_buffer_handle_request (fs, buffer, block, true);
17700: e3a03001 mov r3, #1
rtems_rfs_block_find_indirect (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* buffer,
rtems_rfs_block_no block,
int offset,
rtems_rfs_block_no* result)
{
17704: e1a06000 mov r6, r0
17708: e1a07001 mov r7, r1
1770c: e1a08002 mov r8, r2
17710: e59d4018 ldr r4, [sp, #24]
/*
* If the handle has a buffer and this request is a different block the current
* buffer is released.
*/
rc = rtems_rfs_buffer_handle_request (fs, buffer, block, true);
17714: eb000414 bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
17718: e3500000 cmp r0, #0
1771c: c8bd81f0 popgt {r4, r5, r6, r7, r8, pc}
return rc;
*result = rtems_rfs_block_get_number (buffer, offset);
17720: e5973008 ldr r3, [r7, #8]
17724: e593101c ldr r1, [r3, #28]
17728: e0812105 add r2, r1, r5, lsl #2
1772c: e5d23003 ldrb r3, [r2, #3]
17730: e7d11105 ldrb r1, [r1, r5, lsl #2]
17734: e1833c01 orr r3, r3, r1, lsl #24
17738: e5d21001 ldrb r1, [r2, #1]
1773c: e5d22002 ldrb r2, [r2, #2]
17740: e1833801 orr r3, r3, r1, lsl #16
17744: e1833402 orr r3, r3, r2, lsl #8
if ((*result + 1) == 0)
*result = 0;
17748: e3730001 cmn r3, #1
1774c: 03a03000 moveq r3, #0
rc = rtems_rfs_buffer_handle_request (fs, buffer, block, true);
if (rc > 0)
return rc;
*result = rtems_rfs_block_get_number (buffer, offset);
if ((*result + 1) == 0)
17750: e5843000 str r3, [r4]
*result = 0;
if (*result >= rtems_rfs_fs_blocks (fs))
17754: e5962004 ldr r2, [r6, #4]
17758: e1530002 cmp r3, r2
1775c: 3a00000b bcc 17790 <rtems_rfs_block_find_indirect+0x98>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_FIND))
17760: e3a00a01 mov r0, #4096 ; 0x1000 <== NOT EXECUTED
17764: e3a01000 mov r1, #0 <== NOT EXECUTED
17768: ebffe6bf bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1776c: e3500000 cmp r0, #0 <== NOT EXECUTED
printf ("rtems-rfs: block-find: invalid block in table:"
17770: 159f0020 ldrne r0, [pc, #32] ; 17798 <rtems_rfs_block_find_indirect+0xa0><== NOT EXECUTED
17774: 15941000 ldrne r1, [r4] <== NOT EXECUTED
17778: 11a02008 movne r2, r8 <== NOT EXECUTED
1777c: 11a03005 movne r3, r5 <== NOT EXECUTED
17780: 1b001ca9 blne 1ea2c <printf> <== NOT EXECUTED
" block=%" PRId32 ", indirect=%" PRId32 "/%d\n", *result, block, offset);
*result = 0;
17784: e3a00000 mov r0, #0 <== NOT EXECUTED
17788: e5840000 str r0, [r4] <== NOT EXECUTED
1778c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
*result = rtems_rfs_block_get_number (buffer, offset);
if ((*result + 1) == 0)
*result = 0;
if (*result >= rtems_rfs_fs_blocks (fs))
17790: e3a00000 mov r0, #0
*result = 0;
rc = EIO;
}
return 0;
}
17794: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
000177fc <rtems_rfs_block_get_block_size>:
void
rtems_rfs_block_get_block_size (rtems_rfs_file_system* fs,
rtems_rfs_pos pos,
rtems_rfs_block_size* size)
{
177fc: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED
17800: e1a06001 mov r6, r1 <== NOT EXECUTED
17804: e1a07002 mov r7, r2 <== NOT EXECUTED
17808: e1a04003 mov r4, r3 <== NOT EXECUTED
if (pos == 0)
1780c: e1963007 orrs r3, r6, r7 <== NOT EXECUTED
* @param size A pointer to the block size.
*/
static inline void
rtems_rfs_block_set_size_zero (rtems_rfs_block_size* size)
{
size->count = 0;
17810: 03a03000 moveq r3, #0 <== NOT EXECUTED
17814: 05843000 streq r3, [r4] <== NOT EXECUTED
size->offset = 0;
17818: 05843004 streq r3, [r4, #4] <== NOT EXECUTED
1781c: 08bd80f0 popeq {r4, r5, r6, r7, pc} <== NOT EXECUTED
rtems_rfs_block_set_size_zero (size);
else
{
size->count = pos / rtems_rfs_fs_block_size (fs) + 1;
17820: e5905008 ldr r5, [r0, #8] <== NOT EXECUTED
17824: e3a03000 mov r3, #0 <== NOT EXECUTED
17828: e1a00001 mov r0, r1 <== NOT EXECUTED
1782c: e1a01002 mov r1, r2 <== NOT EXECUTED
17830: e1a02005 mov r2, r5 <== NOT EXECUTED
17834: eb005324 bl 2c4cc <__udivdi3> <== NOT EXECUTED
17838: e2800001 add r0, r0, #1 <== NOT EXECUTED
1783c: e5840000 str r0, [r4] <== NOT EXECUTED
size->offset = pos % rtems_rfs_fs_block_size (fs);
17840: e1a01007 mov r1, r7 <== NOT EXECUTED
17844: e1a00006 mov r0, r6 <== NOT EXECUTED
17848: e1a02005 mov r2, r5 <== NOT EXECUTED
1784c: e3a03000 mov r3, #0 <== NOT EXECUTED
17850: eb005441 bl 2c95c <__umoddi3> <== NOT EXECUTED
17854: e5840004 str r0, [r4, #4] <== NOT EXECUTED
17858: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
00017bc8 <rtems_rfs_block_map_find>:
int
rtems_rfs_block_map_find (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
rtems_rfs_block_pos* bpos,
rtems_rfs_block_no* block)
{
17bc8: e92d4ff7 push {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, fp, lr}
17bcc: e1a05003 mov r5, r3
int rc = 0;
*block = 0;
17bd0: e3a03000 mov r3, #0
17bd4: e5853000 str r3, [r5]
/*
* Range checking here makes the remaining logic simpler.
*/
if (rtems_rfs_block_pos_block_past_end (bpos, &map->size))
17bd8: e5928000 ldr r8, [r2]
17bdc: e1580003 cmp r8, r3
int
rtems_rfs_block_map_find (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
rtems_rfs_block_pos* bpos,
rtems_rfs_block_no* block)
{
17be0: e1a06000 mov r6, r0
17be4: e1a04001 mov r4, r1
17be8: e1a07002 mov r7, r2
17bec: e591a008 ldr sl, [r1, #8]
*block = 0;
/*
* Range checking here makes the remaining logic simpler.
*/
if (rtems_rfs_block_pos_block_past_end (bpos, &map->size))
17bf0: 0a000001 beq 17bfc <rtems_rfs_block_map_find+0x34>
17bf4: e15a0003 cmp sl, r3
17bf8: 0a000047 beq 17d1c <rtems_rfs_block_map_find+0x154>
17bfc: e158000a cmp r8, sl
17c00: 2a000045 bcs 17d1c <rtems_rfs_block_map_find+0x154>
return ENXIO;
/*
* If the block position is the same and we have found the block just return it.
*/
if ((bpos->bno == map->bpos.bno) && (map->bpos.block != 0))
17c04: e5943010 ldr r3, [r4, #16]
17c08: e1580003 cmp r8, r3
17c0c: 1a000002 bne 17c1c <rtems_rfs_block_map_find+0x54>
17c10: e5943018 ldr r3, [r4, #24]
17c14: e3530000 cmp r3, #0
17c18: 1a000003 bne 17c2c <rtems_rfs_block_map_find+0x64>
/*
* Determine the type of access we need to perform. If the number of blocks
* is less than or equal to the number of slots in the inode the blocks are
* directly accessed.
*/
if (map->size.count <= RTEMS_RFS_INODE_BLOCKS)
17c1c: e35a0005 cmp sl, #5
17c20: 8a000003 bhi 17c34 <rtems_rfs_block_map_find+0x6c>
{
*block = map->blocks[bpos->bno];
17c24: e2888009 add r8, r8, #9
17c28: e7943108 ldr r3, [r4, r8, lsl #2]
17c2c: e5853000 str r3, [r5]
17c30: ea00002f b 17cf4 <rtems_rfs_block_map_find+0x12c>
* The map is either singly or doubly indirect.
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = bpos->bno % fs->blocks_per_block;
17c34: e5969034 ldr r9, [r6, #52] ; 0x34
17c38: e1a00008 mov r0, r8
17c3c: e1a01009 mov r1, r9
17c40: eb004cec bl 2aff8 <__umodsi3>
singly = bpos->bno / fs->blocks_per_block;
17c44: e1a01009 mov r1, r9
* The map is either singly or doubly indirect.
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = bpos->bno % fs->blocks_per_block;
17c48: e58d0004 str r0, [sp, #4]
singly = bpos->bno / fs->blocks_per_block;
17c4c: e1a00008 mov r0, r8
17c50: ebffa73a bl 1940 <__aeabi_uidiv>
if (map->size.count <= fs->block_map_singly_blocks)
17c54: e5963038 ldr r3, [r6, #56] ; 0x38
17c58: e15a0003 cmp sl, r3
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = bpos->bno % fs->blocks_per_block;
singly = bpos->bno / fs->blocks_per_block;
17c5c: e1a0b000 mov fp, r0
17c60: e58d0008 str r0, [sp, #8]
if (map->size.count <= fs->block_map_singly_blocks)
17c64: 8a000005 bhi 17c80 <rtems_rfs_block_map_find+0xb8>
{
/*
* This is a single indirect table of blocks anchored off a slot in the
* inode.
*/
rc = rtems_rfs_block_find_indirect (fs,
17c68: e280b009 add fp, r0, #9
17c6c: e58d5000 str r5, [sp]
17c70: e1a00006 mov r0, r6
17c74: e2841038 add r1, r4, #56 ; 0x38
17c78: e794210b ldr r2, [r4, fp, lsl #2]
17c7c: ea000018 b 17ce4 <rtems_rfs_block_map_find+0x11c>
* The map is doubly indirect.
*/
rtems_rfs_block_no doubly;
doubly = singly / fs->blocks_per_block;
singly %= fs->blocks_per_block;
17c80: e1a01009 mov r1, r9 <== NOT EXECUTED
17c84: eb004cdb bl 2aff8 <__umodsi3> <== NOT EXECUTED
if (map->size.count < fs->block_map_doubly_blocks)
17c88: e596303c ldr r3, [r6, #60] ; 0x3c <== NOT EXECUTED
17c8c: e15a0003 cmp sl, r3 <== NOT EXECUTED
* The map is doubly indirect.
*/
rtems_rfs_block_no doubly;
doubly = singly / fs->blocks_per_block;
singly %= fs->blocks_per_block;
17c90: e1a08000 mov r8, r0 <== NOT EXECUTED
17c94: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
if (map->size.count < fs->block_map_doubly_blocks)
17c98: 2a00001f bcs 17d1c <rtems_rfs_block_map_find+0x154> <== NOT EXECUTED
/*
* The map is doubly indirect.
*/
rtems_rfs_block_no doubly;
doubly = singly / fs->blocks_per_block;
17c9c: e1a01009 mov r1, r9 <== NOT EXECUTED
17ca0: e1a0000b mov r0, fp <== NOT EXECUTED
17ca4: ebffa725 bl 1940 <__aeabi_uidiv> <== NOT EXECUTED
singly %= fs->blocks_per_block;
if (map->size.count < fs->block_map_doubly_blocks)
{
rc = rtems_rfs_block_find_indirect (fs,
17ca8: e284a044 add sl, r4, #68 ; 0x44 <== NOT EXECUTED
17cac: e2803009 add r3, r0, #9 <== NOT EXECUTED
17cb0: e28d2008 add r2, sp, #8 <== NOT EXECUTED
17cb4: e58d2000 str r2, [sp] <== NOT EXECUTED
17cb8: e1a00006 mov r0, r6 <== NOT EXECUTED
17cbc: e7942103 ldr r2, [r4, r3, lsl #2] <== NOT EXECUTED
17cc0: e1a0100a mov r1, sl <== NOT EXECUTED
17cc4: e1a03008 mov r3, r8 <== NOT EXECUTED
17cc8: ebfffe8a bl 176f8 <rtems_rfs_block_find_indirect> <== NOT EXECUTED
&map->doubly_buffer,
map->blocks[doubly],
singly, &singly);
if (rc == 0)
17ccc: e3500000 cmp r0, #0 <== NOT EXECUTED
17cd0: 1a000012 bne 17d20 <rtems_rfs_block_map_find+0x158> <== NOT EXECUTED
{
rc = rtems_rfs_block_find_indirect (fs,
17cd4: e58d5000 str r5, [sp] <== NOT EXECUTED
17cd8: e59d2008 ldr r2, [sp, #8] <== NOT EXECUTED
17cdc: e1a00006 mov r0, r6 <== NOT EXECUTED
17ce0: e2841038 add r1, r4, #56 ; 0x38 <== NOT EXECUTED
17ce4: e59d3004 ldr r3, [sp, #4]
17ce8: ebfffe82 bl 176f8 <rtems_rfs_block_find_indirect>
}
}
}
}
if (rc == 0)
17cec: e3500000 cmp r0, #0
17cf0: 1a00000a bne 17d20 <rtems_rfs_block_map_find+0x158>
{
rtems_rfs_block_copy_bpos (&map->bpos, bpos);
17cf4: e5973000 ldr r3, [r7]
17cf8: e5843010 str r3, [r4, #16]
17cfc: e5973004 ldr r3, [r7, #4]
17d00: e5843014 str r3, [r4, #20]
17d04: e5973008 ldr r3, [r7, #8]
17d08: e5843018 str r3, [r4, #24]
map->bpos.block = *block;
17d0c: e5953000 ldr r3, [r5]
17d10: e3a00000 mov r0, #0
17d14: e5843018 str r3, [r4, #24]
17d18: ea000000 b 17d20 <rtems_rfs_block_map_find+0x158>
/*
* Range checking here makes the remaining logic simpler.
*/
if (rtems_rfs_block_pos_block_past_end (bpos, &map->size))
return ENXIO;
17d1c: e3a00006 mov r0, #6
rtems_rfs_block_copy_bpos (&map->bpos, bpos);
map->bpos.block = *block;
}
return rc;
}
17d20: e8bd8ffe pop {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
00017dc0 <rtems_rfs_block_map_grow>:
int
rtems_rfs_block_map_grow (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
size_t blocks,
rtems_rfs_block_no* new_block)
{
17dc0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
17dc4: e1a05000 mov r5, r0
17dc8: e24dd014 sub sp, sp, #20
17dcc: e1a04001 mov r4, r1
int b;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_GROW))
17dd0: e3a00a02 mov r0, #8192 ; 0x2000
17dd4: e3a01000 mov r1, #0
int
rtems_rfs_block_map_grow (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
size_t blocks,
rtems_rfs_block_no* new_block)
{
17dd8: e1a0b002 mov fp, r2
17ddc: e58d3008 str r3, [sp, #8]
int b;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_GROW))
17de0: ebffe521 bl 1126c <rtems_rfs_trace>
17de4: e3500000 cmp r0, #0
printf ("rtems-rfs: block-map-grow: entry: blocks=%zd count=%" PRIu32 "\n",
17de8: 159f0368 ldrne r0, [pc, #872] ; 18158 <rtems_rfs_block_map_grow+0x398>
17dec: 11a0100b movne r1, fp
17df0: 15942008 ldrne r2, [r4, #8]
17df4: 1b001b0c blne 1ea2c <printf>
blocks, map->size.count);
if ((map->size.count + blocks) >= rtems_rfs_fs_max_block_map_blocks (fs))
17df8: e5942008 ldr r2, [r4, #8]
17dfc: e595303c ldr r3, [r5, #60] ; 0x3c
17e00: e08b2002 add r2, fp, r2
17e04: e1520003 cmp r2, r3
map->last_map_block = new_block;
return 0;
}
int
rtems_rfs_block_map_grow (rtems_rfs_file_system* fs,
17e08: 33a09000 movcc r9, #0
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_GROW))
printf ("rtems-rfs: block-map-grow: entry: blocks=%zd count=%" PRIu32 "\n",
blocks, map->size.count);
if ((map->size.count + blocks) >= rtems_rfs_fs_max_block_map_blocks (fs))
17e0c: 2a0000cd bcs 18148 <rtems_rfs_block_map_grow+0x388>
17e10: ea0000c8 b 18138 <rtems_rfs_block_map_grow+0x378>
/*
* Allocate the block. If an indirect block is needed and cannot be
* allocated free this block.
*/
rc = rtems_rfs_group_bitmap_alloc (fs, map->last_data_block,
17e14: e1a00005 mov r0, r5
17e18: e5941020 ldr r1, [r4, #32]
17e1c: e3a02000 mov r2, #0
17e20: e28d300c add r3, sp, #12
17e24: ebffddce bl f564 <rtems_rfs_group_bitmap_alloc>
false, &block);
if (rc > 0)
17e28: e250a000 subs sl, r0, #0
17e2c: ca0000c6 bgt 1814c <rtems_rfs_block_map_grow+0x38c>
return rc;
if (map->size.count < RTEMS_RFS_INODE_BLOCKS)
17e30: e5948008 ldr r8, [r4, #8]
17e34: e3580004 cmp r8, #4
map->blocks[map->size.count] = block;
17e38: 959d300c ldrls r3, [sp, #12]
17e3c: 92888009 addls r8, r8, #9
17e40: 97843108 strls r3, [r4, r8, lsl #2]
rc = rtems_rfs_group_bitmap_alloc (fs, map->last_data_block,
false, &block);
if (rc > 0)
return rc;
if (map->size.count < RTEMS_RFS_INODE_BLOCKS)
17e44: 9a0000ae bls 18104 <rtems_rfs_block_map_grow+0x344>
* Single indirect access is occuring. It could still be doubly indirect.
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = map->size.count % fs->blocks_per_block;
17e48: e5957034 ldr r7, [r5, #52] ; 0x34
17e4c: e1a00008 mov r0, r8
17e50: e1a01007 mov r1, r7
17e54: eb004c67 bl 2aff8 <__umodsi3>
singly = map->size.count / fs->blocks_per_block;
17e58: e1a01007 mov r1, r7
* Single indirect access is occuring. It could still be doubly indirect.
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = map->size.count % fs->blocks_per_block;
17e5c: e1a06000 mov r6, r0
singly = map->size.count / fs->blocks_per_block;
17e60: e1a00008 mov r0, r8
17e64: ebffa6b5 bl 1940 <__aeabi_uidiv>
if (map->size.count < fs->block_map_singly_blocks)
17e68: e5953038 ldr r3, [r5, #56] ; 0x38
17e6c: e1580003 cmp r8, r3
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = map->size.count % fs->blocks_per_block;
singly = map->size.count / fs->blocks_per_block;
17e70: e1a0a000 mov sl, r0
if (map->size.count < fs->block_map_singly_blocks)
17e74: 2a000018 bcs 17edc <rtems_rfs_block_map_grow+0x11c>
* Singly indirect tables are being used. Allocate a new block for a
* mapping table if direct is 0 or we are moving up (upping). If upping
* move the direct blocks into the table and if not this is the first
* entry of a new block.
*/
if ((direct == 0) ||
17e78: e3560000 cmp r6, #0
17e7c: 0a000002 beq 17e8c <rtems_rfs_block_map_grow+0xcc>
17e80: e3560005 cmp r6, #5
17e84: 03500000 cmpeq r0, #0
17e88: 1a00000a bne 17eb8 <rtems_rfs_block_map_grow+0xf8>
/*
* Upping is when we move from direct to singly indirect.
*/
bool upping;
upping = map->size.count == RTEMS_RFS_INODE_BLOCKS;
rc = rtems_rfs_block_map_indirect_alloc (fs, map,
17e8c: e2480005 sub r0, r8, #5
17e90: e2708000 rsbs r8, r0, #0
17e94: e28a3009 add r3, sl, #9
17e98: e0a88000 adc r8, r8, r0
17e9c: e1a01004 mov r1, r4
17ea0: e1a00005 mov r0, r5
17ea4: e2842038 add r2, r4, #56 ; 0x38
17ea8: e0843103 add r3, r4, r3, lsl #2
17eac: e58d8000 str r8, [sp]
17eb0: ebfffdc2 bl 175c0 <rtems_rfs_block_map_indirect_alloc>
17eb4: ea000005 b 17ed0 <rtems_rfs_block_map_grow+0x110>
&map->blocks[singly],
upping);
}
else
{
rc = rtems_rfs_buffer_handle_request (fs, &map->singly_buffer,
17eb8: e280a009 add sl, r0, #9
17ebc: e2841038 add r1, r4, #56 ; 0x38
17ec0: e1a00005 mov r0, r5
17ec4: e794210a ldr r2, [r4, sl, lsl #2]
17ec8: e3a03001 mov r3, #1
17ecc: eb000226 bl 1876c <rtems_rfs_buffer_handle_request>
17ed0: e1a0a000 mov sl, r0
map->blocks[singly], true);
}
if (rc > 0)
17ed4: e3500000 cmp r0, #0
17ed8: ea00006c b 18090 <rtems_rfs_block_map_grow+0x2d0>
* Doubly indirect tables are being used.
*/
rtems_rfs_block_no doubly;
rtems_rfs_block_no singly_block;
doubly = singly / fs->blocks_per_block;
17edc: e1a01007 mov r1, r7 <== NOT EXECUTED
17ee0: ebffa696 bl 1940 <__aeabi_uidiv> <== NOT EXECUTED
singly %= fs->blocks_per_block;
17ee4: e1a01007 mov r1, r7 <== NOT EXECUTED
* Doubly indirect tables are being used.
*/
rtems_rfs_block_no doubly;
rtems_rfs_block_no singly_block;
doubly = singly / fs->blocks_per_block;
17ee8: e1a08000 mov r8, r0 <== NOT EXECUTED
singly %= fs->blocks_per_block;
17eec: e1a0000a mov r0, sl <== NOT EXECUTED
17ef0: eb004c40 bl 2aff8 <__umodsi3> <== NOT EXECUTED
* Allocate a new block for a singly indirect table if direct is 0 as
* it is the first entry of a new block. We may also need to allocate a
* doubly indirect block as well. Both always occur when direct is 0
* and the doubly indirect block when singly is 0.
*/
if (direct == 0)
17ef4: e3560000 cmp r6, #0 <== NOT EXECUTED
*/
rtems_rfs_block_no doubly;
rtems_rfs_block_no singly_block;
doubly = singly / fs->blocks_per_block;
singly %= fs->blocks_per_block;
17ef8: e1a07000 mov r7, r0 <== NOT EXECUTED
* Allocate a new block for a singly indirect table if direct is 0 as
* it is the first entry of a new block. We may also need to allocate a
* doubly indirect block as well. Both always occur when direct is 0
* and the doubly indirect block when singly is 0.
*/
if (direct == 0)
17efc: 1a00004b bne 18030 <rtems_rfs_block_map_grow+0x270> <== NOT EXECUTED
{
rc = rtems_rfs_block_map_indirect_alloc (fs, map,
17f00: e1a00005 mov r0, r5 <== NOT EXECUTED
17f04: e1a01004 mov r1, r4 <== NOT EXECUTED
17f08: e2842038 add r2, r4, #56 ; 0x38 <== NOT EXECUTED
17f0c: e28d3010 add r3, sp, #16 <== NOT EXECUTED
17f10: e58d6000 str r6, [sp] <== NOT EXECUTED
17f14: ebfffda9 bl 175c0 <rtems_rfs_block_map_indirect_alloc> <== NOT EXECUTED
&map->singly_buffer,
&singly_block,
false);
if (rc > 0)
17f18: e250a000 subs sl, r0, #0 <== NOT EXECUTED
{
rtems_rfs_group_bitmap_free (fs, false, block);
17f1c: c1a00005 movgt r0, r5 <== NOT EXECUTED
17f20: c1a01006 movgt r1, r6 <== NOT EXECUTED
17f24: ca00005c bgt 1809c <rtems_rfs_block_map_grow+0x2dc> <== NOT EXECUTED
/*
* Allocate a new block for a doubly indirect table if singly is 0 as
* it is the first entry of a new singly indirect block.
*/
if ((singly == 0) ||
17f28: e3570000 cmp r7, #0 <== NOT EXECUTED
17f2c: 0a000005 beq 17f48 <rtems_rfs_block_map_grow+0x188> <== NOT EXECUTED
17f30: e3570005 cmp r7, #5 <== NOT EXECUTED
17f34: 03580000 cmpeq r8, #0 <== NOT EXECUTED
17f38: 13a02000 movne r2, #0 <== NOT EXECUTED
17f3c: 03a02001 moveq r2, #1 <== NOT EXECUTED
17f40: e58d2004 str r2, [sp, #4] <== NOT EXECUTED
17f44: 1a000012 bne 17f94 <rtems_rfs_block_map_grow+0x1d4> <== NOT EXECUTED
((doubly == 0) && (singly == RTEMS_RFS_INODE_BLOCKS)))
{
bool upping;
upping = map->size.count == fs->block_map_singly_blocks;
rc = rtems_rfs_block_map_indirect_alloc (fs, map,
17f48: e5952038 ldr r2, [r5, #56] ; 0x38 <== NOT EXECUTED
17f4c: e5941008 ldr r1, [r4, #8] <== NOT EXECUTED
17f50: e0621001 rsb r1, r2, r1 <== NOT EXECUTED
17f54: e2712000 rsbs r2, r1, #0 <== NOT EXECUTED
17f58: e0a22001 adc r2, r2, r1 <== NOT EXECUTED
17f5c: e2883009 add r3, r8, #9 <== NOT EXECUTED
17f60: e58d2000 str r2, [sp] <== NOT EXECUTED
17f64: e1a00005 mov r0, r5 <== NOT EXECUTED
17f68: e1a01004 mov r1, r4 <== NOT EXECUTED
17f6c: e2842044 add r2, r4, #68 ; 0x44 <== NOT EXECUTED
17f70: e0843103 add r3, r4, r3, lsl #2 <== NOT EXECUTED
17f74: ebfffd91 bl 175c0 <rtems_rfs_block_map_indirect_alloc> <== NOT EXECUTED
&map->doubly_buffer,
&map->blocks[doubly],
upping);
if (rc > 0)
17f78: e250a000 subs sl, r0, #0 <== NOT EXECUTED
17f7c: da000013 ble 17fd0 <rtems_rfs_block_map_grow+0x210> <== NOT EXECUTED
{
rtems_rfs_group_bitmap_free (fs, false, singly_block);
17f80: e1a00005 mov r0, r5 <== NOT EXECUTED
17f84: e3a01000 mov r1, #0 <== NOT EXECUTED
17f88: e59d2010 ldr r2, [sp, #16] <== NOT EXECUTED
17f8c: ebffdde7 bl f730 <rtems_rfs_group_bitmap_free> <== NOT EXECUTED
17f90: ea00003f b 18094 <rtems_rfs_block_map_grow+0x2d4> <== NOT EXECUTED
return rc;
}
}
else
{
rc = rtems_rfs_buffer_handle_request (fs, &map->doubly_buffer,
17f94: e2888009 add r8, r8, #9 <== NOT EXECUTED
17f98: e1a00005 mov r0, r5 <== NOT EXECUTED
17f9c: e2841044 add r1, r4, #68 ; 0x44 <== NOT EXECUTED
17fa0: e7942108 ldr r2, [r4, r8, lsl #2] <== NOT EXECUTED
17fa4: e3a03001 mov r3, #1 <== NOT EXECUTED
17fa8: eb0001ef bl 1876c <rtems_rfs_buffer_handle_request> <== NOT EXECUTED
map->blocks[doubly], true);
if (rc > 0)
17fac: e250a000 subs sl, r0, #0 <== NOT EXECUTED
17fb0: da000006 ble 17fd0 <rtems_rfs_block_map_grow+0x210> <== NOT EXECUTED
{
rtems_rfs_group_bitmap_free (fs, false, singly_block);
17fb4: e59d1004 ldr r1, [sp, #4] <== NOT EXECUTED
17fb8: e1a00005 mov r0, r5 <== NOT EXECUTED
17fbc: e59d2010 ldr r2, [sp, #16] <== NOT EXECUTED
17fc0: ebffddda bl f730 <rtems_rfs_group_bitmap_free> <== NOT EXECUTED
rtems_rfs_group_bitmap_free (fs, false, block);
17fc4: e1a00005 mov r0, r5 <== NOT EXECUTED
17fc8: e59d1004 ldr r1, [sp, #4] <== NOT EXECUTED
17fcc: ea000032 b 1809c <rtems_rfs_block_map_grow+0x2dc> <== NOT EXECUTED
return rc;
}
}
rtems_rfs_block_set_number (&map->doubly_buffer,
17fd0: e594204c ldr r2, [r4, #76] ; 0x4c <== NOT EXECUTED
17fd4: e5dd1013 ldrb r1, [sp, #19] <== NOT EXECUTED
17fd8: e592201c ldr r2, [r2, #28] <== NOT EXECUTED
17fdc: e7c21107 strb r1, [r2, r7, lsl #2] <== NOT EXECUTED
17fe0: e594204c ldr r2, [r4, #76] ; 0x4c <== NOT EXECUTED
17fe4: e592201c ldr r2, [r2, #28] <== NOT EXECUTED
17fe8: e1dd11b2 ldrh r1, [sp, #18] <== NOT EXECUTED
17fec: e1a03107 lsl r3, r7, #2 <== NOT EXECUTED
17ff0: e0822003 add r2, r2, r3 <== NOT EXECUTED
17ff4: e5c21001 strb r1, [r2, #1] <== NOT EXECUTED
17ff8: e594204c ldr r2, [r4, #76] ; 0x4c <== NOT EXECUTED
17ffc: e59d1010 ldr r1, [sp, #16] <== NOT EXECUTED
18000: e592201c ldr r2, [r2, #28] <== NOT EXECUTED
18004: e1a01421 lsr r1, r1, #8 <== NOT EXECUTED
18008: e0822003 add r2, r2, r3 <== NOT EXECUTED
1800c: e5c21002 strb r1, [r2, #2] <== NOT EXECUTED
18010: e594204c ldr r2, [r4, #76] ; 0x4c <== NOT EXECUTED
18014: e592201c ldr r2, [r2, #28] <== NOT EXECUTED
18018: e0823003 add r3, r2, r3 <== NOT EXECUTED
1801c: e59d2010 ldr r2, [sp, #16] <== NOT EXECUTED
18020: e5c32003 strb r2, [r3, #3] <== NOT EXECUTED
18024: e3a03001 mov r3, #1 <== NOT EXECUTED
18028: e5c43044 strb r3, [r4, #68] ; 0x44 <== NOT EXECUTED
1802c: ea00001d b 180a8 <rtems_rfs_block_map_grow+0x2e8> <== NOT EXECUTED
singly,
singly_block);
}
else
{
rc = rtems_rfs_buffer_handle_request (fs,
18030: e2888009 add r8, r8, #9 <== NOT EXECUTED
18034: e1a00005 mov r0, r5 <== NOT EXECUTED
18038: e2841044 add r1, r4, #68 ; 0x44 <== NOT EXECUTED
1803c: e7942108 ldr r2, [r4, r8, lsl #2] <== NOT EXECUTED
18040: e3a03001 mov r3, #1 <== NOT EXECUTED
18044: eb0001c8 bl 1876c <rtems_rfs_buffer_handle_request> <== NOT EXECUTED
&map->doubly_buffer,
map->blocks[doubly],
true);
if (rc > 0)
18048: e250a000 subs sl, r0, #0 <== NOT EXECUTED
1804c: ca000010 bgt 18094 <rtems_rfs_block_map_grow+0x2d4> <== NOT EXECUTED
{
rtems_rfs_group_bitmap_free (fs, false, block);
return rc;
}
singly_block = rtems_rfs_block_get_number (&map->doubly_buffer,
18050: e594304c ldr r3, [r4, #76] ; 0x4c <== NOT EXECUTED
18054: e593101c ldr r1, [r3, #28] <== NOT EXECUTED
18058: e0813107 add r3, r1, r7, lsl #2 <== NOT EXECUTED
1805c: e5d32003 ldrb r2, [r3, #3] <== NOT EXECUTED
18060: e7d11107 ldrb r1, [r1, r7, lsl #2] <== NOT EXECUTED
18064: e1822c01 orr r2, r2, r1, lsl #24 <== NOT EXECUTED
18068: e5d31001 ldrb r1, [r3, #1] <== NOT EXECUTED
1806c: e5d33002 ldrb r3, [r3, #2] <== NOT EXECUTED
18070: e1822801 orr r2, r2, r1, lsl #16 <== NOT EXECUTED
18074: e1822403 orr r2, r2, r3, lsl #8 <== NOT EXECUTED
singly);
rc = rtems_rfs_buffer_handle_request (fs, &map->singly_buffer,
18078: e1a00005 mov r0, r5 <== NOT EXECUTED
1807c: e2841038 add r1, r4, #56 ; 0x38 <== NOT EXECUTED
18080: e3a03001 mov r3, #1 <== NOT EXECUTED
{
rtems_rfs_group_bitmap_free (fs, false, block);
return rc;
}
singly_block = rtems_rfs_block_get_number (&map->doubly_buffer,
18084: e58d2010 str r2, [sp, #16] <== NOT EXECUTED
singly);
rc = rtems_rfs_buffer_handle_request (fs, &map->singly_buffer,
18088: eb0001b7 bl 1876c <rtems_rfs_buffer_handle_request> <== NOT EXECUTED
singly_block, true);
if (rc > 0)
1808c: e250a000 subs sl, r0, #0 <== NOT EXECUTED
18090: da000004 ble 180a8 <rtems_rfs_block_map_grow+0x2e8>
{
rtems_rfs_group_bitmap_free (fs, false, block);
18094: e1a00005 mov r0, r5 <== NOT EXECUTED
18098: e3a01000 mov r1, #0 <== NOT EXECUTED
1809c: e59d200c ldr r2, [sp, #12] <== NOT EXECUTED
180a0: ebffdda2 bl f730 <rtems_rfs_group_bitmap_free> <== NOT EXECUTED
return rc;
180a4: ea000028 b 1814c <rtems_rfs_block_map_grow+0x38c> <== NOT EXECUTED
}
}
}
rtems_rfs_block_set_number (&map->singly_buffer, direct, block);
180a8: e5942040 ldr r2, [r4, #64] ; 0x40
180ac: e5dd100f ldrb r1, [sp, #15]
180b0: e592201c ldr r2, [r2, #28]
180b4: e7c21106 strb r1, [r2, r6, lsl #2]
180b8: e5942040 ldr r2, [r4, #64] ; 0x40
180bc: e592201c ldr r2, [r2, #28]
180c0: e1dd10be ldrh r1, [sp, #14]
180c4: e1a03106 lsl r3, r6, #2
180c8: e0822003 add r2, r2, r3
180cc: e5c21001 strb r1, [r2, #1]
180d0: e5942040 ldr r2, [r4, #64] ; 0x40
180d4: e59d100c ldr r1, [sp, #12]
180d8: e592201c ldr r2, [r2, #28]
180dc: e1a01421 lsr r1, r1, #8
180e0: e0822003 add r2, r2, r3
180e4: e5c21002 strb r1, [r2, #2]
180e8: e5942040 ldr r2, [r4, #64] ; 0x40
180ec: e592201c ldr r2, [r2, #28]
180f0: e0823003 add r3, r2, r3
180f4: e59d200c ldr r2, [sp, #12]
180f8: e5c32003 strb r2, [r3, #3]
180fc: e3a02001 mov r2, #1
18100: e5c42038 strb r2, [r4, #56] ; 0x38
}
map->size.count++;
18104: e5943008 ldr r3, [r4, #8]
18108: e2833001 add r3, r3, #1
1810c: e5843008 str r3, [r4, #8]
map->size.offset = 0;
18110: e3a03000 mov r3, #0
if (b == 0)
18114: e1590003 cmp r9, r3
rtems_rfs_block_set_number (&map->singly_buffer, direct, block);
}
map->size.count++;
map->size.offset = 0;
18118: e584300c str r3, [r4, #12]
if (b == 0)
*new_block = block;
1811c: 059d2008 ldreq r2, [sp, #8]
18120: e59d300c ldr r3, [sp, #12]
18124: 05823000 streq r3, [r2]
map->last_data_block = block;
18128: e5843020 str r3, [r4, #32]
map->dirty = true;
1812c: e3a03001 mov r3, #1
18130: e5c43000 strb r3, [r4]
/*
* Allocate a block at a time. The buffer handles hold the blocks so adding
* this way does not thrash the cache with lots of requests.
*/
for (b = 0; b < blocks; b++)
18134: e2899001 add r9, r9, #1
18138: e159000b cmp r9, fp
1813c: 1affff34 bne 17e14 <rtems_rfs_block_map_grow+0x54>
*new_block = block;
map->last_data_block = block;
map->dirty = true;
}
return 0;
18140: e3a0a000 mov sl, #0
18144: ea000000 b 1814c <rtems_rfs_block_map_grow+0x38c>
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_GROW))
printf ("rtems-rfs: block-map-grow: entry: blocks=%zd count=%" PRIu32 "\n",
blocks, map->size.count);
if ((map->size.count + blocks) >= rtems_rfs_fs_max_block_map_blocks (fs))
return EFBIG;
18148: e3a0a01b mov sl, #27 <== NOT EXECUTED
map->last_data_block = block;
map->dirty = true;
}
return 0;
}
1814c: e1a0000a mov r0, sl
18150: e28dd014 add sp, sp, #20
18154: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
000175c0 <rtems_rfs_block_map_indirect_alloc>:
rtems_rfs_block_map_indirect_alloc (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
rtems_rfs_buffer_handle* buffer,
rtems_rfs_block_no* block,
bool upping)
{
175c0: e92d45f1 push {r0, r4, r5, r6, r7, r8, sl, lr}
175c4: e1a05001 mov r5, r1
175c8: e1a04002 mov r4, r2
175cc: e1a08003 mov r8, r3
int rc;
/*
* Save the new block locally because upping can have *block pointing to the
* slots which are cleared when upping.
*/
rc = rtems_rfs_group_bitmap_alloc (fs, map->last_map_block, false, &new_block);
175d0: e591101c ldr r1, [r1, #28]
175d4: e3a02000 mov r2, #0
175d8: e1a0300d mov r3, sp
rtems_rfs_block_map_indirect_alloc (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
rtems_rfs_buffer_handle* buffer,
rtems_rfs_block_no* block,
bool upping)
{
175dc: e1a06000 mov r6, r0
175e0: e5dd7020 ldrb r7, [sp, #32]
int rc;
/*
* Save the new block locally because upping can have *block pointing to the
* slots which are cleared when upping.
*/
rc = rtems_rfs_group_bitmap_alloc (fs, map->last_map_block, false, &new_block);
175e4: ebffdfde bl f564 <rtems_rfs_group_bitmap_alloc>
if (rc > 0)
175e8: e250a000 subs sl, r0, #0
175ec: ca00003e bgt 176ec <rtems_rfs_block_map_indirect_alloc+0x12c>
return rc;
rc = rtems_rfs_buffer_handle_request (fs, buffer, new_block, false);
175f0: e1a00006 mov r0, r6
175f4: e1a01004 mov r1, r4
175f8: e59d2000 ldr r2, [sp]
175fc: e3a03000 mov r3, #0
17600: eb000459 bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
17604: e250a000 subs sl, r0, #0
17608: da000004 ble 17620 <rtems_rfs_block_map_indirect_alloc+0x60>
{
rtems_rfs_group_bitmap_free (fs, false, new_block);
1760c: e1a00006 mov r0, r6 <== NOT EXECUTED
17610: e3a01000 mov r1, #0 <== NOT EXECUTED
17614: e59d2000 ldr r2, [sp] <== NOT EXECUTED
17618: ebffe044 bl f730 <rtems_rfs_group_bitmap_free> <== NOT EXECUTED
return rc;
1761c: ea000032 b 176ec <rtems_rfs_block_map_indirect_alloc+0x12c><== NOT EXECUTED
}
memset (rtems_rfs_buffer_data (buffer), 0xff, rtems_rfs_fs_block_size (fs));
17620: e5943008 ldr r3, [r4, #8]
17624: e3a010ff mov r1, #255 ; 0xff
17628: e593001c ldr r0, [r3, #28]
1762c: e5962008 ldr r2, [r6, #8]
17630: eb001c8c bl 1e868 <memset>
if (upping)
17634: e3570000 cmp r7, #0
17638: 0a000025 beq 176d4 <rtems_rfs_block_map_indirect_alloc+0x114>
{
int b;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_GROW))
1763c: e3a00a02 mov r0, #8192 ; 0x2000
17640: e3a01000 mov r1, #0
17644: ebffe708 bl 1126c <rtems_rfs_trace>
17648: e3500000 cmp r0, #0
printf ("rtems-rfs: block-map-grow: upping: block-count=%" PRId32 "\n",
1764c: 159f00a0 ldrne r0, [pc, #160] ; 176f4 <rtems_rfs_block_map_indirect_alloc+0x134>
17650: 15951008 ldrne r1, [r5, #8]
17654: 1b001cf4 blne 1ea2c <printf>
17658: e1a03005 mov r3, r5
rtems_rfs_block_map_indirect_alloc (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
rtems_rfs_buffer_handle* buffer,
rtems_rfs_block_no* block,
bool upping)
{
1765c: e3a02000 mov r2, #0
int b;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_GROW))
printf ("rtems-rfs: block-map-grow: upping: block-count=%" PRId32 "\n",
map->size.count);
for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++)
rtems_rfs_block_set_number (buffer, b, map->blocks[b]);
17660: e3a01001 mov r1, #1
17664: e5940008 ldr r0, [r4, #8]
17668: e5d3c027 ldrb ip, [r3, #39] ; 0x27
1766c: e590001c ldr r0, [r0, #28]
17670: e7c0c002 strb ip, [r0, r2]
17674: e5940008 ldr r0, [r4, #8]
17678: e590001c ldr r0, [r0, #28]
1767c: e1d3c2b6 ldrh ip, [r3, #38] ; 0x26
17680: e0800002 add r0, r0, r2
17684: e5c0c001 strb ip, [r0, #1]
17688: e5940008 ldr r0, [r4, #8]
1768c: e593c024 ldr ip, [r3, #36] ; 0x24
17690: e590001c ldr r0, [r0, #28]
17694: e1a0c42c lsr ip, ip, #8
17698: e0800002 add r0, r0, r2
1769c: e5c0c002 strb ip, [r0, #2]
176a0: e5940008 ldr r0, [r4, #8]
176a4: e590001c ldr r0, [r0, #28]
176a8: e593c024 ldr ip, [r3, #36] ; 0x24
176ac: e0800002 add r0, r0, r2
176b0: e2822004 add r2, r2, #4
{
int b;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_GROW))
printf ("rtems-rfs: block-map-grow: upping: block-count=%" PRId32 "\n",
map->size.count);
for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++)
176b4: e3520014 cmp r2, #20
rtems_rfs_block_set_number (buffer, b, map->blocks[b]);
176b8: e5c0c003 strb ip, [r0, #3]
176bc: e2833004 add r3, r3, #4
176c0: e5c41000 strb r1, [r4]
{
int b;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_GROW))
printf ("rtems-rfs: block-map-grow: upping: block-count=%" PRId32 "\n",
map->size.count);
for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++)
176c4: 1affffe6 bne 17664 <rtems_rfs_block_map_indirect_alloc+0xa4>
rtems_rfs_block_set_number (buffer, b, map->blocks[b]);
memset (map->blocks, 0, sizeof (map->blocks));
176c8: e2850024 add r0, r5, #36 ; 0x24
176cc: e3a01000 mov r1, #0
176d0: eb001c64 bl 1e868 <memset>
}
rtems_rfs_buffer_mark_dirty (buffer);
176d4: e3a03001 mov r3, #1
176d8: e5c43000 strb r3, [r4]
*block = new_block;
176dc: e59d3000 ldr r3, [sp]
176e0: e5883000 str r3, [r8]
map->last_map_block = new_block;
176e4: e585301c str r3, [r5, #28]
return 0;
176e8: e3a0a000 mov sl, #0
}
176ec: e1a0000a mov r0, sl
176f0: e8bd85f8 pop {r3, r4, r5, r6, r7, r8, sl, pc}
00017898 <rtems_rfs_block_map_open>:
int
rtems_rfs_block_map_open (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* inode,
rtems_rfs_block_map* map)
{
17898: e92d41f0 push {r4, r5, r6, r7, r8, lr}
* Set the count to 0 so at least find fails, then open the handle and make
* sure the inode has been loaded into memory. If we did not load the inode
* do not unload it. The caller may assume it is still loaded when we return.
*/
map->dirty = false;
1789c: e3a07000 mov r7, #0
178a0: e5c27000 strb r7, [r2]
map->inode = NULL;
178a4: e5827004 str r7, [r2, #4]
* @param size A pointer to the block size.
*/
static inline void
rtems_rfs_block_set_size_zero (rtems_rfs_block_size* size)
{
size->count = 0;
178a8: e5827008 str r7, [r2, #8]
size->offset = 0;
178ac: e582700c str r7, [r2, #12]
* @param bpos A pointer to the block position.
*/
static inline void
rtems_rfs_block_set_bpos_zero (rtems_rfs_block_pos* bpos)
{
bpos->bno = 0;
178b0: e5827010 str r7, [r2, #16]
bpos->boff = 0;
178b4: e5827014 str r7, [r2, #20]
bpos->block = 0;
178b8: e5827018 str r7, [r2, #24]
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
178bc: e5c27038 strb r7, [r2, #56] ; 0x38
handle->bnum = 0;
178c0: e582703c str r7, [r2, #60] ; 0x3c
handle->buffer = NULL;
178c4: e5827040 str r7, [r2, #64] ; 0x40
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
178c8: e5c27044 strb r7, [r2, #68] ; 0x44
handle->bnum = 0;
178cc: e5827048 str r7, [r2, #72] ; 0x48
handle->buffer = NULL;
178d0: e582704c str r7, [r2, #76] ; 0x4c
int
rtems_rfs_block_map_open (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* inode,
rtems_rfs_block_map* map)
{
178d4: e1a05000 mov r5, r0
178d8: e1a04001 mov r4, r1
178dc: e1a06002 mov r6, r2
return rc;
rc = rtems_rfs_buffer_handle_open (fs, &map->doubly_buffer);
if (rc > 0)
return rc;
rc = rtems_rfs_inode_load (fs, inode);
178e0: ebffe02a bl f990 <rtems_rfs_inode_load>
if (rc > 0)
178e4: e2508000 subs r8, r0, #0
178e8: da00000d ble 17924 <rtems_rfs_block_map_open+0x8c>
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
178ec: e2861038 add r1, r6, #56 ; 0x38 <== NOT EXECUTED
178f0: e1a00005 mov r0, r5 <== NOT EXECUTED
178f4: eb000330 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
handle->dirty = false;
178f8: e5c67038 strb r7, [r6, #56] ; 0x38 <== NOT EXECUTED
handle->bnum = 0;
178fc: e586703c str r7, [r6, #60] ; 0x3c <== NOT EXECUTED
handle->buffer = NULL;
17900: e5867040 str r7, [r6, #64] ; 0x40 <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
17904: e1a00005 mov r0, r5 <== NOT EXECUTED
17908: e2861044 add r1, r6, #68 ; 0x44 <== NOT EXECUTED
1790c: eb00032a bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
handle->dirty = false;
17910: e5c67044 strb r7, [r6, #68] ; 0x44 <== NOT EXECUTED
handle->bnum = 0;
17914: e5867048 str r7, [r6, #72] ; 0x48 <== NOT EXECUTED
handle->buffer = NULL;
17918: e586704c str r7, [r6, #76] ; 0x4c <== NOT EXECUTED
map->last_data_block = rtems_rfs_inode_get_last_data_block (inode);
rc = rtems_rfs_inode_unload (fs, inode, false);
return rc;
}
1791c: e1a00008 mov r0, r8 <== NOT EXECUTED
17920: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
* @return uint32_t The block number.
*/
static inline uint32_t
rtems_rfs_inode_get_block (rtems_rfs_inode_handle* handle, int block)
{
return rtems_rfs_read_u32 (&handle->node->data.blocks[block]);
17924: e594300c ldr r3, [r4, #12]
/*
* Extract the block and block count data from the inode into the targets
* byte order.
*/
map->inode = inode;
17928: e5864004 str r4, [r6, #4]
1792c: e283201c add r2, r3, #28
17930: e1a01006 mov r1, r6
17934: e287c007 add ip, r7, #7
17938: e5d20003 ldrb r0, [r2, #3]
1793c: e7d3c10c ldrb ip, [r3, ip, lsl #2]
17940: e1800c0c orr r0, r0, ip, lsl #24
17944: e5d2c001 ldrb ip, [r2, #1]
17948: e180080c orr r0, r0, ip, lsl #16
1794c: e5d2c002 ldrb ip, [r2, #2]
for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++)
17950: e2877001 add r7, r7, #1
17954: e180040c orr r0, r0, ip, lsl #8
17958: e3570005 cmp r7, #5
map->blocks[b] = rtems_rfs_inode_get_block (inode, b);
1795c: e5810024 str r0, [r1, #36] ; 0x24
/*
* Extract the block and block count data from the inode into the targets
* byte order.
*/
map->inode = inode;
for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++)
17960: e2822004 add r2, r2, #4
17964: e2811004 add r1, r1, #4
17968: 1afffff1 bne 17934 <rtems_rfs_block_map_open+0x9c>
* @return uint32_t The block count.
*/
static inline uint32_t
rtems_rfs_inode_get_block_count (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->block_count);
1796c: e5d3200d ldrb r2, [r3, #13]
17970: e5d3100c ldrb r1, [r3, #12]
17974: e1a02802 lsl r2, r2, #16
17978: e1822c01 orr r2, r2, r1, lsl #24
1797c: e5d3100f ldrb r1, [r3, #15]
17980: e1822001 orr r2, r2, r1
17984: e5d3100e ldrb r1, [r3, #14]
17988: e1822401 orr r2, r2, r1, lsl #8
map->blocks[b] = rtems_rfs_inode_get_block (inode, b);
map->size.count = rtems_rfs_inode_get_block_count (inode);
1798c: e5862008 str r2, [r6, #8]
* @return uint32_t The block offset.
*/
static inline uint16_t
rtems_rfs_inode_get_block_offset (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->block_offset);
17990: e5d3100a ldrb r1, [r3, #10]
17994: e5d3200b ldrb r2, [r3, #11]
map->size.offset = rtems_rfs_inode_get_block_offset (inode);
17998: e1822401 orr r2, r2, r1, lsl #8
1799c: e586200c str r2, [r6, #12]
* @return uint32_t The last map block number.
*/
static inline uint32_t
rtems_rfs_inode_get_last_map_block (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->last_map_block);
179a0: e5d32031 ldrb r2, [r3, #49] ; 0x31
179a4: e5d31030 ldrb r1, [r3, #48] ; 0x30
179a8: e1a02802 lsl r2, r2, #16
179ac: e1822c01 orr r2, r2, r1, lsl #24
179b0: e5d31033 ldrb r1, [r3, #51] ; 0x33
179b4: e1822001 orr r2, r2, r1
179b8: e5d31032 ldrb r1, [r3, #50] ; 0x32
179bc: e1822401 orr r2, r2, r1, lsl #8
map->last_map_block = rtems_rfs_inode_get_last_map_block (inode);
179c0: e586201c str r2, [r6, #28]
* @return uint32_t The last data block number.
*/
static inline uint32_t
rtems_rfs_inode_get_last_data_block (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->last_data_block);
179c4: e5d32035 ldrb r2, [r3, #53] ; 0x35
179c8: e5d31034 ldrb r1, [r3, #52] ; 0x34
179cc: e1a02802 lsl r2, r2, #16
179d0: e1822c01 orr r2, r2, r1, lsl #24
179d4: e5d31037 ldrb r1, [r3, #55] ; 0x37
179d8: e5d33036 ldrb r3, [r3, #54] ; 0x36
179dc: e1822001 orr r2, r2, r1
179e0: e1823403 orr r3, r2, r3, lsl #8
map->last_data_block = rtems_rfs_inode_get_last_data_block (inode);
rc = rtems_rfs_inode_unload (fs, inode, false);
179e4: e1a00005 mov r0, r5
179e8: e1a01004 mov r1, r4
179ec: e3a02000 mov r2, #0
for (b = 0; b < RTEMS_RFS_INODE_BLOCKS; b++)
map->blocks[b] = rtems_rfs_inode_get_block (inode, b);
map->size.count = rtems_rfs_inode_get_block_count (inode);
map->size.offset = rtems_rfs_inode_get_block_offset (inode);
map->last_map_block = rtems_rfs_inode_get_last_map_block (inode);
map->last_data_block = rtems_rfs_inode_get_last_data_block (inode);
179f0: e5863020 str r3, [r6, #32]
rc = rtems_rfs_inode_unload (fs, inode, false);
return rc;
}
179f4: e8bd41f0 pop {r4, r5, r6, r7, r8, lr}
map->size.count = rtems_rfs_inode_get_block_count (inode);
map->size.offset = rtems_rfs_inode_get_block_offset (inode);
map->last_map_block = rtems_rfs_inode_get_last_map_block (inode);
map->last_data_block = rtems_rfs_inode_get_last_data_block (inode);
rc = rtems_rfs_inode_unload (fs, inode, false);
179f8: eaffe047 b fb1c <rtems_rfs_inode_unload>
0001815c <rtems_rfs_block_map_shrink>:
int
rtems_rfs_block_map_shrink (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
size_t blocks)
{
1815c: e92d4fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
18160: e1a05000 mov r5, r0
18164: e1a04001 mov r4, r1
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_SHRINK))
18168: e3a00901 mov r0, #16384 ; 0x4000
1816c: e3a01000 mov r1, #0
int
rtems_rfs_block_map_shrink (rtems_rfs_file_system* fs,
rtems_rfs_block_map* map,
size_t blocks)
{
18170: e1a06002 mov r6, r2
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_SHRINK))
18174: ebffe43c bl 1126c <rtems_rfs_trace>
18178: e3500000 cmp r0, #0
printf ("rtems-rfs: block-map-shrink: entry: blocks=%zd count=%" PRIu32 "\n",
1817c: 159f02bc ldrne r0, [pc, #700] ; 18440 <rtems_rfs_block_map_shrink+0x2e4>
18180: 11a01006 movne r1, r6
18184: 15942008 ldrne r2, [r4, #8]
18188: 1b001a27 blne 1ea2c <printf>
blocks, map->size.count);
if (map->size.count == 0)
1818c: e5940008 ldr r0, [r4, #8]
18190: e3500000 cmp r0, #0
18194: 0a0000a7 beq 18438 <rtems_rfs_block_map_shrink+0x2dc>
rtems_rfs_block_no doubly_singly;
doubly = singly / fs->blocks_per_block;
doubly_singly = singly % fs->blocks_per_block;
rc = rtems_rfs_buffer_handle_request (fs, &map->doubly_buffer,
18198: e2842044 add r2, r4, #68 ; 0x44
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BLOCK_MAP_SHRINK))
printf ("rtems-rfs: block-map-shrink: entry: blocks=%zd count=%" PRIu32 "\n",
blocks, map->size.count);
if (map->size.count == 0)
1819c: e1560000 cmp r6, r0
181a0: 31a09006 movcc r9, r6
181a4: 21a09000 movcs r9, r0
rtems_rfs_block_no doubly_singly;
doubly = singly / fs->blocks_per_block;
doubly_singly = singly % fs->blocks_per_block;
rc = rtems_rfs_buffer_handle_request (fs, &map->doubly_buffer,
181a8: e58d200c str r2, [sp, #12]
doubly_singly);
/*
* Read the singly indirect table and get the block number.
*/
rc = rtems_rfs_buffer_handle_request (fs, &map->singly_buffer,
181ac: e284b038 add fp, r4, #56 ; 0x38
181b0: ea00007f b 183b4 <rtems_rfs_block_map_shrink+0x258>
{
rtems_rfs_block_no block;
rtems_rfs_block_no block_to_free;
int rc;
block = map->size.count - 1;
181b4: e5943008 ldr r3, [r4, #8]
181b8: e243a001 sub sl, r3, #1
if (block < RTEMS_RFS_INODE_BLOCKS)
181bc: e35a0004 cmp sl, #4
{
/*
* We have less than RTEMS_RFS_INODE_BLOCKS so they are held in the
* inode.
*/
block_to_free = map->blocks[block];
181c0: 92833008 addls r3, r3, #8
map->blocks[block] = 0;
181c4: 93a02000 movls r2, #0
{
/*
* We have less than RTEMS_RFS_INODE_BLOCKS so they are held in the
* inode.
*/
block_to_free = map->blocks[block];
181c8: 97947103 ldrls r7, [r4, r3, lsl #2]
map->blocks[block] = 0;
181cc: 97842103 strls r2, [r4, r3, lsl #2]
181d0: 9a000068 bls 18378 <rtems_rfs_block_map_shrink+0x21c>
* table of block numbers.
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = block % fs->blocks_per_block;
181d4: e5957034 ldr r7, [r5, #52] ; 0x34
181d8: e1a0000a mov r0, sl
181dc: e1a01007 mov r1, r7
181e0: eb004b84 bl 2aff8 <__umodsi3>
singly = block / fs->blocks_per_block;
181e4: e1a01007 mov r1, r7
* table of block numbers.
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = block % fs->blocks_per_block;
181e8: e1a06000 mov r6, r0
singly = block / fs->blocks_per_block;
181ec: e1a0000a mov r0, sl
181f0: ebffa5d2 bl 1940 <__aeabi_uidiv>
if (block < fs->block_map_singly_blocks)
181f4: e5953038 ldr r3, [r5, #56] ; 0x38
181f8: e15a0003 cmp sl, r3
*/
rtems_rfs_block_no direct;
rtems_rfs_block_no singly;
direct = block % fs->blocks_per_block;
singly = block / fs->blocks_per_block;
181fc: e1a08000 mov r8, r0
if (block < fs->block_map_singly_blocks)
18200: 2a00001e bcs 18280 <rtems_rfs_block_map_shrink+0x124>
{
/*
* Request the indirect block and then obtain the block number from the
* indirect block.
*/
rc = rtems_rfs_buffer_handle_request (fs, &map->singly_buffer,
18204: e2803009 add r3, r0, #9
18208: e7942103 ldr r2, [r4, r3, lsl #2]
1820c: e1a00005 mov r0, r5
18210: e1a0100b mov r1, fp
18214: e3a03001 mov r3, #1
18218: eb000153 bl 1876c <rtems_rfs_buffer_handle_request>
map->blocks[singly], true);
if (rc > 0)
1821c: e3500000 cmp r0, #0
18220: ca000084 bgt 18438 <rtems_rfs_block_map_shrink+0x2dc>
return rc;
block_to_free = rtems_rfs_block_get_number (&map->singly_buffer,
18224: e5943040 ldr r3, [r4, #64] ; 0x40
18228: e593301c ldr r3, [r3, #28]
1822c: e7d37106 ldrb r7, [r3, r6, lsl #2]
18230: e0833106 add r3, r3, r6, lsl #2
18234: e5d32002 ldrb r2, [r3, #2]
18238: e5d3c001 ldrb ip, [r3, #1]
1823c: e5d3a003 ldrb sl, [r3, #3]
18240: e58d2008 str r2, [sp, #8]
direct);
rc = rtems_rfs_block_map_indirect_shrink (fs, map, &map->singly_buffer,
18244: e1a00005 mov r0, r5
18248: e1a01004 mov r1, r4
1824c: e1a0200b mov r2, fp
18250: e1a03008 mov r3, r8
18254: e58dc004 str ip, [sp, #4]
18258: e58d6000 str r6, [sp]
1825c: ebfffcac bl 17514 <rtems_rfs_block_map_indirect_shrink>
singly, direct);
if (rc)
18260: e3500000 cmp r0, #0
18264: e59dc004 ldr ip, [sp, #4]
18268: 1a000072 bne 18438 <rtems_rfs_block_map_shrink+0x2dc>
rc = rtems_rfs_buffer_handle_request (fs, &map->singly_buffer,
map->blocks[singly], true);
if (rc > 0)
return rc;
block_to_free = rtems_rfs_block_get_number (&map->singly_buffer,
1826c: e18a7c07 orr r7, sl, r7, lsl #24
18270: e59d3008 ldr r3, [sp, #8]
18274: e187780c orr r7, r7, ip, lsl #16
18278: e1877403 orr r7, r7, r3, lsl #8
1827c: ea00003d b 18378 <rtems_rfs_block_map_shrink+0x21c>
rc = rtems_rfs_block_map_indirect_shrink (fs, map, &map->singly_buffer,
singly, direct);
if (rc)
return rc;
}
else if (block < fs->block_map_doubly_blocks)
18280: e595303c ldr r3, [r5, #60] ; 0x3c <== NOT EXECUTED
18284: e15a0003 cmp sl, r3 <== NOT EXECUTED
18288: 2a00004b bcs 183bc <rtems_rfs_block_map_shrink+0x260> <== NOT EXECUTED
* value is still valid for doubly indirect tables.
*/
rtems_rfs_block_no doubly;
rtems_rfs_block_no doubly_singly;
doubly = singly / fs->blocks_per_block;
1828c: e1a01007 mov r1, r7 <== NOT EXECUTED
18290: ebffa5aa bl 1940 <__aeabi_uidiv> <== NOT EXECUTED
doubly_singly = singly % fs->blocks_per_block;
rc = rtems_rfs_buffer_handle_request (fs, &map->doubly_buffer,
18294: e2803009 add r3, r0, #9 <== NOT EXECUTED
* value is still valid for doubly indirect tables.
*/
rtems_rfs_block_no doubly;
rtems_rfs_block_no doubly_singly;
doubly = singly / fs->blocks_per_block;
18298: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
doubly_singly = singly % fs->blocks_per_block;
rc = rtems_rfs_buffer_handle_request (fs, &map->doubly_buffer,
1829c: e7942103 ldr r2, [r4, r3, lsl #2] <== NOT EXECUTED
182a0: e1a00005 mov r0, r5 <== NOT EXECUTED
182a4: e59d100c ldr r1, [sp, #12] <== NOT EXECUTED
182a8: e3a03001 mov r3, #1 <== NOT EXECUTED
182ac: eb00012e bl 1876c <rtems_rfs_buffer_handle_request> <== NOT EXECUTED
map->blocks[doubly], true);
if (rc > 0)
182b0: e3500000 cmp r0, #0 <== NOT EXECUTED
182b4: ca00005f bgt 18438 <rtems_rfs_block_map_shrink+0x2dc> <== NOT EXECUTED
*/
rtems_rfs_block_no doubly;
rtems_rfs_block_no doubly_singly;
doubly = singly / fs->blocks_per_block;
doubly_singly = singly % fs->blocks_per_block;
182b8: e1a00008 mov r0, r8 <== NOT EXECUTED
182bc: e1a01007 mov r1, r7 <== NOT EXECUTED
182c0: eb004b4c bl 2aff8 <__umodsi3> <== NOT EXECUTED
rc = rtems_rfs_buffer_handle_request (fs, &map->doubly_buffer,
map->blocks[doubly], true);
if (rc > 0)
return rc;
singly = rtems_rfs_block_get_number (&map->doubly_buffer,
182c4: e594304c ldr r3, [r4, #76] ; 0x4c <== NOT EXECUTED
182c8: e593201c ldr r2, [r3, #28] <== NOT EXECUTED
182cc: e0823100 add r3, r2, r0, lsl #2 <== NOT EXECUTED
182d0: e5d31003 ldrb r1, [r3, #3] <== NOT EXECUTED
182d4: e7d28100 ldrb r8, [r2, r0, lsl #2] <== NOT EXECUTED
182d8: e5d32001 ldrb r2, [r3, #1] <== NOT EXECUTED
182dc: e1818c08 orr r8, r1, r8, lsl #24 <== NOT EXECUTED
182e0: e5d33002 ldrb r3, [r3, #2] <== NOT EXECUTED
182e4: e1888802 orr r8, r8, r2, lsl #16 <== NOT EXECUTED
182e8: e1888403 orr r8, r8, r3, lsl #8 <== NOT EXECUTED
*/
rtems_rfs_block_no doubly;
rtems_rfs_block_no doubly_singly;
doubly = singly / fs->blocks_per_block;
doubly_singly = singly % fs->blocks_per_block;
182ec: e1a0a000 mov sl, r0 <== NOT EXECUTED
doubly_singly);
/*
* Read the singly indirect table and get the block number.
*/
rc = rtems_rfs_buffer_handle_request (fs, &map->singly_buffer,
182f0: e1a0100b mov r1, fp <== NOT EXECUTED
182f4: e1a00005 mov r0, r5 <== NOT EXECUTED
182f8: e1a02008 mov r2, r8 <== NOT EXECUTED
182fc: e3a03001 mov r3, #1 <== NOT EXECUTED
18300: eb000119 bl 1876c <rtems_rfs_buffer_handle_request> <== NOT EXECUTED
singly, true);
if (rc > 0)
18304: e3500000 cmp r0, #0 <== NOT EXECUTED
18308: ca00004a bgt 18438 <rtems_rfs_block_map_shrink+0x2dc> <== NOT EXECUTED
return rc;
block_to_free = rtems_rfs_block_get_number (&map->singly_buffer,
1830c: e5943040 ldr r3, [r4, #64] ; 0x40 <== NOT EXECUTED
18310: e593201c ldr r2, [r3, #28] <== NOT EXECUTED
18314: e0823106 add r3, r2, r6, lsl #2 <== NOT EXECUTED
18318: e5d31003 ldrb r1, [r3, #3] <== NOT EXECUTED
1831c: e7d27106 ldrb r7, [r2, r6, lsl #2] <== NOT EXECUTED
18320: e5d32001 ldrb r2, [r3, #1] <== NOT EXECUTED
18324: e1817c07 orr r7, r1, r7, lsl #24 <== NOT EXECUTED
18328: e5d33002 ldrb r3, [r3, #2] <== NOT EXECUTED
1832c: e1877802 orr r7, r7, r2, lsl #16 <== NOT EXECUTED
direct);
if (direct == 0)
18330: e3560000 cmp r6, #0 <== NOT EXECUTED
rc = rtems_rfs_buffer_handle_request (fs, &map->singly_buffer,
singly, true);
if (rc > 0)
return rc;
block_to_free = rtems_rfs_block_get_number (&map->singly_buffer,
18334: e1877403 orr r7, r7, r3, lsl #8 <== NOT EXECUTED
direct);
if (direct == 0)
18338: 1a00000e bne 18378 <rtems_rfs_block_map_shrink+0x21c> <== NOT EXECUTED
{
rc = rtems_rfs_group_bitmap_free (fs, false, singly);
1833c: e1a00005 mov r0, r5 <== NOT EXECUTED
18340: e1a01006 mov r1, r6 <== NOT EXECUTED
18344: e1a02008 mov r2, r8 <== NOT EXECUTED
18348: ebffdcf8 bl f730 <rtems_rfs_group_bitmap_free> <== NOT EXECUTED
if (rc > 0)
1834c: e3500000 cmp r0, #0 <== NOT EXECUTED
18350: ca000038 bgt 18438 <rtems_rfs_block_map_shrink+0x2dc> <== NOT EXECUTED
return rc;
map->last_map_block = singly;
18354: e584801c str r8, [r4, #28] <== NOT EXECUTED
rc = rtems_rfs_block_map_indirect_shrink (fs, map, &map->doubly_buffer,
18358: e1a00005 mov r0, r5 <== NOT EXECUTED
1835c: e1a01004 mov r1, r4 <== NOT EXECUTED
18360: e59d200c ldr r2, [sp, #12] <== NOT EXECUTED
18364: e59d3008 ldr r3, [sp, #8] <== NOT EXECUTED
18368: e58da000 str sl, [sp] <== NOT EXECUTED
1836c: ebfffc68 bl 17514 <rtems_rfs_block_map_indirect_shrink> <== NOT EXECUTED
doubly, doubly_singly);
if (rc)
18370: e3500000 cmp r0, #0 <== NOT EXECUTED
18374: 1a00002f bne 18438 <rtems_rfs_block_map_shrink+0x2dc> <== NOT EXECUTED
{
rc = EIO;
break;
}
}
rc = rtems_rfs_group_bitmap_free (fs, false, block_to_free);
18378: e1a00005 mov r0, r5
1837c: e3a01000 mov r1, #0
18380: e1a02007 mov r2, r7
18384: ebffdce9 bl f730 <rtems_rfs_group_bitmap_free>
if (rc > 0)
18388: e3500000 cmp r0, #0
1838c: ca000029 bgt 18438 <rtems_rfs_block_map_shrink+0x2dc>
return rc;
map->size.count--;
18390: e5943008 ldr r3, [r4, #8]
18394: e2433001 sub r3, r3, #1
18398: e5843008 str r3, [r4, #8]
map->size.offset = 0;
1839c: e3a02000 mov r2, #0
map->last_data_block = block_to_free;
map->dirty = true;
183a0: e3a03001 mov r3, #1
}
rc = rtems_rfs_group_bitmap_free (fs, false, block_to_free);
if (rc > 0)
return rc;
map->size.count--;
map->size.offset = 0;
183a4: e584200c str r2, [r4, #12]
map->last_data_block = block_to_free;
183a8: e5847020 str r7, [r4, #32]
map->dirty = true;
183ac: e5c43000 strb r3, [r4]
blocks--;
183b0: e2499001 sub r9, r9, #1
return 0;
if (blocks > map->size.count)
blocks = map->size.count;
while (blocks)
183b4: e3590000 cmp r9, #0
183b8: 1affff7d bne 181b4 <rtems_rfs_block_map_shrink+0x58>
map->last_data_block = block_to_free;
map->dirty = true;
blocks--;
}
if (map->size.count == 0)
183bc: e5943008 ldr r3, [r4, #8]
}
/*
* Keep the position inside the map.
*/
if (rtems_rfs_block_pos_past_end (&map->bpos, &map->size))
183c0: e5942010 ldr r2, [r4, #16]
map->last_data_block = block_to_free;
map->dirty = true;
blocks--;
}
if (map->size.count == 0)
183c4: e3530000 cmp r3, #0
{
map->last_map_block = 0;
183c8: 0584301c streq r3, [r4, #28]
map->last_data_block = 0;
183cc: 05843020 streq r3, [r4, #32]
}
/*
* Keep the position inside the map.
*/
if (rtems_rfs_block_pos_past_end (&map->bpos, &map->size))
183d0: e3520000 cmp r2, #0
183d4: 0a000001 beq 183e0 <rtems_rfs_block_map_shrink+0x284>
183d8: e3530000 cmp r3, #0
183dc: 0a000008 beq 18404 <rtems_rfs_block_map_shrink+0x2a8>
183e0: e1520003 cmp r2, r3
183e4: 2a000006 bcs 18404 <rtems_rfs_block_map_shrink+0x2a8>
183e8: e2431001 sub r1, r3, #1
183ec: e1520001 cmp r2, r1
183f0: 1a00000d bne 1842c <rtems_rfs_block_map_shrink+0x2d0>
183f4: e5941014 ldr r1, [r4, #20]
183f8: e594200c ldr r2, [r4, #12]
183fc: e1510002 cmp r1, r2
18400: 9a000009 bls 1842c <rtems_rfs_block_map_shrink+0x2d0>
rtems_rfs_block_size_get_bpos (&map->size, &map->bpos);
18404: e594200c ldr r2, [r4, #12]
18408: e3a00000 mov r0, #0
1840c: e1520000 cmp r2, r0
18410: e5843010 str r3, [r4, #16]
18414: 12433001 subne r3, r3, #1
18418: e5842014 str r2, [r4, #20]
1841c: e5840018 str r0, [r4, #24]
18420: 15843010 strne r3, [r4, #16]
18424: 1a000003 bne 18438 <rtems_rfs_block_map_shrink+0x2dc>
18428: ea000001 b 18434 <rtems_rfs_block_map_shrink+0x2d8>
return 0;
1842c: e3a00000 mov r0, #0 <== NOT EXECUTED
18430: ea000000 b 18438 <rtems_rfs_block_map_shrink+0x2dc> <== NOT EXECUTED
18434: e1a00002 mov r0, r2
}
18438: e28dd010 add sp, sp, #16
1843c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0001d29c <rtems_rfs_buffer_bdbuf_release>:
int
rtems_rfs_buffer_bdbuf_release (rtems_rfs_buffer* buffer,
bool modified)
{
1d29c: e92d4030 push {r4, r5, lr}
1d2a0: e1a04000 mov r4, r0
1d2a4: e20150ff and r5, r1, #255 ; 0xff
rtems_status_code sc;
int rc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_RELEASE))
1d2a8: e3a00040 mov r0, #64 ; 0x40
1d2ac: e3a01000 mov r1, #0
1d2b0: ebffcfed bl 1126c <rtems_rfs_trace>
1d2b4: e3500000 cmp r0, #0
1d2b8: 0a000007 beq 1d2dc <rtems_rfs_buffer_bdbuf_release+0x40>
printf ("rtems-rfs: bdbuf-release: block=%" PRIuPTR " bdbuf=%" PRIu32 " %s\n",
1d2bc: e59fc040 ldr ip, [pc, #64] ; 1d304 <rtems_rfs_buffer_bdbuf_release+0x68><== NOT EXECUTED
1d2c0: e3550000 cmp r5, #0 <== NOT EXECUTED
1d2c4: e59f303c ldr r3, [pc, #60] ; 1d308 <rtems_rfs_buffer_bdbuf_release+0x6c><== NOT EXECUTED
1d2c8: e59f003c ldr r0, [pc, #60] ; 1d30c <rtems_rfs_buffer_bdbuf_release+0x70><== NOT EXECUTED
1d2cc: e5941034 ldr r1, [r4, #52] ; 0x34 <== NOT EXECUTED
1d2d0: e5942018 ldr r2, [r4, #24] <== NOT EXECUTED
1d2d4: 01a0300c moveq r3, ip <== NOT EXECUTED
1d2d8: eb0005d3 bl 1ea2c <printf> <== NOT EXECUTED
((intptr_t) buffer->user),
buffer->block, modified ? "(modified)" : "");
if (modified)
1d2dc: e3550000 cmp r5, #0
sc = rtems_bdbuf_release_modified (buffer);
1d2e0: e1a00004 mov r0, r4
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_RELEASE))
printf ("rtems-rfs: bdbuf-release: block=%" PRIuPTR " bdbuf=%" PRIu32 " %s\n",
((intptr_t) buffer->user),
buffer->block, modified ? "(modified)" : "");
if (modified)
1d2e4: 0a000001 beq 1d2f0 <rtems_rfs_buffer_bdbuf_release+0x54>
sc = rtems_bdbuf_release_modified (buffer);
1d2e8: ebffd83c bl 133e0 <rtems_bdbuf_release_modified>
1d2ec: ea000000 b 1d2f4 <rtems_rfs_buffer_bdbuf_release+0x58>
else
sc = rtems_bdbuf_release (buffer);
1d2f0: ebffd80c bl 13328 <rtems_bdbuf_release>
#endif
rc = EIO;
}
return rc;
}
1d2f4: e3500000 cmp r0, #0
1d2f8: 13a00005 movne r0, #5
1d2fc: 03a00000 moveq r0, #0
1d300: e8bd8030 pop {r4, r5, pc}
00018cf4 <rtems_rfs_buffer_close>:
return 0;
}
int
rtems_rfs_buffer_close (rtems_rfs_file_system* fs)
{
18cf4: e92d4030 push {r4, r5, lr}
int rc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CLOSE))
18cf8: e3a01000 mov r1, #0
return 0;
}
int
rtems_rfs_buffer_close (rtems_rfs_file_system* fs)
{
18cfc: e1a05000 mov r5, r0
int rc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CLOSE))
18d00: e3a00010 mov r0, #16
18d04: ebffe158 bl 1126c <rtems_rfs_trace>
18d08: e3500000 cmp r0, #0
printf ("rtems-rfs: buffer-close: closing\n");
18d0c: 159f0090 ldrne r0, [pc, #144] ; 18da4 <rtems_rfs_buffer_close+0xb0>
18d10: 1b0017dd blne 1ec8c <puts>
/*
* Change the block size to the media device size. It will release and sync
* all buffers.
*/
rc = rtems_rfs_buffer_setblksize (fs, rtems_rfs_fs_media_block_size (fs));
18d14: e5953010 ldr r3, [r5, #16]
18d18: e1a00005 mov r0, r5
18d1c: e5931020 ldr r1, [r3, #32]
18d20: ebffffbc bl 18c18 <rtems_rfs_buffer_setblksize>
if ((rc > 0) && rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CLOSE))
18d24: e2504000 subs r4, r0, #0
18d28: da00000a ble 18d58 <rtems_rfs_buffer_close+0x64>
18d2c: e3a00010 mov r0, #16 <== NOT EXECUTED
18d30: e3a01000 mov r1, #0 <== NOT EXECUTED
18d34: ebffe14c bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18d38: e3500000 cmp r0, #0 <== NOT EXECUTED
18d3c: 0a000005 beq 18d58 <rtems_rfs_buffer_close+0x64> <== NOT EXECUTED
printf ("rtems-rfs: buffer-close: set media block size failed: %d: %s\n",
18d40: e1a00004 mov r0, r4 <== NOT EXECUTED
18d44: eb001be6 bl 1fce4 <strerror> <== NOT EXECUTED
18d48: e1a01004 mov r1, r4 <== NOT EXECUTED
18d4c: e1a02000 mov r2, r0 <== NOT EXECUTED
18d50: e59f0050 ldr r0, [pc, #80] ; 18da8 <rtems_rfs_buffer_close+0xb4><== NOT EXECUTED
18d54: eb001734 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
if (close (fs->device) < 0)
18d58: e595000c ldr r0, [r5, #12]
18d5c: ebffb609 bl 6588 <close>
18d60: e3500000 cmp r0, #0
18d64: aa00000c bge 18d9c <rtems_rfs_buffer_close+0xa8>
{
rc = errno;
18d68: eb001219 bl 1d5d4 <__errno> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CLOSE))
18d6c: e3a01000 mov r1, #0 <== NOT EXECUTED
printf ("rtems-rfs: buffer-close: set media block size failed: %d: %s\n",
rc, strerror (rc));
if (close (fs->device) < 0)
{
rc = errno;
18d70: e5904000 ldr r4, [r0] <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CLOSE))
18d74: e3a00010 mov r0, #16 <== NOT EXECUTED
18d78: ebffe13b bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18d7c: e3500000 cmp r0, #0 <== NOT EXECUTED
18d80: 0a000005 beq 18d9c <rtems_rfs_buffer_close+0xa8> <== NOT EXECUTED
printf ("rtems-rfs: buffer-close: file close failed: %d: %s\n",
18d84: e1a00004 mov r0, r4 <== NOT EXECUTED
18d88: eb001bd5 bl 1fce4 <strerror> <== NOT EXECUTED
18d8c: e1a01004 mov r1, r4 <== NOT EXECUTED
18d90: e1a02000 mov r2, r0 <== NOT EXECUTED
18d94: e59f0010 ldr r0, [pc, #16] ; 18dac <rtems_rfs_buffer_close+0xb8><== NOT EXECUTED
18d98: eb001723 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
}
return rc;
}
18d9c: e1a00004 mov r0, r4
18da0: e8bd8030 pop {r4, r5, pc}
000185bc <rtems_rfs_buffer_handle_release>:
}
int
rtems_rfs_buffer_handle_release (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
185bc: e92d40f1 push {r0, r4, r5, r6, r7, lr}
int rc = 0;
if (rtems_rfs_buffer_handle_has_block (handle))
185c0: e5916008 ldr r6, [r1, #8]
185c4: e3560000 cmp r6, #0
}
int
rtems_rfs_buffer_handle_release (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
185c8: e1a04000 mov r4, r0
185cc: e1a05001 mov r5, r1
int rc = 0;
if (rtems_rfs_buffer_handle_has_block (handle))
185d0: 0a00005e beq 18750 <rtems_rfs_buffer_handle_release+0x194>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_RELEASE))
185d4: e3a00c02 mov r0, #512 ; 0x200
185d8: e3a01000 mov r1, #0
185dc: ebffe322 bl 1126c <rtems_rfs_trace>
185e0: e3500000 cmp r0, #0
185e4: 0a00000d beq 18620 <rtems_rfs_buffer_handle_release+0x64>
printf ("rtems-rfs: buffer-release: block=%" PRIu32 " %s refs=%d %s\n",
rtems_rfs_buffer_bnum (handle),
rtems_rfs_buffer_dirty (handle) ? "(dirty)" : "",
rtems_rfs_buffer_refs (handle),
rtems_rfs_buffer_refs (handle) == 0 ? "BAD REF COUNT" : "");
185e8: e5953008 ldr r3, [r5, #8] <== NOT EXECUTED
185ec: e5933030 ldr r3, [r3, #48] ; 0x30 <== NOT EXECUTED
int rc = 0;
if (rtems_rfs_buffer_handle_has_block (handle))
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_RELEASE))
printf ("rtems-rfs: buffer-release: block=%" PRIu32 " %s refs=%d %s\n",
185f0: e59fc160 ldr ip, [pc, #352] ; 18758 <rtems_rfs_buffer_handle_release+0x19c><== NOT EXECUTED
185f4: e5d5e000 ldrb lr, [r5] <== NOT EXECUTED
185f8: e59f215c ldr r2, [pc, #348] ; 1875c <rtems_rfs_buffer_handle_release+0x1a0><== NOT EXECUTED
185fc: e3530000 cmp r3, #0 <== NOT EXECUTED
18600: 11a0200c movne r2, ip <== NOT EXECUTED
18604: e35e0000 cmp lr, #0 <== NOT EXECUTED
18608: e58d2000 str r2, [sp] <== NOT EXECUTED
1860c: e5951004 ldr r1, [r5, #4] <== NOT EXECUTED
18610: e59f2148 ldr r2, [pc, #328] ; 18760 <rtems_rfs_buffer_handle_release+0x1a4><== NOT EXECUTED
18614: e59f0148 ldr r0, [pc, #328] ; 18764 <rtems_rfs_buffer_handle_release+0x1a8><== NOT EXECUTED
18618: 01a0200c moveq r2, ip <== NOT EXECUTED
1861c: eb001902 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_buffer_bnum (handle),
rtems_rfs_buffer_dirty (handle) ? "(dirty)" : "",
rtems_rfs_buffer_refs (handle),
rtems_rfs_buffer_refs (handle) == 0 ? "BAD REF COUNT" : "");
if (rtems_rfs_buffer_refs (handle) > 0)
18620: e5950008 ldr r0, [r5, #8]
18624: e5903030 ldr r3, [r0, #48] ; 0x30
18628: e3530000 cmp r3, #0
rtems_rfs_buffer_refs_down (handle);
1862c: c2433001 subgt r3, r3, #1
18630: c5803030 strgt r3, [r0, #48] ; 0x30
if (rtems_rfs_buffer_refs (handle) == 0)
18634: e5907030 ldr r7, [r0, #48] ; 0x30
18638: e3570000 cmp r7, #0
int
rtems_rfs_buffer_handle_release (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
int rc = 0;
1863c: 13a06000 movne r6, #0
rtems_rfs_buffer_refs (handle) == 0 ? "BAD REF COUNT" : "");
if (rtems_rfs_buffer_refs (handle) > 0)
rtems_rfs_buffer_refs_down (handle);
if (rtems_rfs_buffer_refs (handle) == 0)
18640: 1a000040 bne 18748 <rtems_rfs_buffer_handle_release+0x18c>
18644: ebfff4c1 bl 15950 <_Chain_Extract>
{
rtems_chain_extract (rtems_rfs_buffer_link (handle));
fs->buffers_count--;
18648: e5943050 ldr r3, [r4, #80] ; 0x50
if (rtems_rfs_fs_no_local_cache (fs))
1864c: e5946000 ldr r6, [r4]
rtems_rfs_buffer_refs_down (handle);
if (rtems_rfs_buffer_refs (handle) == 0)
{
rtems_chain_extract (rtems_rfs_buffer_link (handle));
fs->buffers_count--;
18650: e2433001 sub r3, r3, #1
if (rtems_rfs_fs_no_local_cache (fs))
18654: e2166002 ands r6, r6, #2
rtems_rfs_buffer_refs_down (handle);
if (rtems_rfs_buffer_refs (handle) == 0)
{
rtems_chain_extract (rtems_rfs_buffer_link (handle));
fs->buffers_count--;
18658: e5843050 str r3, [r4, #80] ; 0x50
if (rtems_rfs_fs_no_local_cache (fs))
1865c: 0a000005 beq 18678 <rtems_rfs_buffer_handle_release+0xbc>
{
handle->buffer->user = (void*) 0;
18660: e5950008 ldr r0, [r5, #8]
rc = rtems_rfs_buffer_io_release (handle->buffer,
18664: e5d51000 ldrb r1, [r5]
rtems_chain_extract (rtems_rfs_buffer_link (handle));
fs->buffers_count--;
if (rtems_rfs_fs_no_local_cache (fs))
{
handle->buffer->user = (void*) 0;
18668: e5807034 str r7, [r0, #52] ; 0x34
rc = rtems_rfs_buffer_io_release (handle->buffer,
1866c: eb00130a bl 1d29c <rtems_rfs_buffer_bdbuf_release>
18670: e1a06000 mov r6, r0
18674: ea000033 b 18748 <rtems_rfs_buffer_handle_release+0x18c>
* head.
*
* This code stops a large series of transactions causing all the
* buffers in the cache being held in queues of this file system.
*/
if ((fs->release_count +
18678: e5943060 ldr r3, [r4, #96] ; 0x60
1867c: e5942070 ldr r2, [r4, #112] ; 0x70
18680: e0822003 add r2, r2, r3
18684: e5943040 ldr r3, [r4, #64] ; 0x40
18688: e1520003 cmp r2, r3
1868c: 3a00001d bcc 18708 <rtems_rfs_buffer_handle_release+0x14c>
fs->release_modified_count) >= fs->max_held_buffers)
{
rtems_rfs_buffer* buffer;
bool modified;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_RELEASE))
18690: e3a00c02 mov r0, #512 ; 0x200
18694: e3a01000 mov r1, #0
18698: ebffe2f3 bl 1126c <rtems_rfs_trace>
1869c: e3500000 cmp r0, #0
printf ("rtems-rfs: buffer-release: local cache overflow:"
186a0: 15941070 ldrne r1, [r4, #112] ; 0x70
186a4: 15943060 ldrne r3, [r4, #96] ; 0x60
186a8: 159f00b8 ldrne r0, [pc, #184] ; 18768 <rtems_rfs_buffer_handle_release+0x1ac>
186ac: 10811003 addne r1, r1, r3
186b0: 1b0018dd blne 1ea2c <printf>
" %" PRIu32 "\n", fs->release_count + fs->release_modified_count);
if (fs->release_count > fs->release_modified_count)
186b4: e5942060 ldr r2, [r4, #96] ; 0x60
186b8: e5943070 ldr r3, [r4, #112] ; 0x70
186bc: e1520003 cmp r2, r3
186c0: 9a000006 bls 186e0 <rtems_rfs_buffer_handle_release+0x124>
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
186c4: e2840054 add r0, r4, #84 ; 0x54
186c8: ebffcc43 bl b7dc <_Chain_Get>
{
buffer = (rtems_rfs_buffer*) rtems_chain_get (&fs->release);
fs->release_count--;
186cc: e5943060 ldr r3, [r4, #96] ; 0x60
186d0: e2433001 sub r3, r3, #1
186d4: e5843060 str r3, [r4, #96] ; 0x60
modified = false;
186d8: e3a01000 mov r1, #0
186dc: ea000005 b 186f8 <rtems_rfs_buffer_handle_release+0x13c>
186e0: e2840064 add r0, r4, #100 ; 0x64
186e4: ebffcc3c bl b7dc <_Chain_Get>
}
else
{
buffer =
(rtems_rfs_buffer*) rtems_chain_get (&fs->release_modified);
fs->release_modified_count--;
186e8: e5943070 ldr r3, [r4, #112] ; 0x70
186ec: e2433001 sub r3, r3, #1
186f0: e5843070 str r3, [r4, #112] ; 0x70
modified = true;
186f4: e3a01001 mov r1, #1
}
buffer->user = (void*) 0;
186f8: e3a03000 mov r3, #0
186fc: e5803034 str r3, [r0, #52] ; 0x34
rc = rtems_rfs_buffer_io_release (buffer, modified);
18700: eb0012e5 bl 1d29c <rtems_rfs_buffer_bdbuf_release>
18704: e1a06000 mov r6, r0
}
if (rtems_rfs_buffer_dirty (handle))
18708: e5d53000 ldrb r3, [r5]
1870c: e3530000 cmp r3, #0
18710: 0a000006 beq 18730 <rtems_rfs_buffer_handle_release+0x174>
RTEMS_INLINE_ROUTINE void rtems_chain_append(
rtems_chain_control *the_chain,
rtems_chain_node *the_node
)
{
_Chain_Append( the_chain, the_node );
18714: e2840064 add r0, r4, #100 ; 0x64
18718: e5951008 ldr r1, [r5, #8]
1871c: ebffcc23 bl b7b0 <_Chain_Append>
{
rtems_chain_append (&fs->release_modified,
rtems_rfs_buffer_link (handle));
fs->release_modified_count++;
18720: e5943070 ldr r3, [r4, #112] ; 0x70
18724: e2833001 add r3, r3, #1
18728: e5843070 str r3, [r4, #112] ; 0x70
1872c: ea000005 b 18748 <rtems_rfs_buffer_handle_release+0x18c>
18730: e2840054 add r0, r4, #84 ; 0x54
18734: e5951008 ldr r1, [r5, #8]
18738: ebffcc1c bl b7b0 <_Chain_Append>
}
else
{
rtems_chain_append (&fs->release, rtems_rfs_buffer_link (handle));
fs->release_count++;
1873c: e5943060 ldr r3, [r4, #96] ; 0x60
18740: e2833001 add r3, r3, #1
18744: e5843060 str r3, [r4, #96] ; 0x60
}
}
}
handle->buffer = NULL;
18748: e3a03000 mov r3, #0
1874c: e5853008 str r3, [r5, #8]
}
return rc;
}
18750: e1a00006 mov r0, r6
18754: e8bd80f8 pop {r3, r4, r5, r6, r7, pc}
0001876c <rtems_rfs_buffer_handle_request>:
int
rtems_rfs_buffer_handle_request (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle,
rtems_rfs_buffer_block block,
bool read)
{
1876c: e92d45f1 push {r0, r4, r5, r6, r7, r8, sl, lr}
18770: e203a0ff and sl, r3, #255 ; 0xff
/*
* If the handle has a buffer release it. This allows a handle to be reused
* without needing to close then open it again.
*/
if (rtems_rfs_buffer_handle_has_block (handle))
18774: e5913008 ldr r3, [r1, #8]
18778: e3530000 cmp r3, #0
int
rtems_rfs_buffer_handle_request (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle,
rtems_rfs_buffer_block block,
bool read)
{
1877c: e1a05000 mov r5, r0
18780: e1a04001 mov r4, r1
18784: e1a06002 mov r6, r2
/*
* If the handle has a buffer release it. This allows a handle to be reused
* without needing to close then open it again.
*/
if (rtems_rfs_buffer_handle_has_block (handle))
18788: 0a000013 beq 187dc <rtems_rfs_buffer_handle_request+0x70>
{
/*
* Treat block 0 as special to handle the loading of the super block.
*/
if (block && (rtems_rfs_buffer_bnum (handle) == block))
1878c: e3520000 cmp r2, #0
18790: 0a000002 beq 187a0 <rtems_rfs_buffer_handle_request+0x34>
18794: e5913004 ldr r3, [r1, #4]
18798: e1530002 cmp r3, r2
1879c: 0a000080 beq 189a4 <rtems_rfs_buffer_handle_request+0x238>
return 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
187a0: e3a00c01 mov r0, #256 ; 0x100
187a4: e3a01000 mov r1, #0
187a8: ebffe2af bl 1126c <rtems_rfs_trace>
187ac: e3500000 cmp r0, #0
printf ("rtems-rfs: buffer-request: handle has buffer: %" PRIu32 "\n",
187b0: 159f01f8 ldrne r0, [pc, #504] ; 189b0 <rtems_rfs_buffer_handle_request+0x244>
187b4: 15941004 ldrne r1, [r4, #4]
187b8: 1b00189b blne 1ea2c <printf>
rtems_rfs_buffer_bnum (handle));
rc = rtems_rfs_buffer_handle_release (fs, handle);
187bc: e1a00005 mov r0, r5
187c0: e1a01004 mov r1, r4
187c4: ebffff7c bl 185bc <rtems_rfs_buffer_handle_release>
if (rc > 0)
187c8: e2508000 subs r8, r0, #0
187cc: ca000075 bgt 189a8 <rtems_rfs_buffer_handle_request+0x23c>
return rc;
handle->dirty = false;
187d0: e3a03000 mov r3, #0
187d4: e5c43000 strb r3, [r4]
handle->bnum = 0;
187d8: e5843004 str r3, [r4, #4]
}
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
187dc: e3a00c01 mov r0, #256 ; 0x100
187e0: e3a01000 mov r1, #0
187e4: ebffe2a0 bl 1126c <rtems_rfs_trace>
187e8: e3500000 cmp r0, #0
printf ("rtems-rfs: buffer-request: block=%" PRIu32 "\n", block);
187ec: 159f01c0 ldrne r0, [pc, #448] ; 189b4 <rtems_rfs_buffer_handle_request+0x248>
187f0: 11a01006 movne r1, r6
187f4: 1b00188c blne 1ea2c <printf>
* currently attached to a handle. If it is share the access. A buffer could
* be shared where different parts of the block have separate functions. An
* example is an inode block and the file system needs to handle 2 inodes in
* the same block at the same time.
*/
if (fs->buffers_count)
187f8: e5953050 ldr r3, [r5, #80] ; 0x50
187fc: e3530000 cmp r3, #0
18800: 0a00000f beq 18844 <rtems_rfs_buffer_handle_request+0xd8>
{
/*
* Check the active buffer list for shared buffers.
*/
handle->buffer = rtems_rfs_scan_chain (&fs->buffers,
18804: e2850044 add r0, r5, #68 ; 0x44
18808: e2851050 add r1, r5, #80 ; 0x50
1880c: e1a02006 mov r2, r6
18810: ebffff31 bl 184dc <rtems_rfs_scan_chain>
&fs->buffers_count,
block);
if (rtems_rfs_buffer_handle_has_block (handle) &&
18814: e3500000 cmp r0, #0
if (fs->buffers_count)
{
/*
* Check the active buffer list for shared buffers.
*/
handle->buffer = rtems_rfs_scan_chain (&fs->buffers,
18818: e5840008 str r0, [r4, #8]
&fs->buffers_count,
block);
if (rtems_rfs_buffer_handle_has_block (handle) &&
1881c: 0a000008 beq 18844 <rtems_rfs_buffer_handle_request+0xd8>
rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
18820: e3a00c01 mov r0, #256 ; 0x100
18824: e3a01000 mov r1, #0
18828: ebffe28f bl 1126c <rtems_rfs_trace>
* Check the active buffer list for shared buffers.
*/
handle->buffer = rtems_rfs_scan_chain (&fs->buffers,
&fs->buffers_count,
block);
if (rtems_rfs_buffer_handle_has_block (handle) &&
1882c: e3500000 cmp r0, #0
rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
printf ("rtems-rfs: buffer-request: buffer shared: refs: %d\n",
rtems_rfs_buffer_refs (handle) + 1);
18830: 15943008 ldrne r3, [r4, #8]
handle->buffer = rtems_rfs_scan_chain (&fs->buffers,
&fs->buffers_count,
block);
if (rtems_rfs_buffer_handle_has_block (handle) &&
rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
printf ("rtems-rfs: buffer-request: buffer shared: refs: %d\n",
18834: 15931030 ldrne r1, [r3, #48] ; 0x30
18838: 159f0178 ldrne r0, [pc, #376] ; 189b8 <rtems_rfs_buffer_handle_request+0x24c>
1883c: 12811001 addne r1, r1, #1
18840: 1b001879 blne 1ea2c <printf>
/*
* If the buffer has not been found check the local cache of released
* buffers. There are release and released modified lists to preserve the
* state.
*/
if (!rtems_rfs_fs_no_local_cache (fs) &&
18844: e5953000 ldr r3, [r5]
18848: e3130002 tst r3, #2
1884c: 1a000018 bne 188b4 <rtems_rfs_buffer_handle_request+0x148>
18850: e5943008 ldr r3, [r4, #8]
18854: e3530000 cmp r3, #0
18858: 1a000015 bne 188b4 <rtems_rfs_buffer_handle_request+0x148>
!rtems_rfs_buffer_handle_has_block (handle))
{
/*
* Check the local cache of released buffers.
*/
if (fs->release_count)
1885c: e5953060 ldr r3, [r5, #96] ; 0x60
18860: e3530000 cmp r3, #0
18864: 0a000004 beq 1887c <rtems_rfs_buffer_handle_request+0x110>
handle->buffer = rtems_rfs_scan_chain (&fs->release,
18868: e2850054 add r0, r5, #84 ; 0x54
1886c: e2851060 add r1, r5, #96 ; 0x60
18870: e1a02006 mov r2, r6
18874: ebffff18 bl 184dc <rtems_rfs_scan_chain>
18878: e5840008 str r0, [r4, #8]
&fs->release_count,
block);
if (!rtems_rfs_buffer_handle_has_block (handle) &&
1887c: e5943008 ldr r3, [r4, #8]
18880: e3530000 cmp r3, #0
18884: 1a00000a bne 188b4 <rtems_rfs_buffer_handle_request+0x148>
18888: e5953070 ldr r3, [r5, #112] ; 0x70
1888c: e3530000 cmp r3, #0
18890: 0a000007 beq 188b4 <rtems_rfs_buffer_handle_request+0x148>
fs->release_modified_count)
{
handle->buffer = rtems_rfs_scan_chain (&fs->release_modified,
18894: e2850064 add r0, r5, #100 ; 0x64
18898: e2851070 add r1, r5, #112 ; 0x70
1889c: e1a02006 mov r2, r6
188a0: ebffff0d bl 184dc <rtems_rfs_scan_chain>
&fs->release_modified_count,
block);
/*
* If we found a buffer retain the dirty buffer state.
*/
if (rtems_rfs_buffer_handle_has_block (handle))
188a4: e3500000 cmp r0, #0
rtems_rfs_buffer_mark_dirty (handle);
188a8: 13a03001 movne r3, #1
block);
if (!rtems_rfs_buffer_handle_has_block (handle) &&
fs->release_modified_count)
{
handle->buffer = rtems_rfs_scan_chain (&fs->release_modified,
188ac: e5840008 str r0, [r4, #8]
block);
/*
* If we found a buffer retain the dirty buffer state.
*/
if (rtems_rfs_buffer_handle_has_block (handle))
rtems_rfs_buffer_mark_dirty (handle);
188b0: 15c43000 strbne r3, [r4]
}
/*
* If not located we request the buffer from the I/O layer.
*/
if (!rtems_rfs_buffer_handle_has_block (handle))
188b4: e5947008 ldr r7, [r4, #8]
188b8: e3570000 cmp r7, #0
188bc: 1a00001c bne 18934 <rtems_rfs_buffer_handle_request+0x1c8>
{
rc = rtems_rfs_buffer_io_request (fs, block, read, &handle->buffer);
188c0: e1a00005 mov r0, r5
188c4: e1a01006 mov r1, r6
188c8: e1a0200a mov r2, sl
188cc: e2843008 add r3, r4, #8
188d0: eb001265 bl 1d26c <rtems_rfs_buffer_bdbuf_request>
if (rc > 0)
188d4: e2508000 subs r8, r0, #0
188d8: da000012 ble 18928 <rtems_rfs_buffer_handle_request+0x1bc>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
188dc: e3a00c01 mov r0, #256 ; 0x100 <== NOT EXECUTED
188e0: e3a01000 mov r1, #0 <== NOT EXECUTED
188e4: ebffe260 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
188e8: e3500000 cmp r0, #0 <== NOT EXECUTED
188ec: 0a00002d beq 189a8 <rtems_rfs_buffer_handle_request+0x23c> <== NOT EXECUTED
printf ("rtems-rfs: buffer-request: block=%" PRIu32 ": bdbuf-%s: %d: %s\n",
188f0: e59f30c4 ldr r3, [pc, #196] ; 189bc <rtems_rfs_buffer_handle_request+0x250><== NOT EXECUTED
188f4: e59f20c4 ldr r2, [pc, #196] ; 189c0 <rtems_rfs_buffer_handle_request+0x254><== NOT EXECUTED
188f8: e35a0000 cmp sl, #0 <== NOT EXECUTED
188fc: e1a00008 mov r0, r8 <== NOT EXECUTED
18900: 11a0a003 movne sl, r3 <== NOT EXECUTED
18904: 01a0a002 moveq sl, r2 <== NOT EXECUTED
18908: eb001cf5 bl 1fce4 <strerror> <== NOT EXECUTED
1890c: e1a01006 mov r1, r6 <== NOT EXECUTED
18910: e58d0000 str r0, [sp] <== NOT EXECUTED
18914: e1a0200a mov r2, sl <== NOT EXECUTED
18918: e1a03008 mov r3, r8 <== NOT EXECUTED
1891c: e59f00a0 ldr r0, [pc, #160] ; 189c4 <rtems_rfs_buffer_handle_request+0x258><== NOT EXECUTED
18920: eb001841 bl 1ea2c <printf> <== NOT EXECUTED
18924: ea00001f b 189a8 <rtems_rfs_buffer_handle_request+0x23c> <== NOT EXECUTED
block, read ? "read" : "get", rc, strerror (rc));
return rc;
}
rtems_chain_set_off_chain (rtems_rfs_buffer_link(handle));
18928: e5943008 ldr r3, [r4, #8]
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
1892c: e5837004 str r7, [r3, #4]
18930: e5837000 str r7, [r3]
}
/*
* Increase the reference count of the buffer.
*/
rtems_rfs_buffer_refs_up (handle);
18934: e5941008 ldr r1, [r4, #8]
18938: e5913030 ldr r3, [r1, #48] ; 0x30
1893c: e2833001 add r3, r3, #1
18940: e5813030 str r3, [r1, #48] ; 0x30
18944: e2850044 add r0, r5, #68 ; 0x44
18948: ebffcb98 bl b7b0 <_Chain_Append>
rtems_chain_append (&fs->buffers, rtems_rfs_buffer_link (handle));
fs->buffers_count++;
1894c: e5953050 ldr r3, [r5, #80] ; 0x50
18950: e2833001 add r3, r3, #1
18954: e5853050 str r3, [r5, #80] ; 0x50
handle->buffer->user = (void*) ((intptr_t) block);
18958: e5943008 ldr r3, [r4, #8]
handle->bnum = block;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
1895c: e3a00c01 mov r0, #256 ; 0x100
*/
rtems_rfs_buffer_refs_up (handle);
rtems_chain_append (&fs->buffers, rtems_rfs_buffer_link (handle));
fs->buffers_count++;
handle->buffer->user = (void*) ((intptr_t) block);
18960: e5836034 str r6, [r3, #52] ; 0x34
handle->bnum = block;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
18964: e3a01000 mov r1, #0
rtems_rfs_buffer_refs_up (handle);
rtems_chain_append (&fs->buffers, rtems_rfs_buffer_link (handle));
fs->buffers_count++;
handle->buffer->user = (void*) ((intptr_t) block);
handle->bnum = block;
18968: e5846004 str r6, [r4, #4]
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
1896c: ebffe23e bl 1126c <rtems_rfs_trace>
18970: e2508000 subs r8, r0, #0
18974: 0a00000b beq 189a8 <rtems_rfs_buffer_handle_request+0x23c>
printf ("rtems-rfs: buffer-request: block=%" PRIu32 " bdbuf-%s=%" PRIu32 " refs=%d\n",
block, read ? "read" : "get", handle->buffer->block,
18978: e5943008 ldr r3, [r4, #8] <== NOT EXECUTED
handle->buffer->user = (void*) ((intptr_t) block);
handle->bnum = block;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_HANDLE_REQUEST))
printf ("rtems-rfs: buffer-request: block=%" PRIu32 " bdbuf-%s=%" PRIu32 " refs=%d\n",
1897c: e5932030 ldr r2, [r3, #48] ; 0x30 <== NOT EXECUTED
18980: e59fc038 ldr ip, [pc, #56] ; 189c0 <rtems_rfs_buffer_handle_request+0x254><== NOT EXECUTED
18984: e58d2000 str r2, [sp] <== NOT EXECUTED
18988: e35a0000 cmp sl, #0 <== NOT EXECUTED
1898c: e59f2028 ldr r2, [pc, #40] ; 189bc <rtems_rfs_buffer_handle_request+0x250><== NOT EXECUTED
18990: e59f0030 ldr r0, [pc, #48] ; 189c8 <rtems_rfs_buffer_handle_request+0x25c><== NOT EXECUTED
18994: e1a01006 mov r1, r6 <== NOT EXECUTED
18998: 01a0200c moveq r2, ip <== NOT EXECUTED
1899c: e5933018 ldr r3, [r3, #24] <== NOT EXECUTED
189a0: eb001821 bl 1ea2c <printf> <== NOT EXECUTED
{
/*
* Treat block 0 as special to handle the loading of the super block.
*/
if (block && (rtems_rfs_buffer_bnum (handle) == block))
return 0;
189a4: e3a08000 mov r8, #0
printf ("rtems-rfs: buffer-request: block=%" PRIu32 " bdbuf-%s=%" PRIu32 " refs=%d\n",
block, read ? "read" : "get", handle->buffer->block,
handle->buffer->references);
return 0;
}
189a8: e1a00008 mov r0, r8
189ac: e8bd85f8 pop {r3, r4, r5, r6, r7, r8, sl, pc}
000189cc <rtems_rfs_buffer_open>:
return rc;
}
int
rtems_rfs_buffer_open (const char* name, rtems_rfs_file_system* fs)
{
189cc: e92d4030 push {r4, r5, lr}
189d0: e1a05000 mov r5, r0
189d4: e24dd048 sub sp, sp, #72 ; 0x48
189d8: e1a04001 mov r4, r1
struct stat st;
#if RTEMS_RFS_USE_LIBBLOCK
int rv;
#endif
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SYNC))
189dc: e3a00020 mov r0, #32
189e0: e3a01000 mov r1, #0
189e4: ebffe220 bl 1126c <rtems_rfs_trace>
189e8: e3500000 cmp r0, #0
printf ("rtems-rfs: buffer-open: opening: %s\n", name);
189ec: 159f0124 ldrne r0, [pc, #292] ; 18b18 <rtems_rfs_buffer_open+0x14c>
189f0: 11a01005 movne r1, r5
189f4: 1b00180c blne 1ea2c <printf>
fs->device = open (name, O_RDWR);
189f8: e1a00005 mov r0, r5
189fc: e3a01002 mov r1, #2
18a00: ebffbb1f bl 7684 <open>
if (fs->device < 0)
18a04: e3500000 cmp r0, #0
#endif
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SYNC))
printf ("rtems-rfs: buffer-open: opening: %s\n", name);
fs->device = open (name, O_RDWR);
18a08: e584000c str r0, [r4, #12]
if (fs->device < 0)
18a0c: aa000006 bge 18a2c <rtems_rfs_buffer_open+0x60>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
18a10: e3a00008 mov r0, #8 <== NOT EXECUTED
18a14: e3a01000 mov r1, #0 <== NOT EXECUTED
18a18: ebffe213 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18a1c: e3500000 cmp r0, #0 <== NOT EXECUTED
printf ("rtems-rfs: buffer-open: cannot open file\n");
18a20: 159f00f4 ldrne r0, [pc, #244] ; 18b1c <rtems_rfs_buffer_open+0x150><== NOT EXECUTED
printf ("rtems-rfs: buffer-open: opening: %s\n", name);
fs->device = open (name, O_RDWR);
if (fs->device < 0)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
18a24: 0a000038 beq 18b0c <rtems_rfs_buffer_open+0x140> <== NOT EXECUTED
18a28: ea000029 b 18ad4 <rtems_rfs_buffer_open+0x108> <== NOT EXECUTED
printf ("rtems-rfs: buffer-open: cannot open file\n");
return ENXIO;
}
if (fstat (fs->device, &st) < 0)
18a2c: e1a0100d mov r1, sp
18a30: ebffb79f bl 68b4 <fstat>
18a34: e3500000 cmp r0, #0
18a38: aa00000c bge 18a70 <rtems_rfs_buffer_open+0xa4>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
18a3c: e3a00008 mov r0, #8 <== NOT EXECUTED
18a40: e3a01000 mov r1, #0 <== NOT EXECUTED
18a44: ebffe208 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18a48: e3500000 cmp r0, #0 <== NOT EXECUTED
18a4c: 0a00002e beq 18b0c <rtems_rfs_buffer_open+0x140> <== NOT EXECUTED
printf ("rtems-rfs: buffer-open: stat '%s' failed: %s\n",
name, strerror (errno));
18a50: eb0012df bl 1d5d4 <__errno> <== NOT EXECUTED
}
if (fstat (fs->device, &st) < 0)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
printf ("rtems-rfs: buffer-open: stat '%s' failed: %s\n",
18a54: e5900000 ldr r0, [r0] <== NOT EXECUTED
18a58: eb001ca1 bl 1fce4 <strerror> <== NOT EXECUTED
18a5c: e1a01005 mov r1, r5 <== NOT EXECUTED
18a60: e1a02000 mov r2, r0 <== NOT EXECUTED
18a64: e59f00b4 ldr r0, [pc, #180] ; 18b20 <rtems_rfs_buffer_open+0x154><== NOT EXECUTED
18a68: eb0017ef bl 1ea2c <printf> <== NOT EXECUTED
18a6c: ea000026 b 18b0c <rtems_rfs_buffer_open+0x140> <== NOT EXECUTED
#if RTEMS_RFS_USE_LIBBLOCK
/*
* Is the device a block device ?
*/
if (!S_ISBLK (st.st_mode))
18a70: e59d300c ldr r3, [sp, #12]
18a74: e2033a0f and r3, r3, #61440 ; 0xf000
18a78: e3530a06 cmp r3, #24576 ; 0x6000
18a7c: 0a000008 beq 18aa4 <rtems_rfs_buffer_open+0xd8>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
18a80: e3a00008 mov r0, #8 <== NOT EXECUTED
18a84: e3a01000 mov r1, #0 <== NOT EXECUTED
18a88: ebffe1f7 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18a8c: e3500000 cmp r0, #0 <== NOT EXECUTED
18a90: 0a00001d beq 18b0c <rtems_rfs_buffer_open+0x140> <== NOT EXECUTED
printf ("rtems-rfs: buffer-open: '%s' is not a block device\n", name);
18a94: e1a01005 mov r1, r5 <== NOT EXECUTED
18a98: e59f0084 ldr r0, [pc, #132] ; 18b24 <rtems_rfs_buffer_open+0x158><== NOT EXECUTED
18a9c: eb0017e2 bl 1ea2c <printf> <== NOT EXECUTED
18aa0: ea000019 b 18b0c <rtems_rfs_buffer_open+0x140> <== NOT EXECUTED
static inline int rtems_disk_fd_get_disk_device(
int fd,
rtems_disk_device **dd_ptr
)
{
return ioctl(fd, RTEMS_BLKIO_GETDISKDEV, dd_ptr);
18aa4: e594000c ldr r0, [r4, #12]
18aa8: e59f1078 ldr r1, [pc, #120] ; 18b28 <rtems_rfs_buffer_open+0x15c>
18aac: e2842010 add r2, r4, #16
18ab0: ebffb7c7 bl 69d4 <ioctl>
/*
* Check that device is registred as a block device and lock it.
*/
rv = rtems_disk_fd_get_disk_device (fs->device, &fs->disk);
if (rv != 0)
18ab4: e2505000 subs r5, r0, #0
18ab8: 0a000007 beq 18adc <rtems_rfs_buffer_open+0x110>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
18abc: e3a00008 mov r0, #8 <== NOT EXECUTED
18ac0: e3a01000 mov r1, #0 <== NOT EXECUTED
18ac4: ebffe1e8 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18ac8: e3500000 cmp r0, #0 <== NOT EXECUTED
18acc: 0a00000e beq 18b0c <rtems_rfs_buffer_open+0x140> <== NOT EXECUTED
printf ("rtems-rfs: buffer-open: cannot obtain the disk\n");
18ad0: e59f0054 ldr r0, [pc, #84] ; 18b2c <rtems_rfs_buffer_open+0x160><== NOT EXECUTED
18ad4: eb00186c bl 1ec8c <puts> <== NOT EXECUTED
18ad8: ea00000b b 18b0c <rtems_rfs_buffer_open+0x140> <== NOT EXECUTED
#else
fs->media_size = st.st_size;
strcat (fs->name, name);
#endif
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SYNC))
18adc: e3a00020 mov r0, #32
18ae0: e3a01000 mov r1, #0
18ae4: ebffe1e0 bl 1126c <rtems_rfs_trace>
18ae8: e3500000 cmp r0, #0
18aec: 0a000007 beq 18b10 <rtems_rfs_buffer_open+0x144>
printf ("rtems-rfs: buffer-open: blks=%" PRId32 ", blk-size=%" PRId32 "\n",
rtems_rfs_fs_media_blocks (fs),
18af0: e5943010 ldr r3, [r4, #16] <== NOT EXECUTED
fs->media_size = st.st_size;
strcat (fs->name, name);
#endif
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SYNC))
printf ("rtems-rfs: buffer-open: blks=%" PRId32 ", blk-size=%" PRId32 "\n",
18af4: e283101c add r1, r3, #28 <== NOT EXECUTED
18af8: e59f0030 ldr r0, [pc, #48] ; 18b30 <rtems_rfs_buffer_open+0x164><== NOT EXECUTED
18afc: e8910006 ldm r1, {r1, r2} <== NOT EXECUTED
18b00: eb0017c9 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_fs_media_blocks (fs),
rtems_rfs_fs_media_block_size (fs));
return 0;
18b04: e1a00005 mov r0, r5 <== NOT EXECUTED
18b08: ea000000 b 18b10 <rtems_rfs_buffer_open+0x144> <== NOT EXECUTED
rv = rtems_disk_fd_get_disk_device (fs->device, &fs->disk);
if (rv != 0)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_OPEN))
printf ("rtems-rfs: buffer-open: cannot obtain the disk\n");
return ENXIO;
18b0c: e3a00006 mov r0, #6 <== NOT EXECUTED
printf ("rtems-rfs: buffer-open: blks=%" PRId32 ", blk-size=%" PRId32 "\n",
rtems_rfs_fs_media_blocks (fs),
rtems_rfs_fs_media_block_size (fs));
return 0;
}
18b10: e28dd048 add sp, sp, #72 ; 0x48
18b14: e8bd8030 pop {r4, r5, pc}
00018c18 <rtems_rfs_buffer_setblksize>:
return result;
}
int
rtems_rfs_buffer_setblksize (rtems_rfs_file_system* fs, size_t size)
{
18c18: e92d4031 push {r0, r4, r5, lr}
18c1c: e1a04000 mov r4, r0
18c20: e58d1000 str r1, [sp]
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SETBLKSIZE))
18c24: e3a00b01 mov r0, #1024 ; 0x400
18c28: e3a01000 mov r1, #0
18c2c: ebffe18e bl 1126c <rtems_rfs_trace>
18c30: e3500000 cmp r0, #0
printf ("rtems-rfs: buffer-setblksize: block size: %zu\n", size);
18c34: 159f00a8 ldrne r0, [pc, #168] ; 18ce4 <rtems_rfs_buffer_setblksize+0xcc>
18c38: 159d1000 ldrne r1, [sp]
18c3c: 1b00177a blne 1ea2c <printf>
rc = rtems_rfs_buffers_release (fs);
18c40: e1a00004 mov r0, r4
18c44: ebffffd7 bl 18ba8 <rtems_rfs_buffers_release>
if ((rc > 0) && rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SETBLKSIZE))
18c48: e2505000 subs r5, r0, #0
18c4c: da00000a ble 18c7c <rtems_rfs_buffer_setblksize+0x64>
18c50: e3a00b01 mov r0, #1024 ; 0x400 <== NOT EXECUTED
18c54: e3a01000 mov r1, #0 <== NOT EXECUTED
18c58: ebffe183 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18c5c: e3500000 cmp r0, #0 <== NOT EXECUTED
18c60: 0a000005 beq 18c7c <rtems_rfs_buffer_setblksize+0x64> <== NOT EXECUTED
printf ("rtems-rfs: buffer-setblksize: buffer release failed: %d: %s\n",
18c64: e1a00005 mov r0, r5 <== NOT EXECUTED
18c68: eb001c1d bl 1fce4 <strerror> <== NOT EXECUTED
18c6c: e1a01005 mov r1, r5 <== NOT EXECUTED
18c70: e1a02000 mov r2, r0 <== NOT EXECUTED
18c74: e59f006c ldr r0, [pc, #108] ; 18ce8 <rtems_rfs_buffer_setblksize+0xd0><== NOT EXECUTED
18c78: eb00176b bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
rc = rtems_rfs_buffer_sync (fs);
18c7c: e1a00004 mov r0, r4
18c80: ebffffab bl 18b34 <rtems_rfs_buffer_sync>
if ((rc > 0) && rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SETBLKSIZE))
18c84: e2505000 subs r5, r0, #0
18c88: da00000a ble 18cb8 <rtems_rfs_buffer_setblksize+0xa0>
18c8c: e3a00b01 mov r0, #1024 ; 0x400 <== NOT EXECUTED
18c90: e3a01000 mov r1, #0 <== NOT EXECUTED
18c94: ebffe174 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18c98: e3500000 cmp r0, #0 <== NOT EXECUTED
18c9c: 0a000005 beq 18cb8 <rtems_rfs_buffer_setblksize+0xa0> <== NOT EXECUTED
printf ("rtems-rfs: buffer-setblksize: device sync failed: %d: %s\n",
18ca0: e1a00005 mov r0, r5 <== NOT EXECUTED
18ca4: eb001c0e bl 1fce4 <strerror> <== NOT EXECUTED
18ca8: e1a01005 mov r1, r5 <== NOT EXECUTED
18cac: e1a02000 mov r2, r0 <== NOT EXECUTED
18cb0: e59f0034 ldr r0, [pc, #52] ; 18cec <rtems_rfs_buffer_setblksize+0xd4><== NOT EXECUTED
18cb4: eb00175c bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
#if RTEMS_RFS_USE_LIBBLOCK
rc = fs->disk->ioctl (fs->disk, RTEMS_BLKIO_SETBLKSIZE, &size);
18cb8: e5943010 ldr r3, [r4, #16]
18cbc: e59f102c ldr r1, [pc, #44] ; 18cf0 <rtems_rfs_buffer_setblksize+0xd8>
18cc0: e1a00003 mov r0, r3
18cc4: e1a0200d mov r2, sp
18cc8: e1a0e00f mov lr, pc
18ccc: e593f038 ldr pc, [r3, #56] ; 0x38
if (rc < 0)
18cd0: e3500000 cmp r0, #0
18cd4: aa000001 bge 18ce0 <rtems_rfs_buffer_setblksize+0xc8>
rc = errno;
18cd8: eb00123d bl 1d5d4 <__errno> <== NOT EXECUTED
18cdc: e5900000 ldr r0, [r0] <== NOT EXECUTED
#endif
return rc;
}
18ce0: e8bd8038 pop {r3, r4, r5, pc}
00018b34 <rtems_rfs_buffer_sync>:
return rc;
}
int
rtems_rfs_buffer_sync (rtems_rfs_file_system* fs)
{
18b34: e92d4030 push {r4, r5, lr}
int result = 0;
#if RTEMS_RFS_USE_LIBBLOCK
rtems_status_code sc;
#endif
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SYNC))
18b38: e3a01000 mov r1, #0
return rc;
}
int
rtems_rfs_buffer_sync (rtems_rfs_file_system* fs)
{
18b3c: e1a04000 mov r4, r0
int result = 0;
#if RTEMS_RFS_USE_LIBBLOCK
rtems_status_code sc;
#endif
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SYNC))
18b40: e3a00020 mov r0, #32
18b44: ebffe1c8 bl 1126c <rtems_rfs_trace>
18b48: e3500000 cmp r0, #0
printf ("rtems-rfs: buffer-sync: syncing\n");
18b4c: 159f004c ldrne r0, [pc, #76] ; 18ba0 <rtems_rfs_buffer_sync+0x6c>
18b50: 1b00184d blne 1ec8c <puts>
/*
* @todo Split in the separate files for each type.
*/
#if RTEMS_RFS_USE_LIBBLOCK
sc = rtems_bdbuf_syncdev (rtems_rfs_fs_device (fs));
18b54: e5940010 ldr r0, [r4, #16]
18b58: ebffea83 bl 1356c <rtems_bdbuf_syncdev>
if (sc != RTEMS_SUCCESSFUL)
18b5c: e2505000 subs r5, r0, #0
18b60: 0a00000a beq 18b90 <rtems_rfs_buffer_sync+0x5c>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_SYNC))
18b64: e3a00020 mov r0, #32 <== NOT EXECUTED
18b68: e3a01000 mov r1, #0 <== NOT EXECUTED
18b6c: ebffe1be bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18b70: e3500000 cmp r0, #0 <== NOT EXECUTED
18b74: 0a000004 beq 18b8c <rtems_rfs_buffer_sync+0x58> <== NOT EXECUTED
printf ("rtems-rfs: buffer-sync: device sync failed: %s\n",
18b78: e1a00005 mov r0, r5 <== NOT EXECUTED
18b7c: ebffb69f bl 6600 <rtems_status_text> <== NOT EXECUTED
18b80: e1a01000 mov r1, r0 <== NOT EXECUTED
18b84: e59f0018 ldr r0, [pc, #24] ; 18ba4 <rtems_rfs_buffer_sync+0x70><== NOT EXECUTED
18b88: eb0017a7 bl 1ea2c <printf> <== NOT EXECUTED
rtems_status_text (sc));
result = EIO;
18b8c: e3a05005 mov r5, #5 <== NOT EXECUTED
}
rtems_disk_release (fs->disk);
18b90: e5940010 ldr r0, [r4, #16]
18b94: ebffa9bc bl 328c <rtems_disk_release>
printf ("rtems-rfs: buffer-sync: file sync failed: %d: %s\n",
result, strerror (result));
}
#endif
return result;
}
18b98: e1a00005 mov r0, r5
18b9c: e8bd8030 pop {r4, r5, pc}
00019278 <rtems_rfs_dir_add_entry>:
rtems_rfs_dir_add_entry (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* dir,
const char* name,
size_t length,
rtems_rfs_ino ino)
{
19278: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
1927c: e1a04000 mov r4, r0
19280: e24dd074 sub sp, sp, #116 ; 0x74
19284: e1a06001 mov r6, r1
rtems_rfs_block_map map;
rtems_rfs_block_pos bpos;
rtems_rfs_buffer_handle buffer;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_ADD_ENTRY))
19288: e3a00202 mov r0, #536870912 ; 0x20000000
1928c: e3a01000 mov r1, #0
rtems_rfs_dir_add_entry (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* dir,
const char* name,
size_t length,
rtems_rfs_ino ino)
{
19290: e58d2004 str r2, [sp, #4]
19294: e1a07003 mov r7, r3
19298: e59da098 ldr sl, [sp, #152] ; 0x98
rtems_rfs_block_map map;
rtems_rfs_block_pos bpos;
rtems_rfs_buffer_handle buffer;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_ADD_ENTRY))
1929c: ebffdff2 bl 1126c <rtems_rfs_trace>
192a0: e3500000 cmp r0, #0
192a4: 0a00000d beq 192e0 <rtems_rfs_dir_add_entry+0x68>
{
int c;
printf ("rtems-rfs: dir-add-entry: dir=%" PRId32 ", name=",
192a8: e59f0328 ldr r0, [pc, #808] ; 195d8 <rtems_rfs_dir_add_entry+0x360><== NOT EXECUTED
192ac: e5961008 ldr r1, [r6, #8] <== NOT EXECUTED
192b0: eb0015dd bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_inode_ino (dir));
for (c = 0; c < length; c++)
192b4: e3a05000 mov r5, #0 <== NOT EXECUTED
192b8: ea000003 b 192cc <rtems_rfs_dir_add_entry+0x54> <== NOT EXECUTED
printf ("%c", name[c]);
192bc: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
192c0: e7d30005 ldrb r0, [r3, r5] <== NOT EXECUTED
192c4: eb001642 bl 1ebd4 <putchar> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_ADD_ENTRY))
{
int c;
printf ("rtems-rfs: dir-add-entry: dir=%" PRId32 ", name=",
rtems_rfs_inode_ino (dir));
for (c = 0; c < length; c++)
192c8: e2855001 add r5, r5, #1 <== NOT EXECUTED
192cc: e1550007 cmp r5, r7 <== NOT EXECUTED
192d0: 1afffff9 bne 192bc <rtems_rfs_dir_add_entry+0x44> <== NOT EXECUTED
printf ("%c", name[c]);
printf (", len=%zd\n", length);
192d4: e59f0300 ldr r0, [pc, #768] ; 195dc <rtems_rfs_dir_add_entry+0x364><== NOT EXECUTED
192d8: e1a01007 mov r1, r7 <== NOT EXECUTED
192dc: eb0015d2 bl 1ea2c <printf> <== NOT EXECUTED
}
rc = rtems_rfs_block_map_open (fs, dir, &map);
192e0: e28d8008 add r8, sp, #8
192e4: e1a00004 mov r0, r4
192e8: e1a01006 mov r1, r6
192ec: e1a02008 mov r2, r8
192f0: ebfff968 bl 17898 <rtems_rfs_block_map_open>
if (rc > 0)
192f4: e2505000 subs r5, r0, #0
192f8: ca0000b3 bgt 195cc <rtems_rfs_dir_add_entry+0x354>
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
192fc: e3a03000 mov r3, #0
19300: e5cd3064 strb r3, [sp, #100] ; 0x64
handle->bnum = 0;
19304: e58d3068 str r3, [sp, #104] ; 0x68
handle->buffer = NULL;
19308: e58d306c str r3, [sp, #108] ; 0x6c
* @param bpos A pointer to the block position.
*/
static inline void
rtems_rfs_block_set_bpos_zero (rtems_rfs_block_pos* bpos)
{
bpos->bno = 0;
1930c: e58d3058 str r3, [sp, #88] ; 0x58
bpos->boff = 0;
19310: e58d305c str r3, [sp, #92] ; 0x5c
bpos->block = 0;
19314: e58d3060 str r3, [sp, #96] ; 0x60
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19318: e1a0b006 mov fp, r6
/*
* Locate the first block. If an error the block will be 0. If the map is
* empty which happens when creating a directory and adding the first entry
* the seek will return ENXIO. In this case we need to grow the directory.
*/
rc = rtems_rfs_block_map_find (fs, &map, &bpos, &block);
1931c: e1a00004 mov r0, r4
19320: e28d1008 add r1, sp, #8
19324: e28d2058 add r2, sp, #88 ; 0x58
19328: e28d3070 add r3, sp, #112 ; 0x70
1932c: ebfffa25 bl 17bc8 <rtems_rfs_block_map_find>
if (rc > 0)
19330: e2505000 subs r5, r0, #0
19334: da000023 ble 193c8 <rtems_rfs_dir_add_entry+0x150>
{
if (rc != ENXIO)
19338: e3550006 cmp r5, #6
1933c: 0a00000b beq 19370 <rtems_rfs_dir_add_entry+0xf8>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_ADD_ENTRY))
19340: e3a00202 mov r0, #536870912 ; 0x20000000 <== NOT EXECUTED
19344: e3a01000 mov r1, #0 <== NOT EXECUTED
19348: ebffdfc7 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1934c: e3500000 cmp r0, #0 <== NOT EXECUTED
19350: e1a0600b mov r6, fp <== NOT EXECUTED
19354: 0a000096 beq 195b4 <rtems_rfs_dir_add_entry+0x33c> <== NOT EXECUTED
printf ("rtems-rfs: dir-add-entry: "
19358: e1a00005 mov r0, r5 <== NOT EXECUTED
1935c: e59b6008 ldr r6, [fp, #8] <== NOT EXECUTED
19360: eb001a5f bl 1fce4 <strerror> <== NOT EXECUTED
19364: e1a03000 mov r3, r0 <== NOT EXECUTED
19368: e59f0270 ldr r0, [pc, #624] ; 195e0 <rtems_rfs_dir_add_entry+0x368><== NOT EXECUTED
1936c: ea000011 b 193b8 <rtems_rfs_dir_add_entry+0x140> <== NOT EXECUTED
}
/*
* We have reached the end of the directory so add a block.
*/
rc = rtems_rfs_block_map_grow (fs, &map, 1, &block);
19370: e1a00004 mov r0, r4
19374: e28d1008 add r1, sp, #8
19378: e3a02001 mov r2, #1
1937c: e28d3070 add r3, sp, #112 ; 0x70
19380: ebfffa8e bl 17dc0 <rtems_rfs_block_map_grow>
if (rc > 0)
19384: e2505000 subs r5, r0, #0
19388: da000010 ble 193d0 <rtems_rfs_dir_add_entry+0x158>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_ADD_ENTRY))
1938c: e3a00202 mov r0, #536870912 ; 0x20000000 <== NOT EXECUTED
19390: e3a01000 mov r1, #0 <== NOT EXECUTED
19394: ebffdfb4 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19398: e3500000 cmp r0, #0 <== NOT EXECUTED
1939c: e1a0600b mov r6, fp <== NOT EXECUTED
193a0: 0a000083 beq 195b4 <rtems_rfs_dir_add_entry+0x33c> <== NOT EXECUTED
printf ("rtems-rfs: dir-add-entry: "
193a4: e1a00005 mov r0, r5 <== NOT EXECUTED
193a8: e59b6008 ldr r6, [fp, #8] <== NOT EXECUTED
193ac: eb001a4c bl 1fce4 <strerror> <== NOT EXECUTED
193b0: e1a03000 mov r3, r0 <== NOT EXECUTED
193b4: e59f0228 ldr r0, [pc, #552] ; 195e4 <rtems_rfs_dir_add_entry+0x36c><== NOT EXECUTED
193b8: e1a01006 mov r1, r6 <== NOT EXECUTED
193bc: e1a02005 mov r2, r5 <== NOT EXECUTED
193c0: eb001599 bl 1ea2c <printf> <== NOT EXECUTED
193c4: ea00007a b 195b4 <rtems_rfs_dir_add_entry+0x33c> <== NOT EXECUTED
while (true)
{
rtems_rfs_block_no block;
uint8_t* entry;
int offset;
bool read = true;
193c8: e3a06001 mov r6, #1
193cc: ea000000 b 193d4 <rtems_rfs_dir_add_entry+0x15c>
"block map grow failed for ino %" PRIu32 ": %d: %s\n",
rtems_rfs_inode_ino (dir), rc, strerror (rc));
break;
}
read = false;
193d0: e3a06000 mov r6, #0
}
bpos.bno++;
193d4: e59d3058 ldr r3, [sp, #88] ; 0x58
193d8: e2833001 add r3, r3, #1
193dc: e58d3058 str r3, [sp, #88] ; 0x58
rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, read);
193e0: e1a00004 mov r0, r4
193e4: e28d1064 add r1, sp, #100 ; 0x64
193e8: e59d2070 ldr r2, [sp, #112] ; 0x70
193ec: e1a03006 mov r3, r6
193f0: ebfffcdd bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
193f4: e2505000 subs r5, r0, #0
193f8: da00000b ble 1942c <rtems_rfs_dir_add_entry+0x1b4>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_ADD_ENTRY))
193fc: e3a00202 mov r0, #536870912 ; 0x20000000 <== NOT EXECUTED
19400: e3a01000 mov r1, #0 <== NOT EXECUTED
19404: ebffdf98 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19408: e3500000 cmp r0, #0 <== NOT EXECUTED
1940c: e1a0600b mov r6, fp <== NOT EXECUTED
19410: 0a000067 beq 195b4 <rtems_rfs_dir_add_entry+0x33c> <== NOT EXECUTED
printf ("rtems-rfs: dir-add-entry: "
19414: e1a00005 mov r0, r5 <== NOT EXECUTED
19418: e59b6008 ldr r6, [fp, #8] <== NOT EXECUTED
1941c: eb001a30 bl 1fce4 <strerror> <== NOT EXECUTED
19420: e1a03000 mov r3, r0 <== NOT EXECUTED
19424: e59f01bc ldr r0, [pc, #444] ; 195e8 <rtems_rfs_dir_add_entry+0x370><== NOT EXECUTED
19428: eaffffe2 b 193b8 <rtems_rfs_dir_add_entry+0x140> <== NOT EXECUTED
"block buffer req failed for ino %" PRIu32 ": %d: %s\n",
rtems_rfs_inode_ino (dir), rc, strerror (rc));
break;
}
entry = rtems_rfs_buffer_data (&buffer);
1942c: e59d306c ldr r3, [sp, #108] ; 0x6c
if (!read)
19430: e3560000 cmp r6, #0
"block buffer req failed for ino %" PRIu32 ": %d: %s\n",
rtems_rfs_inode_ino (dir), rc, strerror (rc));
break;
}
entry = rtems_rfs_buffer_data (&buffer);
19434: e593501c ldr r5, [r3, #28]
if (!read)
memset (entry, 0xff, rtems_rfs_fs_block_size (fs));
19438: 01a00005 moveq r0, r5
1943c: 03a010ff moveq r1, #255 ; 0xff
19440: 05942008 ldreq r2, [r4, #8]
19444: 0b001507 bleq 1e868 <memset>
offset = 0;
while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19448: e5942008 ldr r2, [r4, #8]
entry = rtems_rfs_buffer_data (&buffer);
if (!read)
memset (entry, 0xff, rtems_rfs_fs_block_size (fs));
offset = 0;
1944c: e3a03000 mov r3, #0
while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19450: e242100a sub r1, r2, #10
19454: ea000053 b 195a8 <rtems_rfs_dir_add_entry+0x330>
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
19458: e5d50009 ldrb r0, [r5, #9]
1945c: e5d59008 ldrb r9, [r5, #8]
eino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19460: e59f6184 ldr r6, [pc, #388] ; 195ec <rtems_rfs_dir_add_entry+0x374>
while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
19464: e1809409 orr r9, r0, r9, lsl #8
eino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19468: e1590006 cmp r9, r6
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
1946c: e5d5e000 ldrb lr, [r5]
19470: e5d58001 ldrb r8, [r5, #1]
19474: e5d50002 ldrb r0, [r5, #2]
19478: e5d5c003 ldrb ip, [r5, #3]
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
1947c: 1a000025 bne 19518 <rtems_rfs_dir_add_entry+0x2a0>
{
if ((length + RTEMS_RFS_DIR_ENTRY_SIZE) <
19480: e287800a add r8, r7, #10
(rtems_rfs_fs_block_size (fs) - offset))
19484: e0633002 rsb r3, r3, r2
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
{
if ((length + RTEMS_RFS_DIR_ENTRY_SIZE) <
19488: e1580003 cmp r8, r3
1948c: 2affffa2 bcs 1931c <rtems_rfs_dir_add_entry+0xa4>
(rtems_rfs_fs_block_size (fs) - offset))
{
uint32_t hash;
hash = rtems_rfs_dir_hash (name, length);
19490: e1a01007 mov r1, r7
19494: e59d0004 ldr r0, [sp, #4]
19498: eb000f9c bl 1d310 <rtems_rfs_dir_hash>
rtems_rfs_dir_set_entry_hash (entry, hash);
1949c: e1a03c20 lsr r3, r0, #24
194a0: e5c53004 strb r3, [r5, #4]
194a4: e1a03820 lsr r3, r0, #16
194a8: e5c53005 strb r3, [r5, #5]
194ac: e1a03420 lsr r3, r0, #8
194b0: e5c53006 strb r3, [r5, #6]
rtems_rfs_dir_set_entry_ino (entry, ino);
194b4: e1a03c2a lsr r3, sl, #24
194b8: e5c53000 strb r3, [r5]
194bc: e1a0382a lsr r3, sl, #16
194c0: e5c53001 strb r3, [r5, #1]
194c4: e1a0342a lsr r3, sl, #8
194c8: e5c53002 strb r3, [r5, #2]
rtems_rfs_dir_set_entry_length (entry,
194cc: e1a03428 lsr r3, r8, #8
if ((length + RTEMS_RFS_DIR_ENTRY_SIZE) <
(rtems_rfs_fs_block_size (fs) - offset))
{
uint32_t hash;
hash = rtems_rfs_dir_hash (name, length);
rtems_rfs_dir_set_entry_hash (entry, hash);
194d0: e5c50007 strb r0, [r5, #7]
rtems_rfs_dir_set_entry_ino (entry, ino);
rtems_rfs_dir_set_entry_length (entry,
194d4: e5c53008 strb r3, [r5, #8]
RTEMS_RFS_DIR_ENTRY_SIZE + length);
memcpy (entry + RTEMS_RFS_DIR_ENTRY_SIZE, name, length);
194d8: e1a02007 mov r2, r7
(rtems_rfs_fs_block_size (fs) - offset))
{
uint32_t hash;
hash = rtems_rfs_dir_hash (name, length);
rtems_rfs_dir_set_entry_hash (entry, hash);
rtems_rfs_dir_set_entry_ino (entry, ino);
194dc: e5c5a003 strb sl, [r5, #3]
rtems_rfs_dir_set_entry_length (entry,
194e0: e5c58009 strb r8, [r5, #9]
RTEMS_RFS_DIR_ENTRY_SIZE + length);
memcpy (entry + RTEMS_RFS_DIR_ENTRY_SIZE, name, length);
194e4: e285000a add r0, r5, #10
194e8: e59d1004 ldr r1, [sp, #4]
194ec: eb00145a bl 1e65c <memcpy>
rtems_rfs_buffer_mark_dirty (&buffer);
194f0: e28d1074 add r1, sp, #116 ; 0x74
194f4: e3a03001 mov r3, #1
194f8: e5613010 strb r3, [r1, #-16]!
rtems_rfs_buffer_handle_close (fs, &buffer);
194fc: e1a00004 mov r0, r4
19500: ebfffe2a bl 18db0 <rtems_rfs_buffer_handle_close>
rtems_rfs_block_map_close (fs, &map);
19504: e1a00004 mov r0, r4
19508: e28d1008 add r1, sp, #8
1950c: ebfff93a bl 179fc <rtems_rfs_block_map_close>
return 0;
19510: e3a05000 mov r5, #0
19514: ea00002c b 195cc <rtems_rfs_dir_add_entry+0x354>
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19518: e1a08808 lsl r8, r8, #16
1951c: e1888c0e orr r8, r8, lr, lsl #24
19520: e188800c orr r8, r8, ip
}
break;
}
if (rtems_rfs_dir_entry_valid (fs, elength, eino))
19524: e359000a cmp r9, #10
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19528: e1888400 orr r8, r8, r0, lsl #8
}
break;
}
if (rtems_rfs_dir_entry_valid (fs, elength, eino))
1952c: da000006 ble 1954c <rtems_rfs_dir_add_entry+0x2d4>
19530: e594001c ldr r0, [r4, #28]
19534: e3580000 cmp r8, #0
19538: 11590000 cmpne r9, r0
1953c: 2a000002 bcs 1954c <rtems_rfs_dir_add_entry+0x2d4>
19540: e5940014 ldr r0, [r4, #20]
19544: e1580000 cmp r8, r0
19548: 9a000014 bls 195a0 <rtems_rfs_dir_add_entry+0x328>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_ADD_ENTRY))
1954c: e3a00202 mov r0, #536870912 ; 0x20000000 <== NOT EXECUTED
19550: e3a01000 mov r1, #0 <== NOT EXECUTED
19554: e1a0600b mov r6, fp <== NOT EXECUTED
19558: e1a0b003 mov fp, r3 <== NOT EXECUTED
1955c: ebffdf42 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19560: e3500000 cmp r0, #0 <== NOT EXECUTED
19564: 0a000005 beq 19580 <rtems_rfs_dir_add_entry+0x308> <== NOT EXECUTED
printf ("rtems-rfs: dir-add-entry: "
19568: e58db000 str fp, [sp] <== NOT EXECUTED
1956c: e59f007c ldr r0, [pc, #124] ; 195f0 <rtems_rfs_dir_add_entry+0x378><== NOT EXECUTED
19570: e5961008 ldr r1, [r6, #8] <== NOT EXECUTED
19574: e1a02009 mov r2, r9 <== NOT EXECUTED
19578: e1a03008 mov r3, r8 <== NOT EXECUTED
1957c: eb00152a bl 1ea2c <printf> <== NOT EXECUTED
"bad length or ino for ino %" PRIu32 ": %u/%" PRId32 " @ %04x\n",
rtems_rfs_inode_ino (dir), elength, eino, offset);
rtems_rfs_buffer_handle_close (fs, &buffer);
19580: e28d1064 add r1, sp, #100 ; 0x64 <== NOT EXECUTED
19584: e1a00004 mov r0, r4 <== NOT EXECUTED
19588: ebfffe08 bl 18db0 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
1958c: e1a00004 mov r0, r4 <== NOT EXECUTED
19590: e28d1008 add r1, sp, #8 <== NOT EXECUTED
19594: ebfff918 bl 179fc <rtems_rfs_block_map_close> <== NOT EXECUTED
return EIO;
19598: e3a05005 mov r5, #5 <== NOT EXECUTED
1959c: ea00000a b 195cc <rtems_rfs_dir_add_entry+0x354> <== NOT EXECUTED
}
entry += elength;
195a0: e0855009 add r5, r5, r9
offset += elength;
195a4: e0833009 add r3, r3, r9
if (!read)
memset (entry, 0xff, rtems_rfs_fs_block_size (fs));
offset = 0;
while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
195a8: e1530001 cmp r3, r1
195ac: 3affffa9 bcc 19458 <rtems_rfs_dir_add_entry+0x1e0>
195b0: eaffff59 b 1931c <rtems_rfs_dir_add_entry+0xa4> <== NOT EXECUTED
entry += elength;
offset += elength;
}
}
rtems_rfs_buffer_handle_close (fs, &buffer);
195b4: e28d1064 add r1, sp, #100 ; 0x64 <== NOT EXECUTED
195b8: e1a00004 mov r0, r4 <== NOT EXECUTED
195bc: ebfffdfb bl 18db0 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
195c0: e1a00004 mov r0, r4 <== NOT EXECUTED
195c4: e28d1008 add r1, sp, #8 <== NOT EXECUTED
195c8: ebfff90b bl 179fc <rtems_rfs_block_map_close> <== NOT EXECUTED
return rc;
}
195cc: e1a00005 mov r0, r5
195d0: e28dd074 add sp, sp, #116 ; 0x74
195d4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
000195f4 <rtems_rfs_dir_del_entry>:
int
rtems_rfs_dir_del_entry (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* dir,
rtems_rfs_ino ino,
uint32_t offset)
{
195f4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
195f8: e1a05000 mov r5, r0
195fc: e24dd074 sub sp, sp, #116 ; 0x74
19600: e1a09001 mov r9, r1
rtems_rfs_block_no block;
rtems_rfs_buffer_handle buffer;
bool search;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
19604: e3a00101 mov r0, #1073741824 ; 0x40000000
19608: e3a01000 mov r1, #0
int
rtems_rfs_dir_del_entry (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* dir,
rtems_rfs_ino ino,
uint32_t offset)
{
1960c: e58d2010 str r2, [sp, #16]
19610: e58d300c str r3, [sp, #12]
rtems_rfs_block_no block;
rtems_rfs_buffer_handle buffer;
bool search;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
19614: ebffdf14 bl 1126c <rtems_rfs_trace>
19618: e3500000 cmp r0, #0
printf ("rtems-rfs: dir-del-entry: dir=%" PRId32 ", entry=%" PRId32 " offset=%" PRIu32 "\n",
1961c: 159f0374 ldrne r0, [pc, #884] ; 19998 <rtems_rfs_dir_del_entry+0x3a4>
19620: 15991008 ldrne r1, [r9, #8]
19624: 159d2010 ldrne r2, [sp, #16]
19628: 159d300c ldrne r3, [sp, #12]
1962c: 1b0014fe blne 1ea2c <printf>
rtems_rfs_inode_ino (dir), ino, offset);
rc = rtems_rfs_block_map_open (fs, dir, &map);
19630: e1a00005 mov r0, r5
19634: e1a01009 mov r1, r9
19638: e28d2014 add r2, sp, #20
1963c: ebfff895 bl 17898 <rtems_rfs_block_map_open>
if (rc > 0)
19640: e2504000 subs r4, r0, #0
19644: ca0000ce bgt 19984 <rtems_rfs_dir_del_entry+0x390>
return rc;
rc = rtems_rfs_block_map_seek (fs, &map, offset, &block);
19648: e28d3070 add r3, sp, #112 ; 0x70
1964c: e3a06000 mov r6, #0
19650: e58d3000 str r3, [sp]
19654: e1a00005 mov r0, r5
19658: e28d1014 add r1, sp, #20
1965c: e59d200c ldr r2, [sp, #12]
19660: e1a03006 mov r3, r6
19664: ebfff9ae bl 17d24 <rtems_rfs_block_map_seek>
if (rc > 0)
19668: e2504000 subs r4, r0, #0
1966c: da000002 ble 1967c <rtems_rfs_dir_del_entry+0x88>
{
if (rc == ENXIO)
rc = ENOENT;
19670: e3540006 cmp r4, #6 <== NOT EXECUTED
19674: 03a04002 moveq r4, #2 <== NOT EXECUTED
19678: ea0000a1 b 19904 <rtems_rfs_dir_del_entry+0x310> <== NOT EXECUTED
}
/*
* Only search if the offset is 0 else we are at that position.
*/
search = offset ? false : true;
1967c: e59d200c ldr r2, [sp, #12]
19680: e2723001 rsbs r3, r2, #1
19684: 33a03000 movcc r3, #0
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
19688: e5cd6064 strb r6, [sp, #100] ; 0x64
handle->bnum = 0;
1968c: e58d6068 str r6, [sp, #104] ; 0x68
handle->buffer = NULL;
19690: e58d606c str r6, [sp, #108] ; 0x6c
rc = ENOENT;
rtems_rfs_block_map_close (fs, &map);
return rc;
}
rc = rtems_rfs_buffer_handle_open (fs, &buffer);
19694: e1a04006 mov r4, r6
19698: e1a0b003 mov fp, r3
/*
* Only search if the offset is 0 else we are at that position.
*/
search = offset ? false : true;
while (rc == 0)
1969c: ea0000ae b 1995c <rtems_rfs_dir_del_entry+0x368>
{
uint8_t* entry;
int eoffset;
rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, true);
196a0: e1a00005 mov r0, r5
196a4: e28d1064 add r1, sp, #100 ; 0x64
196a8: e59d2070 ldr r2, [sp, #112] ; 0x70
196ac: e3a03001 mov r3, #1
196b0: ebfffc2d bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
196b4: e2508000 subs r8, r0, #0
196b8: da00000e ble 196f8 <rtems_rfs_dir_del_entry+0x104>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
196bc: e3a00101 mov r0, #1073741824 ; 0x40000000 <== NOT EXECUTED
196c0: e3a01000 mov r1, #0 <== NOT EXECUTED
196c4: ebffdee8 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
196c8: e3500000 cmp r0, #0 <== NOT EXECUTED
196cc: e1a07008 mov r7, r8 <== NOT EXECUTED
196d0: 0a0000a4 beq 19968 <rtems_rfs_dir_del_entry+0x374> <== NOT EXECUTED
printf ("rtems-rfs: dir-del-entry: "
196d4: e1a00008 mov r0, r8 <== NOT EXECUTED
196d8: e5994008 ldr r4, [r9, #8] <== NOT EXECUTED
196dc: eb001980 bl 1fce4 <strerror> <== NOT EXECUTED
196e0: e1a01004 mov r1, r4 <== NOT EXECUTED
196e4: e1a03000 mov r3, r0 <== NOT EXECUTED
196e8: e1a02008 mov r2, r8 <== NOT EXECUTED
196ec: e59f02a8 ldr r0, [pc, #680] ; 1999c <rtems_rfs_dir_del_entry+0x3a8><== NOT EXECUTED
196f0: eb0014cd bl 1ea2c <printf> <== NOT EXECUTED
196f4: ea00009b b 19968 <rtems_rfs_dir_del_entry+0x374> <== NOT EXECUTED
/*
* If we are searching start at the beginning of the block. If not searching
* skip to the offset in the block.
*/
if (search)
196f8: e35b0000 cmp fp, #0
eoffset = 0;
196fc: 11a07004 movne r7, r4
/*
* If we are searching start at the beginning of the block. If not searching
* skip to the offset in the block.
*/
if (search)
19700: 1a000003 bne 19714 <rtems_rfs_dir_del_entry+0x120>
eoffset = 0;
else
eoffset = offset % rtems_rfs_fs_block_size (fs);
19704: e59d000c ldr r0, [sp, #12]
19708: e5951008 ldr r1, [r5, #8]
1970c: eb004639 bl 2aff8 <__umodsi3>
19710: e1a07000 mov r7, r0
entry = rtems_rfs_buffer_data (&buffer) + eoffset;
19714: e59d306c ldr r3, [sp, #108] ; 0x6c
19718: e593201c ldr r2, [r3, #28]
while (eoffset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
1971c: e5953008 ldr r3, [r5, #8]
if (search)
eoffset = 0;
else
eoffset = offset % rtems_rfs_fs_block_size (fs);
entry = rtems_rfs_buffer_data (&buffer) + eoffset;
19720: e0822007 add r2, r2, r7
while (eoffset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19724: e243100a sub r1, r3, #10
19728: e58d3008 str r3, [sp, #8]
1972c: ea00007c b 19924 <rtems_rfs_dir_del_entry+0x330>
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
19730: e5d20009 ldrb r0, [r2, #9]
19734: e5d2a008 ldrb sl, [r2, #8]
eino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19738: e59f3260 ldr r3, [pc, #608] ; 199a0 <rtems_rfs_dir_del_entry+0x3ac>
while (eoffset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
1973c: e180a40a orr sl, r0, sl, lsl #8
eino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19740: e15a0003 cmp sl, r3
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19744: e5d26000 ldrb r6, [r2]
19748: e5d2e001 ldrb lr, [r2, #1]
1974c: e5d20002 ldrb r0, [r2, #2]
19750: e5d2c003 ldrb ip, [r2, #3]
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19754: 0a000074 beq 1992c <rtems_rfs_dir_del_entry+0x338>
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19758: e1a0e80e lsl lr, lr, #16
1975c: e18eec06 orr lr, lr, r6, lsl #24
19760: e18ee00c orr lr, lr, ip
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
break;
if (rtems_rfs_dir_entry_valid (fs, elength, eino))
19764: e35a000a cmp sl, #10
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19768: e18e6400 orr r6, lr, r0, lsl #8
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
break;
if (rtems_rfs_dir_entry_valid (fs, elength, eino))
1976c: da000006 ble 1978c <rtems_rfs_dir_del_entry+0x198>
19770: e595001c ldr r0, [r5, #28]
19774: e3560000 cmp r6, #0
19778: 115a0000 cmpne sl, r0
1977c: 2a000002 bcs 1978c <rtems_rfs_dir_del_entry+0x198>
19780: e5950014 ldr r0, [r5, #20]
19784: e1560000 cmp r6, r0
19788: 9a00000c bls 197c0 <rtems_rfs_dir_del_entry+0x1cc>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
1978c: e3a00101 mov r0, #1073741824 ; 0x40000000 <== NOT EXECUTED
19790: e3a01000 mov r1, #0 <== NOT EXECUTED
19794: ebffdeb4 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19798: e3500000 cmp r0, #0 <== NOT EXECUTED
1979c: 0a00007b beq 19990 <rtems_rfs_dir_del_entry+0x39c> <== NOT EXECUTED
printf ("rtems-rfs: dir-del-entry: "
197a0: e59d3070 ldr r3, [sp, #112] ; 0x70 <== NOT EXECUTED
197a4: e5991008 ldr r1, [r9, #8] <== NOT EXECUTED
197a8: e88d0088 stm sp, {r3, r7} <== NOT EXECUTED
197ac: e1a0200a mov r2, sl <== NOT EXECUTED
197b0: e1a03006 mov r3, r6 <== NOT EXECUTED
197b4: e59f01e8 ldr r0, [pc, #488] ; 199a4 <rtems_rfs_dir_del_entry+0x3b0><== NOT EXECUTED
197b8: eb00149b bl 1ea2c <printf> <== NOT EXECUTED
197bc: ea000073 b 19990 <rtems_rfs_dir_del_entry+0x39c> <== NOT EXECUTED
rtems_rfs_inode_ino (dir), elength, eino, block, eoffset);
rc = EIO;
break;
}
if (ino == rtems_rfs_dir_entry_ino (entry))
197c0: e59d3010 ldr r3, [sp, #16]
197c4: e1530006 cmp r3, r6
197c8: 1a000051 bne 19914 <rtems_rfs_dir_del_entry+0x320>
197cc: e59d3008 ldr r3, [sp, #8]
197d0: e1a06007 mov r6, r7
{
uint32_t remaining;
remaining = rtems_rfs_fs_block_size (fs) - (eoffset + elength);
197d4: e087700a add r7, r7, sl
197d8: e0677003 rsb r7, r7, r3
197dc: e1a08002 mov r8, r2
memmove (entry, entry + elength, remaining);
197e0: e082100a add r1, r2, sl
197e4: e1a00002 mov r0, r2
197e8: e1a02007 mov r2, r7
197ec: eb0013d0 bl 1e734 <memmove>
memset (entry + remaining, 0xff, elength);
197f0: e0880007 add r0, r8, r7
197f4: e3a010ff mov r1, #255 ; 0xff
197f8: e1a0200a mov r2, sl
197fc: eb001419 bl 1e868 <memset>
* block and it is the last block in the map shrink the map.
*
* @note We could check again to see if the new end block in the map is
* also empty. This way we could clean up an empty directory.
*/
elength = rtems_rfs_dir_entry_length (entry);
19800: e5d87008 ldrb r7, [r8, #8]
19804: e5d83009 ldrb r3, [r8, #9]
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
19808: e3a00101 mov r0, #1073741824 ; 0x40000000
1980c: e3a01000 mov r1, #0
* block and it is the last block in the map shrink the map.
*
* @note We could check again to see if the new end block in the map is
* also empty. This way we could clean up an empty directory.
*/
elength = rtems_rfs_dir_entry_length (entry);
19810: e1837407 orr r7, r3, r7, lsl #8
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
19814: ebffde94 bl 1126c <rtems_rfs_trace>
19818: e3500000 cmp r0, #0
1981c: 0a000013 beq 19870 <rtems_rfs_dir_del_entry+0x27c>
printf ("rtems-rfs: dir-del-entry: "
"last block free for ino %" PRIu32 ": elength=%i block=%" PRIu32
" offset=%d last=%s\n",
ino, elength, block, eoffset,
rtems_rfs_block_map_last (&map) ? "yes" : "no");
19820: e59d1024 ldr r1, [sp, #36] ; 0x24 <== NOT EXECUTED
* also empty. This way we could clean up an empty directory.
*/
elength = rtems_rfs_dir_entry_length (entry);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
printf ("rtems-rfs: dir-del-entry: "
19824: e3510000 cmp r1, #0 <== NOT EXECUTED
19828: e59d3070 ldr r3, [sp, #112] ; 0x70 <== NOT EXECUTED
1982c: e59d201c ldr r2, [sp, #28] <== NOT EXECUTED
19830: 1a000002 bne 19840 <rtems_rfs_dir_del_entry+0x24c> <== NOT EXECUTED
"last block free for ino %" PRIu32 ": elength=%i block=%" PRIu32
" offset=%d last=%s\n",
ino, elength, block, eoffset,
rtems_rfs_block_map_last (&map) ? "yes" : "no");
19834: e3520000 cmp r2, #0 <== NOT EXECUTED
* also empty. This way we could clean up an empty directory.
*/
elength = rtems_rfs_dir_entry_length (entry);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
printf ("rtems-rfs: dir-del-entry: "
19838: 059f2168 ldreq r2, [pc, #360] ; 199a8 <rtems_rfs_dir_del_entry+0x3b4><== NOT EXECUTED
"last block free for ino %" PRIu32 ": elength=%i block=%" PRIu32
" offset=%d last=%s\n",
ino, elength, block, eoffset,
rtems_rfs_block_map_last (&map) ? "yes" : "no");
1983c: 0a000005 beq 19858 <rtems_rfs_dir_del_entry+0x264> <== NOT EXECUTED
19840: e2422001 sub r2, r2, #1 <== NOT EXECUTED
* also empty. This way we could clean up an empty directory.
*/
elength = rtems_rfs_dir_entry_length (entry);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
printf ("rtems-rfs: dir-del-entry: "
19844: e59f015c ldr r0, [pc, #348] ; 199a8 <rtems_rfs_dir_del_entry+0x3b4><== NOT EXECUTED
19848: e59fc15c ldr ip, [pc, #348] ; 199ac <rtems_rfs_dir_del_entry+0x3b8><== NOT EXECUTED
1984c: e1510002 cmp r1, r2 <== NOT EXECUTED
19850: 11a0200c movne r2, ip <== NOT EXECUTED
19854: 01a02000 moveq r2, r0 <== NOT EXECUTED
19858: e58d2004 str r2, [sp, #4] <== NOT EXECUTED
1985c: e59f014c ldr r0, [pc, #332] ; 199b0 <rtems_rfs_dir_del_entry+0x3bc><== NOT EXECUTED
19860: e59d1010 ldr r1, [sp, #16] <== NOT EXECUTED
19864: e1a02007 mov r2, r7 <== NOT EXECUTED
19868: e58d6000 str r6, [sp] <== NOT EXECUTED
1986c: eb00146e bl 1ea2c <printf> <== NOT EXECUTED
"last block free for ino %" PRIu32 ": elength=%i block=%" PRIu32
" offset=%d last=%s\n",
ino, elength, block, eoffset,
rtems_rfs_block_map_last (&map) ? "yes" : "no");
if ((elength == RTEMS_RFS_DIR_ENTRY_EMPTY) &&
19870: e59f3128 ldr r3, [pc, #296] ; 199a0 <rtems_rfs_dir_del_entry+0x3ac>
19874: e1570003 cmp r7, r3
19878: 03560000 cmpeq r6, #0
1987c: 1a00001b bne 198f0 <rtems_rfs_dir_del_entry+0x2fc>
(eoffset == 0) && rtems_rfs_block_map_last (&map))
19880: e59d3024 ldr r3, [sp, #36] ; 0x24 <== NOT EXECUTED
19884: e3530000 cmp r3, #0 <== NOT EXECUTED
19888: e59d201c ldr r2, [sp, #28] <== NOT EXECUTED
1988c: 1a000001 bne 19898 <rtems_rfs_dir_del_entry+0x2a4> <== NOT EXECUTED
19890: e3520000 cmp r2, #0 <== NOT EXECUTED
19894: 0a000002 beq 198a4 <rtems_rfs_dir_del_entry+0x2b0> <== NOT EXECUTED
19898: e2422001 sub r2, r2, #1 <== NOT EXECUTED
1989c: e1530002 cmp r3, r2 <== NOT EXECUTED
198a0: 1a000012 bne 198f0 <rtems_rfs_dir_del_entry+0x2fc> <== NOT EXECUTED
{
rc = rtems_rfs_block_map_shrink (fs, &map, 1);
198a4: e1a00005 mov r0, r5 <== NOT EXECUTED
198a8: e28d1014 add r1, sp, #20 <== NOT EXECUTED
198ac: e3a02001 mov r2, #1 <== NOT EXECUTED
198b0: ebfffa29 bl 1815c <rtems_rfs_block_map_shrink> <== NOT EXECUTED
if (rc > 0)
198b4: e2506000 subs r6, r0, #0 <== NOT EXECUTED
198b8: da00000c ble 198f0 <rtems_rfs_dir_del_entry+0x2fc> <== NOT EXECUTED
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_DEL_ENTRY))
198bc: e3a00101 mov r0, #1073741824 ; 0x40000000 <== NOT EXECUTED
198c0: e3a01000 mov r1, #0 <== NOT EXECUTED
198c4: ebffde68 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
198c8: e3500000 cmp r0, #0 <== NOT EXECUTED
198cc: 0a000007 beq 198f0 <rtems_rfs_dir_del_entry+0x2fc> <== NOT EXECUTED
printf ("rtems-rfs: dir-del-entry: "
198d0: e1a00006 mov r0, r6 <== NOT EXECUTED
198d4: e5997008 ldr r7, [r9, #8] <== NOT EXECUTED
198d8: eb001901 bl 1fce4 <strerror> <== NOT EXECUTED
198dc: e1a01007 mov r1, r7 <== NOT EXECUTED
198e0: e1a03000 mov r3, r0 <== NOT EXECUTED
198e4: e1a02006 mov r2, r6 <== NOT EXECUTED
198e8: e59f00c4 ldr r0, [pc, #196] ; 199b4 <rtems_rfs_dir_del_entry+0x3c0><== NOT EXECUTED
198ec: eb00144e bl 1ea2c <printf> <== NOT EXECUTED
"block map shrink failed for ino %" PRIu32 ": %d: %s\n",
rtems_rfs_inode_ino (dir), rc, strerror (rc));
}
}
rtems_rfs_buffer_mark_dirty (&buffer);
198f0: e28d1074 add r1, sp, #116 ; 0x74
198f4: e3a03001 mov r3, #1
198f8: e5613010 strb r3, [r1, #-16]!
rtems_rfs_buffer_handle_close (fs, &buffer);
198fc: e1a00005 mov r0, r5
19900: ebfffd2a bl 18db0 <rtems_rfs_buffer_handle_close>
rtems_rfs_block_map_close (fs, &map);
19904: e1a00005 mov r0, r5
19908: e28d1014 add r1, sp, #20
1990c: ebfff83a bl 179fc <rtems_rfs_block_map_close>
return 0;
19910: ea00001b b 19984 <rtems_rfs_dir_del_entry+0x390>
}
if (!search)
19914: e35b0000 cmp fp, #0 <== NOT EXECUTED
19918: 0a00001c beq 19990 <rtems_rfs_dir_del_entry+0x39c> <== NOT EXECUTED
{
rc = EIO;
break;
}
entry += elength;
1991c: e082200a add r2, r2, sl <== NOT EXECUTED
eoffset += elength;
19920: e087700a add r7, r7, sl <== NOT EXECUTED
else
eoffset = offset % rtems_rfs_fs_block_size (fs);
entry = rtems_rfs_buffer_data (&buffer) + eoffset;
while (eoffset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19924: e1570001 cmp r7, r1
19928: 3affff80 bcc 19730 <rtems_rfs_dir_del_entry+0x13c>
entry += elength;
eoffset += elength;
}
if (rc == 0)
1992c: e3580000 cmp r8, #0 <== NOT EXECUTED
19930: 1a000008 bne 19958 <rtems_rfs_dir_del_entry+0x364> <== NOT EXECUTED
{
rc = rtems_rfs_block_map_next_block (fs, &map, &block);
19934: e1a00005 mov r0, r5 <== NOT EXECUTED
19938: e28d1014 add r1, sp, #20 <== NOT EXECUTED
1993c: e28d2070 add r2, sp, #112 ; 0x70 <== NOT EXECUTED
19940: ebfff913 bl 17d94 <rtems_rfs_block_map_next_block> <== NOT EXECUTED
if (rc == ENXIO)
19944: e3500006 cmp r0, #6 <== NOT EXECUTED
eoffset += elength;
}
if (rc == 0)
{
rc = rtems_rfs_block_map_next_block (fs, &map, &block);
19948: e1a04000 mov r4, r0 <== NOT EXECUTED
if (rc == ENXIO)
1994c: 1a000002 bne 1995c <rtems_rfs_dir_del_entry+0x368> <== NOT EXECUTED
rc = ENOENT;
19950: e3a04002 mov r4, #2 <== NOT EXECUTED
19954: ea000002 b 19964 <rtems_rfs_dir_del_entry+0x370> <== NOT EXECUTED
rc = ENOENT;
rtems_rfs_block_map_close (fs, &map);
return rc;
}
rc = rtems_rfs_buffer_handle_open (fs, &buffer);
19958: e1a04008 mov r4, r8 <== NOT EXECUTED
/*
* Only search if the offset is 0 else we are at that position.
*/
search = offset ? false : true;
while (rc == 0)
1995c: e3540000 cmp r4, #0
19960: 0affff4e beq 196a0 <rtems_rfs_dir_del_entry+0xac>
19964: e1a07004 mov r7, r4 <== NOT EXECUTED
if (rc == ENXIO)
rc = ENOENT;
}
}
rtems_rfs_buffer_handle_close (fs, &buffer);
19968: e28d1064 add r1, sp, #100 ; 0x64 <== NOT EXECUTED
1996c: e1a00005 mov r0, r5 <== NOT EXECUTED
19970: ebfffd0e bl 18db0 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
19974: e1a00005 mov r0, r5 <== NOT EXECUTED
19978: e28d1014 add r1, sp, #20 <== NOT EXECUTED
1997c: ebfff81e bl 179fc <rtems_rfs_block_map_close> <== NOT EXECUTED
return rc;
19980: e1a04007 mov r4, r7 <== NOT EXECUTED
}
19984: e1a00004 mov r0, r4
19988: e28dd074 add sp, sp, #116 ; 0x74
1998c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
rc = ENOENT;
rtems_rfs_block_map_close (fs, &map);
return rc;
}
rc = rtems_rfs_buffer_handle_open (fs, &buffer);
19990: e3a08005 mov r8, #5 <== NOT EXECUTED
19994: eaffffef b 19958 <rtems_rfs_dir_del_entry+0x364> <== NOT EXECUTED
00019cec <rtems_rfs_dir_empty>:
int
rtems_rfs_dir_empty (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* dir)
{
19cec: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
19cf0: e1a04000 mov r4, r0
19cf4: e24dd064 sub sp, sp, #100 ; 0x64
19cf8: e1a05001 mov r5, r1
rtems_rfs_buffer_handle buffer;
rtems_rfs_block_no block;
bool empty;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_READ))
19cfc: e3a00102 mov r0, #-2147483648 ; 0x80000000
19d00: e3a01000 mov r1, #0
19d04: ebffdd58 bl 1126c <rtems_rfs_trace>
19d08: e3500000 cmp r0, #0
printf ("rtems-rfs: dir-empty: dir=%" PRId32 "\n", rtems_rfs_inode_ino (dir));
19d0c: 159f019c ldrne r0, [pc, #412] ; 19eb0 <rtems_rfs_dir_empty+0x1c4>
19d10: 15951008 ldrne r1, [r5, #8]
19d14: 1b001344 blne 1ea2c <printf>
empty = true;
rc = rtems_rfs_block_map_open (fs, dir, &map);
19d18: e1a00004 mov r0, r4
19d1c: e1a01005 mov r1, r5
19d20: e28d2004 add r2, sp, #4
19d24: ebfff6db bl 17898 <rtems_rfs_block_map_open>
if (rc > 0)
19d28: e2508000 subs r8, r0, #0
19d2c: ca00005c bgt 19ea4 <rtems_rfs_dir_empty+0x1b8>
return rc;
rc = rtems_rfs_block_map_seek (fs, &map, 0, &block);
19d30: e28d3060 add r3, sp, #96 ; 0x60
19d34: e58d3000 str r3, [sp]
19d38: e1a00004 mov r0, r4
19d3c: e28d1004 add r1, sp, #4
19d40: e3a02000 mov r2, #0
19d44: e3a03000 mov r3, #0
19d48: ebfff7f5 bl 17d24 <rtems_rfs_block_map_seek>
if (rc > 0)
19d4c: e2508000 subs r8, r0, #0
19d50: ca000050 bgt 19e98 <rtems_rfs_dir_empty+0x1ac>
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
19d54: e3a03000 mov r3, #0
19d58: e5cd3054 strb r3, [sp, #84] ; 0x54
handle->bnum = 0;
19d5c: e58d3058 str r3, [sp, #88] ; 0x58
handle->buffer = NULL;
19d60: e58d305c str r3, [sp, #92] ; 0x5c
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19d64: e59f6148 ldr r6, [pc, #328] ; 19eb4 <rtems_rfs_dir_empty+0x1c8>
while (empty)
{
uint8_t* entry;
int offset;
rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, true);
19d68: e1a00004 mov r0, r4
19d6c: e28d1054 add r1, sp, #84 ; 0x54
19d70: e59d2060 ldr r2, [sp, #96] ; 0x60
19d74: e3a03001 mov r3, #1
19d78: ebfffa7b bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
19d7c: e2508000 subs r8, r0, #0
19d80: ca000041 bgt 19e8c <rtems_rfs_dir_empty+0x1a0>
break;
entry = rtems_rfs_buffer_data (&buffer);
19d84: e59d305c ldr r3, [sp, #92] ; 0x5c
offset = 0;
while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19d88: e5942008 ldr r2, [r4, #8]
rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, true);
if (rc > 0)
break;
entry = rtems_rfs_buffer_data (&buffer);
19d8c: e593301c ldr r3, [r3, #28]
offset = 0;
while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19d90: e242200a sub r2, r2, #10
rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, true);
if (rc > 0)
break;
entry = rtems_rfs_buffer_data (&buffer);
offset = 0;
19d94: e3a09000 mov r9, #0
while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19d98: ea00002e b 19e58 <rtems_rfs_dir_empty+0x16c>
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
19d9c: e5d31009 ldrb r1, [r3, #9]
19da0: e5d3a008 ldrb sl, [r3, #8]
19da4: e181a40a orr sl, r1, sl, lsl #8
eino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19da8: e15a0006 cmp sl, r6
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19dac: e5d3c000 ldrb ip, [r3]
19db0: e5d37001 ldrb r7, [r3, #1]
19db4: e5d31002 ldrb r1, [r3, #2]
19db8: e5d30003 ldrb r0, [r3, #3]
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
19dbc: 0a000027 beq 19e60 <rtems_rfs_dir_empty+0x174>
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19dc0: e1a07807 lsl r7, r7, #16
19dc4: e1877c0c orr r7, r7, ip, lsl #24
19dc8: e1877000 orr r7, r7, r0
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
break;
if (rtems_rfs_dir_entry_valid (fs, elength, eino))
19dcc: e35a000a cmp sl, #10
{
rtems_rfs_ino eino;
int elength;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19dd0: e1877401 orr r7, r7, r1, lsl #8
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
break;
if (rtems_rfs_dir_entry_valid (fs, elength, eino))
19dd4: da000006 ble 19df4 <rtems_rfs_dir_empty+0x108>
19dd8: e594101c ldr r1, [r4, #28]
19ddc: e3570000 cmp r7, #0
19de0: 115a0001 cmpne sl, r1
19de4: 2a000002 bcs 19df4 <rtems_rfs_dir_empty+0x108>
19de8: e5941014 ldr r1, [r4, #20]
19dec: e1570001 cmp r7, r1
19df0: 9a00000b bls 19e24 <rtems_rfs_dir_empty+0x138>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_EMPTY))
19df4: e3a00000 mov r0, #0 <== NOT EXECUTED
19df8: e3a01001 mov r1, #1 <== NOT EXECUTED
19dfc: ebffdd1a bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19e00: e3500000 cmp r0, #0 <== NOT EXECUTED
19e04: 0a000015 beq 19e60 <rtems_rfs_dir_empty+0x174> <== NOT EXECUTED
printf ("rtems-rfs: dir-empty: "
19e08: e5951008 ldr r1, [r5, #8] <== NOT EXECUTED
19e0c: e1a0200a mov r2, sl <== NOT EXECUTED
19e10: e1a03007 mov r3, r7 <== NOT EXECUTED
19e14: e59f009c ldr r0, [pc, #156] ; 19eb8 <rtems_rfs_dir_empty+0x1cc><== NOT EXECUTED
19e18: e58d9000 str r9, [sp] <== NOT EXECUTED
19e1c: eb001302 bl 1ea2c <printf> <== NOT EXECUTED
19e20: ea00000e b 19e60 <rtems_rfs_dir_empty+0x174> <== NOT EXECUTED
/*
* Ignore the current (.) and parent (..) entries. Anything else means
* the directory is not empty.
*/
if (((elength != (RTEMS_RFS_DIR_ENTRY_SIZE + 1)) ||
19e24: e35a000b cmp sl, #11
19e28: 05d3100a ldrbeq r1, [r3, #10]
19e2c: 0a000005 beq 19e48 <rtems_rfs_dir_empty+0x15c>
(entry[RTEMS_RFS_DIR_ENTRY_SIZE] != '.')) &&
19e30: e35a000c cmp sl, #12
19e34: 1a000012 bne 19e84 <rtems_rfs_dir_empty+0x198>
((elength != (RTEMS_RFS_DIR_ENTRY_SIZE + 2)) ||
19e38: e5d3100a ldrb r1, [r3, #10]
19e3c: e351002e cmp r1, #46 ; 0x2e
19e40: 1a00000f bne 19e84 <rtems_rfs_dir_empty+0x198>
(entry[RTEMS_RFS_DIR_ENTRY_SIZE] != '.') ||
19e44: e5d3100b ldrb r1, [r3, #11]
19e48: e351002e cmp r1, #46 ; 0x2e
19e4c: 1a00000c bne 19e84 <rtems_rfs_dir_empty+0x198>
{
empty = false;
break;
}
entry += elength;
19e50: e083300a add r3, r3, sl
offset += elength;
19e54: e089900a add r9, r9, sl
break;
entry = rtems_rfs_buffer_data (&buffer);
offset = 0;
while (offset < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19e58: e1590002 cmp r9, r2
19e5c: 3affffce bcc 19d9c <rtems_rfs_dir_empty+0xb0>
offset += elength;
}
if (empty)
{
rc = rtems_rfs_block_map_next_block (fs, &map, &block);
19e60: e1a00004 mov r0, r4
19e64: e28d1004 add r1, sp, #4
19e68: e28d2060 add r2, sp, #96 ; 0x60
19e6c: ebfff7c8 bl 17d94 <rtems_rfs_block_map_next_block>
if (rc > 0)
19e70: e2508000 subs r8, r0, #0
19e74: daffffbb ble 19d68 <rtems_rfs_dir_empty+0x7c>
{
if (rc == ENXIO)
19e78: e3580006 cmp r8, #6
19e7c: 03a08000 moveq r8, #0
19e80: ea000001 b 19e8c <rtems_rfs_dir_empty+0x1a0>
}
}
}
if ((rc == 0) && !empty)
rc = ENOTEMPTY;
19e84: e3580000 cmp r8, #0
19e88: 03a0805a moveq r8, #90 ; 0x5a
rtems_rfs_buffer_handle_close (fs, &buffer);
19e8c: e1a00004 mov r0, r4
19e90: e28d1054 add r1, sp, #84 ; 0x54
19e94: ebfffbc5 bl 18db0 <rtems_rfs_buffer_handle_close>
rtems_rfs_block_map_close (fs, &map);
19e98: e1a00004 mov r0, r4
19e9c: e28d1004 add r1, sp, #4
19ea0: ebfff6d5 bl 179fc <rtems_rfs_block_map_close>
return rc;
}
19ea4: e1a00008 mov r0, r8
19ea8: e28dd064 add sp, sp, #100 ; 0x64
19eac: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
0001d310 <rtems_rfs_dir_hash>:
{
uint32_t a,b,c; /* internal state */
union { const void *ptr; size_t i; } u; /* needed for Mac Powerbook G4 */
/* Set up the internal state */
a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
1d310: e59f31a8 ldr r3, [pc, #424] ; 1d4c0 <rtems_rfs_dir_hash+0x1b0>
1d314: e0813003 add r3, r1, r3
*/
#define initval (20010928)
uint32_t
rtems_rfs_dir_hash (const void *key, size_t length)
{
1d318: e92d4010 push {r4, lr}
uint32_t a,b,c; /* internal state */
union { const void *ptr; size_t i; } u; /* needed for Mac Powerbook G4 */
/* Set up the internal state */
a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
1d31c: e1a02003 mov r2, r3
1d320: e1a0c003 mov ip, r3
} else { /* need to read the key one byte at a time */
const uint8_t *k = (const uint8_t *)key;
/*--------------- all but the last block: affect some 32 bits of (a,b,c) */
while (length > 12)
1d324: ea00002b b 1d3d8 <rtems_rfs_dir_hash+0xc8>
{
a += k[0];
1d328: e5d04000 ldrb r4, [r0]
1d32c: e084c00c add ip, r4, ip
a += ((uint32_t)k[1])<<8;
1d330: e5d04001 ldrb r4, [r0, #1]
1d334: e08cc404 add ip, ip, r4, lsl #8
a += ((uint32_t)k[2])<<16;
1d338: e5d04002 ldrb r4, [r0, #2]
1d33c: e08cc804 add ip, ip, r4, lsl #16
a += ((uint32_t)k[3])<<24;
1d340: e5d04003 ldrb r4, [r0, #3]
1d344: e08ccc04 add ip, ip, r4, lsl #24
b += k[4];
1d348: e5d04004 ldrb r4, [r0, #4]
1d34c: e0842002 add r2, r4, r2
b += ((uint32_t)k[5])<<8;
1d350: e5d04005 ldrb r4, [r0, #5]
1d354: e0822404 add r2, r2, r4, lsl #8
b += ((uint32_t)k[6])<<16;
1d358: e5d04006 ldrb r4, [r0, #6]
1d35c: e0822804 add r2, r2, r4, lsl #16
b += ((uint32_t)k[7])<<24;
1d360: e5d04007 ldrb r4, [r0, #7]
1d364: e0822c04 add r2, r2, r4, lsl #24
c += k[8];
1d368: e5d04008 ldrb r4, [r0, #8]
1d36c: e0843003 add r3, r4, r3
c += ((uint32_t)k[9])<<8;
1d370: e5d04009 ldrb r4, [r0, #9]
1d374: e0833404 add r3, r3, r4, lsl #8
c += ((uint32_t)k[10])<<16;
1d378: e5d0400a ldrb r4, [r0, #10]
1d37c: e0833804 add r3, r3, r4, lsl #16
c += ((uint32_t)k[11])<<24;
1d380: e5d0400b ldrb r4, [r0, #11]
1d384: e0833c04 add r3, r3, r4, lsl #24
mix(a,b,c);
1d388: e063c00c rsb ip, r3, ip
1d38c: e02cce63 eor ip, ip, r3, ror #28
1d390: e0833002 add r3, r3, r2
1d394: e06c2002 rsb r2, ip, r2
1d398: e0222d6c eor r2, r2, ip, ror #26
1d39c: e08cc003 add ip, ip, r3
1d3a0: e0623003 rsb r3, r2, r3
1d3a4: e0233c62 eor r3, r3, r2, ror #24
1d3a8: e082200c add r2, r2, ip
1d3ac: e063c00c rsb ip, r3, ip
1d3b0: e02cc863 eor ip, ip, r3, ror #16
1d3b4: e0833002 add r3, r3, r2
1d3b8: e06c2002 rsb r2, ip, r2
1d3bc: e02226ec eor r2, r2, ip, ror #13
1d3c0: e08cc003 add ip, ip, r3
1d3c4: e0623003 rsb r3, r2, r3
1d3c8: e0233e62 eor r3, r3, r2, ror #28
length -= 12;
1d3cc: e241100c sub r1, r1, #12
b += ((uint32_t)k[7])<<24;
c += k[8];
c += ((uint32_t)k[9])<<8;
c += ((uint32_t)k[10])<<16;
c += ((uint32_t)k[11])<<24;
mix(a,b,c);
1d3d0: e082200c add r2, r2, ip
length -= 12;
k += 12;
1d3d4: e280000c add r0, r0, #12
} else { /* need to read the key one byte at a time */
const uint8_t *k = (const uint8_t *)key;
/*--------------- all but the last block: affect some 32 bits of (a,b,c) */
while (length > 12)
1d3d8: e351000c cmp r1, #12
1d3dc: 8affffd1 bhi 1d328 <rtems_rfs_dir_hash+0x18>
length -= 12;
k += 12;
}
/*-------------------------------- last block: affect all 32 bits of (c) */
switch(length) /* all the case statements fall through */
1d3e0: e2411001 sub r1, r1, #1
1d3e4: e351000b cmp r1, #11
1d3e8: 979ff101 ldrls pc, [pc, r1, lsl #2]
1d3ec: ea000031 b 1d4b8 <rtems_rfs_dir_hash+0x1a8> <== NOT EXECUTED
1d3f0: 0001d478 .word 0x0001d478 <== NOT EXECUTED
1d3f4: 0001d470 .word 0x0001d470 <== NOT EXECUTED
1d3f8: 0001d468 .word 0x0001d468 <== NOT EXECUTED
1d3fc: 0001d460 .word 0x0001d460 <== NOT EXECUTED
1d400: 0001d458 .word 0x0001d458 <== NOT EXECUTED
1d404: 0001d450 .word 0x0001d450 <== NOT EXECUTED
1d408: 0001d448 .word 0x0001d448 <== NOT EXECUTED
1d40c: 0001d440 .word 0x0001d440 <== NOT EXECUTED
1d410: 0001d438 .word 0x0001d438 <== NOT EXECUTED
1d414: 0001d430 .word 0x0001d430 <== NOT EXECUTED
1d418: 0001d428 .word 0x0001d428 <== NOT EXECUTED
1d41c: 0001d420 .word 0x0001d420 <== NOT EXECUTED
{
case 12: c+=((uint32_t)k[11])<<24;
1d420: e5d0100b ldrb r1, [r0, #11]
1d424: e0833c01 add r3, r3, r1, lsl #24
case 11: c+=((uint32_t)k[10])<<16;
1d428: e5d0100a ldrb r1, [r0, #10]
1d42c: e0833801 add r3, r3, r1, lsl #16
case 10: c+=((uint32_t)k[9])<<8;
1d430: e5d01009 ldrb r1, [r0, #9]
1d434: e0833401 add r3, r3, r1, lsl #8
case 9 : c+=k[8];
1d438: e5d01008 ldrb r1, [r0, #8]
1d43c: e0833001 add r3, r3, r1
case 8 : b+=((uint32_t)k[7])<<24;
1d440: e5d01007 ldrb r1, [r0, #7]
1d444: e0822c01 add r2, r2, r1, lsl #24
case 7 : b+=((uint32_t)k[6])<<16;
1d448: e5d01006 ldrb r1, [r0, #6]
1d44c: e0822801 add r2, r2, r1, lsl #16
case 6 : b+=((uint32_t)k[5])<<8;
1d450: e5d01005 ldrb r1, [r0, #5]
1d454: e0822401 add r2, r2, r1, lsl #8
case 5 : b+=k[4];
1d458: e5d01004 ldrb r1, [r0, #4]
1d45c: e0822001 add r2, r2, r1
case 4 : a+=((uint32_t)k[3])<<24;
1d460: e5d01003 ldrb r1, [r0, #3]
1d464: e08ccc01 add ip, ip, r1, lsl #24
case 3 : a+=((uint32_t)k[2])<<16;
1d468: e5d01002 ldrb r1, [r0, #2]
1d46c: e08cc801 add ip, ip, r1, lsl #16
case 2 : a+=((uint32_t)k[1])<<8;
1d470: e5d01001 ldrb r1, [r0, #1]
1d474: e08cc401 add ip, ip, r1, lsl #8
case 1 : a+=k[0];
1d478: e5d01000 ldrb r1, [r0]
break;
case 0 : return c;
}
}
final(a,b,c);
1d47c: e0233002 eor r3, r3, r2
case 6 : b+=((uint32_t)k[5])<<8;
case 5 : b+=k[4];
case 4 : a+=((uint32_t)k[3])<<24;
case 3 : a+=((uint32_t)k[2])<<16;
case 2 : a+=((uint32_t)k[1])<<8;
case 1 : a+=k[0];
1d480: e08cc001 add ip, ip, r1
break;
case 0 : return c;
}
}
final(a,b,c);
1d484: e0431962 sub r1, r3, r2, ror #18
1d488: e021c00c eor ip, r1, ip
1d48c: e04ccae1 sub ip, ip, r1, ror #21
1d490: e02c2002 eor r2, ip, r2
1d494: e04223ec sub r2, r2, ip, ror #7
1d498: e0221001 eor r1, r2, r1
1d49c: e0411862 sub r1, r1, r2, ror #16
1d4a0: e021c00c eor ip, r1, ip
1d4a4: e04cce61 sub ip, ip, r1, ror #28
1d4a8: e02c2002 eor r2, ip, r2
1d4ac: e042296c sub r2, r2, ip, ror #18
1d4b0: e0223001 eor r3, r2, r1
1d4b4: e0433462 sub r3, r3, r2, ror #8
return c;
}
1d4b8: e1a00003 mov r0, r3
1d4bc: e8bd8010 pop {r4, pc}
00018dd0 <rtems_rfs_dir_lookup_ino>:
rtems_rfs_inode_handle* inode,
const char* name,
int length,
rtems_rfs_ino* ino,
uint32_t* offset)
{
18dd0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
18dd4: e1a06000 mov r6, r0
18dd8: e24dd070 sub sp, sp, #112 ; 0x70
18ddc: e1a07001 mov r7, r1
rtems_rfs_block_map map;
rtems_rfs_buffer_handle entries;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
18de0: e3a00301 mov r0, #67108864 ; 0x4000000
18de4: e3a01000 mov r1, #0
rtems_rfs_inode_handle* inode,
const char* name,
int length,
rtems_rfs_ino* ino,
uint32_t* offset)
{
18de8: e58d2008 str r2, [sp, #8]
18dec: e1a09003 mov r9, r3
18df0: e59db094 ldr fp, [sp, #148] ; 0x94
rtems_rfs_block_map map;
rtems_rfs_buffer_handle entries;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
18df4: ebffe11c bl 1126c <rtems_rfs_trace>
18df8: e3500000 cmp r0, #0
18dfc: 0a00000d beq 18e38 <rtems_rfs_dir_lookup_ino+0x68>
{
int c;
printf ("rtems-rfs: dir-lookup-ino: lookup ino: root=%" PRId32 ", path=",
18e00: e59f0440 ldr r0, [pc, #1088] ; 19248 <rtems_rfs_dir_lookup_ino+0x478><== NOT EXECUTED
18e04: e5971008 ldr r1, [r7, #8] <== NOT EXECUTED
18e08: eb001707 bl 1ea2c <printf> <== NOT EXECUTED
inode->ino);
for (c = 0; c < length; c++)
18e0c: e3a04000 mov r4, #0 <== NOT EXECUTED
18e10: ea000003 b 18e24 <rtems_rfs_dir_lookup_ino+0x54> <== NOT EXECUTED
printf ("%c", name[c]);
18e14: e59dc008 ldr ip, [sp, #8] <== NOT EXECUTED
18e18: e7dc0004 ldrb r0, [ip, r4] <== NOT EXECUTED
18e1c: eb00176c bl 1ebd4 <putchar> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
{
int c;
printf ("rtems-rfs: dir-lookup-ino: lookup ino: root=%" PRId32 ", path=",
inode->ino);
for (c = 0; c < length; c++)
18e20: e2844001 add r4, r4, #1 <== NOT EXECUTED
18e24: e1540009 cmp r4, r9 <== NOT EXECUTED
18e28: bafffff9 blt 18e14 <rtems_rfs_dir_lookup_ino+0x44> <== NOT EXECUTED
printf ("%c", name[c]);
printf (", len=%d\n", length);
18e2c: e59f0418 ldr r0, [pc, #1048] ; 1924c <rtems_rfs_dir_lookup_ino+0x47c><== NOT EXECUTED
18e30: e1a01009 mov r1, r9 <== NOT EXECUTED
18e34: eb0016fc bl 1ea2c <printf> <== NOT EXECUTED
}
*ino = RTEMS_RFS_EMPTY_INO;
*offset = 0;
18e38: e59dc098 ldr ip, [sp, #152] ; 0x98
for (c = 0; c < length; c++)
printf ("%c", name[c]);
printf (", len=%d\n", length);
}
*ino = RTEMS_RFS_EMPTY_INO;
18e3c: e3a05000 mov r5, #0
18e40: e58b5000 str r5, [fp]
*offset = 0;
rc = rtems_rfs_block_map_open (fs, inode, &map);
18e44: e1a00006 mov r0, r6
printf ("%c", name[c]);
printf (", len=%d\n", length);
}
*ino = RTEMS_RFS_EMPTY_INO;
*offset = 0;
18e48: e58c5000 str r5, [ip]
rc = rtems_rfs_block_map_open (fs, inode, &map);
18e4c: e1a01007 mov r1, r7
18e50: e28d2010 add r2, sp, #16
18e54: ebfffa8f bl 17898 <rtems_rfs_block_map_open>
if (rc > 0)
18e58: e2504000 subs r4, r0, #0
18e5c: da00000d ble 18e98 <rtems_rfs_dir_lookup_ino+0xc8>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
18e60: e3a00301 mov r0, #67108864 ; 0x4000000 <== NOT EXECUTED
18e64: e3a01000 mov r1, #0 <== NOT EXECUTED
18e68: ebffe0ff bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18e6c: e1500005 cmp r0, r5 <== NOT EXECUTED
18e70: 0a0000e8 beq 19218 <rtems_rfs_dir_lookup_ino+0x448> <== NOT EXECUTED
printf ("rtems-rfs: dir-lookup-ino: map open failed for ino %" PRIu32 ": %d: %s",
18e74: e1a00004 mov r0, r4 <== NOT EXECUTED
18e78: e5975008 ldr r5, [r7, #8] <== NOT EXECUTED
18e7c: eb001b98 bl 1fce4 <strerror> <== NOT EXECUTED
18e80: e1a01005 mov r1, r5 <== NOT EXECUTED
18e84: e1a03000 mov r3, r0 <== NOT EXECUTED
18e88: e1a02004 mov r2, r4 <== NOT EXECUTED
18e8c: e59f03bc ldr r0, [pc, #956] ; 19250 <rtems_rfs_dir_lookup_ino+0x480><== NOT EXECUTED
18e90: eb0016e5 bl 1ea2c <printf> <== NOT EXECUTED
18e94: ea0000df b 19218 <rtems_rfs_dir_lookup_ino+0x448> <== NOT EXECUTED
uint32_t hash;
/*
* Calculate the hash of the look up string.
*/
hash = rtems_rfs_dir_hash (name, length);
18e98: e1a01009 mov r1, r9
18e9c: e59d0008 ldr r0, [sp, #8]
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
18ea0: e5cd5060 strb r5, [sp, #96] ; 0x60
handle->bnum = 0;
18ea4: e58d5064 str r5, [sp, #100] ; 0x64
handle->buffer = NULL;
18ea8: e58d5068 str r5, [sp, #104] ; 0x68
18eac: eb001117 bl 1d310 <rtems_rfs_dir_hash>
/*
* Locate the first block. The map points to the start after open so just
* seek 0. If an error the block will be 0.
*/
rc = rtems_rfs_block_map_seek (fs, &map, 0, &block);
18eb0: e28d306c add r3, sp, #108 ; 0x6c
uint32_t hash;
/*
* Calculate the hash of the look up string.
*/
hash = rtems_rfs_dir_hash (name, length);
18eb4: e58d000c str r0, [sp, #12]
/*
* Locate the first block. The map points to the start after open so just
* seek 0. If an error the block will be 0.
*/
rc = rtems_rfs_block_map_seek (fs, &map, 0, &block);
18eb8: e58d3000 str r3, [sp]
18ebc: e1a00006 mov r0, r6
18ec0: e28d1010 add r1, sp, #16
18ec4: e3a02000 mov r2, #0
18ec8: e3a03000 mov r3, #0
18ecc: ebfffb94 bl 17d24 <rtems_rfs_block_map_seek>
if (rc > 0)
18ed0: e2504000 subs r4, r0, #0
18ed4: da0000b6 ble 191b4 <rtems_rfs_dir_lookup_ino+0x3e4>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
18ed8: e3a00301 mov r0, #67108864 ; 0x4000000 <== NOT EXECUTED
18edc: e3a01000 mov r1, #0 <== NOT EXECUTED
18ee0: ebffe0e1 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18ee4: e3500000 cmp r0, #0 <== NOT EXECUTED
18ee8: 0a000005 beq 18f04 <rtems_rfs_dir_lookup_ino+0x134> <== NOT EXECUTED
printf ("rtems-rfs: dir-lookup-ino: block map find failed: %d: %s\n",
18eec: e1a00004 mov r0, r4 <== NOT EXECUTED
18ef0: eb001b7b bl 1fce4 <strerror> <== NOT EXECUTED
18ef4: e1a01004 mov r1, r4 <== NOT EXECUTED
18ef8: e1a02000 mov r2, r0 <== NOT EXECUTED
18efc: e59f0350 ldr r0, [pc, #848] ; 19254 <rtems_rfs_dir_lookup_ino+0x484><== NOT EXECUTED
18f00: eb0016c9 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
if (rc == ENXIO)
rc = ENOENT;
18f04: e3540006 cmp r4, #6 <== NOT EXECUTED
18f08: 03a04002 moveq r4, #2 <== NOT EXECUTED
18f0c: ea0000bb b 19200 <rtems_rfs_dir_lookup_ino+0x430> <== NOT EXECUTED
while ((rc == 0) && block)
{
uint8_t* entry;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
18f10: e3a00301 mov r0, #67108864 ; 0x4000000
18f14: e3a01000 mov r1, #0
18f18: ebffe0d3 bl 1126c <rtems_rfs_trace>
18f1c: e3500000 cmp r0, #0
printf ("rtems-rfs: dir-lookup-ino: block read, ino=%" PRIu32 " bno=%" PRId32 "\n",
18f20: 159f0330 ldrne r0, [pc, #816] ; 19258 <rtems_rfs_dir_lookup_ino+0x488>
18f24: 15981008 ldrne r1, [r8, #8]
18f28: 159d2020 ldrne r2, [sp, #32]
18f2c: 1b0016be blne 1ea2c <printf>
rtems_rfs_inode_ino (inode), map.bpos.bno);
rc = rtems_rfs_buffer_handle_request (fs, &entries, block, true);
18f30: e1a00006 mov r0, r6
18f34: e28d1060 add r1, sp, #96 ; 0x60
18f38: e59d206c ldr r2, [sp, #108] ; 0x6c
18f3c: e3a03001 mov r3, #1
18f40: ebfffe09 bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
18f44: e250a000 subs sl, r0, #0
18f48: da000010 ble 18f90 <rtems_rfs_dir_lookup_ino+0x1c0>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
18f4c: e3a00301 mov r0, #67108864 ; 0x4000000 <== NOT EXECUTED
18f50: e3a01000 mov r1, #0 <== NOT EXECUTED
18f54: ebffe0c4 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
18f58: e3500000 cmp r0, #0 <== NOT EXECUTED
18f5c: e1a07008 mov r7, r8 <== NOT EXECUTED
18f60: 0a00009b beq 191d4 <rtems_rfs_dir_lookup_ino+0x404> <== NOT EXECUTED
printf ("rtems-rfs: dir-lookup-ino: block read, ino=%" PRIu32 " block=%" PRId32 ": %d: %s\n",
18f64: e1a0000a mov r0, sl <== NOT EXECUTED
18f68: e5985008 ldr r5, [r8, #8] <== NOT EXECUTED
18f6c: e59d406c ldr r4, [sp, #108] ; 0x6c <== NOT EXECUTED
18f70: eb001b5b bl 1fce4 <strerror> <== NOT EXECUTED
18f74: e1a01005 mov r1, r5 <== NOT EXECUTED
18f78: e58d0000 str r0, [sp] <== NOT EXECUTED
18f7c: e1a02004 mov r2, r4 <== NOT EXECUTED
18f80: e1a0300a mov r3, sl <== NOT EXECUTED
18f84: e59f02d0 ldr r0, [pc, #720] ; 1925c <rtems_rfs_dir_lookup_ino+0x48c><== NOT EXECUTED
18f88: eb0016a7 bl 1ea2c <printf> <== NOT EXECUTED
18f8c: ea000090 b 191d4 <rtems_rfs_dir_lookup_ino+0x404> <== NOT EXECUTED
/*
* Search the block to see if the name matches. A hash of 0xffff or 0x0
* means the entry is empty.
*/
entry = rtems_rfs_buffer_data (&entries);
18f90: e59d3068 ldr r3, [sp, #104] ; 0x68
18f94: e593501c ldr r5, [r3, #28]
map.bpos.boff = 0;
18f98: e3a03000 mov r3, #0
18f9c: e58d3024 str r3, [sp, #36] ; 0x24
while (map.bpos.boff < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
18fa0: ea000060 b 19128 <rtems_rfs_dir_lookup_ino+0x358>
{
uint32_t ehash;
int elength;
ehash = rtems_rfs_dir_entry_hash (entry);
elength = rtems_rfs_dir_entry_length (entry);
18fa4: e5d53009 ldrb r3, [r5, #9]
18fa8: e5d57008 ldrb r7, [r5, #8]
18fac: e1837407 orr r7, r3, r7, lsl #8
*ino = rtems_rfs_dir_entry_ino (entry);
18fb0: e5d53001 ldrb r3, [r5, #1]
18fb4: e5d5e000 ldrb lr, [r5]
18fb8: e1a03803 lsl r3, r3, #16
18fbc: e1833c0e orr r3, r3, lr, lsl #24
18fc0: e5d5e003 ldrb lr, [r5, #3]
18fc4: e183300e orr r3, r3, lr
18fc8: e5d5e002 ldrb lr, [r5, #2]
18fcc: e183340e orr r3, r3, lr, lsl #8
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
18fd0: e59fe288 ldr lr, [pc, #648] ; 19260 <rtems_rfs_dir_lookup_ino+0x490>
18fd4: e157000e cmp r7, lr
while (map.bpos.boff < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
{
uint32_t ehash;
int elength;
ehash = rtems_rfs_dir_entry_hash (entry);
18fd8: e5d50004 ldrb r0, [r5, #4]
18fdc: e5d5c005 ldrb ip, [r5, #5]
18fe0: e5d52006 ldrb r2, [r5, #6]
18fe4: e5d51007 ldrb r1, [r5, #7]
elength = rtems_rfs_dir_entry_length (entry);
*ino = rtems_rfs_dir_entry_ino (entry);
18fe8: e58b3000 str r3, [fp]
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
18fec: 0a000052 beq 1913c <rtems_rfs_dir_lookup_ino+0x36c>
break;
if (rtems_rfs_dir_entry_valid (fs, elength, *ino))
18ff0: e357000a cmp r7, #10
18ff4: da000007 ble 19018 <rtems_rfs_dir_lookup_ino+0x248>
18ff8: e596e01c ldr lr, [r6, #28]
18ffc: e157000e cmp r7, lr
19000: 2a000004 bcs 19018 <rtems_rfs_dir_lookup_ino+0x248>
19004: e3530000 cmp r3, #0
19008: 0a000002 beq 19018 <rtems_rfs_dir_lookup_ino+0x248>
1900c: e596e014 ldr lr, [r6, #20]
19010: e153000e cmp r3, lr
19014: 9a00000c bls 1904c <rtems_rfs_dir_lookup_ino+0x27c>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
19018: e3a00301 mov r0, #67108864 ; 0x4000000 <== NOT EXECUTED
1901c: e3a01000 mov r1, #0 <== NOT EXECUTED
19020: ebffe091 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19024: e3500000 cmp r0, #0 <== NOT EXECUTED
19028: 0a00007d beq 19224 <rtems_rfs_dir_lookup_ino+0x454> <== NOT EXECUTED
printf ("rtems-rfs: dir-lookup-ino: "
1902c: e59d3024 ldr r3, [sp, #36] ; 0x24 <== NOT EXECUTED
19030: e58d3000 str r3, [sp] <== NOT EXECUTED
19034: e1a02007 mov r2, r7 <== NOT EXECUTED
19038: e5981008 ldr r1, [r8, #8] <== NOT EXECUTED
1903c: e59b3000 ldr r3, [fp] <== NOT EXECUTED
19040: e59f021c ldr r0, [pc, #540] ; 19264 <rtems_rfs_dir_lookup_ino+0x494><== NOT EXECUTED
19044: eb001678 bl 1ea2c <printf> <== NOT EXECUTED
19048: ea000075 b 19224 <rtems_rfs_dir_lookup_ino+0x454> <== NOT EXECUTED
while (map.bpos.boff < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
{
uint32_t ehash;
int elength;
ehash = rtems_rfs_dir_entry_hash (entry);
1904c: e1a0c80c lsl ip, ip, #16
19050: e18ccc00 orr ip, ip, r0, lsl #24
19054: e18c1001 orr r1, ip, r1
rtems_rfs_inode_ino (inode), elength, *ino, map.bpos.boff);
rc = EIO;
break;
}
if (ehash == hash)
19058: e59dc00c ldr ip, [sp, #12]
while (map.bpos.boff < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
{
uint32_t ehash;
int elength;
ehash = rtems_rfs_dir_entry_hash (entry);
1905c: e1812402 orr r2, r1, r2, lsl #8
rtems_rfs_inode_ino (inode), elength, *ino, map.bpos.boff);
rc = EIO;
break;
}
if (ehash == hash)
19060: e152000c cmp r2, ip
19064: 1a00002b bne 19118 <rtems_rfs_dir_lookup_ino+0x348>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO_CHECK))
19068: e3a00302 mov r0, #134217728 ; 0x8000000
1906c: e3a01000 mov r1, #0
19070: ebffe07d bl 1126c <rtems_rfs_trace>
19074: e3500000 cmp r0, #0
19078: 0a00000e beq 190b8 <rtems_rfs_dir_lookup_ino+0x2e8>
printf ("rtems-rfs: dir-lookup-ino: "
1907c: e58d7000 str r7, [sp] <== NOT EXECUTED
"checking entry for ino %" PRId32 ": bno=%04" PRIx32 "/off=%04" PRIx32
" length:%d ino:%" PRId32 "\n",
rtems_rfs_inode_ino (inode), map.bpos.bno, map.bpos.boff,
elength, rtems_rfs_dir_entry_ino (entry));
19080: e5d53001 ldrb r3, [r5, #1] <== NOT EXECUTED
19084: e5d52000 ldrb r2, [r5] <== NOT EXECUTED
19088: e1a03803 lsl r3, r3, #16 <== NOT EXECUTED
1908c: e1833c02 orr r3, r3, r2, lsl #24 <== NOT EXECUTED
19090: e5d52003 ldrb r2, [r5, #3] <== NOT EXECUTED
19094: e1833002 orr r3, r3, r2 <== NOT EXECUTED
19098: e5d52002 ldrb r2, [r5, #2] <== NOT EXECUTED
}
if (ehash == hash)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO_CHECK))
printf ("rtems-rfs: dir-lookup-ino: "
1909c: e1833402 orr r3, r3, r2, lsl #8 <== NOT EXECUTED
190a0: e58d3004 str r3, [sp, #4] <== NOT EXECUTED
190a4: e28d2020 add r2, sp, #32 <== NOT EXECUTED
190a8: e59f01b8 ldr r0, [pc, #440] ; 19268 <rtems_rfs_dir_lookup_ino+0x498><== NOT EXECUTED
190ac: e5981008 ldr r1, [r8, #8] <== NOT EXECUTED
190b0: e892000c ldm r2, {r2, r3} <== NOT EXECUTED
190b4: eb00165c bl 1ea2c <printf> <== NOT EXECUTED
"checking entry for ino %" PRId32 ": bno=%04" PRIx32 "/off=%04" PRIx32
" length:%d ino:%" PRId32 "\n",
rtems_rfs_inode_ino (inode), map.bpos.bno, map.bpos.boff,
elength, rtems_rfs_dir_entry_ino (entry));
if (memcmp (entry + RTEMS_RFS_DIR_ENTRY_SIZE, name, length) == 0)
190b8: e285000a add r0, r5, #10
190bc: e59d1008 ldr r1, [sp, #8]
190c0: e1a02009 mov r2, r9
190c4: eb001537 bl 1e5a8 <memcmp>
190c8: e3500000 cmp r0, #0
190cc: 1a000011 bne 19118 <rtems_rfs_dir_lookup_ino+0x348>
{
*offset = rtems_rfs_block_map_pos (fs, &map);
190d0: e1a00006 mov r0, r6
190d4: e28d1020 add r1, sp, #32
190d8: ebfff9c2 bl 177e8 <rtems_rfs_block_get_pos>
190dc: e59dc098 ldr ip, [sp, #152] ; 0x98
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO_FOUND))
190e0: e3a01000 mov r1, #0
rtems_rfs_inode_ino (inode), map.bpos.bno, map.bpos.boff,
elength, rtems_rfs_dir_entry_ino (entry));
if (memcmp (entry + RTEMS_RFS_DIR_ENTRY_SIZE, name, length) == 0)
{
*offset = rtems_rfs_block_map_pos (fs, &map);
190e4: e58c0000 str r0, [ip]
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO_FOUND))
190e8: e3a00201 mov r0, #268435456 ; 0x10000000
190ec: ebffe05e bl 1126c <rtems_rfs_trace>
190f0: e3500000 cmp r0, #0
190f4: e1a07008 mov r7, r8
190f8: 0a000040 beq 19200 <rtems_rfs_dir_lookup_ino+0x430>
printf ("rtems-rfs: dir-lookup-ino: "
190fc: e59dc098 ldr ip, [sp, #152] ; 0x98 <== NOT EXECUTED
19100: e5981008 ldr r1, [r8, #8] <== NOT EXECUTED
19104: e59b2000 ldr r2, [fp] <== NOT EXECUTED
19108: e59c3000 ldr r3, [ip] <== NOT EXECUTED
1910c: e59f0158 ldr r0, [pc, #344] ; 1926c <rtems_rfs_dir_lookup_ino+0x49c><== NOT EXECUTED
19110: eb001645 bl 1ea2c <printf> <== NOT EXECUTED
19114: ea000039 b 19200 <rtems_rfs_dir_lookup_ino+0x430> <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
return 0;
}
}
map.bpos.boff += elength;
19118: e59d3024 ldr r3, [sp, #36] ; 0x24
1911c: e0833007 add r3, r3, r7
19120: e58d3024 str r3, [sp, #36] ; 0x24
entry += elength;
19124: e0855007 add r5, r5, r7
entry = rtems_rfs_buffer_data (&entries);
map.bpos.boff = 0;
while (map.bpos.boff < (rtems_rfs_fs_block_size (fs) - RTEMS_RFS_DIR_ENTRY_SIZE))
19128: e5963008 ldr r3, [r6, #8]
1912c: e59d2024 ldr r2, [sp, #36] ; 0x24
19130: e243300a sub r3, r3, #10
19134: e1520003 cmp r2, r3
19138: 3affff99 bcc 18fa4 <rtems_rfs_dir_lookup_ino+0x1d4>
map.bpos.boff += elength;
entry += elength;
}
if (rc == 0)
1913c: e35a0000 cmp sl, #0
19140: 1a000019 bne 191ac <rtems_rfs_dir_lookup_ino+0x3dc>
{
rc = rtems_rfs_block_map_next_block (fs, &map, &block);
19144: e1a00006 mov r0, r6
19148: e28d1010 add r1, sp, #16
1914c: e28d206c add r2, sp, #108 ; 0x6c
19150: ebfffb0f bl 17d94 <rtems_rfs_block_map_next_block>
if ((rc > 0) && (rc != ENXIO))
19154: e3500006 cmp r0, #6
19158: 13500000 cmpne r0, #0
entry += elength;
}
if (rc == 0)
{
rc = rtems_rfs_block_map_next_block (fs, &map, &block);
1915c: e1a04000 mov r4, r0
if ((rc > 0) && (rc != ENXIO))
19160: da00000d ble 1919c <rtems_rfs_dir_lookup_ino+0x3cc>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
19164: e3a00301 mov r0, #67108864 ; 0x4000000 <== NOT EXECUTED
19168: e3a01000 mov r1, #0 <== NOT EXECUTED
1916c: ebffe03e bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19170: e3500000 cmp r0, #0 <== NOT EXECUTED
19174: 0a00000f beq 191b8 <rtems_rfs_dir_lookup_ino+0x3e8> <== NOT EXECUTED
printf ("rtems-rfs: dir-lookup-ino: "
19178: e1a00004 mov r0, r4 <== NOT EXECUTED
1917c: e5985008 ldr r5, [r8, #8] <== NOT EXECUTED
19180: eb001ad7 bl 1fce4 <strerror> <== NOT EXECUTED
19184: e1a01005 mov r1, r5 <== NOT EXECUTED
19188: e1a03000 mov r3, r0 <== NOT EXECUTED
1918c: e1a02004 mov r2, r4 <== NOT EXECUTED
19190: e59f00d8 ldr r0, [pc, #216] ; 19270 <rtems_rfs_dir_lookup_ino+0x4a0><== NOT EXECUTED
19194: eb001624 bl 1ea2c <printf> <== NOT EXECUTED
19198: ea000006 b 191b8 <rtems_rfs_dir_lookup_ino+0x3e8> <== NOT EXECUTED
"block map next block failed in ino %" PRIu32 ": %d: %s\n",
rtems_rfs_inode_ino (inode), rc, strerror (rc));
}
if (rc == ENXIO)
1919c: e3500006 cmp r0, #6
191a0: 1a000004 bne 191b8 <rtems_rfs_dir_lookup_ino+0x3e8>
rc = ENOENT;
191a4: e3a04002 mov r4, #2
191a8: ea000008 b 191d0 <rtems_rfs_dir_lookup_ino+0x400>
191ac: e1a0400a mov r4, sl <== NOT EXECUTED
191b0: ea000000 b 191b8 <rtems_rfs_dir_lookup_ino+0x3e8> <== NOT EXECUTED
ehash = rtems_rfs_dir_entry_hash (entry);
elength = rtems_rfs_dir_entry_length (entry);
*ino = rtems_rfs_dir_entry_ino (entry);
if (elength == RTEMS_RFS_DIR_ENTRY_EMPTY)
191b4: e1a08007 mov r8, r7
rtems_rfs_buffer_handle_close (fs, &entries);
rtems_rfs_block_map_close (fs, &map);
return rc;
}
while ((rc == 0) && block)
191b8: e3540000 cmp r4, #0
191bc: 1a000003 bne 191d0 <rtems_rfs_dir_lookup_ino+0x400>
191c0: e59d306c ldr r3, [sp, #108] ; 0x6c
191c4: e3530000 cmp r3, #0
191c8: 1affff50 bne 18f10 <rtems_rfs_dir_lookup_ino+0x140>
191cc: ea000016 b 1922c <rtems_rfs_dir_lookup_ino+0x45c> <== NOT EXECUTED
191d0: e1a0a004 mov sl, r4
191d4: e1a0400a mov r4, sl
191d8: ea000008 b 19200 <rtems_rfs_dir_lookup_ino+0x430>
if ((rc == 0) && (block == 0))
{
rc = EIO;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
printf ("rtems-rfs: dir-lookup-ino: block is 0 in ino %" PRIu32 ": %d: %s\n",
191dc: e3a00005 mov r0, #5 <== NOT EXECUTED
191e0: e5974008 ldr r4, [r7, #8] <== NOT EXECUTED
191e4: eb001abe bl 1fce4 <strerror> <== NOT EXECUTED
191e8: e1a01004 mov r1, r4 <== NOT EXECUTED
191ec: e1a03000 mov r3, r0 <== NOT EXECUTED
191f0: e3a02005 mov r2, #5 <== NOT EXECUTED
191f4: e59f0078 ldr r0, [pc, #120] ; 19274 <rtems_rfs_dir_lookup_ino+0x4a4><== NOT EXECUTED
191f8: eb00160b bl 1ea2c <printf> <== NOT EXECUTED
}
}
if ((rc == 0) && (block == 0))
{
rc = EIO;
191fc: e3a04005 mov r4, #5 <== NOT EXECUTED
printf ("rtems-rfs: dir-lookup-ino: block is 0 in ino %" PRIu32 ": %d: %s\n",
rtems_rfs_inode_ino (inode), rc, strerror (rc));
}
}
rtems_rfs_buffer_handle_close (fs, &entries);
19200: e28d1060 add r1, sp, #96 ; 0x60
19204: e1a00006 mov r0, r6
19208: ebfffee8 bl 18db0 <rtems_rfs_buffer_handle_close>
rtems_rfs_block_map_close (fs, &map);
1920c: e1a00006 mov r0, r6
19210: e28d1010 add r1, sp, #16
19214: ebfff9f8 bl 179fc <rtems_rfs_block_map_close>
return rc;
}
19218: e1a00004 mov r0, r4
1921c: e28dd070 add sp, sp, #112 ; 0x70
19220: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
printf ("rtems-rfs: dir-lookup-ino: "
"block map next block failed in ino %" PRIu32 ": %d: %s\n",
rtems_rfs_inode_ino (inode), rc, strerror (rc));
}
if (rc == ENXIO)
rc = ENOENT;
19224: e3a0a005 mov sl, #5 <== NOT EXECUTED
19228: eaffffdf b 191ac <rtems_rfs_dir_lookup_ino+0x3dc> <== NOT EXECUTED
}
if ((rc == 0) && (block == 0))
{
rc = EIO;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_LOOKUP_INO))
1922c: e3a00301 mov r0, #67108864 ; 0x4000000 <== NOT EXECUTED
19230: e3a01000 mov r1, #0 <== NOT EXECUTED
19234: ebffe00c bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19238: e3500000 cmp r0, #0 <== NOT EXECUTED
1923c: e1a07008 mov r7, r8 <== NOT EXECUTED
19240: 0affffed beq 191fc <rtems_rfs_dir_lookup_ino+0x42c> <== NOT EXECUTED
19244: eaffffe4 b 191dc <rtems_rfs_dir_lookup_ino+0x40c> <== NOT EXECUTED
000199b8 <rtems_rfs_dir_read>:
rtems_rfs_dir_read (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* dir,
rtems_rfs_pos_rel offset,
struct dirent* dirent,
size_t* length)
{
199b8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
199bc: e24dd070 sub sp, sp, #112 ; 0x70
199c0: e58d100c str r1, [sp, #12]
199c4: e1a05000 mov r5, r0
rtems_rfs_block_map map;
rtems_rfs_buffer_handle buffer;
rtems_rfs_block_no block;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_READ))
199c8: e3a01000 mov r1, #0
199cc: e3a00102 mov r0, #-2147483648 ; 0x80000000
rtems_rfs_dir_read (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* dir,
rtems_rfs_pos_rel offset,
struct dirent* dirent,
size_t* length)
{
199d0: e98d000c stmib sp, {r2, r3}
199d4: e59da094 ldr sl, [sp, #148] ; 0x94
199d8: e59d8098 ldr r8, [sp, #152] ; 0x98
rtems_rfs_block_map map;
rtems_rfs_buffer_handle buffer;
rtems_rfs_block_no block;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_READ))
199dc: ebffde22 bl 1126c <rtems_rfs_trace>
199e0: e3500000 cmp r0, #0
printf ("rtems-rfs: dir-read: dir=%" PRId32 " offset=%" PRId64 "\n",
199e4: 159d200c ldrne r2, [sp, #12]
199e8: 159f02e8 ldrne r0, [pc, #744] ; 19cd8 <rtems_rfs_dir_read+0x320>
199ec: 15921008 ldrne r1, [r2, #8]
199f0: 199d000c ldmibne sp, {r2, r3}
199f4: 1b00140c blne 1ea2c <printf>
rtems_rfs_inode_ino (dir), offset);
*length = 0;
199f8: e3a03000 mov r3, #0
199fc: e5883000 str r3, [r8]
rc = rtems_rfs_block_map_open (fs, dir, &map);
19a00: e1a00005 mov r0, r5
19a04: e59d100c ldr r1, [sp, #12]
19a08: e28d2010 add r2, sp, #16
19a0c: ebfff7a1 bl 17898 <rtems_rfs_block_map_open>
if (rc > 0)
19a10: e2504000 subs r4, r0, #0
19a14: ca0000ac bgt 19ccc <rtems_rfs_dir_read+0x314>
return rc;
if (((rtems_rfs_fs_block_size (fs) -
(offset % rtems_rfs_fs_block_size (fs))) <= RTEMS_RFS_DIR_ENTRY_SIZE))
19a18: e5953008 ldr r3, [r5, #8]
19a1c: e3a07000 mov r7, #0
19a20: e1a02003 mov r2, r3
19a24: e1a06003 mov r6, r3
19a28: e99d0003 ldmib sp, {r0, r1}
19a2c: e1a03007 mov r3, r7
19a30: eb004997 bl 2c094 <__moddi3>
rc = rtems_rfs_block_map_open (fs, dir, &map);
if (rc > 0)
return rc;
if (((rtems_rfs_fs_block_size (fs) -
19a34: e1a02006 mov r2, r6
19a38: e1a03007 mov r3, r7
19a3c: e0522000 subs r2, r2, r0
19a40: e0c33001 sbc r3, r3, r1
19a44: e352000b cmp r2, #11
19a48: e2d30000 sbcs r0, r3, #0
19a4c: aa00000b bge 19a80 <rtems_rfs_dir_read+0xc8>
(offset % rtems_rfs_fs_block_size (fs))) <= RTEMS_RFS_DIR_ENTRY_SIZE))
offset = (((offset / rtems_rfs_fs_block_size (fs)) + 1) *
19a50: e99d0003 ldmib sp, {r0, r1} <== NOT EXECUTED
19a54: e1a02006 mov r2, r6 <== NOT EXECUTED
19a58: e1a03007 mov r3, r7 <== NOT EXECUTED
19a5c: eb004851 bl 2bba8 <__divdi3> <== NOT EXECUTED
19a60: e3a02001 mov r2, #1 <== NOT EXECUTED
19a64: e0922000 adds r2, r2, r0 <== NOT EXECUTED
19a68: e3a03000 mov r3, #0 <== NOT EXECUTED
19a6c: e0a33001 adc r3, r3, r1 <== NOT EXECUTED
19a70: e0810692 umull r0, r1, r2, r6 <== NOT EXECUTED
19a74: e98d0003 stmib sp, {r0, r1} <== NOT EXECUTED
19a78: e0201396 mla r0, r6, r3, r1 <== NOT EXECUTED
19a7c: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
rtems_rfs_fs_block_size (fs));
rc = rtems_rfs_block_map_seek (fs, &map, offset, &block);
19a80: e28d306c add r3, sp, #108 ; 0x6c
19a84: e28d6010 add r6, sp, #16
19a88: e58d3000 str r3, [sp]
19a8c: e1a00005 mov r0, r5
19a90: e1a01006 mov r1, r6
19a94: e99d000c ldmib sp, {r2, r3}
19a98: ebfff8a1 bl 17d24 <rtems_rfs_block_map_seek>
if (rc > 0)
19a9c: e2504000 subs r4, r0, #0
19aa0: da000004 ble 19ab8 <rtems_rfs_dir_read+0x100>
{
if (rc == ENXIO)
rc = ENOENT;
19aa4: e3540006 cmp r4, #6 <== NOT EXECUTED
19aa8: 03a04002 moveq r4, #2 <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
19aac: e1a00005 mov r0, r5 <== NOT EXECUTED
19ab0: e1a01006 mov r1, r6 <== NOT EXECUTED
19ab4: ea000083 b 19cc8 <rtems_rfs_dir_read+0x310> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
19ab8: e3a03000 mov r3, #0
19abc: e5cd3060 strb r3, [sp, #96] ; 0x60
handle->bnum = 0;
19ac0: e58d3064 str r3, [sp, #100] ; 0x64
handle->buffer = NULL;
19ac4: e58d3068 str r3, [sp, #104] ; 0x68
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_READ))
printf ("rtems-rfs: dir-read: next block: off:%" PRId64 " length:%zd\n",
offset, *length);
rc = rtems_rfs_block_map_next_block (fs, &map, &block);
19ac8: e1a04006 mov r4, r6
uint8_t* entry;
rtems_rfs_ino eino;
int elength;
int remaining;
rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, true);
19acc: e1a00005 mov r0, r5
19ad0: e28d1060 add r1, sp, #96 ; 0x60
19ad4: e59d206c ldr r2, [sp, #108] ; 0x6c
19ad8: e3a03001 mov r3, #1
19adc: ebfffb22 bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
19ae0: e3500000 cmp r0, #0
19ae4: ca00006d bgt 19ca0 <rtems_rfs_dir_read+0x2e8>
rtems_rfs_buffer_handle_close (fs, &buffer);
rtems_rfs_block_map_close (fs, &map);
return rc;
}
entry = rtems_rfs_buffer_data (&buffer);
19ae8: e59d3068 ldr r3, [sp, #104] ; 0x68
entry += map.bpos.boff;
19aec: e59d9024 ldr r9, [sp, #36] ; 0x24
rtems_rfs_buffer_handle_close (fs, &buffer);
rtems_rfs_block_map_close (fs, &map);
return rc;
}
entry = rtems_rfs_buffer_data (&buffer);
19af0: e593301c ldr r3, [r3, #28]
entry += map.bpos.boff;
19af4: e0836009 add r6, r3, r9
elength = rtems_rfs_dir_entry_length (entry);
19af8: e5d62009 ldrb r2, [r6, #9]
19afc: e5d67008 ldrb r7, [r6, #8]
19b00: e1827407 orr r7, r2, r7, lsl #8
eino = rtems_rfs_dir_entry_ino (entry);
19b04: e7d32009 ldrb r2, [r3, r9]
19b08: e5d63001 ldrb r3, [r6, #1]
19b0c: e1a03803 lsl r3, r3, #16
19b10: e1833c02 orr r3, r3, r2, lsl #24
if (elength != RTEMS_RFS_DIR_ENTRY_EMPTY)
19b14: e59f11c0 ldr r1, [pc, #448] ; 19cdc <rtems_rfs_dir_read+0x324>
entry = rtems_rfs_buffer_data (&buffer);
entry += map.bpos.boff;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19b18: e5d62003 ldrb r2, [r6, #3]
19b1c: e5d6b002 ldrb fp, [r6, #2]
19b20: e1833002 orr r3, r3, r2
if (elength != RTEMS_RFS_DIR_ENTRY_EMPTY)
19b24: e1570001 cmp r7, r1
entry = rtems_rfs_buffer_data (&buffer);
entry += map.bpos.boff;
elength = rtems_rfs_dir_entry_length (entry);
eino = rtems_rfs_dir_entry_ino (entry);
19b28: e183b40b orr fp, r3, fp, lsl #8
if (elength != RTEMS_RFS_DIR_ENTRY_EMPTY)
19b2c: 0a000046 beq 19c4c <rtems_rfs_dir_read+0x294>
{
if (rtems_rfs_dir_entry_valid (fs, elength, eino))
19b30: e357000a cmp r7, #10
19b34: e1a04000 mov r4, r0
19b38: da000008 ble 19b60 <rtems_rfs_dir_read+0x1a8>
19b3c: e595101c ldr r1, [r5, #28]
19b40: e35b0000 cmp fp, #0
19b44: 11570001 cmpne r7, r1
19b48: 33a01000 movcc r1, #0
19b4c: 23a01001 movcs r1, #1
19b50: 2a000002 bcs 19b60 <rtems_rfs_dir_read+0x1a8>
19b54: e5953014 ldr r3, [r5, #20]
19b58: e15b0003 cmp fp, r3
19b5c: 9a00000d bls 19b98 <rtems_rfs_dir_read+0x1e0>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_READ))
19b60: e3a00102 mov r0, #-2147483648 ; 0x80000000 <== NOT EXECUTED
19b64: e3a01000 mov r1, #0 <== NOT EXECUTED
19b68: ebffddbf bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
19b6c: e3500000 cmp r0, #0 <== NOT EXECUTED
19b70: 0a00004c beq 19ca8 <rtems_rfs_dir_read+0x2f0> <== NOT EXECUTED
printf ("rtems-rfs: dir-read: "
19b74: e59d3024 ldr r3, [sp, #36] ; 0x24 <== NOT EXECUTED
19b78: e59d200c ldr r2, [sp, #12] <== NOT EXECUTED
19b7c: e58d3000 str r3, [sp] <== NOT EXECUTED
19b80: e59f0158 ldr r0, [pc, #344] ; 19ce0 <rtems_rfs_dir_read+0x328><== NOT EXECUTED
19b84: e5921008 ldr r1, [r2, #8] <== NOT EXECUTED
19b88: e1a0300b mov r3, fp <== NOT EXECUTED
19b8c: e1a02007 mov r2, r7 <== NOT EXECUTED
19b90: eb0013a5 bl 1ea2c <printf> <== NOT EXECUTED
19b94: ea000043 b 19ca8 <rtems_rfs_dir_read+0x2f0> <== NOT EXECUTED
rtems_rfs_inode_ino (dir), elength, eino, map.bpos.boff);
rc = EIO;
break;
}
memset (dirent, 0, sizeof (struct dirent));
19b98: e3a0be11 mov fp, #272 ; 0x110
19b9c: e1a0200b mov r2, fp
19ba0: e1a0000a mov r0, sl
19ba4: eb00132f bl 1e868 <memset>
dirent->d_off = offset;
dirent->d_reclen = sizeof (struct dirent);
*length += elength;
19ba8: e5983000 ldr r3, [r8]
rc = EIO;
break;
}
memset (dirent, 0, sizeof (struct dirent));
dirent->d_off = offset;
19bac: e99d0003 ldmib sp, {r0, r1}
dirent->d_reclen = sizeof (struct dirent);
*length += elength;
19bb0: e0873003 add r3, r7, r3
rc = EIO;
break;
}
memset (dirent, 0, sizeof (struct dirent));
dirent->d_off = offset;
19bb4: e98a0003 stmib sl, {r0, r1}
dirent->d_reclen = sizeof (struct dirent);
19bb8: e1cab0bc strh fp, [sl, #12]
*length += elength;
19bbc: e5883000 str r3, [r8]
remaining = rtems_rfs_fs_block_size (fs) - (map.bpos.boff + elength);
19bc0: e5952008 ldr r2, [r5, #8]
19bc4: e0699002 rsb r9, r9, r2
19bc8: e0679009 rsb r9, r7, r9
if (remaining <= RTEMS_RFS_DIR_ENTRY_SIZE)
19bcc: e359000a cmp r9, #10
*length += remaining;
19bd0: d0893003 addle r3, r9, r3
elength -= RTEMS_RFS_DIR_ENTRY_SIZE;
19bd4: e247700a sub r7, r7, #10
*length += elength;
remaining = rtems_rfs_fs_block_size (fs) - (map.bpos.boff + elength);
if (remaining <= RTEMS_RFS_DIR_ENTRY_SIZE)
*length += remaining;
19bd8: d5883000 strle r3, [r8]
elength -= RTEMS_RFS_DIR_ENTRY_SIZE;
19bdc: e35700ff cmp r7, #255 ; 0xff
19be0: a3a070ff movge r7, #255 ; 0xff
if (elength > NAME_MAX)
elength = NAME_MAX;
memcpy (dirent->d_name, entry + RTEMS_RFS_DIR_ENTRY_SIZE, elength);
19be4: e28a8010 add r8, sl, #16
19be8: e286100a add r1, r6, #10
19bec: e1a02007 mov r2, r7
19bf0: e1a00008 mov r0, r8
19bf4: eb001298 bl 1e65c <memcpy>
dirent->d_ino = rtems_rfs_dir_entry_ino (entry);
19bf8: e5d63001 ldrb r3, [r6, #1]
19bfc: e5d62000 ldrb r2, [r6]
19c00: e1a03803 lsl r3, r3, #16
19c04: e1833c02 orr r3, r3, r2, lsl #24
19c08: e5d62003 ldrb r2, [r6, #3]
19c0c: e1833002 orr r3, r3, r2
19c10: e5d62002 ldrb r2, [r6, #2]
19c14: e1833402 orr r3, r3, r2, lsl #8
19c18: e58a3000 str r3, [sl]
dirent->d_namlen = elength;
19c1c: e1ca70be strh r7, [sl, #14]
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_READ))
19c20: e3a00102 mov r0, #-2147483648 ; 0x80000000
19c24: e3a01000 mov r1, #0
19c28: ebffdd8f bl 1126c <rtems_rfs_trace>
19c2c: e3500000 cmp r0, #0
19c30: 0a00001f beq 19cb4 <rtems_rfs_dir_read+0x2fc>
printf ("rtems-rfs: dir-read: found off:%" PRIooff_t " ino:%ld name=%s\n",
19c34: e99a0006 ldmib sl, {r1, r2} <== NOT EXECUTED
19c38: e58d8000 str r8, [sp] <== NOT EXECUTED
19c3c: e59f00a0 ldr r0, [pc, #160] ; 19ce4 <rtems_rfs_dir_read+0x32c><== NOT EXECUTED
19c40: e59a3000 ldr r3, [sl] <== NOT EXECUTED
19c44: eb001378 bl 1ea2c <printf> <== NOT EXECUTED
19c48: ea000019 b 19cb4 <rtems_rfs_dir_read+0x2fc> <== NOT EXECUTED
dirent->d_off, dirent->d_ino, dirent->d_name);
break;
}
*length += rtems_rfs_fs_block_size (fs) - map.bpos.boff;
19c4c: e5953008 ldr r3, [r5, #8]
19c50: e0699003 rsb r9, r9, r3
19c54: e5983000 ldr r3, [r8]
19c58: e0839009 add r9, r3, r9
19c5c: e5889000 str r9, [r8]
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_READ))
19c60: e3a00102 mov r0, #-2147483648 ; 0x80000000
19c64: e3a01000 mov r1, #0
19c68: ebffdd7f bl 1126c <rtems_rfs_trace>
19c6c: e3500000 cmp r0, #0
printf ("rtems-rfs: dir-read: next block: off:%" PRId64 " length:%zd\n",
19c70: 159f0070 ldrne r0, [pc, #112] ; 19ce8 <rtems_rfs_dir_read+0x330>
19c74: 199d0006 ldmibne sp, {r1, r2}
19c78: 15983000 ldrne r3, [r8]
19c7c: 1b00136a blne 1ea2c <printf>
offset, *length);
rc = rtems_rfs_block_map_next_block (fs, &map, &block);
19c80: e1a00005 mov r0, r5
19c84: e1a01004 mov r1, r4
19c88: e28d206c add r2, sp, #108 ; 0x6c
19c8c: ebfff840 bl 17d94 <rtems_rfs_block_map_next_block>
if (rc == ENXIO)
19c90: e3500006 cmp r0, #6
19c94: 0a000005 beq 19cb0 <rtems_rfs_dir_read+0x2f8>
/*
* Look for an empty entry and if this is the last block that is the end of
* the directory.
*/
while (rc == 0)
19c98: e3500000 cmp r0, #0 <== NOT EXECUTED
19c9c: 0affff8a beq 19acc <rtems_rfs_dir_read+0x114> <== NOT EXECUTED
19ca0: e1a04000 mov r4, r0 <== NOT EXECUTED
19ca4: ea000002 b 19cb4 <rtems_rfs_dir_read+0x2fc> <== NOT EXECUTED
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_DIR_READ))
printf ("rtems-rfs: dir-read: "
"bad length or ino for ino %" PRIu32 ": %u/%" PRId32 " @ %04" PRIx32 "\n",
rtems_rfs_inode_ino (dir), elength, eino, map.bpos.boff);
rc = EIO;
19ca8: e3a04005 mov r4, #5 <== NOT EXECUTED
19cac: ea000000 b 19cb4 <rtems_rfs_dir_read+0x2fc> <== NOT EXECUTED
printf ("rtems-rfs: dir-read: next block: off:%" PRId64 " length:%zd\n",
offset, *length);
rc = rtems_rfs_block_map_next_block (fs, &map, &block);
if (rc == ENXIO)
rc = ENOENT;
19cb0: e3a04002 mov r4, #2
}
rtems_rfs_buffer_handle_close (fs, &buffer);
19cb4: e28d1060 add r1, sp, #96 ; 0x60
19cb8: e1a00005 mov r0, r5
19cbc: ebfffc3b bl 18db0 <rtems_rfs_buffer_handle_close>
rtems_rfs_block_map_close (fs, &map);
19cc0: e1a00005 mov r0, r5
19cc4: e28d1010 add r1, sp, #16
19cc8: ebfff74b bl 179fc <rtems_rfs_block_map_close>
return rc;
}
19ccc: e1a00004 mov r0, r4
19cd0: e28dd070 add sp, sp, #112 ; 0x70
19cd4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00019ebc <rtems_rfs_file_close>:
}
int
rtems_rfs_file_close (rtems_rfs_file_system* fs,
rtems_rfs_file_handle* handle)
{
19ebc: e92d41f0 push {r4, r5, r6, r7, r8, lr}
19ec0: e1a06000 mov r6, r0
19ec4: e1a04001 mov r4, r1
int rrc;
int rc;
rrc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE))
19ec8: e3a00000 mov r0, #0
19ecc: e3a01010 mov r1, #16
19ed0: ebffdce5 bl 1126c <rtems_rfs_trace>
19ed4: e3500000 cmp r0, #0
printf ("rtems-rfs: file-close: entry: ino=%" PRId32 "\n",
handle->shared->inode.ino);
19ed8: 1594301c ldrne r3, [r4, #28]
int rc;
rrc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE))
printf ("rtems-rfs: file-close: entry: ino=%" PRId32 "\n",
19edc: 159f0250 ldrne r0, [pc, #592] ; 1a134 <rtems_rfs_file_close+0x278>
19ee0: 15931014 ldrne r1, [r3, #20]
19ee4: 1b0012d0 blne 1ea2c <printf>
handle->shared->inode.ino);
if (handle->shared->references > 0)
19ee8: e594101c ldr r1, [r4, #28]
19eec: e5913008 ldr r3, [r1, #8]
19ef0: e3530000 cmp r3, #0
handle->shared->references--;
19ef4: c2433001 subgt r3, r3, #1
19ef8: c5813008 strgt r3, [r1, #8]
if (handle->shared->references == 0)
19efc: e5913008 ldr r3, [r1, #8]
19f00: e3530000 cmp r3, #0
rtems_rfs_file_handle* handle)
{
int rrc;
int rc;
rrc = 0;
19f04: 13a05000 movne r5, #0
handle->shared->inode.ino);
if (handle->shared->references > 0)
handle->shared->references--;
if (handle->shared->references == 0)
19f08: 1a000071 bne 1a0d4 <rtems_rfs_file_close+0x218>
{
if (!rtems_rfs_inode_is_loaded (&handle->shared->inode))
19f0c: e5913018 ldr r3, [r1, #24]
19f10: e3530000 cmp r3, #0
19f14: 1a000004 bne 19f2c <rtems_rfs_file_close+0x70>
rrc = rtems_rfs_inode_load (fs, &handle->shared->inode);
19f18: e1a00006 mov r0, r6
19f1c: e281100c add r1, r1, #12
19f20: ebffd69a bl f990 <rtems_rfs_inode_load>
if (rrc == 0)
19f24: e2505000 subs r5, r0, #0
19f28: 1a000039 bne 1a014 <rtems_rfs_file_close+0x158>
{
/*
* @todo This could be clever and only update if different.
*/
rtems_rfs_inode_set_atime (&handle->shared->inode,
19f2c: e594301c ldr r3, [r4, #28]
19f30: e593208c ldr r2, [r3, #140] ; 0x8c
*/
static inline void
rtems_rfs_inode_set_atime (rtems_rfs_inode_handle* handle,
rtems_rfs_time atime)
{
rtems_rfs_write_u32 (&handle->node->atime, atime);
19f34: e5931018 ldr r1, [r3, #24]
19f38: e1a00c22 lsr r0, r2, #24
19f3c: e5c10010 strb r0, [r1, #16]
19f40: e5931018 ldr r1, [r3, #24]
19f44: e1a00822 lsr r0, r2, #16
19f48: e5c10011 strb r0, [r1, #17]
19f4c: e5931018 ldr r1, [r3, #24]
19f50: e1a00422 lsr r0, r2, #8
19f54: e5c10012 strb r0, [r1, #18]
19f58: e5931018 ldr r1, [r3, #24]
19f5c: e5c12013 strb r2, [r1, #19]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
19f60: e3a01001 mov r1, #1
19f64: e5c3101c strb r1, [r3, #28]
handle->shared->atime);
rtems_rfs_inode_set_mtime (&handle->shared->inode,
19f68: e594301c ldr r3, [r4, #28]
19f6c: e5932090 ldr r2, [r3, #144] ; 0x90
*/
static inline void
rtems_rfs_inode_set_mtime (rtems_rfs_inode_handle* handle,
rtems_rfs_time mtime)
{
rtems_rfs_write_u32 (&handle->node->mtime, mtime);
19f70: e5930018 ldr r0, [r3, #24]
19f74: e1a0cc22 lsr ip, r2, #24
19f78: e5c0c014 strb ip, [r0, #20]
19f7c: e5930018 ldr r0, [r3, #24]
19f80: e1a0c822 lsr ip, r2, #16
19f84: e5c0c015 strb ip, [r0, #21]
19f88: e5930018 ldr r0, [r3, #24]
19f8c: e1a0c422 lsr ip, r2, #8
19f90: e5c0c016 strb ip, [r0, #22]
19f94: e5930018 ldr r0, [r3, #24]
19f98: e5c02017 strb r2, [r0, #23]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
19f9c: e5c3101c strb r1, [r3, #28]
handle->shared->mtime);
rtems_rfs_inode_set_ctime (&handle->shared->inode,
19fa0: e594301c ldr r3, [r4, #28]
19fa4: e5932094 ldr r2, [r3, #148] ; 0x94
*/
static inline void
rtems_rfs_inode_set_ctime (rtems_rfs_inode_handle* handle,
rtems_rfs_time ctime)
{
rtems_rfs_write_u32 (&handle->node->ctime, ctime);
19fa8: e5930018 ldr r0, [r3, #24]
19fac: e1a0cc22 lsr ip, r2, #24
19fb0: e5c0c018 strb ip, [r0, #24]
19fb4: e5930018 ldr r0, [r3, #24]
19fb8: e1a0c822 lsr ip, r2, #16
19fbc: e5c0c019 strb ip, [r0, #25]
19fc0: e5930018 ldr r0, [r3, #24]
19fc4: e1a0c422 lsr ip, r2, #8
19fc8: e5c0c01a strb ip, [r0, #26]
19fcc: e5930018 ldr r0, [r3, #24]
19fd0: e5c0201b strb r2, [r0, #27]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
19fd4: e5c3101c strb r1, [r3, #28]
handle->shared->ctime);
if (!rtems_rfs_block_size_equal (&handle->shared->size,
19fd8: e594301c ldr r3, [r4, #28]
19fdc: e5932084 ldr r2, [r3, #132] ; 0x84
19fe0: e593103c ldr r1, [r3, #60] ; 0x3c
19fe4: e1520001 cmp r2, r1
19fe8: 1a000003 bne 19ffc <rtems_rfs_file_close+0x140>
19fec: e5930088 ldr r0, [r3, #136] ; 0x88
19ff0: e5931040 ldr r1, [r3, #64] ; 0x40
19ff4: e1500001 cmp r0, r1
19ff8: 0a000004 beq 1a010 <rtems_rfs_file_close+0x154>
*/
static inline void
rtems_rfs_block_map_set_size (rtems_rfs_block_map* map,
rtems_rfs_block_size* size)
{
rtems_rfs_block_copy_size (&map->size, size);
19ffc: e583203c str r2, [r3, #60] ; 0x3c <== NOT EXECUTED
1a000: e5932088 ldr r2, [r3, #136] ; 0x88 <== NOT EXECUTED
1a004: e5832040 str r2, [r3, #64] ; 0x40 <== NOT EXECUTED
map->dirty = true;
1a008: e3a02001 mov r2, #1 <== NOT EXECUTED
1a00c: e5c32034 strb r2, [r3, #52] ; 0x34 <== NOT EXECUTED
1a010: e3a05000 mov r5, #0
&handle->shared->map.size))
rtems_rfs_block_map_set_size (&handle->shared->map,
&handle->shared->size);
}
rc = rtems_rfs_block_map_close (fs, &handle->shared->map);
1a014: e594101c ldr r1, [r4, #28]
1a018: e1a00006 mov r0, r6
1a01c: e2811034 add r1, r1, #52 ; 0x34
1a020: ebfff675 bl 179fc <rtems_rfs_block_map_close>
if (rc > 0)
1a024: e2507000 subs r7, r0, #0
1a028: da00000f ble 1a06c <rtems_rfs_file_close+0x1b0>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE))
1a02c: e3a00000 mov r0, #0 <== NOT EXECUTED
1a030: e3a01010 mov r1, #16 <== NOT EXECUTED
1a034: ebffdc8c bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1a038: e3500000 cmp r0, #0 <== NOT EXECUTED
1a03c: 0a000008 beq 1a064 <rtems_rfs_file_close+0x1a8> <== NOT EXECUTED
printf ("rtems-rfs: file-close: map close error: ino=%" PRId32 ": %d: %s\n",
handle->shared->inode.ino, rc, strerror (rc));
1a040: e594301c ldr r3, [r4, #28] <== NOT EXECUTED
rc = rtems_rfs_block_map_close (fs, &handle->shared->map);
if (rc > 0)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE))
printf ("rtems-rfs: file-close: map close error: ino=%" PRId32 ": %d: %s\n",
1a044: e1a00007 mov r0, r7 <== NOT EXECUTED
1a048: e5938014 ldr r8, [r3, #20] <== NOT EXECUTED
1a04c: eb001724 bl 1fce4 <strerror> <== NOT EXECUTED
1a050: e1a01008 mov r1, r8 <== NOT EXECUTED
1a054: e1a03000 mov r3, r0 <== NOT EXECUTED
1a058: e1a02007 mov r2, r7 <== NOT EXECUTED
1a05c: e59f00d4 ldr r0, [pc, #212] ; 1a138 <rtems_rfs_file_close+0x27c><== NOT EXECUTED
1a060: eb001271 bl 1ea2c <printf> <== NOT EXECUTED
handle->shared->inode.ino, rc, strerror (rc));
if (rrc == 0)
1a064: e3550000 cmp r5, #0 <== NOT EXECUTED
1a068: 01a05007 moveq r5, r7 <== NOT EXECUTED
rrc = rc;
}
rc = rtems_rfs_inode_close (fs, &handle->shared->inode);
1a06c: e594101c ldr r1, [r4, #28]
1a070: e1a00006 mov r0, r6
1a074: e281100c add r1, r1, #12
1a078: ebffd6e2 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
1a07c: e2507000 subs r7, r0, #0
1a080: da00000f ble 1a0c4 <rtems_rfs_file_close+0x208>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE))
1a084: e3a00000 mov r0, #0 <== NOT EXECUTED
1a088: e3a01010 mov r1, #16 <== NOT EXECUTED
1a08c: ebffdc76 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1a090: e3500000 cmp r0, #0 <== NOT EXECUTED
1a094: 0a000008 beq 1a0bc <rtems_rfs_file_close+0x200> <== NOT EXECUTED
printf ("rtems-rfs: file-close: inode close error: ino=%" PRId32 ": %d: %s\n",
handle->shared->inode.ino, rc, strerror (rc));
1a098: e594301c ldr r3, [r4, #28] <== NOT EXECUTED
rc = rtems_rfs_inode_close (fs, &handle->shared->inode);
if (rc > 0)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE))
printf ("rtems-rfs: file-close: inode close error: ino=%" PRId32 ": %d: %s\n",
1a09c: e1a00007 mov r0, r7 <== NOT EXECUTED
1a0a0: e5938014 ldr r8, [r3, #20] <== NOT EXECUTED
1a0a4: eb00170e bl 1fce4 <strerror> <== NOT EXECUTED
1a0a8: e1a01008 mov r1, r8 <== NOT EXECUTED
1a0ac: e1a03000 mov r3, r0 <== NOT EXECUTED
1a0b0: e1a02007 mov r2, r7 <== NOT EXECUTED
1a0b4: e59f0080 ldr r0, [pc, #128] ; 1a13c <rtems_rfs_file_close+0x280><== NOT EXECUTED
1a0b8: eb00125b bl 1ea2c <printf> <== NOT EXECUTED
handle->shared->inode.ino, rc, strerror (rc));
if (rrc == 0)
1a0bc: e3550000 cmp r5, #0 <== NOT EXECUTED
1a0c0: 01a05007 moveq r5, r7 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
1a0c4: e594001c ldr r0, [r4, #28]
1a0c8: ebffee20 bl 15950 <_Chain_Extract>
rrc = rc;
}
rtems_chain_extract (&handle->shared->link);
free (handle->shared);
1a0cc: e594001c ldr r0, [r4, #28]
1a0d0: ebffb1ce bl 6810 <free>
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1a0d4: e1a00006 mov r0, r6
1a0d8: e2841004 add r1, r4, #4
1a0dc: ebfff936 bl 185bc <rtems_rfs_buffer_handle_release>
handle->dirty = false;
1a0e0: e3a03000 mov r3, #0
rc = rtems_rfs_buffer_handle_close (fs, &handle->buffer);
if ((rrc == 0) && (rc > 0))
rrc = rc;
if (rrc > 0)
1a0e4: e1550003 cmp r5, r3
1a0e8: e5c43004 strb r3, [r4, #4]
handle->bnum = 0;
1a0ec: e5843008 str r3, [r4, #8]
handle->buffer = NULL;
1a0f0: e584300c str r3, [r4, #12]
1a0f4: da00000a ble 1a124 <rtems_rfs_file_close+0x268>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_CLOSE))
1a0f8: e3a00000 mov r0, #0 <== NOT EXECUTED
1a0fc: e3a01010 mov r1, #16 <== NOT EXECUTED
1a100: ebffdc59 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1a104: e3500000 cmp r0, #0 <== NOT EXECUTED
1a108: 0a000005 beq 1a124 <rtems_rfs_file_close+0x268> <== NOT EXECUTED
printf ("rtems-rfs: file-close: result: %d: %s\n", rrc, strerror (rrc));
1a10c: e1a00005 mov r0, r5 <== NOT EXECUTED
1a110: eb0016f3 bl 1fce4 <strerror> <== NOT EXECUTED
1a114: e1a01005 mov r1, r5 <== NOT EXECUTED
1a118: e1a02000 mov r2, r0 <== NOT EXECUTED
1a11c: e59f001c ldr r0, [pc, #28] ; 1a140 <rtems_rfs_file_close+0x284><== NOT EXECUTED
1a120: eb001241 bl 1ea2c <printf> <== NOT EXECUTED
}
free (handle);
1a124: e1a00004 mov r0, r4
1a128: ebffb1b8 bl 6810 <free>
return rrc;
}
1a12c: e1a00005 mov r0, r5
1a130: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
0001a33c <rtems_rfs_file_io_end>:
int
rtems_rfs_file_io_end (rtems_rfs_file_handle* handle,
size_t size,
bool read)
{
1a33c: e92d45f3 push {r0, r1, r4, r5, r6, r7, r8, sl, lr}
1a340: e1a04000 mov r4, r0
1a344: e1a06001 mov r6, r1
bool atime;
bool mtime;
bool length;
int rc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a348: e3a00000 mov r0, #0
1a34c: e3a01020 mov r1, #32
int
rtems_rfs_file_io_end (rtems_rfs_file_handle* handle,
size_t size,
bool read)
{
1a350: e20250ff and r5, r2, #255 ; 0xff
bool atime;
bool mtime;
bool length;
int rc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a354: ebffdbc4 bl 1126c <rtems_rfs_trace>
1a358: e3500000 cmp r0, #0
1a35c: 0a000006 beq 1a37c <rtems_rfs_file_io_end+0x40>
printf ("rtems-rfs: file-io: end: %s size=%zu\n",
1a360: e59f31d0 ldr r3, [pc, #464] ; 1a538 <rtems_rfs_file_io_end+0x1fc><== NOT EXECUTED
1a364: e3550000 cmp r5, #0 <== NOT EXECUTED
1a368: e59f11cc ldr r1, [pc, #460] ; 1a53c <rtems_rfs_file_io_end+0x200><== NOT EXECUTED
1a36c: e59f01cc ldr r0, [pc, #460] ; 1a540 <rtems_rfs_file_io_end+0x204><== NOT EXECUTED
1a370: 11a01003 movne r1, r3 <== NOT EXECUTED
1a374: e1a02006 mov r2, r6 <== NOT EXECUTED
1a378: eb0011ab bl 1ea2c <printf> <== NOT EXECUTED
read ? "read" : "write", size);
if (rtems_rfs_buffer_handle_has_block (&handle->buffer))
1a37c: e594800c ldr r8, [r4, #12]
1a380: e3580000 cmp r8, #0
1a384: 0a000015 beq 1a3e0 <rtems_rfs_file_io_end+0xa4>
{
if (!read)
1a388: e3550000 cmp r5, #0
rtems_rfs_buffer_mark_dirty (rtems_rfs_file_buffer (handle));
1a38c: 03a03001 moveq r3, #1
1a390: 05c43004 strbeq r3, [r4, #4]
rc = rtems_rfs_buffer_handle_release (rtems_rfs_file_fs (handle),
1a394: e594301c ldr r3, [r4, #28]
1a398: e2841004 add r1, r4, #4
1a39c: e5930098 ldr r0, [r3, #152] ; 0x98
1a3a0: ebfff885 bl 185bc <rtems_rfs_buffer_handle_release>
rtems_rfs_file_buffer (handle));
if (rc > 0)
1a3a4: e2508000 subs r8, r0, #0
1a3a8: da00000c ble 1a3e0 <rtems_rfs_file_io_end+0xa4>
{
printf (
1a3ac: e59f3184 ldr r3, [pc, #388] ; 1a538 <rtems_rfs_file_io_end+0x1fc><== NOT EXECUTED
1a3b0: e59f2184 ldr r2, [pc, #388] ; 1a53c <rtems_rfs_file_io_end+0x200><== NOT EXECUTED
1a3b4: e3550000 cmp r5, #0 <== NOT EXECUTED
1a3b8: 01a05002 moveq r5, r2 <== NOT EXECUTED
1a3bc: 11a05003 movne r5, r3 <== NOT EXECUTED
1a3c0: eb001647 bl 1fce4 <strerror> <== NOT EXECUTED
1a3c4: e1a01005 mov r1, r5 <== NOT EXECUTED
1a3c8: e58d0000 str r0, [sp] <== NOT EXECUTED
1a3cc: e1a02006 mov r2, r6 <== NOT EXECUTED
1a3d0: e1a03008 mov r3, r8 <== NOT EXECUTED
1a3d4: e59f0168 ldr r0, [pc, #360] ; 1a544 <rtems_rfs_file_io_end+0x208><== NOT EXECUTED
1a3d8: eb001193 bl 1ea2c <printf> <== NOT EXECUTED
"rtems-rfs: file-io: end: error on release: %s size=%zu: %d: %s\n",
read ? "read" : "write", size, rc, strerror (rc));
return rc;
1a3dc: ea000053 b 1a530 <rtems_rfs_file_io_end+0x1f4> <== NOT EXECUTED
* increase the block number and adjust the offset.
*
* If we are the last block and the position is past the current size update
* the size with the new length. The map holds the block count.
*/
handle->bpos.boff += size;
1a3e0: e5943014 ldr r3, [r4, #20]
1a3e4: e0866003 add r6, r6, r3
if (handle->bpos.boff >=
rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)))
1a3e8: e594301c ldr r3, [r4, #28]
1a3ec: e5932098 ldr r2, [r3, #152] ; 0x98
1a3f0: e5922008 ldr r2, [r2, #8]
* If we are the last block and the position is past the current size update
* the size with the new length. The map holds the block count.
*/
handle->bpos.boff += size;
if (handle->bpos.boff >=
1a3f4: e1560002 cmp r6, r2
rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)))
{
handle->bpos.bno++;
1a3f8: 25941010 ldrcs r1, [r4, #16]
* increase the block number and adjust the offset.
*
* If we are the last block and the position is past the current size update
* the size with the new length. The map holds the block count.
*/
handle->bpos.boff += size;
1a3fc: e5846014 str r6, [r4, #20]
if (handle->bpos.boff >=
rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)))
{
handle->bpos.bno++;
1a400: 22811001 addcs r1, r1, #1
handle->bpos.boff -= rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle));
1a404: 20626006 rsbcs r6, r2, r6
handle->bpos.boff += size;
if (handle->bpos.boff >=
rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)))
{
handle->bpos.bno++;
1a408: 25841010 strcs r1, [r4, #16]
handle->bpos.boff -= rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle));
1a40c: 25846014 strcs r6, [r4, #20]
}
length = false;
mtime = false;
if (!read &&
1a410: e3550000 cmp r5, #0
1a414: 1a000013 bne 1a468 <rtems_rfs_file_io_end+0x12c>
rtems_rfs_block_map_past_end (rtems_rfs_file_map (handle),
1a418: e5942010 ldr r2, [r4, #16]
}
length = false;
mtime = false;
if (!read &&
1a41c: e3520000 cmp r2, #0
1a420: e593103c ldr r1, [r3, #60] ; 0x3c
1a424: 0a000001 beq 1a430 <rtems_rfs_file_io_end+0xf4>
rtems_rfs_block_map_past_end (rtems_rfs_file_map (handle),
1a428: e3510000 cmp r1, #0
1a42c: 0a000008 beq 1a454 <rtems_rfs_file_io_end+0x118>
1a430: e1520001 cmp r2, r1
1a434: 2a000006 bcs 1a454 <rtems_rfs_file_io_end+0x118>
1a438: e2411001 sub r1, r1, #1
1a43c: e1520001 cmp r2, r1
1a440: 1a000008 bne 1a468 <rtems_rfs_file_io_end+0x12c>
1a444: e5941014 ldr r1, [r4, #20]
1a448: e5932040 ldr r2, [r3, #64] ; 0x40
1a44c: e1510002 cmp r1, r2
1a450: 9a000004 bls 1a468 <rtems_rfs_file_io_end+0x12c>
*/
static inline void
rtems_rfs_block_map_set_size_offset (rtems_rfs_block_map* map,
rtems_rfs_block_off offset)
{
map->size.offset = offset;
1a454: e5942014 ldr r2, [r4, #20]
map->dirty = true;
1a458: e3a0a001 mov sl, #1
*/
static inline void
rtems_rfs_block_map_set_size_offset (rtems_rfs_block_map* map,
rtems_rfs_block_off offset)
{
map->size.offset = offset;
1a45c: e5832040 str r2, [r3, #64] ; 0x40
map->dirty = true;
1a460: e5c3a034 strb sl, [r3, #52] ; 0x34
1a464: ea000000 b 1a46c <rtems_rfs_file_io_end+0x130>
handle->bpos.bno++;
handle->bpos.boff -= rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle));
}
length = false;
mtime = false;
1a468: e3a0a000 mov sl, #0
handle->bpos.boff);
length = true;
mtime = true;
}
atime = rtems_rfs_file_update_atime (handle);
1a46c: e5943000 ldr r3, [r4]
1a470: e3130001 tst r3, #1
1a474: 13a07000 movne r7, #0
1a478: 03a07001 moveq r7, #1
mtime = rtems_rfs_file_update_mtime (handle) && mtime;
1a47c: e3130002 tst r3, #2
1a480: 01a0600a moveq r6, sl
1a484: 13a06000 movne r6, #0
length = rtems_rfs_file_update_length (handle) && length;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a488: e3a00000 mov r0, #0
mtime = true;
}
atime = rtems_rfs_file_update_atime (handle);
mtime = rtems_rfs_file_update_mtime (handle) && mtime;
length = rtems_rfs_file_update_length (handle) && length;
1a48c: e3130004 tst r3, #4
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a490: e3a01020 mov r1, #32
mtime = true;
}
atime = rtems_rfs_file_update_atime (handle);
mtime = rtems_rfs_file_update_mtime (handle) && mtime;
length = rtems_rfs_file_update_length (handle) && length;
1a494: 13a0a000 movne sl, #0
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a498: ebffdb73 bl 1126c <rtems_rfs_trace>
1a49c: e3500000 cmp r0, #0
1a4a0: 0a00000d beq 1a4dc <rtems_rfs_file_io_end+0x1a0>
printf ("rtems-rfs: file-io: end: pos=%" PRIu32 ":%" PRIu32 " %c %c %c\n",
1a4a4: e3560000 cmp r6, #0 <== NOT EXECUTED
1a4a8: 03a0002d moveq r0, #45 ; 0x2d <== NOT EXECUTED
1a4ac: 13a0004d movne r0, #77 ; 0x4d <== NOT EXECUTED
1a4b0: e35a0000 cmp sl, #0 <== NOT EXECUTED
1a4b4: 03a0302d moveq r3, #45 ; 0x2d <== NOT EXECUTED
1a4b8: 13a0304c movne r3, #76 ; 0x4c <== NOT EXECUTED
1a4bc: e2841010 add r1, r4, #16 <== NOT EXECUTED
1a4c0: e3570000 cmp r7, #0 <== NOT EXECUTED
1a4c4: e8910006 ldm r1, {r1, r2} <== NOT EXECUTED
1a4c8: e88d0009 stm sp, {r0, r3} <== NOT EXECUTED
1a4cc: e59f0074 ldr r0, [pc, #116] ; 1a548 <rtems_rfs_file_io_end+0x20c><== NOT EXECUTED
1a4d0: 03a0302d moveq r3, #45 ; 0x2d <== NOT EXECUTED
1a4d4: 13a03041 movne r3, #65 ; 0x41 <== NOT EXECUTED
1a4d8: eb001153 bl 1ea2c <printf> <== NOT EXECUTED
handle->bpos.bno, handle->bpos.boff,
atime ? 'A' : '-', mtime ? 'M' : '-', length ? 'L' : '-');
if (atime || mtime)
1a4dc: e3570000 cmp r7, #0
1a4e0: 1a000001 bne 1a4ec <rtems_rfs_file_io_end+0x1b0>
1a4e4: e3560000 cmp r6, #0 <== NOT EXECUTED
1a4e8: 0a00000a beq 1a518 <rtems_rfs_file_io_end+0x1dc> <== NOT EXECUTED
{
time_t now = time (NULL);
1a4ec: e3a00000 mov r0, #0
1a4f0: eb002188 bl 22b18 <time>
if (read && atime)
1a4f4: e3550000 cmp r5, #0
1a4f8: 0a000003 beq 1a50c <rtems_rfs_file_io_end+0x1d0>
1a4fc: e3570000 cmp r7, #0
handle->shared->atime = now;
1a500: 1594301c ldrne r3, [r4, #28]
1a504: 1583008c strne r0, [r3, #140] ; 0x8c
1a508: ea000002 b 1a518 <rtems_rfs_file_io_end+0x1dc>
if (!read && mtime)
1a50c: e3560000 cmp r6, #0
handle->shared->mtime = now;
1a510: 1594301c ldrne r3, [r4, #28]
1a514: 15830090 strne r0, [r3, #144] ; 0x90
}
if (length)
1a518: e35a0000 cmp sl, #0
{
handle->shared->size.count =
rtems_rfs_block_map_count (rtems_rfs_file_map (handle));
1a51c: 1594301c ldrne r3, [r4, #28]
if (!read && mtime)
handle->shared->mtime = now;
}
if (length)
{
handle->shared->size.count =
1a520: 1593203c ldrne r2, [r3, #60] ; 0x3c
1a524: 15832084 strne r2, [r3, #132] ; 0x84
rtems_rfs_block_map_count (rtems_rfs_file_map (handle));
handle->shared->size.offset =
1a528: 15932040 ldrne r2, [r3, #64] ; 0x40
1a52c: 15832088 strne r2, [r3, #136] ; 0x88
rtems_rfs_block_map_size_offset (rtems_rfs_file_map (handle));
}
return rc;
}
1a530: e1a00008 mov r0, r8
1a534: e8bd85fc pop {r2, r3, r4, r5, r6, r7, r8, sl, pc}
0001a54c <rtems_rfs_file_io_release>:
int
rtems_rfs_file_io_release (rtems_rfs_file_handle* handle)
{
1a54c: e1a01000 mov r1, r0
int rc = 0;
if (rtems_rfs_buffer_handle_has_block (&handle->buffer))
1a550: e590000c ldr r0, [r0, #12]
1a554: e3500000 cmp r0, #0
1a558: 012fff1e bxeq lr
rc = rtems_rfs_buffer_handle_release (rtems_rfs_file_fs (handle),
1a55c: e591301c ldr r3, [r1, #28] <== NOT EXECUTED
1a560: e5930098 ldr r0, [r3, #152] ; 0x98 <== NOT EXECUTED
1a564: e2811004 add r1, r1, #4 <== NOT EXECUTED
1a568: eafff813 b 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
0001a144 <rtems_rfs_file_io_start>:
int
rtems_rfs_file_io_start (rtems_rfs_file_handle* handle,
size_t* available,
bool read)
{
1a144: e92d40f1 push {r0, r4, r5, r6, r7, lr}
1a148: e1a04000 mov r4, r0
1a14c: e1a06001 mov r6, r1
size_t size;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a150: e3a00000 mov r0, #0
1a154: e3a01020 mov r1, #32
int
rtems_rfs_file_io_start (rtems_rfs_file_handle* handle,
size_t* available,
bool read)
{
1a158: e20250ff and r5, r2, #255 ; 0xff
size_t size;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a15c: ebffdc42 bl 1126c <rtems_rfs_trace>
1a160: e3500000 cmp r0, #0
1a164: 0a000007 beq 1a188 <rtems_rfs_file_io_start+0x44>
printf ("rtems-rfs: file-io: start: %s pos=%" PRIu32 ":%" PRIu32 "\n",
1a168: e59f31ac ldr r3, [pc, #428] ; 1a31c <rtems_rfs_file_io_start+0x1d8><== NOT EXECUTED
1a16c: e3550000 cmp r5, #0 <== NOT EXECUTED
1a170: e2842010 add r2, r4, #16 <== NOT EXECUTED
1a174: e59f11a4 ldr r1, [pc, #420] ; 1a320 <rtems_rfs_file_io_start+0x1dc><== NOT EXECUTED
1a178: e59f01a4 ldr r0, [pc, #420] ; 1a324 <rtems_rfs_file_io_start+0x1e0><== NOT EXECUTED
1a17c: 11a01003 movne r1, r3 <== NOT EXECUTED
1a180: e892000c ldm r2, {r2, r3} <== NOT EXECUTED
1a184: eb001228 bl 1ea2c <printf> <== NOT EXECUTED
read ? "read" : "write", handle->bpos.bno, handle->bpos.boff);
if (!rtems_rfs_buffer_handle_has_block (&handle->buffer))
1a188: e594700c ldr r7, [r4, #12]
1a18c: e3570000 cmp r7, #0
1a190: 1a000041 bne 1a29c <rtems_rfs_file_io_start+0x158>
bool request_read;
int rc;
request_read = read;
rc = rtems_rfs_block_map_find (rtems_rfs_file_fs (handle),
1a194: e594101c ldr r1, [r4, #28]
1a198: e2842010 add r2, r4, #16
1a19c: e5910098 ldr r0, [r1, #152] ; 0x98
1a1a0: e1a0300d mov r3, sp
1a1a4: e2811034 add r1, r1, #52 ; 0x34
1a1a8: ebfff686 bl 17bc8 <rtems_rfs_block_map_find>
rtems_rfs_file_map (handle),
rtems_rfs_file_bpos (handle),
&block);
if (rc > 0)
1a1ac: e3500000 cmp r0, #0
1a1b0: da000017 ble 1a214 <rtems_rfs_file_io_start+0xd0>
{
/*
* Has the read reached the EOF ?
*/
if (read && (rc == ENXIO))
1a1b4: e3550000 cmp r5, #0
1a1b8: 0a000003 beq 1a1cc <rtems_rfs_file_io_start+0x88>
1a1bc: e3500006 cmp r0, #6 <== NOT EXECUTED
{
*available = 0;
1a1c0: 05867000 streq r7, [r6] <== NOT EXECUTED
return 0;
1a1c4: 01a00007 moveq r0, r7 <== NOT EXECUTED
1a1c8: ea000052 b 1a318 <rtems_rfs_file_io_start+0x1d4> <== NOT EXECUTED
}
if (rc != ENXIO)
1a1cc: e3500006 cmp r0, #6
1a1d0: 1a000050 bne 1a318 <rtems_rfs_file_io_start+0x1d4>
return rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a1d4: e3a00000 mov r0, #0
1a1d8: e3a01020 mov r1, #32
1a1dc: ebffdc22 bl 1126c <rtems_rfs_trace>
1a1e0: e3500000 cmp r0, #0
printf ("rtems-rfs: file-io: start: grow\n");
1a1e4: 159f013c ldrne r0, [pc, #316] ; 1a328 <rtems_rfs_file_io_start+0x1e4>
1a1e8: 1b0012a7 blne 1ec8c <puts>
rc = rtems_rfs_block_map_grow (rtems_rfs_file_fs (handle),
1a1ec: e594101c ldr r1, [r4, #28]
1a1f0: e3a02001 mov r2, #1
1a1f4: e5910098 ldr r0, [r1, #152] ; 0x98
1a1f8: e1a0300d mov r3, sp
1a1fc: e2811034 add r1, r1, #52 ; 0x34
1a200: ebfff6ee bl 17dc0 <rtems_rfs_block_map_grow>
rtems_rfs_file_map (handle),
1, &block);
if (rc > 0)
1a204: e3500000 cmp r0, #0
return rc;
request_read = false;
1a208: d3a07000 movle r7, #0
printf ("rtems-rfs: file-io: start: grow\n");
rc = rtems_rfs_block_map_grow (rtems_rfs_file_fs (handle),
rtems_rfs_file_map (handle),
1, &block);
if (rc > 0)
1a20c: ca000041 bgt 1a318 <rtems_rfs_file_io_start+0x1d4>
1a210: ea00000d b 1a24c <rtems_rfs_file_io_start+0x108>
/*
* If this is a write check if the write starts within a block or the
* amount of data is less than a block size. If it is read the block
* rather than getting a block to fill.
*/
if (!read &&
1a214: e3550000 cmp r5, #0
1a218: 11a07005 movne r7, r5
1a21c: 1a00000a bne 1a24c <rtems_rfs_file_io_start+0x108>
1a220: e5943014 ldr r3, [r4, #20]
1a224: e3530000 cmp r3, #0
(rtems_rfs_file_block_offset (handle) ||
(*available < rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)))))
request_read = true;
1a228: 13a07001 movne r7, #1
/*
* If this is a write check if the write starts within a block or the
* amount of data is less than a block size. If it is read the block
* rather than getting a block to fill.
*/
if (!read &&
1a22c: 1a000006 bne 1a24c <rtems_rfs_file_io_start+0x108>
(rtems_rfs_file_block_offset (handle) ||
(*available < rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)))))
1a230: e594301c ldr r3, [r4, #28]
1a234: e5933098 ldr r3, [r3, #152] ; 0x98
* If this is a write check if the write starts within a block or the
* amount of data is less than a block size. If it is read the block
* rather than getting a block to fill.
*/
if (!read &&
(rtems_rfs_file_block_offset (handle) ||
1a238: e5967000 ldr r7, [r6]
1a23c: e5933008 ldr r3, [r3, #8]
1a240: e1570003 cmp r7, r3
1a244: 23a07000 movcs r7, #0
1a248: 33a07001 movcc r7, #1
(*available < rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle)))))
request_read = true;
}
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a24c: e3a00000 mov r0, #0
1a250: e3a01020 mov r1, #32
1a254: ebffdc04 bl 1126c <rtems_rfs_trace>
1a258: e3500000 cmp r0, #0
1a25c: 0a000006 beq 1a27c <rtems_rfs_file_io_start+0x138>
printf ("rtems-rfs: file-io: start: block=%" PRIu32 " request-read=%s\n",
1a260: e59f30c4 ldr r3, [pc, #196] ; 1a32c <rtems_rfs_file_io_start+0x1e8><== NOT EXECUTED
1a264: e3570000 cmp r7, #0 <== NOT EXECUTED
1a268: e59f20c0 ldr r2, [pc, #192] ; 1a330 <rtems_rfs_file_io_start+0x1ec><== NOT EXECUTED
1a26c: e59f00c0 ldr r0, [pc, #192] ; 1a334 <rtems_rfs_file_io_start+0x1f0><== NOT EXECUTED
1a270: e59d1000 ldr r1, [sp] <== NOT EXECUTED
1a274: 11a02003 movne r2, r3 <== NOT EXECUTED
1a278: eb0011eb bl 1ea2c <printf> <== NOT EXECUTED
block, request_read ? "yes" : "no");
rc = rtems_rfs_buffer_handle_request (rtems_rfs_file_fs (handle),
1a27c: e594301c ldr r3, [r4, #28]
1a280: e2841004 add r1, r4, #4
1a284: e5930098 ldr r0, [r3, #152] ; 0x98
1a288: e59d2000 ldr r2, [sp]
1a28c: e1a03007 mov r3, r7
1a290: ebfff935 bl 1876c <rtems_rfs_buffer_handle_request>
rtems_rfs_file_buffer (handle),
block, request_read);
if (rc > 0)
1a294: e3500000 cmp r0, #0
1a298: ca00001e bgt 1a318 <rtems_rfs_file_io_start+0x1d4>
return rc;
}
if (read
1a29c: e3550000 cmp r5, #0
1a2a0: 0a00000c beq 1a2d8 <rtems_rfs_file_io_start+0x194>
&& rtems_rfs_block_map_last (rtems_rfs_file_map (handle))
1a2a4: e594301c ldr r3, [r4, #28]
1a2a8: e5932044 ldr r2, [r3, #68] ; 0x44
1a2ac: e3520000 cmp r2, #0
1a2b0: e593103c ldr r1, [r3, #60] ; 0x3c
1a2b4: 1a000001 bne 1a2c0 <rtems_rfs_file_io_start+0x17c>
1a2b8: e3510000 cmp r1, #0
1a2bc: 0a000002 beq 1a2cc <rtems_rfs_file_io_start+0x188>
1a2c0: e2411001 sub r1, r1, #1
1a2c4: e1520001 cmp r2, r1
1a2c8: 1a000002 bne 1a2d8 <rtems_rfs_file_io_start+0x194>
&& rtems_rfs_block_map_size_offset (rtems_rfs_file_map (handle)))
1a2cc: e5935040 ldr r5, [r3, #64] ; 0x40
1a2d0: e3550000 cmp r5, #0
1a2d4: 1a000002 bne 1a2e4 <rtems_rfs_file_io_start+0x1a0>
size = rtems_rfs_block_map_size_offset (rtems_rfs_file_map (handle));
else
size = rtems_rfs_fs_block_size (rtems_rfs_file_fs (handle));
1a2d8: e594301c ldr r3, [r4, #28]
1a2dc: e5933098 ldr r3, [r3, #152] ; 0x98
1a2e0: e5935008 ldr r5, [r3, #8]
*available = size - rtems_rfs_file_block_offset (handle);
1a2e4: e5943014 ldr r3, [r4, #20]
1a2e8: e0633005 rsb r3, r3, r5
1a2ec: e5863000 str r3, [r6]
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a2f0: e3a00000 mov r0, #0
1a2f4: e3a01020 mov r1, #32
1a2f8: ebffdbdb bl 1126c <rtems_rfs_trace>
1a2fc: e3500000 cmp r0, #0
1a300: 0a000004 beq 1a318 <rtems_rfs_file_io_start+0x1d4>
printf ("rtems-rfs: file-io: start: available=%zu (%zu)\n",
1a304: e59f002c ldr r0, [pc, #44] ; 1a338 <rtems_rfs_file_io_start+0x1f4><== NOT EXECUTED
1a308: e5961000 ldr r1, [r6] <== NOT EXECUTED
1a30c: e1a02005 mov r2, r5 <== NOT EXECUTED
1a310: eb0011c5 bl 1ea2c <printf> <== NOT EXECUTED
*available, size);
return 0;
1a314: e3a00000 mov r0, #0 <== NOT EXECUTED
}
1a318: e8bd80f8 pop {r3, r4, r5, r6, r7, pc}
0001a958 <rtems_rfs_file_open>:
int
rtems_rfs_file_open (rtems_rfs_file_system* fs,
rtems_rfs_ino ino,
int oflag,
rtems_rfs_file_handle** file)
{
1a958: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
1a95c: e1a06000 mov r6, r0
1a960: e1a08001 mov r8, r1
rtems_rfs_file_handle* handle;
rtems_rfs_file_shared* shared;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_OPEN))
1a964: e3a00000 mov r0, #0
1a968: e3a01008 mov r1, #8
int
rtems_rfs_file_open (rtems_rfs_file_system* fs,
rtems_rfs_ino ino,
int oflag,
rtems_rfs_file_handle** file)
{
1a96c: e58d2000 str r2, [sp]
1a970: e1a0b003 mov fp, r3
rtems_rfs_file_handle* handle;
rtems_rfs_file_shared* shared;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_OPEN))
1a974: ebffda3c bl 1126c <rtems_rfs_trace>
1a978: e3500000 cmp r0, #0
printf ("rtems-rfs: file-open: ino=%" PRId32 "\n", ino);
1a97c: 159f0290 ldrne r0, [pc, #656] ; 1ac14 <rtems_rfs_file_open+0x2bc>
1a980: 11a01008 movne r1, r8
1a984: 1b001028 blne 1ea2c <printf>
*file = NULL;
1a988: e3a07000 mov r7, #0
1a98c: e58b7000 str r7, [fp]
/*
* Allocate a new handle and initialise it. Do this before we deal with the
* shared node data so we do not have to be concerned with reference
* counting.
*/
handle = malloc (sizeof (rtems_rfs_file_handle));
1a990: e3a00020 mov r0, #32
1a994: ebffb10d bl 6dd0 <malloc>
if (!handle)
1a998: e2504000 subs r4, r0, #0
1a99c: 0a000099 beq 1ac08 <rtems_rfs_file_open+0x2b0>
return ENOMEM;
memset (handle, 0, sizeof (rtems_rfs_file_handle));
1a9a0: e1a01007 mov r1, r7
1a9a4: e3a02020 mov r2, #32
1a9a8: eb000fae bl 1e868 <memset>
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
1a9ac: e5c47004 strb r7, [r4, #4]
handle->bnum = 0;
1a9b0: e5847008 str r7, [r4, #8]
handle->buffer = NULL;
1a9b4: e584700c str r7, [r4, #12]
/*
* Scan the file system data list of open files for this ino. If found up
* the reference count and return the pointer to the data.
*/
shared = rtems_rfs_file_get_shared (fs, ino);
1a9b8: e1a00006 mov r0, r6
1a9bc: e1a01008 mov r1, r8
1a9c0: ebffffd7 bl 1a924 <rtems_rfs_file_get_shared>
if (shared)
1a9c4: e2505000 subs r5, r0, #0
1a9c8: 0a000009 beq 1a9f4 <rtems_rfs_file_open+0x9c>
{
shared->references++;
1a9cc: e5953008 ldr r3, [r5, #8] <== NOT EXECUTED
1a9d0: e2833001 add r3, r3, #1 <== NOT EXECUTED
1a9d4: e5853008 str r3, [r5, #8] <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_OPEN))
1a9d8: e3a00000 mov r0, #0 <== NOT EXECUTED
1a9dc: e3a01008 mov r1, #8 <== NOT EXECUTED
1a9e0: ebffda21 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1a9e4: e1500007 cmp r0, r7 <== NOT EXECUTED
printf ("rtems-rfs: file-open: ino=%" PRId32 " shared\n", ino);
1a9e8: 159f0228 ldrne r0, [pc, #552] ; 1ac18 <rtems_rfs_file_open+0x2c0><== NOT EXECUTED
*/
shared = rtems_rfs_file_get_shared (fs, ino);
if (shared)
{
shared->references++;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_OPEN))
1a9ec: 0a00007f beq 1abf0 <rtems_rfs_file_open+0x298> <== NOT EXECUTED
1a9f0: ea00007c b 1abe8 <rtems_rfs_file_open+0x290> <== NOT EXECUTED
{
/*
* None exists so create. Copy in the shared parts of the inode we hold in
* memory.
*/
shared = malloc (sizeof (rtems_rfs_file_shared));
1a9f4: e3a0009c mov r0, #156 ; 0x9c
1a9f8: ebffb0f4 bl 6dd0 <malloc>
if (!shared)
1a9fc: e2505000 subs r5, r0, #0
1aa00: 1a000008 bne 1aa28 <rtems_rfs_file_open+0xd0>
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1aa04: e1a00006 mov r0, r6 <== NOT EXECUTED
1aa08: e2841004 add r1, r4, #4 <== NOT EXECUTED
1aa0c: ebfff6ea bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
handle->dirty = false;
1aa10: e5c45004 strb r5, [r4, #4] <== NOT EXECUTED
handle->bnum = 0;
1aa14: e5845008 str r5, [r4, #8] <== NOT EXECUTED
handle->buffer = NULL;
1aa18: e584500c str r5, [r4, #12] <== NOT EXECUTED
{
rtems_rfs_buffer_handle_close (fs, &handle->buffer);
free (handle);
1aa1c: e1a00004 mov r0, r4 <== NOT EXECUTED
1aa20: ebffaf7a bl 6810 <free> <== NOT EXECUTED
1aa24: ea000077 b 1ac08 <rtems_rfs_file_open+0x2b0> <== NOT EXECUTED
return ENOMEM;
}
memset (shared, 0, sizeof (rtems_rfs_file_shared));
1aa28: e1a01007 mov r1, r7
1aa2c: e3a0209c mov r2, #156 ; 0x9c
rc = rtems_rfs_inode_open (fs, ino, &shared->inode, true);
1aa30: e285900c add r9, r5, #12
rtems_rfs_buffer_handle_close (fs, &handle->buffer);
free (handle);
return ENOMEM;
}
memset (shared, 0, sizeof (rtems_rfs_file_shared));
1aa34: eb000f8b bl 1e868 <memset>
rc = rtems_rfs_inode_open (fs, ino, &shared->inode, true);
1aa38: e1a00006 mov r0, r6
1aa3c: e1a01008 mov r1, r8
1aa40: e1a02009 mov r2, r9
1aa44: e3a03001 mov r3, #1
1aa48: ebffd3f9 bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
1aa4c: e250a000 subs sl, r0, #0
1aa50: da00000b ble 1aa84 <rtems_rfs_file_open+0x12c>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_OPEN))
1aa54: e3a00000 mov r0, #0 <== NOT EXECUTED
1aa58: e3a01008 mov r1, #8 <== NOT EXECUTED
1aa5c: ebffda02 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1aa60: e3500000 cmp r0, #0 <== NOT EXECUTED
1aa64: 0a00001a beq 1aad4 <rtems_rfs_file_open+0x17c> <== NOT EXECUTED
printf ("rtems-rfs: file-open: inode open failed: %d: %s\n",
1aa68: e1a0000a mov r0, sl <== NOT EXECUTED
1aa6c: eb00149c bl 1fce4 <strerror> <== NOT EXECUTED
1aa70: e1a0100a mov r1, sl <== NOT EXECUTED
1aa74: e1a02000 mov r2, r0 <== NOT EXECUTED
1aa78: e59f019c ldr r0, [pc, #412] ; 1ac1c <rtems_rfs_file_open+0x2c4><== NOT EXECUTED
1aa7c: eb000fea bl 1ea2c <printf> <== NOT EXECUTED
1aa80: ea000013 b 1aad4 <rtems_rfs_file_open+0x17c> <== NOT EXECUTED
rtems_rfs_buffer_handle_close (fs, &handle->buffer);
free (handle);
return rc;
}
rc = rtems_rfs_block_map_open (fs, &shared->inode, &shared->map);
1aa84: e1a00006 mov r0, r6
1aa88: e1a01009 mov r1, r9
1aa8c: e2852034 add r2, r5, #52 ; 0x34
1aa90: ebfff380 bl 17898 <rtems_rfs_block_map_open>
if (rc > 0)
1aa94: e250a000 subs sl, r0, #0
1aa98: da000019 ble 1ab04 <rtems_rfs_file_open+0x1ac>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_OPEN))
1aa9c: e3a00000 mov r0, #0 <== NOT EXECUTED
1aaa0: e3a01008 mov r1, #8 <== NOT EXECUTED
1aaa4: ebffd9f0 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1aaa8: e3500000 cmp r0, #0 <== NOT EXECUTED
1aaac: 0a000005 beq 1aac8 <rtems_rfs_file_open+0x170> <== NOT EXECUTED
printf ("rtems-rfs: file-open: block map open failed: %d: %s\n",
1aab0: e1a0000a mov r0, sl <== NOT EXECUTED
1aab4: eb00148a bl 1fce4 <strerror> <== NOT EXECUTED
1aab8: e1a0100a mov r1, sl <== NOT EXECUTED
1aabc: e1a02000 mov r2, r0 <== NOT EXECUTED
1aac0: e59f0158 ldr r0, [pc, #344] ; 1ac20 <rtems_rfs_file_open+0x2c8><== NOT EXECUTED
1aac4: eb000fd8 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
rtems_rfs_inode_close (fs, &shared->inode);
1aac8: e1a00006 mov r0, r6 <== NOT EXECUTED
1aacc: e1a01009 mov r1, r9 <== NOT EXECUTED
1aad0: ebffd44c bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
free (shared);
1aad4: e1a00005 mov r0, r5 <== NOT EXECUTED
1aad8: ebffaf4c bl 6810 <free> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1aadc: e1a00006 mov r0, r6 <== NOT EXECUTED
1aae0: e2841004 add r1, r4, #4 <== NOT EXECUTED
1aae4: ebfff6b4 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
handle->dirty = false;
1aae8: e3a03000 mov r3, #0 <== NOT EXECUTED
1aaec: e5c43004 strb r3, [r4, #4] <== NOT EXECUTED
handle->bnum = 0;
1aaf0: e5843008 str r3, [r4, #8] <== NOT EXECUTED
handle->buffer = NULL;
1aaf4: e584300c str r3, [r4, #12] <== NOT EXECUTED
rtems_rfs_buffer_handle_close (fs, &handle->buffer);
free (handle);
1aaf8: e1a00004 mov r0, r4 <== NOT EXECUTED
1aafc: ebffaf43 bl 6810 <free> <== NOT EXECUTED
return rc;
1ab00: ea000041 b 1ac0c <rtems_rfs_file_open+0x2b4> <== NOT EXECUTED
}
shared->references = 1;
1ab04: e3a03001 mov r3, #1
1ab08: e5853008 str r3, [r5, #8]
* @return uint32_t The block count.
*/
static inline uint32_t
rtems_rfs_inode_get_block_count (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->block_count);
1ab0c: e5953018 ldr r3, [r5, #24]
1ab10: e5d3200d ldrb r2, [r3, #13]
1ab14: e5d3100c ldrb r1, [r3, #12]
1ab18: e1a02802 lsl r2, r2, #16
1ab1c: e1822c01 orr r2, r2, r1, lsl #24
1ab20: e5d3100f ldrb r1, [r3, #15]
1ab24: e1822001 orr r2, r2, r1
1ab28: e5d3100e ldrb r1, [r3, #14]
1ab2c: e1822401 orr r2, r2, r1, lsl #8
shared->size.count = rtems_rfs_inode_get_block_count (&shared->inode);
1ab30: e5852084 str r2, [r5, #132] ; 0x84
* @return uint32_t The block offset.
*/
static inline uint16_t
rtems_rfs_inode_get_block_offset (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->block_offset);
1ab34: e5d3100a ldrb r1, [r3, #10]
1ab38: e5d3200b ldrb r2, [r3, #11]
shared->size.offset = rtems_rfs_inode_get_block_offset (&shared->inode);
1ab3c: e1822401 orr r2, r2, r1, lsl #8
1ab40: e5852088 str r2, [r5, #136] ; 0x88
* @return rtems_rfs_time The atime.
*/
static inline rtems_rfs_time
rtems_rfs_inode_get_atime (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->atime);
1ab44: e5d32011 ldrb r2, [r3, #17]
1ab48: e5d31010 ldrb r1, [r3, #16]
1ab4c: e1a02802 lsl r2, r2, #16
1ab50: e1822c01 orr r2, r2, r1, lsl #24
1ab54: e5d31013 ldrb r1, [r3, #19]
1ab58: e1822001 orr r2, r2, r1
1ab5c: e5d31012 ldrb r1, [r3, #18]
1ab60: e1822401 orr r2, r2, r1, lsl #8
shared->atime = rtems_rfs_inode_get_atime (&shared->inode);
1ab64: e585208c str r2, [r5, #140] ; 0x8c
* @return rtems_rfs_time The mtime.
*/
static inline rtems_rfs_time
rtems_rfs_inode_get_mtime (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->mtime);
1ab68: e5d32015 ldrb r2, [r3, #21]
1ab6c: e5d31014 ldrb r1, [r3, #20]
1ab70: e1a02802 lsl r2, r2, #16
1ab74: e1822c01 orr r2, r2, r1, lsl #24
1ab78: e5d31017 ldrb r1, [r3, #23]
1ab7c: e1822001 orr r2, r2, r1
1ab80: e5d31016 ldrb r1, [r3, #22]
1ab84: e1822401 orr r2, r2, r1, lsl #8
shared->mtime = rtems_rfs_inode_get_mtime (&shared->inode);
1ab88: e5852090 str r2, [r5, #144] ; 0x90
* @return rtems_rfs_time The ctime.
*/
static inline rtems_rfs_time
rtems_rfs_inode_get_ctime (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->ctime);
1ab8c: e5d32019 ldrb r2, [r3, #25]
1ab90: e5d31018 ldrb r1, [r3, #24]
1ab94: e1a02802 lsl r2, r2, #16
1ab98: e1822c01 orr r2, r2, r1, lsl #24
1ab9c: e5d3101b ldrb r1, [r3, #27]
1aba0: e5d3301a ldrb r3, [r3, #26]
1aba4: e1822001 orr r2, r2, r1
1aba8: e1823403 orr r3, r2, r3, lsl #8
shared->ctime = rtems_rfs_inode_get_ctime (&shared->inode);
1abac: e5853094 str r3, [r5, #148] ; 0x94
RTEMS_INLINE_ROUTINE void rtems_chain_append(
rtems_chain_control *the_chain,
rtems_chain_node *the_node
)
{
_Chain_Append( the_chain, the_node );
1abb0: e2860074 add r0, r6, #116 ; 0x74
1abb4: e1a01005 mov r1, r5
shared->fs = fs;
1abb8: e5856098 str r6, [r5, #152] ; 0x98
1abbc: ebffc2fb bl b7b0 <_Chain_Append>
rtems_chain_append (&fs->file_shares, &shared->link);
rtems_rfs_inode_unload (fs, &shared->inode, false);
1abc0: e1a01009 mov r1, r9
1abc4: e1a02007 mov r2, r7
1abc8: e1a00006 mov r0, r6
1abcc: ebffd3d2 bl fb1c <rtems_rfs_inode_unload>
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_OPEN))
1abd0: e3a00000 mov r0, #0
1abd4: e3a01008 mov r1, #8
1abd8: ebffd9a3 bl 1126c <rtems_rfs_trace>
1abdc: e3500000 cmp r0, #0
1abe0: 0a000002 beq 1abf0 <rtems_rfs_file_open+0x298>
printf ("rtems-rfs: file-open: ino=%" PRId32 " share created\n", ino);
1abe4: e59f0038 ldr r0, [pc, #56] ; 1ac24 <rtems_rfs_file_open+0x2cc><== NOT EXECUTED
1abe8: e1a01008 mov r1, r8 <== NOT EXECUTED
1abec: eb000f8e bl 1ea2c <printf> <== NOT EXECUTED
}
handle->flags = oflag;
1abf0: e59d3000 ldr r3, [sp]
handle->shared = shared;
1abf4: e584501c str r5, [r4, #28]
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_OPEN))
printf ("rtems-rfs: file-open: ino=%" PRId32 " share created\n", ino);
}
handle->flags = oflag;
1abf8: e5843000 str r3, [r4]
handle->shared = shared;
*file = handle;
return 0;
1abfc: e3a0a000 mov sl, #0
}
handle->flags = oflag;
handle->shared = shared;
*file = handle;
1ac00: e58b4000 str r4, [fp]
return 0;
1ac04: ea000000 b 1ac0c <rtems_rfs_file_open+0x2b4>
* shared node data so we do not have to be concerned with reference
* counting.
*/
handle = malloc (sizeof (rtems_rfs_file_handle));
if (!handle)
return ENOMEM;
1ac08: e3a0a00c mov sl, #12 <== NOT EXECUTED
handle->shared = shared;
*file = handle;
return 0;
}
1ac0c: e1a0000a mov r0, sl
1ac10: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
0001a56c <rtems_rfs_file_seek>:
int
rtems_rfs_file_seek (rtems_rfs_file_handle* handle,
rtems_rfs_pos pos,
rtems_rfs_pos* new_pos)
{
1a56c: e92d41f1 push {r0, r4, r5, r6, r7, r8, lr}
1a570: e1a04000 mov r4, r0
1a574: e1a06001 mov r6, r1
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a578: e3a00000 mov r0, #0
1a57c: e3a01020 mov r1, #32
int
rtems_rfs_file_seek (rtems_rfs_file_handle* handle,
rtems_rfs_pos pos,
rtems_rfs_pos* new_pos)
{
1a580: e1a07002 mov r7, r2
1a584: e1a08003 mov r8, r3
if (rtems_rfs_trace (RTEMS_RFS_TRACE_FILE_IO))
1a588: ebffdb37 bl 1126c <rtems_rfs_trace>
1a58c: e3500000 cmp r0, #0
printf ("rtems-rfs: file-seek: new=%" PRIu64 "\n", pos);
1a590: 159f00ac ldrne r0, [pc, #172] ; 1a644 <rtems_rfs_file_seek+0xd8>
1a594: 11a01006 movne r1, r6
1a598: 11a02007 movne r2, r7
1a59c: 1b001122 blne 1ea2c <printf>
* file, this function does not itself extend the size of the file."
*
* This means the file needs to set the file size to the pos only when a
* write occurs.
*/
if (pos <= rtems_rfs_file_shared_get_size (rtems_rfs_file_fs (handle),
1a5a0: e594101c ldr r1, [r4, #28]
1a5a4: e5910098 ldr r0, [r1, #152] ; 0x98
1a5a8: e2811084 add r1, r1, #132 ; 0x84
1a5ac: ebfff4aa bl 1785c <rtems_rfs_block_get_size>
1a5b0: e1510007 cmp r1, r7
1a5b4: 01500006 cmpeq r0, r6
1a5b8: 3a00001a bcc 1a628 <rtems_rfs_file_seek+0xbc>
handle->shared))
{
rtems_rfs_file_set_bpos (handle, pos);
1a5bc: e594301c ldr r3, [r4, #28]
1a5c0: e2845010 add r5, r4, #16
1a5c4: e5930098 ldr r0, [r3, #152] ; 0x98
1a5c8: e1a01006 mov r1, r6
1a5cc: e1a03005 mov r3, r5
1a5d0: e1a02007 mov r2, r7
1a5d4: ebfff470 bl 1779c <rtems_rfs_block_get_bpos>
/*
* If the file has a block check if it maps to the current position and it
* does not release it. That will force us to get the block at the new
* position when the I/O starts.
*/
if (rtems_rfs_buffer_handle_has_block (&handle->buffer))
1a5d8: e594300c ldr r3, [r4, #12]
1a5dc: e3530000 cmp r3, #0
1a5e0: 0a000014 beq 1a638 <rtems_rfs_file_seek+0xcc>
{
rtems_rfs_buffer_block block;
int rc;
rc = rtems_rfs_block_map_find (rtems_rfs_file_fs (handle),
1a5e4: e594101c ldr r1, [r4, #28]
1a5e8: e1a02005 mov r2, r5
1a5ec: e5910098 ldr r0, [r1, #152] ; 0x98
1a5f0: e1a0300d mov r3, sp
1a5f4: e2811034 add r1, r1, #52 ; 0x34
1a5f8: ebfff572 bl 17bc8 <rtems_rfs_block_map_find>
rtems_rfs_file_map (handle),
rtems_rfs_file_bpos (handle),
&block);
if (rc > 0)
1a5fc: e3500000 cmp r0, #0
1a600: ca00000e bgt 1a640 <rtems_rfs_file_seek+0xd4>
return rc;
if (rtems_rfs_buffer_bnum (&handle->buffer) != block)
1a604: e5942008 ldr r2, [r4, #8]
1a608: e59d3000 ldr r3, [sp]
1a60c: e1520003 cmp r2, r3
1a610: 0a000008 beq 1a638 <rtems_rfs_file_seek+0xcc>
{
rc = rtems_rfs_buffer_handle_release (rtems_rfs_file_fs (handle),
1a614: e594301c ldr r3, [r4, #28] <== NOT EXECUTED
1a618: e2841004 add r1, r4, #4 <== NOT EXECUTED
1a61c: e5930098 ldr r0, [r3, #152] ; 0x98 <== NOT EXECUTED
1a620: ebfff7e5 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
1a624: ea000001 b 1a630 <rtems_rfs_file_seek+0xc4> <== NOT EXECUTED
{
/*
* The seek is outside the current file so release any buffer. A write will
* extend the file.
*/
int rc = rtems_rfs_file_io_release (handle);
1a628: e1a00004 mov r0, r4
1a62c: ebffffc6 bl 1a54c <rtems_rfs_file_io_release>
if (rc > 0)
1a630: e3500000 cmp r0, #0
1a634: ca000001 bgt 1a640 <rtems_rfs_file_seek+0xd4>
return rc;
}
*new_pos = pos;
1a638: e88800c0 stm r8, {r6, r7}
return 0;
1a63c: e3a00000 mov r0, #0
}
1a640: e8bd81f8 pop {r3, r4, r5, r6, r7, r8, pc}
0000e760 <rtems_rfs_format>:
return rc;
}
int
rtems_rfs_format (const char* name, const rtems_rfs_format_config* config)
{
e760: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_rfs_file_system fs;
int group;
int rc;
if (config->verbose)
e764: e5d13015 ldrb r3, [r1, #21]
return rc;
}
int
rtems_rfs_format (const char* name, const rtems_rfs_format_config* config)
{
e768: e24dd0e8 sub sp, sp, #232 ; 0xe8
rtems_rfs_file_system fs;
int group;
int rc;
if (config->verbose)
e76c: e3530000 cmp r3, #0
return rc;
}
int
rtems_rfs_format (const char* name, const rtems_rfs_format_config* config)
{
e770: e58d0004 str r0, [sp, #4]
e774: e1a04001 mov r4, r1
rtems_rfs_file_system fs;
int group;
int rc;
if (config->verbose)
printf ("rtems-rfs: format: %s\n", name);
e778: 159f0ab0 ldrne r0, [pc, #2736] ; f230 <rtems_rfs_format+0xad0>
e77c: 159d1004 ldrne r1, [sp, #4]
e780: 1b0040a9 blne 1ea2c <printf>
memset (&fs, 0, sizeof (rtems_rfs_file_system));
e784: e3a01000 mov r1, #0
e788: e3a02084 mov r2, #132 ; 0x84
e78c: e28d0010 add r0, sp, #16
e790: eb004034 bl 1e868 <memset>
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
e794: e28d3058 add r3, sp, #88 ; 0x58
e798: e58d3054 str r3, [sp, #84] ; 0x54
head->previous = NULL;
tail->previous = head;
e79c: e28d3054 add r3, sp, #84 ; 0x54
e7a0: e58d305c str r3, [sp, #92] ; 0x5c
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
e7a4: e28d3068 add r3, sp, #104 ; 0x68
e7a8: e58d3064 str r3, [sp, #100] ; 0x64
head->previous = NULL;
tail->previous = head;
e7ac: e28d3064 add r3, sp, #100 ; 0x64
e7b0: e58d306c str r3, [sp, #108] ; 0x6c
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
e7b4: e28d3078 add r3, sp, #120 ; 0x78
e7b8: e58d3074 str r3, [sp, #116] ; 0x74
head->previous = NULL;
tail->previous = head;
e7bc: e28d3074 add r3, sp, #116 ; 0x74
e7c0: e58d307c str r3, [sp, #124] ; 0x7c
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
e7c4: e28d3088 add r3, sp, #136 ; 0x88
e7c8: e58d3084 str r3, [sp, #132] ; 0x84
head->previous = NULL;
tail->previous = head;
e7cc: e28d3084 add r3, sp, #132 ; 0x84
e7d0: e58d308c str r3, [sp, #140] ; 0x8c
rtems_chain_initialize_empty (&fs.buffers);
rtems_chain_initialize_empty (&fs.release);
rtems_chain_initialize_empty (&fs.release_modified);
rtems_chain_initialize_empty (&fs.file_shares);
fs.max_held_buffers = RTEMS_RFS_FS_MAX_HELD_BUFFERS;
e7d4: e3a03005 mov r3, #5
e7d8: e58d3050 str r3, [sp, #80] ; 0x50
fs.flags = RTEMS_RFS_FS_NO_LOCAL_CACHE;
/*
* Open the buffer interface.
*/
rc = rtems_rfs_buffer_open (name, &fs);
e7dc: e59d0004 ldr r0, [sp, #4]
fs.max_held_buffers = RTEMS_RFS_FS_MAX_HELD_BUFFERS;
fs.release_count = 0;
fs.release_modified_count = 0;
fs.flags = RTEMS_RFS_FS_NO_LOCAL_CACHE;
e7e0: e3a03002 mov r3, #2
/*
* Open the buffer interface.
*/
rc = rtems_rfs_buffer_open (name, &fs);
e7e4: e28d1010 add r1, sp, #16
fs.max_held_buffers = RTEMS_RFS_FS_MAX_HELD_BUFFERS;
fs.release_count = 0;
fs.release_modified_count = 0;
fs.flags = RTEMS_RFS_FS_NO_LOCAL_CACHE;
e7e8: e58d3010 str r3, [sp, #16]
/*
* Open the buffer interface.
*/
rc = rtems_rfs_buffer_open (name, &fs);
e7ec: eb002876 bl 189cc <rtems_rfs_buffer_open>
if (rc > 0)
e7f0: e2505000 subs r5, r0, #0
e7f4: da000003 ble e808 <rtems_rfs_format+0xa8>
{
printf ("rtems-rfs: format: buffer open failed: %d: %s\n",
e7f8: eb004539 bl 1fce4 <strerror> <== NOT EXECUTED
e7fc: e1a02000 mov r2, r0 <== NOT EXECUTED
e800: e59f0a2c ldr r0, [pc, #2604] ; f234 <rtems_rfs_format+0xad4><== NOT EXECUTED
e804: ea000280 b f20c <rtems_rfs_format+0xaac> <== NOT EXECUTED
}
/*
* Check the media.
*/
if (rtems_rfs_fs_media_block_size (&fs) == 0)
e808: e59d3020 ldr r3, [sp, #32]
e80c: e5931020 ldr r1, [r3, #32]
e810: e3510000 cmp r1, #0
{
printf ("rtems-rfs: media block is invalid: %" PRIu32 "\n",
e814: 059f0a1c ldreq r0, [pc, #2588] ; f238 <rtems_rfs_format+0xad8>
}
/*
* Check the media.
*/
if (rtems_rfs_fs_media_block_size (&fs) == 0)
e818: 0a000139 beq ed04 <rtems_rfs_format+0x5a4>
static bool
rtems_rfs_check_config (rtems_rfs_file_system* fs,
const rtems_rfs_format_config* config)
{
fs->block_size = config->block_size;
e81c: e5943000 ldr r3, [r4]
if (!fs->block_size)
e820: e3530000 cmp r3, #0
static bool
rtems_rfs_check_config (rtems_rfs_file_system* fs,
const rtems_rfs_format_config* config)
{
fs->block_size = config->block_size;
e824: e58d3018 str r3, [sp, #24]
if (!fs->block_size)
e828: 1a00001d bne e8a4 <rtems_rfs_format+0x144>
{
uint64_t total_size = rtems_rfs_fs_media_size (fs);
e82c: e28d0010 add r0, sp, #16
e830: eb003100 bl 1ac38 <rtems_rfs_fs_media_size>
if (total_size >= GIGS (1))
e834: e59f2a00 ldr r2, [pc, #2560] ; f23c <rtems_rfs_format+0xadc>
e838: e3a03000 mov r3, #0
e83c: e1530001 cmp r3, r1
e840: 01520000 cmpeq r2, r0
e844: 2a00000e bcs e884 <rtems_rfs_format+0x124>
{
uint32_t gigs = (total_size + GIGS (1)) / GIGS (1);
e848: e3a02601 mov r2, #1048576 ; 0x100000 <== NOT EXECUTED
e84c: e0922000 adds r2, r2, r0 <== NOT EXECUTED
e850: e3a03000 mov r3, #0 <== NOT EXECUTED
e854: e0a33001 adc r3, r3, r1 <== NOT EXECUTED
e858: e1a01a22 lsr r1, r2, #20 <== NOT EXECUTED
e85c: e1811603 orr r1, r1, r3, lsl #12 <== NOT EXECUTED
int b;
for (b = 31; b > 0; b--)
if ((gigs & (1 << b)) != 0)
e860: e3a02001 mov r2, #1 <== NOT EXECUTED
if (total_size >= GIGS (1))
{
uint32_t gigs = (total_size + GIGS (1)) / GIGS (1);
int b;
for (b = 31; b > 0; b--)
e864: e3a0301f mov r3, #31 <== NOT EXECUTED
if ((gigs & (1 << b)) != 0)
e868: e0110312 ands r0, r1, r2, lsl r3 <== NOT EXECUTED
e86c: 1a000001 bne e878 <rtems_rfs_format+0x118> <== NOT EXECUTED
if (total_size >= GIGS (1))
{
uint32_t gigs = (total_size + GIGS (1)) / GIGS (1);
int b;
for (b = 31; b > 0; b--)
e870: e2533001 subs r3, r3, #1 <== NOT EXECUTED
e874: 1afffffb bne e868 <rtems_rfs_format+0x108> <== NOT EXECUTED
if ((gigs & (1 << b)) != 0)
break;
fs->block_size = 1 << b;
e878: e3a02001 mov r2, #1 <== NOT EXECUTED
e87c: e1a03312 lsl r3, r2, r3 <== NOT EXECUTED
e880: e58d3018 str r3, [sp, #24] <== NOT EXECUTED
}
if (fs->block_size < 512)
e884: e59d3018 ldr r3, [sp, #24]
e888: e3530c02 cmp r3, #512 ; 0x200
fs->block_size = 512;
e88c: 33a03c02 movcc r3, #512 ; 0x200
e890: 358d3018 strcc r3, [sp, #24]
if (fs->block_size > (4 * 1024))
e894: e59d3018 ldr r3, [sp, #24]
e898: e3530a01 cmp r3, #4096 ; 0x1000
fs->block_size = (4 * 1024);
e89c: 83a03a01 movhi r3, #4096 ; 0x1000
e8a0: 858d3018 strhi r3, [sp, #24]
}
if ((fs->block_size % rtems_rfs_fs_media_block_size (fs)) != 0)
e8a4: e59d3020 ldr r3, [sp, #32]
e8a8: e59d5018 ldr r5, [sp, #24]
e8ac: e5937020 ldr r7, [r3, #32]
e8b0: e1a00005 mov r0, r5
e8b4: e1a01007 mov r1, r7
e8b8: eb0071ce bl 2aff8 <__umodsi3>
e8bc: e2506000 subs r6, r0, #0
{
printf ("block size (%zd) is not a multiple of media block size (%" PRId32 ")\n",
e8c0: 159f0978 ldrne r0, [pc, #2424] ; f240 <rtems_rfs_format+0xae0>
e8c4: 11a01005 movne r1, r5
e8c8: 11a02007 movne r2, r7
e8cc: 1a00024f bne f210 <rtems_rfs_format+0xab0>
fs->block_size, rtems_rfs_fs_media_block_size (fs));
return false;
}
fs->group_blocks = config->group_blocks;
e8d0: e5943004 ldr r3, [r4, #4]
e8d4: e1a05185 lsl r5, r5, #3
{
/*
* The number of blocks per group is defined by the number of bits in a
* block.
*/
fs->group_blocks = rtems_rfs_bitmap_numof_bits (fs->block_size);
e8d8: e3530000 cmp r3, #0
e8dc: 01a03005 moveq r3, r5
}
if (fs->group_blocks > rtems_rfs_bitmap_numof_bits (fs->block_size))
e8e0: e1530005 cmp r3, r5
{
/*
* The number of blocks per group is defined by the number of bits in a
* block.
*/
fs->group_blocks = rtems_rfs_bitmap_numof_bits (fs->block_size);
e8e4: e58d3038 str r3, [sp, #56] ; 0x38
}
if (fs->group_blocks > rtems_rfs_bitmap_numof_bits (fs->block_size))
{
printf ("group block count is higher than bits in block\n");
e8e8: 859f0954 ldrhi r0, [pc, #2388] ; f244 <rtems_rfs_format+0xae4>
* block.
*/
fs->group_blocks = rtems_rfs_bitmap_numof_bits (fs->block_size);
}
if (fs->group_blocks > rtems_rfs_bitmap_numof_bits (fs->block_size))
e8ec: 8a0000f8 bhi ecd4 <rtems_rfs_format+0x574>
{
printf ("group block count is higher than bits in block\n");
return false;
}
fs->blocks = rtems_rfs_fs_media_size (fs) / fs->block_size;
e8f0: e28d0010 add r0, sp, #16
e8f4: eb0030cf bl 1ac38 <rtems_rfs_fs_media_size>
e8f8: e59d5018 ldr r5, [sp, #24]
e8fc: e1a03006 mov r3, r6
e900: e1a02005 mov r2, r5
e904: eb0076f0 bl 2c4cc <__udivdi3>
* Return the number of bits that fit in the block size.
*/
static int
rtems_rfs_bits_per_block (rtems_rfs_file_system* fs)
{
return rtems_rfs_bitmap_numof_bits (rtems_rfs_fs_block_size (fs));
e908: e1a06185 lsl r6, r5, #3
/*
* The bits per block sets the upper limit for the number of blocks in a
* group. The disk will be divided into groups which are the number of bits
* per block.
*/
fs->group_count = rtems_rfs_rup_quotient (rtems_rfs_fs_blocks (fs),
e90c: e1a01006 mov r1, r6
{
printf ("group block count is higher than bits in block\n");
return false;
}
fs->blocks = rtems_rfs_fs_media_size (fs) / fs->block_size;
e910: e1a08000 mov r8, r0
e914: e58d0014 str r0, [sp, #20]
/*
* The bits per block sets the upper limit for the number of blocks in a
* group. The disk will be divided into groups which are the number of bits
* per block.
*/
fs->group_count = rtems_rfs_rup_quotient (rtems_rfs_fs_blocks (fs),
e918: ebffff75 bl e6f4 <rtems_rfs_rup_quotient>
rtems_rfs_bits_per_block (fs));
fs->group_inodes = config->group_inodes;
e91c: e5943008 ldr r3, [r4, #8]
if (!fs->group_inodes)
e920: e3530000 cmp r3, #0
/*
* The bits per block sets the upper limit for the number of blocks in a
* group. The disk will be divided into groups which are the number of bits
* per block.
*/
fs->group_count = rtems_rfs_rup_quotient (rtems_rfs_fs_blocks (fs),
e924: e1a07000 mov r7, r0
e928: e58d0034 str r0, [sp, #52] ; 0x34
rtems_rfs_bits_per_block (fs));
fs->group_inodes = config->group_inodes;
e92c: e58d303c str r3, [sp, #60] ; 0x3c
if (!fs->group_inodes)
e930: 1a00000e bne e970 <rtems_rfs_format+0x210>
int inode_overhead = RTEMS_RFS_INODE_OVERHEAD_PERCENTAGE;
/*
* The number of inodes per group is set as a percentage.
*/
if (config->inode_overhead)
e934: e594300c ldr r3, [r4, #12]
rtems_rfs_bits_per_block (fs));
fs->group_inodes = config->group_inodes;
if (!fs->group_inodes)
{
int inode_overhead = RTEMS_RFS_INODE_OVERHEAD_PERCENTAGE;
e938: e3530000 cmp r3, #0
e93c: 03a03001 moveq r3, #1
static int
rtems_rfs_inodes_from_percent (rtems_rfs_file_system* fs,
int percentage)
{
int blocks;
blocks = ((rtems_rfs_fs_blocks (fs) -
e940: e2480001 sub r0, r8, #1
RTEMS_RFS_SUPERBLOCK_SIZE) * percentage) / 100;
e944: e0000093 mul r0, r3, r0
e948: e3a01064 mov r1, #100 ; 0x64
e94c: ebffcbfb bl 1940 <__aeabi_uidiv>
blocks = rtems_rfs_rup_quotient (blocks, fs->group_count);
e950: e1a01007 mov r1, r7
e954: ebffff66 bl e6f4 <rtems_rfs_rup_quotient>
return blocks * (rtems_rfs_fs_block_size (fs) / RTEMS_RFS_INODE_SIZE);
e958: e3a01038 mov r1, #56 ; 0x38
int percentage)
{
int blocks;
blocks = ((rtems_rfs_fs_blocks (fs) -
RTEMS_RFS_SUPERBLOCK_SIZE) * percentage) / 100;
blocks = rtems_rfs_rup_quotient (blocks, fs->group_count);
e95c: e1a07000 mov r7, r0
return blocks * (rtems_rfs_fs_block_size (fs) / RTEMS_RFS_INODE_SIZE);
e960: e1a00005 mov r0, r5
e964: ebffcbf5 bl 1940 <__aeabi_uidiv>
e968: e0000097 mul r0, r7, r0
* The number of inodes per group is set as a percentage.
*/
if (config->inode_overhead)
inode_overhead = config->inode_overhead;
fs->group_inodes = rtems_rfs_inodes_from_percent (fs, inode_overhead);
e96c: e58d003c str r0, [sp, #60] ; 0x3c
}
/*
* Round up to fill a block because the minimum allocation unit is a block.
*/
fs->inodes_per_block = rtems_rfs_fs_block_size (fs) / RTEMS_RFS_INODE_SIZE;
e970: e1a00005 mov r0, r5
e974: e3a01038 mov r1, #56 ; 0x38
e978: ebffcbf0 bl 1940 <__aeabi_uidiv>
e97c: e1a05000 mov r5, r0
e980: e58d0040 str r0, [sp, #64] ; 0x40
fs->group_inodes =
rtems_rfs_rup_quotient (fs->group_inodes,
e984: e1a01005 mov r1, r5
e988: e59d003c ldr r0, [sp, #60] ; 0x3c
e98c: ebffff58 bl e6f4 <rtems_rfs_rup_quotient>
fs->inodes_per_block) * fs->inodes_per_block;
e990: e0000095 mul r0, r5, r0
if (fs->group_inodes > rtems_rfs_bitmap_numof_bits (fs->block_size))
fs->group_inodes = rtems_rfs_bitmap_numof_bits (fs->block_size);
fs->max_name_length = config->max_name_length;
e994: e5943010 ldr r3, [r4, #16]
fs->group_inodes =
rtems_rfs_rup_quotient (fs->group_inodes,
fs->inodes_per_block) * fs->inodes_per_block;
if (fs->group_inodes > rtems_rfs_bitmap_numof_bits (fs->block_size))
fs->group_inodes = rtems_rfs_bitmap_numof_bits (fs->block_size);
e998: e1560000 cmp r6, r0
e99c: 958d603c strls r6, [sp, #60] ; 0x3c
e9a0: 858d003c strhi r0, [sp, #60] ; 0x3c
fs->max_name_length = config->max_name_length;
if (!fs->max_name_length)
e9a4: e3530000 cmp r3, #0
fs->inodes_per_block) * fs->inodes_per_block;
if (fs->group_inodes > rtems_rfs_bitmap_numof_bits (fs->block_size))
fs->group_inodes = rtems_rfs_bitmap_numof_bits (fs->block_size);
fs->max_name_length = config->max_name_length;
e9a8: e58d302c str r3, [sp, #44] ; 0x2c
if (!fs->max_name_length)
{
fs->max_name_length = 512;
e9ac: 03a03c02 moveq r3, #512 ; 0x200
e9b0: 058d302c streq r3, [sp, #44] ; 0x2c
* Check the configuration data.
*/
if (!rtems_rfs_check_config (&fs, config))
return -1;
if (config->verbose)
e9b4: e5d43015 ldrb r3, [r4, #21]
e9b8: e3530000 cmp r3, #0
e9bc: 0a00003a beq eaac <rtems_rfs_format+0x34c>
{
printf ("rtems-rfs: format: media size = %" PRIu64 "\n",
e9c0: e28d0010 add r0, sp, #16 <== NOT EXECUTED
e9c4: eb00309b bl 1ac38 <rtems_rfs_fs_media_size> <== NOT EXECUTED
e9c8: e1a02001 mov r2, r1 <== NOT EXECUTED
e9cc: e1a01000 mov r1, r0 <== NOT EXECUTED
e9d0: e59f0870 ldr r0, [pc, #2160] ; f248 <rtems_rfs_format+0xae8><== NOT EXECUTED
e9d4: eb004014 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_fs_media_size (&fs));
printf ("rtems-rfs: format: media blocks = %" PRIu32 "\n",
e9d8: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED
e9dc: e59f0868 ldr r0, [pc, #2152] ; f24c <rtems_rfs_format+0xaec><== NOT EXECUTED
e9e0: e593101c ldr r1, [r3, #28] <== NOT EXECUTED
e9e4: eb004010 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_fs_media_blocks (&fs));
printf ("rtems-rfs: format: media block size = %" PRIu32 "\n",
e9e8: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED
e9ec: e59f085c ldr r0, [pc, #2140] ; f250 <rtems_rfs_format+0xaf0><== NOT EXECUTED
e9f0: e5931020 ldr r1, [r3, #32] <== NOT EXECUTED
e9f4: eb00400c bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_fs_media_block_size (&fs));
printf ("rtems-rfs: format: size = %" PRIu64 "\n",
e9f8: e28d0010 add r0, sp, #16 <== NOT EXECUTED
e9fc: eb003089 bl 1ac28 <rtems_rfs_fs_size> <== NOT EXECUTED
ea00: e1a02001 mov r2, r1 <== NOT EXECUTED
ea04: e1a01000 mov r1, r0 <== NOT EXECUTED
ea08: e59f0844 ldr r0, [pc, #2116] ; f254 <rtems_rfs_format+0xaf4><== NOT EXECUTED
ea0c: eb004006 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_fs_size (&fs));
printf ("rtems-rfs: format: blocks = %zu\n",
ea10: e59d1014 ldr r1, [sp, #20] <== NOT EXECUTED
ea14: e59f083c ldr r0, [pc, #2108] ; f258 <rtems_rfs_format+0xaf8><== NOT EXECUTED
ea18: eb004003 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_fs_blocks (&fs));
printf ("rtems-rfs: format: block size = %zu\n",
ea1c: e59d1018 ldr r1, [sp, #24] <== NOT EXECUTED
ea20: e59f0834 ldr r0, [pc, #2100] ; f25c <rtems_rfs_format+0xafc><== NOT EXECUTED
ea24: eb004000 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_fs_block_size (&fs));
printf ("rtems-rfs: format: bits per block = %u\n",
ea28: e59d1018 ldr r1, [sp, #24] <== NOT EXECUTED
ea2c: e59f082c ldr r0, [pc, #2092] ; f260 <rtems_rfs_format+0xb00><== NOT EXECUTED
ea30: e1a01181 lsl r1, r1, #3 <== NOT EXECUTED
ea34: eb003ffc bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_bits_per_block (&fs));
printf ("rtems-rfs: format: inode size = %zu\n", RTEMS_RFS_INODE_SIZE);
ea38: e3a01038 mov r1, #56 ; 0x38 <== NOT EXECUTED
ea3c: e59f0820 ldr r0, [pc, #2080] ; f264 <rtems_rfs_format+0xb04><== NOT EXECUTED
ea40: eb003ff9 bl 1ea2c <printf> <== NOT EXECUTED
printf ("rtems-rfs: format: inodes = %zu (%d.%d%%)\n",
ea44: e59d3034 ldr r3, [sp, #52] ; 0x34 <== NOT EXECUTED
ea48: e59d603c ldr r6, [sp, #60] ; 0x3c <== NOT EXECUTED
fs.group_inodes * fs.group_count,
rtems_rfs_inode_overhead (&fs) / 10,
ea4c: e28d0010 add r0, sp, #16 <== NOT EXECUTED
printf ("rtems-rfs: format: block size = %zu\n",
rtems_rfs_fs_block_size (&fs));
printf ("rtems-rfs: format: bits per block = %u\n",
rtems_rfs_bits_per_block (&fs));
printf ("rtems-rfs: format: inode size = %zu\n", RTEMS_RFS_INODE_SIZE);
printf ("rtems-rfs: format: inodes = %zu (%d.%d%%)\n",
ea50: e0060693 mul r6, r3, r6 <== NOT EXECUTED
fs.group_inodes * fs.group_count,
rtems_rfs_inode_overhead (&fs) / 10,
ea54: ebffff2f bl e718 <rtems_rfs_inode_overhead> <== NOT EXECUTED
printf ("rtems-rfs: format: block size = %zu\n",
rtems_rfs_fs_block_size (&fs));
printf ("rtems-rfs: format: bits per block = %u\n",
rtems_rfs_bits_per_block (&fs));
printf ("rtems-rfs: format: inode size = %zu\n", RTEMS_RFS_INODE_SIZE);
printf ("rtems-rfs: format: inodes = %zu (%d.%d%%)\n",
ea58: e3a0100a mov r1, #10 <== NOT EXECUTED
fs.group_inodes * fs.group_count,
rtems_rfs_inode_overhead (&fs) / 10,
ea5c: e1a07000 mov r7, r0 <== NOT EXECUTED
printf ("rtems-rfs: format: block size = %zu\n",
rtems_rfs_fs_block_size (&fs));
printf ("rtems-rfs: format: bits per block = %u\n",
rtems_rfs_bits_per_block (&fs));
printf ("rtems-rfs: format: inode size = %zu\n", RTEMS_RFS_INODE_SIZE);
printf ("rtems-rfs: format: inodes = %zu (%d.%d%%)\n",
ea60: eb007112 bl 2aeb0 <__aeabi_idiv> <== NOT EXECUTED
ea64: e3a0100a mov r1, #10 <== NOT EXECUTED
ea68: e1a05000 mov r5, r0 <== NOT EXECUTED
ea6c: e1a00007 mov r0, r7 <== NOT EXECUTED
ea70: eb007193 bl 2b0c4 <__modsi3> <== NOT EXECUTED
ea74: e1a02005 mov r2, r5 <== NOT EXECUTED
ea78: e1a03000 mov r3, r0 <== NOT EXECUTED
ea7c: e1a01006 mov r1, r6 <== NOT EXECUTED
ea80: e59f07e0 ldr r0, [pc, #2016] ; f268 <rtems_rfs_format+0xb08><== NOT EXECUTED
ea84: eb003fe8 bl 1ea2c <printf> <== NOT EXECUTED
fs.group_inodes * fs.group_count,
rtems_rfs_inode_overhead (&fs) / 10,
rtems_rfs_inode_overhead (&fs) % 10);
printf ("rtems-rfs: format: groups = %u\n", fs.group_count);
ea88: e59d1034 ldr r1, [sp, #52] ; 0x34 <== NOT EXECUTED
ea8c: e59f07d8 ldr r0, [pc, #2008] ; f26c <rtems_rfs_format+0xb0c><== NOT EXECUTED
ea90: eb003fe5 bl 1ea2c <printf> <== NOT EXECUTED
printf ("rtems-rfs: format: group blocks = %zu\n", fs.group_blocks);
ea94: e59d1038 ldr r1, [sp, #56] ; 0x38 <== NOT EXECUTED
ea98: e59f07d0 ldr r0, [pc, #2000] ; f270 <rtems_rfs_format+0xb10><== NOT EXECUTED
ea9c: eb003fe2 bl 1ea2c <printf> <== NOT EXECUTED
printf ("rtems-rfs: format: group inodes = %zu\n", fs.group_inodes);
eaa0: e59f07cc ldr r0, [pc, #1996] ; f274 <rtems_rfs_format+0xb14><== NOT EXECUTED
eaa4: e59d103c ldr r1, [sp, #60] ; 0x3c <== NOT EXECUTED
eaa8: eb003fdf bl 1ea2c <printf> <== NOT EXECUTED
}
rc = rtems_rfs_buffer_setblksize (&fs, rtems_rfs_fs_block_size (&fs));
eaac: e28d7010 add r7, sp, #16
eab0: e1a00007 mov r0, r7
eab4: e59d1018 ldr r1, [sp, #24]
eab8: eb002856 bl 18c18 <rtems_rfs_buffer_setblksize>
if (rc > 0)
eabc: e2505000 subs r5, r0, #0
eac0: da000003 ble ead4 <rtems_rfs_format+0x374>
{
printf ("rtems-rfs: format: setting block size failed: %d: %s\n",
eac4: eb004486 bl 1fce4 <strerror> <== NOT EXECUTED
eac8: e1a02000 mov r2, r0 <== NOT EXECUTED
eacc: e59f07a4 ldr r0, [pc, #1956] ; f278 <rtems_rfs_format+0xb18><== NOT EXECUTED
ead0: ea0001cd b f20c <rtems_rfs_format+0xaac> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
ead4: e3a05000 mov r5, #0
printf ("rtems-rfs: write-superblock: handle open failed: %d: %s\n",
rc, strerror (rc));
return false;
}
rc = rtems_rfs_buffer_handle_request (fs, &handle, 0, false);
ead8: e28d60d4 add r6, sp, #212 ; 0xd4
eadc: e1a00007 mov r0, r7
eae0: e1a01006 mov r1, r6
eae4: e1a02005 mov r2, r5
eae8: e1a03005 mov r3, r5
eaec: e5cd50d4 strb r5, [sp, #212] ; 0xd4
handle->bnum = 0;
eaf0: e58d50d8 str r5, [sp, #216] ; 0xd8
handle->buffer = NULL;
eaf4: e58d50dc str r5, [sp, #220] ; 0xdc
eaf8: eb00271b bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
eafc: e2508000 subs r8, r0, #0
eb00: da000007 ble eb24 <rtems_rfs_format+0x3c4>
{
rtems_rfs_buffer_handle_close (fs, &handle);
eb04: e1a01006 mov r1, r6 <== NOT EXECUTED
eb08: e1a00007 mov r0, r7 <== NOT EXECUTED
eb0c: ebfffef0 bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("rtems-rfs: write-superblock: request failed: %d: %s\n",
eb10: e1a00008 mov r0, r8 <== NOT EXECUTED
eb14: eb004472 bl 1fce4 <strerror> <== NOT EXECUTED
eb18: e1a02000 mov r2, r0 <== NOT EXECUTED
eb1c: e59f0758 ldr r0, [pc, #1880] ; f27c <rtems_rfs_format+0xb1c><== NOT EXECUTED
eb20: ea000068 b ecc8 <rtems_rfs_format+0x568> <== NOT EXECUTED
rc, strerror (rc));
return false;
}
sb = rtems_rfs_buffer_data (&handle);
eb24: e59d30dc ldr r3, [sp, #220] ; 0xdc
eb28: e593801c ldr r8, [r3, #28]
#define write_sb(_o, _d) rtems_rfs_write_u32(sb + (_o), _d)
memset (sb, 0xff, rtems_rfs_fs_block_size (fs));
eb2c: e3a010ff mov r1, #255 ; 0xff
eb30: e1a00008 mov r0, r8
eb34: e59d2018 ldr r2, [sp, #24]
eb38: eb003f4a bl 1e868 <memset>
write_sb (RTEMS_RFS_SB_OFFSET_MAGIC, RTEMS_RFS_SB_MAGIC);
eb3c: e3a03028 mov r3, #40 ; 0x28
eb40: e5c83000 strb r3, [r8]
eb44: e3a03009 mov r3, #9
eb48: e5c83001 strb r3, [r8, #1]
eb4c: e3a02001 mov r2, #1
eb50: e3a03020 mov r3, #32
eb54: e5c82003 strb r2, [r8, #3]
eb58: e5c83002 strb r3, [r8, #2]
write_sb (RTEMS_RFS_SB_OFFSET_VERSION, RTEMS_RFS_VERSION);
eb5c: e5c85004 strb r5, [r8, #4]
eb60: e5c85005 strb r5, [r8, #5]
eb64: e5c85006 strb r5, [r8, #6]
eb68: e5c85007 strb r5, [r8, #7]
write_sb (RTEMS_RFS_SB_OFFSET_BLOCKS, rtems_rfs_fs_blocks (fs));
eb6c: e59d3014 ldr r3, [sp, #20]
eb70: e1a01c23 lsr r1, r3, #24
eb74: e5c8100c strb r1, [r8, #12]
eb78: e1a01823 lsr r1, r3, #16
eb7c: e5c8100d strb r1, [r8, #13]
eb80: e1a01423 lsr r1, r3, #8
eb84: e5c8100e strb r1, [r8, #14]
eb88: e5c8300f strb r3, [r8, #15]
write_sb (RTEMS_RFS_SB_OFFSET_BLOCK_SIZE, rtems_rfs_fs_block_size (fs));
eb8c: e5dd301b ldrb r3, [sp, #27]
eb90: e5c83008 strb r3, [r8, #8]
eb94: e1dd31ba ldrh r3, [sp, #26]
eb98: e5c83009 strb r3, [r8, #9]
eb9c: e59d3018 ldr r3, [sp, #24]
eba0: e1a03423 lsr r3, r3, #8
eba4: e5c8300a strb r3, [r8, #10]
eba8: e59d3018 ldr r3, [sp, #24]
ebac: e5c8300b strb r3, [r8, #11]
write_sb (RTEMS_RFS_SB_OFFSET_BAD_BLOCKS, fs->bad_blocks);
ebb0: e5dd302b ldrb r3, [sp, #43] ; 0x2b
ebb4: e5c83010 strb r3, [r8, #16]
ebb8: e1dd32ba ldrh r3, [sp, #42] ; 0x2a
ebbc: e5c83011 strb r3, [r8, #17]
ebc0: e59d3028 ldr r3, [sp, #40] ; 0x28
ebc4: e1a03423 lsr r3, r3, #8
ebc8: e5c83012 strb r3, [r8, #18]
ebcc: e59d3028 ldr r3, [sp, #40] ; 0x28
ebd0: e5c83013 strb r3, [r8, #19]
write_sb (RTEMS_RFS_SB_OFFSET_MAX_NAME_LENGTH, fs->max_name_length);
ebd4: e5dd302f ldrb r3, [sp, #47] ; 0x2f
ebd8: e5c83014 strb r3, [r8, #20]
ebdc: e1dd32be ldrh r3, [sp, #46] ; 0x2e
ebe0: e5c83015 strb r3, [r8, #21]
ebe4: e59d302c ldr r3, [sp, #44] ; 0x2c
ebe8: e1a03423 lsr r3, r3, #8
ebec: e5c83016 strb r3, [r8, #22]
ebf0: e59d302c ldr r3, [sp, #44] ; 0x2c
ebf4: e5c83017 strb r3, [r8, #23]
write_sb (RTEMS_RFS_SB_OFFSET_GROUPS, fs->group_count);
ebf8: e5dd3037 ldrb r3, [sp, #55] ; 0x37
ebfc: e5c83018 strb r3, [r8, #24]
ec00: e1dd33b6 ldrh r3, [sp, #54] ; 0x36
ec04: e5c83019 strb r3, [r8, #25]
ec08: e59d3034 ldr r3, [sp, #52] ; 0x34
ec0c: e1a03423 lsr r3, r3, #8
ec10: e5c8301a strb r3, [r8, #26]
ec14: e59d3034 ldr r3, [sp, #52] ; 0x34
ec18: e5c8301b strb r3, [r8, #27]
write_sb (RTEMS_RFS_SB_OFFSET_GROUP_BLOCKS, fs->group_blocks);
ec1c: e5dd303b ldrb r3, [sp, #59] ; 0x3b
ec20: e5c8301c strb r3, [r8, #28]
ec24: e1dd33ba ldrh r3, [sp, #58] ; 0x3a
ec28: e5c8301d strb r3, [r8, #29]
ec2c: e59d3038 ldr r3, [sp, #56] ; 0x38
ec30: e1a03423 lsr r3, r3, #8
ec34: e5c8301e strb r3, [r8, #30]
ec38: e59d3038 ldr r3, [sp, #56] ; 0x38
ec3c: e5c8301f strb r3, [r8, #31]
write_sb (RTEMS_RFS_SB_OFFSET_GROUP_INODES, fs->group_inodes);
ec40: e5dd303f ldrb r3, [sp, #63] ; 0x3f
ec44: e5c83020 strb r3, [r8, #32]
ec48: e1dd33be ldrh r3, [sp, #62] ; 0x3e
ec4c: e5c83021 strb r3, [r8, #33] ; 0x21
ec50: e59d303c ldr r3, [sp, #60] ; 0x3c
ec54: e1a03423 lsr r3, r3, #8
ec58: e5c83022 strb r3, [r8, #34] ; 0x22
ec5c: e59d303c ldr r3, [sp, #60] ; 0x3c
ec60: e5c83023 strb r3, [r8, #35] ; 0x23
write_sb (RTEMS_RFS_SB_OFFSET_INODE_SIZE, RTEMS_RFS_INODE_SIZE);
ec64: e3a03038 mov r3, #56 ; 0x38
ec68: e5c85024 strb r5, [r8, #36] ; 0x24
ec6c: e5c85025 strb r5, [r8, #37] ; 0x25
ec70: e5c85026 strb r5, [r8, #38] ; 0x26
ec74: e5c83027 strb r3, [r8, #39] ; 0x27
rtems_rfs_buffer_mark_dirty (&handle);
rc = rtems_rfs_buffer_handle_release (fs, &handle);
ec78: e1a01006 mov r1, r6
ec7c: e1a00007 mov r0, r7
write_sb (RTEMS_RFS_SB_OFFSET_GROUPS, fs->group_count);
write_sb (RTEMS_RFS_SB_OFFSET_GROUP_BLOCKS, fs->group_blocks);
write_sb (RTEMS_RFS_SB_OFFSET_GROUP_INODES, fs->group_inodes);
write_sb (RTEMS_RFS_SB_OFFSET_INODE_SIZE, RTEMS_RFS_INODE_SIZE);
rtems_rfs_buffer_mark_dirty (&handle);
ec80: e5cd20d4 strb r2, [sp, #212] ; 0xd4
rc = rtems_rfs_buffer_handle_release (fs, &handle);
ec84: eb00264c bl 185bc <rtems_rfs_buffer_handle_release>
if (rc > 0)
ec88: e2508000 subs r8, r0, #0
{
rtems_rfs_buffer_handle_close (fs, &handle);
ec8c: e1a01006 mov r1, r6
ec90: e1a00007 mov r0, r7
write_sb (RTEMS_RFS_SB_OFFSET_INODE_SIZE, RTEMS_RFS_INODE_SIZE);
rtems_rfs_buffer_mark_dirty (&handle);
rc = rtems_rfs_buffer_handle_release (fs, &handle);
if (rc > 0)
ec94: da000005 ble ecb0 <rtems_rfs_format+0x550>
{
rtems_rfs_buffer_handle_close (fs, &handle);
ec98: ebfffe8d bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("rtems-rfs: write-superblock: buffer release failed: %d: %s\n",
ec9c: e1a00008 mov r0, r8 <== NOT EXECUTED
eca0: eb00440f bl 1fce4 <strerror> <== NOT EXECUTED
eca4: e1a02000 mov r2, r0 <== NOT EXECUTED
eca8: e59f05d0 ldr r0, [pc, #1488] ; f280 <rtems_rfs_format+0xb20><== NOT EXECUTED
ecac: ea000005 b ecc8 <rtems_rfs_format+0x568> <== NOT EXECUTED
rc, strerror (rc));
return false;
}
rc = rtems_rfs_buffer_handle_close (fs, &handle);
ecb0: ebfffe87 bl e6d4 <rtems_rfs_buffer_handle_close>
if (rc > 0)
ecb4: e2508000 subs r8, r0, #0
ecb8: da0000d1 ble f004 <rtems_rfs_format+0x8a4>
{
printf ("rtems-rfs: write-superblock: buffer handle close failed: %d: %s\n",
ecbc: eb004408 bl 1fce4 <strerror> <== NOT EXECUTED
ecc0: e1a02000 mov r2, r0 <== NOT EXECUTED
ecc4: e59f05b8 ldr r0, [pc, #1464] ; f284 <rtems_rfs_format+0xb24><== NOT EXECUTED
ecc8: e1a01008 mov r1, r8 <== NOT EXECUTED
eccc: eb003f56 bl 1ea2c <printf> <== NOT EXECUTED
return -1;
}
if (!rtems_rfs_write_superblock (&fs))
{
printf ("rtems-rfs: format: superblock write failed\n");
ecd0: e59f05b0 ldr r0, [pc, #1456] ; f288 <rtems_rfs_format+0xb28><== NOT EXECUTED
ecd4: eb003fec bl 1ec8c <puts> <== NOT EXECUTED
ecd8: ea00014d b f214 <rtems_rfs_format+0xab4> <== NOT EXECUTED
size_t group_size;
int blocks;
int b;
int rc;
group_base = rtems_rfs_fs_block (fs, group, 0);
ecdc: e59d4038 ldr r4, [sp, #56] ; 0x38
ece0: e00a0594 mul sl, r4, r5
if (group_base > rtems_rfs_fs_blocks (fs))
ece4: e59d3014 ldr r3, [sp, #20]
return -1;
}
for (group = 0; group < fs.group_count; group++)
if (!rtems_rfs_write_group (&fs, group,
config->initialise_inodes, config->verbose))
ece8: e5db2014 ldrb r2, [fp, #20]
size_t group_size;
int blocks;
int b;
int rc;
group_base = rtems_rfs_fs_block (fs, group, 0);
ecec: e28a8001 add r8, sl, #1
if (group_base > rtems_rfs_fs_blocks (fs))
ecf0: e1580003 cmp r8, r3
return -1;
}
for (group = 0; group < fs.group_count; group++)
if (!rtems_rfs_write_group (&fs, group,
config->initialise_inodes, config->verbose))
ecf4: e58d200c str r2, [sp, #12]
int b;
int rc;
group_base = rtems_rfs_fs_block (fs, group, 0);
if (group_base > rtems_rfs_fs_blocks (fs))
ecf8: 9a000003 bls ed0c <rtems_rfs_format+0x5ac>
{
printf ("rtems-rfs: write-group: group %d base beyond disk limit\n",
ecfc: e59f0588 ldr r0, [pc, #1416] ; f28c <rtems_rfs_format+0xb2c><== NOT EXECUTED
ed00: e1a01005 mov r1, r5 <== NOT EXECUTED
ed04: eb003f48 bl 1ea2c <printf> <== NOT EXECUTED
ed08: ea000141 b f214 <rtems_rfs_format+0xab4> <== NOT EXECUTED
/*
* Be nice to strange sizes of disks. These are embedded systems after all
* and nice numbers do not always work out. Let the last block pick up the
* remainder of the blocks.
*/
if ((group_base + group_size) > rtems_rfs_fs_blocks (fs))
ed0c: e0882004 add r2, r8, r4
ed10: e1520003 cmp r2, r3
group_size = rtems_rfs_fs_blocks (fs) - group_base;
ed14: 80684003 rsbhi r4, r8, r3
if (verbose)
ed18: e3590000 cmp r9, #0
printf ("\rrtems-rfs: format: group %3d: base = %" PRId32 ", size = %zd",
ed1c: 159f056c ldrne r0, [pc, #1388] ; f290 <rtems_rfs_format+0xb30>
ed20: 11a01005 movne r1, r5
ed24: 11a02008 movne r2, r8
ed28: 11a03004 movne r3, r4
ed2c: 1b003f3e blne 1ea2c <printf>
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
ed30: e3a03000 mov r3, #0
printf ("\nrtems-rfs: write-group: handle open failed: %d: %s\n",
rc, strerror (rc));
return false;
}
if (verbose)
ed34: e1590003 cmp r9, r3
ed38: e5cd30d4 strb r3, [sp, #212] ; 0xd4
handle->bnum = 0;
ed3c: e58d30d8 str r3, [sp, #216] ; 0xd8
handle->buffer = NULL;
ed40: e58d30dc str r3, [sp, #220] ; 0xdc
printf (", blocks");
ed44: 159f0548 ldrne r0, [pc, #1352] ; f294 <rtems_rfs_format+0xb34>
ed48: 1b003f37 blne 1ea2c <printf>
/*
* Open the block bitmap using the new buffer.
*/
rc = rtems_rfs_bitmap_open (&bitmap, fs, &handle, group_size,
ed4c: e28d00bc add r0, sp, #188 ; 0xbc
ed50: e1a01007 mov r1, r7
ed54: e1a02006 mov r2, r6
ed58: e1a03004 mov r3, r4
ed5c: e58d8000 str r8, [sp]
ed60: eb0021d2 bl 174b0 <rtems_rfs_bitmap_open>
group_base + RTEMS_RFS_GROUP_BLOCK_BITMAP_BLOCK);
if (rc > 0)
ed64: e3500000 cmp r0, #0
ed68: da000008 ble ed90 <rtems_rfs_format+0x630>
ed6c: e1a0a000 mov sl, r0 <== NOT EXECUTED
{
rtems_rfs_buffer_handle_close (fs, &handle);
ed70: e1a01006 mov r1, r6 <== NOT EXECUTED
ed74: e1a00007 mov r0, r7 <== NOT EXECUTED
ed78: ebfffe55 bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("\nrtems-rfs: write-group: group %3d: open block bitmap failed: %d: %s\n",
ed7c: e1a0000a mov r0, sl <== NOT EXECUTED
ed80: eb0043d7 bl 1fce4 <strerror> <== NOT EXECUTED
ed84: e1a03000 mov r3, r0 <== NOT EXECUTED
ed88: e59f0508 ldr r0, [pc, #1288] ; f298 <rtems_rfs_format+0xb38><== NOT EXECUTED
ed8c: ea000012 b eddc <rtems_rfs_format+0x67c> <== NOT EXECUTED
/*
* Force the whole buffer to a known state. The bit map may not occupy the
* whole block.
*/
memset (rtems_rfs_buffer_data (&handle), 0xff, rtems_rfs_fs_block_size (fs));
ed90: e59d30dc ldr r3, [sp, #220] ; 0xdc
ed94: e3a010ff mov r1, #255 ; 0xff
ed98: e593001c ldr r0, [r3, #28]
ed9c: e59d2018 ldr r2, [sp, #24]
eda0: eb003eb0 bl 1e868 <memset>
/*
* Clear the bitmap.
*/
rc = rtems_rfs_bitmap_map_clear_all (&bitmap);
eda4: e28d00bc add r0, sp, #188 ; 0xbc
eda8: eb002136 bl 17288 <rtems_rfs_bitmap_map_clear_all>
if (rc > 0)
edac: e3500000 cmp r0, #0
edb0: da00000d ble edec <rtems_rfs_format+0x68c>
edb4: e1a0a000 mov sl, r0 <== NOT EXECUTED
{
rtems_rfs_bitmap_close (&bitmap);
edb8: e28d00bc add r0, sp, #188 ; 0xbc <== NOT EXECUTED
edbc: eb0021cf bl 17500 <rtems_rfs_bitmap_close> <== NOT EXECUTED
rtems_rfs_buffer_handle_close (fs, &handle);
edc0: e1a01006 mov r1, r6 <== NOT EXECUTED
edc4: e1a00007 mov r0, r7 <== NOT EXECUTED
edc8: ebfffe41 bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("\nrtems-rfs: write-group: group %3d: block bitmap clear all failed: %d: %s\n",
edcc: e1a0000a mov r0, sl <== NOT EXECUTED
edd0: eb0043c3 bl 1fce4 <strerror> <== NOT EXECUTED
edd4: e1a03000 mov r3, r0 <== NOT EXECUTED
edd8: e59f04bc ldr r0, [pc, #1212] ; f29c <rtems_rfs_format+0xb3c><== NOT EXECUTED
eddc: e1a01005 mov r1, r5 <== NOT EXECUTED
ede0: e1a0200a mov r2, sl <== NOT EXECUTED
ede4: eb003f10 bl 1ea2c <printf> <== NOT EXECUTED
ede8: ea000109 b f214 <rtems_rfs_format+0xab4> <== NOT EXECUTED
}
/*
* Forced allocation of the block bitmap.
*/
rtems_rfs_bitmap_map_set (&bitmap, RTEMS_RFS_GROUP_BLOCK_BITMAP_BLOCK);
edec: e3a01000 mov r1, #0
edf0: e28d00bc add r0, sp, #188 ; 0xbc
edf4: eb0020ab bl 170a8 <rtems_rfs_bitmap_map_set>
/*
* Forced allocation of the inode bitmap.
*/
rtems_rfs_bitmap_map_set (&bitmap, RTEMS_RFS_GROUP_INODE_BITMAP_BLOCK);
edf8: e3a01001 mov r1, #1
edfc: e28d00bc add r0, sp, #188 ; 0xbc
ee00: eb0020a8 bl 170a8 <rtems_rfs_bitmap_map_set>
/*
* Determine the number of inodes blocks in the group.
*/
blocks = rtems_rfs_rup_quotient (fs->group_inodes, fs->inodes_per_block);
ee04: e28d003c add r0, sp, #60 ; 0x3c
ee08: e8900003 ldm r0, {r0, r1}
ee0c: ebfffe38 bl e6f4 <rtems_rfs_rup_quotient>
/*
* Forced allocation of the inode blocks which follow the block bitmap.
*/
for (b = 0; b < blocks; b++)
ee10: e3a08000 mov r8, #0
rtems_rfs_bitmap_map_set (&bitmap, RTEMS_RFS_GROUP_INODE_BITMAP_BLOCK);
/*
* Determine the number of inodes blocks in the group.
*/
blocks = rtems_rfs_rup_quotient (fs->group_inodes, fs->inodes_per_block);
ee14: e58d0008 str r0, [sp, #8]
ee18: ea000002 b ee28 <rtems_rfs_format+0x6c8>
/*
* Forced allocation of the inode blocks which follow the block bitmap.
*/
for (b = 0; b < blocks; b++)
rtems_rfs_bitmap_map_set (&bitmap, b + RTEMS_RFS_GROUP_INODE_BLOCK);
ee1c: e2881002 add r1, r8, #2
ee20: eb0020a0 bl 170a8 <rtems_rfs_bitmap_map_set>
blocks = rtems_rfs_rup_quotient (fs->group_inodes, fs->inodes_per_block);
/*
* Forced allocation of the inode blocks which follow the block bitmap.
*/
for (b = 0; b < blocks; b++)
ee24: e2888001 add r8, r8, #1
ee28: e59d3008 ldr r3, [sp, #8]
ee2c: e1580003 cmp r8, r3
rtems_rfs_bitmap_map_set (&bitmap, b + RTEMS_RFS_GROUP_INODE_BLOCK);
ee30: e28d00bc add r0, sp, #188 ; 0xbc
blocks = rtems_rfs_rup_quotient (fs->group_inodes, fs->inodes_per_block);
/*
* Forced allocation of the inode blocks which follow the block bitmap.
*/
for (b = 0; b < blocks; b++)
ee34: bafffff8 blt ee1c <rtems_rfs_format+0x6bc>
rtems_rfs_bitmap_map_set (&bitmap, b + RTEMS_RFS_GROUP_INODE_BLOCK);
/*
* Close the block bitmap.
*/
rc = rtems_rfs_bitmap_close (&bitmap);
ee38: eb0021b0 bl 17500 <rtems_rfs_bitmap_close>
if (rc > 0)
ee3c: e3500000 cmp r0, #0
ee40: da000008 ble ee68 <rtems_rfs_format+0x708>
ee44: e1a0a000 mov sl, r0 <== NOT EXECUTED
{
rtems_rfs_buffer_handle_close (fs, &handle);
ee48: e1a01006 mov r1, r6 <== NOT EXECUTED
ee4c: e1a00007 mov r0, r7 <== NOT EXECUTED
ee50: ebfffe1f bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("\nrtems-rfs: write-group: group %3d: close block bitmap failed: %d: %s\n",
ee54: e1a0000a mov r0, sl <== NOT EXECUTED
ee58: eb0043a1 bl 1fce4 <strerror> <== NOT EXECUTED
ee5c: e1a03000 mov r3, r0 <== NOT EXECUTED
ee60: e59f0438 ldr r0, [pc, #1080] ; f2a0 <rtems_rfs_format+0xb40><== NOT EXECUTED
ee64: eaffffdc b eddc <rtems_rfs_format+0x67c> <== NOT EXECUTED
group, rc, strerror (rc));
return false;
}
rtems_rfs_buffer_mark_dirty (&handle);
ee68: e3a03001 mov r3, #1
if (verbose)
ee6c: e3590000 cmp r9, #0
printf ("\nrtems-rfs: write-group: group %3d: close block bitmap failed: %d: %s\n",
group, rc, strerror (rc));
return false;
}
rtems_rfs_buffer_mark_dirty (&handle);
ee70: e5cd30d4 strb r3, [sp, #212] ; 0xd4
if (verbose)
printf (", inodes");
ee74: 159f0428 ldrne r0, [pc, #1064] ; f2a4 <rtems_rfs_format+0xb44>
ee78: 1b003eeb blne 1ea2c <printf>
/*
* Open the inode bitmap using the old buffer. Should release any changes.
*/
rc = rtems_rfs_bitmap_open (&bitmap, fs, &handle, group_size,
ee7c: e28a3002 add r3, sl, #2
ee80: e58d3000 str r3, [sp]
ee84: e28d00bc add r0, sp, #188 ; 0xbc
ee88: e1a01007 mov r1, r7
ee8c: e1a02006 mov r2, r6
ee90: e1a03004 mov r3, r4
ee94: eb002185 bl 174b0 <rtems_rfs_bitmap_open>
group_base + RTEMS_RFS_GROUP_INODE_BITMAP_BLOCK);
if (rc > 0)
ee98: e2508000 subs r8, r0, #0
ee9c: da000007 ble eec0 <rtems_rfs_format+0x760>
{
rtems_rfs_buffer_handle_close (fs, &handle);
eea0: e1a01006 mov r1, r6 <== NOT EXECUTED
eea4: e1a00007 mov r0, r7 <== NOT EXECUTED
eea8: ebfffe09 bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("\nrtems-rfs: write-group: group %3d: open inode bitmap failed: %d: %s\n",
eeac: e1a00008 mov r0, r8 <== NOT EXECUTED
eeb0: eb00438b bl 1fce4 <strerror> <== NOT EXECUTED
eeb4: e1a03000 mov r3, r0 <== NOT EXECUTED
eeb8: e59f03e8 ldr r0, [pc, #1000] ; f2a8 <rtems_rfs_format+0xb48><== NOT EXECUTED
eebc: ea000011 b ef08 <rtems_rfs_format+0x7a8> <== NOT EXECUTED
/*
* Force the whole buffer to a known state. The bit map may not occupy the
* whole block.
*/
memset (rtems_rfs_buffer_data (&handle), 0x00, rtems_rfs_fs_block_size (fs));
eec0: e59d30dc ldr r3, [sp, #220] ; 0xdc
eec4: e3a01000 mov r1, #0
eec8: e593001c ldr r0, [r3, #28]
eecc: e59d2018 ldr r2, [sp, #24]
eed0: eb003e64 bl 1e868 <memset>
/*
* Clear the inode bitmap.
*/
rc = rtems_rfs_bitmap_map_clear_all (&bitmap);
eed4: e28d00bc add r0, sp, #188 ; 0xbc
eed8: eb0020ea bl 17288 <rtems_rfs_bitmap_map_clear_all>
if (rc > 0)
eedc: e2508000 subs r8, r0, #0
{
rtems_rfs_bitmap_close (&bitmap);
eee0: e28d00bc add r0, sp, #188 ; 0xbc
/*
* Clear the inode bitmap.
*/
rc = rtems_rfs_bitmap_map_clear_all (&bitmap);
if (rc > 0)
eee4: da00000a ble ef14 <rtems_rfs_format+0x7b4>
{
rtems_rfs_bitmap_close (&bitmap);
eee8: eb002184 bl 17500 <rtems_rfs_bitmap_close> <== NOT EXECUTED
rtems_rfs_buffer_handle_close (fs, &handle);
eeec: e1a01006 mov r1, r6 <== NOT EXECUTED
eef0: e1a00007 mov r0, r7 <== NOT EXECUTED
eef4: ebfffdf6 bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("\nrtems-rfs: write-group: group %3d: inode bitmap" \
eef8: e1a00008 mov r0, r8 <== NOT EXECUTED
eefc: eb004378 bl 1fce4 <strerror> <== NOT EXECUTED
ef00: e1a03000 mov r3, r0 <== NOT EXECUTED
ef04: e59f03a0 ldr r0, [pc, #928] ; f2ac <rtems_rfs_format+0xb4c><== NOT EXECUTED
ef08: e1a01005 mov r1, r5 <== NOT EXECUTED
ef0c: e1a02008 mov r2, r8 <== NOT EXECUTED
ef10: eaffffb3 b ede4 <rtems_rfs_format+0x684> <== NOT EXECUTED
}
/*
* Close the inode bitmap.
*/
rc = rtems_rfs_bitmap_close (&bitmap);
ef14: eb002179 bl 17500 <rtems_rfs_bitmap_close>
if (rc > 0)
ef18: e2508000 subs r8, r0, #0
ef1c: da000007 ble ef40 <rtems_rfs_format+0x7e0>
{
rtems_rfs_buffer_handle_close (fs, &handle);
ef20: e1a01006 mov r1, r6 <== NOT EXECUTED
ef24: e1a00007 mov r0, r7 <== NOT EXECUTED
ef28: ebfffde9 bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("\nrtems-rfs: write-group: group %3d: close inode" \
ef2c: e1a00008 mov r0, r8 <== NOT EXECUTED
ef30: eb00436b bl 1fce4 <strerror> <== NOT EXECUTED
ef34: e1a03000 mov r3, r0 <== NOT EXECUTED
ef38: e59f0370 ldr r0, [pc, #880] ; f2b0 <rtems_rfs_format+0xb50><== NOT EXECUTED
ef3c: eafffff1 b ef08 <rtems_rfs_format+0x7a8> <== NOT EXECUTED
rtems_rfs_buffer_mark_dirty (&handle);
/*
* Initialise the inode tables if required to do so.
*/
if (initialise_inodes)
ef40: e59d000c ldr r0, [sp, #12]
printf ("\nrtems-rfs: write-group: group %3d: close inode" \
" bitmap failed: %d: %s\n", group, rc, strerror (rc));
return false;
}
rtems_rfs_buffer_mark_dirty (&handle);
ef44: e3a03001 mov r3, #1
/*
* Initialise the inode tables if required to do so.
*/
if (initialise_inodes)
ef48: e3500000 cmp r0, #0
printf ("\nrtems-rfs: write-group: group %3d: close inode" \
" bitmap failed: %d: %s\n", group, rc, strerror (rc));
return false;
}
rtems_rfs_buffer_mark_dirty (&handle);
ef4c: e5cd30d4 strb r3, [sp, #212] ; 0xd4
/*
* Initialise the inode tables if required to do so.
*/
if (initialise_inodes)
ef50: 13a04000 movne r4, #0
{
for (b = 0; b < blocks; b++)
{
rc = rtems_rfs_buffer_handle_request (fs, &handle,
group_base + b + RTEMS_RFS_GROUP_INODE_BLOCK,
ef54: 128a8003 addne r8, sl, #3
rtems_rfs_buffer_mark_dirty (&handle);
/*
* Initialise the inode tables if required to do so.
*/
if (initialise_inodes)
ef58: 1a00001c bne efd0 <rtems_rfs_format+0x870>
ef5c: ea00001e b efdc <rtems_rfs_format+0x87c>
return rc;
}
int
rtems_rfs_format (const char* name, const rtems_rfs_format_config* config)
ef60: e0889004 add r9, r8, r4 <== NOT EXECUTED
*/
if (initialise_inodes)
{
for (b = 0; b < blocks; b++)
{
rc = rtems_rfs_buffer_handle_request (fs, &handle,
ef64: e1a00007 mov r0, r7 <== NOT EXECUTED
ef68: e1a01006 mov r1, r6 <== NOT EXECUTED
ef6c: e1a02009 mov r2, r9 <== NOT EXECUTED
ef70: e3a03000 mov r3, #0 <== NOT EXECUTED
ef74: eb0025fc bl 1876c <rtems_rfs_buffer_handle_request> <== NOT EXECUTED
group_base + b + RTEMS_RFS_GROUP_INODE_BLOCK,
false);
if (rc > 0)
ef78: e250a000 subs sl, r0, #0 <== NOT EXECUTED
ef7c: da00000b ble efb0 <rtems_rfs_format+0x850> <== NOT EXECUTED
{
rtems_rfs_buffer_handle_close (fs, &handle);
ef80: e1a01006 mov r1, r6 <== NOT EXECUTED
ef84: e1a00007 mov r0, r7 <== NOT EXECUTED
ef88: ebfffdd1 bl e6d4 <rtems_rfs_buffer_handle_close> <== NOT EXECUTED
printf ("\nrtems-rfs: write-group: group %3d: block %" PRId32 " request failed: %d: %s\n",
ef8c: e1a0000a mov r0, sl <== NOT EXECUTED
ef90: eb004353 bl 1fce4 <strerror> <== NOT EXECUTED
ef94: e1a01005 mov r1, r5 <== NOT EXECUTED
ef98: e58d0000 str r0, [sp] <== NOT EXECUTED
ef9c: e1a02009 mov r2, r9 <== NOT EXECUTED
efa0: e1a0300a mov r3, sl <== NOT EXECUTED
efa4: e59f0308 ldr r0, [pc, #776] ; f2b4 <rtems_rfs_format+0xb54><== NOT EXECUTED
efa8: eb003e9f bl 1ea2c <printf> <== NOT EXECUTED
efac: ea000098 b f214 <rtems_rfs_format+0xab4> <== NOT EXECUTED
/*
* Force the whole buffer to a known state. The bit map may not occupy the
* whole block.
*/
memset (rtems_rfs_buffer_data (&handle), 0xff, rtems_rfs_fs_block_size (fs));
efb0: e59d30dc ldr r3, [sp, #220] ; 0xdc <== NOT EXECUTED
efb4: e3a010ff mov r1, #255 ; 0xff <== NOT EXECUTED
efb8: e593001c ldr r0, [r3, #28] <== NOT EXECUTED
efbc: e59d2018 ldr r2, [sp, #24] <== NOT EXECUTED
efc0: eb003e28 bl 1e868 <memset> <== NOT EXECUTED
rtems_rfs_buffer_mark_dirty (&handle);
efc4: e3a03001 mov r3, #1 <== NOT EXECUTED
efc8: e5cd30d4 strb r3, [sp, #212] ; 0xd4 <== NOT EXECUTED
/*
* Initialise the inode tables if required to do so.
*/
if (initialise_inodes)
{
for (b = 0; b < blocks; b++)
efcc: e0844003 add r4, r4, r3 <== NOT EXECUTED
efd0: e59d2008 ldr r2, [sp, #8] <== NOT EXECUTED
efd4: e1540002 cmp r4, r2 <== NOT EXECUTED
efd8: baffffe0 blt ef60 <rtems_rfs_format+0x800> <== NOT EXECUTED
rtems_rfs_buffer_mark_dirty (&handle);
}
}
rc = rtems_rfs_buffer_handle_close (fs, &handle);
efdc: e1a00007 mov r0, r7
efe0: e1a01006 mov r1, r6
efe4: ebfffdba bl e6d4 <rtems_rfs_buffer_handle_close>
if (rc > 0)
efe8: e2508000 subs r8, r0, #0
efec: da00008d ble f228 <rtems_rfs_format+0xac8>
{
printf ("\nrtems-rfs: write-group: buffer handle close failed: %d: %s\n",
eff0: eb00433b bl 1fce4 <strerror> <== NOT EXECUTED
eff4: e1a01008 mov r1, r8 <== NOT EXECUTED
eff8: e1a02000 mov r2, r0 <== NOT EXECUTED
effc: e59f02b4 ldr r0, [pc, #692] ; f2b8 <rtems_rfs_format+0xb58><== NOT EXECUTED
f000: ea000082 b f210 <rtems_rfs_format+0xab0> <== NOT EXECUTED
printf (", blocks");
/*
* Open the block bitmap using the new buffer.
*/
rc = rtems_rfs_bitmap_open (&bitmap, fs, &handle, group_size,
f004: e1a0b004 mov fp, r4
{
printf ("rtems-rfs: format: superblock write failed\n");
return -1;
}
for (group = 0; group < fs.group_count; group++)
f008: e59d3034 ldr r3, [sp, #52] ; 0x34
f00c: e1550003 cmp r5, r3
f010: e5db9015 ldrb r9, [fp, #21]
f014: baffff30 blt ecdc <rtems_rfs_format+0x57c>
if (!rtems_rfs_write_group (&fs, group,
config->initialise_inodes, config->verbose))
return -1;
if (config->verbose)
f018: e3590000 cmp r9, #0
printf ("\n");
f01c: 13a0000a movne r0, #10
f020: 1b003eeb blne 1ebd4 <putchar>
rc = rtems_rfs_buffer_close (&fs);
f024: e28d0010 add r0, sp, #16
f028: eb002731 bl 18cf4 <rtems_rfs_buffer_close>
if (rc > 0)
f02c: e2504000 subs r4, r0, #0
f030: da000004 ble f048 <rtems_rfs_format+0x8e8>
{
printf ("rtems-rfs: format: buffer close failed: %d: %s\n",
f034: eb00432a bl 1fce4 <strerror> <== NOT EXECUTED
f038: e1a01004 mov r1, r4 <== NOT EXECUTED
f03c: e1a02000 mov r2, r0 <== NOT EXECUTED
f040: e59f0274 ldr r0, [pc, #628] ; f2bc <rtems_rfs_format+0xb5c><== NOT EXECUTED
f044: ea000071 b f210 <rtems_rfs_format+0xab0> <== NOT EXECUTED
int rc;
/*
* External API so returns -1.
*/
rc = rtems_rfs_fs_open (name, NULL,
f048: e28d30e0 add r3, sp, #224 ; 0xe0
f04c: e3a01000 mov r1, #0
f050: e58d3000 str r3, [sp]
f054: e59d0004 ldr r0, [sp, #4]
f058: e3a02006 mov r2, #6
f05c: e1a03001 mov r3, r1
f060: eb002ef9 bl 1ac4c <rtems_rfs_fs_open>
RTEMS_RFS_FS_FORCE_OPEN | RTEMS_RFS_FS_NO_LOCAL_CACHE,
0, &fs);
if (rc < 0)
f064: e3500000 cmp r0, #0
f068: aa000007 bge f08c <rtems_rfs_format+0x92c>
{
printf ("rtems-rfs: format: file system open failed: %d: %s\n",
errno, strerror (errno));
f06c: eb003958 bl 1d5d4 <__errno> <== NOT EXECUTED
rc = rtems_rfs_fs_open (name, NULL,
RTEMS_RFS_FS_FORCE_OPEN | RTEMS_RFS_FS_NO_LOCAL_CACHE,
0, &fs);
if (rc < 0)
{
printf ("rtems-rfs: format: file system open failed: %d: %s\n",
f070: e5904000 ldr r4, [r0] <== NOT EXECUTED
errno, strerror (errno));
f074: eb003956 bl 1d5d4 <__errno> <== NOT EXECUTED
rc = rtems_rfs_fs_open (name, NULL,
RTEMS_RFS_FS_FORCE_OPEN | RTEMS_RFS_FS_NO_LOCAL_CACHE,
0, &fs);
if (rc < 0)
{
printf ("rtems-rfs: format: file system open failed: %d: %s\n",
f078: e5900000 ldr r0, [r0] <== NOT EXECUTED
f07c: eb004318 bl 1fce4 <strerror> <== NOT EXECUTED
f080: e1a02000 mov r2, r0 <== NOT EXECUTED
f084: e59f0234 ldr r0, [pc, #564] ; f2c0 <rtems_rfs_format+0xb60><== NOT EXECUTED
f088: ea000057 b f1ec <rtems_rfs_format+0xa8c> <== NOT EXECUTED
errno, strerror (errno));
return -1;
}
rc = rtems_rfs_inode_alloc (fs, RTEMS_RFS_ROOT_INO, &ino);
f08c: e59d00e0 ldr r0, [sp, #224] ; 0xe0
f090: e3a01001 mov r1, #1
f094: e28d20e4 add r2, sp, #228 ; 0xe4
f098: eb000231 bl f964 <rtems_rfs_inode_alloc>
if (rc > 0)
f09c: e2505000 subs r5, r0, #0
f0a0: da000005 ble f0bc <rtems_rfs_format+0x95c>
{
printf ("rtems-rfs: format: inode allocation failed: %d: %s\n",
f0a4: eb00430e bl 1fce4 <strerror> <== NOT EXECUTED
f0a8: e1a01005 mov r1, r5 <== NOT EXECUTED
f0ac: e1a02000 mov r2, r0 <== NOT EXECUTED
f0b0: e59f020c ldr r0, [pc, #524] ; f2c4 <rtems_rfs_format+0xb64><== NOT EXECUTED
f0b4: eb003e5c bl 1ea2c <printf> <== NOT EXECUTED
f0b8: ea000018 b f120 <rtems_rfs_format+0x9c0> <== NOT EXECUTED
rc, strerror (rc));
rtems_rfs_fs_close (fs);
return rc;
}
if (ino != RTEMS_RFS_ROOT_INO)
f0bc: e59d40e4 ldr r4, [sp, #228] ; 0xe4
f0c0: e3540001 cmp r4, #1
f0c4: 0a000005 beq f0e0 <rtems_rfs_format+0x980>
{
printf ("rtems-rfs: format: allocated inode not root ino: %" PRId32 "\n", ino);
f0c8: e1a01004 mov r1, r4 <== NOT EXECUTED
f0cc: e59f01f4 ldr r0, [pc, #500] ; f2c8 <rtems_rfs_format+0xb68><== NOT EXECUTED
f0d0: eb003e55 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_fs_close (fs);
f0d4: e59d00e0 ldr r0, [sp, #224] ; 0xe0 <== NOT EXECUTED
f0d8: eb0030b2 bl 1b3a8 <rtems_rfs_fs_close> <== NOT EXECUTED
f0dc: ea00004e b f21c <rtems_rfs_format+0xabc> <== NOT EXECUTED
return rc;
}
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
f0e0: e59d00e0 ldr r0, [sp, #224] ; 0xe0
f0e4: e1a01004 mov r1, r4
f0e8: e28d2094 add r2, sp, #148 ; 0x94
f0ec: e1a03004 mov r3, r4
f0f0: eb00024f bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
f0f4: e2505000 subs r5, r0, #0
f0f8: da00000b ble f12c <rtems_rfs_format+0x9cc>
{
printf ("rtems-rfs: format: inode open failed: %d: %s\n",
f0fc: eb0042f8 bl 1fce4 <strerror> <== NOT EXECUTED
f100: e1a01005 mov r1, r5 <== NOT EXECUTED
f104: e1a02000 mov r2, r0 <== NOT EXECUTED
f108: e59f01bc ldr r0, [pc, #444] ; f2cc <rtems_rfs_format+0xb6c><== NOT EXECUTED
f10c: eb003e46 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
rtems_rfs_group_bitmap_free (fs, true, ino);
f110: e59d00e0 ldr r0, [sp, #224] ; 0xe0 <== NOT EXECUTED
f114: e1a01004 mov r1, r4 <== NOT EXECUTED
f118: e59d20e4 ldr r2, [sp, #228] ; 0xe4 <== NOT EXECUTED
f11c: eb000183 bl f730 <rtems_rfs_group_bitmap_free> <== NOT EXECUTED
rtems_rfs_fs_close (fs);
f120: e59d00e0 ldr r0, [sp, #224] ; 0xe0 <== NOT EXECUTED
f124: eb00309f bl 1b3a8 <rtems_rfs_fs_close> <== NOT EXECUTED
f128: ea000033 b f1fc <rtems_rfs_format+0xa9c> <== NOT EXECUTED
return rc;
}
rc = rtems_rfs_inode_initialise (&inode, 0,
f12c: e3a01000 mov r1, #0
f130: e28d0094 add r0, sp, #148 ; 0x94
f134: e59f2194 ldr r2, [pc, #404] ; f2d0 <rtems_rfs_format+0xb70>
f138: e1a03001 mov r3, r1
f13c: e58d1000 str r1, [sp]
f140: eb000332 bl fe10 <rtems_rfs_inode_initialise>
(RTEMS_RFS_S_IFDIR | RTEMS_RFS_S_IRWXU |
RTEMS_RFS_S_IXGRP | RTEMS_RFS_S_IXOTH),
0, 0);
if (rc > 0)
f144: e2504000 subs r4, r0, #0
f148: da000004 ble f160 <rtems_rfs_format+0xa00>
printf ("rtems-rfs: format: inode initialise failed: %d: %s\n",
f14c: eb0042e4 bl 1fce4 <strerror> <== NOT EXECUTED
f150: e1a01004 mov r1, r4 <== NOT EXECUTED
f154: e1a02000 mov r2, r0 <== NOT EXECUTED
f158: e59f0174 ldr r0, [pc, #372] ; f2d4 <rtems_rfs_format+0xb74><== NOT EXECUTED
f15c: eb003e32 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
rc = rtems_rfs_dir_add_entry (fs, &inode, ".", 1, ino);
f160: e59d30e4 ldr r3, [sp, #228] ; 0xe4
f164: e59d00e0 ldr r0, [sp, #224] ; 0xe0
f168: e58d3000 str r3, [sp]
f16c: e28d1094 add r1, sp, #148 ; 0x94
f170: e59f2160 ldr r2, [pc, #352] ; f2d8 <rtems_rfs_format+0xb78>
f174: e3a03001 mov r3, #1
f178: eb00283e bl 19278 <rtems_rfs_dir_add_entry>
if (rc > 0)
f17c: e2504000 subs r4, r0, #0
f180: da000004 ble f198 <rtems_rfs_format+0xa38>
printf ("rtems-rfs: format: directory add failed: %d: %s\n",
f184: eb0042d6 bl 1fce4 <strerror> <== NOT EXECUTED
f188: e1a01004 mov r1, r4 <== NOT EXECUTED
f18c: e1a02000 mov r2, r0 <== NOT EXECUTED
f190: e59f0144 ldr r0, [pc, #324] ; f2dc <rtems_rfs_format+0xb7c><== NOT EXECUTED
f194: eb003e24 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
rc = rtems_rfs_inode_close (fs, &inode);
f198: e59d00e0 ldr r0, [sp, #224] ; 0xe0
f19c: e28d1094 add r1, sp, #148 ; 0x94
f1a0: eb000298 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
f1a4: e2504000 subs r4, r0, #0
f1a8: da000004 ble f1c0 <rtems_rfs_format+0xa60>
printf ("rtems-rfs: format: inode close failed: %d: %s\n",
f1ac: eb0042cc bl 1fce4 <strerror> <== NOT EXECUTED
f1b0: e1a01004 mov r1, r4 <== NOT EXECUTED
f1b4: e1a02000 mov r2, r0 <== NOT EXECUTED
f1b8: e59f0120 ldr r0, [pc, #288] ; f2e0 <rtems_rfs_format+0xb80><== NOT EXECUTED
f1bc: eb003e1a bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
rc = rtems_rfs_fs_close (fs);
f1c0: e59d00e0 ldr r0, [sp, #224] ; 0xe0
f1c4: eb003077 bl 1b3a8 <rtems_rfs_fs_close>
if (rc < 0)
f1c8: e2505000 subs r5, r0, #0
f1cc: aa000009 bge f1f8 <rtems_rfs_format+0xa98>
printf ("rtems-rfs: format: file system close failed: %d: %s\n",
errno, strerror (errno));
f1d0: eb0038ff bl 1d5d4 <__errno> <== NOT EXECUTED
printf ("rtems-rfs: format: inode close failed: %d: %s\n",
rc, strerror (rc));
rc = rtems_rfs_fs_close (fs);
if (rc < 0)
printf ("rtems-rfs: format: file system close failed: %d: %s\n",
f1d4: e5904000 ldr r4, [r0] <== NOT EXECUTED
errno, strerror (errno));
f1d8: eb0038fd bl 1d5d4 <__errno> <== NOT EXECUTED
printf ("rtems-rfs: format: inode close failed: %d: %s\n",
rc, strerror (rc));
rc = rtems_rfs_fs_close (fs);
if (rc < 0)
printf ("rtems-rfs: format: file system close failed: %d: %s\n",
f1dc: e5900000 ldr r0, [r0] <== NOT EXECUTED
f1e0: eb0042bf bl 1fce4 <strerror> <== NOT EXECUTED
f1e4: e1a02000 mov r2, r0 <== NOT EXECUTED
f1e8: e59f00f4 ldr r0, [pc, #244] ; f2e4 <rtems_rfs_format+0xb84><== NOT EXECUTED
f1ec: e1a01004 mov r1, r4 <== NOT EXECUTED
f1f0: eb003e0d bl 1ea2c <printf> <== NOT EXECUTED
f1f4: ea000008 b f21c <rtems_rfs_format+0xabc> <== NOT EXECUTED
rc, strerror (rc));
return -1;
}
rc = rtems_rfs_write_root_dir (name);
if (rc > 0)
f1f8: da000007 ble f21c <rtems_rfs_format+0xabc>
{
printf ("rtems-rfs: format: writing root dir failed: %d: %s\n",
f1fc: e1a00005 mov r0, r5 <== NOT EXECUTED
f200: eb0042b7 bl 1fce4 <strerror> <== NOT EXECUTED
f204: e1a02000 mov r2, r0 <== NOT EXECUTED
f208: e59f00d8 ldr r0, [pc, #216] ; f2e8 <rtems_rfs_format+0xb88><== NOT EXECUTED
f20c: e1a01005 mov r1, r5 <== NOT EXECUTED
f210: eb003e05 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
return -1;
f214: e3e00000 mvn r0, #0 <== NOT EXECUTED
f218: ea000000 b f220 <rtems_rfs_format+0xac0> <== NOT EXECUTED
}
return 0;
f21c: e3a00000 mov r0, #0
}
f220: e28dd0e8 add sp, sp, #232 ; 0xe8
f224: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
{
printf ("rtems-rfs: format: superblock write failed\n");
return -1;
}
for (group = 0; group < fs.group_count; group++)
f228: e2855001 add r5, r5, #1
f22c: eaffff75 b f008 <rtems_rfs_format+0x8a8>
0001ac4c <rtems_rfs_fs_open>:
rtems_rfs_fs_open (const char* name,
void* user,
uint32_t flags,
uint32_t max_held_buffers,
rtems_rfs_file_system** fs)
{
1ac4c: e92d4df0 push {r4, r5, r6, r7, r8, sl, fp, lr}
1ac50: e1a04000 mov r4, r0
1ac54: e24dd038 sub sp, sp, #56 ; 0x38
1ac58: e1a05001 mov r5, r1
#endif
rtems_rfs_inode_handle inode;
uint16_t mode;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1ac5c: e3a00001 mov r0, #1
1ac60: e3a01000 mov r1, #0
rtems_rfs_fs_open (const char* name,
void* user,
uint32_t flags,
uint32_t max_held_buffers,
rtems_rfs_file_system** fs)
{
1ac64: e1a07002 mov r7, r2
1ac68: e1a08003 mov r8, r3
1ac6c: e59d6058 ldr r6, [sp, #88] ; 0x58
#endif
rtems_rfs_inode_handle inode;
uint16_t mode;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1ac70: ebffd97d bl 1126c <rtems_rfs_trace>
1ac74: e3500000 cmp r0, #0
printf ("rtems-rfs: open: %s\n", name);
1ac78: 159f06e4 ldrne r0, [pc, #1764] ; 1b364 <rtems_rfs_fs_open+0x718>
1ac7c: 11a01004 movne r1, r4
1ac80: 1b000f69 blne 1ea2c <printf>
*fs = malloc (sizeof (rtems_rfs_file_system));
1ac84: e3a00084 mov r0, #132 ; 0x84
1ac88: ebffb050 bl 6dd0 <malloc>
if (!*fs)
1ac8c: e3500000 cmp r0, #0
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
printf ("rtems-rfs: open: %s\n", name);
*fs = malloc (sizeof (rtems_rfs_file_system));
1ac90: e5860000 str r0, [r6]
if (!*fs)
1ac94: 1a000008 bne 1acbc <rtems_rfs_fs_open+0x70>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1ac98: e3a00001 mov r0, #1 <== NOT EXECUTED
1ac9c: e3a01000 mov r1, #0 <== NOT EXECUTED
1aca0: ebffd971 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1aca4: e3500000 cmp r0, #0 <== NOT EXECUTED
printf ("rtems-rfs: open: no memory for file system data\n");
1aca8: 159f06b8 ldrne r0, [pc, #1720] ; 1b368 <rtems_rfs_fs_open+0x71c><== NOT EXECUTED
1acac: 1b000ff6 blne 1ec8c <puts> <== NOT EXECUTED
errno = ENOMEM;
1acb0: eb000a47 bl 1d5d4 <__errno> <== NOT EXECUTED
1acb4: e3a0300c mov r3, #12 <== NOT EXECUTED
1acb8: ea000187 b 1b2dc <rtems_rfs_fs_open+0x690> <== NOT EXECUTED
return -1;
}
memset (*fs, 0, sizeof (rtems_rfs_file_system));
1acbc: e3a01000 mov r1, #0
1acc0: e3a02084 mov r2, #132 ; 0x84
1acc4: eb000ee7 bl 1e868 <memset>
(*fs)->user = user;
1acc8: e5963000 ldr r3, [r6]
1accc: e5835080 str r5, [r3, #128] ; 0x80
rtems_chain_initialize_empty (&(*fs)->buffers);
1acd0: e5963000 ldr r3, [r6]
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
1acd4: e3a05000 mov r5, #0
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 );
1acd8: e2832044 add r2, r3, #68 ; 0x44
1acdc: e2831048 add r1, r3, #72 ; 0x48
head->next = tail;
1ace0: e5831044 str r1, [r3, #68] ; 0x44
head->previous = NULL;
tail->previous = head;
1ace4: e583204c str r2, [r3, #76] ; 0x4c
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
1ace8: e5835048 str r5, [r3, #72] ; 0x48
rtems_chain_initialize_empty (&(*fs)->release);
1acec: e5963000 ldr r3, [r6]
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 );
1acf0: e2832054 add r2, r3, #84 ; 0x54
1acf4: e2831058 add r1, r3, #88 ; 0x58
head->next = tail;
1acf8: e5831054 str r1, [r3, #84] ; 0x54
head->previous = NULL;
tail->previous = head;
1acfc: e583205c str r2, [r3, #92] ; 0x5c
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
1ad00: e5835058 str r5, [r3, #88] ; 0x58
rtems_chain_initialize_empty (&(*fs)->release_modified);
1ad04: e5963000 ldr r3, [r6]
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 );
1ad08: e2832064 add r2, r3, #100 ; 0x64
1ad0c: e2831068 add r1, r3, #104 ; 0x68
head->next = tail;
1ad10: e5831064 str r1, [r3, #100] ; 0x64
head->previous = NULL;
tail->previous = head;
1ad14: e583206c str r2, [r3, #108] ; 0x6c
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
1ad18: e5835068 str r5, [r3, #104] ; 0x68
rtems_chain_initialize_empty (&(*fs)->file_shares);
1ad1c: e5963000 ldr r3, [r6]
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 );
1ad20: e2831078 add r1, r3, #120 ; 0x78
1ad24: e2832074 add r2, r3, #116 ; 0x74
head->next = tail;
1ad28: e5831074 str r1, [r3, #116] ; 0x74
head->previous = NULL;
1ad2c: e5835078 str r5, [r3, #120] ; 0x78
tail->previous = head;
1ad30: e583207c str r2, [r3, #124] ; 0x7c
(*fs)->max_held_buffers = max_held_buffers;
1ad34: e5961000 ldr r1, [r6]
#endif
/*
* Open the buffer interface.
*/
rc = rtems_rfs_buffer_open (name, *fs);
1ad38: e1a00004 mov r0, r4
rtems_chain_initialize_empty (&(*fs)->buffers);
rtems_chain_initialize_empty (&(*fs)->release);
rtems_chain_initialize_empty (&(*fs)->release_modified);
rtems_chain_initialize_empty (&(*fs)->file_shares);
(*fs)->max_held_buffers = max_held_buffers;
1ad3c: e5818040 str r8, [r1, #64] ; 0x40
(*fs)->buffers_count = 0;
1ad40: e5815050 str r5, [r1, #80] ; 0x50
(*fs)->release_count = 0;
1ad44: e5815060 str r5, [r1, #96] ; 0x60
(*fs)->release_modified_count = 0;
1ad48: e5815070 str r5, [r1, #112] ; 0x70
(*fs)->flags = flags;
1ad4c: e5817000 str r7, [r1]
#endif
/*
* Open the buffer interface.
*/
rc = rtems_rfs_buffer_open (name, *fs);
1ad50: ebfff71d bl 189cc <rtems_rfs_buffer_open>
if (rc > 0)
1ad54: e2504000 subs r4, r0, #0
1ad58: da000010 ble 1ada0 <rtems_rfs_fs_open+0x154>
{
free (*fs);
1ad5c: e5960000 ldr r0, [r6] <== NOT EXECUTED
1ad60: ebffaeaa bl 6810 <free> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1ad64: e3a00001 mov r0, #1 <== NOT EXECUTED
1ad68: e3a01000 mov r1, #0 <== NOT EXECUTED
1ad6c: ebffd93e bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1ad70: e1500005 cmp r0, r5 <== NOT EXECUTED
1ad74: 0a000005 beq 1ad90 <rtems_rfs_fs_open+0x144> <== NOT EXECUTED
printf ("rtems-rfs: open: buffer open failed: %d: %s\n",
1ad78: e1a00004 mov r0, r4 <== NOT EXECUTED
1ad7c: eb0013d8 bl 1fce4 <strerror> <== NOT EXECUTED
1ad80: e1a02000 mov r2, r0 <== NOT EXECUTED
1ad84: e59f05e0 ldr r0, [pc, #1504] ; 1b36c <rtems_rfs_fs_open+0x720><== NOT EXECUTED
1ad88: e1a01004 mov r1, r4 <== NOT EXECUTED
1ad8c: eb000f26 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
errno = rc;
1ad90: eb000a0f bl 1d5d4 <__errno> <== NOT EXECUTED
1ad94: e5804000 str r4, [r0] <== NOT EXECUTED
return -1;
1ad98: e3e00000 mvn r0, #0 <== NOT EXECUTED
1ad9c: ea000166 b 1b33c <rtems_rfs_fs_open+0x6f0> <== NOT EXECUTED
}
rc = rtems_rfs_fs_read_superblock (*fs);
1ada0: e5964000 ldr r4, [r6]
printf ("rtems-rfs: read-superblock: handle open failed: %d: %s\n",
rc, strerror (rc));
return rc;
}
rc = rtems_rfs_buffer_handle_request (fs, &handle, 0, true);
1ada4: e28d102c add r1, sp, #44 ; 0x2c
1ada8: e1a00004 mov r0, r4
1adac: e1a02005 mov r2, r5
1adb0: e3a03001 mov r3, #1
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
1adb4: e5cd502c strb r5, [sp, #44] ; 0x2c
handle->bnum = 0;
1adb8: e58d5030 str r5, [sp, #48] ; 0x30
handle->buffer = NULL;
1adbc: e58d5034 str r5, [sp, #52] ; 0x34
1adc0: ebfff669 bl 1876c <rtems_rfs_buffer_handle_request>
if (rc > 0)
1adc4: e2508000 subs r8, r0, #0
1adc8: da000009 ble 1adf4 <rtems_rfs_fs_open+0x1a8>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1adcc: e3a00001 mov r0, #1 <== NOT EXECUTED
1add0: e3a01000 mov r1, #0 <== NOT EXECUTED
1add4: ebffd924 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1add8: e3500000 cmp r0, #0 <== NOT EXECUTED
1addc: 0a000102 beq 1b1ec <rtems_rfs_fs_open+0x5a0> <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: request failed%d: %s\n",
1ade0: e1a00008 mov r0, r8 <== NOT EXECUTED
1ade4: eb0013be bl 1fce4 <strerror> <== NOT EXECUTED
1ade8: e1a02000 mov r2, r0 <== NOT EXECUTED
1adec: e59f057c ldr r0, [pc, #1404] ; 1b370 <rtems_rfs_fs_open+0x724><== NOT EXECUTED
1adf0: ea0000f2 b 1b1c0 <rtems_rfs_fs_open+0x574> <== NOT EXECUTED
rc, strerror (rc));
return rc;
}
sb = rtems_rfs_buffer_data (&handle);
1adf4: e59d3034 ldr r3, [sp, #52] ; 0x34
1adf8: e593701c ldr r7, [r3, #28]
#define read_sb(_o) rtems_rfs_read_u32 (sb + (_o))
if (read_sb (RTEMS_RFS_SB_OFFSET_MAGIC) != RTEMS_RFS_SB_MAGIC)
1adfc: e5d72001 ldrb r2, [r7, #1]
1ae00: e5d73000 ldrb r3, [r7]
1ae04: e1a02802 lsl r2, r2, #16
1ae08: e1822c03 orr r2, r2, r3, lsl #24
1ae0c: e5d73003 ldrb r3, [r7, #3]
1ae10: e1822003 orr r2, r2, r3
1ae14: e5d73002 ldrb r3, [r7, #2]
1ae18: e1822403 orr r2, r2, r3, lsl #8
1ae1c: e59f3550 ldr r3, [pc, #1360] ; 1b374 <rtems_rfs_fs_open+0x728>
1ae20: e1520003 cmp r2, r3
1ae24: 0a000006 beq 1ae44 <rtems_rfs_fs_open+0x1f8>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1ae28: e3a00001 mov r0, #1 <== NOT EXECUTED
1ae2c: e3a01000 mov r1, #0 <== NOT EXECUTED
1ae30: ebffd90d bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1ae34: e3500000 cmp r0, #0 <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: invalid superblock, bad magic\n");
1ae38: 159f0538 ldrne r0, [pc, #1336] ; 1b378 <rtems_rfs_fs_open+0x72c><== NOT EXECUTED
#define read_sb(_o) rtems_rfs_read_u32 (sb + (_o))
if (read_sb (RTEMS_RFS_SB_OFFSET_MAGIC) != RTEMS_RFS_SB_MAGIC)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1ae3c: 0a00003c beq 1af34 <rtems_rfs_fs_open+0x2e8> <== NOT EXECUTED
1ae40: ea00001f b 1aec4 <rtems_rfs_fs_open+0x278> <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: invalid superblock, bad magic\n");
rtems_rfs_buffer_handle_close (fs, &handle);
return EIO;
}
fs->blocks = read_sb (RTEMS_RFS_SB_OFFSET_BLOCKS);
1ae44: e5d7300d ldrb r3, [r7, #13]
1ae48: e5d7200c ldrb r2, [r7, #12]
1ae4c: e1a03803 lsl r3, r3, #16
1ae50: e1833c02 orr r3, r3, r2, lsl #24
1ae54: e5d7200f ldrb r2, [r7, #15]
1ae58: e1833002 orr r3, r3, r2
1ae5c: e5d7200e ldrb r2, [r7, #14]
1ae60: e1833402 orr r3, r3, r2, lsl #8
1ae64: e5843004 str r3, [r4, #4]
fs->block_size = read_sb (RTEMS_RFS_SB_OFFSET_BLOCK_SIZE);
1ae68: e5d78009 ldrb r8, [r7, #9]
1ae6c: e5d72008 ldrb r2, [r7, #8]
1ae70: e1a08808 lsl r8, r8, #16
1ae74: e1888c02 orr r8, r8, r2, lsl #24
1ae78: e5d7200b ldrb r2, [r7, #11]
1ae7c: e1888002 orr r8, r8, r2
1ae80: e5d7200a ldrb r2, [r7, #10]
1ae84: e1888402 orr r8, r8, r2, lsl #8
}
uint64_t
rtems_rfs_fs_media_size (rtems_rfs_file_system* fs)
{
uint64_t media_blocks = (uint64_t) rtems_rfs_fs_media_blocks (fs);
1ae88: e5942010 ldr r2, [r4, #16]
1ae8c: e592101c ldr r1, [r2, #28]
uint64_t media_block_size = (uint64_t) rtems_rfs_fs_media_block_size (fs);
1ae90: e5920020 ldr r0, [r2, #32]
uint64_t
rtems_rfs_fs_size (rtems_rfs_file_system* fs)
{
uint64_t blocks = rtems_rfs_fs_blocks (fs);
uint64_t block_size = rtems_rfs_fs_block_size (fs);
return blocks * block_size;
1ae94: e08ba398 umull sl, fp, r8, r3
uint64_t
rtems_rfs_fs_media_size (rtems_rfs_file_system* fs)
{
uint64_t media_blocks = (uint64_t) rtems_rfs_fs_media_blocks (fs);
uint64_t media_block_size = (uint64_t) rtems_rfs_fs_media_block_size (fs);
return media_blocks * media_block_size;
1ae98: e0832190 umull r2, r3, r0, r1
}
fs->blocks = read_sb (RTEMS_RFS_SB_OFFSET_BLOCKS);
fs->block_size = read_sb (RTEMS_RFS_SB_OFFSET_BLOCK_SIZE);
if (rtems_rfs_fs_size(fs) > rtems_rfs_fs_media_size (fs))
1ae9c: e153000b cmp r3, fp
1aea0: 0152000a cmpeq r2, sl
rtems_rfs_buffer_handle_close (fs, &handle);
return EIO;
}
fs->blocks = read_sb (RTEMS_RFS_SB_OFFSET_BLOCKS);
fs->block_size = read_sb (RTEMS_RFS_SB_OFFSET_BLOCK_SIZE);
1aea4: e5848008 str r8, [r4, #8]
if (rtems_rfs_fs_size(fs) > rtems_rfs_fs_media_size (fs))
1aea8: 2a000007 bcs 1aecc <rtems_rfs_fs_open+0x280>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1aeac: e3a00001 mov r0, #1 <== NOT EXECUTED
1aeb0: e3a01000 mov r1, #0 <== NOT EXECUTED
1aeb4: ebffd8ec bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1aeb8: e3500000 cmp r0, #0 <== NOT EXECUTED
1aebc: 0a00001c beq 1af34 <rtems_rfs_fs_open+0x2e8> <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: invalid superblock block/size count\n");
1aec0: e59f04b4 ldr r0, [pc, #1204] ; 1b37c <rtems_rfs_fs_open+0x730><== NOT EXECUTED
1aec4: eb000f70 bl 1ec8c <puts> <== NOT EXECUTED
1aec8: ea000019 b 1af34 <rtems_rfs_fs_open+0x2e8> <== NOT EXECUTED
read_sb (RTEMS_RFS_SB_OFFSET_VERSION), RTEMS_RFS_VERSION_MASK);
rtems_rfs_buffer_handle_close (fs, &handle);
return EIO;
}
if (read_sb (RTEMS_RFS_SB_OFFSET_INODE_SIZE) != RTEMS_RFS_INODE_SIZE)
1aecc: e5d71025 ldrb r1, [r7, #37] ; 0x25
1aed0: e5d73024 ldrb r3, [r7, #36] ; 0x24
1aed4: e1a01801 lsl r1, r1, #16
1aed8: e1811c03 orr r1, r1, r3, lsl #24
1aedc: e5d73027 ldrb r3, [r7, #39] ; 0x27
1aee0: e1811003 orr r1, r1, r3
1aee4: e5d73026 ldrb r3, [r7, #38] ; 0x26
1aee8: e1811403 orr r1, r1, r3, lsl #8
1aeec: e3510038 cmp r1, #56 ; 0x38
1aef0: 0a000013 beq 1af44 <rtems_rfs_fs_open+0x2f8>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1aef4: e3a00001 mov r0, #1 <== NOT EXECUTED
1aef8: e3a01000 mov r1, #0 <== NOT EXECUTED
1aefc: ebffd8da bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1af00: e3500000 cmp r0, #0 <== NOT EXECUTED
1af04: 0a00000a beq 1af34 <rtems_rfs_fs_open+0x2e8> <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: inode size mismatch: fs:%" PRId32 " target:%" PRId32 "\n",
read_sb (RTEMS_RFS_SB_OFFSET_VERSION), RTEMS_RFS_VERSION_MASK);
1af08: e5d73005 ldrb r3, [r7, #5] <== NOT EXECUTED
1af0c: e5d72004 ldrb r2, [r7, #4] <== NOT EXECUTED
1af10: e1a03803 lsl r3, r3, #16 <== NOT EXECUTED
1af14: e1833c02 orr r3, r3, r2, lsl #24 <== NOT EXECUTED
1af18: e5d72007 ldrb r2, [r7, #7] <== NOT EXECUTED
1af1c: e5d71006 ldrb r1, [r7, #6] <== NOT EXECUTED
1af20: e1833002 orr r3, r3, r2 <== NOT EXECUTED
}
if (read_sb (RTEMS_RFS_SB_OFFSET_INODE_SIZE) != RTEMS_RFS_INODE_SIZE)
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
printf ("rtems-rfs: read-superblock: inode size mismatch: fs:%" PRId32 " target:%" PRId32 "\n",
1af24: e59f0454 ldr r0, [pc, #1108] ; 1b380 <rtems_rfs_fs_open+0x734><== NOT EXECUTED
1af28: e1831401 orr r1, r3, r1, lsl #8 <== NOT EXECUTED
1af2c: e1a02005 mov r2, r5 <== NOT EXECUTED
1af30: eb000ebd bl 1ea2c <printf> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1af34: e1a00004 mov r0, r4 <== NOT EXECUTED
1af38: e28d102c add r1, sp, #44 ; 0x2c <== NOT EXECUTED
1af3c: ebfff59e bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
1af40: ea0000a6 b 1b1e0 <rtems_rfs_fs_open+0x594> <== NOT EXECUTED
read_sb (RTEMS_RFS_SB_OFFSET_VERSION), RTEMS_RFS_VERSION_MASK);
rtems_rfs_buffer_handle_close (fs, &handle);
return EIO;
}
fs->bad_blocks = read_sb (RTEMS_RFS_SB_OFFSET_BAD_BLOCKS);
1af44: e5d73011 ldrb r3, [r7, #17]
1af48: e5d72010 ldrb r2, [r7, #16]
1af4c: e1a03803 lsl r3, r3, #16
1af50: e1833c02 orr r3, r3, r2, lsl #24
1af54: e5d72013 ldrb r2, [r7, #19]
1af58: e1833002 orr r3, r3, r2
1af5c: e5d72012 ldrb r2, [r7, #18]
1af60: e1833402 orr r3, r3, r2, lsl #8
1af64: e5843018 str r3, [r4, #24]
fs->max_name_length = read_sb (RTEMS_RFS_SB_OFFSET_MAX_NAME_LENGTH);
1af68: e5d73015 ldrb r3, [r7, #21]
1af6c: e5d72014 ldrb r2, [r7, #20]
1af70: e1a03803 lsl r3, r3, #16
1af74: e1833c02 orr r3, r3, r2, lsl #24
1af78: e5d72017 ldrb r2, [r7, #23]
1af7c: e1833002 orr r3, r3, r2
1af80: e5d72016 ldrb r2, [r7, #22]
1af84: e1833402 orr r3, r3, r2, lsl #8
1af88: e584301c str r3, [r4, #28]
fs->group_count = read_sb (RTEMS_RFS_SB_OFFSET_GROUPS);
1af8c: e5d70019 ldrb r0, [r7, #25]
1af90: e5d73018 ldrb r3, [r7, #24]
1af94: e1a00800 lsl r0, r0, #16
1af98: e1800c03 orr r0, r0, r3, lsl #24
1af9c: e5d7301b ldrb r3, [r7, #27]
1afa0: e5d7201a ldrb r2, [r7, #26]
1afa4: e1800003 orr r0, r0, r3
1afa8: e1800402 orr r0, r0, r2, lsl #8
1afac: e5840024 str r0, [r4, #36] ; 0x24
fs->group_blocks = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_BLOCKS);
1afb0: e5d7a01d ldrb sl, [r7, #29]
1afb4: e5d7301c ldrb r3, [r7, #28]
1afb8: e1a0a80a lsl sl, sl, #16
1afbc: e18aac03 orr sl, sl, r3, lsl #24
1afc0: e5d7301f ldrb r3, [r7, #31]
1afc4: e18aa003 orr sl, sl, r3
1afc8: e5d7301e ldrb r3, [r7, #30]
1afcc: e18aa403 orr sl, sl, r3, lsl #8
1afd0: e584a028 str sl, [r4, #40] ; 0x28
fs->group_inodes = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_INODES);
1afd4: e5d72021 ldrb r2, [r7, #33] ; 0x21
1afd8: e5d73020 ldrb r3, [r7, #32]
1afdc: e1a02802 lsl r2, r2, #16
1afe0: e1822c03 orr r2, r2, r3, lsl #24
1afe4: e5d73023 ldrb r3, [r7, #35] ; 0x23
1afe8: e1822003 orr r2, r2, r3
1afec: e5d73022 ldrb r3, [r7, #34] ; 0x22
1aff0: e1822403 orr r2, r2, r3, lsl #8
fs->blocks_per_block =
rtems_rfs_fs_block_size (fs) / sizeof (rtems_rfs_inode_block);
1aff4: e1a03128 lsr r3, r8, #2
fs->block_map_singly_blocks =
fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
1aff8: e083c103 add ip, r3, r3, lsl #2
fs->group_inodes = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_INODES);
fs->blocks_per_block =
rtems_rfs_fs_block_size (fs) / sizeof (rtems_rfs_inode_block);
fs->block_map_singly_blocks =
1affc: e584c038 str ip, [r4, #56] ; 0x38
fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
fs->block_map_doubly_blocks =
fs->blocks_per_block * fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
1b000: e00c0393 mul ip, r3, r3
fs->bad_blocks = read_sb (RTEMS_RFS_SB_OFFSET_BAD_BLOCKS);
fs->max_name_length = read_sb (RTEMS_RFS_SB_OFFSET_MAX_NAME_LENGTH);
fs->group_count = read_sb (RTEMS_RFS_SB_OFFSET_GROUPS);
fs->group_blocks = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_BLOCKS);
fs->group_inodes = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_INODES);
1b004: e584202c str r2, [r4, #44] ; 0x2c
fs->block_map_singly_blocks =
fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
fs->block_map_doubly_blocks =
fs->blocks_per_block * fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
fs->inodes = fs->group_count * fs->group_inodes;
1b008: e0020290 mul r2, r0, r2
fs->max_name_length = read_sb (RTEMS_RFS_SB_OFFSET_MAX_NAME_LENGTH);
fs->group_count = read_sb (RTEMS_RFS_SB_OFFSET_GROUPS);
fs->group_blocks = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_BLOCKS);
fs->group_inodes = read_sb (RTEMS_RFS_SB_OFFSET_GROUP_INODES);
fs->blocks_per_block =
1b00c: e5843034 str r3, [r4, #52] ; 0x34
rtems_rfs_fs_block_size (fs) / sizeof (rtems_rfs_inode_block);
fs->block_map_singly_blocks =
fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
fs->block_map_doubly_blocks =
fs->blocks_per_block * fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
1b010: e08c310c add r3, ip, ip, lsl #2
fs->blocks_per_block =
rtems_rfs_fs_block_size (fs) / sizeof (rtems_rfs_inode_block);
fs->block_map_singly_blocks =
fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
fs->block_map_doubly_blocks =
1b014: e584303c str r3, [r4, #60] ; 0x3c
fs->blocks_per_block * fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
fs->inodes = fs->group_count * fs->group_inodes;
1b018: e5842014 str r2, [r4, #20]
fs->inodes_per_block = fs->block_size / RTEMS_RFS_INODE_SIZE;
1b01c: e1a00008 mov r0, r8
1b020: ebff9a46 bl 1940 <__aeabi_uidiv>
if (fs->group_blocks >
1b024: e15a0188 cmp sl, r8, lsl #3
fs->block_map_doubly_blocks =
fs->blocks_per_block * fs->blocks_per_block * RTEMS_RFS_INODE_BLOCKS;
fs->inodes = fs->group_count * fs->group_inodes;
fs->inodes_per_block = fs->block_size / RTEMS_RFS_INODE_SIZE;
1b028: e5840030 str r0, [r4, #48] ; 0x30
1b02c: e28d102c add r1, sp, #44 ; 0x2c
1b030: e1a00004 mov r0, r4
if (fs->group_blocks >
1b034: 9a00000b bls 1b068 <rtems_rfs_fs_open+0x41c>
1b038: ebfff55f bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
rtems_rfs_bitmap_numof_bits (rtems_rfs_fs_block_size (fs)))
{
rtems_rfs_buffer_handle_close (fs, &handle);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1b03c: e3a00001 mov r0, #1 <== NOT EXECUTED
1b040: e3a01000 mov r1, #0 <== NOT EXECUTED
handle->dirty = false;
1b044: e5cd502c strb r5, [sp, #44] ; 0x2c <== NOT EXECUTED
handle->bnum = 0;
1b048: e58d5030 str r5, [sp, #48] ; 0x30 <== NOT EXECUTED
handle->buffer = NULL;
1b04c: e58d5034 str r5, [sp, #52] ; 0x34 <== NOT EXECUTED
1b050: ebffd885 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b054: e3500000 cmp r0, #0 <== NOT EXECUTED
1b058: 0a000060 beq 1b1e0 <rtems_rfs_fs_open+0x594> <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: groups blocks larger than block bits\n");
1b05c: e59f0320 ldr r0, [pc, #800] ; 1b384 <rtems_rfs_fs_open+0x738><== NOT EXECUTED
1b060: eb000f09 bl 1ec8c <puts> <== NOT EXECUTED
1b064: ea00005d b 1b1e0 <rtems_rfs_fs_open+0x594> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1b068: ebfff553 bl 185bc <rtems_rfs_buffer_handle_release>
rtems_rfs_buffer_handle_close (fs, &handle);
/*
* Change the block size to the value in the superblock.
*/
rc = rtems_rfs_buffer_setblksize (fs, rtems_rfs_fs_block_size (fs));
1b06c: e1a00004 mov r0, r4
1b070: e5941008 ldr r1, [r4, #8]
handle->dirty = false;
1b074: e5cd502c strb r5, [sp, #44] ; 0x2c
handle->bnum = 0;
1b078: e58d5030 str r5, [sp, #48] ; 0x30
handle->buffer = NULL;
1b07c: e58d5034 str r5, [sp, #52] ; 0x34
1b080: ebfff6e4 bl 18c18 <rtems_rfs_buffer_setblksize>
if (rc > 0)
1b084: e2508000 subs r8, r0, #0
1b088: da00000f ble 1b0cc <rtems_rfs_fs_open+0x480>
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1b08c: e28d102c add r1, sp, #44 ; 0x2c <== NOT EXECUTED
1b090: e1a00004 mov r0, r4 <== NOT EXECUTED
1b094: ebfff548 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
{
rtems_rfs_buffer_handle_close (fs, &handle);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1b098: e3a00001 mov r0, #1 <== NOT EXECUTED
1b09c: e3a01000 mov r1, #0 <== NOT EXECUTED
handle->dirty = false;
1b0a0: e5cd502c strb r5, [sp, #44] ; 0x2c <== NOT EXECUTED
handle->bnum = 0;
1b0a4: e58d5030 str r5, [sp, #48] ; 0x30 <== NOT EXECUTED
handle->buffer = NULL;
1b0a8: e58d5034 str r5, [sp, #52] ; 0x34 <== NOT EXECUTED
1b0ac: ebffd86e bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b0b0: e3500000 cmp r0, #0 <== NOT EXECUTED
1b0b4: 0a00004c beq 1b1ec <rtems_rfs_fs_open+0x5a0> <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: invalid superblock block size%d: %s\n",
1b0b8: e1a00008 mov r0, r8 <== NOT EXECUTED
1b0bc: eb001308 bl 1fce4 <strerror> <== NOT EXECUTED
1b0c0: e1a02000 mov r2, r0 <== NOT EXECUTED
1b0c4: e59f02bc ldr r0, [pc, #700] ; 1b388 <rtems_rfs_fs_open+0x73c><== NOT EXECUTED
1b0c8: ea00003c b 1b1c0 <rtems_rfs_fs_open+0x574> <== NOT EXECUTED
rc, strerror (rc));
return rc;
}
fs->groups = calloc (fs->group_count, sizeof (rtems_rfs_group));
1b0cc: e5940024 ldr r0, [r4, #36] ; 0x24
1b0d0: e3a01050 mov r1, #80 ; 0x50
1b0d4: ebffacef bl 6498 <calloc>
if (!fs->groups)
1b0d8: e3500000 cmp r0, #0
printf ("rtems-rfs: read-superblock: invalid superblock block size%d: %s\n",
rc, strerror (rc));
return rc;
}
fs->groups = calloc (fs->group_count, sizeof (rtems_rfs_group));
1b0dc: e1a07000 mov r7, r0
1b0e0: e5840020 str r0, [r4, #32]
if (!fs->groups)
1b0e4: 11a07005 movne r7, r5
1b0e8: 1a000038 bne 1b1d0 <rtems_rfs_fs_open+0x584>
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1b0ec: e28d102c add r1, sp, #44 ; 0x2c <== NOT EXECUTED
1b0f0: e1a00004 mov r0, r4 <== NOT EXECUTED
1b0f4: ebfff530 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
{
rtems_rfs_buffer_handle_close (fs, &handle);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1b0f8: e3a00001 mov r0, #1 <== NOT EXECUTED
1b0fc: e3a01000 mov r1, #0 <== NOT EXECUTED
handle->dirty = false;
1b100: e5cd702c strb r7, [sp, #44] ; 0x2c <== NOT EXECUTED
handle->bnum = 0;
1b104: e58d7030 str r7, [sp, #48] ; 0x30 <== NOT EXECUTED
handle->buffer = NULL;
1b108: e58d7034 str r7, [sp, #52] ; 0x34 <== NOT EXECUTED
1b10c: ebffd856 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b110: e3500000 cmp r0, #0 <== NOT EXECUTED
1b114: 0a000033 beq 1b1e8 <rtems_rfs_fs_open+0x59c> <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: no memory for group table\n");
1b118: e59f026c ldr r0, [pc, #620] ; 1b38c <rtems_rfs_fs_open+0x740><== NOT EXECUTED
1b11c: eb000eda bl 1ec8c <puts> <== NOT EXECUTED
1b120: ea000030 b 1b1e8 <rtems_rfs_fs_open+0x59c> <== NOT EXECUTED
* close everything.
*/
for (group = 0; group < fs->group_count; group++)
{
rc = rtems_rfs_group_open (fs,
rtems_rfs_fs_block (fs, group, 0),
1b124: e5942028 ldr r2, [r4, #40] ; 0x28
1b128: e0010792 mul r1, r2, r7
* know how far the initialisation has gone if an error occurs and we need to
* close everything.
*/
for (group = 0; group < fs->group_count; group++)
{
rc = rtems_rfs_group_open (fs,
1b12c: e5943020 ldr r3, [r4, #32]
1b130: e0833005 add r3, r3, r5
1b134: e58d3000 str r3, [sp]
1b138: e1a00004 mov r0, r4
1b13c: e2811001 add r1, r1, #1
1b140: e594302c ldr r3, [r4, #44] ; 0x2c
1b144: ebffd068 bl f2ec <rtems_rfs_group_open>
rtems_rfs_fs_block (fs, group, 0),
fs->group_blocks,
fs->group_inodes,
&fs->groups[group]);
if (rc > 0)
1b148: e2508000 subs r8, r0, #0
* know how far the initialisation has gone if an error occurs and we need to
* close everything.
*/
for (group = 0; group < fs->group_count; group++)
{
rc = rtems_rfs_group_open (fs,
1b14c: e2855050 add r5, r5, #80 ; 0x50
rtems_rfs_fs_block (fs, group, 0),
fs->group_blocks,
fs->group_inodes,
&fs->groups[group]);
if (rc > 0)
1b150: da00001d ble 1b1cc <rtems_rfs_fs_open+0x580>
1b154: e3a05000 mov r5, #0 <== NOT EXECUTED
1b158: e1a0a005 mov sl, r5 <== NOT EXECUTED
1b15c: ea000005 b 1b178 <rtems_rfs_fs_open+0x52c> <== NOT EXECUTED
{
int g;
for (g = 0; g < group; g++)
rtems_rfs_group_close (fs, &fs->groups[g]);
1b160: e5941020 ldr r1, [r4, #32] <== NOT EXECUTED
1b164: e1a00004 mov r0, r4 <== NOT EXECUTED
1b168: e0811005 add r1, r1, r5 <== NOT EXECUTED
1b16c: ebffd0da bl f4dc <rtems_rfs_group_close> <== NOT EXECUTED
fs->group_inodes,
&fs->groups[group]);
if (rc > 0)
{
int g;
for (g = 0; g < group; g++)
1b170: e28aa001 add sl, sl, #1 <== NOT EXECUTED
1b174: e2855050 add r5, r5, #80 ; 0x50 <== NOT EXECUTED
1b178: e15a0007 cmp sl, r7 <== NOT EXECUTED
1b17c: bafffff7 blt 1b160 <rtems_rfs_fs_open+0x514> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1b180: e28d102c add r1, sp, #44 ; 0x2c <== NOT EXECUTED
1b184: e1a00004 mov r0, r4 <== NOT EXECUTED
1b188: ebfff50b bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
handle->dirty = false;
1b18c: e3a03000 mov r3, #0 <== NOT EXECUTED
rtems_rfs_group_close (fs, &fs->groups[g]);
rtems_rfs_buffer_handle_close (fs, &handle);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1b190: e3a00001 mov r0, #1 <== NOT EXECUTED
1b194: e3a01000 mov r1, #0 <== NOT EXECUTED
1b198: e5cd302c strb r3, [sp, #44] ; 0x2c <== NOT EXECUTED
handle->bnum = 0;
1b19c: e58d3030 str r3, [sp, #48] ; 0x30 <== NOT EXECUTED
handle->buffer = NULL;
1b1a0: e58d3034 str r3, [sp, #52] ; 0x34 <== NOT EXECUTED
1b1a4: ebffd830 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b1a8: e3500000 cmp r0, #0 <== NOT EXECUTED
1b1ac: 0a00000e beq 1b1ec <rtems_rfs_fs_open+0x5a0> <== NOT EXECUTED
printf ("rtems-rfs: read-superblock: no memory for group table%d: %s\n",
1b1b0: e1a00008 mov r0, r8 <== NOT EXECUTED
1b1b4: eb0012ca bl 1fce4 <strerror> <== NOT EXECUTED
1b1b8: e1a02000 mov r2, r0 <== NOT EXECUTED
1b1bc: e59f01cc ldr r0, [pc, #460] ; 1b390 <rtems_rfs_fs_open+0x744><== NOT EXECUTED
1b1c0: e1a01008 mov r1, r8 <== NOT EXECUTED
1b1c4: eb000e18 bl 1ea2c <printf> <== NOT EXECUTED
1b1c8: ea000007 b 1b1ec <rtems_rfs_fs_open+0x5a0> <== NOT EXECUTED
/*
* Perform each phase of group initialisation at the same time. This way we
* know how far the initialisation has gone if an error occurs and we need to
* close everything.
*/
for (group = 0; group < fs->group_count; group++)
1b1cc: e2877001 add r7, r7, #1
1b1d0: e5943024 ldr r3, [r4, #36] ; 0x24
1b1d4: e1570003 cmp r7, r3
1b1d8: baffffd1 blt 1b124 <rtems_rfs_fs_open+0x4d8>
1b1dc: ea000058 b 1b344 <rtems_rfs_fs_open+0x6f8>
rtems_rfs_bitmap_numof_bits (rtems_rfs_fs_block_size (fs)))
{
rtems_rfs_buffer_handle_close (fs, &handle);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
printf ("rtems-rfs: read-superblock: groups blocks larger than block bits\n");
return EIO;
1b1e0: e3a08005 mov r8, #5 <== NOT EXECUTED
1b1e4: ea000000 b 1b1ec <rtems_rfs_fs_open+0x5a0> <== NOT EXECUTED
if (!fs->groups)
{
rtems_rfs_buffer_handle_close (fs, &handle);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
printf ("rtems-rfs: read-superblock: no memory for group table\n");
return ENOMEM;
1b1e8: e3a0800c mov r8, #12 <== NOT EXECUTED
}
rc = rtems_rfs_fs_read_superblock (*fs);
if (rc > 0)
{
rtems_rfs_buffer_close (*fs);
1b1ec: e5960000 ldr r0, [r6] <== NOT EXECUTED
1b1f0: ebfff6bf bl 18cf4 <rtems_rfs_buffer_close> <== NOT EXECUTED
free (*fs);
1b1f4: e5960000 ldr r0, [r6] <== NOT EXECUTED
1b1f8: ebffad84 bl 6810 <free> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1b1fc: e3a00001 mov r0, #1 <== NOT EXECUTED
1b200: e3a01000 mov r1, #0 <== NOT EXECUTED
1b204: ebffd818 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b208: e3500000 cmp r0, #0 <== NOT EXECUTED
1b20c: 0a000005 beq 1b228 <rtems_rfs_fs_open+0x5dc> <== NOT EXECUTED
printf ("rtems-rfs: open: reading superblock: %d: %s\n",
1b210: e1a00008 mov r0, r8 <== NOT EXECUTED
1b214: eb0012b2 bl 1fce4 <strerror> <== NOT EXECUTED
1b218: e1a01008 mov r1, r8 <== NOT EXECUTED
1b21c: e1a02000 mov r2, r0 <== NOT EXECUTED
1b220: e59f016c ldr r0, [pc, #364] ; 1b394 <rtems_rfs_fs_open+0x748><== NOT EXECUTED
1b224: eb000e00 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
errno = rc;
1b228: eb0008e9 bl 1d5d4 <__errno> <== NOT EXECUTED
1b22c: e5808000 str r8, [r0] <== NOT EXECUTED
1b230: eafffed8 b 1ad98 <rtems_rfs_fs_open+0x14c> <== NOT EXECUTED
}
rc = rtems_rfs_inode_open (*fs, RTEMS_RFS_ROOT_INO, &inode, true);
if (rc > 0)
{
rtems_rfs_buffer_close (*fs);
1b234: e5960000 ldr r0, [r6] <== NOT EXECUTED
1b238: ebfff6ad bl 18cf4 <rtems_rfs_buffer_close> <== NOT EXECUTED
free (*fs);
1b23c: e5960000 ldr r0, [r6] <== NOT EXECUTED
1b240: ebffad72 bl 6810 <free> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1b244: e3a00001 mov r0, #1 <== NOT EXECUTED
1b248: e3a01000 mov r1, #0 <== NOT EXECUTED
1b24c: ebffd806 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b250: e3500000 cmp r0, #0 <== NOT EXECUTED
1b254: 0afffecd beq 1ad90 <rtems_rfs_fs_open+0x144> <== NOT EXECUTED
printf ("rtems-rfs: open: reading root inode: %d: %s\n",
1b258: e1a00004 mov r0, r4 <== NOT EXECUTED
1b25c: eb0012a0 bl 1fce4 <strerror> <== NOT EXECUTED
1b260: e1a02000 mov r2, r0 <== NOT EXECUTED
1b264: e59f012c ldr r0, [pc, #300] ; 1b398 <rtems_rfs_fs_open+0x74c><== NOT EXECUTED
1b268: eafffec6 b 1ad88 <rtems_rfs_fs_open+0x13c> <== NOT EXECUTED
rc, strerror (rc));
errno = rc;
return -1;
}
if (((*fs)->flags & RTEMS_RFS_FS_FORCE_OPEN) == 0)
1b26c: e5960000 ldr r0, [r6]
1b270: e5903000 ldr r3, [r0]
1b274: e3130004 tst r3, #4
1b278: 1a000019 bne 1b2e4 <rtems_rfs_fs_open+0x698>
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
1b27c: e59d2010 ldr r2, [sp, #16]
1b280: e5d21002 ldrb r1, [r2, #2]
1b284: e5d23003 ldrb r3, [r2, #3]
{
mode = rtems_rfs_inode_get_mode (&inode);
if ((mode == 0xffff) || !RTEMS_RFS_S_ISDIR (mode))
1b288: e59f210c ldr r2, [pc, #268] ; 1b39c <rtems_rfs_fs_open+0x750>
1b28c: e1833401 orr r3, r3, r1, lsl #8
1b290: e1530002 cmp r3, r2
1b294: 0a000002 beq 1b2a4 <rtems_rfs_fs_open+0x658>
1b298: e2033a0f and r3, r3, #61440 ; 0xf000
1b29c: e3530901 cmp r3, #16384 ; 0x4000
1b2a0: 0a00000f beq 1b2e4 <rtems_rfs_fs_open+0x698>
{
rtems_rfs_inode_close (*fs, &inode);
1b2a4: e28d1004 add r1, sp, #4 <== NOT EXECUTED
1b2a8: ebffd256 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
rtems_rfs_buffer_close (*fs);
1b2ac: e5960000 ldr r0, [r6] <== NOT EXECUTED
1b2b0: ebfff68f bl 18cf4 <rtems_rfs_buffer_close> <== NOT EXECUTED
free (*fs);
1b2b4: e5960000 ldr r0, [r6] <== NOT EXECUTED
1b2b8: ebffad54 bl 6810 <free> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1b2bc: e3a00001 mov r0, #1 <== NOT EXECUTED
1b2c0: e3a01000 mov r1, #0 <== NOT EXECUTED
1b2c4: ebffd7e8 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b2c8: e3500000 cmp r0, #0 <== NOT EXECUTED
printf ("rtems-rfs: open: invalid root inode mode\n");
1b2cc: 159f00cc ldrne r0, [pc, #204] ; 1b3a0 <rtems_rfs_fs_open+0x754><== NOT EXECUTED
1b2d0: 1b000e6d blne 1ec8c <puts> <== NOT EXECUTED
errno = EIO;
1b2d4: eb0008be bl 1d5d4 <__errno> <== NOT EXECUTED
1b2d8: e3a03005 mov r3, #5 <== NOT EXECUTED
1b2dc: e5803000 str r3, [r0] <== NOT EXECUTED
1b2e0: eafffeac b 1ad98 <rtems_rfs_fs_open+0x14c> <== NOT EXECUTED
return -1;
}
}
rc = rtems_rfs_inode_close (*fs, &inode);
1b2e4: e28d1004 add r1, sp, #4
1b2e8: ebffd246 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
1b2ec: e2504000 subs r4, r0, #0
1b2f0: da00000d ble 1b32c <rtems_rfs_fs_open+0x6e0>
{
rtems_rfs_buffer_close (*fs);
1b2f4: e5960000 ldr r0, [r6] <== NOT EXECUTED
1b2f8: ebfff67d bl 18cf4 <rtems_rfs_buffer_close> <== NOT EXECUTED
free (*fs);
1b2fc: e5960000 ldr r0, [r6] <== NOT EXECUTED
1b300: ebffad42 bl 6810 <free> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_OPEN))
1b304: e3a00001 mov r0, #1 <== NOT EXECUTED
1b308: e3a01000 mov r1, #0 <== NOT EXECUTED
1b30c: ebffd7d6 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b310: e3500000 cmp r0, #0 <== NOT EXECUTED
1b314: 0afffe9d beq 1ad90 <rtems_rfs_fs_open+0x144> <== NOT EXECUTED
printf ("rtems-rfs: open: closing root inode: %d: %s\n", rc, strerror (rc));
1b318: e1a00004 mov r0, r4 <== NOT EXECUTED
1b31c: eb001270 bl 1fce4 <strerror> <== NOT EXECUTED
1b320: e1a02000 mov r2, r0 <== NOT EXECUTED
1b324: e59f0078 ldr r0, [pc, #120] ; 1b3a4 <rtems_rfs_fs_open+0x758><== NOT EXECUTED
1b328: eafffe96 b 1ad88 <rtems_rfs_fs_open+0x13c> <== NOT EXECUTED
errno = rc;
return -1;
}
errno = 0;
1b32c: eb0008a8 bl 1d5d4 <__errno>
1b330: e3a03000 mov r3, #0
1b334: e5803000 str r3, [r0]
return 0;
1b338: e1a00003 mov r0, r3
}
1b33c: e28dd038 add sp, sp, #56 ; 0x38
1b340: e8bd8df0 pop {r4, r5, r6, r7, r8, sl, fp, pc}
rc, strerror (rc));
errno = rc;
return -1;
}
rc = rtems_rfs_inode_open (*fs, RTEMS_RFS_ROOT_INO, &inode, true);
1b344: e3a01001 mov r1, #1
1b348: e5960000 ldr r0, [r6]
1b34c: e28d2004 add r2, sp, #4
1b350: e1a03001 mov r3, r1
1b354: ebffd1b6 bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
1b358: e2504000 subs r4, r0, #0
1b35c: daffffc2 ble 1b26c <rtems_rfs_fs_open+0x620>
1b360: eaffffb3 b 1b234 <rtems_rfs_fs_open+0x5e8> <== NOT EXECUTED
0001ac28 <rtems_rfs_fs_size>:
#include <rtems/rfs/rtems-rfs-trace.h>
uint64_t
rtems_rfs_fs_size (rtems_rfs_file_system* fs)
{
uint64_t blocks = rtems_rfs_fs_blocks (fs);
1ac28: e5903004 ldr r3, [r0, #4] <== NOT EXECUTED
uint64_t block_size = rtems_rfs_fs_block_size (fs);
1ac2c: e5902008 ldr r2, [r0, #8] <== NOT EXECUTED
return blocks * block_size;
1ac30: e0810392 umull r0, r1, r2, r3 <== NOT EXECUTED
}
1ac34: e12fff1e bx lr <== NOT EXECUTED
0000f564 <rtems_rfs_group_bitmap_alloc>:
int
rtems_rfs_group_bitmap_alloc (rtems_rfs_file_system* fs,
rtems_rfs_bitmap_bit goal,
bool inode,
rtems_rfs_bitmap_bit* result)
{
f564: e92d4fff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_rfs_bitmap_bit bit;
int offset;
bool updown;
int direction;
if (inode)
f568: e212b0ff ands fp, r2, #255 ; 0xff
{
size = fs->group_inodes;
f56c: 1590802c ldrne r8, [r0, #44] ; 0x2c
goal -= RTEMS_RFS_ROOT_INO;
}
else
size = fs->group_blocks;
f570: 05908028 ldreq r8, [r0, #40] ; 0x28
int
rtems_rfs_group_bitmap_alloc (rtems_rfs_file_system* fs,
rtems_rfs_bitmap_bit goal,
bool inode,
rtems_rfs_bitmap_bit* result)
{
f574: e1a05001 mov r5, r1
int direction;
if (inode)
{
size = fs->group_inodes;
goal -= RTEMS_RFS_ROOT_INO;
f578: 12415001 subne r5, r1, #1
int
rtems_rfs_group_bitmap_alloc (rtems_rfs_file_system* fs,
rtems_rfs_bitmap_bit goal,
bool inode,
rtems_rfs_bitmap_bit* result)
{
f57c: e1a04000 mov r4, r0
goal -= RTEMS_RFS_ROOT_INO;
}
else
size = fs->group_blocks;
group_start = goal / size;
f580: e1a01008 mov r1, r8
f584: e1a00005 mov r0, r5
int
rtems_rfs_group_bitmap_alloc (rtems_rfs_file_system* fs,
rtems_rfs_bitmap_bit goal,
bool inode,
rtems_rfs_bitmap_bit* result)
{
f588: e58d3000 str r3, [sp]
goal -= RTEMS_RFS_ROOT_INO;
}
else
size = fs->group_blocks;
group_start = goal / size;
f58c: ebffc8eb bl 1940 <__aeabi_uidiv>
bit = (rtems_rfs_bitmap_bit) (goal % size);
f590: e1a01008 mov r1, r8
goal -= RTEMS_RFS_ROOT_INO;
}
else
size = fs->group_blocks;
group_start = goal / size;
f594: e58d0004 str r0, [sp, #4]
bit = (rtems_rfs_bitmap_bit) (goal % size);
f598: e1a00005 mov r0, r5
f59c: eb006e95 bl 2aff8 <__umodsi3>
offset = 0;
updown = true;
direction = 1;
f5a0: e3a05001 mov r5, #1
}
else
size = fs->group_blocks;
group_start = goal / size;
bit = (rtems_rfs_bitmap_bit) (goal % size);
f5a4: e58d0008 str r0, [sp, #8]
offset = 0;
updown = true;
f5a8: e1a0a005 mov sl, r5
else
size = fs->group_blocks;
group_start = goal / size;
bit = (rtems_rfs_bitmap_bit) (goal % size);
offset = 0;
f5ac: e3a07000 mov r7, #0
f5b0: ea000001 b f5bc <rtems_rfs_group_bitmap_alloc+0x58>
*/
if ((group < 0) || (group >= fs->group_count))
{
if (!updown)
break;
direction = direction > 0 ? -1 : 1;
f5b4: e3e05000 mvn r5, #0 <== NOT EXECUTED
updown = false;
f5b8: e3a0a000 mov sl, #0
/*
* We can start at any location and we move out from that point in each
* direction. The offset grows until we find a free bit or we hit an end.
*/
group = group_start + (direction * offset);
f5bc: e59d3004 ldr r3, [sp, #4]
*/
while (true)
{
rtems_rfs_bitmap_control* bitmap;
int group;
bool allocated = false;
f5c0: e3a02000 mov r2, #0
/*
* We can start at any location and we move out from that point in each
* direction. The offset grows until we find a free bit or we hit an end.
*/
group = group_start + (direction * offset);
if (offset)
f5c4: e3570000 cmp r7, #0
*/
while (true)
{
rtems_rfs_bitmap_control* bitmap;
int group;
bool allocated = false;
f5c8: e5cd200f strb r2, [sp, #15]
/*
* We can start at any location and we move out from that point in each
* direction. The offset grows until we find a free bit or we hit an end.
*/
group = group_start + (direction * offset);
f5cc: e0263597 mla r6, r7, r5, r3
if (offset)
f5d0: 0a000003 beq f5e4 <rtems_rfs_group_bitmap_alloc+0x80>
bit = direction > 0 ? 0 : size - 1;
f5d4: e3550001 cmp r5, #1
f5d8: 12483001 subne r3, r8, #1
f5dc: 03a03000 moveq r3, #0
f5e0: e58d3008 str r3, [sp, #8]
/*
* If we are still looking up and down and if the group is out of range we
* have reached one end. Stopping looking up and down and just move in the
* one direction one group at a time.
*/
if ((group < 0) || (group >= fs->group_count))
f5e4: e3560000 cmp r6, #0
f5e8: ba000002 blt f5f8 <rtems_rfs_group_bitmap_alloc+0x94>
f5ec: e5943024 ldr r3, [r4, #36] ; 0x24
f5f0: e1560003 cmp r6, r3
f5f4: ba000005 blt f610 <rtems_rfs_group_bitmap_alloc+0xac>
{
if (!updown)
f5f8: e35a0000 cmp sl, #0
f5fc: 0a00003e beq f6fc <rtems_rfs_group_bitmap_alloc+0x198>
break;
direction = direction > 0 ? -1 : 1;
f600: e3550001 cmp r5, #1
f604: 13a05001 movne r5, #1
f608: 0affffe9 beq f5b4 <rtems_rfs_group_bitmap_alloc+0x50>
f60c: eaffffe9 b f5b8 <rtems_rfs_group_bitmap_alloc+0x54>
f610: e5943020 ldr r3, [r4, #32]
f614: e3a09050 mov r9, #80 ; 0x50
updown = false;
continue;
}
if (inode)
bitmap = &fs->groups[group].inode_bitmap;
f618: e0293996 mla r9, r6, r9, r3
direction = direction > 0 ? -1 : 1;
updown = false;
continue;
}
if (inode)
f61c: e35b0000 cmp fp, #0
bitmap = &fs->groups[group].inode_bitmap;
f620: 1289902c addne r9, r9, #44 ; 0x2c
else
bitmap = &fs->groups[group].block_bitmap;
f624: 02899008 addeq r9, r9, #8
rc = rtems_rfs_bitmap_map_alloc (bitmap, bit, &allocated, &bit);
f628: e1a00009 mov r0, r9
f62c: e59d1008 ldr r1, [sp, #8]
f630: e28d200f add r2, sp, #15
f634: e28d3008 add r3, sp, #8
f638: eb001f39 bl 17324 <rtems_rfs_bitmap_map_alloc>
if (rc > 0)
f63c: e3500000 cmp r0, #0
f640: ca000034 bgt f718 <rtems_rfs_group_bitmap_alloc+0x1b4>
return rc;
if (rtems_rfs_fs_release_bitmaps (fs))
f644: e5943000 ldr r3, [r4]
f648: e3130001 tst r3, #1
rtems_rfs_bitmap_release_buffer (fs, bitmap);
f64c: 01a00004 moveq r0, r4
f650: 05991000 ldreq r1, [r9]
f654: 0b0023d8 bleq 185bc <rtems_rfs_buffer_handle_release>
if (allocated)
f658: e5dd300f ldrb r3, [sp, #15]
f65c: e3530000 cmp r3, #0
f660: 0a00001e beq f6e0 <rtems_rfs_group_bitmap_alloc+0x17c>
{
if (inode)
f664: e35b0000 cmp fp, #0
f668: e59d3008 ldr r3, [sp, #8]
f66c: 0a000005 beq f688 <rtems_rfs_group_bitmap_alloc+0x124>
*result = rtems_rfs_group_inode (fs, group, bit);
f670: e594202c ldr r2, [r4, #44] ; 0x2c
f674: e2833001 add r3, r3, #1
f678: e0263692 mla r6, r2, r6, r3
f67c: e59d2000 ldr r2, [sp]
f680: e5826000 str r6, [r2]
f684: ea000006 b f6a4 <rtems_rfs_group_bitmap_alloc+0x140>
else
*result = rtems_rfs_group_block (&fs->groups[group], bit);
f688: e3a01050 mov r1, #80 ; 0x50
f68c: e0060691 mul r6, r1, r6
f690: e5942020 ldr r2, [r4, #32]
f694: e7922006 ldr r2, [r2, r6]
f698: e0833002 add r3, r3, r2
f69c: e59d2000 ldr r2, [sp]
f6a0: e5823000 str r3, [r2]
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_BITMAPS))
f6a4: e3a00802 mov r0, #131072 ; 0x20000
f6a8: e3a01000 mov r1, #0
f6ac: eb0006ee bl 1126c <rtems_rfs_trace>
f6b0: e3500000 cmp r0, #0
f6b4: 0a000017 beq f718 <rtems_rfs_group_bitmap_alloc+0x1b4>
printf ("rtems-rfs: group-bitmap-alloc: %s allocated: %" PRId32 "\n",
f6b8: e59f3060 ldr r3, [pc, #96] ; f720 <rtems_rfs_group_bitmap_alloc+0x1bc><== NOT EXECUTED
f6bc: e35b0000 cmp fp, #0 <== NOT EXECUTED
f6c0: e59f105c ldr r1, [pc, #92] ; f724 <rtems_rfs_group_bitmap_alloc+0x1c0><== NOT EXECUTED
f6c4: 11a01003 movne r1, r3 <== NOT EXECUTED
f6c8: e59d3000 ldr r3, [sp] <== NOT EXECUTED
f6cc: e59f0054 ldr r0, [pc, #84] ; f728 <rtems_rfs_group_bitmap_alloc+0x1c4><== NOT EXECUTED
f6d0: e5932000 ldr r2, [r3] <== NOT EXECUTED
f6d4: eb003cd4 bl 1ea2c <printf> <== NOT EXECUTED
inode ? "inode" : "block", *result);
return 0;
f6d8: e3a00000 mov r0, #0 <== NOT EXECUTED
f6dc: ea00000d b f718 <rtems_rfs_group_bitmap_alloc+0x1b4> <== NOT EXECUTED
}
if (updown)
f6e0: e35a0000 cmp sl, #0
f6e4: 0a000002 beq f6f4 <rtems_rfs_group_bitmap_alloc+0x190>
direction = direction > 0 ? -1 : 1;
f6e8: e3550001 cmp r5, #1
f6ec: 13a05001 movne r5, #1
f6f0: 03e05000 mvneq r5, #0
offset++;
f6f4: e2877001 add r7, r7, #1
f6f8: eaffffaf b f5bc <rtems_rfs_group_bitmap_alloc+0x58>
}
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_BITMAPS))
f6fc: e3a00802 mov r0, #131072 ; 0x20000
f700: e3a01000 mov r1, #0
f704: eb0006d8 bl 1126c <rtems_rfs_trace>
f708: e3500000 cmp r0, #0
printf ("rtems-rfs: group-bitmap-alloc: no blocks available\n");
f70c: 159f0018 ldrne r0, [pc, #24] ; f72c <rtems_rfs_group_bitmap_alloc+0x1c8>
f710: 1b003d5d blne 1ec8c <puts>
return ENOSPC;
f714: e3a0001c mov r0, #28
}
f718: e28dd010 add sp, sp, #16
f71c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000f730 <rtems_rfs_group_bitmap_free>:
int
rtems_rfs_group_bitmap_free (rtems_rfs_file_system* fs,
bool inode,
rtems_rfs_bitmap_bit no)
{
f730: e92d41f0 push {r4, r5, r6, r7, r8, lr}
f734: e1a04000 mov r4, r0
f738: e20150ff and r5, r1, #255 ; 0xff
unsigned int group;
rtems_rfs_bitmap_bit bit;
size_t size;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_BITMAPS))
f73c: e3a00802 mov r0, #131072 ; 0x20000
f740: e3a01000 mov r1, #0
int
rtems_rfs_group_bitmap_free (rtems_rfs_file_system* fs,
bool inode,
rtems_rfs_bitmap_bit no)
{
f744: e1a06002 mov r6, r2
unsigned int group;
rtems_rfs_bitmap_bit bit;
size_t size;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_BITMAPS))
f748: eb0006c7 bl 1126c <rtems_rfs_trace>
f74c: e3500000 cmp r0, #0
f750: 0a000006 beq f770 <rtems_rfs_group_bitmap_free+0x40>
printf ("rtems-rfs: group-bitmap-free: %s free: %" PRId32 "\n",
f754: e59f307c ldr r3, [pc, #124] ; f7d8 <rtems_rfs_group_bitmap_free+0xa8><== NOT EXECUTED
f758: e3550000 cmp r5, #0 <== NOT EXECUTED
f75c: e59f1078 ldr r1, [pc, #120] ; f7dc <rtems_rfs_group_bitmap_free+0xac><== NOT EXECUTED
f760: e59f0078 ldr r0, [pc, #120] ; f7e0 <rtems_rfs_group_bitmap_free+0xb0><== NOT EXECUTED
f764: 11a01003 movne r1, r3 <== NOT EXECUTED
f768: e1a02006 mov r2, r6 <== NOT EXECUTED
f76c: eb003cae bl 1ea2c <printf> <== NOT EXECUTED
inode ? "inode" : "block", no);
if (inode)
f770: e3550000 cmp r5, #0
{
no -= RTEMS_RFS_ROOT_INO;
size = fs->group_inodes;
f774: 1594702c ldrne r7, [r4, #44] ; 0x2c
}
else
{
no -= RTEMS_RFS_SUPERBLOCK_SIZE;
size = fs->group_blocks;
f778: 05947028 ldreq r7, [r4, #40] ; 0x28
f77c: e2466001 sub r6, r6, #1
}
group = no / size;
f780: e1a01007 mov r1, r7
f784: e1a00006 mov r0, r6
f788: ebffc86c bl 1940 <__aeabi_uidiv>
bit = (rtems_rfs_bitmap_bit) (no % size);
f78c: e1a01007 mov r1, r7
{
no -= RTEMS_RFS_SUPERBLOCK_SIZE;
size = fs->group_blocks;
}
group = no / size;
f790: e1a08000 mov r8, r0
bit = (rtems_rfs_bitmap_bit) (no % size);
f794: e1a00006 mov r0, r6
f798: eb006e16 bl 2aff8 <__umodsi3>
f79c: e5943020 ldr r3, [r4, #32]
if (inode)
f7a0: e3550000 cmp r5, #0
f7a4: e3a05050 mov r5, #80 ; 0x50
bitmap = &fs->groups[group].inode_bitmap;
f7a8: e0253598 mla r5, r8, r5, r3
f7ac: 1285502c addne r5, r5, #44 ; 0x2c
else
bitmap = &fs->groups[group].block_bitmap;
f7b0: 02855008 addeq r5, r5, #8
no -= RTEMS_RFS_SUPERBLOCK_SIZE;
size = fs->group_blocks;
}
group = no / size;
bit = (rtems_rfs_bitmap_bit) (no % size);
f7b4: e1a01000 mov r1, r0
if (inode)
bitmap = &fs->groups[group].inode_bitmap;
else
bitmap = &fs->groups[group].block_bitmap;
rc = rtems_rfs_bitmap_map_clear (bitmap, bit);
f7b8: e1a00005 mov r0, r5
f7bc: eb001e5a bl 1712c <rtems_rfs_bitmap_map_clear>
rtems_rfs_bitmap_release_buffer (fs, bitmap);
f7c0: e5951000 ldr r1, [r5]
if (inode)
bitmap = &fs->groups[group].inode_bitmap;
else
bitmap = &fs->groups[group].block_bitmap;
rc = rtems_rfs_bitmap_map_clear (bitmap, bit);
f7c4: e1a06000 mov r6, r0
rtems_rfs_bitmap_release_buffer (fs, bitmap);
f7c8: e1a00004 mov r0, r4
f7cc: eb00237a bl 185bc <rtems_rfs_buffer_handle_release>
return rc;
}
f7d0: e1a00006 mov r0, r6
f7d4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
0000f7e4 <rtems_rfs_group_bitmap_test>:
int
rtems_rfs_group_bitmap_test (rtems_rfs_file_system* fs,
bool inode,
rtems_rfs_bitmap_bit no,
bool* state)
{
f7e4: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr} <== NOT EXECUTED
f7e8: e1a05000 mov r5, r0 <== NOT EXECUTED
f7ec: e20160ff and r6, r1, #255 ; 0xff <== NOT EXECUTED
unsigned int group;
rtems_rfs_bitmap_bit bit;
size_t size;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_BITMAPS))
f7f0: e3a00802 mov r0, #131072 ; 0x20000 <== NOT EXECUTED
f7f4: e3a01000 mov r1, #0 <== NOT EXECUTED
int
rtems_rfs_group_bitmap_test (rtems_rfs_file_system* fs,
bool inode,
rtems_rfs_bitmap_bit no,
bool* state)
{
f7f8: e1a04002 mov r4, r2 <== NOT EXECUTED
f7fc: e1a07003 mov r7, r3 <== NOT EXECUTED
unsigned int group;
rtems_rfs_bitmap_bit bit;
size_t size;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_BITMAPS))
f800: eb000699 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
f804: e3500000 cmp r0, #0 <== NOT EXECUTED
f808: 0a000006 beq f828 <rtems_rfs_group_bitmap_test+0x44> <== NOT EXECUTED
printf ("rtems-rfs: group-bitmap-test: %s test: %" PRId32 "\n",
f80c: e59f30b0 ldr r3, [pc, #176] ; f8c4 <rtems_rfs_group_bitmap_test+0xe0><== NOT EXECUTED
f810: e3560000 cmp r6, #0 <== NOT EXECUTED
f814: e59f10ac ldr r1, [pc, #172] ; f8c8 <rtems_rfs_group_bitmap_test+0xe4><== NOT EXECUTED
f818: e59f00ac ldr r0, [pc, #172] ; f8cc <rtems_rfs_group_bitmap_test+0xe8><== NOT EXECUTED
f81c: 11a01003 movne r1, r3 <== NOT EXECUTED
f820: e1a02004 mov r2, r4 <== NOT EXECUTED
f824: eb003c80 bl 1ea2c <printf> <== NOT EXECUTED
inode ? "inode" : "block", no);
if (inode)
f828: e3560000 cmp r6, #0 <== NOT EXECUTED
f82c: 0a000007 beq f850 <rtems_rfs_group_bitmap_test+0x6c> <== NOT EXECUTED
{
if ((no < RTEMS_RFS_ROOT_INO) || (no > rtems_rfs_fs_inodes (fs)))
f830: e3540000 cmp r4, #0 <== NOT EXECUTED
f834: da00001f ble f8b8 <rtems_rfs_group_bitmap_test+0xd4> <== NOT EXECUTED
f838: e5953014 ldr r3, [r5, #20] <== NOT EXECUTED
f83c: e1540003 cmp r4, r3 <== NOT EXECUTED
return EINVAL;
no -= RTEMS_RFS_ROOT_INO;
f840: 92444001 subls r4, r4, #1 <== NOT EXECUTED
size = fs->group_inodes;
f844: 9595802c ldrls r8, [r5, #44] ; 0x2c <== NOT EXECUTED
printf ("rtems-rfs: group-bitmap-test: %s test: %" PRId32 "\n",
inode ? "inode" : "block", no);
if (inode)
{
if ((no < RTEMS_RFS_ROOT_INO) || (no > rtems_rfs_fs_inodes (fs)))
f848: 8a00001a bhi f8b8 <rtems_rfs_group_bitmap_test+0xd4> <== NOT EXECUTED
f84c: ea000003 b f860 <rtems_rfs_group_bitmap_test+0x7c> <== NOT EXECUTED
no -= RTEMS_RFS_ROOT_INO;
size = fs->group_inodes;
}
else
{
if (no >= rtems_rfs_fs_blocks (fs))
f850: e5953004 ldr r3, [r5, #4] <== NOT EXECUTED
f854: e1540003 cmp r4, r3 <== NOT EXECUTED
f858: 2a000016 bcs f8b8 <rtems_rfs_group_bitmap_test+0xd4> <== NOT EXECUTED
return EINVAL;
size = fs->group_blocks;
f85c: e5958028 ldr r8, [r5, #40] ; 0x28 <== NOT EXECUTED
}
group = no / size;
f860: e1a01008 mov r1, r8 <== NOT EXECUTED
f864: e1a00004 mov r0, r4 <== NOT EXECUTED
f868: ebffc834 bl 1940 <__aeabi_uidiv> <== NOT EXECUTED
bit = (rtems_rfs_bitmap_bit) (no % size);
f86c: e1a01008 mov r1, r8 <== NOT EXECUTED
if (no >= rtems_rfs_fs_blocks (fs))
return EINVAL;
size = fs->group_blocks;
}
group = no / size;
f870: e1a0a000 mov sl, r0 <== NOT EXECUTED
bit = (rtems_rfs_bitmap_bit) (no % size);
f874: e1a00004 mov r0, r4 <== NOT EXECUTED
f878: eb006dde bl 2aff8 <__umodsi3> <== NOT EXECUTED
f87c: e5953020 ldr r3, [r5, #32] <== NOT EXECUTED
f880: e3a04050 mov r4, #80 ; 0x50 <== NOT EXECUTED
if (inode)
bitmap = &fs->groups[group].inode_bitmap;
f884: e024349a mla r4, sl, r4, r3 <== NOT EXECUTED
}
group = no / size;
bit = (rtems_rfs_bitmap_bit) (no % size);
if (inode)
f888: e3560000 cmp r6, #0 <== NOT EXECUTED
bitmap = &fs->groups[group].inode_bitmap;
f88c: 1284402c addne r4, r4, #44 ; 0x2c <== NOT EXECUTED
else
bitmap = &fs->groups[group].block_bitmap;
f890: 02844008 addeq r4, r4, #8 <== NOT EXECUTED
return EINVAL;
size = fs->group_blocks;
}
group = no / size;
bit = (rtems_rfs_bitmap_bit) (no % size);
f894: e1a01000 mov r1, r0 <== NOT EXECUTED
if (inode)
bitmap = &fs->groups[group].inode_bitmap;
else
bitmap = &fs->groups[group].block_bitmap;
rc = rtems_rfs_bitmap_map_test (bitmap, bit, state);
f898: e1a02007 mov r2, r7 <== NOT EXECUTED
f89c: e1a00004 mov r0, r4 <== NOT EXECUTED
f8a0: eb001e40 bl 171a8 <rtems_rfs_bitmap_map_test> <== NOT EXECUTED
rtems_rfs_bitmap_release_buffer (fs, bitmap);
f8a4: e5941000 ldr r1, [r4] <== NOT EXECUTED
if (inode)
bitmap = &fs->groups[group].inode_bitmap;
else
bitmap = &fs->groups[group].block_bitmap;
rc = rtems_rfs_bitmap_map_test (bitmap, bit, state);
f8a8: e1a06000 mov r6, r0 <== NOT EXECUTED
rtems_rfs_bitmap_release_buffer (fs, bitmap);
f8ac: e1a00005 mov r0, r5 <== NOT EXECUTED
f8b0: eb002341 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
return rc;
f8b4: ea000000 b f8bc <rtems_rfs_group_bitmap_test+0xd8> <== NOT EXECUTED
size = fs->group_inodes;
}
else
{
if (no >= rtems_rfs_fs_blocks (fs))
return EINVAL;
f8b8: e3a06016 mov r6, #22 <== NOT EXECUTED
rc = rtems_rfs_bitmap_map_test (bitmap, bit, state);
rtems_rfs_bitmap_release_buffer (fs, bitmap);
return rc;
}
f8bc: e1a00006 mov r0, r6 <== NOT EXECUTED
f8c0: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
0000f2ec <rtems_rfs_group_open>:
rtems_rfs_group_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_block base,
size_t size,
size_t inodes,
rtems_rfs_group* group)
{
f2ec: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
f2f0: e1a08002 mov r8, r2
int rc;
if (base >= rtems_rfs_fs_blocks (fs))
f2f4: e5902004 ldr r2, [r0, #4]
f2f8: e1510002 cmp r1, r2
rtems_rfs_group_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_block base,
size_t size,
size_t inodes,
rtems_rfs_group* group)
{
f2fc: e1a06000 mov r6, r0
f300: e1a07001 mov r7, r1
f304: e59d4028 ldr r4, [sp, #40] ; 0x28
int rc;
if (base >= rtems_rfs_fs_blocks (fs))
f308: 3a00000b bcc f33c <rtems_rfs_group_open+0x50>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_OPEN))
f30c: e3a00902 mov r0, #32768 ; 0x8000 <== NOT EXECUTED
f310: e3a01000 mov r1, #0 <== NOT EXECUTED
f314: eb0007d4 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
f318: e3500000 cmp r0, #0 <== NOT EXECUTED
f31c: 0a000067 beq f4c0 <rtems_rfs_group_open+0x1d4> <== NOT EXECUTED
printf ("rtems-rfs: group-open: base outside file system range: %d: %s\n",
f320: e3a00005 mov r0, #5 <== NOT EXECUTED
f324: eb00426e bl 1fce4 <strerror> <== NOT EXECUTED
f328: e3a01005 mov r1, #5 <== NOT EXECUTED
f32c: e1a02000 mov r2, r0 <== NOT EXECUTED
f330: e59f0194 ldr r0, [pc, #404] ; f4cc <rtems_rfs_group_open+0x1e0><== NOT EXECUTED
f334: eb003dbc bl 1ea2c <printf> <== NOT EXECUTED
f338: ea000060 b f4c0 <rtems_rfs_group_open+0x1d4> <== NOT EXECUTED
EIO, strerror (EIO));
return EIO;
}
if ((base + size) >= rtems_rfs_fs_blocks (fs))
f33c: e0881001 add r1, r8, r1
f340: e1510002 cmp r1, r2
size = rtems_rfs_fs_blocks (fs) - base;
f344: 20678002 rsbcs r8, r7, r2
* the format configuration needs reviewing.
*/
if (inodes > size)
inodes = size;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_OPEN))
f348: e3a00902 mov r0, #32768 ; 0x8000
f34c: e3a01000 mov r1, #0
EIO, strerror (EIO));
return EIO;
}
if ((base + size) >= rtems_rfs_fs_blocks (fs))
size = rtems_rfs_fs_blocks (fs) - base;
f350: e1580003 cmp r8, r3
f354: 31a09008 movcc r9, r8
f358: 21a09003 movcs r9, r3
* the format configuration needs reviewing.
*/
if (inodes > size)
inodes = size;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_OPEN))
f35c: eb0007c2 bl 1126c <rtems_rfs_trace>
f360: e3500000 cmp r0, #0
printf ("rtems-rfs: group-open: base=%" PRId32 ", blocks=%zd inodes=%zd\n",
f364: 159f0164 ldrne r0, [pc, #356] ; f4d0 <rtems_rfs_group_open+0x1e4>
f368: 11a01007 movne r1, r7
f36c: 11a02008 movne r2, r8
f370: 11a03009 movne r3, r9
f374: 1b003dac blne 1ea2c <printf>
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
f378: e3a05000 mov r5, #0
printf ("rtems-rfs: group-open: could not open block bitmap handle: %d: %s\n",
rc, strerror (rc));
return rc;
}
rc = rtems_rfs_bitmap_open (&group->block_bitmap, fs,
f37c: e284b008 add fp, r4, #8
f380: e284a020 add sl, r4, #32
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_OPEN))
printf ("rtems-rfs: group-open: base=%" PRId32 ", blocks=%zd inodes=%zd\n",
base, size, inodes);
group->base = base;
group->size = size;
f384: e8840180 stm r4, {r7, r8}
f388: e5c45020 strb r5, [r4, #32]
handle->bnum = 0;
f38c: e5845024 str r5, [r4, #36] ; 0x24
handle->buffer = NULL;
f390: e5845028 str r5, [r4, #40] ; 0x28
printf ("rtems-rfs: group-open: could not open block bitmap handle: %d: %s\n",
rc, strerror (rc));
return rc;
}
rc = rtems_rfs_bitmap_open (&group->block_bitmap, fs,
f394: e1a03008 mov r3, r8
f398: e1a0000b mov r0, fp
f39c: e1a01006 mov r1, r6
f3a0: e1a0200a mov r2, sl
f3a4: e58d7000 str r7, [sp]
f3a8: eb002040 bl 174b0 <rtems_rfs_bitmap_open>
&group->block_bitmap_buffer, size,
group->base + RTEMS_RFS_GROUP_BLOCK_BITMAP_BLOCK);
if (rc > 0)
f3ac: e2508000 subs r8, r0, #0
f3b0: da00000f ble f3f4 <rtems_rfs_group_open+0x108>
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
f3b4: e1a0100a mov r1, sl <== NOT EXECUTED
f3b8: e1a00006 mov r0, r6 <== NOT EXECUTED
f3bc: eb00247e bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
handle->dirty = false;
f3c0: e5c45020 strb r5, [r4, #32] <== NOT EXECUTED
handle->bnum = 0;
f3c4: e5845024 str r5, [r4, #36] ; 0x24 <== NOT EXECUTED
handle->buffer = NULL;
f3c8: e5845028 str r5, [r4, #40] ; 0x28 <== NOT EXECUTED
{
rtems_rfs_buffer_handle_close (fs, &group->block_bitmap_buffer);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_OPEN))
f3cc: e3a00902 mov r0, #32768 ; 0x8000 <== NOT EXECUTED
f3d0: e3a01000 mov r1, #0 <== NOT EXECUTED
f3d4: eb0007a4 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
f3d8: e1500005 cmp r0, r5 <== NOT EXECUTED
f3dc: 0a000038 beq f4c4 <rtems_rfs_group_open+0x1d8> <== NOT EXECUTED
printf ("rtems-rfs: group-open: could not open block bitmap: %d: %s\n",
f3e0: e1a00008 mov r0, r8 <== NOT EXECUTED
f3e4: eb00423e bl 1fce4 <strerror> <== NOT EXECUTED
f3e8: e1a02000 mov r2, r0 <== NOT EXECUTED
f3ec: e59f00e0 ldr r0, [pc, #224] ; f4d4 <rtems_rfs_group_open+0x1e8><== NOT EXECUTED
f3f0: ea000024 b f488 <rtems_rfs_group_open+0x19c> <== NOT EXECUTED
printf ("rtems-rfs: group-open: could not open inode bitmap handle: %d: %s\n",
rc, strerror (rc));
return rc;
}
rc = rtems_rfs_bitmap_open (&group->inode_bitmap, fs,
f3f4: e5943000 ldr r3, [r4]
f3f8: e2847044 add r7, r4, #68 ; 0x44
f3fc: e2833001 add r3, r3, #1
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
f400: e5c45044 strb r5, [r4, #68] ; 0x44
handle->bnum = 0;
f404: e5845048 str r5, [r4, #72] ; 0x48
handle->buffer = NULL;
f408: e584504c str r5, [r4, #76] ; 0x4c
f40c: e284002c add r0, r4, #44 ; 0x2c
f410: e58d3000 str r3, [sp]
f414: e1a01006 mov r1, r6
f418: e1a02007 mov r2, r7
f41c: e1a03009 mov r3, r9
f420: eb002022 bl 174b0 <rtems_rfs_bitmap_open>
&group->inode_bitmap_buffer, inodes,
group->base + RTEMS_RFS_GROUP_INODE_BITMAP_BLOCK);
if (rc > 0)
f424: e2508000 subs r8, r0, #0
f428: da000019 ble f494 <rtems_rfs_group_open+0x1a8>
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
f42c: e1a01007 mov r1, r7 <== NOT EXECUTED
f430: e1a00006 mov r0, r6 <== NOT EXECUTED
f434: eb002460 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
handle->dirty = false;
f438: e5c45044 strb r5, [r4, #68] ; 0x44 <== NOT EXECUTED
handle->bnum = 0;
f43c: e5845048 str r5, [r4, #72] ; 0x48 <== NOT EXECUTED
handle->buffer = NULL;
f440: e584504c str r5, [r4, #76] ; 0x4c <== NOT EXECUTED
{
rtems_rfs_buffer_handle_close (fs, &group->inode_bitmap_buffer);
rtems_rfs_bitmap_close (&group->block_bitmap);
f444: e1a0000b mov r0, fp <== NOT EXECUTED
f448: eb00202c bl 17500 <rtems_rfs_bitmap_close> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
f44c: e1a0100a mov r1, sl <== NOT EXECUTED
f450: e1a00006 mov r0, r6 <== NOT EXECUTED
f454: eb002458 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
handle->dirty = false;
f458: e5c45020 strb r5, [r4, #32] <== NOT EXECUTED
handle->bnum = 0;
f45c: e5845024 str r5, [r4, #36] ; 0x24 <== NOT EXECUTED
handle->buffer = NULL;
f460: e5845028 str r5, [r4, #40] ; 0x28 <== NOT EXECUTED
rtems_rfs_buffer_handle_close (fs, &group->block_bitmap_buffer);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_OPEN))
f464: e3a00902 mov r0, #32768 ; 0x8000 <== NOT EXECUTED
f468: e3a01000 mov r1, #0 <== NOT EXECUTED
f46c: eb00077e bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
f470: e3500000 cmp r0, #0 <== NOT EXECUTED
f474: 0a000012 beq f4c4 <rtems_rfs_group_open+0x1d8> <== NOT EXECUTED
printf ("rtems-rfs: group-open: could not open inode bitmap: %d: %s\n",
f478: e1a00008 mov r0, r8 <== NOT EXECUTED
f47c: eb004218 bl 1fce4 <strerror> <== NOT EXECUTED
f480: e1a02000 mov r2, r0 <== NOT EXECUTED
f484: e59f004c ldr r0, [pc, #76] ; f4d8 <rtems_rfs_group_open+0x1ec><== NOT EXECUTED
f488: e1a01008 mov r1, r8 <== NOT EXECUTED
f48c: eb003d66 bl 1ea2c <printf> <== NOT EXECUTED
f490: ea00000b b f4c4 <rtems_rfs_group_open+0x1d8> <== NOT EXECUTED
rc, strerror (rc));
return rc;
}
if (rtems_rfs_fs_release_bitmaps (fs))
f494: e5968000 ldr r8, [r6]
f498: e2188001 ands r8, r8, #1
{
rtems_rfs_bitmap_release_buffer (fs, &group->block_bitmap);
rtems_rfs_bitmap_release_buffer (fs, &group->inode_bitmap);
}
return 0;
f49c: 11a08005 movne r8, r5
printf ("rtems-rfs: group-open: could not open inode bitmap: %d: %s\n",
rc, strerror (rc));
return rc;
}
if (rtems_rfs_fs_release_bitmaps (fs))
f4a0: 1a000007 bne f4c4 <rtems_rfs_group_open+0x1d8>
{
rtems_rfs_bitmap_release_buffer (fs, &group->block_bitmap);
f4a4: e5941008 ldr r1, [r4, #8]
f4a8: e1a00006 mov r0, r6
f4ac: eb002442 bl 185bc <rtems_rfs_buffer_handle_release>
rtems_rfs_bitmap_release_buffer (fs, &group->inode_bitmap);
f4b0: e1a00006 mov r0, r6
f4b4: e594102c ldr r1, [r4, #44] ; 0x2c
f4b8: eb00243f bl 185bc <rtems_rfs_buffer_handle_release>
f4bc: ea000000 b f4c4 <rtems_rfs_group_open+0x1d8>
if (base >= rtems_rfs_fs_blocks (fs))
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_GROUP_OPEN))
printf ("rtems-rfs: group-open: base outside file system range: %d: %s\n",
EIO, strerror (EIO));
return EIO;
f4c0: e3a08005 mov r8, #5 <== NOT EXECUTED
rtems_rfs_bitmap_release_buffer (fs, &group->block_bitmap);
rtems_rfs_bitmap_release_buffer (fs, &group->inode_bitmap);
}
return 0;
}
f4c4: e1a00008 mov r0, r8
f4c8: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000f8d0 <rtems_rfs_group_usage>:
size_t* blocks,
size_t* inodes)
{
int g;
*blocks = 0;
f8d0: e3a03000 mov r3, #0 <== NOT EXECUTED
int
rtems_rfs_group_usage (rtems_rfs_file_system* fs,
size_t* blocks,
size_t* inodes)
{
f8d4: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED
int g;
*blocks = 0;
f8d8: e5813000 str r3, [r1] <== NOT EXECUTED
*inodes = 0;
for (g = 0; g < fs->group_count; g++)
f8dc: e5905024 ldr r5, [r0, #36] ; 0x24 <== NOT EXECUTED
size_t* inodes)
{
int g;
*blocks = 0;
*inodes = 0;
f8e0: e5823000 str r3, [r2] <== NOT EXECUTED
for (g = 0; g < fs->group_count; g++)
f8e4: e1a04003 mov r4, r3 <== NOT EXECUTED
f8e8: ea00000f b f92c <rtems_rfs_group_usage+0x5c> <== NOT EXECUTED
{
rtems_rfs_group* group = &fs->groups[g];
f8ec: e590c020 ldr ip, [r0, #32] <== NOT EXECUTED
f8f0: e08cc003 add ip, ip, r3 <== NOT EXECUTED
*blocks +=
rtems_rfs_bitmap_map_size(&group->block_bitmap) -
f8f4: e28c7014 add r7, ip, #20 <== NOT EXECUTED
f8f8: e89700c0 ldm r7, {r6, r7} <== NOT EXECUTED
f8fc: e0466007 sub r6, r6, r7 <== NOT EXECUTED
*inodes = 0;
for (g = 0; g < fs->group_count; g++)
{
rtems_rfs_group* group = &fs->groups[g];
*blocks +=
f900: e5917000 ldr r7, [r1] <== NOT EXECUTED
f904: e0876006 add r6, r7, r6 <== NOT EXECUTED
f908: e5816000 str r6, [r1] <== NOT EXECUTED
rtems_rfs_bitmap_map_size(&group->block_bitmap) -
rtems_rfs_bitmap_map_free (&group->block_bitmap);
*inodes +=
rtems_rfs_bitmap_map_size (&group->inode_bitmap) -
f90c: e28c6038 add r6, ip, #56 ; 0x38 <== NOT EXECUTED
f910: e8961040 ldm r6, {r6, ip} <== NOT EXECUTED
f914: e046c00c sub ip, r6, ip <== NOT EXECUTED
{
rtems_rfs_group* group = &fs->groups[g];
*blocks +=
rtems_rfs_bitmap_map_size(&group->block_bitmap) -
rtems_rfs_bitmap_map_free (&group->block_bitmap);
*inodes +=
f918: e5926000 ldr r6, [r2] <== NOT EXECUTED
f91c: e086c00c add ip, r6, ip <== NOT EXECUTED
f920: e582c000 str ip, [r2] <== NOT EXECUTED
int g;
*blocks = 0;
*inodes = 0;
for (g = 0; g < fs->group_count; g++)
f924: e2844001 add r4, r4, #1 <== NOT EXECUTED
f928: e2833050 add r3, r3, #80 ; 0x50 <== NOT EXECUTED
f92c: e1540005 cmp r4, r5 <== NOT EXECUTED
f930: baffffed blt f8ec <rtems_rfs_group_usage+0x1c> <== NOT EXECUTED
*inodes +=
rtems_rfs_bitmap_map_size (&group->inode_bitmap) -
rtems_rfs_bitmap_map_free (&group->inode_bitmap);
}
if (*blocks > rtems_rfs_fs_blocks (fs))
f934: e5903004 ldr r3, [r0, #4] <== NOT EXECUTED
f938: e591c000 ldr ip, [r1] <== NOT EXECUTED
f93c: e15c0003 cmp ip, r3 <== NOT EXECUTED
f940: 9581c000 strls ip, [r1] <== NOT EXECUTED
f944: 85813000 strhi r3, [r1] <== NOT EXECUTED
*blocks = rtems_rfs_fs_blocks (fs);
if (*inodes > rtems_rfs_fs_inodes (fs))
f948: e5903014 ldr r3, [r0, #20] <== NOT EXECUTED
f94c: e5921000 ldr r1, [r2] <== NOT EXECUTED
*inodes = rtems_rfs_fs_inodes (fs);
return 0;
}
f950: e3a00000 mov r0, #0 <== NOT EXECUTED
rtems_rfs_bitmap_map_free (&group->inode_bitmap);
}
if (*blocks > rtems_rfs_fs_blocks (fs))
*blocks = rtems_rfs_fs_blocks (fs);
if (*inodes > rtems_rfs_fs_inodes (fs))
f954: e1510003 cmp r1, r3 <== NOT EXECUTED
f958: 95821000 strls r1, [r2] <== NOT EXECUTED
f95c: 85823000 strhi r3, [r2] <== NOT EXECUTED
*inodes = rtems_rfs_fs_inodes (fs);
return 0;
}
f960: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
0000fc08 <rtems_rfs_inode_close>:
}
int
rtems_rfs_inode_close (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* handle)
{
fc08: e92d4030 push {r4, r5, lr}
fc0c: e1a05000 mov r5, r0
fc10: e1a04001 mov r4, r1
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_CLOSE))
fc14: e3a00702 mov r0, #524288 ; 0x80000
fc18: e3a01000 mov r1, #0
fc1c: eb000592 bl 1126c <rtems_rfs_trace>
fc20: e3500000 cmp r0, #0
printf ("rtems-rfs: inode-close: ino: %" PRIu32 "\n", handle->ino);
fc24: 159f0054 ldrne r0, [pc, #84] ; fc80 <rtems_rfs_inode_close+0x78>
fc28: 15941008 ldrne r1, [r4, #8]
fc2c: 1b003b7e blne 1ea2c <printf>
rc = rtems_rfs_inode_unload (fs, handle, true);
fc30: e1a00005 mov r0, r5
fc34: e1a01004 mov r1, r4
fc38: e3a02001 mov r2, #1
fc3c: ebffffb6 bl fb1c <rtems_rfs_inode_unload>
if ((rc == 0) && (handle->loads > 0))
fc40: e3500000 cmp r0, #0
fc44: 1a00000a bne fc74 <rtems_rfs_inode_close+0x6c>
fc48: e5943024 ldr r3, [r4, #36] ; 0x24
fc4c: e3530000 cmp r3, #0
fc50: da000007 ble fc74 <rtems_rfs_inode_close+0x6c>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_CLOSE))
fc54: e3a00702 mov r0, #524288 ; 0x80000 <== NOT EXECUTED
fc58: e3a01000 mov r1, #0 <== NOT EXECUTED
fc5c: eb000582 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
fc60: e3500000 cmp r0, #0 <== NOT EXECUTED
printf ("rtems-rfs: inode-close: bad loads number: %d\n",
fc64: 159f0018 ldrne r0, [pc, #24] ; fc84 <rtems_rfs_inode_close+0x7c><== NOT EXECUTED
fc68: 15941024 ldrne r1, [r4, #36] ; 0x24 <== NOT EXECUTED
fc6c: 1b003b6e blne 1ea2c <printf> <== NOT EXECUTED
handle->loads);
rc = EIO;
fc70: e3a00005 mov r0, #5 <== NOT EXECUTED
}
handle->ino = 0;
fc74: e3a03000 mov r3, #0
fc78: e5843008 str r3, [r4, #8]
return rc;
}
fc7c: e8bd8030 pop {r4, r5, pc}
0000ff7c <rtems_rfs_inode_create>:
uint16_t mode,
uint16_t links,
uid_t uid,
gid_t gid,
rtems_rfs_ino* ino)
{
ff7c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
ff80: e24dd060 sub sp, sp, #96 ; 0x60
ff84: e1a09003 mov r9, r3
ff88: e1dd38b8 ldrh r3, [sp, #136] ; 0x88
ff8c: e58d3004 str r3, [sp, #4]
ff90: e1dd38bc ldrh r3, [sp, #140] ; 0x8c
ff94: e58d3008 str r3, [sp, #8]
ff98: e1dd39b0 ldrh r3, [sp, #144] ; 0x90
ff9c: e1a04000 mov r4, r0
ffa0: e1a08001 mov r8, r1
rtems_rfs_inode_handle parent_inode;
rtems_rfs_inode_handle inode;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_CREATE))
ffa4: e3a00501 mov r0, #4194304 ; 0x400000
ffa8: e3a01000 mov r1, #0
uint16_t mode,
uint16_t links,
uid_t uid,
gid_t gid,
rtems_rfs_ino* ino)
{
ffac: e1a0a002 mov sl, r2
ffb0: e59d5094 ldr r5, [sp, #148] ; 0x94
ffb4: e1dd78b4 ldrh r7, [sp, #132] ; 0x84
ffb8: e58d300c str r3, [sp, #12]
rtems_rfs_inode_handle parent_inode;
rtems_rfs_inode_handle inode;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_CREATE))
ffbc: eb0004aa bl 1126c <rtems_rfs_trace>
ffc0: e3500000 cmp r0, #0
ffc4: 0a000020 beq 1004c <rtems_rfs_inode_create+0xd0>
{
const char* type = "unknown";
int c;
if (RTEMS_RFS_S_ISDIR (mode))
ffc8: e2073a0f and r3, r7, #61440 ; 0xf000 <== NOT EXECUTED
ffcc: e3530901 cmp r3, #16384 ; 0x4000 <== NOT EXECUTED
type = "dir";
ffd0: 059f6270 ldreq r6, [pc, #624] ; 10248 <rtems_rfs_inode_create+0x2cc><== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_CREATE))
{
const char* type = "unknown";
int c;
if (RTEMS_RFS_S_ISDIR (mode))
ffd4: 0a00000c beq 1000c <rtems_rfs_inode_create+0x90> <== NOT EXECUTED
type = "dir";
else if (RTEMS_RFS_S_ISCHR (mode))
ffd8: e3530a02 cmp r3, #8192 ; 0x2000 <== NOT EXECUTED
type = "char";
ffdc: 059f6268 ldreq r6, [pc, #616] ; 1024c <rtems_rfs_inode_create+0x2d0><== NOT EXECUTED
{
const char* type = "unknown";
int c;
if (RTEMS_RFS_S_ISDIR (mode))
type = "dir";
else if (RTEMS_RFS_S_ISCHR (mode))
ffe0: 0a000009 beq 1000c <rtems_rfs_inode_create+0x90> <== NOT EXECUTED
type = "char";
else if (RTEMS_RFS_S_ISBLK (mode))
ffe4: e3530a06 cmp r3, #24576 ; 0x6000 <== NOT EXECUTED
type = "block";
ffe8: 059f6260 ldreq r6, [pc, #608] ; 10250 <rtems_rfs_inode_create+0x2d4><== NOT EXECUTED
int c;
if (RTEMS_RFS_S_ISDIR (mode))
type = "dir";
else if (RTEMS_RFS_S_ISCHR (mode))
type = "char";
else if (RTEMS_RFS_S_ISBLK (mode))
ffec: 0a000006 beq 1000c <rtems_rfs_inode_create+0x90> <== NOT EXECUTED
type = "block";
else if (RTEMS_RFS_S_ISREG (mode))
fff0: e3530902 cmp r3, #32768 ; 0x8000 <== NOT EXECUTED
type = "file";
fff4: 059f6258 ldreq r6, [pc, #600] ; 10254 <rtems_rfs_inode_create+0x2d8><== NOT EXECUTED
type = "dir";
else if (RTEMS_RFS_S_ISCHR (mode))
type = "char";
else if (RTEMS_RFS_S_ISBLK (mode))
type = "block";
else if (RTEMS_RFS_S_ISREG (mode))
fff8: 0a000003 beq 1000c <rtems_rfs_inode_create+0x90> <== NOT EXECUTED
rtems_rfs_inode_handle inode;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_CREATE))
{
const char* type = "unknown";
fffc: e59f2254 ldr r2, [pc, #596] ; 10258 <rtems_rfs_inode_create+0x2dc><== NOT EXECUTED
10000: e3530a0a cmp r3, #40960 ; 0xa000 <== NOT EXECUTED
10004: e59f6250 ldr r6, [pc, #592] ; 1025c <rtems_rfs_inode_create+0x2e0><== NOT EXECUTED
10008: 11a06002 movne r6, r2 <== NOT EXECUTED
type = "block";
else if (RTEMS_RFS_S_ISREG (mode))
type = "file";
else if (RTEMS_RFS_S_ISLNK (mode))
type = "link";
printf("rtems-rfs: inode-create: parent:%" PRIu32 " name:", parent);
1000c: e59f024c ldr r0, [pc, #588] ; 10260 <rtems_rfs_inode_create+0x2e4><== NOT EXECUTED
10010: e1a01008 mov r1, r8 <== NOT EXECUTED
10014: eb003a84 bl 1ea2c <printf> <== NOT EXECUTED
for (c = 0; c < length; c++)
10018: e3a0b000 mov fp, #0 <== NOT EXECUTED
1001c: ea000002 b 1002c <rtems_rfs_inode_create+0xb0> <== NOT EXECUTED
printf ("%c", name[c]);
10020: e7da000b ldrb r0, [sl, fp] <== NOT EXECUTED
10024: eb003aea bl 1ebd4 <putchar> <== NOT EXECUTED
else if (RTEMS_RFS_S_ISREG (mode))
type = "file";
else if (RTEMS_RFS_S_ISLNK (mode))
type = "link";
printf("rtems-rfs: inode-create: parent:%" PRIu32 " name:", parent);
for (c = 0; c < length; c++)
10028: e28bb001 add fp, fp, #1 <== NOT EXECUTED
1002c: e15b0009 cmp fp, r9 <== NOT EXECUTED
10030: 1afffffa bne 10020 <rtems_rfs_inode_create+0xa4> <== NOT EXECUTED
printf ("%c", name[c]);
printf (" type:%s mode:%04x (%03o)\n", type, mode, mode & ((1 << 10) - 1));
10034: e1a03b07 lsl r3, r7, #22 <== NOT EXECUTED
10038: e59f0224 ldr r0, [pc, #548] ; 10264 <rtems_rfs_inode_create+0x2e8><== NOT EXECUTED
1003c: e1a01006 mov r1, r6 <== NOT EXECUTED
10040: e1a02007 mov r2, r7 <== NOT EXECUTED
10044: e1a03b23 lsr r3, r3, #22 <== NOT EXECUTED
10048: eb003a77 bl 1ea2c <printf> <== NOT EXECUTED
}
/*
* The file type is field within the mode. Check we have a sane mode set.
*/
switch (mode & RTEMS_RFS_S_IFMT)
1004c: e2076a0f and r6, r7, #61440 ; 0xf000
10050: e3560a06 cmp r6, #24576 ; 0x6000
10054: 0a000009 beq 10080 <rtems_rfs_inode_create+0x104>
10058: ca000003 bgt 1006c <rtems_rfs_inode_create+0xf0>
1005c: e3560a02 cmp r6, #8192 ; 0x2000
10060: 0a000006 beq 10080 <rtems_rfs_inode_create+0x104>
10064: e3560901 cmp r6, #16384 ; 0x4000
10068: ea000002 b 10078 <rtems_rfs_inode_create+0xfc>
1006c: e3560902 cmp r6, #32768 ; 0x8000
10070: 0a000002 beq 10080 <rtems_rfs_inode_create+0x104>
10074: e3560a0a cmp r6, #40960 ; 0xa000
case RTEMS_RFS_S_IFBLK:
case RTEMS_RFS_S_IFREG:
case RTEMS_RFS_S_IFLNK:
break;
default:
return EINVAL;
10078: 13a0b016 movne fp, #22
}
/*
* The file type is field within the mode. Check we have a sane mode set.
*/
switch (mode & RTEMS_RFS_S_IFMT)
1007c: 1a00006e bne 1023c <rtems_rfs_inode_create+0x2c0>
break;
default:
return EINVAL;
}
rc = rtems_rfs_inode_alloc (fs, parent, ino);
10080: e1a00004 mov r0, r4
10084: e1a01008 mov r1, r8
10088: e1a02005 mov r2, r5
1008c: ebfffe34 bl f964 <rtems_rfs_inode_alloc>
if (rc > 0)
10090: e250b000 subs fp, r0, #0
10094: ca000068 bgt 1023c <rtems_rfs_inode_create+0x2c0>
return rc;
rc = rtems_rfs_inode_open (fs, *ino, &inode, true);
10098: e1a00004 mov r0, r4
1009c: e5951000 ldr r1, [r5]
100a0: e28d2038 add r2, sp, #56 ; 0x38
100a4: e3a03001 mov r3, #1
100a8: ebfffe61 bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
100ac: e250b000 subs fp, r0, #0
100b0: ca00005e bgt 10230 <rtems_rfs_inode_create+0x2b4>
{
rtems_rfs_inode_free (fs, *ino);
return rc;
}
rc = rtems_rfs_inode_initialise (&inode, links, mode, uid, gid);
100b4: e59d300c ldr r3, [sp, #12]
100b8: e28d0038 add r0, sp, #56 ; 0x38
100bc: e58d3000 str r3, [sp]
100c0: e59d1004 ldr r1, [sp, #4]
100c4: e1a02007 mov r2, r7
100c8: e59d3008 ldr r3, [sp, #8]
100cc: ebffff4f bl fe10 <rtems_rfs_inode_initialise>
if (rc > 0)
100d0: e250b000 subs fp, r0, #0
100d4: da000003 ble 100e8 <rtems_rfs_inode_create+0x16c>
{
rtems_rfs_inode_close (fs, &inode);
100d8: e1a00004 mov r0, r4 <== NOT EXECUTED
100dc: e28d1038 add r1, sp, #56 ; 0x38 <== NOT EXECUTED
100e0: ebfffec8 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
100e4: ea000051 b 10230 <rtems_rfs_inode_create+0x2b4> <== NOT EXECUTED
/*
* Only handle the specifics of a directory. Let caller handle the others.
*
* The inode delete will free the inode.
*/
if (RTEMS_RFS_S_ISDIR (mode))
100e8: e3560901 cmp r6, #16384 ; 0x4000
100ec: 1a000011 bne 10138 <rtems_rfs_inode_create+0x1bc>
{
rc = rtems_rfs_dir_add_entry (fs, &inode, ".", 1, *ino);
100f0: e5953000 ldr r3, [r5]
100f4: e1a00004 mov r0, r4
100f8: e58d3000 str r3, [sp]
100fc: e28d1038 add r1, sp, #56 ; 0x38
10100: e59f2160 ldr r2, [pc, #352] ; 10268 <rtems_rfs_inode_create+0x2ec>
10104: e3a03001 mov r3, #1
10108: eb00245a bl 19278 <rtems_rfs_dir_add_entry>
if (rc == 0)
1010c: e250b000 subs fp, r0, #0
10110: 1a000006 bne 10130 <rtems_rfs_inode_create+0x1b4>
rc = rtems_rfs_dir_add_entry (fs, &inode, "..", 2, parent);
10114: e1a00004 mov r0, r4
10118: e28d1038 add r1, sp, #56 ; 0x38
1011c: e59f2148 ldr r2, [pc, #328] ; 1026c <rtems_rfs_inode_create+0x2f0>
10120: e3a03002 mov r3, #2
10124: e58d8000 str r8, [sp]
10128: eb002452 bl 19278 <rtems_rfs_dir_add_entry>
1012c: e1a0b000 mov fp, r0
if (rc > 0)
10130: e35b0000 cmp fp, #0
10134: ca000006 bgt 10154 <rtems_rfs_inode_create+0x1d8>
rtems_rfs_inode_close (fs, &inode);
return rc;
}
}
rc = rtems_rfs_inode_open (fs, parent, &parent_inode, true);
10138: e1a00004 mov r0, r4
1013c: e1a01008 mov r1, r8
10140: e28d2010 add r2, sp, #16
10144: e3a03001 mov r3, #1
10148: ebfffe39 bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
1014c: e250b000 subs fp, r0, #0
10150: da000002 ble 10160 <rtems_rfs_inode_create+0x1e4>
{
rtems_rfs_inode_delete (fs, &inode);
10154: e1a00004 mov r0, r4 <== NOT EXECUTED
10158: e28d1038 add r1, sp, #56 ; 0x38 <== NOT EXECUTED
1015c: ea00002a b 1020c <rtems_rfs_inode_create+0x290> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &inode);
return rc;
}
rc = rtems_rfs_dir_add_entry (fs, &parent_inode, name, length, *ino);
10160: e5953000 ldr r3, [r5]
10164: e1a00004 mov r0, r4
10168: e58d3000 str r3, [sp]
1016c: e28d1010 add r1, sp, #16
10170: e1a0200a mov r2, sl
10174: e1a03009 mov r3, r9
10178: eb00243e bl 19278 <rtems_rfs_dir_add_entry>
if (rc > 0)
1017c: e250b000 subs fp, r0, #0
10180: da000008 ble 101a8 <rtems_rfs_inode_create+0x22c>
{
rtems_rfs_inode_delete (fs, &inode);
10184: e28d1038 add r1, sp, #56 ; 0x38 <== NOT EXECUTED
10188: e1a00004 mov r0, r4 <== NOT EXECUTED
1018c: ebfffebd bl fc88 <rtems_rfs_inode_delete> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &inode);
10190: e28d1038 add r1, sp, #56 ; 0x38 <== NOT EXECUTED
10194: e1a00004 mov r0, r4 <== NOT EXECUTED
10198: ebfffe9a bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &parent_inode);
1019c: e1a00004 mov r0, r4 <== NOT EXECUTED
101a0: e28d1010 add r1, sp, #16 <== NOT EXECUTED
101a4: ea00001b b 10218 <rtems_rfs_inode_create+0x29c> <== NOT EXECUTED
/*
* If the node is a directory update the parent link count as the
* new directory has the '..' link that points to the parent.
*/
if (RTEMS_RFS_S_ISDIR (mode))
101a8: e3560901 cmp r6, #16384 ; 0x4000
101ac: 1a00000f bne 101f0 <rtems_rfs_inode_create+0x274>
*/
static inline uint16_t
rtems_rfs_inode_get_links (rtems_rfs_inode_handle* handle)
{
uint16_t links;
links = rtems_rfs_read_u16 (&handle->node->links);
101b0: e59d201c ldr r2, [sp, #28]
101b4: e5d21000 ldrb r1, [r2]
101b8: e5d23001 ldrb r3, [r2, #1]
101bc: e1833401 orr r3, r3, r1, lsl #8
if (links == 0xffff)
links = 0;
101c0: e59f10a8 ldr r1, [pc, #168] ; 10270 <rtems_rfs_inode_create+0x2f4>
101c4: e1530001 cmp r3, r1
101c8: 03a03000 moveq r3, #0
rtems_rfs_inode_set_links (&parent_inode,
101cc: e2833001 add r3, r3, #1
101d0: e1a03803 lsl r3, r3, #16
101d4: e1a01823 lsr r1, r3, #16
* @prarm links The links.
*/
static inline void
rtems_rfs_inode_set_links (rtems_rfs_inode_handle* handle, uint16_t links)
{
rtems_rfs_write_u16 (&handle->node->links, links);
101d8: e1a03c23 lsr r3, r3, #24
101dc: e5c23000 strb r3, [r2]
101e0: e59d301c ldr r3, [sp, #28]
101e4: e5c31001 strb r1, [r3, #1]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
101e8: e3a03001 mov r3, #1
101ec: e5cd3020 strb r3, [sp, #32]
rtems_rfs_inode_get_links (&parent_inode) + 1);
rc = rtems_rfs_inode_close (fs, &parent_inode);
101f0: e28d1010 add r1, sp, #16
101f4: e1a00004 mov r0, r4
101f8: ebfffe82 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
101fc: e250b000 subs fp, r0, #0
{
rtems_rfs_inode_delete (fs, &inode);
10200: e28d1038 add r1, sp, #56 ; 0x38
10204: e1a00004 mov r0, r4
if (RTEMS_RFS_S_ISDIR (mode))
rtems_rfs_inode_set_links (&parent_inode,
rtems_rfs_inode_get_links (&parent_inode) + 1);
rc = rtems_rfs_inode_close (fs, &parent_inode);
if (rc > 0)
10208: da000004 ble 10220 <rtems_rfs_inode_create+0x2a4>
{
rtems_rfs_inode_delete (fs, &inode);
1020c: ebfffe9d bl fc88 <rtems_rfs_inode_delete> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &inode);
10210: e1a00004 mov r0, r4 <== NOT EXECUTED
10214: e28d1038 add r1, sp, #56 ; 0x38 <== NOT EXECUTED
10218: ebfffe7a bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return rc;
1021c: ea000006 b 1023c <rtems_rfs_inode_create+0x2c0> <== NOT EXECUTED
}
rc = rtems_rfs_inode_close (fs, &inode);
10220: ebfffe78 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
10224: e250b000 subs fp, r0, #0
{
rtems_rfs_inode_free (fs, *ino);
return rc;
}
return 0;
10228: d3a0b000 movle fp, #0
rtems_rfs_inode_close (fs, &inode);
return rc;
}
rc = rtems_rfs_inode_close (fs, &inode);
if (rc > 0)
1022c: da000002 ble 1023c <rtems_rfs_inode_create+0x2c0>
{
rtems_rfs_inode_free (fs, *ino);
10230: e1a00004 mov r0, r4 <== NOT EXECUTED
10234: e5951000 ldr r1, [r5] <== NOT EXECUTED
10238: ebfffdd1 bl f984 <rtems_rfs_inode_free> <== NOT EXECUTED
return rc;
}
return 0;
}
1023c: e1a0000b mov r0, fp
10240: e28dd060 add sp, sp, #96 ; 0x60
10244: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000fc88 <rtems_rfs_inode_delete>:
}
int
rtems_rfs_inode_delete (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* handle)
{
fc88: e92d4030 push {r4, r5, lr}
fc8c: e1a05000 mov r5, r0
fc90: e24dd050 sub sp, sp, #80 ; 0x50
fc94: e1a04001 mov r4, r1
int rc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_DELETE))
fc98: e3a00502 mov r0, #8388608 ; 0x800000
fc9c: e3a01000 mov r1, #0
fca0: eb000571 bl 1126c <rtems_rfs_trace>
fca4: e3500000 cmp r0, #0
fca8: 0a000007 beq fccc <rtems_rfs_inode_delete+0x44>
printf("rtems-rfs: inode-delete: ino:%" PRIu32 " loaded:%s\n",
fcac: e594c00c ldr ip, [r4, #12] <== NOT EXECUTED
fcb0: e59f309c ldr r3, [pc, #156] ; fd54 <rtems_rfs_inode_delete+0xcc><== NOT EXECUTED
fcb4: e35c0000 cmp ip, #0 <== NOT EXECUTED
fcb8: e59f2098 ldr r2, [pc, #152] ; fd58 <rtems_rfs_inode_delete+0xd0><== NOT EXECUTED
fcbc: e59f0098 ldr r0, [pc, #152] ; fd5c <rtems_rfs_inode_delete+0xd4><== NOT EXECUTED
fcc0: e5941008 ldr r1, [r4, #8] <== NOT EXECUTED
fcc4: 11a02003 movne r2, r3 <== NOT EXECUTED
fcc8: eb003b57 bl 1ea2c <printf> <== NOT EXECUTED
rtems_rfs_inode_ino (handle),
rtems_rfs_inode_is_loaded (handle) ? "yes" : "no");
if (rtems_rfs_inode_is_loaded (handle))
fccc: e594000c ldr r0, [r4, #12]
fcd0: e3500000 cmp r0, #0
fcd4: 0a00001c beq fd4c <rtems_rfs_inode_delete+0xc4>
rtems_rfs_block_map map;
/*
* Free the ino number.
*/
rc = rtems_rfs_inode_free (fs, handle->ino);
fcd8: e1a00005 mov r0, r5
fcdc: e5941008 ldr r1, [r4, #8]
fce0: ebffff27 bl f984 <rtems_rfs_inode_free>
if (rc > 0)
fce4: e3500000 cmp r0, #0
fce8: ca000017 bgt fd4c <rtems_rfs_inode_delete+0xc4>
return rc;
/*
* Free the blocks the inode may have attached.
*/
rc = rtems_rfs_block_map_open (fs, handle, &map);
fcec: e1a00005 mov r0, r5
fcf0: e1a01004 mov r1, r4
fcf4: e1a0200d mov r2, sp
fcf8: eb001ee6 bl 17898 <rtems_rfs_block_map_open>
if (rc == 0)
fcfc: e3500000 cmp r0, #0
fd00: 1a000011 bne fd4c <rtems_rfs_inode_delete+0xc4>
{
int rrc;
rrc = rtems_rfs_block_map_free_all (fs, &map);
fd04: e1a0100d mov r1, sp
fd08: e1a00005 mov r0, r5
fd0c: eb0021cc bl 18444 <rtems_rfs_block_map_free_all>
rc = rtems_rfs_block_map_close (fs, &map);
fd10: e1a0100d mov r1, sp
fd14: e1a00005 mov r0, r5
fd18: eb001f37 bl 179fc <rtems_rfs_block_map_close>
if (rc > 0)
rrc = rc;
memset (handle->node, 0xff, RTEMS_RFS_INODE_SIZE);
fd1c: e3a010ff mov r1, #255 ; 0xff
fd20: e3a02038 mov r2, #56 ; 0x38
fd24: e594000c ldr r0, [r4, #12]
fd28: eb003ace bl 1e868 <memset>
rtems_rfs_buffer_mark_dirty (&handle->buffer);
fd2c: e3a03001 mov r3, #1
fd30: e1a01004 mov r1, r4
fd34: e5e13010 strb r3, [r1, #16]!
/*
* Do the release here to avoid the ctime field being set on a
* close. Also if there loads is greater then one then other loads
* active. Forcing the loads count to 0.
*/
rc = rtems_rfs_buffer_handle_release (fs, &handle->buffer);
fd38: e1a00005 mov r0, r5
fd3c: eb00221e bl 185bc <rtems_rfs_buffer_handle_release>
handle->loads = 0;
fd40: e3a03000 mov r3, #0
fd44: e5843024 str r3, [r4, #36] ; 0x24
handle->node = NULL;
fd48: e584300c str r3, [r4, #12]
}
}
return rc;
}
fd4c: e28dd050 add sp, sp, #80 ; 0x50
fd50: e8bd8030 pop {r4, r5, pc}
000102d8 <rtems_rfs_inode_get_block>:
* @return uint32_t The block number.
*/
static inline uint32_t
rtems_rfs_inode_get_block (rtems_rfs_inode_handle* handle, int block)
{
return rtems_rfs_read_u32 (&handle->node->data.blocks[block]);
102d8: e590200c ldr r2, [r0, #12] <== NOT EXECUTED
102dc: e282301c add r3, r2, #28 <== NOT EXECUTED
102e0: e0833101 add r3, r3, r1, lsl #2 <== NOT EXECUTED
102e4: e2811007 add r1, r1, #7 <== NOT EXECUTED
102e8: e5d30003 ldrb r0, [r3, #3] <== NOT EXECUTED
102ec: e7d22101 ldrb r2, [r2, r1, lsl #2] <== NOT EXECUTED
102f0: e5d31001 ldrb r1, [r3, #1] <== NOT EXECUTED
102f4: e1802c02 orr r2, r0, r2, lsl #24 <== NOT EXECUTED
102f8: e5d30002 ldrb r0, [r3, #2] <== NOT EXECUTED
102fc: e1822801 orr r2, r2, r1, lsl #16 <== NOT EXECUTED
}
10300: e1820400 orr r0, r2, r0, lsl #8 <== NOT EXECUTED
10304: e12fff1e bx lr <== NOT EXECUTED
0000f990 <rtems_rfs_inode_load>:
}
int
rtems_rfs_inode_load (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* handle)
{
f990: e92d4030 push {r4, r5, lr}
f994: e1a05000 mov r5, r0
f998: e1a04001 mov r4, r1
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_LOAD))
f99c: e3a00601 mov r0, #1048576 ; 0x100000
f9a0: e3a01000 mov r1, #0
f9a4: eb000630 bl 1126c <rtems_rfs_trace>
f9a8: e3500000 cmp r0, #0
f9ac: 0a000008 beq f9d4 <rtems_rfs_inode_load+0x44>
printf ("rtems-rfs: inode-load: ino=%" PRIu32 " loads=%i loaded=%s\n",
f9b0: e594e00c ldr lr, [r4, #12] <== NOT EXECUTED
f9b4: e59fc06c ldr ip, [pc, #108] ; fa28 <rtems_rfs_inode_load+0x98><== NOT EXECUTED
f9b8: e35e0000 cmp lr, #0 <== NOT EXECUTED
f9bc: e59f3068 ldr r3, [pc, #104] ; fa2c <rtems_rfs_inode_load+0x9c><== NOT EXECUTED
f9c0: e59f0068 ldr r0, [pc, #104] ; fa30 <rtems_rfs_inode_load+0xa0><== NOT EXECUTED
f9c4: e5941008 ldr r1, [r4, #8] <== NOT EXECUTED
f9c8: e5942024 ldr r2, [r4, #36] ; 0x24 <== NOT EXECUTED
f9cc: 11a0300c movne r3, ip <== NOT EXECUTED
f9d0: eb003c15 bl 1ea2c <printf> <== NOT EXECUTED
/*
* An inode does not move so once loaded no need to do again.
*/
if (!rtems_rfs_inode_is_loaded (handle))
f9d4: e594300c ldr r3, [r4, #12]
f9d8: e3530000 cmp r3, #0
f9dc: 1a00000c bne fa14 <rtems_rfs_inode_load+0x84>
{
int rc;
rc = rtems_rfs_buffer_handle_request (fs,&handle->buffer,
f9e0: e1a00005 mov r0, r5
f9e4: e2841010 add r1, r4, #16
f9e8: e594201c ldr r2, [r4, #28]
f9ec: e3a03001 mov r3, #1
f9f0: eb00235d bl 1876c <rtems_rfs_buffer_handle_request>
handle->block, true);
if (rc > 0)
f9f4: e3500000 cmp r0, #0
f9f8: c8bd8030 popgt {r4, r5, pc}
return rc;
handle->node = rtems_rfs_buffer_data (&handle->buffer);
f9fc: e5942018 ldr r2, [r4, #24]
handle->node += handle->offset;
fa00: e5943020 ldr r3, [r4, #32]
fa04: e592201c ldr r2, [r2, #28]
fa08: e3a01038 mov r1, #56 ; 0x38
fa0c: e0232391 mla r3, r1, r3, r2
fa10: e584300c str r3, [r4, #12]
}
handle->loads++;
fa14: e5943024 ldr r3, [r4, #36] ; 0x24
fa18: e2833001 add r3, r3, #1
fa1c: e5843024 str r3, [r4, #36] ; 0x24
return 0;
fa20: e3a00000 mov r0, #0
}
fa24: e8bd8030 pop {r4, r5, pc}
0000fa34 <rtems_rfs_inode_open>:
int
rtems_rfs_inode_open (rtems_rfs_file_system* fs,
rtems_rfs_ino ino,
rtems_rfs_inode_handle* handle,
bool load)
{
fa34: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
fa38: e1a04000 mov r4, r0
fa3c: e1a05001 mov r5, r1
int group;
int gino;
int index;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_OPEN))
fa40: e3a00701 mov r0, #262144 ; 0x40000
fa44: e3a01000 mov r1, #0
int
rtems_rfs_inode_open (rtems_rfs_file_system* fs,
rtems_rfs_ino ino,
rtems_rfs_inode_handle* handle,
bool load)
{
fa48: e1a06002 mov r6, r2
fa4c: e20380ff and r8, r3, #255 ; 0xff
int group;
int gino;
int index;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_OPEN))
fa50: eb000605 bl 1126c <rtems_rfs_trace>
fa54: e3500000 cmp r0, #0
printf ("rtems-rfs: inode-open: ino: %" PRIu32 "\n", ino);
fa58: 159f00b8 ldrne r0, [pc, #184] ; fb18 <rtems_rfs_inode_open+0xe4>
fa5c: 11a01005 movne r1, r5
fa60: 1b003bf1 blne 1ea2c <printf>
if (ino == RTEMS_RFS_EMPTY_INO)
fa64: e3550000 cmp r5, #0
return EINVAL;
fa68: 03a00016 moveq r0, #22
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_OPEN))
printf ("rtems-rfs: inode-open: ino: %" PRIu32 "\n", ino);
if (ino == RTEMS_RFS_EMPTY_INO)
fa6c: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
return EINVAL;
if ((ino - RTEMS_RFS_ROOT_INO) > rtems_rfs_fs_inodes (fs))
fa70: e5943014 ldr r3, [r4, #20]
fa74: e2457001 sub r7, r5, #1
fa78: e1570003 cmp r7, r3
fa7c: 8a000023 bhi fb10 <rtems_rfs_inode_open+0xdc>
handle->ino = ino;
handle->node = NULL;
handle->loads = 0;
gino = ino - RTEMS_RFS_ROOT_INO;
group = gino / fs->group_inodes;
fa80: e594902c ldr r9, [r4, #44] ; 0x2c
return EINVAL;
if ((ino - RTEMS_RFS_ROOT_INO) > rtems_rfs_fs_inodes (fs))
return EINVAL;
handle->ino = ino;
fa84: e5865008 str r5, [r6, #8]
handle->node = NULL;
fa88: e3a05000 mov r5, #0
handle->loads = 0;
gino = ino - RTEMS_RFS_ROOT_INO;
group = gino / fs->group_inodes;
gino = gino % fs->group_inodes;
fa8c: e1a00007 mov r0, r7
fa90: e1a01009 mov r1, r9
if ((ino - RTEMS_RFS_ROOT_INO) > rtems_rfs_fs_inodes (fs))
return EINVAL;
handle->ino = ino;
handle->node = NULL;
fa94: e586500c str r5, [r6, #12]
handle->loads = 0;
fa98: e5865024 str r5, [r6, #36] ; 0x24
gino = ino - RTEMS_RFS_ROOT_INO;
group = gino / fs->group_inodes;
gino = gino % fs->group_inodes;
fa9c: eb006d55 bl 2aff8 <__umodsi3>
index = (gino / fs->inodes_per_block) + RTEMS_RFS_GROUP_INODE_BLOCK;
faa0: e594a030 ldr sl, [r4, #48] ; 0x30
handle->offset = gino % fs->inodes_per_block;
faa4: e1a0100a mov r1, sl
handle->node = NULL;
handle->loads = 0;
gino = ino - RTEMS_RFS_ROOT_INO;
group = gino / fs->group_inodes;
gino = gino % fs->group_inodes;
faa8: e1a0b000 mov fp, r0
index = (gino / fs->inodes_per_block) + RTEMS_RFS_GROUP_INODE_BLOCK;
handle->offset = gino % fs->inodes_per_block;
faac: eb006d51 bl 2aff8 <__umodsi3>
handle->ino = ino;
handle->node = NULL;
handle->loads = 0;
gino = ino - RTEMS_RFS_ROOT_INO;
group = gino / fs->group_inodes;
fab0: e1a01009 mov r1, r9
gino = gino % fs->group_inodes;
index = (gino / fs->inodes_per_block) + RTEMS_RFS_GROUP_INODE_BLOCK;
handle->offset = gino % fs->inodes_per_block;
fab4: e5860020 str r0, [r6, #32]
handle->ino = ino;
handle->node = NULL;
handle->loads = 0;
gino = ino - RTEMS_RFS_ROOT_INO;
group = gino / fs->group_inodes;
fab8: e1a00007 mov r0, r7
fabc: ebffc79f bl 1940 <__aeabi_uidiv>
gino = gino % fs->group_inodes;
index = (gino / fs->inodes_per_block) + RTEMS_RFS_GROUP_INODE_BLOCK;
handle->offset = gino % fs->inodes_per_block;
handle->block = rtems_rfs_group_block (&fs->groups[group], index);
fac0: e3a02050 mov r2, #80 ; 0x50
fac4: e0020290 mul r2, r0, r2
fac8: e5943020 ldr r3, [r4, #32]
handle->loads = 0;
gino = ino - RTEMS_RFS_ROOT_INO;
group = gino / fs->group_inodes;
gino = gino % fs->group_inodes;
index = (gino / fs->inodes_per_block) + RTEMS_RFS_GROUP_INODE_BLOCK;
facc: e1a0000b mov r0, fp
fad0: e1a0100a mov r1, sl
fad4: e7937002 ldr r7, [r3, r2]
fad8: ebffc798 bl 1940 <__aeabi_uidiv>
fadc: e2877002 add r7, r7, #2
handle->offset = gino % fs->inodes_per_block;
handle->block = rtems_rfs_group_block (&fs->groups[group], index);
fae0: e0870000 add r0, r7, r0
rc = rtems_rfs_buffer_handle_open (fs, &handle->buffer);
if ((rc == 0) && load)
fae4: e1580005 cmp r8, r5
group = gino / fs->group_inodes;
gino = gino % fs->group_inodes;
index = (gino / fs->inodes_per_block) + RTEMS_RFS_GROUP_INODE_BLOCK;
handle->offset = gino % fs->inodes_per_block;
handle->block = rtems_rfs_group_block (&fs->groups[group], index);
fae8: e586001c str r0, [r6, #28]
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
faec: e5c65010 strb r5, [r6, #16]
handle->bnum = 0;
faf0: e5865014 str r5, [r6, #20]
handle->buffer = NULL;
faf4: e5865018 str r5, [r6, #24]
rc = rtems_rfs_buffer_handle_open (fs, &handle->buffer);
faf8: 01a00008 moveq r0, r8
if ((rc == 0) && load)
fafc: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
rc = rtems_rfs_inode_load (fs, handle);
fb00: e1a00004 mov r0, r4
fb04: e1a01006 mov r1, r6
return rc;
}
fb08: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr}
handle->offset = gino % fs->inodes_per_block;
handle->block = rtems_rfs_group_block (&fs->groups[group], index);
rc = rtems_rfs_buffer_handle_open (fs, &handle->buffer);
if ((rc == 0) && load)
rc = rtems_rfs_inode_load (fs, handle);
fb0c: eaffff9f b f990 <rtems_rfs_inode_load>
if (ino == RTEMS_RFS_EMPTY_INO)
return EINVAL;
if ((ino - RTEMS_RFS_ROOT_INO) > rtems_rfs_fs_inodes (fs))
return EINVAL;
fb10: e3a00016 mov r0, #22 <== NOT EXECUTED
rc = rtems_rfs_buffer_handle_open (fs, &handle->buffer);
if ((rc == 0) && load)
rc = rtems_rfs_inode_load (fs, handle);
return rc;
}
fb14: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
0000e718 <rtems_rfs_inode_overhead>:
static int
rtems_rfs_inode_overhead (rtems_rfs_file_system* fs)
{
int blocks;
int bits_per_block;
blocks = rtems_rfs_rup_quotient(fs->group_inodes * RTEMS_RFS_INODE_SIZE,
e718: e590302c ldr r3, [r0, #44] ; 0x2c <== NOT EXECUTED
/**
* Return the inode overhead given a number of inodes.
*/
static int
rtems_rfs_inode_overhead (rtems_rfs_file_system* fs)
{
e71c: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
int blocks;
int bits_per_block;
blocks = rtems_rfs_rup_quotient(fs->group_inodes * RTEMS_RFS_INODE_SIZE,
e720: e5905008 ldr r5, [r0, #8] <== NOT EXECUTED
/**
* Return the inode overhead given a number of inodes.
*/
static int
rtems_rfs_inode_overhead (rtems_rfs_file_system* fs)
{
e724: e1a04000 mov r4, r0 <== NOT EXECUTED
int blocks;
int bits_per_block;
blocks = rtems_rfs_rup_quotient(fs->group_inodes * RTEMS_RFS_INODE_SIZE,
e728: e3a00038 mov r0, #56 ; 0x38 <== NOT EXECUTED
e72c: e1a01005 mov r1, r5 <== NOT EXECUTED
e730: e0000093 mul r0, r3, r0 <== NOT EXECUTED
e734: ebffffee bl e6f4 <rtems_rfs_rup_quotient> <== NOT EXECUTED
rtems_rfs_fs_block_size (fs));
bits_per_block = rtems_rfs_bits_per_block (fs);
/*
* There could be more bits than blocks, eg 512K disk with 512 blocks.
*/
if (bits_per_block > (rtems_rfs_fs_blocks (fs) - RTEMS_RFS_SUPERBLOCK_SIZE))
e738: e5943004 ldr r3, [r4, #4] <== NOT EXECUTED
* Return the number of bits that fit in the block size.
*/
static int
rtems_rfs_bits_per_block (rtems_rfs_file_system* fs)
{
return rtems_rfs_bitmap_numof_bits (rtems_rfs_fs_block_size (fs));
e73c: e1a01185 lsl r1, r5, #3 <== NOT EXECUTED
rtems_rfs_fs_block_size (fs));
bits_per_block = rtems_rfs_bits_per_block (fs);
/*
* There could be more bits than blocks, eg 512K disk with 512 blocks.
*/
if (bits_per_block > (rtems_rfs_fs_blocks (fs) - RTEMS_RFS_SUPERBLOCK_SIZE))
e740: e2433001 sub r3, r3, #1 <== NOT EXECUTED
bits_per_block = rtems_rfs_fs_blocks (fs) - RTEMS_RFS_SUPERBLOCK_SIZE;
return ((blocks + 1) * 100 * 10) / bits_per_block;
e744: e3a02ffa mov r2, #1000 ; 0x3e8 <== NOT EXECUTED
e748: e2800001 add r0, r0, #1 <== NOT EXECUTED
e74c: e0000092 mul r0, r2, r0 <== NOT EXECUTED
e750: e1510003 cmp r1, r3 <== NOT EXECUTED
e754: 21a01003 movcs r1, r3 <== NOT EXECUTED
e758: eb0071d4 bl 2aeb0 <__aeabi_idiv> <== NOT EXECUTED
}
e75c: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
00010308 <rtems_rfs_inode_set_block>:
* @param bno The block number.
*/
static inline void
rtems_rfs_inode_set_block (rtems_rfs_inode_handle* handle, int block, uint32_t bno)
{
rtems_rfs_write_u32 (&handle->node->data.blocks[block], bno);
10308: e590300c ldr r3, [r0, #12] <== NOT EXECUTED
* @param block The block index.
* @param bno The block number.
*/
static inline void
rtems_rfs_inode_set_block (rtems_rfs_inode_handle* handle, int block, uint32_t bno)
{
1030c: e92d4010 push {r4, lr} <== NOT EXECUTED
rtems_rfs_write_u32 (&handle->node->data.blocks[block], bno);
10310: e281c007 add ip, r1, #7 <== NOT EXECUTED
10314: e1a04c22 lsr r4, r2, #24 <== NOT EXECUTED
10318: e7c3410c strb r4, [r3, ip, lsl #2] <== NOT EXECUTED
1031c: e590300c ldr r3, [r0, #12] <== NOT EXECUTED
10320: e1a01101 lsl r1, r1, #2 <== NOT EXECUTED
10324: e0833001 add r3, r3, r1 <== NOT EXECUTED
10328: e1a0c822 lsr ip, r2, #16 <== NOT EXECUTED
1032c: e5c3c01d strb ip, [r3, #29] <== NOT EXECUTED
10330: e590300c ldr r3, [r0, #12] <== NOT EXECUTED
10334: e1a0c422 lsr ip, r2, #8 <== NOT EXECUTED
10338: e0833001 add r3, r3, r1 <== NOT EXECUTED
1033c: e5c3c01e strb ip, [r3, #30] <== NOT EXECUTED
10340: e590300c ldr r3, [r0, #12] <== NOT EXECUTED
10344: e0831001 add r1, r3, r1 <== NOT EXECUTED
rtems_rfs_buffer_mark_dirty (&handle->buffer);
10348: e3a03001 mov r3, #1 <== NOT EXECUTED
* @param bno The block number.
*/
static inline void
rtems_rfs_inode_set_block (rtems_rfs_inode_handle* handle, int block, uint32_t bno)
{
rtems_rfs_write_u32 (&handle->node->data.blocks[block], bno);
1034c: e5c1201f strb r2, [r1, #31] <== NOT EXECUTED
rtems_rfs_buffer_mark_dirty (&handle->buffer);
10350: e5c03010 strb r3, [r0, #16] <== NOT EXECUTED
}
10354: e8bd8010 pop {r4, pc} <== NOT EXECUTED
0000fd60 <rtems_rfs_inode_time_stamp_now>:
rtems_rfs_inode_time_stamp_now (rtems_rfs_inode_handle* handle,
bool atime,
bool mtime)
{
time_t now;
if (!rtems_rfs_inode_is_loaded (handle))
fd60: e590300c ldr r3, [r0, #12]
fd64: e3530000 cmp r3, #0
int
rtems_rfs_inode_time_stamp_now (rtems_rfs_inode_handle* handle,
bool atime,
bool mtime)
{
fd68: e92d4070 push {r4, r5, r6, lr}
fd6c: e1a04000 mov r4, r0
fd70: e20160ff and r6, r1, #255 ; 0xff
fd74: e20250ff and r5, r2, #255 ; 0xff
time_t now;
if (!rtems_rfs_inode_is_loaded (handle))
return ENXIO;
fd78: 03a00006 moveq r0, #6
rtems_rfs_inode_time_stamp_now (rtems_rfs_inode_handle* handle,
bool atime,
bool mtime)
{
time_t now;
if (!rtems_rfs_inode_is_loaded (handle))
fd7c: 08bd8070 popeq {r4, r5, r6, pc}
return ENXIO;
now = time (NULL);
fd80: e3a00000 mov r0, #0
fd84: eb004b63 bl 22b18 <time>
if (atime)
fd88: e3560000 cmp r6, #0
fd8c: 0a00000c beq fdc4 <rtems_rfs_inode_time_stamp_now+0x64>
*/
static inline void
rtems_rfs_inode_set_atime (rtems_rfs_inode_handle* handle,
rtems_rfs_time atime)
{
rtems_rfs_write_u32 (&handle->node->atime, atime);
fd90: e594300c ldr r3, [r4, #12]
fd94: e1a02c20 lsr r2, r0, #24
fd98: e5c32010 strb r2, [r3, #16]
fd9c: e594300c ldr r3, [r4, #12]
fda0: e1a02820 lsr r2, r0, #16
fda4: e5c32011 strb r2, [r3, #17]
fda8: e594300c ldr r3, [r4, #12]
fdac: e1a02420 lsr r2, r0, #8
fdb0: e5c32012 strb r2, [r3, #18]
fdb4: e594300c ldr r3, [r4, #12]
fdb8: e5c30013 strb r0, [r3, #19]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
fdbc: e3a03001 mov r3, #1
fdc0: e5c43010 strb r3, [r4, #16]
rtems_rfs_inode_set_atime (handle, now);
if (mtime)
fdc4: e3550000 cmp r5, #0
fdc8: 0a00000e beq fe08 <rtems_rfs_inode_time_stamp_now+0xa8>
*/
static inline void
rtems_rfs_inode_set_mtime (rtems_rfs_inode_handle* handle,
rtems_rfs_time mtime)
{
rtems_rfs_write_u32 (&handle->node->mtime, mtime);
fdcc: e594300c ldr r3, [r4, #12]
fdd0: e1a02c20 lsr r2, r0, #24
fdd4: e5c32014 strb r2, [r3, #20]
fdd8: e594300c ldr r3, [r4, #12]
fddc: e1a02820 lsr r2, r0, #16
fde0: e5c32015 strb r2, [r3, #21]
fde4: e594300c ldr r3, [r4, #12]
fde8: e1a02420 lsr r2, r0, #8
fdec: e5c32016 strb r2, [r3, #22]
fdf0: e594300c ldr r3, [r4, #12]
fdf4: e5c30017 strb r0, [r3, #23]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
fdf8: e3a03001 mov r3, #1
fdfc: e5c43010 strb r3, [r4, #16]
rtems_rfs_inode_set_mtime (handle, now);
return 0;
fe00: e3a00000 mov r0, #0
fe04: e8bd8070 pop {r4, r5, r6, pc}
fe08: e1a00005 mov r0, r5 <== NOT EXECUTED
}
fe0c: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
0000fb1c <rtems_rfs_inode_unload>:
int
rtems_rfs_inode_unload (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* handle,
bool update_ctime)
{
fb1c: e92d4070 push {r4, r5, r6, lr}
fb20: e1a05000 mov r5, r0
fb24: e1a04001 mov r4, r1
int rc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_UNLOAD))
fb28: e3a00602 mov r0, #2097152 ; 0x200000
fb2c: e3a01000 mov r1, #0
int
rtems_rfs_inode_unload (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* handle,
bool update_ctime)
{
fb30: e20260ff and r6, r2, #255 ; 0xff
int rc = 0;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_INODE_UNLOAD))
fb34: eb0005cc bl 1126c <rtems_rfs_trace>
fb38: e3500000 cmp r0, #0
fb3c: 0a000008 beq fb64 <rtems_rfs_inode_unload+0x48>
printf ("rtems-rfs: inode-unload: ino=%" PRIu32 " loads=%i loaded=%s\n",
fb40: e594e00c ldr lr, [r4, #12] <== NOT EXECUTED
fb44: e59fc0b0 ldr ip, [pc, #176] ; fbfc <rtems_rfs_inode_unload+0xe0><== NOT EXECUTED
fb48: e35e0000 cmp lr, #0 <== NOT EXECUTED
fb4c: e59f30ac ldr r3, [pc, #172] ; fc00 <rtems_rfs_inode_unload+0xe4><== NOT EXECUTED
fb50: e59f00ac ldr r0, [pc, #172] ; fc04 <rtems_rfs_inode_unload+0xe8><== NOT EXECUTED
fb54: e5941008 ldr r1, [r4, #8] <== NOT EXECUTED
fb58: e5942024 ldr r2, [r4, #36] ; 0x24 <== NOT EXECUTED
fb5c: 11a0300c movne r3, ip <== NOT EXECUTED
fb60: eb003bb1 bl 1ea2c <printf> <== NOT EXECUTED
handle->ino, handle->loads,
rtems_rfs_inode_is_loaded (handle) ? "yes" : "no");
if (rtems_rfs_inode_is_loaded (handle))
fb64: e594000c ldr r0, [r4, #12]
fb68: e3500000 cmp r0, #0
fb6c: 08bd8070 popeq {r4, r5, r6, pc}
{
if (handle->loads == 0)
fb70: e5940024 ldr r0, [r4, #36] ; 0x24
fb74: e3500000 cmp r0, #0
return EIO;
fb78: 03a00005 moveq r0, #5
handle->ino, handle->loads,
rtems_rfs_inode_is_loaded (handle) ? "yes" : "no");
if (rtems_rfs_inode_is_loaded (handle))
{
if (handle->loads == 0)
fb7c: 08bd8070 popeq {r4, r5, r6, pc}
return EIO;
handle->loads--;
fb80: e2400001 sub r0, r0, #1
if (handle->loads == 0)
fb84: e3500000 cmp r0, #0
if (rtems_rfs_inode_is_loaded (handle))
{
if (handle->loads == 0)
return EIO;
handle->loads--;
fb88: e5840024 str r0, [r4, #36] ; 0x24
if (handle->loads == 0)
fb8c: 1a000018 bne fbf4 <rtems_rfs_inode_unload+0xd8>
{
/*
* If the buffer is dirty it will be release. Also set the ctime.
*/
if (rtems_rfs_buffer_dirty (&handle->buffer) && update_ctime)
fb90: e5d43010 ldrb r3, [r4, #16]
fb94: e3530000 cmp r3, #0
fb98: 0a00000f beq fbdc <rtems_rfs_inode_unload+0xc0>
fb9c: e3560000 cmp r6, #0
fba0: 0a00000d beq fbdc <rtems_rfs_inode_unload+0xc0>
rtems_rfs_inode_set_ctime (handle, time (NULL));
fba4: eb004bdb bl 22b18 <time>
*/
static inline void
rtems_rfs_inode_set_ctime (rtems_rfs_inode_handle* handle,
rtems_rfs_time ctime)
{
rtems_rfs_write_u32 (&handle->node->ctime, ctime);
fba8: e594300c ldr r3, [r4, #12]
fbac: e1a02c20 lsr r2, r0, #24
fbb0: e5c32018 strb r2, [r3, #24]
fbb4: e594300c ldr r3, [r4, #12]
fbb8: e1a02820 lsr r2, r0, #16
fbbc: e5c32019 strb r2, [r3, #25]
fbc0: e594300c ldr r3, [r4, #12]
fbc4: e1a02420 lsr r2, r0, #8
fbc8: e5c3201a strb r2, [r3, #26]
fbcc: e594300c ldr r3, [r4, #12]
fbd0: e5c3001b strb r0, [r3, #27]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
fbd4: e3a03001 mov r3, #1
fbd8: e5c43010 strb r3, [r4, #16]
rc = rtems_rfs_buffer_handle_release (fs, &handle->buffer);
fbdc: e1a00005 mov r0, r5
fbe0: e2841010 add r1, r4, #16
fbe4: eb002274 bl 185bc <rtems_rfs_buffer_handle_release>
handle->node = NULL;
fbe8: e3a03000 mov r3, #0
fbec: e584300c str r3, [r4, #12]
fbf0: e8bd8070 pop {r4, r5, r6, pc}
int
rtems_rfs_inode_unload (rtems_rfs_file_system* fs,
rtems_rfs_inode_handle* handle,
bool update_ctime)
{
int rc = 0;
fbf4: e3a00000 mov r0, #0
handle->node = NULL;
}
}
return rc;
}
fbf8: e8bd8070 pop {r4, r5, r6, pc}
0001b438 <rtems_rfs_link>:
const char* name,
int length,
rtems_rfs_ino parent,
rtems_rfs_ino target,
bool link_dir)
{
1b438: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
1b43c: e1a04000 mov r4, r0
1b440: e24dd054 sub sp, sp, #84 ; 0x54
1b444: e1a06001 mov r6, r1
rtems_rfs_inode_handle parent_inode;
rtems_rfs_inode_handle target_inode;
uint16_t links;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_LINK))
1b448: e3a00401 mov r0, #16777216 ; 0x1000000
1b44c: e3a01000 mov r1, #0
const char* name,
int length,
rtems_rfs_ino parent,
rtems_rfs_ino target,
bool link_dir)
{
1b450: e1a08002 mov r8, r2
1b454: e1a07003 mov r7, r3
1b458: e59d5074 ldr r5, [sp, #116] ; 0x74
1b45c: e5dda078 ldrb sl, [sp, #120] ; 0x78
rtems_rfs_inode_handle parent_inode;
rtems_rfs_inode_handle target_inode;
uint16_t links;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_LINK))
1b460: ebffd781 bl 1126c <rtems_rfs_trace>
1b464: e3500000 cmp r0, #0
1b468: 0a00000c beq 1b4a0 <rtems_rfs_link+0x68>
{
int c;
printf ("rtems-rfs: link: parent(%" PRIu32 ") -> ", parent);
1b46c: e59f0144 ldr r0, [pc, #324] ; 1b5b8 <rtems_rfs_link+0x180> <== NOT EXECUTED
1b470: e1a01007 mov r1, r7 <== NOT EXECUTED
1b474: eb000d6c bl 1ea2c <printf> <== NOT EXECUTED
for (c = 0; c < length; c++)
1b478: e3a09000 mov r9, #0 <== NOT EXECUTED
1b47c: ea000002 b 1b48c <rtems_rfs_link+0x54> <== NOT EXECUTED
printf ("%c", name[c]);
1b480: e7d60009 ldrb r0, [r6, r9] <== NOT EXECUTED
1b484: eb000dd2 bl 1ebd4 <putchar> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_LINK))
{
int c;
printf ("rtems-rfs: link: parent(%" PRIu32 ") -> ", parent);
for (c = 0; c < length; c++)
1b488: e2899001 add r9, r9, #1 <== NOT EXECUTED
1b48c: e1590008 cmp r9, r8 <== NOT EXECUTED
1b490: bafffffa blt 1b480 <rtems_rfs_link+0x48> <== NOT EXECUTED
printf ("%c", name[c]);
printf ("(%" PRIu32 ")\n", target);
1b494: e59f0120 ldr r0, [pc, #288] ; 1b5bc <rtems_rfs_link+0x184> <== NOT EXECUTED
1b498: e1a01005 mov r1, r5 <== NOT EXECUTED
1b49c: eb000d62 bl 1ea2c <printf> <== NOT EXECUTED
}
rc = rtems_rfs_inode_open (fs, target, &target_inode, true);
1b4a0: e1a00004 mov r0, r4
1b4a4: e1a01005 mov r1, r5
1b4a8: e28d202c add r2, sp, #44 ; 0x2c
1b4ac: e3a03001 mov r3, #1
1b4b0: ebffd15f bl fa34 <rtems_rfs_inode_open>
if (rc)
1b4b4: e2509000 subs r9, r0, #0
1b4b8: 1a00003b bne 1b5ac <rtems_rfs_link+0x174>
/*
* If the target inode is a directory and we cannot link directories
* return a not supported error code.
*/
if (!link_dir && S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)))
1b4bc: e35a0000 cmp sl, #0
{
rtems_rfs_inode_close (fs, &target_inode);
1b4c0: e1a00004 mov r0, r4
/*
* If the target inode is a directory and we cannot link directories
* return a not supported error code.
*/
if (!link_dir && S_ISDIR (rtems_rfs_inode_get_mode (&target_inode)))
1b4c4: 1a000009 bne 1b4f0 <rtems_rfs_link+0xb8>
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
1b4c8: e59d3038 ldr r3, [sp, #56] ; 0x38
1b4cc: e5d33002 ldrb r3, [r3, #2]
1b4d0: e1a03403 lsl r3, r3, #8
1b4d4: e2033a0f and r3, r3, #61440 ; 0xf000
1b4d8: e3530901 cmp r3, #16384 ; 0x4000
1b4dc: 1a000003 bne 1b4f0 <rtems_rfs_link+0xb8>
{
rtems_rfs_inode_close (fs, &target_inode);
1b4e0: e28d102c add r1, sp, #44 ; 0x2c <== NOT EXECUTED
1b4e4: ebffd1c7 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return ENOTSUP;
1b4e8: e3a09086 mov r9, #134 ; 0x86 <== NOT EXECUTED
1b4ec: ea00002e b 1b5ac <rtems_rfs_link+0x174> <== NOT EXECUTED
}
rc = rtems_rfs_inode_open (fs, parent, &parent_inode, true);
1b4f0: e1a01007 mov r1, r7
1b4f4: e28d2004 add r2, sp, #4
1b4f8: e3a03001 mov r3, #1
1b4fc: ebffd14c bl fa34 <rtems_rfs_inode_open>
if (rc)
1b500: e2509000 subs r9, r0, #0
1b504: 1a00000a bne 1b534 <rtems_rfs_link+0xfc>
{
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
rc = rtems_rfs_dir_add_entry (fs, &parent_inode, name, length, target);
1b508: e1a00004 mov r0, r4
1b50c: e28d1004 add r1, sp, #4
1b510: e1a02006 mov r2, r6
1b514: e1a03008 mov r3, r8
1b518: e58d5000 str r5, [sp]
1b51c: ebfff755 bl 19278 <rtems_rfs_dir_add_entry>
if (rc > 0)
1b520: e2509000 subs r9, r0, #0
1b524: da000006 ble 1b544 <rtems_rfs_link+0x10c>
{
rtems_rfs_inode_close (fs, &parent_inode);
1b528: e1a00004 mov r0, r4 <== NOT EXECUTED
1b52c: e28d1004 add r1, sp, #4 <== NOT EXECUTED
1b530: ebffd1b4 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &target_inode);
1b534: e1a00004 mov r0, r4 <== NOT EXECUTED
1b538: e28d102c add r1, sp, #44 ; 0x2c <== NOT EXECUTED
1b53c: ebffd1b1 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return rc;
1b540: ea000019 b 1b5ac <rtems_rfs_link+0x174> <== NOT EXECUTED
}
links = rtems_rfs_inode_get_links (&target_inode) + 1;
1b544: e28d002c add r0, sp, #44 ; 0x2c
1b548: ebffffb1 bl 1b414 <rtems_rfs_inode_get_links>
1b54c: e2800001 add r0, r0, #1
* @prarm links The links.
*/
static inline void
rtems_rfs_inode_set_links (rtems_rfs_inode_handle* handle, uint16_t links)
{
rtems_rfs_write_u16 (&handle->node->links, links);
1b550: e59d3038 ldr r3, [sp, #56] ; 0x38
1b554: e1a00800 lsl r0, r0, #16
1b558: e1a02820 lsr r2, r0, #16
1b55c: e1a00c20 lsr r0, r0, #24
1b560: e5c30000 strb r0, [r3]
1b564: e59d3038 ldr r3, [sp, #56] ; 0x38
rtems_rfs_buffer_mark_dirty (&handle->buffer);
1b568: e3a01001 mov r1, #1
* @prarm links The links.
*/
static inline void
rtems_rfs_inode_set_links (rtems_rfs_inode_handle* handle, uint16_t links)
{
rtems_rfs_write_u16 (&handle->node->links, links);
1b56c: e5c32001 strb r2, [r3, #1]
rtems_rfs_inode_set_links (&target_inode, links);
rc = rtems_rfs_inode_time_stamp_now (&parent_inode, true, true);
1b570: e28d0004 add r0, sp, #4
1b574: e1a02001 mov r2, r1
rtems_rfs_buffer_mark_dirty (&handle->buffer);
1b578: e5cd103c strb r1, [sp, #60] ; 0x3c
1b57c: ebffd1f7 bl fd60 <rtems_rfs_inode_time_stamp_now>
if (rc > 0)
1b580: e2509000 subs r9, r0, #0
{
rtems_rfs_inode_close (fs, &parent_inode);
1b584: e28d1004 add r1, sp, #4
1b588: e1a00004 mov r0, r4
links = rtems_rfs_inode_get_links (&target_inode) + 1;
rtems_rfs_inode_set_links (&target_inode, links);
rc = rtems_rfs_inode_time_stamp_now (&parent_inode, true, true);
if (rc > 0)
1b58c: caffffe7 bgt 1b530 <rtems_rfs_link+0xf8>
rtems_rfs_inode_close (fs, &parent_inode);
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
rc = rtems_rfs_inode_close (fs, &parent_inode);
1b590: ebffd19c bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
1b594: e2509000 subs r9, r0, #0
{
rtems_rfs_inode_close (fs, &target_inode);
1b598: e28d102c add r1, sp, #44 ; 0x2c
1b59c: e1a00004 mov r0, r4
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
rc = rtems_rfs_inode_close (fs, &parent_inode);
if (rc > 0)
1b5a0: caffffe5 bgt 1b53c <rtems_rfs_link+0x104>
{
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
rc = rtems_rfs_inode_close (fs, &target_inode);
1b5a4: ebffd197 bl fc08 <rtems_rfs_inode_close>
1b5a8: e1a09000 mov r9, r0
return rc;
}
1b5ac: e1a00009 mov r0, r9
1b5b0: e28dd054 add sp, sp, #84 ; 0x54
1b5b4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
0001bd58 <rtems_rfs_mutex_create>:
RTEMS_INHERIT_PRIORITY | RTEMS_NO_PRIORITY_CEILING | RTEMS_LOCAL)
#endif
int
rtems_rfs_mutex_create (rtems_rfs_mutex* mutex)
{
1bd58: e92d4011 push {r0, r4, lr}
#if __rtems__
rtems_status_code sc;
sc = rtems_semaphore_create (rtems_build_name ('R', 'F', 'S', 'm'),
1bd5c: e3a01001 mov r1, #1
1bd60: e58d0000 str r0, [sp]
1bd64: e3a02054 mov r2, #84 ; 0x54
1bd68: e59f0040 ldr r0, [pc, #64] ; 1bdb0 <rtems_rfs_mutex_create+0x58>
1bd6c: e3a03000 mov r3, #0
1bd70: ebffbb64 bl ab08 <rtems_semaphore_create>
1, RTEMS_RFS_MUTEX_ATTRIBS, 0,
mutex);
if (sc != RTEMS_SUCCESSFUL)
1bd74: e2504000 subs r4, r0, #0
printf ("rtems-rfs: mutex: open failed: %s\n",
rtems_status_text (sc));
return EIO;
}
#endif
return 0;
1bd78: 01a00004 moveq r0, r4
#if __rtems__
rtems_status_code sc;
sc = rtems_semaphore_create (rtems_build_name ('R', 'F', 'S', 'm'),
1, RTEMS_RFS_MUTEX_ATTRIBS, 0,
mutex);
if (sc != RTEMS_SUCCESSFUL)
1bd7c: 0a00000a beq 1bdac <rtems_rfs_mutex_create+0x54>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_MUTEX))
1bd80: e3a00004 mov r0, #4 <== NOT EXECUTED
1bd84: e3a01000 mov r1, #0 <== NOT EXECUTED
1bd88: ebffd537 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1bd8c: e3500000 cmp r0, #0 <== NOT EXECUTED
1bd90: 0a000004 beq 1bda8 <rtems_rfs_mutex_create+0x50> <== NOT EXECUTED
printf ("rtems-rfs: mutex: open failed: %s\n",
1bd94: e1a00004 mov r0, r4 <== NOT EXECUTED
1bd98: ebffaa18 bl 6600 <rtems_status_text> <== NOT EXECUTED
1bd9c: e1a01000 mov r1, r0 <== NOT EXECUTED
1bda0: e59f000c ldr r0, [pc, #12] ; 1bdb4 <rtems_rfs_mutex_create+0x5c><== NOT EXECUTED
1bda4: eb000b20 bl 1ea2c <printf> <== NOT EXECUTED
rtems_status_text (sc));
return EIO;
1bda8: e3a00005 mov r0, #5 <== NOT EXECUTED
}
#endif
return 0;
}
1bdac: e8bd8018 pop {r3, r4, pc}
0001bdb8 <rtems_rfs_mutex_destroy>:
int
rtems_rfs_mutex_destroy (rtems_rfs_mutex* mutex)
{
1bdb8: e92d4010 push {r4, lr}
#if __rtems__
rtems_status_code sc;
sc = rtems_semaphore_delete (*mutex);
1bdbc: e5900000 ldr r0, [r0]
1bdc0: ebffbbb8 bl aca8 <rtems_semaphore_delete>
if (sc != RTEMS_SUCCESSFUL)
1bdc4: e2504000 subs r4, r0, #0
printf ("rtems-rfs: mutex: close failed: %s\n",
rtems_status_text (sc));
return EIO;
}
#endif
return 0;
1bdc8: 01a00004 moveq r0, r4
rtems_rfs_mutex_destroy (rtems_rfs_mutex* mutex)
{
#if __rtems__
rtems_status_code sc;
sc = rtems_semaphore_delete (*mutex);
if (sc != RTEMS_SUCCESSFUL)
1bdcc: 08bd8010 popeq {r4, pc}
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_MUTEX))
1bdd0: e3a00004 mov r0, #4 <== NOT EXECUTED
1bdd4: e3a01000 mov r1, #0 <== NOT EXECUTED
1bdd8: ebffd523 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1bddc: e3500000 cmp r0, #0 <== NOT EXECUTED
1bde0: 0a000006 beq 1be00 <rtems_rfs_mutex_destroy+0x48> <== NOT EXECUTED
printf ("rtems-rfs: mutex: close failed: %s\n",
1bde4: e1a00004 mov r0, r4 <== NOT EXECUTED
1bde8: ebffaa04 bl 6600 <rtems_status_text> <== NOT EXECUTED
1bdec: e1a01000 mov r1, r0 <== NOT EXECUTED
1bdf0: e59f0010 ldr r0, [pc, #16] ; 1be08 <rtems_rfs_mutex_destroy+0x50><== NOT EXECUTED
1bdf4: eb000b0c bl 1ea2c <printf> <== NOT EXECUTED
rtems_status_text (sc));
return EIO;
1bdf8: e3a00005 mov r0, #5 <== NOT EXECUTED
1bdfc: e8bd8010 pop {r4, pc} <== NOT EXECUTED
1be00: e3a00005 mov r0, #5 <== NOT EXECUTED
}
#endif
return 0;
}
1be04: e8bd8010 pop {r4, pc} <== NOT EXECUTED
00010f94 <rtems_rfs_mutex_lock.isra.2>:
*/
static inline int
rtems_rfs_mutex_lock (rtems_rfs_mutex* mutex)
{
#if __rtems__
rtems_status_code sc = rtems_semaphore_obtain (*mutex, RTEMS_WAIT, 0);
10f94: e3a01000 mov r1, #0
* @param mutex The mutex to lock.
* @retval true The mutex is locked.
* @retval false The mutex could not be locked.
*/
static inline int
rtems_rfs_mutex_lock (rtems_rfs_mutex* mutex)
10f98: e92d4010 push {r4, lr}
{
#if __rtems__
rtems_status_code sc = rtems_semaphore_obtain (*mutex, RTEMS_WAIT, 0);
10f9c: e1a02001 mov r2, r1
10fa0: ebffe767 bl ad44 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL)
10fa4: e2504000 subs r4, r0, #0
rtems_status_text (sc));
#endif
return EIO;
}
#endif
return 0;
10fa8: 01a00004 moveq r0, r4
static inline int
rtems_rfs_mutex_lock (rtems_rfs_mutex* mutex)
{
#if __rtems__
rtems_status_code sc = rtems_semaphore_obtain (*mutex, RTEMS_WAIT, 0);
if (sc != RTEMS_SUCCESSFUL)
10fac: 08bd8010 popeq {r4, pc}
{
#if RTEMS_RFS_TRACE
if (rtems_rfs_trace (RTEMS_RFS_TRACE_MUTEX))
10fb0: e3a00004 mov r0, #4 <== NOT EXECUTED
10fb4: e3a01000 mov r1, #0 <== NOT EXECUTED
10fb8: eb0000ab bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
10fbc: e3500000 cmp r0, #0 <== NOT EXECUTED
10fc0: 0a000006 beq 10fe0 <rtems_rfs_mutex_lock.isra.2+0x4c> <== NOT EXECUTED
printf ("rtems-rfs: mutex: obtain failed: %s\n",
10fc4: e1a00004 mov r0, r4 <== NOT EXECUTED
10fc8: ebffd58c bl 6600 <rtems_status_text> <== NOT EXECUTED
10fcc: e1a01000 mov r1, r0 <== NOT EXECUTED
10fd0: e59f0010 ldr r0, [pc, #16] ; 10fe8 <rtems_rfs_mutex_lock.isra.2+0x54><== NOT EXECUTED
10fd4: eb003694 bl 1ea2c <printf> <== NOT EXECUTED
rtems_status_text (sc));
#endif
return EIO;
10fd8: e3a00005 mov r0, #5 <== NOT EXECUTED
10fdc: e8bd8010 pop {r4, pc} <== NOT EXECUTED
10fe0: e3a00005 mov r0, #5 <== NOT EXECUTED
}
#endif
return 0;
}
10fe4: e8bd8010 pop {r4, pc} <== NOT EXECUTED
000106d4 <rtems_rfs_rtems_chown>:
static int
rtems_rfs_rtems_chown (const rtems_filesystem_location_info_t *pathloc,
uid_t owner,
gid_t group)
{
106d4: e92d40f0 push {r4, r5, r6, r7, lr}
106d8: e1a02802 lsl r2, r2, #16
106dc: e1a06822 lsr r6, r2, #16
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
106e0: e5902014 ldr r2, [r0, #20]
106e4: e5924008 ldr r4, [r2, #8]
static int
rtems_rfs_rtems_chown (const rtems_filesystem_location_info_t *pathloc,
uid_t owner,
gid_t group)
{
106e8: e1a03000 mov r3, r0
106ec: e24dd028 sub sp, sp, #40 ; 0x28
106f0: e1a01801 lsl r1, r1, #16
106f4: e1a05821 lsr r5, r1, #16
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_CHOWN))
printf ("rtems-rfs-rtems: chown: in: ino:%" PRId32 " uid:%d gid:%d\n",
ino, owner, group);
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
106f8: e1a00004 mov r0, r4
106fc: e5931008 ldr r1, [r3, #8]
10700: e1a0200d mov r2, sp
10704: e3a03001 mov r3, #1
10708: ebfffcc9 bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
1070c: e2507000 subs r7, r0, #0
10710: da000002 ble 10720 <rtems_rfs_rtems_chown+0x4c>
{
return rtems_rfs_rtems_error ("chown: opening inode", rc);
10714: eb0033ae bl 1d5d4 <__errno> <== NOT EXECUTED
10718: e5807000 str r7, [r0] <== NOT EXECUTED
1071c: ea000024 b 107b4 <rtems_rfs_rtems_chown+0xe0> <== NOT EXECUTED
/*
* Verify I am the owner of the node or the super user.
*/
#if defined (RTEMS_POSIX_API)
uid = geteuid();
10720: eb000fab bl 145d4 <geteuid>
* @return uint16_t The user id (uid).
*/
static inline uint16_t
rtems_rfs_inode_get_uid (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->owner) & 0xffff;
10724: e59d300c ldr r3, [sp, #12]
10728: e5d31006 ldrb r1, [r3, #6]
1072c: e5d32007 ldrb r2, [r3, #7]
if ((uid != rtems_rfs_inode_get_uid (&inode)) && (uid != 0))
10730: e1822401 orr r2, r2, r1, lsl #8
10734: e1500002 cmp r0, r2
10738: 0a000008 beq 10760 <rtems_rfs_rtems_chown+0x8c>
1073c: e3500000 cmp r0, #0 <== NOT EXECUTED
10740: 0a000006 beq 10760 <rtems_rfs_rtems_chown+0x8c> <== NOT EXECUTED
{
rtems_rfs_inode_close (fs, &inode);
10744: e1a0100d mov r1, sp <== NOT EXECUTED
10748: e1a00004 mov r0, r4 <== NOT EXECUTED
1074c: ebfffd2d bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return rtems_rfs_rtems_error ("chown: not able", EPERM);
10750: eb00339f bl 1d5d4 <__errno> <== NOT EXECUTED
10754: e3a03001 mov r3, #1 <== NOT EXECUTED
10758: e5803000 str r3, [r0] <== NOT EXECUTED
1075c: ea000014 b 107b4 <rtems_rfs_rtems_chown+0xe0> <== NOT EXECUTED
*/
static inline void
rtems_rfs_inode_set_uid_gid (rtems_rfs_inode_handle* handle,
uint16_t uid, uint16_t gid)
{
rtems_rfs_write_u32 (&handle->node->owner, (((uint32_t) gid) << 16) | uid);
10760: e1856806 orr r6, r5, r6, lsl #16
10764: e1a02c26 lsr r2, r6, #24
10768: e5c32004 strb r2, [r3, #4]
1076c: e59d300c ldr r3, [sp, #12]
10770: e1a02826 lsr r2, r6, #16
10774: e5c32005 strb r2, [r3, #5]
10778: e59d300c ldr r3, [sp, #12]
1077c: e1a06426 lsr r6, r6, #8
10780: e5c36006 strb r6, [r3, #6]
10784: e59d300c ldr r3, [sp, #12]
}
#endif
rtems_rfs_inode_set_uid_gid (&inode, owner, group);
rc = rtems_rfs_inode_close (fs, &inode);
10788: e1a00004 mov r0, r4
1078c: e5c35007 strb r5, [r3, #7]
10790: e1a0100d mov r1, sp
rtems_rfs_buffer_mark_dirty (&handle->buffer);
10794: e3a03001 mov r3, #1
10798: e5cd3010 strb r3, [sp, #16]
1079c: ebfffd19 bl fc08 <rtems_rfs_inode_close>
if (rc)
107a0: e2504000 subs r4, r0, #0
{
return rtems_rfs_rtems_error ("chown: closing inode", rc);
}
return 0;
107a4: 01a00004 moveq r0, r4
#endif
rtems_rfs_inode_set_uid_gid (&inode, owner, group);
rc = rtems_rfs_inode_close (fs, &inode);
if (rc)
107a8: 0a000002 beq 107b8 <rtems_rfs_rtems_chown+0xe4>
{
return rtems_rfs_rtems_error ("chown: closing inode", rc);
107ac: eb003388 bl 1d5d4 <__errno> <== NOT EXECUTED
107b0: e5804000 str r4, [r0] <== NOT EXECUTED
107b4: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return 0;
}
107b8: e28dd028 add sp, sp, #40 ; 0x28
107bc: e8bd80f0 pop {r4, r5, r6, r7, pc}
0001be8c <rtems_rfs_rtems_device_close>:
rtems_device_major_number major;
rtems_device_minor_number minor;
rtems_rfs_rtems_device_get_major_and_minor (iop, &major, &minor);
return rtems_deviceio_close (iop, major, minor);
1be8c: e2801028 add r1, r0, #40 ; 0x28 <== NOT EXECUTED
1be90: e8910006 ldm r1, {r1, r2} <== NOT EXECUTED
1be94: ea0002fa b 1ca84 <rtems_deviceio_close> <== NOT EXECUTED
0001be3c <rtems_rfs_rtems_device_ftruncate>:
static int
rtems_rfs_rtems_device_ftruncate (rtems_libio_t* iop, off_t length)
{
return 0;
}
1be3c: e3a00000 mov r0, #0 <== NOT EXECUTED
1be40: e12fff1e bx lr <== NOT EXECUTED
0001be44 <rtems_rfs_rtems_device_ioctl>:
static int
rtems_rfs_rtems_device_ioctl (rtems_libio_t* iop,
ioctl_command_t command,
void* buffer)
{
1be44: e92d4001 push {r0, lr} <== NOT EXECUTED
rtems_device_major_number major;
rtems_device_minor_number minor;
rtems_rfs_rtems_device_get_major_and_minor (iop, &major, &minor);
return rtems_deviceio_control (iop, command, buffer, major, minor);
1be48: e590c02c ldr ip, [r0, #44] ; 0x2c <== NOT EXECUTED
1be4c: e58dc000 str ip, [sp] <== NOT EXECUTED
1be50: e5903028 ldr r3, [r0, #40] ; 0x28 <== NOT EXECUTED
1be54: eb00034b bl 1cb88 <rtems_deviceio_control> <== NOT EXECUTED
}
1be58: e8bd8008 pop {r3, pc} <== NOT EXECUTED
0001bee4 <rtems_rfs_rtems_device_open>:
static int
rtems_rfs_rtems_device_open ( rtems_libio_t *iop,
const char *pathname,
int oflag,
mode_t mode)
{
1bee4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
1bee8: e1a08003 mov r8, r3 <== NOT EXECUTED
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
1beec: e5903024 ldr r3, [r0, #36] ; 0x24 <== NOT EXECUTED
1bef0: e5934008 ldr r4, [r3, #8] <== NOT EXECUTED
.fstat_h = rtems_rfs_rtems_fstat,
.ftruncate_h = rtems_rfs_rtems_device_ftruncate,
.fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl
};
1bef4: e5943080 ldr r3, [r4, #128] ; 0x80 <== NOT EXECUTED
static int
rtems_rfs_rtems_device_open ( rtems_libio_t *iop,
const char *pathname,
int oflag,
mode_t mode)
{
1bef8: e1a07001 mov r7, r1 <== NOT EXECUTED
*/
static inline int
rtems_rfs_mutex_lock (rtems_rfs_mutex* mutex)
{
#if __rtems__
rtems_status_code sc = rtems_semaphore_obtain (*mutex, RTEMS_WAIT, 0);
1befc: e3a01000 mov r1, #0 <== NOT EXECUTED
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
rtems_rfs_ino ino = rtems_rfs_rtems_get_iop_ino (iop);
1bf00: e590a018 ldr sl, [r0, #24] <== NOT EXECUTED
static int
rtems_rfs_rtems_device_open ( rtems_libio_t *iop,
const char *pathname,
int oflag,
mode_t mode)
{
1bf04: e24dd030 sub sp, sp, #48 ; 0x30 <== NOT EXECUTED
1bf08: e1a05000 mov r5, r0 <== NOT EXECUTED
1bf0c: e1a06002 mov r6, r2 <== NOT EXECUTED
1bf10: e5930000 ldr r0, [r3] <== NOT EXECUTED
1bf14: e1a02001 mov r2, r1 <== NOT EXECUTED
1bf18: ebffbb89 bl ad44 <rtems_semaphore_obtain> <== NOT EXECUTED
if (sc != RTEMS_SUCCESSFUL)
1bf1c: e2509000 subs r9, r0, #0 <== NOT EXECUTED
1bf20: 0a000009 beq 1bf4c <rtems_rfs_rtems_device_open+0x68> <== NOT EXECUTED
{
#if RTEMS_RFS_TRACE
if (rtems_rfs_trace (RTEMS_RFS_TRACE_MUTEX))
1bf24: e3a00004 mov r0, #4 <== NOT EXECUTED
1bf28: e3a01000 mov r1, #0 <== NOT EXECUTED
1bf2c: ebffd4ce bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1bf30: e3500000 cmp r0, #0 <== NOT EXECUTED
1bf34: 0a000004 beq 1bf4c <rtems_rfs_rtems_device_open+0x68> <== NOT EXECUTED
printf ("rtems-rfs: mutex: obtain failed: %s\n",
1bf38: e1a00009 mov r0, r9 <== NOT EXECUTED
1bf3c: ebffa9af bl 6600 <rtems_status_text> <== NOT EXECUTED
1bf40: e1a01000 mov r1, r0 <== NOT EXECUTED
1bf44: e59f00a8 ldr r0, [pc, #168] ; 1bff4 <rtems_rfs_rtems_device_open+0x110><== NOT EXECUTED
1bf48: eb000ab7 bl 1ea2c <printf> <== NOT EXECUTED
rtems_device_minor_number minor;
int rc;
rtems_rfs_rtems_lock (fs);
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
1bf4c: e1a0100a mov r1, sl <== NOT EXECUTED
1bf50: e1a00004 mov r0, r4 <== NOT EXECUTED
1bf54: e28d2008 add r2, sp, #8 <== NOT EXECUTED
1bf58: e3a03001 mov r3, #1 <== NOT EXECUTED
1bf5c: ebffceb4 bl fa34 <rtems_rfs_inode_open> <== NOT EXECUTED
if (rc > 0)
1bf60: e250a000 subs sl, r0, #0 <== NOT EXECUTED
1bf64: da000004 ble 1bf7c <rtems_rfs_rtems_device_open+0x98> <== NOT EXECUTED
{
rtems_rfs_rtems_unlock (fs);
1bf68: e1a00004 mov r0, r4 <== NOT EXECUTED
1bf6c: ebffffc9 bl 1be98 <rtems_rfs_rtems_unlock> <== NOT EXECUTED
return rtems_rfs_rtems_error ("device_open: opening inode", rc);
1bf70: eb000597 bl 1d5d4 <__errno> <== NOT EXECUTED
1bf74: e580a000 str sl, [r0] <== NOT EXECUTED
1bf78: ea000010 b 1bfc0 <rtems_rfs_rtems_device_open+0xdc> <== NOT EXECUTED
}
major = rtems_rfs_inode_get_block (&inode, 0);
1bf7c: e3a01000 mov r1, #0 <== NOT EXECUTED
1bf80: e28d0008 add r0, sp, #8 <== NOT EXECUTED
1bf84: ebffffa0 bl 1be0c <rtems_rfs_inode_get_block> <== NOT EXECUTED
minor = rtems_rfs_inode_get_block (&inode, 1);
1bf88: e3a01001 mov r1, #1 <== NOT EXECUTED
{
rtems_rfs_rtems_unlock (fs);
return rtems_rfs_rtems_error ("device_open: opening inode", rc);
}
major = rtems_rfs_inode_get_block (&inode, 0);
1bf8c: e1a0a000 mov sl, r0 <== NOT EXECUTED
minor = rtems_rfs_inode_get_block (&inode, 1);
1bf90: e28d0008 add r0, sp, #8 <== NOT EXECUTED
1bf94: ebffff9c bl 1be0c <rtems_rfs_inode_get_block> <== NOT EXECUTED
rc = rtems_rfs_inode_close (fs, &inode);
1bf98: e28d1008 add r1, sp, #8 <== NOT EXECUTED
rtems_rfs_rtems_unlock (fs);
return rtems_rfs_rtems_error ("device_open: opening inode", rc);
}
major = rtems_rfs_inode_get_block (&inode, 0);
minor = rtems_rfs_inode_get_block (&inode, 1);
1bf9c: e1a09000 mov r9, r0 <== NOT EXECUTED
rc = rtems_rfs_inode_close (fs, &inode);
1bfa0: e1a00004 mov r0, r4 <== NOT EXECUTED
1bfa4: ebffcf17 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
if (rc > 0)
1bfa8: e250b000 subs fp, r0, #0 <== NOT EXECUTED
{
rtems_rfs_rtems_unlock (fs);
1bfac: e1a00004 mov r0, r4 <== NOT EXECUTED
major = rtems_rfs_inode_get_block (&inode, 0);
minor = rtems_rfs_inode_get_block (&inode, 1);
rc = rtems_rfs_inode_close (fs, &inode);
if (rc > 0)
1bfb0: da000004 ble 1bfc8 <rtems_rfs_rtems_device_open+0xe4> <== NOT EXECUTED
{
rtems_rfs_rtems_unlock (fs);
1bfb4: ebffffb7 bl 1be98 <rtems_rfs_rtems_unlock> <== NOT EXECUTED
return rtems_rfs_rtems_error ("device_open: closing inode", rc);
1bfb8: eb000585 bl 1d5d4 <__errno> <== NOT EXECUTED
1bfbc: e580b000 str fp, [r0] <== NOT EXECUTED
1bfc0: e3e00000 mvn r0, #0 <== NOT EXECUTED
1bfc4: ea000008 b 1bfec <rtems_rfs_rtems_device_open+0x108> <== NOT EXECUTED
}
rtems_rfs_rtems_unlock (fs);
1bfc8: ebffffb2 bl 1be98 <rtems_rfs_rtems_unlock> <== NOT EXECUTED
iop->data0 = major;
1bfcc: e585a028 str sl, [r5, #40] ; 0x28 <== NOT EXECUTED
iop->data1 = (void *) minor;
1bfd0: e585902c str r9, [r5, #44] ; 0x2c <== NOT EXECUTED
return rtems_deviceio_open (iop, pathname, oflag, mode, minor, major);
1bfd4: e1a00005 mov r0, r5 <== NOT EXECUTED
1bfd8: e1a01007 mov r1, r7 <== NOT EXECUTED
1bfdc: e1a02006 mov r2, r6 <== NOT EXECUTED
1bfe0: e1a03008 mov r3, r8 <== NOT EXECUTED
1bfe4: e88d0600 stm sp, {r9, sl} <== NOT EXECUTED
1bfe8: eb00029b bl 1ca5c <rtems_deviceio_open> <== NOT EXECUTED
}
1bfec: e28dd030 add sp, sp, #48 ; 0x30 <== NOT EXECUTED
1bff0: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
0001be74 <rtems_rfs_rtems_device_read>:
* @return ssize_t
*/
static ssize_t
rtems_rfs_rtems_device_read (rtems_libio_t* iop, void* buffer, size_t count)
{
1be74: e92d4001 push {r0, lr} <== NOT EXECUTED
rtems_device_major_number major;
rtems_device_minor_number minor;
rtems_rfs_rtems_device_get_major_and_minor (iop, &major, &minor);
return rtems_deviceio_read (iop, buffer, count, major, minor);
1be78: e590c02c ldr ip, [r0, #44] ; 0x2c <== NOT EXECUTED
1be7c: e58dc000 str ip, [sp] <== NOT EXECUTED
1be80: e5903028 ldr r3, [r0, #40] ; 0x28 <== NOT EXECUTED
1be84: eb000309 bl 1cab0 <rtems_deviceio_read> <== NOT EXECUTED
}
1be88: e8bd8008 pop {r3, pc} <== NOT EXECUTED
0001be5c <rtems_rfs_rtems_device_write>:
static ssize_t
rtems_rfs_rtems_device_write (rtems_libio_t* iop,
const void* buffer,
size_t count)
{
1be5c: e92d4001 push {r0, lr} <== NOT EXECUTED
rtems_device_major_number major;
rtems_device_minor_number minor;
rtems_rfs_rtems_device_get_major_and_minor (iop, &major, &minor);
return rtems_deviceio_write (iop, buffer, count, major, minor);
1be60: e590c02c ldr ip, [r0, #44] ; 0x2c <== NOT EXECUTED
1be64: e58dc000 str ip, [sp] <== NOT EXECUTED
1be68: e5903028 ldr r3, [r0, #40] ; 0x28 <== NOT EXECUTED
1be6c: eb00032a bl 1cb1c <rtems_deviceio_write> <== NOT EXECUTED
}
1be70: e8bd8008 pop {r3, pc} <== NOT EXECUTED
0001c194 <rtems_rfs_rtems_dir_open>:
static int
rtems_rfs_rtems_dir_open (rtems_libio_t* iop,
const char* pathname,
int oflag,
mode_t mode)
{
1c194: e92d4070 push {r4, r5, r6, lr}
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
1c198: e5903024 ldr r3, [r0, #36] ; 0x24
1c19c: e5934008 ldr r4, [r3, #8]
rtems_rfs_ino ino = rtems_rfs_rtems_get_iop_ino (iop);
1c1a0: e5906018 ldr r6, [r0, #24]
static int
rtems_rfs_rtems_dir_open (rtems_libio_t* iop,
const char* pathname,
int oflag,
mode_t mode)
{
1c1a4: e24dd028 sub sp, sp, #40 ; 0x28
1c1a8: e1a05000 mov r5, r0
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
rtems_rfs_ino ino = rtems_rfs_rtems_get_iop_ino (iop);
rtems_rfs_inode_handle inode;
int rc;
rtems_rfs_rtems_lock (fs);
1c1ac: e1a00004 mov r0, r4
1c1b0: ebffff92 bl 1c000 <rtems_rfs_rtems_lock>
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
1c1b4: e1a01006 mov r1, r6
1c1b8: e1a00004 mov r0, r4
1c1bc: e1a0200d mov r2, sp
1c1c0: e3a03001 mov r3, #1
1c1c4: ebffce1a bl fa34 <rtems_rfs_inode_open>
if (rc)
1c1c8: e2506000 subs r6, r0, #0
1c1cc: 0a000004 beq 1c1e4 <rtems_rfs_rtems_dir_open+0x50>
{
rtems_rfs_rtems_unlock (fs);
1c1d0: e1a00004 mov r0, r4 <== NOT EXECUTED
1c1d4: ebffff9d bl 1c050 <rtems_rfs_rtems_unlock> <== NOT EXECUTED
return rtems_rfs_rtems_error ("dir_open: opening inode", rc);
1c1d8: eb0004fd bl 1d5d4 <__errno> <== NOT EXECUTED
1c1dc: e5806000 str r6, [r0] <== NOT EXECUTED
1c1e0: ea00000d b 1c21c <rtems_rfs_rtems_dir_open+0x88> <== NOT EXECUTED
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
1c1e4: e59d300c ldr r3, [sp, #12]
1c1e8: e5d33002 ldrb r3, [r3, #2]
}
if (!RTEMS_RFS_S_ISDIR (rtems_rfs_inode_get_mode (&inode)))
1c1ec: e1a03403 lsl r3, r3, #8
1c1f0: e2033a0f and r3, r3, #61440 ; 0xf000
1c1f4: e3530901 cmp r3, #16384 ; 0x4000
1c1f8: 0a000009 beq 1c224 <rtems_rfs_rtems_dir_open+0x90>
{
rtems_rfs_inode_close (fs, &inode);
1c1fc: e1a0100d mov r1, sp <== NOT EXECUTED
1c200: e1a00004 mov r0, r4 <== NOT EXECUTED
1c204: ebffce7f bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
rtems_rfs_rtems_unlock (fs);
1c208: e1a00004 mov r0, r4 <== NOT EXECUTED
1c20c: ebffff8f bl 1c050 <rtems_rfs_rtems_unlock> <== NOT EXECUTED
return rtems_rfs_rtems_error ("dir_open: not dir", ENOTDIR);
1c210: eb0004ef bl 1d5d4 <__errno> <== NOT EXECUTED
1c214: e3a03014 mov r3, #20 <== NOT EXECUTED
1c218: e5803000 str r3, [r0] <== NOT EXECUTED
1c21c: e3e00000 mvn r0, #0 <== NOT EXECUTED
1c220: ea000008 b 1c248 <rtems_rfs_rtems_dir_open+0xb4> <== NOT EXECUTED
}
iop->offset = 0;
1c224: e3a02000 mov r2, #0
1c228: e3a03000 mov r3, #0
1c22c: e985000c stmib r5, {r2, r3}
rtems_rfs_inode_close (fs, &inode);
1c230: e1a0100d mov r1, sp
1c234: e1a00004 mov r0, r4
1c238: ebffce72 bl fc08 <rtems_rfs_inode_close>
rtems_rfs_rtems_unlock (fs);
1c23c: e1a00004 mov r0, r4
1c240: ebffff82 bl 1c050 <rtems_rfs_rtems_unlock>
return 0;
1c244: e1a00006 mov r0, r6
}
1c248: e28dd028 add sp, sp, #40 ; 0x28
1c24c: e8bd8070 pop {r4, r5, r6, pc}
0001c09c <rtems_rfs_rtems_dir_read>:
*/
static ssize_t
rtems_rfs_rtems_dir_read (rtems_libio_t* iop,
void* buffer,
size_t count)
{
1c09c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
1c0a0: e5903024 ldr r3, [r0, #36] ; 0x24
*/
static ssize_t
rtems_rfs_rtems_dir_read (rtems_libio_t* iop,
void* buffer,
size_t count)
{
1c0a4: e24dd038 sub sp, sp, #56 ; 0x38
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
rtems_rfs_ino ino = rtems_rfs_rtems_get_iop_ino (iop);
1c0a8: e5906018 ldr r6, [r0, #24]
*/
static ssize_t
rtems_rfs_rtems_dir_read (rtems_libio_t* iop,
void* buffer,
size_t count)
{
1c0ac: e1a04000 mov r4, r0
1c0b0: e1a0b001 mov fp, r1
struct dirent* dirent;
ssize_t bytes_transferred;
int d;
int rc;
count = count / sizeof (struct dirent);
1c0b4: e1a00002 mov r0, r2
1c0b8: e3a01e11 mov r1, #272 ; 0x110
static ssize_t
rtems_rfs_rtems_dir_read (rtems_libio_t* iop,
void* buffer,
size_t count)
{
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
1c0bc: e5935008 ldr r5, [r3, #8]
struct dirent* dirent;
ssize_t bytes_transferred;
int d;
int rc;
count = count / sizeof (struct dirent);
1c0c0: ebff961e bl 1940 <__aeabi_uidiv>
dirent = buffer;
rtems_rfs_rtems_lock (fs);
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
1c0c4: e28d800c add r8, sp, #12
struct dirent* dirent;
ssize_t bytes_transferred;
int d;
int rc;
count = count / sizeof (struct dirent);
1c0c8: e1a09000 mov r9, r0
dirent = buffer;
rtems_rfs_rtems_lock (fs);
1c0cc: e1a00005 mov r0, r5
1c0d0: ebffffca bl 1c000 <rtems_rfs_rtems_lock>
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
1c0d4: e1a01006 mov r1, r6
1c0d8: e1a00005 mov r0, r5
1c0dc: e1a02008 mov r2, r8
1c0e0: e3a03001 mov r3, #1
1c0e4: ebffce52 bl fa34 <rtems_rfs_inode_open>
if (rc)
1c0e8: e2507000 subs r7, r0, #0
* exisiting file, the remaining entries will be placed in the buffer and the
* returned value will be equal to -m actual- times the size of a directory
* entry.
*/
static ssize_t
rtems_rfs_rtems_dir_read (rtems_libio_t* iop,
1c0ec: 01a06007 moveq r6, r7
bytes_transferred = 0;
for (d = 0; d < count; d++, dirent++)
{
size_t size;
rc = rtems_rfs_dir_read (fs, &inode, iop->offset, dirent, &size);
1c0f0: 028da034 addeq sl, sp, #52 ; 0x34
dirent = buffer;
rtems_rfs_rtems_lock (fs);
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
if (rc)
1c0f4: 0a00001b beq 1c168 <rtems_rfs_rtems_dir_read+0xcc>
{
rtems_rfs_rtems_unlock (fs);
1c0f8: e1a00005 mov r0, r5 <== NOT EXECUTED
1c0fc: ebffffd3 bl 1c050 <rtems_rfs_rtems_unlock> <== NOT EXECUTED
return rtems_rfs_rtems_error ("dir_read: read inode", rc);
1c100: eb000533 bl 1d5d4 <__errno> <== NOT EXECUTED
1c104: e3e06000 mvn r6, #0 <== NOT EXECUTED
1c108: e5807000 str r7, [r0] <== NOT EXECUTED
1c10c: ea00001d b 1c188 <rtems_rfs_rtems_dir_read+0xec> <== NOT EXECUTED
bytes_transferred = 0;
for (d = 0; d < count; d++, dirent++)
{
size_t size;
rc = rtems_rfs_dir_read (fs, &inode, iop->offset, dirent, &size);
1c110: e88d0402 stm sp, {r1, sl}
1c114: e994000c ldmib r4, {r2, r3}
1c118: e1a00005 mov r0, r5
1c11c: e1a01008 mov r1, r8
1c120: ebfff624 bl 199b8 <rtems_rfs_dir_read>
if (rc == ENOENT)
1c124: e3500002 cmp r0, #2
1c128: 0a000011 beq 1c174 <rtems_rfs_rtems_dir_read+0xd8>
{
rc = 0;
break;
}
if (rc > 0)
1c12c: e3500000 cmp r0, #0
1c130: da000005 ble 1c14c <rtems_rfs_rtems_dir_read+0xb0>
{
bytes_transferred = rtems_rfs_rtems_error ("dir_read: dir read", rc);
1c134: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
1c138: eb000525 bl 1d5d4 <__errno> <== NOT EXECUTED
1c13c: e59d3008 ldr r3, [sp, #8] <== NOT EXECUTED
1c140: e3e06000 mvn r6, #0 <== NOT EXECUTED
1c144: e5803000 str r3, [r0] <== NOT EXECUTED
1c148: ea000009 b 1c174 <rtems_rfs_rtems_dir_read+0xd8> <== NOT EXECUTED
break;
}
iop->offset += size;
1c14c: e994000c ldmib r4, {r2, r3}
1c150: e59d1034 ldr r1, [sp, #52] ; 0x34
1c154: e0922001 adds r2, r2, r1
1c158: e2a33000 adc r3, r3, #0
1c15c: e984000c stmib r4, {r2, r3}
* exisiting file, the remaining entries will be placed in the buffer and the
* returned value will be equal to -m actual- times the size of a directory
* entry.
*/
static ssize_t
rtems_rfs_rtems_dir_read (rtems_libio_t* iop,
1c160: e2866e11 add r6, r6, #272 ; 0x110
return rtems_rfs_rtems_error ("dir_read: read inode", rc);
}
bytes_transferred = 0;
for (d = 0; d < count; d++, dirent++)
1c164: e2877001 add r7, r7, #1
1c168: e1570009 cmp r7, r9
* exisiting file, the remaining entries will be placed in the buffer and the
* returned value will be equal to -m actual- times the size of a directory
* entry.
*/
static ssize_t
rtems_rfs_rtems_dir_read (rtems_libio_t* iop,
1c16c: e08b1006 add r1, fp, r6
return rtems_rfs_rtems_error ("dir_read: read inode", rc);
}
bytes_transferred = 0;
for (d = 0; d < count; d++, dirent++)
1c170: 1affffe6 bne 1c110 <rtems_rfs_rtems_dir_read+0x74>
}
iop->offset += size;
bytes_transferred += sizeof (struct dirent);
}
rtems_rfs_inode_close (fs, &inode);
1c174: e1a00005 mov r0, r5
1c178: e28d100c add r1, sp, #12
1c17c: ebffcea1 bl fc08 <rtems_rfs_inode_close>
rtems_rfs_rtems_unlock (fs);
1c180: e1a00005 mov r0, r5
1c184: ebffffb1 bl 1c050 <rtems_rfs_rtems_unlock>
return bytes_transferred;
}
1c188: e1a00006 mov r0, r6
1c18c: e28dd038 add sp, sp, #56 ; 0x38
1c190: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
00010a54 <rtems_rfs_rtems_eval_path>:
.eval_token = rtems_rfs_rtems_eval_token
};
static void
rtems_rfs_rtems_eval_path (rtems_filesystem_eval_path_context_t *ctx)
{
10a54: e92d4070 push {r4, r5, r6, lr}
rtems_filesystem_location_info_t *currentloc =
rtems_filesystem_eval_path_get_currentloc (ctx);
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (currentloc);
10a58: e590302c ldr r3, [r0, #44] ; 0x2c
10a5c: e5935008 ldr r5, [r3, #8]
.eval_token = rtems_rfs_rtems_eval_token
};
static void
rtems_rfs_rtems_eval_path (rtems_filesystem_eval_path_context_t *ctx)
{
10a60: e24dd028 sub sp, sp, #40 ; 0x28
10a64: e1a04000 mov r4, r0
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (currentloc);
rtems_rfs_ino ino = rtems_rfs_rtems_get_pathloc_ino (currentloc);
rtems_rfs_inode_handle inode;
int rc;
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
10a68: e5941020 ldr r1, [r4, #32]
10a6c: e1a00005 mov r0, r5
10a70: e1a0200d mov r2, sp
10a74: e3a03001 mov r3, #1
10a78: ebfffbed bl fa34 <rtems_rfs_inode_open>
if (rc == 0) {
10a7c: e2506000 subs r6, r0, #0
10a80: 1a00000b bne 10ab4 <rtems_rfs_rtems_eval_path+0x60>
rtems_filesystem_eval_path_generic (
10a84: e1a00004 mov r0, r4
10a88: e1a0100d mov r1, sp
10a8c: e59f203c ldr r2, [pc, #60] ; 10ad0 <rtems_rfs_rtems_eval_path+0x7c>
10a90: eb000fb8 bl 14978 <rtems_filesystem_eval_path_generic>
ctx,
&inode,
&rtems_rfs_rtems_eval_config
);
rc = rtems_rfs_inode_close (fs, &inode);
10a94: e1a00005 mov r0, r5
10a98: e1a0100d mov r1, sp
10a9c: ebfffc59 bl fc08 <rtems_rfs_inode_close>
if (rc != 0) {
10aa0: e2505000 subs r5, r0, #0
10aa4: 0a000007 beq 10ac8 <rtems_rfs_rtems_eval_path+0x74>
rtems_filesystem_eval_path_error (
ctx,
rtems_rfs_rtems_error ("eval_path: closing inode", rc)
10aa8: eb0032c9 bl 1d5d4 <__errno> <== NOT EXECUTED
10aac: e5805000 str r5, [r0] <== NOT EXECUTED
10ab0: ea000001 b 10abc <rtems_rfs_rtems_eval_path+0x68> <== NOT EXECUTED
);
}
} else {
rtems_filesystem_eval_path_error (
ctx,
rtems_rfs_rtems_error ("eval_path: opening inode", rc)
10ab4: eb0032c6 bl 1d5d4 <__errno> <== NOT EXECUTED
10ab8: e5806000 str r6, [r0] <== NOT EXECUTED
ctx,
rtems_rfs_rtems_error ("eval_path: closing inode", rc)
);
}
} else {
rtems_filesystem_eval_path_error (
10abc: e1a00004 mov r0, r4 <== NOT EXECUTED
10ac0: e3e01000 mvn r1, #0 <== NOT EXECUTED
10ac4: ebffdccd bl 7e00 <rtems_filesystem_eval_path_error> <== NOT EXECUTED
ctx,
rtems_rfs_rtems_error ("eval_path: opening inode", rc)
);
}
}
10ac8: e28dd028 add sp, sp, #40 ; 0x28
10acc: e8bd8070 pop {r4, r5, r6, pc}
00010d9c <rtems_rfs_rtems_eval_token>:
rtems_filesystem_eval_path_context_t *ctx,
void *arg,
const char *token,
size_t tokenlen
)
{
10d9c: e92d41f0 push {r4, r5, r6, r7, r8, lr}
10da0: e1a04000 mov r4, r0
10da4: e24dd014 sub sp, sp, #20
return rtems_filesystem_eval_path_check_access(
ctx,
eval_flags,
rtems_rfs_inode_get_mode (inode),
rtems_rfs_inode_get_uid (inode),
rtems_rfs_inode_get_gid (inode)
10da8: e1a00001 mov r0, r1
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
10dac: e591600c ldr r6, [r1, #12]
rtems_filesystem_eval_path_context_t *ctx,
void *arg,
const char *token,
size_t tokenlen
)
{
10db0: e1a05001 mov r5, r1
10db4: e1a08002 mov r8, r2
10db8: e1a07003 mov r7, r3
return rtems_filesystem_eval_path_check_access(
ctx,
eval_flags,
rtems_rfs_inode_get_mode (inode),
rtems_rfs_inode_get_uid (inode),
rtems_rfs_inode_get_gid (inode)
10dbc: ebfffd3e bl 102bc <rtems_rfs_inode_get_gid>
10dc0: e5d6e002 ldrb lr, [r6, #2]
10dc4: e5d62003 ldrb r2, [r6, #3]
* @return uint16_t The user id (uid).
*/
static inline uint16_t
rtems_rfs_inode_get_uid (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->owner) & 0xffff;
10dc8: e5d6c006 ldrb ip, [r6, #6]
10dcc: e5d63007 ldrb r3, [r6, #7]
static bool
rtems_rfs_rtems_eval_perms (rtems_filesystem_eval_path_context_t *ctx,
int eval_flags,
rtems_rfs_inode_handle* inode)
{
return rtems_filesystem_eval_path_check_access(
10dd0: e3a01001 mov r1, #1
10dd4: e58d0000 str r0, [sp]
10dd8: e182240e orr r2, r2, lr, lsl #8
10ddc: e1a00004 mov r0, r4
10de0: e183340c orr r3, r3, ip, lsl #8
10de4: eb000ed5 bl 14940 <rtems_filesystem_eval_path_check_access>
rtems_filesystem_eval_path_generic_status status =
RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_DONE;
rtems_rfs_inode_handle* inode = arg;
bool access_ok = rtems_rfs_rtems_eval_perms (ctx, RTEMS_FS_PERMS_EXEC, inode);
if (access_ok) {
10de8: e3500000 cmp r0, #0
10dec: 0a000043 beq 10f00 <rtems_rfs_rtems_eval_token+0x164>
static inline bool rtems_filesystem_is_current_directory(
const char *token,
size_t tokenlen
)
{
return tokenlen == 1 && token [0] == '.';
10df0: e3570001 cmp r7, #1
10df4: 1a000045 bne 10f10 <rtems_rfs_rtems_eval_token+0x174>
10df8: e5d83000 ldrb r3, [r8]
10dfc: e353002e cmp r3, #46 ; 0x2e
static inline void rtems_filesystem_eval_path_clear_token(
rtems_filesystem_eval_path_context_t *ctx
)
{
ctx->tokenlen = 0;
10e00: 03a03000 moveq r3, #0
10e04: 0584300c streq r3, [r4, #12]
static inline bool rtems_filesystem_is_current_directory(
const char *token,
size_t tokenlen
)
{
return tokenlen == 1 && token [0] == '.';
10e08: 1a000040 bne 10f10 <rtems_rfs_rtems_eval_token+0x174>
10e0c: ea00003c b 10f04 <rtems_rfs_rtems_eval_token+0x168>
&entry_ino,
&entry_doff
);
if (rc == 0) {
rc = rtems_rfs_inode_close (fs, inode);
10e10: e1a00006 mov r0, r6
10e14: e1a01005 mov r1, r5
10e18: ebfffb7a bl fc08 <rtems_rfs_inode_close>
if (rc == 0) {
10e1c: e3500000 cmp r0, #0
10e20: 1a000006 bne 10e40 <rtems_rfs_rtems_eval_token+0xa4>
rc = rtems_rfs_inode_open (fs, entry_ino, inode, true);
10e24: e1a00006 mov r0, r6
10e28: e59d1008 ldr r1, [sp, #8]
10e2c: e1a02005 mov r2, r5
10e30: e3a03001 mov r3, #1
10e34: ebfffafe bl fa34 <rtems_rfs_inode_open>
}
if (rc != 0) {
10e38: e2508000 subs r8, r0, #0
10e3c: 0a000042 beq 10f4c <rtems_rfs_rtems_eval_token+0x1b0>
/*
* This prevents the rtems_rfs_inode_close() from doing something in
* rtems_rfs_rtems_eval_path().
*/
memset (inode, 0, sizeof(*inode));
10e40: e1a00005 mov r0, r5 <== NOT EXECUTED
10e44: e3a01000 mov r1, #0 <== NOT EXECUTED
10e48: e3a02028 mov r2, #40 ; 0x28 <== NOT EXECUTED
10e4c: eb003685 bl 1e868 <memset> <== NOT EXECUTED
10e50: ea00002a b 10f00 <rtems_rfs_rtems_eval_token+0x164> <== NOT EXECUTED
bool follow_sym_link = (eval_flags & RTEMS_FS_FOLLOW_SYM_LINK) != 0;
bool terminal = !rtems_filesystem_eval_path_has_path (ctx);
rtems_filesystem_eval_path_clear_token (ctx);
if (is_sym_link && (follow_sym_link || !terminal)) {
10e54: e3130010 tst r3, #16
10e58: 1a000001 bne 10e64 <rtems_rfs_rtems_eval_token+0xc8>
10e5c: e3570000 cmp r7, #0
10e60: 1a00001c bne 10ed8 <rtems_rfs_rtems_eval_token+0x13c>
rtems_filesystem_eval_path_context_t* ctx,
rtems_rfs_file_system* fs,
rtems_rfs_ino ino
)
{
size_t len = MAXPATHLEN;
10e64: e3a07b01 mov r7, #1024 ; 0x400
char *link = malloc(len + 1);
10e68: e59f0120 ldr r0, [pc, #288] ; 10f90 <rtems_rfs_rtems_eval_token+0x1f4>
bool terminal = !rtems_filesystem_eval_path_has_path (ctx);
rtems_filesystem_eval_path_clear_token (ctx);
if (is_sym_link && (follow_sym_link || !terminal)) {
rtems_rfs_rtems_follow_link (ctx, fs, entry_ino);
10e6c: e59d8008 ldr r8, [sp, #8]
rtems_filesystem_eval_path_context_t* ctx,
rtems_rfs_file_system* fs,
rtems_rfs_ino ino
)
{
size_t len = MAXPATHLEN;
10e70: e58d7010 str r7, [sp, #16]
char *link = malloc(len + 1);
10e74: ebffd7d5 bl 6dd0 <malloc>
if (link != NULL) {
10e78: e2505000 subs r5, r0, #0
10e7c: 0a000012 beq 10ecc <rtems_rfs_rtems_eval_token+0x130>
int rc = rtems_rfs_symlink_read (fs, ino, link, len, &len);
10e80: e28d3010 add r3, sp, #16
10e84: e58d3000 str r3, [sp]
10e88: e1a00006 mov r0, r6
10e8c: e1a01008 mov r1, r8
10e90: e1a02005 mov r2, r5
10e94: e1a03007 mov r3, r7
10e98: eb002b41 bl 1bba4 <rtems_rfs_symlink_read>
if (rc == 0) {
10e9c: e3500000 cmp r0, #0
rtems_filesystem_eval_path_recursive (ctx, link, len);
10ea0: e1a00004 mov r0, r4
char *link = malloc(len + 1);
if (link != NULL) {
int rc = rtems_rfs_symlink_read (fs, ino, link, len, &len);
if (rc == 0) {
10ea4: 1a000003 bne 10eb8 <rtems_rfs_rtems_eval_token+0x11c>
rtems_filesystem_eval_path_recursive (ctx, link, len);
10ea8: e1a01005 mov r1, r5
10eac: e59d2010 ldr r2, [sp, #16]
10eb0: ebffdcbe bl 81b0 <rtems_filesystem_eval_path_recursive>
10eb4: ea000001 b 10ec0 <rtems_rfs_rtems_eval_token+0x124>
} else {
rtems_filesystem_eval_path_error (ctx, 0);
10eb8: e3a01000 mov r1, #0 <== NOT EXECUTED
10ebc: ebffdbcf bl 7e00 <rtems_filesystem_eval_path_error> <== NOT EXECUTED
}
free(link);
10ec0: e1a00005 mov r0, r5
10ec4: ebffd651 bl 6810 <free>
10ec8: ea00000c b 10f00 <rtems_rfs_rtems_eval_token+0x164>
} else {
rtems_filesystem_eval_path_error (ctx, ENOMEM);
10ecc: e1a00004 mov r0, r4 <== NOT EXECUTED
10ed0: e3a0100c mov r1, #12 <== NOT EXECUTED
10ed4: ea00002b b 10f88 <rtems_rfs_rtems_eval_token+0x1ec> <== NOT EXECUTED
rtems_filesystem_eval_path_clear_token (ctx);
if (is_sym_link && (follow_sym_link || !terminal)) {
rtems_rfs_rtems_follow_link (ctx, fs, entry_ino);
} else {
rc = rtems_rfs_rtems_set_handlers (currentloc, inode) ? 0 : EIO;
10ed8: e2840018 add r0, r4, #24
10edc: e1a01005 mov r1, r5
10ee0: eb0000ba bl 111d0 <rtems_rfs_rtems_set_handlers>
10ee4: e3500000 cmp r0, #0
10ee8: 0a000021 beq 10f74 <rtems_rfs_rtems_eval_token+0x1d8>
if (rc == 0) {
rtems_rfs_rtems_set_pathloc_ino (currentloc, entry_ino);
10eec: e59d3008 ldr r3, [sp, #8]
10ef0: e5843020 str r3, [r4, #32]
rtems_rfs_rtems_set_pathloc_doff (currentloc, entry_doff);
10ef4: e59d300c ldr r3, [sp, #12]
10ef8: e5843024 str r3, [r4, #36] ; 0x24
10efc: ea000000 b 10f04 <rtems_rfs_rtems_eval_token+0x168>
void *arg,
const char *token,
size_t tokenlen
)
{
rtems_filesystem_eval_path_generic_status status =
10f00: e3a07001 mov r7, #1
}
}
}
return status;
}
10f04: e1a00007 mov r0, r7
10f08: e28dd014 add sp, sp, #20
10f0c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
if (rtems_filesystem_is_current_directory (token, tokenlen)) {
rtems_filesystem_eval_path_clear_token (ctx);
} else {
rtems_filesystem_location_info_t *currentloc =
rtems_filesystem_eval_path_get_currentloc( ctx );
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (currentloc);
10f10: e594302c ldr r3, [r4, #44] ; 0x2c
10f14: e5936008 ldr r6, [r3, #8]
rtems_rfs_ino entry_ino;
uint32_t entry_doff;
int rc = rtems_rfs_dir_lookup_ino (
10f18: e28d3008 add r3, sp, #8
10f1c: e58d3000 str r3, [sp]
10f20: e28d300c add r3, sp, #12
10f24: e58d3004 str r3, [sp, #4]
10f28: e1a00006 mov r0, r6
10f2c: e1a03007 mov r3, r7
10f30: e1a01005 mov r1, r5
10f34: e1a02008 mov r2, r8
10f38: eb001fa4 bl 18dd0 <rtems_rfs_dir_lookup_ino>
tokenlen,
&entry_ino,
&entry_doff
);
if (rc == 0) {
10f3c: e3500000 cmp r0, #0
* rtems_rfs_rtems_eval_path().
*/
memset (inode, 0, sizeof(*inode));
}
} else {
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY;
10f40: 13a07002 movne r7, #2
tokenlen,
&entry_ino,
&entry_doff
);
if (rc == 0) {
10f44: 1affffee bne 10f04 <rtems_rfs_rtems_eval_token+0x168>
10f48: eaffffb0 b 10e10 <rtems_rfs_rtems_eval_token+0x74>
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_NO_ENTRY;
rc = -1;
}
if (rc == 0) {
bool is_sym_link = rtems_rfs_rtems_node_type_by_inode (inode)
10f4c: e1a00005 mov r0, r5
10f50: ebfffd00 bl 10358 <rtems_rfs_rtems_node_type_by_inode>
== RTEMS_FILESYSTEM_SYM_LINK;
int eval_flags = rtems_filesystem_eval_path_get_flags (ctx);
bool follow_sym_link = (eval_flags & RTEMS_FS_FOLLOW_SYM_LINK) != 0;
bool terminal = !rtems_filesystem_eval_path_has_path (ctx);
10f54: e5947004 ldr r7, [r4, #4]
10f58: e2777001 rsbs r7, r7, #1
10f5c: 33a07000 movcc r7, #0
rtems_filesystem_eval_path_clear_token (ctx);
if (is_sym_link && (follow_sym_link || !terminal)) {
10f60: e3500003 cmp r0, #3
static inline int rtems_filesystem_eval_path_get_flags(
const rtems_filesystem_eval_path_context_t *ctx
)
{
return ctx->flags;
10f64: e5943010 ldr r3, [r4, #16]
static inline void rtems_filesystem_eval_path_clear_token(
rtems_filesystem_eval_path_context_t *ctx
)
{
ctx->tokenlen = 0;
10f68: e584800c str r8, [r4, #12]
10f6c: 1affffd9 bne 10ed8 <rtems_rfs_rtems_eval_token+0x13c>
10f70: eaffffb7 b 10e54 <rtems_rfs_rtems_eval_token+0xb8>
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE;
}
} else {
rtems_filesystem_eval_path_error (
ctx,
rtems_rfs_rtems_error ("eval_path: set handlers", rc)
10f74: eb003196 bl 1d5d4 <__errno> <== NOT EXECUTED
10f78: e3a03005 mov r3, #5 <== NOT EXECUTED
10f7c: e5803000 str r3, [r0] <== NOT EXECUTED
if (!terminal) {
status = RTEMS_FILESYSTEM_EVAL_PATH_GENERIC_CONTINUE;
}
} else {
rtems_filesystem_eval_path_error (
10f80: e3e01000 mvn r1, #0 <== NOT EXECUTED
10f84: e1a00004 mov r0, r4 <== NOT EXECUTED
10f88: ebffdb9c bl 7e00 <rtems_filesystem_eval_path_error> <== NOT EXECUTED
10f8c: eaffffdb b 10f00 <rtems_rfs_rtems_eval_token+0x164> <== NOT EXECUTED
000107c0 <rtems_rfs_rtems_fchmod>:
}
static int
rtems_rfs_rtems_fchmod (const rtems_filesystem_location_info_t* pathloc,
mode_t mode)
{
107c0: e92d40f0 push {r4, r5, r6, r7, lr}
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
107c4: e5902014 ldr r2, [r0, #20]
107c8: e5924008 ldr r4, [r2, #8]
}
static int
rtems_rfs_rtems_fchmod (const rtems_filesystem_location_info_t* pathloc,
mode_t mode)
{
107cc: e1a03000 mov r3, r0
107d0: e24dd028 sub sp, sp, #40 ; 0x28
107d4: e1a05001 mov r5, r1
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FCHMOD))
printf ("rtems-rfs-rtems: fchmod: in: ino:%" PRId32 " mode:%06" PRIomode_t "\n",
ino, mode);
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
107d8: e1a00004 mov r0, r4
107dc: e5931008 ldr r1, [r3, #8]
107e0: e1a0200d mov r2, sp
107e4: e3a03001 mov r3, #1
107e8: ebfffc91 bl fa34 <rtems_rfs_inode_open>
if (rc)
107ec: e2506000 subs r6, r0, #0
107f0: 0a000002 beq 10800 <rtems_rfs_rtems_fchmod+0x40>
{
return rtems_rfs_rtems_error ("fchmod: opening inode", rc);
107f4: eb003376 bl 1d5d4 <__errno> <== NOT EXECUTED
107f8: e5806000 str r6, [r0] <== NOT EXECUTED
107fc: ea000026 b 1089c <rtems_rfs_rtems_fchmod+0xdc> <== NOT EXECUTED
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
10800: e59d300c ldr r3, [sp, #12]
10804: e5d37002 ldrb r7, [r3, #2]
10808: e5d36003 ldrb r6, [r3, #3]
/*
* Verify I am the owner of the node or the super user.
*/
#if defined (RTEMS_POSIX_API)
uid = geteuid();
1080c: eb000f70 bl 145d4 <geteuid>
* @return uint16_t The user id (uid).
*/
static inline uint16_t
rtems_rfs_inode_get_uid (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->owner) & 0xffff;
10810: e59d300c ldr r3, [sp, #12]
10814: e5d31006 ldrb r1, [r3, #6]
10818: e5d32007 ldrb r2, [r3, #7]
if ((uid != rtems_rfs_inode_get_uid (&inode)) && (uid != 0))
1081c: e1822401 orr r2, r2, r1, lsl #8
10820: e1500002 cmp r0, r2
10824: 0a000008 beq 1084c <rtems_rfs_rtems_fchmod+0x8c>
10828: e3500000 cmp r0, #0 <== NOT EXECUTED
1082c: 0a000006 beq 1084c <rtems_rfs_rtems_fchmod+0x8c> <== NOT EXECUTED
{
rtems_rfs_inode_close (fs, &inode);
10830: e1a0100d mov r1, sp <== NOT EXECUTED
10834: e1a00004 mov r0, r4 <== NOT EXECUTED
10838: ebfffcf2 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return rtems_rfs_rtems_error ("fchmod: checking uid", EPERM);
1083c: eb003364 bl 1d5d4 <__errno> <== NOT EXECUTED
10840: e3a03001 mov r3, #1 <== NOT EXECUTED
10844: e5803000 str r3, [r0] <== NOT EXECUTED
10848: ea000013 b 1089c <rtems_rfs_rtems_fchmod+0xdc> <== NOT EXECUTED
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
1084c: e1866407 orr r6, r6, r7, lsl #8
}
#endif
imode &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX);
10850: e2066a0f and r6, r6, #61440 ; 0xf000
imode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX);
10854: e1a05a05 lsl r5, r5, #20
10858: e1865a25 orr r5, r6, r5, lsr #20
1085c: e1a05805 lsl r5, r5, #16
10860: e1a02825 lsr r2, r5, #16
* @prarm mode The mode.
*/
static inline void
rtems_rfs_inode_set_mode (rtems_rfs_inode_handle* handle, uint16_t mode)
{
rtems_rfs_write_u16 (&handle->node->mode, mode);
10864: e1a05c25 lsr r5, r5, #24
10868: e5c35002 strb r5, [r3, #2]
1086c: e59d300c ldr r3, [sp, #12]
rtems_rfs_inode_set_mode (&inode, imode);
rc = rtems_rfs_inode_close (fs, &inode);
10870: e1a00004 mov r0, r4
10874: e5c32003 strb r2, [r3, #3]
10878: e1a0100d mov r1, sp
rtems_rfs_buffer_mark_dirty (&handle->buffer);
1087c: e3a03001 mov r3, #1
10880: e5cd3010 strb r3, [sp, #16]
10884: ebfffcdf bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
10888: e2504000 subs r4, r0, #0
{
return rtems_rfs_rtems_error ("fchmod: closing inode", rc);
}
return 0;
1088c: d3a00000 movle r0, #0
imode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX);
rtems_rfs_inode_set_mode (&inode, imode);
rc = rtems_rfs_inode_close (fs, &inode);
if (rc > 0)
10890: da000002 ble 108a0 <rtems_rfs_rtems_fchmod+0xe0>
{
return rtems_rfs_rtems_error ("fchmod: closing inode", rc);
10894: eb00334e bl 1d5d4 <__errno> <== NOT EXECUTED
10898: e5804000 str r4, [r0] <== NOT EXECUTED
1089c: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return 0;
}
108a0: e28dd028 add sp, sp, #40 ; 0x28
108a4: e8bd80f0 pop {r4, r5, r6, r7, pc}
000111a0 <rtems_rfs_rtems_fdatasync>:
int
rtems_rfs_rtems_fdatasync (rtems_libio_t* iop)
{
int rc;
rc = rtems_rfs_buffer_sync (rtems_rfs_rtems_pathloc_dev (&iop->pathinfo));
111a0: e5903024 ldr r3, [r0, #36] ; 0x24 <== NOT EXECUTED
* @param iop
* @return int
*/
int
rtems_rfs_rtems_fdatasync (rtems_libio_t* iop)
{
111a4: e92d4010 push {r4, lr} <== NOT EXECUTED
int rc;
rc = rtems_rfs_buffer_sync (rtems_rfs_rtems_pathloc_dev (&iop->pathinfo));
111a8: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
111ac: eb001e60 bl 18b34 <rtems_rfs_buffer_sync> <== NOT EXECUTED
if (rc)
111b0: e2504000 subs r4, r0, #0 <== NOT EXECUTED
111b4: 0a000003 beq 111c8 <rtems_rfs_rtems_fdatasync+0x28> <== NOT EXECUTED
return rtems_rfs_rtems_error ("fdatasync: sync", rc);
111b8: eb003105 bl 1d5d4 <__errno> <== NOT EXECUTED
111bc: e5804000 str r4, [r0] <== NOT EXECUTED
111c0: e3e00000 mvn r0, #0 <== NOT EXECUTED
111c4: e8bd8010 pop {r4, pc} <== NOT EXECUTED
return 0;
111c8: e1a00004 mov r0, r4 <== NOT EXECUTED
}
111cc: e8bd8010 pop {r4, pc} <== NOT EXECUTED
0001c678 <rtems_rfs_rtems_file_close>:
* @param iop
* @return int
*/
static int
rtems_rfs_rtems_file_close (rtems_libio_t* iop)
{
1c678: e92d4030 push {r4, r5, lr}
rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
1c67c: e590501c ldr r5, [r0, #28]
rtems_rfs_file_system* fs = rtems_rfs_file_fs (file);
1c680: e595301c ldr r3, [r5, #28]
1c684: e5934098 ldr r4, [r3, #152] ; 0x98
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_CLOSE))
printf("rtems-rfs: file-close: handle:%p\n", file);
rtems_rfs_rtems_lock (fs);
1c688: e1a00004 mov r0, r4
1c68c: ebfffeef bl 1c250 <rtems_rfs_rtems_lock>
rc = rtems_rfs_file_close (fs, file);
1c690: e1a01005 mov r1, r5
1c694: e1a00004 mov r0, r4
1c698: ebfff607 bl 19ebc <rtems_rfs_file_close>
if (rc > 0)
1c69c: e2505000 subs r5, r0, #0
1c6a0: da000002 ble 1c6b0 <rtems_rfs_rtems_file_close+0x38>
rc = rtems_rfs_rtems_error ("file-close: file close", rc);
1c6a4: eb0003ca bl 1d5d4 <__errno> <== NOT EXECUTED
1c6a8: e5805000 str r5, [r0] <== NOT EXECUTED
1c6ac: e3e05000 mvn r5, #0 <== NOT EXECUTED
rtems_rfs_rtems_unlock (fs);
1c6b0: e1a00004 mov r0, r4
1c6b4: ebfffef9 bl 1c2a0 <rtems_rfs_rtems_unlock>
return rc;
}
1c6b8: e1a00005 mov r0, r5
1c6bc: e8bd8030 pop {r4, r5, pc}
0001c2ec <rtems_rfs_rtems_file_ftruncate>:
* @return int
*/
static int
rtems_rfs_rtems_file_ftruncate (rtems_libio_t* iop,
off_t length)
{
1c2ec: e92d40f0 push {r4, r5, r6, r7, lr}
rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
1c2f0: e590401c ldr r4, [r0, #28]
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_FTRUNC))
printf("rtems-rfs: file-ftrunc: handle:%p length:%" PRIdoff_t "\n", file, length);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c2f4: e594301c ldr r3, [r4, #28]
* @return int
*/
static int
rtems_rfs_rtems_file_ftruncate (rtems_libio_t* iop,
off_t length)
{
1c2f8: e1a06001 mov r6, r1
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_FTRUNC))
printf("rtems-rfs: file-ftrunc: handle:%p length:%" PRIdoff_t "\n", file, length);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c2fc: e5930098 ldr r0, [r3, #152] ; 0x98
* @return int
*/
static int
rtems_rfs_rtems_file_ftruncate (rtems_libio_t* iop,
off_t length)
{
1c300: e1a07002 mov r7, r2
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_FTRUNC))
printf("rtems-rfs: file-ftrunc: handle:%p length:%" PRIdoff_t "\n", file, length);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c304: ebffffd1 bl 1c250 <rtems_rfs_rtems_lock>
rc = rtems_rfs_file_set_size (file, length);
1c308: e1a00004 mov r0, r4
1c30c: e1a01006 mov r1, r6
1c310: e1a02007 mov r2, r7
1c314: ebfff8cb bl 1a648 <rtems_rfs_file_set_size>
if (rc)
1c318: e2505000 subs r5, r0, #0
1c31c: 0a000002 beq 1c32c <rtems_rfs_rtems_file_ftruncate+0x40>
rc = rtems_rfs_rtems_error ("file_ftruncate: set size", rc);
1c320: eb0004ab bl 1d5d4 <__errno> <== NOT EXECUTED
1c324: e5805000 str r5, [r0] <== NOT EXECUTED
1c328: e3e05000 mvn r5, #0 <== NOT EXECUTED
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
1c32c: e594301c ldr r3, [r4, #28]
1c330: e5930098 ldr r0, [r3, #152] ; 0x98
1c334: ebffffd9 bl 1c2a0 <rtems_rfs_rtems_unlock>
return rc;
}
1c338: e1a00005 mov r0, r5
1c33c: e8bd80f0 pop {r4, r5, r6, r7, pc}
0001c340 <rtems_rfs_rtems_file_lseek>:
*/
static off_t
rtems_rfs_rtems_file_lseek (rtems_libio_t* iop,
off_t offset,
int whence)
{
1c340: e92d4f7f push {r0, r1, r2, r3, r4, r5, r6, r8, r9, sl, fp, lr}
rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
1c344: e590501c ldr r5, [r0, #28]
*/
static off_t
rtems_rfs_rtems_file_lseek (rtems_libio_t* iop,
off_t offset,
int whence)
{
1c348: e1a06003 mov r6, r3
off_t new_offset;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_LSEEK))
printf("rtems-rfs: file-lseek: handle:%p offset:%" PRIdoff_t "\n", file, offset);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c34c: e595301c ldr r3, [r5, #28]
*/
static off_t
rtems_rfs_rtems_file_lseek (rtems_libio_t* iop,
off_t offset,
int whence)
{
1c350: e1a04000 mov r4, r0
off_t new_offset;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_LSEEK))
printf("rtems-rfs: file-lseek: handle:%p offset:%" PRIdoff_t "\n", file, offset);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c354: e5930098 ldr r0, [r3, #152] ; 0x98
*/
static off_t
rtems_rfs_rtems_file_lseek (rtems_libio_t* iop,
off_t offset,
int whence)
{
1c358: e1a09002 mov r9, r2
1c35c: e1a08001 mov r8, r1
off_t new_offset;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_LSEEK))
printf("rtems-rfs: file-lseek: handle:%p offset:%" PRIdoff_t "\n", file, offset);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c360: ebffffba bl 1c250 <rtems_rfs_rtems_lock>
old_offset = iop->offset;
1c364: e994000c ldmib r4, {r2, r3}
new_offset = rtems_filesystem_default_lseek_file (iop, offset, whence);
1c368: e1a01008 mov r1, r8
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_LSEEK))
printf("rtems-rfs: file-lseek: handle:%p offset:%" PRIdoff_t "\n", file, offset);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
old_offset = iop->offset;
1c36c: e88d000c stm sp, {r2, r3}
new_offset = rtems_filesystem_default_lseek_file (iop, offset, whence);
1c370: e1a00004 mov r0, r4
1c374: e1a02009 mov r2, r9
1c378: e1a03006 mov r3, r6
1c37c: eb00010a bl 1c7ac <rtems_filesystem_default_lseek_file>
if (new_offset != -1)
1c380: e3e0a000 mvn sl, #0
printf("rtems-rfs: file-lseek: handle:%p offset:%" PRIdoff_t "\n", file, offset);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
old_offset = iop->offset;
new_offset = rtems_filesystem_default_lseek_file (iop, offset, whence);
1c384: e1a08000 mov r8, r0
1c388: e1a09001 mov r9, r1
if (new_offset != -1)
1c38c: e3e0b000 mvn fp, #0
1c390: e159000b cmp r9, fp
1c394: 0158000a cmpeq r8, sl
1c398: 0a00000c beq 1c3d0 <rtems_rfs_rtems_file_lseek+0x90>
{
rtems_rfs_pos pos = iop->offset;
1c39c: e9940006 ldmib r4, {r1, r2}
1c3a0: e28d3010 add r3, sp, #16
1c3a4: e9230006 stmdb r3!, {r1, r2}
int rc = rtems_rfs_file_seek (file, pos, &pos);
1c3a8: e1a00005 mov r0, r5
1c3ac: ebfff86e bl 1a56c <rtems_rfs_file_seek>
if (rc)
1c3b0: e2506000 subs r6, r0, #0
1c3b4: 0a000005 beq 1c3d0 <rtems_rfs_rtems_file_lseek+0x90>
{
rtems_rfs_rtems_error ("file_lseek: lseek", rc);
1c3b8: eb000485 bl 1d5d4 <__errno> <== NOT EXECUTED
iop->offset = old_offset;
1c3bc: e89d000c ldm sp, {r2, r3} <== NOT EXECUTED
rtems_rfs_pos pos = iop->offset;
int rc = rtems_rfs_file_seek (file, pos, &pos);
if (rc)
{
rtems_rfs_rtems_error ("file_lseek: lseek", rc);
1c3c0: e5806000 str r6, [r0] <== NOT EXECUTED
iop->offset = old_offset;
1c3c4: e984000c stmib r4, {r2, r3} <== NOT EXECUTED
new_offset = -1;
1c3c8: e1a0800a mov r8, sl <== NOT EXECUTED
1c3cc: e1a0900b mov r9, fp <== NOT EXECUTED
}
}
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
1c3d0: e595301c ldr r3, [r5, #28]
1c3d4: e5930098 ldr r0, [r3, #152] ; 0x98
1c3d8: ebffffb0 bl 1c2a0 <rtems_rfs_rtems_unlock>
return new_offset;
}
1c3dc: e1a00008 mov r0, r8
1c3e0: e1a01009 mov r1, r9
1c3e4: e28dd010 add sp, sp, #16
1c3e8: e8bd8f70 pop {r4, r5, r6, r8, r9, sl, fp, pc}
0001c6c0 <rtems_rfs_rtems_file_open>:
static int
rtems_rfs_rtems_file_open (rtems_libio_t* iop,
const char* pathname,
int oflag,
mode_t mode)
{
1c6c0: e92d4071 push {r0, r4, r5, r6, lr}
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (&iop->pathinfo);
1c6c4: e5903024 ldr r3, [r0, #36] ; 0x24
1c6c8: e5934008 ldr r4, [r3, #8]
static int
rtems_rfs_rtems_file_open (rtems_libio_t* iop,
const char* pathname,
int oflag,
mode_t mode)
{
1c6cc: e1a05000 mov r5, r0
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_OPEN))
printf("rtems-rfs: file-open: path:%s ino:%" PRId32 " flags:%04i mode:%04" PRIu32 "\n",
pathname, ino, flags, mode);
rtems_rfs_rtems_lock (fs);
1c6d0: e1a00004 mov r0, r4
1c6d4: ebfffedd bl 1c250 <rtems_rfs_rtems_lock>
ino = rtems_rfs_rtems_get_iop_ino (iop);
rc = rtems_rfs_file_open (fs, ino, flags, &file);
1c6d8: e1a00004 mov r0, r4
1c6dc: e5951018 ldr r1, [r5, #24]
1c6e0: e3a02000 mov r2, #0
1c6e4: e1a0300d mov r3, sp
1c6e8: ebfff89a bl 1a958 <rtems_rfs_file_open>
if (rc > 0)
1c6ec: e2506000 subs r6, r0, #0
1c6f0: da000005 ble 1c70c <rtems_rfs_rtems_file_open+0x4c>
{
rtems_rfs_rtems_unlock (fs);
1c6f4: e1a00004 mov r0, r4 <== NOT EXECUTED
1c6f8: ebfffee8 bl 1c2a0 <rtems_rfs_rtems_unlock> <== NOT EXECUTED
return rtems_rfs_rtems_error ("file-open: open", rc);
1c6fc: eb0003b4 bl 1d5d4 <__errno> <== NOT EXECUTED
1c700: e5806000 str r6, [r0] <== NOT EXECUTED
1c704: e3e00000 mvn r0, #0 <== NOT EXECUTED
1c708: ea000004 b 1c720 <rtems_rfs_rtems_file_open+0x60> <== NOT EXECUTED
}
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_OPEN))
printf("rtems-rfs: file-open: handle:%p\n", file);
rtems_rfs_rtems_set_iop_file_handle (iop, file);
1c70c: e59d3000 ldr r3, [sp]
rtems_rfs_rtems_unlock (fs);
1c710: e1a00004 mov r0, r4
}
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_OPEN))
printf("rtems-rfs: file-open: handle:%p\n", file);
rtems_rfs_rtems_set_iop_file_handle (iop, file);
1c714: e585301c str r3, [r5, #28]
rtems_rfs_rtems_unlock (fs);
1c718: ebfffee0 bl 1c2a0 <rtems_rfs_rtems_unlock>
return 0;
1c71c: e3a00000 mov r0, #0
}
1c720: e8bd8078 pop {r3, r4, r5, r6, pc}
0001c574 <rtems_rfs_rtems_file_read>:
*/
static ssize_t
rtems_rfs_rtems_file_read (rtems_libio_t* iop,
void* buffer,
size_t count)
{
1c574: e92d45f7 push {r0, r1, r2, r4, r5, r6, r7, r8, sl, lr}
rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
1c578: e590501c ldr r5, [r0, #28]
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_READ))
printf("rtems-rfs: file-read: handle:%p count:%zd\n", file, count);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c57c: e595301c ldr r3, [r5, #28]
*/
static ssize_t
rtems_rfs_rtems_file_read (rtems_libio_t* iop,
void* buffer,
size_t count)
{
1c580: e1a0a000 mov sl, r0
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_READ))
printf("rtems-rfs: file-read: handle:%p count:%zd\n", file, count);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c584: e5930098 ldr r0, [r3, #152] ; 0x98
*/
static ssize_t
rtems_rfs_rtems_file_read (rtems_libio_t* iop,
void* buffer,
size_t count)
{
1c588: e1a08001 mov r8, r1
1c58c: e1a06002 mov r6, r2
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_READ))
printf("rtems-rfs: file-read: handle:%p count:%zd\n", file, count);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c590: ebffff2e bl 1c250 <rtems_rfs_rtems_lock>
pos = iop->offset;
if (pos < rtems_rfs_file_size (file))
1c594: e595101c ldr r1, [r5, #28]
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_READ))
printf("rtems-rfs: file-read: handle:%p count:%zd\n", file, count);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
pos = iop->offset;
1c598: e99a0018 ldmib sl, {r3, r4}
1c59c: e5910098 ldr r0, [r1, #152] ; 0x98
1c5a0: e2811084 add r1, r1, #132 ; 0x84
1c5a4: e88d0018 stm sp, {r3, r4}
1c5a8: ebffecab bl 1785c <rtems_rfs_block_get_size>
if (pos < rtems_rfs_file_size (file))
1c5ac: e89d0018 ldm sp, {r3, r4}
1c5b0: e1540001 cmp r4, r1
1c5b4: 01530000 cmpeq r3, r0
1c5b8: e3a04000 mov r4, #0
1c5bc: 3a000020 bcc 1c644 <rtems_rfs_rtems_file_read+0xd0>
1c5c0: ea000023 b 1c654 <rtems_rfs_rtems_file_read+0xe0>
{
while (count)
{
size_t size;
rc = rtems_rfs_file_io_start (file, &size, true);
1c5c4: e1a00005 mov r0, r5
1c5c8: e28d1008 add r1, sp, #8
1c5cc: e3a02001 mov r2, #1
1c5d0: ebfff6db bl 1a144 <rtems_rfs_file_io_start>
if (rc > 0)
1c5d4: e2507000 subs r7, r0, #0
1c5d8: ca000015 bgt 1c634 <rtems_rfs_rtems_file_read+0xc0>
{
read = rtems_rfs_rtems_error ("file-read: read: io-start", rc);
break;
}
if (size == 0)
1c5dc: e59d3008 ldr r3, [sp, #8]
1c5e0: e3530000 cmp r3, #0
1c5e4: 0a000018 beq 1c64c <rtems_rfs_rtems_file_read+0xd8>
break;
if (size > count)
1c5e8: e1530006 cmp r3, r6
size = count;
1c5ec: 858d6008 strhi r6, [sp, #8]
memcpy (data, rtems_rfs_file_data (file), size);
1c5f0: e595300c ldr r3, [r5, #12]
1c5f4: e59d7008 ldr r7, [sp, #8]
1c5f8: e593101c ldr r1, [r3, #28]
1c5fc: e5953014 ldr r3, [r5, #20]
1c600: e1a02007 mov r2, r7
1c604: e0811003 add r1, r1, r3
1c608: e1a00008 mov r0, r8
1c60c: eb000812 bl 1e65c <memcpy>
data += size;
count -= size;
read += size;
rc = rtems_rfs_file_io_end (file, size, true);
1c610: e1a01007 mov r1, r7
1c614: e1a00005 mov r0, r5
1c618: e3a02001 mov r2, #1
1c61c: ebfff746 bl 1a33c <rtems_rfs_file_io_end>
if (size > count)
size = count;
memcpy (data, rtems_rfs_file_data (file), size);
data += size;
1c620: e0888007 add r8, r8, r7
count -= size;
1c624: e0676006 rsb r6, r7, r6
read += size;
1c628: e0844007 add r4, r4, r7
rc = rtems_rfs_file_io_end (file, size, true);
if (rc > 0)
1c62c: e2507000 subs r7, r0, #0
1c630: da000003 ble 1c644 <rtems_rfs_rtems_file_read+0xd0>
{
read = rtems_rfs_rtems_error ("file-read: read: io-end", rc);
1c634: eb0003e6 bl 1d5d4 <__errno> <== NOT EXECUTED
size_t count)
{
rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
rtems_rfs_pos pos;
uint8_t* data = buffer;
ssize_t read = 0;
1c638: e3e04000 mvn r4, #0 <== NOT EXECUTED
read += size;
rc = rtems_rfs_file_io_end (file, size, true);
if (rc > 0)
{
read = rtems_rfs_rtems_error ("file-read: read: io-end", rc);
1c63c: e5807000 str r7, [r0] <== NOT EXECUTED
1c640: ea000007 b 1c664 <rtems_rfs_rtems_file_read+0xf0> <== NOT EXECUTED
pos = iop->offset;
if (pos < rtems_rfs_file_size (file))
{
while (count)
1c644: e3560000 cmp r6, #0
1c648: 1affffdd bne 1c5c4 <rtems_rfs_rtems_file_read+0x50>
break;
}
}
}
if (read >= 0)
1c64c: e3540000 cmp r4, #0
1c650: ba000003 blt 1c664 <rtems_rfs_rtems_file_read+0xf0>
iop->offset = pos + read;
1c654: e89d000c ldm sp, {r2, r3}
1c658: e0922004 adds r2, r2, r4
1c65c: e0a33fc4 adc r3, r3, r4, asr #31
1c660: e98a000c stmib sl, {r2, r3}
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
1c664: e595301c ldr r3, [r5, #28]
1c668: e5930098 ldr r0, [r3, #152] ; 0x98
1c66c: ebffff0b bl 1c2a0 <rtems_rfs_rtems_unlock>
return read;
}
1c670: e1a00004 mov r0, r4
1c674: e8bd85fe pop {r1, r2, r3, r4, r5, r6, r7, r8, sl, pc}
0001c3ec <rtems_rfs_rtems_file_write>:
*/
static ssize_t
rtems_rfs_rtems_file_write (rtems_libio_t* iop,
const void* buffer,
size_t count)
{
1c3ec: e92d47f7 push {r0, r1, r2, r4, r5, r6, r7, r8, r9, sl, lr}
rtems_rfs_file_handle* file = rtems_rfs_rtems_get_iop_file_handle (iop);
1c3f0: e590401c ldr r4, [r0, #28]
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_WRITE))
printf("rtems-rfs: file-write: handle:%p count:%zd\n", file, count);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c3f4: e594301c ldr r3, [r4, #28]
*/
static ssize_t
rtems_rfs_rtems_file_write (rtems_libio_t* iop,
const void* buffer,
size_t count)
{
1c3f8: e1a07000 mov r7, r0
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_WRITE))
printf("rtems-rfs: file-write: handle:%p count:%zd\n", file, count);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c3fc: e5930098 ldr r0, [r3, #152] ; 0x98
*/
static ssize_t
rtems_rfs_rtems_file_write (rtems_libio_t* iop,
const void* buffer,
size_t count)
{
1c400: e1a05001 mov r5, r1
1c404: e1a06002 mov r6, r2
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_WRITE))
printf("rtems-rfs: file-write: handle:%p count:%zd\n", file, count);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
1c408: ebffff90 bl 1c250 <rtems_rfs_rtems_lock>
pos = iop->offset;
file_size = rtems_rfs_file_size (file);
1c40c: e594101c ldr r1, [r4, #28]
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_FILE_WRITE))
printf("rtems-rfs: file-write: handle:%p count:%zd\n", file, count);
rtems_rfs_rtems_lock (rtems_rfs_file_fs (file));
pos = iop->offset;
1c410: e997000c ldmib r7, {r2, r3}
1c414: e5910098 ldr r0, [r1, #152] ; 0x98
1c418: e2811084 add r1, r1, #132 ; 0x84
1c41c: e88d000c stm sp, {r2, r3}
1c420: ebffed0d bl 1785c <rtems_rfs_block_get_size>
file_size = rtems_rfs_file_size (file);
if (pos > file_size)
1c424: e89d000c ldm sp, {r2, r3}
1c428: e1a08000 mov r8, r0
1c42c: e1a09001 mov r9, r1
1c430: e1590003 cmp r9, r3
1c434: 01580002 cmpeq r8, r2
1c438: 2a00000b bcs 1c46c <rtems_rfs_rtems_file_write+0x80>
/*
* If the iop position is past the physical end of the file we need to set
* the file size to the new length before writing. The
* rtems_rfs_file_io_end() will grow the file subsequently.
*/
rc = rtems_rfs_file_set_size (file, pos);
1c43c: e1a01002 mov r1, r2
1c440: e1a00004 mov r0, r4
1c444: e1a02003 mov r2, r3
1c448: ebfff87e bl 1a648 <rtems_rfs_file_set_size>
1c44c: e594301c ldr r3, [r4, #28]
if (rc)
1c450: e2508000 subs r8, r0, #0
{
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
1c454: e5930098 ldr r0, [r3, #152] ; 0x98
* If the iop position is past the physical end of the file we need to set
* the file size to the new length before writing. The
* rtems_rfs_file_io_end() will grow the file subsequently.
*/
rc = rtems_rfs_file_set_size (file, pos);
if (rc)
1c458: 1a000013 bne 1c4ac <rtems_rfs_rtems_file_write+0xc0>
{
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
return rtems_rfs_rtems_error ("file-write: write extend", rc);
}
rtems_rfs_file_set_bpos (file, pos);
1c45c: e89d0006 ldm sp, {r1, r2}
1c460: e2843010 add r3, r4, #16
1c464: ebffeccc bl 1779c <rtems_rfs_block_get_bpos>
1c468: ea000032 b 1c538 <rtems_rfs_rtems_file_write+0x14c>
}
else if (pos < file_size && (iop->flags & LIBIO_FLAGS_APPEND) != 0)
1c46c: e1530009 cmp r3, r9
1c470: 01520008 cmpeq r2, r8
1c474: 2a00002f bcs 1c538 <rtems_rfs_rtems_file_write+0x14c>
1c478: e597300c ldr r3, [r7, #12]
1c47c: e3130c02 tst r3, #512 ; 0x200
1c480: 0a00002c beq 1c538 <rtems_rfs_rtems_file_write+0x14c>
{
pos = file_size;
rc = rtems_rfs_file_seek (file, pos, &pos);
1c484: e1a01008 mov r1, r8
1c488: e1a00004 mov r0, r4
1c48c: e1a02009 mov r2, r9
1c490: e1a0300d mov r3, sp
rtems_rfs_file_set_bpos (file, pos);
}
else if (pos < file_size && (iop->flags & LIBIO_FLAGS_APPEND) != 0)
{
pos = file_size;
1c494: e88d0300 stm sp, {r8, r9}
rc = rtems_rfs_file_seek (file, pos, &pos);
1c498: ebfff833 bl 1a56c <rtems_rfs_file_seek>
if (rc)
1c49c: e2508000 subs r8, r0, #0
1c4a0: 0a000024 beq 1c538 <rtems_rfs_rtems_file_write+0x14c>
{
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
1c4a4: e594301c ldr r3, [r4, #28] <== NOT EXECUTED
1c4a8: e5930098 ldr r0, [r3, #152] ; 0x98 <== NOT EXECUTED
1c4ac: ebffff7b bl 1c2a0 <rtems_rfs_rtems_unlock> <== NOT EXECUTED
return rtems_rfs_rtems_error ("file-write: write append seek", rc);
1c4b0: eb000447 bl 1d5d4 <__errno> <== NOT EXECUTED
1c4b4: e3e05000 mvn r5, #0 <== NOT EXECUTED
1c4b8: e5808000 str r8, [r0] <== NOT EXECUTED
1c4bc: ea00002a b 1c56c <rtems_rfs_rtems_file_write+0x180> <== NOT EXECUTED
while (count)
{
size_t size = count;
rc = rtems_rfs_file_io_start (file, &size, false);
1c4c0: e1a00004 mov r0, r4
1c4c4: e28d1008 add r1, sp, #8
1c4c8: e3a02000 mov r2, #0
}
}
while (count)
{
size_t size = count;
1c4cc: e58d6008 str r6, [sp, #8]
rc = rtems_rfs_file_io_start (file, &size, false);
1c4d0: ebfff71b bl 1a144 <rtems_rfs_file_io_start>
if (rc)
1c4d4: e250a000 subs sl, r0, #0
1c4d8: 1a000012 bne 1c528 <rtems_rfs_rtems_file_write+0x13c>
{
write = rtems_rfs_rtems_error ("file-write: write open", rc);
break;
}
if (size > count)
1c4dc: e59d3008 ldr r3, [sp, #8]
1c4e0: e1530006 cmp r3, r6
size = count;
memcpy (rtems_rfs_file_data (file), data, size);
1c4e4: e594300c ldr r3, [r4, #12]
write = rtems_rfs_rtems_error ("file-write: write open", rc);
break;
}
if (size > count)
size = count;
1c4e8: 858d6008 strhi r6, [sp, #8]
memcpy (rtems_rfs_file_data (file), data, size);
1c4ec: e593001c ldr r0, [r3, #28]
1c4f0: e5943014 ldr r3, [r4, #20]
1c4f4: e1a01008 mov r1, r8
1c4f8: e0800003 add r0, r0, r3
1c4fc: e59d2008 ldr r2, [sp, #8]
1c500: eb000855 bl 1e65c <memcpy>
data += size;
1c504: e59d1008 ldr r1, [sp, #8]
count -= size;
write += size;
rc = rtems_rfs_file_io_end (file, size, false);
1c508: e1a00004 mov r0, r4
1c50c: e3a02000 mov r2, #0
if (size > count)
size = count;
memcpy (rtems_rfs_file_data (file), data, size);
data += size;
1c510: e0888001 add r8, r8, r1
count -= size;
1c514: e0616006 rsb r6, r1, r6
write += size;
1c518: e0855001 add r5, r5, r1
rc = rtems_rfs_file_io_end (file, size, false);
1c51c: ebfff786 bl 1a33c <rtems_rfs_file_io_end>
if (rc)
1c520: e250a000 subs sl, r0, #0
1c524: 0a000005 beq 1c540 <rtems_rfs_rtems_file_write+0x154>
{
write = rtems_rfs_rtems_error ("file-write: write close", rc);
1c528: eb000429 bl 1d5d4 <__errno>
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
return rtems_rfs_rtems_error ("file-write: write append seek", rc);
}
}
while (count)
1c52c: e3e05000 mvn r5, #0
write += size;
rc = rtems_rfs_file_io_end (file, size, false);
if (rc)
{
write = rtems_rfs_rtems_error ("file-write: write close", rc);
1c530: e580a000 str sl, [r0]
1c534: ea000009 b 1c560 <rtems_rfs_rtems_file_write+0x174>
*/
static ssize_t
rtems_rfs_rtems_file_write (rtems_libio_t* iop,
const void* buffer,
size_t count)
{
1c538: e1a08005 mov r8, r5
1c53c: e3a05000 mov r5, #0
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
return rtems_rfs_rtems_error ("file-write: write append seek", rc);
}
}
while (count)
1c540: e3560000 cmp r6, #0
1c544: 1affffdd bne 1c4c0 <rtems_rfs_rtems_file_write+0xd4>
write = rtems_rfs_rtems_error ("file-write: write close", rc);
break;
}
}
if (write >= 0)
1c548: e3550000 cmp r5, #0
1c54c: ba000003 blt 1c560 <rtems_rfs_rtems_file_write+0x174>
iop->offset = pos + write;
1c550: e89d000c ldm sp, {r2, r3}
1c554: e0922005 adds r2, r2, r5
1c558: e0a33fc5 adc r3, r3, r5, asr #31
1c55c: e987000c stmib r7, {r2, r3}
rtems_rfs_rtems_unlock (rtems_rfs_file_fs (file));
1c560: e594301c ldr r3, [r4, #28]
1c564: e5930098 ldr r0, [r3, #152] ; 0x98
1c568: ebffff4c bl 1c2a0 <rtems_rfs_rtems_unlock>
return write;
}
1c56c: e1a00005 mov r0, r5
1c570: e8bd87fe pop {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, pc}
00010b4c <rtems_rfs_rtems_fstat>:
}
int
rtems_rfs_rtems_fstat (const rtems_filesystem_location_info_t* pathloc,
struct stat* buf)
{
10b4c: e92d40f0 push {r4, r5, r6, r7, lr}
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
10b50: e5902014 ldr r2, [r0, #20]
10b54: e5925008 ldr r5, [r2, #8]
}
int
rtems_rfs_rtems_fstat (const rtems_filesystem_location_info_t* pathloc,
struct stat* buf)
{
10b58: e1a03000 mov r3, r0
10b5c: e24dd028 sub sp, sp, #40 ; 0x28
10b60: e1a04001 mov r4, r1
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_STAT))
printf ("rtems-rfs-rtems: stat: in: ino:%" PRId32 "\n", ino);
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
10b64: e1a00005 mov r0, r5
10b68: e5931008 ldr r1, [r3, #8]
10b6c: e1a0200d mov r2, sp
10b70: e3a03001 mov r3, #1
10b74: ebfffbae bl fa34 <rtems_rfs_inode_open>
if (rc)
10b78: e2507000 subs r7, r0, #0
10b7c: 0a000002 beq 10b8c <rtems_rfs_rtems_fstat+0x40>
{
return rtems_rfs_rtems_error ("stat: opening inode", rc);
10b80: eb003293 bl 1d5d4 <__errno> <== NOT EXECUTED
10b84: e5807000 str r7, [r0] <== NOT EXECUTED
10b88: ea00007f b 10d8c <rtems_rfs_rtems_fstat+0x240> <== NOT EXECUTED
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
10b8c: e59d300c ldr r3, [sp, #12]
10b90: e5d36002 ldrb r6, [r3, #2]
10b94: e5d33003 ldrb r3, [r3, #3]
}
mode = rtems_rfs_inode_get_mode (&inode);
if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK (mode))
10b98: e1836406 orr r6, r3, r6, lsl #8
10b9c: e2063a0f and r3, r6, #61440 ; 0xf000
10ba0: e3530a02 cmp r3, #8192 ; 0x2000
10ba4: 13530a06 cmpne r3, #24576 ; 0x6000
10ba8: 1a000008 bne 10bd0 <rtems_rfs_rtems_fstat+0x84>
{
buf->st_rdev =
rtems_filesystem_make_dev_t (rtems_rfs_inode_get_block (&inode, 0),
10bac: e1a01007 mov r1, r7 <== NOT EXECUTED
10bb0: e1a0000d mov r0, sp <== NOT EXECUTED
10bb4: ebfffdc7 bl 102d8 <rtems_rfs_inode_get_block> <== NOT EXECUTED
10bb8: e3a01001 mov r1, #1 <== NOT EXECUTED
10bbc: e1a07000 mov r7, r0 <== NOT EXECUTED
10bc0: e1a0000d mov r0, sp <== NOT EXECUTED
10bc4: ebfffdc3 bl 102d8 <rtems_rfs_inode_get_block> <== NOT EXECUTED
mode = rtems_rfs_inode_get_mode (&inode);
if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK (mode))
{
buf->st_rdev =
10bc8: e5847018 str r7, [r4, #24] <== NOT EXECUTED
10bcc: e584001c str r0, [r4, #28] <== NOT EXECUTED
rtems_filesystem_make_dev_t (rtems_rfs_inode_get_block (&inode, 0),
rtems_rfs_inode_get_block (&inode, 1));
}
buf->st_dev = rtems_rfs_fs_device (fs);
10bd0: e5951010 ldr r1, [r5, #16]
buf->st_ino = rtems_rfs_inode_ino (&inode);
10bd4: e59d3008 ldr r3, [sp, #8]
buf->st_rdev =
rtems_filesystem_make_dev_t (rtems_rfs_inode_get_block (&inode, 0),
rtems_rfs_inode_get_block (&inode, 1));
}
buf->st_dev = rtems_rfs_fs_device (fs);
10bd8: e1a02fc1 asr r2, r1, #31
10bdc: e5841000 str r1, [r4]
10be0: e5842004 str r2, [r4, #4]
buf->st_ino = rtems_rfs_inode_ino (&inode);
10be4: e5843008 str r3, [r4, #8]
buf->st_mode = rtems_rfs_rtems_mode (mode);
10be8: e1a00006 mov r0, r6
10bec: eb00019d bl 11268 <rtems_rfs_rtems_mode>
*/
static inline uint16_t
rtems_rfs_inode_get_links (rtems_rfs_inode_handle* handle)
{
uint16_t links;
links = rtems_rfs_read_u16 (&handle->node->links);
10bf0: e59d300c ldr r3, [sp, #12]
10bf4: e584000c str r0, [r4, #12]
10bf8: e5d31000 ldrb r1, [r3]
10bfc: e5d32001 ldrb r2, [r3, #1]
10c00: e1822401 orr r2, r2, r1, lsl #8
if (links == 0xffff)
links = 0;
10c04: e59f118c ldr r1, [pc, #396] ; 10d98 <rtems_rfs_rtems_fstat+0x24c>
10c08: e1520001 cmp r2, r1
10c0c: 03a02000 moveq r2, #0
buf->st_nlink = rtems_rfs_inode_get_links (&inode);
10c10: e1c421b0 strh r2, [r4, #16]
* @return uint16_t The user id (uid).
*/
static inline uint16_t
rtems_rfs_inode_get_uid (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->owner) & 0xffff;
10c14: e5d32006 ldrb r2, [r3, #6]
10c18: e5d33007 ldrb r3, [r3, #7]
10c1c: e1833402 orr r3, r3, r2, lsl #8
buf->st_uid = rtems_rfs_inode_get_uid (&inode);
10c20: e1c431b2 strh r3, [r4, #18]
buf->st_gid = rtems_rfs_inode_get_gid (&inode);
10c24: e1a0000d mov r0, sp
10c28: ebfffda3 bl 102bc <rtems_rfs_inode_get_gid>
/*
* Need to check is the ino is an open file. If so we take the values from
* the open file rather than the inode.
*/
shared = rtems_rfs_file_get_shared (fs, rtems_rfs_inode_ino (&inode));
10c2c: e59d1008 ldr r1, [sp, #8]
buf->st_dev = rtems_rfs_fs_device (fs);
buf->st_ino = rtems_rfs_inode_ino (&inode);
buf->st_mode = rtems_rfs_rtems_mode (mode);
buf->st_nlink = rtems_rfs_inode_get_links (&inode);
buf->st_uid = rtems_rfs_inode_get_uid (&inode);
buf->st_gid = rtems_rfs_inode_get_gid (&inode);
10c30: e1c401b4 strh r0, [r4, #20]
/*
* Need to check is the ino is an open file. If so we take the values from
* the open file rather than the inode.
*/
shared = rtems_rfs_file_get_shared (fs, rtems_rfs_inode_ino (&inode));
10c34: e1a00005 mov r0, r5
10c38: eb002739 bl 1a924 <rtems_rfs_file_get_shared>
if (shared)
10c3c: e2501000 subs r1, r0, #0
10c40: 0a000013 beq 10c94 <rtems_rfs_rtems_fstat+0x148>
{
buf->st_atime = rtems_rfs_file_shared_get_atime (shared);
10c44: e591308c ldr r3, [r1, #140] ; 0x8c
10c48: e5843028 str r3, [r4, #40] ; 0x28
buf->st_mtime = rtems_rfs_file_shared_get_mtime (shared);
10c4c: e5913090 ldr r3, [r1, #144] ; 0x90
10c50: e5843030 str r3, [r4, #48] ; 0x30
buf->st_ctime = rtems_rfs_file_shared_get_ctime (shared);
10c54: e5913094 ldr r3, [r1, #148] ; 0x94
10c58: e5843038 str r3, [r4, #56] ; 0x38
buf->st_blocks = rtems_rfs_file_shared_get_block_count (shared);
10c5c: e5913084 ldr r3, [r1, #132] ; 0x84
10c60: e5843044 str r3, [r4, #68] ; 0x44
if (S_ISLNK (buf->st_mode))
10c64: e594300c ldr r3, [r4, #12]
10c68: e2033a0f and r3, r3, #61440 ; 0xf000
10c6c: e3530a0a cmp r3, #40960 ; 0xa000
buf->st_size = rtems_rfs_file_shared_get_block_offset (shared);
10c70: 01d138b8 ldrheq r3, [r1, #136] ; 0x88
10c74: 05843020 streq r3, [r4, #32]
10c78: 03a03000 moveq r3, #0
10c7c: 05843024 streq r3, [r4, #36] ; 0x24
10c80: 0a000037 beq 10d64 <rtems_rfs_rtems_fstat+0x218>
*/
static inline rtems_rfs_pos
rtems_rfs_file_shared_get_size (rtems_rfs_file_system* fs,
rtems_rfs_file_shared* shared)
{
return rtems_rfs_block_get_size (fs, &shared->size);
10c84: e1a00005 mov r0, r5
10c88: e2811084 add r1, r1, #132 ; 0x84
10c8c: eb001af2 bl 1785c <rtems_rfs_block_get_size>
10c90: ea000031 b 10d5c <rtems_rfs_rtems_fstat+0x210>
* @return rtems_rfs_time The atime.
*/
static inline rtems_rfs_time
rtems_rfs_inode_get_atime (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->atime);
10c94: e59d300c ldr r3, [sp, #12]
10c98: e5d32011 ldrb r2, [r3, #17]
10c9c: e5d30010 ldrb r0, [r3, #16]
10ca0: e1a02802 lsl r2, r2, #16
10ca4: e1822c00 orr r2, r2, r0, lsl #24
10ca8: e5d30013 ldrb r0, [r3, #19]
10cac: e1822000 orr r2, r2, r0
10cb0: e5d30012 ldrb r0, [r3, #18]
10cb4: e1822400 orr r2, r2, r0, lsl #8
else
buf->st_size = rtems_rfs_file_shared_get_size (fs, shared);
}
else
{
buf->st_atime = rtems_rfs_inode_get_atime (&inode);
10cb8: e5842028 str r2, [r4, #40] ; 0x28
* @return rtems_rfs_time The mtime.
*/
static inline rtems_rfs_time
rtems_rfs_inode_get_mtime (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->mtime);
10cbc: e5d32015 ldrb r2, [r3, #21]
10cc0: e5d30014 ldrb r0, [r3, #20]
10cc4: e1a02802 lsl r2, r2, #16
10cc8: e1822c00 orr r2, r2, r0, lsl #24
10ccc: e5d30017 ldrb r0, [r3, #23]
10cd0: e1822000 orr r2, r2, r0
10cd4: e5d30016 ldrb r0, [r3, #22]
10cd8: e1822400 orr r2, r2, r0, lsl #8
buf->st_mtime = rtems_rfs_inode_get_mtime (&inode);
10cdc: e5842030 str r2, [r4, #48] ; 0x30
* @return rtems_rfs_time The ctime.
*/
static inline rtems_rfs_time
rtems_rfs_inode_get_ctime (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->ctime);
10ce0: e5d32019 ldrb r2, [r3, #25]
10ce4: e5d30018 ldrb r0, [r3, #24]
10ce8: e1a02802 lsl r2, r2, #16
10cec: e1822c00 orr r2, r2, r0, lsl #24
10cf0: e5d3001b ldrb r0, [r3, #27]
10cf4: e1822000 orr r2, r2, r0
10cf8: e5d3001a ldrb r0, [r3, #26]
10cfc: e1822400 orr r2, r2, r0, lsl #8
buf->st_ctime = rtems_rfs_inode_get_ctime (&inode);
10d00: e5842038 str r2, [r4, #56] ; 0x38
* @return uint32_t The block count.
*/
static inline uint32_t
rtems_rfs_inode_get_block_count (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->block_count);
10d04: e5d3200d ldrb r2, [r3, #13]
10d08: e5d3000c ldrb r0, [r3, #12]
10d0c: e1a02802 lsl r2, r2, #16
10d10: e1822c00 orr r2, r2, r0, lsl #24
10d14: e5d3000f ldrb r0, [r3, #15]
10d18: e1822000 orr r2, r2, r0
10d1c: e5d3000e ldrb r0, [r3, #14]
10d20: e1822400 orr r2, r2, r0, lsl #8
buf->st_blocks = rtems_rfs_inode_get_block_count (&inode);
10d24: e5842044 str r2, [r4, #68] ; 0x44
if (S_ISLNK (buf->st_mode))
10d28: e594200c ldr r2, [r4, #12]
10d2c: e2022a0f and r2, r2, #61440 ; 0xf000
10d30: e3520a0a cmp r2, #40960 ; 0xa000
10d34: 1a000005 bne 10d50 <rtems_rfs_rtems_fstat+0x204>
* @return uint32_t The block offset.
*/
static inline uint16_t
rtems_rfs_inode_get_block_offset (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->block_offset);
10d38: e5d3200a ldrb r2, [r3, #10]
10d3c: e5d3300b ldrb r3, [r3, #11]
buf->st_size = rtems_rfs_inode_get_block_offset (&inode);
10d40: e1833402 orr r3, r3, r2, lsl #8
10d44: e5843020 str r3, [r4, #32]
10d48: e5841024 str r1, [r4, #36] ; 0x24
10d4c: ea000004 b 10d64 <rtems_rfs_rtems_fstat+0x218>
else
buf->st_size = rtems_rfs_inode_get_size (fs, &inode);
10d50: e1a00005 mov r0, r5
10d54: e1a0100d mov r1, sp
10d58: ebfffd45 bl 10274 <rtems_rfs_inode_get_size>
10d5c: e5840020 str r0, [r4, #32]
10d60: e5841024 str r1, [r4, #36] ; 0x24
}
buf->st_blksize = rtems_rfs_fs_block_size (fs);
10d64: e5953008 ldr r3, [r5, #8]
rc = rtems_rfs_inode_close (fs, &inode);
10d68: e1a00005 mov r0, r5
buf->st_size = rtems_rfs_inode_get_block_offset (&inode);
else
buf->st_size = rtems_rfs_inode_get_size (fs, &inode);
}
buf->st_blksize = rtems_rfs_fs_block_size (fs);
10d6c: e5843040 str r3, [r4, #64] ; 0x40
rc = rtems_rfs_inode_close (fs, &inode);
10d70: e1a0100d mov r1, sp
10d74: ebfffba3 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
10d78: e2504000 subs r4, r0, #0
{
return rtems_rfs_rtems_error ("stat: closing inode", rc);
}
return 0;
10d7c: d3a00000 movle r0, #0
}
buf->st_blksize = rtems_rfs_fs_block_size (fs);
rc = rtems_rfs_inode_close (fs, &inode);
if (rc > 0)
10d80: da000002 ble 10d90 <rtems_rfs_rtems_fstat+0x244>
{
return rtems_rfs_rtems_error ("stat: closing inode", rc);
10d84: eb003212 bl 1d5d4 <__errno> <== NOT EXECUTED
10d88: e5804000 str r4, [r0] <== NOT EXECUTED
10d8c: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return 0;
}
10d90: e28dd028 add sp, sp, #40 ; 0x28
10d94: e8bd80f0 pop {r4, r5, r6, r7, pc}
00010ffc <rtems_rfs_rtems_initialise>:
*/
int
rtems_rfs_rtems_initialise (rtems_filesystem_mount_table_entry_t* mt_entry,
const void* data)
{
10ffc: e92d41f3 push {r0, r1, r4, r5, r6, r7, r8, lr}
11000: e1a05000 mov r5, r0
11004: e1a04001 mov r4, r1
rtems_rfs_rtems_private* rtems;
rtems_rfs_file_system* fs;
uint32_t flags = 0;
uint32_t max_held_buffers = RTEMS_RFS_FS_MAX_HELD_BUFFERS;
11008: e3a07005 mov r7, #5
rtems_rfs_rtems_initialise (rtems_filesystem_mount_table_entry_t* mt_entry,
const void* data)
{
rtems_rfs_rtems_private* rtems;
rtems_rfs_file_system* fs;
uint32_t flags = 0;
1100c: e3a06000 mov r6, #0
int rc;
/*
* Parse the options the user specifiies.
*/
while (options)
11010: ea000027 b 110b4 <rtems_rfs_rtems_initialise+0xb8>
{
printf ("options=%s\n", options);
11014: e1a01004 mov r1, r4 <== NOT EXECUTED
11018: e59f0168 ldr r0, [pc, #360] ; 11188 <rtems_rfs_rtems_initialise+0x18c><== NOT EXECUTED
1101c: eb003682 bl 1ea2c <printf> <== NOT EXECUTED
if (strncmp (options, "hold-bitmaps",
11020: e1a00004 mov r0, r4 <== NOT EXECUTED
11024: e59f1160 ldr r1, [pc, #352] ; 1118c <rtems_rfs_rtems_initialise+0x190><== NOT EXECUTED
11028: e3a0200c mov r2, #12 <== NOT EXECUTED
1102c: eb003b6a bl 1fddc <strncmp> <== NOT EXECUTED
11030: e3500000 cmp r0, #0 <== NOT EXECUTED
sizeof ("hold-bitmaps") - 1) == 0)
flags |= RTEMS_RFS_FS_BITMAPS_HOLD;
11034: 03866001 orreq r6, r6, #1 <== NOT EXECUTED
* Parse the options the user specifiies.
*/
while (options)
{
printf ("options=%s\n", options);
if (strncmp (options, "hold-bitmaps",
11038: 0a000014 beq 11090 <rtems_rfs_rtems_initialise+0x94> <== NOT EXECUTED
sizeof ("hold-bitmaps") - 1) == 0)
flags |= RTEMS_RFS_FS_BITMAPS_HOLD;
else if (strncmp (options, "no-local-cache",
1103c: e1a00004 mov r0, r4 <== NOT EXECUTED
11040: e59f1148 ldr r1, [pc, #328] ; 11190 <rtems_rfs_rtems_initialise+0x194><== NOT EXECUTED
11044: e3a0200e mov r2, #14 <== NOT EXECUTED
11048: eb003b63 bl 1fddc <strncmp> <== NOT EXECUTED
1104c: e3500000 cmp r0, #0 <== NOT EXECUTED
sizeof ("no-local-cache") - 1) == 0)
flags |= RTEMS_RFS_FS_NO_LOCAL_CACHE;
11050: 03866002 orreq r6, r6, #2 <== NOT EXECUTED
{
printf ("options=%s\n", options);
if (strncmp (options, "hold-bitmaps",
sizeof ("hold-bitmaps") - 1) == 0)
flags |= RTEMS_RFS_FS_BITMAPS_HOLD;
else if (strncmp (options, "no-local-cache",
11054: 0a00000d beq 11090 <rtems_rfs_rtems_initialise+0x94> <== NOT EXECUTED
sizeof ("no-local-cache") - 1) == 0)
flags |= RTEMS_RFS_FS_NO_LOCAL_CACHE;
else if (strncmp (options, "max-held-bufs",
11058: e59f1134 ldr r1, [pc, #308] ; 11194 <rtems_rfs_rtems_initialise+0x198><== NOT EXECUTED
1105c: e1a00004 mov r0, r4 <== NOT EXECUTED
11060: e3a0200d mov r2, #13 <== NOT EXECUTED
11064: eb003b5c bl 1fddc <strncmp> <== NOT EXECUTED
11068: e2501000 subs r1, r0, #0 <== NOT EXECUTED
1106c: 1a000004 bne 11084 <rtems_rfs_rtems_initialise+0x88> <== NOT EXECUTED
sizeof ("max-held-bufs") - 1) == 0)
{
max_held_buffers = strtoul (options + sizeof ("max-held-bufs"), 0, 0);
11070: e284000e add r0, r4, #14 <== NOT EXECUTED
11074: e1a02001 mov r2, r1 <== NOT EXECUTED
11078: eb003c1a bl 200e8 <strtoul> <== NOT EXECUTED
1107c: e1a07000 mov r7, r0 <== NOT EXECUTED
11080: ea000002 b 11090 <rtems_rfs_rtems_initialise+0x94> <== NOT EXECUTED
}
else
return rtems_rfs_rtems_error ("initialise: invalid option", EINVAL);
11084: eb003152 bl 1d5d4 <__errno> <== NOT EXECUTED
11088: e3a03016 mov r3, #22 <== NOT EXECUTED
1108c: ea000010 b 110d4 <rtems_rfs_rtems_initialise+0xd8> <== NOT EXECUTED
options = strchr (options, ',');
11090: e1a00004 mov r0, r4 <== NOT EXECUTED
11094: e3a0102c mov r1, #44 ; 0x2c <== NOT EXECUTED
11098: eb003843 bl 1f1ac <strchr> <== NOT EXECUTED
if (options)
1109c: e2504000 subs r4, r0, #0 <== NOT EXECUTED
110a0: 0a000005 beq 110bc <rtems_rfs_rtems_initialise+0xc0> <== NOT EXECUTED
{
++options;
if (*options == '\0')
110a4: e5d43001 ldrb r3, [r4, #1] <== NOT EXECUTED
110a8: e3530000 cmp r3, #0 <== NOT EXECUTED
110ac: 0a000002 beq 110bc <rtems_rfs_rtems_initialise+0xc0> <== NOT EXECUTED
return rtems_rfs_rtems_error ("initialise: invalid option", EINVAL);
options = strchr (options, ',');
if (options)
{
++options;
110b0: e2844001 add r4, r4, #1 <== NOT EXECUTED
int rc;
/*
* Parse the options the user specifiies.
*/
while (options)
110b4: e3540000 cmp r4, #0
110b8: 1affffd5 bne 11014 <rtems_rfs_rtems_initialise+0x18>
if (*options == '\0')
options = NULL;
}
}
rtems = malloc (sizeof (rtems_rfs_rtems_private));
110bc: e3a00004 mov r0, #4
110c0: ebffd742 bl 6dd0 <malloc>
if (!rtems)
110c4: e2504000 subs r4, r0, #0
110c8: 1a000004 bne 110e0 <rtems_rfs_rtems_initialise+0xe4>
return rtems_rfs_rtems_error ("initialise: local data", ENOMEM);
110cc: eb003140 bl 1d5d4 <__errno> <== NOT EXECUTED
110d0: e3a0300c mov r3, #12 <== NOT EXECUTED
110d4: e5803000 str r3, [r0] <== NOT EXECUTED
110d8: e3e00000 mvn r0, #0 <== NOT EXECUTED
110dc: ea000028 b 11184 <rtems_rfs_rtems_initialise+0x188> <== NOT EXECUTED
memset (rtems, 0, sizeof (rtems_rfs_rtems_private));
110e0: e3a03000 mov r3, #0
110e4: e5843000 str r3, [r4]
rc = rtems_rfs_mutex_create (&rtems->access);
110e8: eb002b1a bl 1bd58 <rtems_rfs_mutex_create>
if (rc > 0)
110ec: e2508000 subs r8, r0, #0
110f0: ca000005 bgt 1110c <rtems_rfs_rtems_initialise+0x110>
{
free (rtems);
return rtems_rfs_rtems_error ("initialise: cannot create mutex", rc);
}
rc = rtems_rfs_mutex_lock (&rtems->access);
110f4: e5940000 ldr r0, [r4]
110f8: ebffffa5 bl 10f94 <rtems_rfs_mutex_lock.isra.2>
if (rc > 0)
110fc: e2508000 subs r8, r0, #0
11100: da000006 ble 11120 <rtems_rfs_rtems_initialise+0x124>
{
rtems_rfs_mutex_destroy (&rtems->access);
11104: e1a00004 mov r0, r4 <== NOT EXECUTED
11108: eb002b2a bl 1bdb8 <rtems_rfs_mutex_destroy> <== NOT EXECUTED
free (rtems);
1110c: e1a00004 mov r0, r4 <== NOT EXECUTED
11110: ebffd5be bl 6810 <free> <== NOT EXECUTED
return rtems_rfs_rtems_error ("initialise: cannot lock access mutex", rc);
11114: eb00312e bl 1d5d4 <__errno> <== NOT EXECUTED
11118: e5808000 str r8, [r0] <== NOT EXECUTED
1111c: eaffffed b 110d8 <rtems_rfs_rtems_initialise+0xdc> <== NOT EXECUTED
}
rc = rtems_rfs_fs_open (mt_entry->dev, rtems, flags, max_held_buffers, &fs);
11120: e28d3004 add r3, sp, #4
11124: e58d3000 str r3, [sp]
11128: e1a02006 mov r2, r6
1112c: e5950038 ldr r0, [r5, #56] ; 0x38
11130: e1a01004 mov r1, r4
11134: e1a03007 mov r3, r7
11138: eb0026c3 bl 1ac4c <rtems_rfs_fs_open>
if (rc)
1113c: e2506000 subs r6, r0, #0
11140: 0a000004 beq 11158 <rtems_rfs_rtems_initialise+0x15c>
{
free (rtems);
11144: e1a00004 mov r0, r4 <== NOT EXECUTED
11148: ebffd5b0 bl 6810 <free> <== NOT EXECUTED
return rtems_rfs_rtems_error ("initialise: open", rc);
1114c: eb003120 bl 1d5d4 <__errno> <== NOT EXECUTED
11150: e5806000 str r6, [r0] <== NOT EXECUTED
11154: eaffffdf b 110d8 <rtems_rfs_rtems_initialise+0xdc> <== NOT EXECUTED
}
mt_entry->fs_info = fs;
mt_entry->ops = &rtems_rfs_ops;
11158: e59f3038 ldr r3, [pc, #56] ; 11198 <rtems_rfs_rtems_initialise+0x19c>
{
free (rtems);
return rtems_rfs_rtems_error ("initialise: open", rc);
}
mt_entry->fs_info = fs;
1115c: e59d0004 ldr r0, [sp, #4]
mt_entry->ops = &rtems_rfs_ops;
11160: e585300c str r3, [r5, #12]
mt_entry->mt_fs_root->location.node_access = (void*) RTEMS_RFS_ROOT_INO;
11164: e5953024 ldr r3, [r5, #36] ; 0x24
11168: e3a02001 mov r2, #1
{
free (rtems);
return rtems_rfs_rtems_error ("initialise: open", rc);
}
mt_entry->fs_info = fs;
1116c: e5850008 str r0, [r5, #8]
mt_entry->ops = &rtems_rfs_ops;
mt_entry->mt_fs_root->location.node_access = (void*) RTEMS_RFS_ROOT_INO;
11170: e5832008 str r2, [r3, #8]
mt_entry->mt_fs_root->location.handlers = &rtems_rfs_rtems_dir_handlers;
11174: e59f2020 ldr r2, [pc, #32] ; 1119c <rtems_rfs_rtems_initialise+0x1a0>
11178: e5832010 str r2, [r3, #16]
rtems_rfs_rtems_unlock (fs);
1117c: ebfffe54 bl 10ad4 <rtems_rfs_rtems_unlock>
return 0;
11180: e1a00006 mov r0, r6
}
11184: e8bd81fc pop {r2, r3, r4, r5, r6, r7, r8, pc}
00010448 <rtems_rfs_rtems_link>:
static int
rtems_rfs_rtems_link (const rtems_filesystem_location_info_t *parentloc,
const rtems_filesystem_location_info_t *targetloc,
const char *name,
size_t namelen)
{
10448: e92d4013 push {r0, r1, r4, lr}
1044c: e1a0c000 mov ip, r0
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (targetloc);
10450: e5910014 ldr r0, [r1, #20]
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_LINK))
printf ("rtems-rfs-rtems: link: in: parent:%" PRId32 " target:%" PRId32 "\n",
parent, target);
rc = rtems_rfs_link (fs, name, namelen, parent, target, false);
10454: e5911008 ldr r1, [r1, #8]
10458: e58d1000 str r1, [sp]
1045c: e3a01000 mov r1, #0
10460: e58d1004 str r1, [sp, #4]
10464: e1a01002 mov r1, r2
10468: e5900008 ldr r0, [r0, #8]
1046c: e1a02003 mov r2, r3
10470: e59c3008 ldr r3, [ip, #8]
10474: eb002bef bl 1b438 <rtems_rfs_link>
if (rc)
10478: e2504000 subs r4, r0, #0
{
return rtems_rfs_rtems_error ("link: linking", rc);
}
return 0;
1047c: 01a00004 moveq r0, r4
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_LINK))
printf ("rtems-rfs-rtems: link: in: parent:%" PRId32 " target:%" PRId32 "\n",
parent, target);
rc = rtems_rfs_link (fs, name, namelen, parent, target, false);
if (rc)
10480: 0a000002 beq 10490 <rtems_rfs_rtems_link+0x48>
{
return rtems_rfs_rtems_error ("link: linking", rc);
10484: eb003452 bl 1d5d4 <__errno> <== NOT EXECUTED
10488: e5804000 str r4, [r0] <== NOT EXECUTED
1048c: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return 0;
}
10490: e8bd801c pop {r2, r3, r4, pc}
0001c000 <rtems_rfs_rtems_lock>:
.fstat_h = rtems_rfs_rtems_fstat,
.ftruncate_h = rtems_filesystem_default_ftruncate_directory,
.fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
.fdatasync_h = rtems_rfs_rtems_fdatasync,
.fcntl_h = rtems_filesystem_default_fcntl
};
1c000: e5903080 ldr r3, [r0, #128] ; 0x80
*/
static inline int
rtems_rfs_mutex_lock (rtems_rfs_mutex* mutex)
{
#if __rtems__
rtems_status_code sc = rtems_semaphore_obtain (*mutex, RTEMS_WAIT, 0);
1c004: e3a01000 mov r1, #0
/**
* Lock the RFS file system.
*/
static inline void
rtems_rfs_rtems_lock (rtems_rfs_file_system* fs)
{
1c008: e92d4010 push {r4, lr}
1c00c: e5930000 ldr r0, [r3]
1c010: e1a02001 mov r2, r1
1c014: ebffbb4a bl ad44 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL)
1c018: e2504000 subs r4, r0, #0
1c01c: 08bd8010 popeq {r4, pc}
{
#if RTEMS_RFS_TRACE
if (rtems_rfs_trace (RTEMS_RFS_TRACE_MUTEX))
1c020: e3a00004 mov r0, #4 <== NOT EXECUTED
1c024: e3a01000 mov r1, #0 <== NOT EXECUTED
1c028: ebffd48f bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1c02c: e3500000 cmp r0, #0 <== NOT EXECUTED
1c030: 08bd8010 popeq {r4, pc} <== NOT EXECUTED
printf ("rtems-rfs: mutex: obtain failed: %s\n",
1c034: e1a00004 mov r0, r4 <== NOT EXECUTED
1c038: ebffa970 bl 6600 <rtems_status_text> <== NOT EXECUTED
1c03c: e1a01000 mov r1, r0 <== NOT EXECUTED
1c040: e59f0004 ldr r0, [pc, #4] ; 1c04c <rtems_rfs_rtems_lock+0x4c><== NOT EXECUTED
rtems_rfs_rtems_private* rtems = rtems_rfs_fs_user (fs);
rtems_rfs_mutex_lock (&rtems->access);
}
1c044: e8bd4010 pop {r4, lr} <== NOT EXECUTED
1c048: ea000a77 b 1ea2c <printf> <== NOT EXECUTED
0001091c <rtems_rfs_rtems_mknod>:
rtems_rfs_rtems_mknod (const rtems_filesystem_location_info_t *parentloc,
const char *name,
size_t namelen,
mode_t mode,
dev_t dev)
{
1091c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
10920: e1a06003 mov r6, r3
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (parentloc);
10924: e5903014 ldr r3, [r0, #20]
rtems_rfs_rtems_mknod (const rtems_filesystem_location_info_t *parentloc,
const char *name,
size_t namelen,
mode_t mode,
dev_t dev)
{
10928: e24dd048 sub sp, sp, #72 ; 0x48
1092c: e1a07001 mov r7, r1
10930: e1a08002 mov r8, r2
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (parentloc);
10934: e5934008 ldr r4, [r3, #8]
rtems_rfs_ino parent = rtems_rfs_rtems_get_pathloc_ino (parentloc);
10938: e590b008 ldr fp, [r0, #8]
rtems_rfs_rtems_mknod (const rtems_filesystem_location_info_t *parentloc,
const char *name,
size_t namelen,
mode_t mode,
dev_t dev)
{
1093c: e59da06c ldr sl, [sp, #108] ; 0x6c
10940: e59d9070 ldr r9, [sp, #112] ; 0x70
uid_t uid;
gid_t gid;
int rc;
#if defined(RTEMS_POSIX_API)
uid = geteuid ();
10944: eb000f22 bl 145d4 <geteuid>
gid = getegid ();
10948: e58d0014 str r0, [sp, #20]
1094c: eb000f1b bl 145c0 <getegid>
10950: e1a03000 mov r3, r0
uid = 0;
gid = 0;
#endif
rc = rtems_rfs_inode_create (fs, parent, name, namelen,
rtems_rfs_rtems_imode (mode),
10954: e1a00006 mov r0, r6
10958: e58d3018 str r3, [sp, #24]
1095c: eb00023e bl 1125c <rtems_rfs_rtems_imode>
#else
uid = 0;
gid = 0;
#endif
rc = rtems_rfs_inode_create (fs, parent, name, namelen,
10960: e59d3018 ldr r3, [sp, #24]
10964: e59d2014 ldr r2, [sp, #20]
10968: e58d300c str r3, [sp, #12]
1096c: e28d3044 add r3, sp, #68 ; 0x44
10970: e58d0000 str r0, [sp]
10974: e58d2008 str r2, [sp, #8]
10978: e58d3010 str r3, [sp, #16]
1097c: e1a02007 mov r2, r7
10980: e3a05001 mov r5, #1
10984: e1a00004 mov r0, r4
10988: e1a0100b mov r1, fp
1098c: e1a03008 mov r3, r8
10990: e58d5004 str r5, [sp, #4]
10994: ebfffd78 bl ff7c <rtems_rfs_inode_create>
rtems_rfs_rtems_imode (mode),
1, uid, gid, &ino);
if (rc > 0)
10998: e2507000 subs r7, r0, #0
1099c: ca000006 bgt 109bc <rtems_rfs_rtems_mknod+0xa0>
{
return rtems_rfs_rtems_error ("mknod: inode create", rc);
}
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
109a0: e1a00004 mov r0, r4
109a4: e59d1044 ldr r1, [sp, #68] ; 0x44
109a8: e28d201c add r2, sp, #28
109ac: e1a03005 mov r3, r5
109b0: ebfffc1f bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
109b4: e2507000 subs r7, r0, #0
109b8: da000002 ble 109c8 <rtems_rfs_rtems_mknod+0xac>
{
return rtems_rfs_rtems_error ("mknod: inode open", rc);
109bc: eb003304 bl 1d5d4 <__errno>
109c0: e5807000 str r7, [r0]
109c4: ea00001f b 10a48 <rtems_rfs_rtems_mknod+0x12c>
}
if (S_ISDIR(mode) || S_ISREG(mode))
109c8: e2066a0f and r6, r6, #61440 ; 0xf000
109cc: e3560901 cmp r6, #16384 ; 0x4000
109d0: 13560902 cmpne r6, #32768 ; 0x8000
109d4: 13a01000 movne r1, #0
109d8: 03a01001 moveq r1, #1
109dc: 0a000011 beq 10a28 <rtems_rfs_rtems_mknod+0x10c>
{
}
else if (S_ISCHR (mode) || S_ISBLK (mode))
109e0: e3560a02 cmp r6, #8192 ; 0x2000 <== NOT EXECUTED
109e4: 13560a06 cmpne r6, #24576 ; 0x6000 <== NOT EXECUTED
109e8: 1a000007 bne 10a0c <rtems_rfs_rtems_mknod+0xf0> <== NOT EXECUTED
{
int major;
int minor;
rtems_filesystem_split_dev_t (dev, major, minor);
rtems_rfs_inode_set_block (&inode, 0, major);
109ec: e28d001c add r0, sp, #28 <== NOT EXECUTED
109f0: e1a0200a mov r2, sl <== NOT EXECUTED
109f4: ebfffe43 bl 10308 <rtems_rfs_inode_set_block> <== NOT EXECUTED
rtems_rfs_inode_set_block (&inode, 1, minor);
109f8: e28d001c add r0, sp, #28 <== NOT EXECUTED
109fc: e1a01005 mov r1, r5 <== NOT EXECUTED
10a00: e1a02009 mov r2, r9 <== NOT EXECUTED
10a04: ebfffe3f bl 10308 <rtems_rfs_inode_set_block> <== NOT EXECUTED
10a08: ea000006 b 10a28 <rtems_rfs_rtems_mknod+0x10c> <== NOT EXECUTED
}
else
{
rtems_rfs_inode_close (fs, &inode);
10a0c: e28d101c add r1, sp, #28 <== NOT EXECUTED
10a10: e1a00004 mov r0, r4 <== NOT EXECUTED
10a14: ebfffc7b bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return rtems_rfs_rtems_error ("mknod: bad mode", EINVAL);
10a18: eb0032ed bl 1d5d4 <__errno> <== NOT EXECUTED
10a1c: e3a03016 mov r3, #22 <== NOT EXECUTED
10a20: e5803000 str r3, [r0] <== NOT EXECUTED
10a24: ea000007 b 10a48 <rtems_rfs_rtems_mknod+0x12c> <== NOT EXECUTED
}
rc = rtems_rfs_inode_close (fs, &inode);
10a28: e1a00004 mov r0, r4
10a2c: e28d101c add r1, sp, #28
10a30: ebfffc74 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
10a34: e2504000 subs r4, r0, #0
{
return rtems_rfs_rtems_error ("mknod: closing inode", rc);
}
return 0;
10a38: d3a00000 movle r0, #0
rtems_rfs_inode_close (fs, &inode);
return rtems_rfs_rtems_error ("mknod: bad mode", EINVAL);
}
rc = rtems_rfs_inode_close (fs, &inode);
if (rc > 0)
10a3c: da000002 ble 10a4c <rtems_rfs_rtems_mknod+0x130>
{
return rtems_rfs_rtems_error ("mknod: closing inode", rc);
10a40: eb0032e3 bl 1d5d4 <__errno> <== NOT EXECUTED
10a44: e5804000 str r4, [r0] <== NOT EXECUTED
10a48: e3e00000 mvn r0, #0
}
return 0;
}
10a4c: e28dd048 add sp, sp, #72 ; 0x48
10a50: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
000108a8 <rtems_rfs_rtems_node_type>:
* @return rtems_filesystem_node_types_t
*/
static rtems_filesystem_node_types_t
rtems_rfs_rtems_node_type (const rtems_filesystem_location_info_t* pathloc)
{
108a8: e92d4030 push {r4, r5, lr}
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
108ac: e5902014 ldr r2, [r0, #20]
108b0: e5924008 ldr r4, [r2, #8]
* @return rtems_filesystem_node_types_t
*/
static rtems_filesystem_node_types_t
rtems_rfs_rtems_node_type (const rtems_filesystem_location_info_t* pathloc)
{
108b4: e1a03000 mov r3, r0
108b8: e24dd028 sub sp, sp, #40 ; 0x28
rtems_rfs_ino ino = rtems_rfs_rtems_get_pathloc_ino (pathloc);
rtems_filesystem_node_types_t type;
rtems_rfs_inode_handle inode;
int rc;
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
108bc: e5931008 ldr r1, [r3, #8]
108c0: e1a00004 mov r0, r4
108c4: e1a0200d mov r2, sp
108c8: e3a03001 mov r3, #1
108cc: ebfffc58 bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
108d0: e2505000 subs r5, r0, #0
108d4: da000002 ble 108e4 <rtems_rfs_rtems_node_type+0x3c>
{
return rtems_rfs_rtems_error ("node_type: opening inode", rc);
108d8: eb00333d bl 1d5d4 <__errno> <== NOT EXECUTED
108dc: e5805000 str r5, [r0] <== NOT EXECUTED
108e0: ea000009 b 1090c <rtems_rfs_rtems_node_type+0x64> <== NOT EXECUTED
}
type = rtems_rfs_rtems_node_type_by_inode (&inode);
108e4: e1a0000d mov r0, sp
108e8: ebfffe9a bl 10358 <rtems_rfs_rtems_node_type_by_inode>
rc = rtems_rfs_inode_close (fs, &inode);
108ec: e1a0100d mov r1, sp
if (rc > 0)
{
return rtems_rfs_rtems_error ("node_type: opening inode", rc);
}
type = rtems_rfs_rtems_node_type_by_inode (&inode);
108f0: e1a05000 mov r5, r0
rc = rtems_rfs_inode_close (fs, &inode);
108f4: e1a00004 mov r0, r4
108f8: ebfffcc2 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
108fc: e2504000 subs r4, r0, #0
10900: da000002 ble 10910 <rtems_rfs_rtems_node_type+0x68>
{
return rtems_rfs_rtems_error ("node_type: closing inode", rc);
10904: eb003332 bl 1d5d4 <__errno> <== NOT EXECUTED
10908: e5804000 str r4, [r0] <== NOT EXECUTED
1090c: e3e05000 mvn r5, #0 <== NOT EXECUTED
}
return type;
}
10910: e1a00005 mov r0, r5
10914: e28dd028 add sp, sp, #40 ; 0x28
10918: e8bd8030 pop {r4, r5, pc}
00010564 <rtems_rfs_rtems_readlink>:
static ssize_t
rtems_rfs_rtems_readlink (const rtems_filesystem_location_info_t* pathloc,
char* buf,
size_t bufsize)
{
10564: e92d4013 push {r0, r1, r4, lr}
10568: e1a0e001 mov lr, r1
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_READLINK))
printf ("rtems-rfs-rtems: readlink: in: ino:%" PRId32 "\n", ino);
rc = rtems_rfs_symlink_read (fs, ino, buf, bufsize, &length);
1056c: e28d1004 add r1, sp, #4
static ssize_t
rtems_rfs_rtems_readlink (const rtems_filesystem_location_info_t* pathloc,
char* buf,
size_t bufsize)
{
10570: e1a03002 mov r3, r2
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
10574: e5902014 ldr r2, [r0, #20]
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_READLINK))
printf ("rtems-rfs-rtems: readlink: in: ino:%" PRId32 "\n", ino);
rc = rtems_rfs_symlink_read (fs, ino, buf, bufsize, &length);
10578: e58d1000 str r1, [sp]
static ssize_t
rtems_rfs_rtems_readlink (const rtems_filesystem_location_info_t* pathloc,
char* buf,
size_t bufsize)
{
1057c: e1a0c000 mov ip, r0
int rc;
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_READLINK))
printf ("rtems-rfs-rtems: readlink: in: ino:%" PRId32 "\n", ino);
rc = rtems_rfs_symlink_read (fs, ino, buf, bufsize, &length);
10580: e59c1008 ldr r1, [ip, #8]
10584: e5920008 ldr r0, [r2, #8]
10588: e1a0200e mov r2, lr
1058c: eb002d84 bl 1bba4 <rtems_rfs_symlink_read>
if (rc)
10590: e2504000 subs r4, r0, #0
{
return rtems_rfs_rtems_error ("readlink: reading link", rc);
}
return (ssize_t) length;
10594: 059d0004 ldreq r0, [sp, #4]
if (rtems_rfs_rtems_trace (RTEMS_RFS_RTEMS_DEBUG_READLINK))
printf ("rtems-rfs-rtems: readlink: in: ino:%" PRId32 "\n", ino);
rc = rtems_rfs_symlink_read (fs, ino, buf, bufsize, &length);
if (rc)
10598: 0a000002 beq 105a8 <rtems_rfs_rtems_readlink+0x44>
{
return rtems_rfs_rtems_error ("readlink: reading link", rc);
1059c: eb00340c bl 1d5d4 <__errno> <== NOT EXECUTED
105a0: e5804000 str r4, [r0] <== NOT EXECUTED
105a4: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return (ssize_t) length;
}
105a8: e8bd801c pop {r2, r3, r4, pc}
00010494 <rtems_rfs_rtems_rename>:
rtems_rfs_rtems_rename(const rtems_filesystem_location_info_t* old_parent_loc,
const rtems_filesystem_location_info_t* old_loc,
const rtems_filesystem_location_info_t* new_parent_loc,
const char* new_name,
size_t new_name_len)
{
10494: e92d41f3 push {r0, r1, r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
10498: e1a0c002 mov ip, r2 <== NOT EXECUTED
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (old_loc);
1049c: e5912014 ldr r2, [r1, #20] <== NOT EXECUTED
old_parent = rtems_rfs_rtems_get_pathloc_ino (old_parent_loc);
new_parent = rtems_rfs_rtems_get_pathloc_ino (new_parent_loc);
ino = rtems_rfs_rtems_get_pathloc_ino (old_loc);
doff = rtems_rfs_rtems_get_pathloc_doff (old_loc);
104a0: e2814008 add r4, r1, #8 <== NOT EXECUTED
const rtems_filesystem_location_info_t* old_loc,
const rtems_filesystem_location_info_t* new_parent_loc,
const char* new_name,
size_t new_name_len)
{
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (old_loc);
104a4: e5925008 ldr r5, [r2, #8] <== NOT EXECUTED
old_parent = rtems_rfs_rtems_get_pathloc_ino (old_parent_loc);
new_parent = rtems_rfs_rtems_get_pathloc_ino (new_parent_loc);
ino = rtems_rfs_rtems_get_pathloc_ino (old_loc);
doff = rtems_rfs_rtems_get_pathloc_doff (old_loc);
104a8: e8940050 ldm r4, {r4, r6} <== NOT EXECUTED
/*
* Link to the inode before unlinking so the inode is not erased when
* unlinked.
*/
rc = rtems_rfs_link (fs, new_name, new_name_len, new_parent, ino, true);
104ac: e3a02001 mov r2, #1 <== NOT EXECUTED
rtems_rfs_ino new_parent;
rtems_rfs_ino ino;
uint32_t doff;
int rc;
old_parent = rtems_rfs_rtems_get_pathloc_ino (old_parent_loc);
104b0: e5907008 ldr r7, [r0, #8] <== NOT EXECUTED
/*
* Link to the inode before unlinking so the inode is not erased when
* unlinked.
*/
rc = rtems_rfs_link (fs, new_name, new_name_len, new_parent, ino, true);
104b4: e1a01003 mov r1, r3 <== NOT EXECUTED
104b8: e58d2004 str r2, [sp, #4] <== NOT EXECUTED
104bc: e1a00005 mov r0, r5 <== NOT EXECUTED
104c0: e59d2020 ldr r2, [sp, #32] <== NOT EXECUTED
104c4: e59c3008 ldr r3, [ip, #8] <== NOT EXECUTED
104c8: e58d4000 str r4, [sp] <== NOT EXECUTED
104cc: eb002bd9 bl 1b438 <rtems_rfs_link> <== NOT EXECUTED
if (rc)
104d0: e2508000 subs r8, r0, #0 <== NOT EXECUTED
104d4: 0a000002 beq 104e4 <rtems_rfs_rtems_rename+0x50> <== NOT EXECUTED
{
return rtems_rfs_rtems_error ("rename: linking", rc);
104d8: eb00343d bl 1d5d4 <__errno> <== NOT EXECUTED
104dc: e5808000 str r8, [r0] <== NOT EXECUTED
104e0: ea00000b b 10514 <rtems_rfs_rtems_rename+0x80> <== NOT EXECUTED
/*
* Unlink all inodes even directories with the dir option as false because a
* directory may not be empty.
*/
rc = rtems_rfs_unlink (fs, old_parent, ino, doff,
104e4: e3a03002 mov r3, #2 <== NOT EXECUTED
104e8: e58d3000 str r3, [sp] <== NOT EXECUTED
104ec: e1a02004 mov r2, r4 <== NOT EXECUTED
104f0: e1a00005 mov r0, r5 <== NOT EXECUTED
104f4: e1a01007 mov r1, r7 <== NOT EXECUTED
104f8: e1a03006 mov r3, r6 <== NOT EXECUTED
104fc: eb002c2f bl 1b5c0 <rtems_rfs_unlink> <== NOT EXECUTED
rtems_rfs_unlink_dir_allowed);
if (rc)
10500: e2504000 subs r4, r0, #0 <== NOT EXECUTED
{
return rtems_rfs_rtems_error ("rename: unlinking", rc);
}
return 0;
10504: 01a00004 moveq r0, r4 <== NOT EXECUTED
* Unlink all inodes even directories with the dir option as false because a
* directory may not be empty.
*/
rc = rtems_rfs_unlink (fs, old_parent, ino, doff,
rtems_rfs_unlink_dir_allowed);
if (rc)
10508: 0a000002 beq 10518 <rtems_rfs_rtems_rename+0x84> <== NOT EXECUTED
{
return rtems_rfs_rtems_error ("rename: unlinking", rc);
1050c: eb003430 bl 1d5d4 <__errno> <== NOT EXECUTED
10510: e5804000 str r4, [r0] <== NOT EXECUTED
10514: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return 0;
}
10518: e8bd81fc pop {r2, r3, r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
000111d0 <rtems_rfs_rtems_set_handlers>:
*/
bool
rtems_rfs_rtems_set_handlers (rtems_filesystem_location_info_t* loc,
rtems_rfs_inode_handle* inode)
{
111d0: e92d4010 push {r4, lr}
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
111d4: e591300c ldr r3, [r1, #12]
111d8: e5d31002 ldrb r1, [r3, #2]
111dc: e5d33003 ldrb r3, [r3, #3]
111e0: e1831401 orr r1, r3, r1, lsl #8
uint16_t mode = rtems_rfs_inode_get_mode (inode);
loc->handlers = NULL;
111e4: e3a03000 mov r3, #0
111e8: e5803010 str r3, [r0, #16]
if (RTEMS_RFS_S_ISDIR (mode))
111ec: e2013a0f and r3, r1, #61440 ; 0xf000
111f0: e3530901 cmp r3, #16384 ; 0x4000
loc->handlers = rtems_rfs_rtems_handlers (dir);
111f4: 059f304c ldreq r3, [pc, #76] ; 11248 <rtems_rfs_rtems_set_handlers+0x78>
rtems_rfs_rtems_set_handlers (rtems_filesystem_location_info_t* loc,
rtems_rfs_inode_handle* inode)
{
uint16_t mode = rtems_rfs_inode_get_mode (inode);
loc->handlers = NULL;
if (RTEMS_RFS_S_ISDIR (mode))
111f8: 0a00000b beq 1122c <rtems_rfs_rtems_set_handlers+0x5c>
loc->handlers = rtems_rfs_rtems_handlers (dir);
else if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK(mode))
111fc: e3530a02 cmp r3, #8192 ; 0x2000
11200: 13530a06 cmpne r3, #24576 ; 0x6000
11204: 13a04000 movne r4, #0
11208: 03a04001 moveq r4, #1
loc->handlers = rtems_rfs_rtems_handlers (device);
1120c: 059f3038 ldreq r3, [pc, #56] ; 1124c <rtems_rfs_rtems_set_handlers+0x7c>
{
uint16_t mode = rtems_rfs_inode_get_mode (inode);
loc->handlers = NULL;
if (RTEMS_RFS_S_ISDIR (mode))
loc->handlers = rtems_rfs_rtems_handlers (dir);
else if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK(mode))
11210: 0a000005 beq 1122c <rtems_rfs_rtems_set_handlers+0x5c>
loc->handlers = rtems_rfs_rtems_handlers (device);
else if (RTEMS_RFS_S_ISLNK (mode))
11214: e3530a0a cmp r3, #40960 ; 0xa000
loc->handlers = rtems_rfs_rtems_handlers (link);
11218: 059f3030 ldreq r3, [pc, #48] ; 11250 <rtems_rfs_rtems_set_handlers+0x80>
loc->handlers = NULL;
if (RTEMS_RFS_S_ISDIR (mode))
loc->handlers = rtems_rfs_rtems_handlers (dir);
else if (RTEMS_RFS_S_ISCHR (mode) || RTEMS_RFS_S_ISBLK(mode))
loc->handlers = rtems_rfs_rtems_handlers (device);
else if (RTEMS_RFS_S_ISLNK (mode))
1121c: 0a000002 beq 1122c <rtems_rfs_rtems_set_handlers+0x5c>
loc->handlers = rtems_rfs_rtems_handlers (link);
else if (RTEMS_RFS_S_ISREG (mode))
11220: e3530902 cmp r3, #32768 ; 0x8000
11224: 1a000003 bne 11238 <rtems_rfs_rtems_set_handlers+0x68>
loc->handlers = rtems_rfs_rtems_handlers (file);
11228: e59f3024 ldr r3, [pc, #36] ; 11254 <rtems_rfs_rtems_set_handlers+0x84>
1122c: e5803010 str r3, [r0, #16]
else
{
printf ("rtems-rfs: mode type unknown: %04x\n", mode);
return false;
}
return true;
11230: e3a00001 mov r0, #1
11234: e8bd8010 pop {r4, pc}
loc->handlers = rtems_rfs_rtems_handlers (link);
else if (RTEMS_RFS_S_ISREG (mode))
loc->handlers = rtems_rfs_rtems_handlers (file);
else
{
printf ("rtems-rfs: mode type unknown: %04x\n", mode);
11238: e59f0018 ldr r0, [pc, #24] ; 11258 <rtems_rfs_rtems_set_handlers+0x88><== NOT EXECUTED
1123c: eb0035fa bl 1ea2c <printf> <== NOT EXECUTED
return false;
11240: e1a00004 mov r0, r4 <== NOT EXECUTED
}
return true;
}
11244: e8bd8010 pop {r4, pc} <== NOT EXECUTED
000103b0 <rtems_rfs_rtems_statvfs>:
* @return int
*/
static int
rtems_rfs_rtems_statvfs (const rtems_filesystem_location_info_t* pathloc,
struct statvfs* sb)
{
103b0: e92d4033 push {r0, r1, r4, r5, lr} <== NOT EXECUTED
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
103b4: e5903014 ldr r3, [r0, #20] <== NOT EXECUTED
103b8: e5935008 ldr r5, [r3, #8] <== NOT EXECUTED
* @return int
*/
static int
rtems_rfs_rtems_statvfs (const rtems_filesystem_location_info_t* pathloc,
struct statvfs* sb)
{
103bc: e1a04001 mov r4, r1 <== NOT EXECUTED
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
size_t blocks;
size_t inodes;
rtems_rfs_group_usage (fs, &blocks, &inodes);
103c0: e28d2004 add r2, sp, #4 <== NOT EXECUTED
103c4: e1a00005 mov r0, r5 <== NOT EXECUTED
103c8: e1a0100d mov r1, sp <== NOT EXECUTED
103cc: ebfffd3f bl f8d0 <rtems_rfs_group_usage> <== NOT EXECUTED
sb->f_bsize = rtems_rfs_fs_block_size (fs);
103d0: e5953008 ldr r3, [r5, #8] <== NOT EXECUTED
103d4: e5843000 str r3, [r4] <== NOT EXECUTED
sb->f_frsize = rtems_rfs_fs_media_block_size (fs);
103d8: e5953010 ldr r3, [r5, #16] <== NOT EXECUTED
103dc: e5932020 ldr r2, [r3, #32] <== NOT EXECUTED
sb->f_blocks = rtems_rfs_fs_media_blocks (fs);
103e0: e593301c ldr r3, [r3, #28] <== NOT EXECUTED
size_t inodes;
rtems_rfs_group_usage (fs, &blocks, &inodes);
sb->f_bsize = rtems_rfs_fs_block_size (fs);
sb->f_frsize = rtems_rfs_fs_media_block_size (fs);
103e4: e5842004 str r2, [r4, #4] <== NOT EXECUTED
sb->f_blocks = rtems_rfs_fs_media_blocks (fs);
103e8: e5843008 str r3, [r4, #8] <== NOT EXECUTED
sb->f_bfree = rtems_rfs_fs_blocks (fs) - blocks;
103ec: e5952004 ldr r2, [r5, #4] <== NOT EXECUTED
103f0: e59d3000 ldr r3, [sp] <== NOT EXECUTED
103f4: e0633002 rsb r3, r3, r2 <== NOT EXECUTED
103f8: e5843010 str r3, [r4, #16] <== NOT EXECUTED
sb->f_bavail = sb->f_bfree;
103fc: e5843018 str r3, [r4, #24] <== NOT EXECUTED
sb->f_files = rtems_rfs_fs_inodes (fs);
sb->f_ffree = rtems_rfs_fs_inodes (fs) - inodes;
10400: e59d2004 ldr r2, [sp, #4] <== NOT EXECUTED
sb->f_bsize = rtems_rfs_fs_block_size (fs);
sb->f_frsize = rtems_rfs_fs_media_block_size (fs);
sb->f_blocks = rtems_rfs_fs_media_blocks (fs);
sb->f_bfree = rtems_rfs_fs_blocks (fs) - blocks;
sb->f_bavail = sb->f_bfree;
sb->f_files = rtems_rfs_fs_inodes (fs);
10404: e5953014 ldr r3, [r5, #20] <== NOT EXECUTED
10408: e5843020 str r3, [r4, #32] <== NOT EXECUTED
sb->f_ffree = rtems_rfs_fs_inodes (fs) - inodes;
1040c: e0623003 rsb r3, r2, r3 <== NOT EXECUTED
10410: e5843024 str r3, [r4, #36] ; 0x24 <== NOT EXECUTED
sb->f_favail = sb->f_ffree;
10414: e5843028 str r3, [r4, #40] ; 0x28 <== NOT EXECUTED
sb->f_fsid = RTEMS_RFS_SB_MAGIC;
10418: e59f3024 ldr r3, [pc, #36] ; 10444 <rtems_rfs_rtems_statvfs+0x94><== NOT EXECUTED
1041c: e584302c str r3, [r4, #44] ; 0x2c <== NOT EXECUTED
sb->f_flag = rtems_rfs_fs_flags (fs);
10420: e5953000 ldr r3, [r5] <== NOT EXECUTED
10424: e5843030 str r3, [r4, #48] ; 0x30 <== NOT EXECUTED
sb->f_namemax = rtems_rfs_fs_max_name (fs);
10428: e595301c ldr r3, [r5, #28] <== NOT EXECUTED
rtems_rfs_group_usage (fs, &blocks, &inodes);
sb->f_bsize = rtems_rfs_fs_block_size (fs);
sb->f_frsize = rtems_rfs_fs_media_block_size (fs);
sb->f_blocks = rtems_rfs_fs_media_blocks (fs);
1042c: e3a00000 mov r0, #0 <== NOT EXECUTED
10430: e584000c str r0, [r4, #12] <== NOT EXECUTED
sb->f_bfree = rtems_rfs_fs_blocks (fs) - blocks;
10434: e5840014 str r0, [r4, #20] <== NOT EXECUTED
sb->f_bavail = sb->f_bfree;
10438: e584001c str r0, [r4, #28] <== NOT EXECUTED
sb->f_files = rtems_rfs_fs_inodes (fs);
sb->f_ffree = rtems_rfs_fs_inodes (fs) - inodes;
sb->f_favail = sb->f_ffree;
sb->f_fsid = RTEMS_RFS_SB_MAGIC;
sb->f_flag = rtems_rfs_fs_flags (fs);
sb->f_namemax = rtems_rfs_fs_max_name (fs);
1043c: e5843034 str r3, [r4, #52] ; 0x34 <== NOT EXECUTED
return 0;
}
10440: e8bd803c pop {r2, r3, r4, r5, pc} <== NOT EXECUTED
000105ac <rtems_rfs_rtems_symlink>:
static int
rtems_rfs_rtems_symlink (const rtems_filesystem_location_info_t* parent_loc,
const char* node_name,
size_t node_name_len,
const char* target)
{
105ac: e92d47ff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, lr}
105b0: e1a04003 mov r4, r3
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (parent_loc);
105b4: e5903014 ldr r3, [r0, #20]
rtems_rfs_ino parent = rtems_rfs_rtems_get_pathloc_ino (parent_loc);
105b8: e5908008 ldr r8, [r0, #8]
int rc;
rc = rtems_rfs_symlink (fs, node_name, node_name_len,
target, strlen (target),
105bc: e1a00004 mov r0, r4
rtems_rfs_rtems_symlink (const rtems_filesystem_location_info_t* parent_loc,
const char* node_name,
size_t node_name_len,
const char* target)
{
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (parent_loc);
105c0: e5937008 ldr r7, [r3, #8]
static int
rtems_rfs_rtems_symlink (const rtems_filesystem_location_info_t* parent_loc,
const char* node_name,
size_t node_name_len,
const char* target)
{
105c4: e1a06001 mov r6, r1
105c8: e1a05002 mov r5, r2
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (parent_loc);
rtems_rfs_ino parent = rtems_rfs_rtems_get_pathloc_ino (parent_loc);
int rc;
rc = rtems_rfs_symlink (fs, node_name, node_name_len,
target, strlen (target),
105cc: eb003dea bl 1fd7c <strlen>
105d0: e1a09000 mov r9, r0
geteuid(), getegid(), parent);
105d4: eb000ffe bl 145d4 <geteuid>
105d8: e1a0a000 mov sl, r0
105dc: eb000ff7 bl 145c0 <getegid>
{
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (parent_loc);
rtems_rfs_ino parent = rtems_rfs_rtems_get_pathloc_ino (parent_loc);
int rc;
rc = rtems_rfs_symlink (fs, node_name, node_name_len,
105e0: e1a03004 mov r3, r4
105e4: e58d0008 str r0, [sp, #8]
105e8: e1a01006 mov r1, r6
105ec: e1a00007 mov r0, r7
105f0: e1a02005 mov r2, r5
105f4: e88d0600 stm sp, {r9, sl}
105f8: e58d800c str r8, [sp, #12]
105fc: eb002ccb bl 1b930 <rtems_rfs_symlink>
target, strlen (target),
geteuid(), getegid(), parent);
if (rc)
10600: e2504000 subs r4, r0, #0
{
return rtems_rfs_rtems_error ("symlink: linking", rc);
}
return 0;
10604: 01a00004 moveq r0, r4
int rc;
rc = rtems_rfs_symlink (fs, node_name, node_name_len,
target, strlen (target),
geteuid(), getegid(), parent);
if (rc)
10608: 0a000002 beq 10618 <rtems_rfs_rtems_symlink+0x6c>
{
return rtems_rfs_rtems_error ("symlink: linking", rc);
1060c: eb0033f0 bl 1d5d4 <__errno> <== NOT EXECUTED
10610: e5804000 str r4, [r0] <== NOT EXECUTED
10614: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return 0;
}
10618: e28dd010 add sp, sp, #16
1061c: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
00010ad4 <rtems_rfs_rtems_unlock>:
/**
* Unlock the RFS file system.
*/
static inline void
rtems_rfs_rtems_unlock (rtems_rfs_file_system* fs)
{
10ad4: e92d4010 push {r4, lr}
rtems_rfs_rtems_private* rtems = rtems_rfs_fs_user (fs);
10ad8: e5904080 ldr r4, [r0, #128] ; 0x80
rtems_rfs_buffers_release (fs);
10adc: eb002031 bl 18ba8 <rtems_rfs_buffers_release>
*/
static inline int
rtems_rfs_mutex_unlock (rtems_rfs_mutex* mutex)
{
#if __rtems__
rtems_status_code sc = rtems_semaphore_release (*mutex);
10ae0: e5940000 ldr r0, [r4]
10ae4: ebffe8dd bl ae60 <rtems_semaphore_release>
if (sc != RTEMS_SUCCESSFUL)
10ae8: e2504000 subs r4, r0, #0
10aec: 08bd8010 popeq {r4, pc}
{
#if RTEMS_RFS_TRACE
if (rtems_rfs_trace (RTEMS_RFS_TRACE_MUTEX))
10af0: e3a00004 mov r0, #4 <== NOT EXECUTED
10af4: e3a01000 mov r1, #0 <== NOT EXECUTED
10af8: eb0001db bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
10afc: e3500000 cmp r0, #0 <== NOT EXECUTED
10b00: 08bd8010 popeq {r4, pc} <== NOT EXECUTED
printf ("rtems-rfs: mutex: release failed: %s\n",
10b04: e1a00004 mov r0, r4 <== NOT EXECUTED
10b08: ebffd6bc bl 6600 <rtems_status_text> <== NOT EXECUTED
10b0c: e1a01000 mov r1, r0 <== NOT EXECUTED
10b10: e59f0004 ldr r0, [pc, #4] ; 10b1c <rtems_rfs_rtems_unlock+0x48><== NOT EXECUTED
rtems_rfs_mutex_unlock (&rtems->access);
}
10b14: e8bd4010 pop {r4, lr} <== NOT EXECUTED
10b18: ea0037c3 b 1ea2c <printf> <== NOT EXECUTED
00010620 <rtems_rfs_rtems_utime>:
static int
rtems_rfs_rtems_utime(const rtems_filesystem_location_info_t* pathloc,
time_t atime,
time_t mtime)
{
10620: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED
10624: e1a04002 mov r4, r2 <== NOT EXECUTED
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
10628: e5902014 ldr r2, [r0, #20] <== NOT EXECUTED
1062c: e5926008 ldr r6, [r2, #8] <== NOT EXECUTED
static int
rtems_rfs_rtems_utime(const rtems_filesystem_location_info_t* pathloc,
time_t atime,
time_t mtime)
{
10630: e1a03000 mov r3, r0 <== NOT EXECUTED
10634: e24dd028 sub sp, sp, #40 ; 0x28 <== NOT EXECUTED
10638: e1a05001 mov r5, r1 <== NOT EXECUTED
rtems_rfs_file_system* fs = rtems_rfs_rtems_pathloc_dev (pathloc);
rtems_rfs_ino ino = rtems_rfs_rtems_get_pathloc_ino (pathloc);
rtems_rfs_inode_handle inode;
int rc;
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
1063c: e1a00006 mov r0, r6 <== NOT EXECUTED
10640: e5931008 ldr r1, [r3, #8] <== NOT EXECUTED
10644: e1a0200d mov r2, sp <== NOT EXECUTED
10648: e3a03001 mov r3, #1 <== NOT EXECUTED
1064c: ebfffcf8 bl fa34 <rtems_rfs_inode_open> <== NOT EXECUTED
if (rc)
10650: e2507000 subs r7, r0, #0 <== NOT EXECUTED
10654: 0a000002 beq 10664 <rtems_rfs_rtems_utime+0x44> <== NOT EXECUTED
{
return rtems_rfs_rtems_error ("utime: read inode", rc);
10658: eb0033dd bl 1d5d4 <__errno> <== NOT EXECUTED
1065c: e5807000 str r7, [r0] <== NOT EXECUTED
10660: ea000018 b 106c8 <rtems_rfs_rtems_utime+0xa8> <== NOT EXECUTED
*/
static inline void
rtems_rfs_inode_set_atime (rtems_rfs_inode_handle* handle,
rtems_rfs_time atime)
{
rtems_rfs_write_u32 (&handle->node->atime, atime);
10664: e59d300c ldr r3, [sp, #12] <== NOT EXECUTED
10668: e1a02c25 lsr r2, r5, #24 <== NOT EXECUTED
1066c: e5c32010 strb r2, [r3, #16] <== NOT EXECUTED
10670: e1a02825 lsr r2, r5, #16 <== NOT EXECUTED
10674: e5c32011 strb r2, [r3, #17] <== NOT EXECUTED
10678: e1a02425 lsr r2, r5, #8 <== NOT EXECUTED
1067c: e5c32012 strb r2, [r3, #18] <== NOT EXECUTED
rtems_rfs_buffer_mark_dirty (&handle->buffer);
10680: e3a02001 mov r2, #1 <== NOT EXECUTED
10684: e5cd2010 strb r2, [sp, #16] <== NOT EXECUTED
*/
static inline void
rtems_rfs_inode_set_mtime (rtems_rfs_inode_handle* handle,
rtems_rfs_time mtime)
{
rtems_rfs_write_u32 (&handle->node->mtime, mtime);
10688: e1a02c24 lsr r2, r4, #24 <== NOT EXECUTED
1068c: e5c32014 strb r2, [r3, #20] <== NOT EXECUTED
10690: e1a02824 lsr r2, r4, #16 <== NOT EXECUTED
10694: e5c32015 strb r2, [r3, #21] <== NOT EXECUTED
10698: e1a02424 lsr r2, r4, #8 <== NOT EXECUTED
1069c: e5c34017 strb r4, [r3, #23] <== NOT EXECUTED
*/
static inline void
rtems_rfs_inode_set_atime (rtems_rfs_inode_handle* handle,
rtems_rfs_time atime)
{
rtems_rfs_write_u32 (&handle->node->atime, atime);
106a0: e5c35013 strb r5, [r3, #19] <== NOT EXECUTED
*/
static inline void
rtems_rfs_inode_set_mtime (rtems_rfs_inode_handle* handle,
rtems_rfs_time mtime)
{
rtems_rfs_write_u32 (&handle->node->mtime, mtime);
106a4: e5c32016 strb r2, [r3, #22] <== NOT EXECUTED
}
rtems_rfs_inode_set_atime (&inode, atime);
rtems_rfs_inode_set_mtime (&inode, mtime);
rc = rtems_rfs_inode_close (fs, &inode);
106a8: e1a00006 mov r0, r6 <== NOT EXECUTED
106ac: e1a0100d mov r1, sp <== NOT EXECUTED
106b0: ebfffd54 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
if (rc)
106b4: e2504000 subs r4, r0, #0 <== NOT EXECUTED
{
return rtems_rfs_rtems_error ("utime: closing inode", rc);
}
return 0;
106b8: 01a00004 moveq r0, r4 <== NOT EXECUTED
rtems_rfs_inode_set_atime (&inode, atime);
rtems_rfs_inode_set_mtime (&inode, mtime);
rc = rtems_rfs_inode_close (fs, &inode);
if (rc)
106bc: 0a000002 beq 106cc <rtems_rfs_rtems_utime+0xac> <== NOT EXECUTED
{
return rtems_rfs_rtems_error ("utime: closing inode", rc);
106c0: eb0033c3 bl 1d5d4 <__errno> <== NOT EXECUTED
106c4: e5804000 str r4, [r0] <== NOT EXECUTED
106c8: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
return 0;
}
106cc: e28dd028 add sp, sp, #40 ; 0x28 <== NOT EXECUTED
106d0: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
000184dc <rtems_rfs_scan_chain>:
*/
static rtems_rfs_buffer*
rtems_rfs_scan_chain (rtems_chain_control* chain,
uint32_t* count,
rtems_rfs_buffer_block block)
{
184dc: e92d40f0 push {r4, r5, r6, r7, lr}
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Last(
Chain_Control *the_chain
)
{
return _Chain_Tail( the_chain )->previous;
184e0: e5904008 ldr r4, [r0, #8]
184e4: e1a07000 mov r7, r0
184e8: e1a05001 mov r5, r1
rtems_rfs_buffer* buffer;
rtems_chain_node* node;
node = rtems_chain_last (chain);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
184ec: e3a00080 mov r0, #128 ; 0x80
184f0: e3a01000 mov r1, #0
*/
static rtems_rfs_buffer*
rtems_rfs_scan_chain (rtems_chain_control* chain,
uint32_t* count,
rtems_rfs_buffer_block block)
{
184f4: e1a06002 mov r6, r2
rtems_rfs_buffer* buffer;
rtems_chain_node* node;
node = rtems_chain_last (chain);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
184f8: ebffe35b bl 1126c <rtems_rfs_trace>
184fc: e3500000 cmp r0, #0
18500: 0a00001e beq 18580 <rtems_rfs_scan_chain+0xa4>
printf ("rtems-rfs: buffer-scan: count=%" PRIu32 ", block=%" PRIu32 ": ", *count, block);
18504: e5951000 ldr r1, [r5] <== NOT EXECUTED
18508: e1a02006 mov r2, r6 <== NOT EXECUTED
1850c: e59f0098 ldr r0, [pc, #152] ; 185ac <rtems_rfs_scan_chain+0xd0><== NOT EXECUTED
18510: eb001945 bl 1ea2c <printf> <== NOT EXECUTED
18514: ea000019 b 18580 <rtems_rfs_scan_chain+0xa4> <== NOT EXECUTED
while (!rtems_chain_is_head (chain, node))
{
buffer = (rtems_rfs_buffer*) node;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
18518: ebffe353 bl 1126c <rtems_rfs_trace>
1851c: e3500000 cmp r0, #0
printf ("%" PRIuPTR " ", ((intptr_t) buffer->user));
18520: 159f0088 ldrne r0, [pc, #136] ; 185b0 <rtems_rfs_scan_chain+0xd4>
18524: 15941034 ldrne r1, [r4, #52] ; 0x34
18528: 1b00193f blne 1ea2c <printf>
if (((rtems_rfs_buffer_block) ((intptr_t)(buffer->user))) == block)
1852c: e5943034 ldr r3, [r4, #52] ; 0x34
18530: e1530006 cmp r3, r6
18534: 1a000010 bne 1857c <rtems_rfs_scan_chain+0xa0>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
18538: e3a00080 mov r0, #128 ; 0x80
1853c: e3a01000 mov r1, #0
18540: ebffe349 bl 1126c <rtems_rfs_trace>
18544: e3500000 cmp r0, #0
printf (": found block=%" PRIuPTR "\n",
18548: 159f0064 ldrne r0, [pc, #100] ; 185b4 <rtems_rfs_scan_chain+0xd8>
1854c: 15941034 ldrne r1, [r4, #52] ; 0x34
18550: 1b001935 blne 1ea2c <printf>
((intptr_t)(buffer->user)));
(*count)--;
18554: e5953000 ldr r3, [r5]
18558: e2433001 sub r3, r3, #1
1855c: e5853000 str r3, [r5]
*/
RTEMS_INLINE_ROUTINE void rtems_chain_extract(
rtems_chain_node *the_node
)
{
_Chain_Extract( the_node );
18560: e1a00004 mov r0, r4
18564: ebfff4f9 bl 15950 <_Chain_Extract>
*/
RTEMS_INLINE_ROUTINE void _Chain_Set_off_chain(
Chain_Node *node
)
{
node->next = node->previous = NULL;
18568: e3a03000 mov r3, #0
1856c: e5843004 str r3, [r4, #4]
18570: e5843000 str r3, [r4]
rtems_chain_extract (node);
rtems_chain_set_off_chain (node);
return buffer;
18574: e1a00004 mov r0, r4
18578: e8bd80f0 pop {r4, r5, r6, r7, pc}
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Previous(
Chain_Node *the_node
)
{
return the_node->previous;
1857c: e5944004 ldr r4, [r4, #4]
node = rtems_chain_last (chain);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
printf ("rtems-rfs: buffer-scan: count=%" PRIu32 ", block=%" PRIu32 ": ", *count, block);
while (!rtems_chain_is_head (chain, node))
18580: e1540007 cmp r4, r7
{
buffer = (rtems_rfs_buffer*) node;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
18584: e3a00080 mov r0, #128 ; 0x80
18588: e3a01000 mov r1, #0
node = rtems_chain_last (chain);
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
printf ("rtems-rfs: buffer-scan: count=%" PRIu32 ", block=%" PRIu32 ": ", *count, block);
while (!rtems_chain_is_head (chain, node))
1858c: 1affffe1 bne 18518 <rtems_rfs_scan_chain+0x3c>
return buffer;
}
node = rtems_chain_previous (node);
}
if (rtems_rfs_trace (RTEMS_RFS_TRACE_BUFFER_CHAINS))
18590: ebffe335 bl 1126c <rtems_rfs_trace>
18594: e3500000 cmp r0, #0
18598: 08bd80f0 popeq {r4, r5, r6, r7, pc}
printf (": not found\n");
1859c: e59f0014 ldr r0, [pc, #20] ; 185b8 <rtems_rfs_scan_chain+0xdc><== NOT EXECUTED
185a0: eb0019b9 bl 1ec8c <puts> <== NOT EXECUTED
return NULL;
185a4: e3a00000 mov r0, #0 <== NOT EXECUTED
}
185a8: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
0001b930 <rtems_rfs_symlink>:
const char* link,
int link_length,
uid_t uid,
gid_t gid,
rtems_rfs_ino parent)
{
1b930: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
1b934: e1a04000 mov r4, r0
1b938: e24dd0a4 sub sp, sp, #164 ; 0xa4
1b93c: e1a07001 mov r7, r1
rtems_rfs_inode_handle inode;
rtems_rfs_ino ino;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_SYMLINK))
1b940: e3a00000 mov r0, #0
1b944: e3a01002 mov r1, #2
const char* link,
int link_length,
uid_t uid,
gid_t gid,
rtems_rfs_ino parent)
{
1b948: e1a06002 mov r6, r2
1b94c: e1a08003 mov r8, r3
1b950: e59d50c8 ldr r5, [sp, #200] ; 0xc8
1b954: e59db0d4 ldr fp, [sp, #212] ; 0xd4
1b958: e1dd9cbc ldrh r9, [sp, #204] ; 0xcc
1b95c: e1ddadb0 ldrh sl, [sp, #208] ; 0xd0
rtems_rfs_inode_handle inode;
rtems_rfs_ino ino;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_SYMLINK))
1b960: ebffd641 bl 1126c <rtems_rfs_trace>
1b964: e3500000 cmp r0, #0
1b968: 0a000014 beq 1b9c0 <rtems_rfs_symlink+0x90>
{
int c;
printf ("rtems-rfs: symlink: parent:%" PRIu32 " name:", parent);
1b96c: e59f0224 ldr r0, [pc, #548] ; 1bb98 <rtems_rfs_symlink+0x268><== NOT EXECUTED
1b970: e1a0100b mov r1, fp <== NOT EXECUTED
1b974: eb000c2c bl 1ea2c <printf> <== NOT EXECUTED
for (c = 0; c < length; c++)
1b978: e3a03000 mov r3, #0 <== NOT EXECUTED
1b97c: ea000004 b 1b994 <rtems_rfs_symlink+0x64> <== NOT EXECUTED
printf ("%c", name[c]);
1b980: e7d70003 ldrb r0, [r7, r3] <== NOT EXECUTED
1b984: e58d3014 str r3, [sp, #20] <== NOT EXECUTED
1b988: eb000c91 bl 1ebd4 <putchar> <== NOT EXECUTED
if (rtems_rfs_trace (RTEMS_RFS_TRACE_SYMLINK))
{
int c;
printf ("rtems-rfs: symlink: parent:%" PRIu32 " name:", parent);
for (c = 0; c < length; c++)
1b98c: e59d3014 ldr r3, [sp, #20] <== NOT EXECUTED
1b990: e2833001 add r3, r3, #1 <== NOT EXECUTED
1b994: e1530006 cmp r3, r6 <== NOT EXECUTED
1b998: bafffff8 blt 1b980 <rtems_rfs_symlink+0x50> <== NOT EXECUTED
printf ("%c", name[c]);
printf (" link:");
1b99c: e59f01f8 ldr r0, [pc, #504] ; 1bb9c <rtems_rfs_symlink+0x26c><== NOT EXECUTED
1b9a0: eb000c21 bl 1ea2c <printf> <== NOT EXECUTED
for (c = 0; c < link_length; c++)
1b9a4: e3a06000 mov r6, #0 <== NOT EXECUTED
1b9a8: ea000002 b 1b9b8 <rtems_rfs_symlink+0x88> <== NOT EXECUTED
printf ("%c", link[c]);
1b9ac: e7d80006 ldrb r0, [r8, r6] <== NOT EXECUTED
1b9b0: eb000c87 bl 1ebd4 <putchar> <== NOT EXECUTED
int c;
printf ("rtems-rfs: symlink: parent:%" PRIu32 " name:", parent);
for (c = 0; c < length; c++)
printf ("%c", name[c]);
printf (" link:");
for (c = 0; c < link_length; c++)
1b9b4: e2866001 add r6, r6, #1 <== NOT EXECUTED
1b9b8: e1560005 cmp r6, r5 <== NOT EXECUTED
1b9bc: bafffffa blt 1b9ac <rtems_rfs_symlink+0x7c> <== NOT EXECUTED
printf ("%c", link[c]);
}
if (link_length >= rtems_rfs_fs_block_size (fs))
1b9c0: e5943008 ldr r3, [r4, #8]
1b9c4: e1550003 cmp r5, r3
return ENAMETOOLONG;
1b9c8: 23a0705b movcs r7, #91 ; 0x5b
printf (" link:");
for (c = 0; c < link_length; c++)
printf ("%c", link[c]);
}
if (link_length >= rtems_rfs_fs_block_size (fs))
1b9cc: 2a00006e bcs 1bb8c <rtems_rfs_symlink+0x25c>
return ENAMETOOLONG;
rc = rtems_rfs_inode_create (fs, parent, name, strlen (name),
1b9d0: e1a00007 mov r0, r7
1b9d4: eb0010e8 bl 1fd7c <strlen>
1b9d8: e59f21c0 ldr r2, [pc, #448] ; 1bba0 <rtems_rfs_symlink+0x270>
1b9dc: e3a06001 mov r6, #1
1b9e0: e88d0044 stm sp, {r2, r6}
1b9e4: e28d209c add r2, sp, #156 ; 0x9c
1b9e8: e1a03000 mov r3, r0
1b9ec: e58d2010 str r2, [sp, #16]
1b9f0: e1a00004 mov r0, r4
1b9f4: e1a02007 mov r2, r7
1b9f8: e1a0100b mov r1, fp
1b9fc: e58d9008 str r9, [sp, #8]
1ba00: e58da00c str sl, [sp, #12]
1ba04: ebffd15c bl ff7c <rtems_rfs_inode_create>
RTEMS_RFS_S_SYMLINK,
1, uid, gid, &ino);
if (rc > 0)
1ba08: e2507000 subs r7, r0, #0
1ba0c: ca00005e bgt 1bb8c <rtems_rfs_symlink+0x25c>
return rc;
rc = rtems_rfs_inode_open (fs, ino, &inode, true);
1ba10: e1a00004 mov r0, r4
1ba14: e59d109c ldr r1, [sp, #156] ; 0x9c
1ba18: e28d2068 add r2, sp, #104 ; 0x68
1ba1c: e1a03006 mov r3, r6
1ba20: ebffd003 bl fa34 <rtems_rfs_inode_open>
if (rc > 0)
1ba24: e2507000 subs r7, r0, #0
1ba28: ca000057 bgt 1bb8c <rtems_rfs_symlink+0x25c>
/*
* If the link length is less than the length of data union in the inode
* place the link into the data area else allocate a block and write the link
* to that.
*/
if (link_length < RTEMS_RFS_INODE_DATA_NAME_SIZE)
1ba2c: e3550013 cmp r5, #19
1ba30: 8a000013 bhi 1ba84 <rtems_rfs_symlink+0x154>
{
memset (inode.node->data.name, 0, RTEMS_RFS_INODE_DATA_NAME_SIZE);
1ba34: e59d0074 ldr r0, [sp, #116] ; 0x74
1ba38: e3a01000 mov r1, #0
1ba3c: e3a02014 mov r2, #20
1ba40: e280001c add r0, r0, #28
1ba44: eb000b87 bl 1e868 <memset>
memcpy (inode.node->data.name, link, link_length);
1ba48: e59d0074 ldr r0, [sp, #116] ; 0x74
1ba4c: e1a02005 mov r2, r5
1ba50: e280001c add r0, r0, #28
1ba54: e1a01008 mov r1, r8
1ba58: eb000aff bl 1e65c <memcpy>
* @param block_count The block count.
*/
static inline void
rtems_rfs_inode_set_block_count (rtems_rfs_inode_handle* handle, uint32_t block_count)
{
rtems_rfs_write_u32 (&handle->node->block_count, block_count);
1ba5c: e59d2074 ldr r2, [sp, #116] ; 0x74
1ba60: e3a03000 mov r3, #0
1ba64: e5c2300c strb r3, [r2, #12]
1ba68: e59d2074 ldr r2, [sp, #116] ; 0x74
1ba6c: e5c2300d strb r3, [r2, #13]
1ba70: e59d2074 ldr r2, [sp, #116] ; 0x74
1ba74: e5c2300e strb r3, [r2, #14]
1ba78: e59d2074 ldr r2, [sp, #116] ; 0x74
1ba7c: e5c2300f strb r3, [r2, #15]
1ba80: ea000034 b 1bb58 <rtems_rfs_symlink+0x228>
rtems_rfs_block_map map;
rtems_rfs_block_no block;
rtems_rfs_buffer_handle buffer;
uint8_t* data;
rc = rtems_rfs_block_map_open (fs, &inode, &map);
1ba84: e1a00004 mov r0, r4 <== NOT EXECUTED
1ba88: e28d1068 add r1, sp, #104 ; 0x68 <== NOT EXECUTED
1ba8c: e28d2018 add r2, sp, #24 <== NOT EXECUTED
1ba90: ebffef80 bl 17898 <rtems_rfs_block_map_open> <== NOT EXECUTED
if (rc > 0)
1ba94: e2507000 subs r7, r0, #0 <== NOT EXECUTED
{
rtems_rfs_inode_close (fs, &inode);
1ba98: e1a00004 mov r0, r4 <== NOT EXECUTED
rtems_rfs_block_no block;
rtems_rfs_buffer_handle buffer;
uint8_t* data;
rc = rtems_rfs_block_map_open (fs, &inode, &map);
if (rc > 0)
1ba9c: ca00002a bgt 1bb4c <rtems_rfs_symlink+0x21c> <== NOT EXECUTED
{
rtems_rfs_inode_close (fs, &inode);
return rc;
}
rc = rtems_rfs_block_map_grow (fs, &map, 1, &block);
1baa0: e28d1018 add r1, sp, #24 <== NOT EXECUTED
1baa4: e1a02006 mov r2, r6 <== NOT EXECUTED
1baa8: e28d30a0 add r3, sp, #160 ; 0xa0 <== NOT EXECUTED
1baac: ebfff0c3 bl 17dc0 <rtems_rfs_block_map_grow> <== NOT EXECUTED
if (rc > 0)
1bab0: e2507000 subs r7, r0, #0 <== NOT EXECUTED
1bab4: ca00000a bgt 1bae4 <rtems_rfs_symlink+0x1b4> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
1bab8: e3a06000 mov r6, #0 <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
rtems_rfs_inode_close (fs, &inode);
return rc;
}
rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, false);
1babc: e1a00004 mov r0, r4 <== NOT EXECUTED
1bac0: e28d1090 add r1, sp, #144 ; 0x90 <== NOT EXECUTED
1bac4: e59d20a0 ldr r2, [sp, #160] ; 0xa0 <== NOT EXECUTED
1bac8: e1a03006 mov r3, r6 <== NOT EXECUTED
1bacc: e5cd6090 strb r6, [sp, #144] ; 0x90 <== NOT EXECUTED
handle->bnum = 0;
1bad0: e58d6094 str r6, [sp, #148] ; 0x94 <== NOT EXECUTED
handle->buffer = NULL;
1bad4: e58d6098 str r6, [sp, #152] ; 0x98 <== NOT EXECUTED
1bad8: ebfff323 bl 1876c <rtems_rfs_buffer_handle_request> <== NOT EXECUTED
if (rc > 0)
1badc: e2507000 subs r7, r0, #0 <== NOT EXECUTED
1bae0: da000003 ble 1baf4 <rtems_rfs_symlink+0x1c4> <== NOT EXECUTED
{
rtems_rfs_block_map_close (fs, &map);
1bae4: e1a00004 mov r0, r4 <== NOT EXECUTED
1bae8: e28d1018 add r1, sp, #24 <== NOT EXECUTED
1baec: ebffefc2 bl 179fc <rtems_rfs_block_map_close> <== NOT EXECUTED
1baf0: ea000014 b 1bb48 <rtems_rfs_symlink+0x218> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &inode);
return rc;
}
data = rtems_rfs_buffer_data (&buffer);
1baf4: e59d3098 ldr r3, [sp, #152] ; 0x98 <== NOT EXECUTED
1baf8: e593701c ldr r7, [r3, #28] <== NOT EXECUTED
memset (data, 0xff, rtems_rfs_fs_block_size (fs));
1bafc: e3a010ff mov r1, #255 ; 0xff <== NOT EXECUTED
1bb00: e1a00007 mov r0, r7 <== NOT EXECUTED
1bb04: e5942008 ldr r2, [r4, #8] <== NOT EXECUTED
1bb08: eb000b56 bl 1e868 <memset> <== NOT EXECUTED
memcpy (data, link, link_length);
1bb0c: e1a02005 mov r2, r5 <== NOT EXECUTED
1bb10: e1a00007 mov r0, r7 <== NOT EXECUTED
1bb14: e1a01008 mov r1, r8 <== NOT EXECUTED
1bb18: eb000acf bl 1e65c <memcpy> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1bb1c: e28d1090 add r1, sp, #144 ; 0x90 <== NOT EXECUTED
1bb20: e1a00004 mov r0, r4 <== NOT EXECUTED
1bb24: ebfff2a4 bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
rtems_rfs_inode_close (fs, &inode);
return rc;
}
rc = rtems_rfs_block_map_close (fs, &map);
1bb28: e1a00004 mov r0, r4 <== NOT EXECUTED
1bb2c: e28d1018 add r1, sp, #24 <== NOT EXECUTED
handle->dirty = false;
1bb30: e5cd6090 strb r6, [sp, #144] ; 0x90 <== NOT EXECUTED
handle->bnum = 0;
1bb34: e58d6094 str r6, [sp, #148] ; 0x94 <== NOT EXECUTED
handle->buffer = NULL;
1bb38: e58d6098 str r6, [sp, #152] ; 0x98 <== NOT EXECUTED
1bb3c: ebffefae bl 179fc <rtems_rfs_block_map_close> <== NOT EXECUTED
if (rc > 0)
1bb40: e2507000 subs r7, r0, #0 <== NOT EXECUTED
1bb44: da000003 ble 1bb58 <rtems_rfs_symlink+0x228> <== NOT EXECUTED
{
rtems_rfs_inode_close (fs, &inode);
1bb48: e1a00004 mov r0, r4 <== NOT EXECUTED
1bb4c: e28d1068 add r1, sp, #104 ; 0x68 <== NOT EXECUTED
1bb50: ebffd02c bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return rc;
1bb54: ea00000c b 1bb8c <rtems_rfs_symlink+0x25c> <== NOT EXECUTED
*/
static inline void
rtems_rfs_inode_set_block_offset (rtems_rfs_inode_handle* handle,
uint16_t block_offset)
{
rtems_rfs_write_u16 (&handle->node->block_offset, block_offset);
1bb58: e59d3074 ldr r3, [sp, #116] ; 0x74
}
}
rtems_rfs_inode_set_block_offset (&inode, link_length);
1bb5c: e1a05805 lsl r5, r5, #16
1bb60: e1a02825 lsr r2, r5, #16
1bb64: e1a05c25 lsr r5, r5, #24
1bb68: e5c3500a strb r5, [r3, #10]
1bb6c: e59d3074 ldr r3, [sp, #116] ; 0x74
rc = rtems_rfs_inode_close (fs, &inode);
1bb70: e1a00004 mov r0, r4
1bb74: e5c3200b strb r2, [r3, #11]
1bb78: e28d1068 add r1, sp, #104 ; 0x68
rtems_rfs_buffer_mark_dirty (&handle->buffer);
1bb7c: e3a03001 mov r3, #1
1bb80: e5cd3078 strb r3, [sp, #120] ; 0x78
1bb84: ebffd01f bl fc08 <rtems_rfs_inode_close>
1bb88: e1a07000 mov r7, r0
return rc;
}
1bb8c: e1a00007 mov r0, r7
1bb90: e28dd0a4 add sp, sp, #164 ; 0xa4
1bb94: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0001bba4 <rtems_rfs_symlink_read>:
rtems_rfs_symlink_read (rtems_rfs_file_system* fs,
rtems_rfs_ino link,
char* path,
size_t size,
size_t* length)
{
1bba4: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
1bba8: e1a04000 mov r4, r0
1bbac: e24dd08c sub sp, sp, #140 ; 0x8c
1bbb0: e1a06001 mov r6, r1
rtems_rfs_inode_handle inode;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_SYMLINK_READ))
1bbb4: e3a00000 mov r0, #0
1bbb8: e3a01004 mov r1, #4
rtems_rfs_symlink_read (rtems_rfs_file_system* fs,
rtems_rfs_ino link,
char* path,
size_t size,
size_t* length)
{
1bbbc: e1a05002 mov r5, r2
1bbc0: e1a07003 mov r7, r3
1bbc4: e59d80a8 ldr r8, [sp, #168] ; 0xa8
rtems_rfs_inode_handle inode;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_SYMLINK_READ))
1bbc8: ebffd5a7 bl 1126c <rtems_rfs_trace>
1bbcc: e3500000 cmp r0, #0
printf ("rtems-rfs: symlink-read: link:%" PRIu32 "\n", link);
1bbd0: 159f017c ldrne r0, [pc, #380] ; 1bd54 <rtems_rfs_symlink_read+0x1b0>
1bbd4: 11a01006 movne r1, r6
1bbd8: 1b000b93 blne 1ea2c <printf>
rc = rtems_rfs_inode_open (fs, link, &inode, true);
1bbdc: e1a00004 mov r0, r4
1bbe0: e1a01006 mov r1, r6
1bbe4: e28d2054 add r2, sp, #84 ; 0x54
1bbe8: e3a03001 mov r3, #1
1bbec: ebffcf90 bl fa34 <rtems_rfs_inode_open>
if (rc)
1bbf0: e250a000 subs sl, r0, #0
1bbf4: 1a000053 bne 1bd48 <rtems_rfs_symlink_read+0x1a4>
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
1bbf8: e59d1060 ldr r1, [sp, #96] ; 0x60
1bbfc: e5d13002 ldrb r3, [r1, #2]
return rc;
if (!RTEMS_RFS_S_ISLNK (rtems_rfs_inode_get_mode (&inode)))
1bc00: e1a03403 lsl r3, r3, #8
1bc04: e2033a0f and r3, r3, #61440 ; 0xf000
1bc08: e3530a0a cmp r3, #40960 ; 0xa000
1bc0c: 0a000004 beq 1bc24 <rtems_rfs_symlink_read+0x80>
{
rtems_rfs_inode_close (fs, &inode);
1bc10: e1a00004 mov r0, r4 <== NOT EXECUTED
1bc14: e28d1054 add r1, sp, #84 ; 0x54 <== NOT EXECUTED
1bc18: ebffcffa bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return EINVAL;
1bc1c: e3a0a016 mov sl, #22 <== NOT EXECUTED
1bc20: ea000048 b 1bd48 <rtems_rfs_symlink_read+0x1a4> <== NOT EXECUTED
* @return uint32_t The block offset.
*/
static inline uint16_t
rtems_rfs_inode_get_block_offset (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->block_offset);
1bc24: e5d1300b ldrb r3, [r1, #11]
1bc28: e5d1200a ldrb r2, [r1, #10]
}
*length = rtems_rfs_inode_get_block_offset (&inode);
1bc2c: e1832402 orr r2, r3, r2, lsl #8
return rc;
if (!RTEMS_RFS_S_ISLNK (rtems_rfs_inode_get_mode (&inode)))
{
rtems_rfs_inode_close (fs, &inode);
return EINVAL;
1bc30: e1520007 cmp r2, r7
1bc34: 21a02007 movcs r2, r7
1bc38: e5882000 str r2, [r8]
* @return uint32_t The block count.
*/
static inline uint32_t
rtems_rfs_inode_get_block_count (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u32 (&handle->node->block_count);
1bc3c: e5d1300d ldrb r3, [r1, #13]
1bc40: e5d1000c ldrb r0, [r1, #12]
1bc44: e1a03803 lsl r3, r3, #16
1bc48: e1833c00 orr r3, r3, r0, lsl #24
1bc4c: e5d1000f ldrb r0, [r1, #15]
1bc50: e1833000 orr r3, r3, r0
1bc54: e5d1000e ldrb r0, [r1, #14]
if (size < *length)
{
*length = size;
}
if (rtems_rfs_inode_get_block_count (&inode) == 0)
1bc58: e1930400 orrs r0, r3, r0, lsl #8
1bc5c: 1a000003 bne 1bc70 <rtems_rfs_symlink_read+0xcc>
{
memcpy (path, inode.node->data.name, *length);
1bc60: e1a00005 mov r0, r5
1bc64: e281101c add r1, r1, #28
1bc68: eb000a7b bl 1e65c <memcpy>
1bc6c: ea000031 b 1bd38 <rtems_rfs_symlink_read+0x194>
rtems_rfs_block_map map;
rtems_rfs_block_no block;
rtems_rfs_buffer_handle buffer;
char* data;
rc = rtems_rfs_block_map_open (fs, &inode, &map);
1bc70: e1a00004 mov r0, r4 <== NOT EXECUTED
1bc74: e28d1054 add r1, sp, #84 ; 0x54 <== NOT EXECUTED
1bc78: e28d2004 add r2, sp, #4 <== NOT EXECUTED
1bc7c: ebffef05 bl 17898 <rtems_rfs_block_map_open> <== NOT EXECUTED
if (rc > 0)
1bc80: e250a000 subs sl, r0, #0 <== NOT EXECUTED
1bc84: ca000027 bgt 1bd28 <rtems_rfs_symlink_read+0x184> <== NOT EXECUTED
{
rtems_rfs_inode_close (fs, &inode);
return rc;
}
rc = rtems_rfs_block_map_seek (fs, &map, 0, &block);
1bc88: e28d3088 add r3, sp, #136 ; 0x88 <== NOT EXECUTED
1bc8c: e58d3000 str r3, [sp] <== NOT EXECUTED
1bc90: e1a00004 mov r0, r4 <== NOT EXECUTED
1bc94: e28d1004 add r1, sp, #4 <== NOT EXECUTED
1bc98: e3a02000 mov r2, #0 <== NOT EXECUTED
1bc9c: e3a03000 mov r3, #0 <== NOT EXECUTED
1bca0: ebfff01f bl 17d24 <rtems_rfs_block_map_seek> <== NOT EXECUTED
if (rc > 0)
1bca4: e250a000 subs sl, r0, #0 <== NOT EXECUTED
1bca8: ca00000a bgt 1bcd8 <rtems_rfs_symlink_read+0x134> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_open (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
handle->dirty = false;
1bcac: e3a06000 mov r6, #0 <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
rtems_rfs_inode_close (fs, &inode);
return rc;
}
rc = rtems_rfs_buffer_handle_request (fs, &buffer, block, false);
1bcb0: e1a00004 mov r0, r4 <== NOT EXECUTED
1bcb4: e28d107c add r1, sp, #124 ; 0x7c <== NOT EXECUTED
1bcb8: e59d2088 ldr r2, [sp, #136] ; 0x88 <== NOT EXECUTED
1bcbc: e1a03006 mov r3, r6 <== NOT EXECUTED
1bcc0: e5cd607c strb r6, [sp, #124] ; 0x7c <== NOT EXECUTED
handle->bnum = 0;
1bcc4: e58d6080 str r6, [sp, #128] ; 0x80 <== NOT EXECUTED
handle->buffer = NULL;
1bcc8: e58d6084 str r6, [sp, #132] ; 0x84 <== NOT EXECUTED
1bccc: ebfff2a6 bl 1876c <rtems_rfs_buffer_handle_request> <== NOT EXECUTED
if (rc > 0)
1bcd0: e250a000 subs sl, r0, #0 <== NOT EXECUTED
1bcd4: da000003 ble 1bce8 <rtems_rfs_symlink_read+0x144> <== NOT EXECUTED
{
rtems_rfs_block_map_close (fs, &map);
1bcd8: e1a00004 mov r0, r4 <== NOT EXECUTED
1bcdc: e28d1004 add r1, sp, #4 <== NOT EXECUTED
1bce0: ebffef45 bl 179fc <rtems_rfs_block_map_close> <== NOT EXECUTED
1bce4: ea00000f b 1bd28 <rtems_rfs_symlink_read+0x184> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &inode);
return rc;
}
data = rtems_rfs_buffer_data (&buffer);
memcpy (path, data, *length);
1bce8: e59d3084 ldr r3, [sp, #132] ; 0x84 <== NOT EXECUTED
1bcec: e5982000 ldr r2, [r8] <== NOT EXECUTED
1bcf0: e593101c ldr r1, [r3, #28] <== NOT EXECUTED
1bcf4: e1a00005 mov r0, r5 <== NOT EXECUTED
1bcf8: eb000a57 bl 1e65c <memcpy> <== NOT EXECUTED
*/
static inline int
rtems_rfs_buffer_handle_close (rtems_rfs_file_system* fs,
rtems_rfs_buffer_handle* handle)
{
rtems_rfs_buffer_handle_release (fs, handle);
1bcfc: e28d107c add r1, sp, #124 ; 0x7c <== NOT EXECUTED
1bd00: e1a00004 mov r0, r4 <== NOT EXECUTED
1bd04: ebfff22c bl 185bc <rtems_rfs_buffer_handle_release> <== NOT EXECUTED
rtems_rfs_block_map_close (fs, &map);
rtems_rfs_inode_close (fs, &inode);
return rc;
}
rc = rtems_rfs_block_map_close (fs, &map);
1bd08: e1a00004 mov r0, r4 <== NOT EXECUTED
1bd0c: e28d1004 add r1, sp, #4 <== NOT EXECUTED
handle->dirty = false;
1bd10: e5cd607c strb r6, [sp, #124] ; 0x7c <== NOT EXECUTED
handle->bnum = 0;
1bd14: e58d6080 str r6, [sp, #128] ; 0x80 <== NOT EXECUTED
handle->buffer = NULL;
1bd18: e58d6084 str r6, [sp, #132] ; 0x84 <== NOT EXECUTED
1bd1c: ebffef36 bl 179fc <rtems_rfs_block_map_close> <== NOT EXECUTED
if (rc > 0)
1bd20: e250a000 subs sl, r0, #0 <== NOT EXECUTED
1bd24: da000003 ble 1bd38 <rtems_rfs_symlink_read+0x194> <== NOT EXECUTED
{
rtems_rfs_inode_close (fs, &inode);
1bd28: e1a00004 mov r0, r4 <== NOT EXECUTED
1bd2c: e28d1054 add r1, sp, #84 ; 0x54 <== NOT EXECUTED
1bd30: ebffcfb4 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return rc;
1bd34: ea000003 b 1bd48 <rtems_rfs_symlink_read+0x1a4> <== NOT EXECUTED
}
}
rc = rtems_rfs_inode_close (fs, &inode);
1bd38: e1a00004 mov r0, r4
1bd3c: e28d1054 add r1, sp, #84 ; 0x54
1bd40: ebffcfb0 bl fc08 <rtems_rfs_inode_close>
1bd44: e1a0a000 mov sl, r0
return rc;
}
1bd48: e1a0000a mov r0, sl
1bd4c: e28dd08c add sp, sp, #140 ; 0x8c
1bd50: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
000112b4 <rtems_rfs_trace_clear_mask>:
rtems_rfs_trace_mask
rtems_rfs_trace_clear_mask (rtems_rfs_trace_mask mask)
{
rtems_rfs_trace_mask state = rtems_rfs_trace_flags;
112b4: e59fc018 ldr ip, [pc, #24] ; 112d4 <rtems_rfs_trace_clear_mask+0x20><== NOT EXECUTED
112b8: e89c000c ldm ip, {r2, r3} <== NOT EXECUTED
rtems_rfs_trace_flags &= ~mask;
112bc: e1c20000 bic r0, r2, r0 <== NOT EXECUTED
112c0: e1c31001 bic r1, r3, r1 <== NOT EXECUTED
112c4: e88c0003 stm ip, {r0, r1} <== NOT EXECUTED
return state;
}
112c8: e1a00002 mov r0, r2 <== NOT EXECUTED
112cc: e1a01003 mov r1, r3 <== NOT EXECUTED
112d0: e12fff1e bx lr <== NOT EXECUTED
00011290 <rtems_rfs_trace_set_mask>:
rtems_rfs_trace_mask
rtems_rfs_trace_set_mask (rtems_rfs_trace_mask mask)
{
rtems_rfs_trace_mask state = rtems_rfs_trace_flags;
11290: e59fc018 ldr ip, [pc, #24] ; 112b0 <rtems_rfs_trace_set_mask+0x20><== NOT EXECUTED
11294: e89c000c ldm ip, {r2, r3} <== NOT EXECUTED
rtems_rfs_trace_flags |= mask;
11298: e1800002 orr r0, r0, r2 <== NOT EXECUTED
1129c: e1811003 orr r1, r1, r3 <== NOT EXECUTED
112a0: e88c0003 stm ip, {r0, r1} <== NOT EXECUTED
return state;
}
112a4: e1a00002 mov r0, r2 <== NOT EXECUTED
112a8: e1a01003 mov r1, r3 <== NOT EXECUTED
112ac: e12fff1e bx lr <== NOT EXECUTED
000112d8 <rtems_rfs_trace_shell_command>:
int
rtems_rfs_trace_shell_command (int argc, char *argv[])
{
112d8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
112dc: e24dd0ac sub sp, sp, #172 ; 0xac <== NOT EXECUTED
112e0: e1a0a001 mov sl, r1 <== NOT EXECUTED
112e4: e1a0b000 mov fp, r0 <== NOT EXECUTED
const char* table[] =
112e8: e59f11a8 ldr r1, [pc, #424] ; 11498 <rtems_rfs_trace_shell_command+0x1c0><== NOT EXECUTED
112ec: e28d0010 add r0, sp, #16 <== NOT EXECUTED
112f0: e3a0209c mov r2, #156 ; 0x9c <== NOT EXECUTED
112f4: eb0034d8 bl 1e65c <memcpy> <== NOT EXECUTED
rtems_rfs_trace_mask clear_value = 0;
bool set = true;
int arg;
int t;
for (arg = 1; arg < argc; arg++)
112f8: e3a05001 mov r5, #1 <== NOT EXECUTED
"file-io",
"file-set"
};
rtems_rfs_trace_mask set_value = 0;
rtems_rfs_trace_mask clear_value = 0;
112fc: e3a00000 mov r0, #0 <== NOT EXECUTED
11300: e3a01000 mov r1, #0 <== NOT EXECUTED
}
int
rtems_rfs_trace_shell_command (int argc, char *argv[])
{
const char* table[] =
11304: e1a0900a mov r9, sl <== NOT EXECUTED
"file-set"
};
rtems_rfs_trace_mask set_value = 0;
rtems_rfs_trace_mask clear_value = 0;
bool set = true;
11308: e1a04005 mov r4, r5 <== NOT EXECUTED
"file-io",
"file-set"
};
rtems_rfs_trace_mask set_value = 0;
rtems_rfs_trace_mask clear_value = 0;
1130c: e88d0003 stm sp, {r0, r1} <== NOT EXECUTED
"file-close",
"file-io",
"file-set"
};
rtems_rfs_trace_mask set_value = 0;
11310: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
11314: e58d100c str r1, [sp, #12] <== NOT EXECUTED
}
}
}
rtems_rfs_trace_flags |= set_value;
rtems_rfs_trace_flags &= ~clear_value;
11318: e59f817c ldr r8, [pc, #380] ; 1149c <rtems_rfs_trace_shell_command+0x1c4><== NOT EXECUTED
1131c: e1a07005 mov r7, r5 <== NOT EXECUTED
rtems_rfs_trace_mask clear_value = 0;
bool set = true;
int arg;
int t;
for (arg = 1; arg < argc; arg++)
11320: ea000057 b 11484 <rtems_rfs_trace_shell_command+0x1ac> <== NOT EXECUTED
{
if (argv[arg][0] == '-')
11324: e5b96004 ldr r6, [r9, #4]! <== NOT EXECUTED
11328: e5d63000 ldrb r3, [r6] <== NOT EXECUTED
1132c: e353002d cmp r3, #45 ; 0x2d <== NOT EXECUTED
11330: 1a00001a bne 113a0 <rtems_rfs_trace_shell_command+0xc8> <== NOT EXECUTED
{
switch (argv[arg][1])
11334: e5d63001 ldrb r3, [r6, #1] <== NOT EXECUTED
11338: e3530068 cmp r3, #104 ; 0x68 <== NOT EXECUTED
1133c: 0a000002 beq 1134c <rtems_rfs_trace_shell_command+0x74> <== NOT EXECUTED
11340: e353006c cmp r3, #108 ; 0x6c <== NOT EXECUTED
11344: 1a000011 bne 11390 <rtems_rfs_trace_shell_command+0xb8> <== NOT EXECUTED
11348: ea000003 b 1135c <rtems_rfs_trace_shell_command+0x84> <== NOT EXECUTED
{
case 'h':
printf ("usage: %s [-hl] [set/clear] [flags]\n", argv[0]);
1134c: e59a1000 ldr r1, [sl] <== NOT EXECUTED
11350: e59f0148 ldr r0, [pc, #328] ; 114a0 <rtems_rfs_trace_shell_command+0x1c8><== NOT EXECUTED
11354: eb0035b4 bl 1ea2c <printf> <== NOT EXECUTED
11358: ea00004b b 1148c <rtems_rfs_trace_shell_command+0x1b4> <== NOT EXECUTED
return 0;
case 'l':
printf ("%s: valid flags to set or clear are:\n", argv[0]);
1135c: e59f0140 ldr r0, [pc, #320] ; 114a4 <rtems_rfs_trace_shell_command+0x1cc><== NOT EXECUTED
11360: e59a1000 ldr r1, [sl] <== NOT EXECUTED
11364: eb0035b0 bl 1ea2c <printf> <== NOT EXECUTED
11368: e3a04000 mov r4, #0 <== NOT EXECUTED
for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++)
printf (" %s\n", table[t]);
1136c: e2843010 add r3, r4, #16 <== NOT EXECUTED
11370: e1a0200d mov r2, sp <== NOT EXECUTED
11374: e59f012c ldr r0, [pc, #300] ; 114a8 <rtems_rfs_trace_shell_command+0x1d0><== NOT EXECUTED
11378: e7931002 ldr r1, [r3, r2] <== NOT EXECUTED
1137c: e2844004 add r4, r4, #4 <== NOT EXECUTED
11380: eb0035a9 bl 1ea2c <printf> <== NOT EXECUTED
case 'h':
printf ("usage: %s [-hl] [set/clear] [flags]\n", argv[0]);
return 0;
case 'l':
printf ("%s: valid flags to set or clear are:\n", argv[0]);
for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++)
11384: e354009c cmp r4, #156 ; 0x9c <== NOT EXECUTED
11388: 1afffff7 bne 1136c <rtems_rfs_trace_shell_command+0x94> <== NOT EXECUTED
1138c: ea00003e b 1148c <rtems_rfs_trace_shell_command+0x1b4> <== NOT EXECUTED
printf (" %s\n", table[t]);
return 0;
default:
printf ("error: unknown option\n");
11390: e59f0114 ldr r0, [pc, #276] ; 114ac <rtems_rfs_trace_shell_command+0x1d4><== NOT EXECUTED
11394: eb00363c bl 1ec8c <puts> <== NOT EXECUTED
return 1;
11398: e3a00001 mov r0, #1 <== NOT EXECUTED
1139c: ea00003b b 11490 <rtems_rfs_trace_shell_command+0x1b8> <== NOT EXECUTED
}
}
else
{
if (strcmp (argv[arg], "set") == 0)
113a0: e59f1108 ldr r1, [pc, #264] ; 114b0 <rtems_rfs_trace_shell_command+0x1d8><== NOT EXECUTED
113a4: e1a00006 mov r0, r6 <== NOT EXECUTED
113a8: eb0037f4 bl 1f380 <strcmp> <== NOT EXECUTED
set = true;
if (strcmp (argv[arg], "clear") == 0)
113ac: e59f1100 ldr r1, [pc, #256] ; 114b4 <rtems_rfs_trace_shell_command+0x1dc><== NOT EXECUTED
}
}
else
{
if (strcmp (argv[arg], "set") == 0)
set = true;
113b0: e3500000 cmp r0, #0 <== NOT EXECUTED
if (strcmp (argv[arg], "clear") == 0)
113b4: e1a00006 mov r0, r6 <== NOT EXECUTED
}
}
else
{
if (strcmp (argv[arg], "set") == 0)
set = true;
113b8: 03a04001 moveq r4, #1 <== NOT EXECUTED
if (strcmp (argv[arg], "clear") == 0)
113bc: eb0037ef bl 1f380 <strcmp> <== NOT EXECUTED
113c0: e3500000 cmp r0, #0 <== NOT EXECUTED
set = false;
113c4: 01a04000 moveq r4, r0 <== NOT EXECUTED
}
else
{
if (strcmp (argv[arg], "set") == 0)
set = true;
if (strcmp (argv[arg], "clear") == 0)
113c8: 0a000023 beq 1145c <rtems_rfs_trace_shell_command+0x184> <== NOT EXECUTED
set = false;
else if (strcmp (argv[arg], "all") == 0)
113cc: e1a00006 mov r0, r6 <== NOT EXECUTED
113d0: e59f10e0 ldr r1, [pc, #224] ; 114b8 <rtems_rfs_trace_shell_command+0x1e0><== NOT EXECUTED
113d4: eb0037e9 bl 1f380 <strcmp> <== NOT EXECUTED
113d8: e3500000 cmp r0, #0 <== NOT EXECUTED
113dc: 13a05000 movne r5, #0 <== NOT EXECUTED
113e0: 1a000006 bne 11400 <rtems_rfs_trace_shell_command+0x128> <== NOT EXECUTED
{
if (set)
113e4: e3540000 cmp r4, #0 <== NOT EXECUTED
set_value = RTEMS_RFS_TRACE_ALL;
113e8: e3e00000 mvn r0, #0 <== NOT EXECUTED
113ec: e3e01000 mvn r1, #0 <== NOT EXECUTED
set = true;
if (strcmp (argv[arg], "clear") == 0)
set = false;
else if (strcmp (argv[arg], "all") == 0)
{
if (set)
113f0: 0a000018 beq 11458 <rtems_rfs_trace_shell_command+0x180> <== NOT EXECUTED
set_value = RTEMS_RFS_TRACE_ALL;
113f4: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
113f8: e58d100c str r1, [sp, #12] <== NOT EXECUTED
113fc: ea000016 b 1145c <rtems_rfs_trace_shell_command+0x184> <== NOT EXECUTED
}
else
{
for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++)
{
if (strcmp (argv[arg], table[t]) == 0)
11400: e28d2010 add r2, sp, #16 <== NOT EXECUTED
11404: e1a00006 mov r0, r6 <== NOT EXECUTED
11408: e7921105 ldr r1, [r2, r5, lsl #2] <== NOT EXECUTED
1140c: eb0037db bl 1f380 <strcmp> <== NOT EXECUTED
11410: e3500000 cmp r0, #0 <== NOT EXECUTED
11414: 1a00000b bne 11448 <rtems_rfs_trace_shell_command+0x170> <== NOT EXECUTED
{
if (set)
11418: e3540000 cmp r4, #0 <== NOT EXECUTED
set_value = 1ULL << t;
1141c: e3a00001 mov r0, #1 <== NOT EXECUTED
11420: e3a01000 mov r1, #0 <== NOT EXECUTED
11424: e1a02005 mov r2, r5 <== NOT EXECUTED
{
for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++)
{
if (strcmp (argv[arg], table[t]) == 0)
{
if (set)
11428: 0a000003 beq 1143c <rtems_rfs_trace_shell_command+0x164> <== NOT EXECUTED
set_value = 1ULL << t;
1142c: eb00675d bl 2b1a8 <__aeabi_llsl> <== NOT EXECUTED
11430: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
11434: e58d100c str r1, [sp, #12] <== NOT EXECUTED
11438: ea000007 b 1145c <rtems_rfs_trace_shell_command+0x184> <== NOT EXECUTED
else
clear_value = 1ULL << t;
1143c: eb006759 bl 2b1a8 <__aeabi_llsl> <== NOT EXECUTED
11440: e88d0003 stm sp, {r0, r1} <== NOT EXECUTED
11444: ea000004 b 1145c <rtems_rfs_trace_shell_command+0x184> <== NOT EXECUTED
else
clear_value = RTEMS_RFS_TRACE_ALL;
}
else
{
for (t = 0; t < (sizeof (table) / sizeof (const char*)); t++)
11448: e2855001 add r5, r5, #1 <== NOT EXECUTED
1144c: e3550027 cmp r5, #39 ; 0x27 <== NOT EXECUTED
11450: 1affffea bne 11400 <rtems_rfs_trace_shell_command+0x128> <== NOT EXECUTED
11454: ea000000 b 1145c <rtems_rfs_trace_shell_command+0x184> <== NOT EXECUTED
else if (strcmp (argv[arg], "all") == 0)
{
if (set)
set_value = RTEMS_RFS_TRACE_ALL;
else
clear_value = RTEMS_RFS_TRACE_ALL;
11458: e88d0003 stm sp, {r0, r1} <== NOT EXECUTED
break;
}
}
}
rtems_rfs_trace_flags |= set_value;
1145c: e898000c ldm r8, {r2, r3} <== NOT EXECUTED
11460: e28d1008 add r1, sp, #8 <== NOT EXECUTED
11464: e8910003 ldm r1, {r0, r1} <== NOT EXECUTED
11468: e1822000 orr r2, r2, r0 <== NOT EXECUTED
1146c: e1833001 orr r3, r3, r1 <== NOT EXECUTED
rtems_rfs_trace_flags &= ~clear_value;
11470: e89d0003 ldm sp, {r0, r1} <== NOT EXECUTED
11474: e1c22000 bic r2, r2, r0 <== NOT EXECUTED
11478: e1c33001 bic r3, r3, r1 <== NOT EXECUTED
1147c: e888000c stm r8, {r2, r3} <== NOT EXECUTED
rtems_rfs_trace_mask clear_value = 0;
bool set = true;
int arg;
int t;
for (arg = 1; arg < argc; arg++)
11480: e2877001 add r7, r7, #1 <== NOT EXECUTED
11484: e157000b cmp r7, fp <== NOT EXECUTED
11488: baffffa5 blt 11324 <rtems_rfs_trace_shell_command+0x4c> <== NOT EXECUTED
rtems_rfs_trace_flags |= set_value;
rtems_rfs_trace_flags &= ~clear_value;
}
}
return 0;
1148c: e3a00000 mov r0, #0 <== NOT EXECUTED
}
11490: e28dd0ac add sp, sp, #172 ; 0xac <== NOT EXECUTED
11494: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
0001b5c0 <rtems_rfs_unlink>:
rtems_rfs_unlink (rtems_rfs_file_system* fs,
rtems_rfs_ino parent,
rtems_rfs_ino target,
uint32_t doff,
rtems_rfs_unlink_dir dir_mode)
{
1b5c0: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
1b5c4: e1a04000 mov r4, r0
1b5c8: e24dd050 sub sp, sp, #80 ; 0x50
1b5cc: e1a07001 mov r7, r1
rtems_rfs_inode_handle target_inode;
uint16_t links;
bool dir;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b5d0: e3a00402 mov r0, #33554432 ; 0x2000000
1b5d4: e3a01000 mov r1, #0
rtems_rfs_unlink (rtems_rfs_file_system* fs,
rtems_rfs_ino parent,
rtems_rfs_ino target,
uint32_t doff,
rtems_rfs_unlink_dir dir_mode)
{
1b5d8: e1a05002 mov r5, r2
1b5dc: e1a09003 mov r9, r3
1b5e0: e59d8070 ldr r8, [sp, #112] ; 0x70
rtems_rfs_inode_handle target_inode;
uint16_t links;
bool dir;
int rc;
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b5e4: ebffd720 bl 1126c <rtems_rfs_trace>
1b5e8: e3500000 cmp r0, #0
printf ("rtems-rfs: unlink: parent(%" PRIu32 ") -X-> (%" PRIu32 ")\n", parent, target);
1b5ec: 159f0314 ldrne r0, [pc, #788] ; 1b908 <rtems_rfs_unlink+0x348>
1b5f0: 11a01007 movne r1, r7
1b5f4: 11a02005 movne r2, r5
1b5f8: 1b000d0b blne 1ea2c <printf>
rc = rtems_rfs_inode_open (fs, target, &target_inode, true);
1b5fc: e1a00004 mov r0, r4
1b600: e1a01005 mov r1, r5
1b604: e28d2028 add r2, sp, #40 ; 0x28
1b608: e3a03001 mov r3, #1
1b60c: ebffd108 bl fa34 <rtems_rfs_inode_open>
if (rc)
1b610: e250a000 subs sl, r0, #0
1b614: 1a0000b8 bne 1b8fc <rtems_rfs_unlink+0x33c>
* @return uint16_t The mode.
*/
static inline uint16_t
rtems_rfs_inode_get_mode (rtems_rfs_inode_handle* handle)
{
return rtems_rfs_read_u16 (&handle->node->mode);
1b618: e59d3034 ldr r3, [sp, #52] ; 0x34
1b61c: e5d36002 ldrb r6, [r3, #2]
/*
* If a directory process the unlink mode.
*/
dir = RTEMS_RFS_S_ISDIR (rtems_rfs_inode_get_mode (&target_inode));
1b620: e1a06406 lsl r6, r6, #8
1b624: e2066a0f and r6, r6, #61440 ; 0xf000
1b628: e2463901 sub r3, r6, #16384 ; 0x4000
1b62c: e2736000 rsbs r6, r3, #0
1b630: e0a66003 adc r6, r6, r3
if (dir)
1b634: e3560000 cmp r6, #0
1b638: 0a00001e beq 1b6b8 <rtems_rfs_unlink+0xf8>
{
switch (dir_mode)
1b63c: e3580000 cmp r8, #0
1b640: 0a000002 beq 1b650 <rtems_rfs_unlink+0x90>
1b644: e3580001 cmp r8, #1
1b648: 1a00001a bne 1b6b8 <rtems_rfs_unlink+0xf8>
1b64c: ea00000a b 1b67c <rtems_rfs_unlink+0xbc>
{
case rtems_rfs_unlink_dir_denied:
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b650: e3a00402 mov r0, #33554432 ; 0x2000000 <== NOT EXECUTED
1b654: e3a01000 mov r1, #0 <== NOT EXECUTED
1b658: ebffd703 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b65c: e3500000 cmp r0, #0 <== NOT EXECUTED
printf ("rtems-rfs: link is a directory\n");
1b660: 159f02a4 ldrne r0, [pc, #676] ; 1b90c <rtems_rfs_unlink+0x34c><== NOT EXECUTED
1b664: 1b000d88 blne 1ec8c <puts> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &target_inode);
1b668: e1a00004 mov r0, r4 <== NOT EXECUTED
1b66c: e28d1028 add r1, sp, #40 ; 0x28 <== NOT EXECUTED
1b670: ebffd164 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
return EISDIR;
1b674: e3a0a015 mov sl, #21 <== NOT EXECUTED
1b678: ea00009f b 1b8fc <rtems_rfs_unlink+0x33c> <== NOT EXECUTED
case rtems_rfs_unlink_dir_if_empty:
rc = rtems_rfs_dir_empty (fs, &target_inode);
1b67c: e1a00004 mov r0, r4
1b680: e28d1028 add r1, sp, #40 ; 0x28
1b684: ebfff998 bl 19cec <rtems_rfs_dir_empty>
if (rc > 0)
1b688: e250a000 subs sl, r0, #0
1b68c: da000009 ble 1b6b8 <rtems_rfs_unlink+0xf8>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b690: e3a00402 mov r0, #33554432 ; 0x2000000
1b694: e3a01000 mov r1, #0
1b698: ebffd6f3 bl 1126c <rtems_rfs_trace>
1b69c: e3500000 cmp r0, #0
1b6a0: 0a000081 beq 1b8ac <rtems_rfs_unlink+0x2ec>
printf ("rtems-rfs: dir-empty: %d: %s\n", rc, strerror (rc));
1b6a4: e1a0000a mov r0, sl <== NOT EXECUTED
1b6a8: eb00118d bl 1fce4 <strerror> <== NOT EXECUTED
1b6ac: e1a02000 mov r2, r0 <== NOT EXECUTED
1b6b0: e59f0258 ldr r0, [pc, #600] ; 1b910 <rtems_rfs_unlink+0x350><== NOT EXECUTED
1b6b4: ea00007a b 1b8a4 <rtems_rfs_unlink+0x2e4> <== NOT EXECUTED
default:
break;
}
}
rc = rtems_rfs_inode_open (fs, parent, &parent_inode, true);
1b6b8: e1a00004 mov r0, r4
1b6bc: e1a01007 mov r1, r7
1b6c0: e1a0200d mov r2, sp
1b6c4: e3a03001 mov r3, #1
1b6c8: ebffd0d9 bl fa34 <rtems_rfs_inode_open>
if (rc)
1b6cc: e250a000 subs sl, r0, #0
1b6d0: 0a000009 beq 1b6fc <rtems_rfs_unlink+0x13c>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b6d4: e3a00402 mov r0, #33554432 ; 0x2000000 <== NOT EXECUTED
1b6d8: e3a01000 mov r1, #0 <== NOT EXECUTED
1b6dc: ebffd6e2 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b6e0: e3500000 cmp r0, #0 <== NOT EXECUTED
1b6e4: 0a000070 beq 1b8ac <rtems_rfs_unlink+0x2ec> <== NOT EXECUTED
printf ("rtems-rfs: link: inode-open failed: %d: %s\n",
1b6e8: e1a0000a mov r0, sl <== NOT EXECUTED
1b6ec: eb00117c bl 1fce4 <strerror> <== NOT EXECUTED
1b6f0: e1a02000 mov r2, r0 <== NOT EXECUTED
1b6f4: e59f0218 ldr r0, [pc, #536] ; 1b914 <rtems_rfs_unlink+0x354><== NOT EXECUTED
1b6f8: ea000069 b 1b8a4 <rtems_rfs_unlink+0x2e4> <== NOT EXECUTED
rc, strerror (rc));
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
rc = rtems_rfs_dir_del_entry (fs, &parent_inode, target, doff);
1b6fc: e1a00004 mov r0, r4
1b700: e1a0100d mov r1, sp
1b704: e1a02005 mov r2, r5
1b708: e1a03009 mov r3, r9
1b70c: ebfff7b8 bl 195f4 <rtems_rfs_dir_del_entry>
if (rc > 0)
1b710: e250a000 subs sl, r0, #0
1b714: da000009 ble 1b740 <rtems_rfs_unlink+0x180>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b718: e3a00402 mov r0, #33554432 ; 0x2000000 <== NOT EXECUTED
1b71c: e3a01000 mov r1, #0 <== NOT EXECUTED
1b720: ebffd6d1 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b724: e3500000 cmp r0, #0 <== NOT EXECUTED
1b728: 0a00004b beq 1b85c <rtems_rfs_unlink+0x29c> <== NOT EXECUTED
printf ("rtems-rfs: unlink: dir-del failed: %d: %s\n",
1b72c: e1a0000a mov r0, sl <== NOT EXECUTED
1b730: eb00116b bl 1fce4 <strerror> <== NOT EXECUTED
1b734: e1a02000 mov r2, r0 <== NOT EXECUTED
1b738: e59f01d8 ldr r0, [pc, #472] ; 1b918 <rtems_rfs_unlink+0x358><== NOT EXECUTED
1b73c: ea000044 b 1b854 <rtems_rfs_unlink+0x294> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &parent_inode);
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
links = rtems_rfs_inode_get_links (&target_inode);
1b740: e28d0028 add r0, sp, #40 ; 0x28
1b744: ebffff32 bl 1b414 <rtems_rfs_inode_get_links>
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b748: e3a01000 mov r1, #0
rtems_rfs_inode_close (fs, &parent_inode);
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
links = rtems_rfs_inode_get_links (&target_inode);
1b74c: e1a07000 mov r7, r0
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b750: e3a00402 mov r0, #33554432 ; 0x2000000
1b754: ebffd6c4 bl 1126c <rtems_rfs_trace>
1b758: e3500000 cmp r0, #0
printf ("rtems-rfs: unlink: target:%" PRIu32 " links:%u\n", target, links);
1b75c: 159f01b8 ldrne r0, [pc, #440] ; 1b91c <rtems_rfs_unlink+0x35c>
1b760: 11a01005 movne r1, r5
1b764: 11a02007 movne r2, r7
1b768: 1b000caf blne 1ea2c <printf>
if (links > 1)
1b76c: e3570001 cmp r7, #1
1b770: 9a00000a bls 1b7a0 <rtems_rfs_unlink+0x1e0>
{
links--;
1b774: e2477001 sub r7, r7, #1
* @prarm links The links.
*/
static inline void
rtems_rfs_inode_set_links (rtems_rfs_inode_handle* handle, uint16_t links)
{
rtems_rfs_write_u16 (&handle->node->links, links);
1b778: e59d3034 ldr r3, [sp, #52] ; 0x34
1b77c: e1a07807 lsl r7, r7, #16
1b780: e1a02827 lsr r2, r7, #16
1b784: e1a07c27 lsr r7, r7, #24
1b788: e5c37000 strb r7, [r3]
1b78c: e59d3034 ldr r3, [sp, #52] ; 0x34
1b790: e5c32001 strb r2, [r3, #1]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
1b794: e3a03001 mov r3, #1
1b798: e5cd3038 strb r3, [sp, #56] ; 0x38
1b79c: ea00001d b 1b818 <rtems_rfs_unlink+0x258>
else
{
/*
* Erasing the inode releases all blocks attached to it.
*/
rc = rtems_rfs_inode_delete (fs, &target_inode);
1b7a0: e1a00004 mov r0, r4
1b7a4: e28d1028 add r1, sp, #40 ; 0x28
1b7a8: ebffd136 bl fc88 <rtems_rfs_inode_delete>
if (rc > 0)
1b7ac: e250a000 subs sl, r0, #0
1b7b0: da000009 ble 1b7dc <rtems_rfs_unlink+0x21c>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b7b4: e3a00402 mov r0, #33554432 ; 0x2000000 <== NOT EXECUTED
1b7b8: e3a01000 mov r1, #0 <== NOT EXECUTED
1b7bc: ebffd6aa bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b7c0: e3500000 cmp r0, #0 <== NOT EXECUTED
1b7c4: 0a000024 beq 1b85c <rtems_rfs_unlink+0x29c> <== NOT EXECUTED
printf ("rtems-rfs: unlink: inode-del failed: %d: %s\n",
1b7c8: e1a0000a mov r0, sl <== NOT EXECUTED
1b7cc: eb001144 bl 1fce4 <strerror> <== NOT EXECUTED
1b7d0: e1a02000 mov r2, r0 <== NOT EXECUTED
1b7d4: e59f0144 ldr r0, [pc, #324] ; 1b920 <rtems_rfs_unlink+0x360><== NOT EXECUTED
1b7d8: ea00001d b 1b854 <rtems_rfs_unlink+0x294> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &parent_inode);
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
if (dir)
1b7dc: e3560000 cmp r6, #0
1b7e0: 0a00000c beq 1b818 <rtems_rfs_unlink+0x258>
{
links = rtems_rfs_inode_get_links (&parent_inode);
1b7e4: e1a0000d mov r0, sp
1b7e8: ebffff09 bl 1b414 <rtems_rfs_inode_get_links>
if (links > 1)
1b7ec: e3500001 cmp r0, #1
links--;
1b7f0: 82400001 subhi r0, r0, #1
1b7f4: 81a00800 lslhi r0, r0, #16
* @prarm links The links.
*/
static inline void
rtems_rfs_inode_set_links (rtems_rfs_inode_handle* handle, uint16_t links)
{
rtems_rfs_write_u16 (&handle->node->links, links);
1b7f8: e59d300c ldr r3, [sp, #12]
1b7fc: 81a00820 lsrhi r0, r0, #16
1b800: e1a02420 lsr r2, r0, #8
1b804: e5c32000 strb r2, [r3]
1b808: e59d300c ldr r3, [sp, #12]
1b80c: e5c30001 strb r0, [r3, #1]
rtems_rfs_buffer_mark_dirty (&handle->buffer);
1b810: e3a03001 mov r3, #1
1b814: e5cd3010 strb r3, [sp, #16]
rtems_rfs_inode_set_links (&parent_inode, links);
}
}
rc = rtems_rfs_inode_time_stamp_now (&parent_inode, true, true);
1b818: e3a01001 mov r1, #1
1b81c: e1a0000d mov r0, sp
1b820: e1a02001 mov r2, r1
1b824: ebffd14d bl fd60 <rtems_rfs_inode_time_stamp_now>
if (rc > 0)
1b828: e250a000 subs sl, r0, #0
1b82c: da00000e ble 1b86c <rtems_rfs_unlink+0x2ac>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b830: e3a00402 mov r0, #33554432 ; 0x2000000 <== NOT EXECUTED
1b834: e3a01000 mov r1, #0 <== NOT EXECUTED
1b838: ebffd68b bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b83c: e3500000 cmp r0, #0 <== NOT EXECUTED
1b840: 0a000005 beq 1b85c <rtems_rfs_unlink+0x29c> <== NOT EXECUTED
printf ("rtems-rfs: link: inode-time-stamp failed: %d: %s\n",
1b844: e1a0000a mov r0, sl <== NOT EXECUTED
1b848: eb001125 bl 1fce4 <strerror> <== NOT EXECUTED
1b84c: e1a02000 mov r2, r0 <== NOT EXECUTED
1b850: e59f00cc ldr r0, [pc, #204] ; 1b924 <rtems_rfs_unlink+0x364><== NOT EXECUTED
1b854: e1a0100a mov r1, sl <== NOT EXECUTED
1b858: eb000c73 bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
rtems_rfs_inode_close (fs, &parent_inode);
1b85c: e1a00004 mov r0, r4 <== NOT EXECUTED
1b860: e1a0100d mov r1, sp <== NOT EXECUTED
1b864: ebffd0e7 bl fc08 <rtems_rfs_inode_close> <== NOT EXECUTED
1b868: ea00000f b 1b8ac <rtems_rfs_unlink+0x2ec> <== NOT EXECUTED
rtems_rfs_inode_close (fs, &target_inode);
return rc;
}
rc = rtems_rfs_inode_close (fs, &parent_inode);
1b86c: e1a00004 mov r0, r4
1b870: e1a0100d mov r1, sp
1b874: ebffd0e3 bl fc08 <rtems_rfs_inode_close>
if (rc > 0)
1b878: e250a000 subs sl, r0, #0
1b87c: da00000e ble 1b8bc <rtems_rfs_unlink+0x2fc>
{
if (rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b880: e3a00402 mov r0, #33554432 ; 0x2000000 <== NOT EXECUTED
1b884: e3a01000 mov r1, #0 <== NOT EXECUTED
1b888: ebffd677 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b88c: e3500000 cmp r0, #0 <== NOT EXECUTED
1b890: 0a000005 beq 1b8ac <rtems_rfs_unlink+0x2ec> <== NOT EXECUTED
printf ("rtems-rfs: link: parent inode-close failed: %d: %s\n",
1b894: e1a0000a mov r0, sl <== NOT EXECUTED
1b898: eb001111 bl 1fce4 <strerror> <== NOT EXECUTED
1b89c: e1a02000 mov r2, r0 <== NOT EXECUTED
1b8a0: e59f0080 ldr r0, [pc, #128] ; 1b928 <rtems_rfs_unlink+0x368><== NOT EXECUTED
1b8a4: e1a0100a mov r1, sl <== NOT EXECUTED
1b8a8: eb000c5f bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
rtems_rfs_inode_close (fs, &target_inode);
1b8ac: e1a00004 mov r0, r4
1b8b0: e28d1028 add r1, sp, #40 ; 0x28
1b8b4: ebffd0d3 bl fc08 <rtems_rfs_inode_close>
return rc;
1b8b8: ea00000f b 1b8fc <rtems_rfs_unlink+0x33c>
}
rc = rtems_rfs_inode_close (fs, &target_inode);
1b8bc: e1a00004 mov r0, r4
1b8c0: e28d1028 add r1, sp, #40 ; 0x28
1b8c4: ebffd0cf bl fc08 <rtems_rfs_inode_close>
if ((rc > 0) && rtems_rfs_trace (RTEMS_RFS_TRACE_UNLINK))
1b8c8: e250a000 subs sl, r0, #0
1b8cc: da00000a ble 1b8fc <rtems_rfs_unlink+0x33c>
1b8d0: e3a00402 mov r0, #33554432 ; 0x2000000 <== NOT EXECUTED
1b8d4: e3a01000 mov r1, #0 <== NOT EXECUTED
1b8d8: ebffd663 bl 1126c <rtems_rfs_trace> <== NOT EXECUTED
1b8dc: e3500000 cmp r0, #0 <== NOT EXECUTED
1b8e0: 0a000005 beq 1b8fc <rtems_rfs_unlink+0x33c> <== NOT EXECUTED
printf ("rtems-rfs: link: target inode-close failed: %d: %s\n",
1b8e4: e1a0000a mov r0, sl <== NOT EXECUTED
1b8e8: eb0010fd bl 1fce4 <strerror> <== NOT EXECUTED
1b8ec: e1a0100a mov r1, sl <== NOT EXECUTED
1b8f0: e1a02000 mov r2, r0 <== NOT EXECUTED
1b8f4: e59f0030 ldr r0, [pc, #48] ; 1b92c <rtems_rfs_unlink+0x36c><== NOT EXECUTED
1b8f8: eb000c4b bl 1ea2c <printf> <== NOT EXECUTED
rc, strerror (rc));
return rc;
}
1b8fc: e1a0000a mov r0, sl
1b900: e28dd050 add sp, sp, #80 ; 0x50
1b904: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
0001d8b0 <rtems_shell_rfs_format>:
int
rtems_shell_rfs_format (int argc, char* argv[])
{
1d8b0: e92d41f0 push {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
1d8b4: e24dd018 sub sp, sp, #24 <== NOT EXECUTED
1d8b8: e1a07000 mov r7, r0 <== NOT EXECUTED
1d8bc: e1a06001 mov r6, r1 <== NOT EXECUTED
rtems_rfs_format_config config;
const char* driver = NULL;
int arg;
memset (&config, 0, sizeof (rtems_rfs_format_config));
1d8c0: e1a0000d mov r0, sp <== NOT EXECUTED
1d8c4: e3a01000 mov r1, #0 <== NOT EXECUTED
1d8c8: e3a02018 mov r2, #24 <== NOT EXECUTED
for (arg = 1; arg < argc; arg++)
1d8cc: e3a04001 mov r4, #1 <== NOT EXECUTED
{
rtems_rfs_format_config config;
const char* driver = NULL;
int arg;
memset (&config, 0, sizeof (rtems_rfs_format_config));
1d8d0: eb005d42 bl 34de0 <memset> <== NOT EXECUTED
int
rtems_shell_rfs_format (int argc, char* argv[])
{
rtems_rfs_format_config config;
const char* driver = NULL;
1d8d4: e3a05000 mov r5, #0 <== NOT EXECUTED
if (argv[arg][0] == '-')
{
switch (argv[arg][1])
{
case 'v':
config.verbose = true;
1d8d8: e1a08004 mov r8, r4 <== NOT EXECUTED
const char* driver = NULL;
int arg;
memset (&config, 0, sizeof (rtems_rfs_format_config));
for (arg = 1; arg < argc; arg++)
1d8dc: ea000048 b 1da04 <rtems_shell_rfs_format+0x154> <== NOT EXECUTED
{
if (argv[arg][0] == '-')
1d8e0: e7961104 ldr r1, [r6, r4, lsl #2] <== NOT EXECUTED
1d8e4: e5d13000 ldrb r3, [r1] <== NOT EXECUTED
1d8e8: e353002d cmp r3, #45 ; 0x2d <== NOT EXECUTED
1d8ec: 1a00003d bne 1d9e8 <rtems_shell_rfs_format+0x138> <== NOT EXECUTED
{
switch (argv[arg][1])
1d8f0: e5d13001 ldrb r3, [r1, #1] <== NOT EXECUTED
1d8f4: e3530069 cmp r3, #105 ; 0x69 <== NOT EXECUTED
1d8f8: 0a000022 beq 1d988 <rtems_shell_rfs_format+0xd8> <== NOT EXECUTED
1d8fc: 8a000004 bhi 1d914 <rtems_shell_rfs_format+0x64> <== NOT EXECUTED
1d900: e3530049 cmp r3, #73 ; 0x49 <== NOT EXECUTED
1d904: 0a000029 beq 1d9b0 <rtems_shell_rfs_format+0x100> <== NOT EXECUTED
1d908: e3530062 cmp r3, #98 ; 0x62 <== NOT EXECUTED
1d90c: 1a000033 bne 1d9e0 <rtems_shell_rfs_format+0x130> <== NOT EXECUTED
1d910: ea000012 b 1d960 <rtems_shell_rfs_format+0xb0> <== NOT EXECUTED
1d914: e3530073 cmp r3, #115 ; 0x73 <== NOT EXECUTED
1d918: 0a000006 beq 1d938 <rtems_shell_rfs_format+0x88> <== NOT EXECUTED
1d91c: e3530076 cmp r3, #118 ; 0x76 <== NOT EXECUTED
1d920: 0a000002 beq 1d930 <rtems_shell_rfs_format+0x80> <== NOT EXECUTED
1d924: e353006f cmp r3, #111 ; 0x6f <== NOT EXECUTED
1d928: 1a00002c bne 1d9e0 <rtems_shell_rfs_format+0x130> <== NOT EXECUTED
1d92c: ea000021 b 1d9b8 <rtems_shell_rfs_format+0x108> <== NOT EXECUTED
{
case 'v':
config.verbose = true;
1d930: e5cd8015 strb r8, [sp, #21] <== NOT EXECUTED
break;
1d934: ea000031 b 1da00 <rtems_shell_rfs_format+0x150> <== NOT EXECUTED
case 's':
arg++;
1d938: e2844001 add r4, r4, #1 <== NOT EXECUTED
if (arg >= argc)
1d93c: e1540007 cmp r4, r7 <== NOT EXECUTED
{
printf ("error: block size needs an argument\n");
1d940: a59f0118 ldrge r0, [pc, #280] ; 1da60 <rtems_shell_rfs_format+0x1b0><== NOT EXECUTED
1d944: aa000033 bge 1da18 <rtems_shell_rfs_format+0x168> <== NOT EXECUTED
return 1;
}
config.block_size = strtoul (argv[arg], 0, 0);
1d948: e3a01000 mov r1, #0 <== NOT EXECUTED
1d94c: e7960104 ldr r0, [r6, r4, lsl #2] <== NOT EXECUTED
1d950: e1a02001 mov r2, r1 <== NOT EXECUTED
1d954: eb00715d bl 39ed0 <strtoul> <== NOT EXECUTED
1d958: e58d0000 str r0, [sp] <== NOT EXECUTED
break;
1d95c: ea000027 b 1da00 <rtems_shell_rfs_format+0x150> <== NOT EXECUTED
case 'b':
arg++;
1d960: e2844001 add r4, r4, #1 <== NOT EXECUTED
if (arg >= argc)
1d964: e1540007 cmp r4, r7 <== NOT EXECUTED
{
printf ("error: group block count needs an argument\n");
1d968: a59f00f4 ldrge r0, [pc, #244] ; 1da64 <rtems_shell_rfs_format+0x1b4><== NOT EXECUTED
1d96c: aa000029 bge 1da18 <rtems_shell_rfs_format+0x168> <== NOT EXECUTED
return 1;
}
config.group_blocks = strtoul (argv[arg], 0, 0);
1d970: e3a01000 mov r1, #0 <== NOT EXECUTED
1d974: e7960104 ldr r0, [r6, r4, lsl #2] <== NOT EXECUTED
1d978: e1a02001 mov r2, r1 <== NOT EXECUTED
1d97c: eb007153 bl 39ed0 <strtoul> <== NOT EXECUTED
1d980: e58d0004 str r0, [sp, #4] <== NOT EXECUTED
break;
1d984: ea00001d b 1da00 <rtems_shell_rfs_format+0x150> <== NOT EXECUTED
case 'i':
arg++;
1d988: e2844001 add r4, r4, #1 <== NOT EXECUTED
if (arg >= argc)
1d98c: e1540007 cmp r4, r7 <== NOT EXECUTED
{
printf ("error: group inode count needs an argument\n");
1d990: a59f00d0 ldrge r0, [pc, #208] ; 1da68 <rtems_shell_rfs_format+0x1b8><== NOT EXECUTED
1d994: aa00001f bge 1da18 <rtems_shell_rfs_format+0x168> <== NOT EXECUTED
return 1;
}
config.group_inodes = strtoul (argv[arg], 0, 0);
1d998: e3a01000 mov r1, #0 <== NOT EXECUTED
1d99c: e7960104 ldr r0, [r6, r4, lsl #2] <== NOT EXECUTED
1d9a0: e1a02001 mov r2, r1 <== NOT EXECUTED
1d9a4: eb007149 bl 39ed0 <strtoul> <== NOT EXECUTED
1d9a8: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
break;
1d9ac: ea000013 b 1da00 <rtems_shell_rfs_format+0x150> <== NOT EXECUTED
case 'I':
config.initialise_inodes = true;
1d9b0: e5cd8014 strb r8, [sp, #20] <== NOT EXECUTED
break;
1d9b4: ea000011 b 1da00 <rtems_shell_rfs_format+0x150> <== NOT EXECUTED
case 'o':
arg++;
1d9b8: e2844001 add r4, r4, #1 <== NOT EXECUTED
if (arg >= argc)
1d9bc: e1540007 cmp r4, r7 <== NOT EXECUTED
{
printf ("error: inode percentage overhead needs an argument\n");
1d9c0: a59f00a4 ldrge r0, [pc, #164] ; 1da6c <rtems_shell_rfs_format+0x1bc><== NOT EXECUTED
1d9c4: aa000013 bge 1da18 <rtems_shell_rfs_format+0x168> <== NOT EXECUTED
return 1;
}
config.inode_overhead = strtoul (argv[arg], 0, 0);
1d9c8: e3a01000 mov r1, #0 <== NOT EXECUTED
1d9cc: e7960104 ldr r0, [r6, r4, lsl #2] <== NOT EXECUTED
1d9d0: e1a02001 mov r2, r1 <== NOT EXECUTED
1d9d4: eb00713d bl 39ed0 <strtoul> <== NOT EXECUTED
1d9d8: e58d000c str r0, [sp, #12] <== NOT EXECUTED
break;
1d9dc: ea000007 b 1da00 <rtems_shell_rfs_format+0x150> <== NOT EXECUTED
default:
printf ("error: invalid option: %s\n", argv[arg]);
1d9e0: e59f0088 ldr r0, [pc, #136] ; 1da70 <rtems_shell_rfs_format+0x1c0><== NOT EXECUTED
1d9e4: ea000002 b 1d9f4 <rtems_shell_rfs_format+0x144> <== NOT EXECUTED
return 1;
}
}
else
{
if (!driver)
1d9e8: e3550000 cmp r5, #0 <== NOT EXECUTED
1d9ec: 0a000002 beq 1d9fc <rtems_shell_rfs_format+0x14c> <== NOT EXECUTED
driver = argv[arg];
else
{
printf ("error: only one driver name allowed: %s\n", argv[arg]);
1d9f0: e59f007c ldr r0, [pc, #124] ; 1da74 <rtems_shell_rfs_format+0x1c4><== NOT EXECUTED
1d9f4: eb006167 bl 35f98 <printf> <== NOT EXECUTED
1d9f8: ea000015 b 1da54 <rtems_shell_rfs_format+0x1a4> <== NOT EXECUTED
return 1;
}
}
else
{
if (!driver)
1d9fc: e1a05001 mov r5, r1 <== NOT EXECUTED
const char* driver = NULL;
int arg;
memset (&config, 0, sizeof (rtems_rfs_format_config));
for (arg = 1; arg < argc; arg++)
1da00: e2844001 add r4, r4, #1 <== NOT EXECUTED
1da04: e1540007 cmp r4, r7 <== NOT EXECUTED
1da08: baffffb4 blt 1d8e0 <rtems_shell_rfs_format+0x30> <== NOT EXECUTED
return 1;
}
}
}
if (!driver) {
1da0c: e3550000 cmp r5, #0 <== NOT EXECUTED
1da10: 1a000002 bne 1da20 <rtems_shell_rfs_format+0x170> <== NOT EXECUTED
printf ("error: no driver name provided\n");
1da14: e59f005c ldr r0, [pc, #92] ; 1da78 <rtems_shell_rfs_format+0x1c8><== NOT EXECUTED
1da18: eb0061f6 bl 361f8 <puts> <== NOT EXECUTED
1da1c: ea00000c b 1da54 <rtems_shell_rfs_format+0x1a4> <== NOT EXECUTED
return 1;
}
if (rtems_rfs_format (driver, &config) < 0)
1da20: e1a00005 mov r0, r5 <== NOT EXECUTED
1da24: e1a0100d mov r1, sp <== NOT EXECUTED
1da28: eb003001 bl 29a34 <rtems_rfs_format> <== NOT EXECUTED
1da2c: e3500000 cmp r0, #0 <== NOT EXECUTED
printf ("error: format of %s failed: %s\n",
driver, strerror (errno));
return 1;
}
return 0;
1da30: a3a00000 movge r0, #0 <== NOT EXECUTED
if (!driver) {
printf ("error: no driver name provided\n");
return 1;
}
if (rtems_rfs_format (driver, &config) < 0)
1da34: aa000007 bge 1da58 <rtems_shell_rfs_format+0x1a8> <== NOT EXECUTED
{
printf ("error: format of %s failed: %s\n",
driver, strerror (errno));
1da38: eb004fa3 bl 318cc <__errno> <== NOT EXECUTED
return 1;
}
if (rtems_rfs_format (driver, &config) < 0)
{
printf ("error: format of %s failed: %s\n",
1da3c: e5900000 ldr r0, [r0] <== NOT EXECUTED
1da40: eb006af2 bl 38610 <strerror> <== NOT EXECUTED
1da44: e1a01005 mov r1, r5 <== NOT EXECUTED
1da48: e1a02000 mov r2, r0 <== NOT EXECUTED
1da4c: e59f0028 ldr r0, [pc, #40] ; 1da7c <rtems_shell_rfs_format+0x1cc><== NOT EXECUTED
1da50: eb006150 bl 35f98 <printf> <== NOT EXECUTED
driver, strerror (errno));
return 1;
1da54: e3a00001 mov r0, #1 <== NOT EXECUTED
}
return 0;
}
1da58: e28dd018 add sp, sp, #24 <== NOT EXECUTED
1da5c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
0000d070 <rtems_sparse_disk_register>:
uint32_t media_block_size,
rtems_blkdev_bnum blocks_with_buffer,
rtems_blkdev_bnum media_block_count,
uint8_t fill_pattern,
rtems_sparse_disk_delete_handler sparse_disk_delete )
{
d070: e92d4ff3 push {r0, r1, r4, r5, r6, r7, r8, r9, sl, fp, lr}
d074: e59d902c ldr r9, [sp, #44] ; 0x2c
rtems_status_code sc;
if ( blocks_with_buffer <= media_block_count ) {
d078: e1530009 cmp r3, r9
uint32_t media_block_size,
rtems_blkdev_bnum blocks_with_buffer,
rtems_blkdev_bnum media_block_count,
uint8_t fill_pattern,
rtems_sparse_disk_delete_handler sparse_disk_delete )
{
d07c: e1a0c000 mov ip, r0
d080: e1a04001 mov r4, r1
d084: e1a06002 mov r6, r2
d088: e1a05003 mov r5, r3
d08c: e59db034 ldr fp, [sp, #52] ; 0x34
d090: e5dd8030 ldrb r8, [sp, #48] ; 0x30
sparse_disk_ioctl,
sparse_disk
);
}
} else {
sc = RTEMS_INVALID_NUMBER;
d094: 83a0000a movhi r0, #10
uint8_t fill_pattern,
rtems_sparse_disk_delete_handler sparse_disk_delete )
{
rtems_status_code sc;
if ( blocks_with_buffer <= media_block_count ) {
d098: 8a00002d bhi d154 <rtems_sparse_disk_register+0xe4>
const uint8_t fill_pattern )
{
rtems_status_code sc;
rtems_blkdev_bnum i;
if ( NULL == sd )
d09c: e3510000 cmp r1, #0
d0a0: 0a00002a beq d150 <rtems_sparse_disk_register+0xe0>
return RTEMS_INVALID_ADDRESS;
uint8_t *data = (uint8_t *) sd;
size_t const key_table_size = blocks_with_buffer
d0a4: e1a07183 lsl r7, r3, #3
* sizeof( rtems_sparse_disk_key );
size_t const data_size = blocks_with_buffer * media_block_size;
memset( data, 0, sizeof( rtems_sparse_disk ) + key_table_size );
d0a8: e287a01c add sl, r7, #28
d0ac: e1a00001 mov r0, r1
d0b0: e1a0200a mov r2, sl
d0b4: e3a01000 mov r1, #0
d0b8: e58dc004 str ip, [sp, #4]
d0bc: eb0030c6 bl 193dc <memset>
sd->fill_pattern = fill_pattern;
memset( (uint8_t *) ( data + sizeof( rtems_sparse_disk ) + key_table_size ),
d0c0: e1a01008 mov r1, r8
d0c4: e0020596 mul r2, r6, r5
* sizeof( rtems_sparse_disk_key );
size_t const data_size = blocks_with_buffer * media_block_size;
memset( data, 0, sizeof( rtems_sparse_disk ) + key_table_size );
sd->fill_pattern = fill_pattern;
d0c8: e5c48014 strb r8, [r4, #20]
memset( (uint8_t *) ( data + sizeof( rtems_sparse_disk ) + key_table_size ),
d0cc: e084000a add r0, r4, sl
d0d0: eb0030c1 bl 193dc <memset>
sd->fill_pattern,
data_size );
sd->delete_handler = sparse_disk_delete;
d0d4: e584b010 str fp, [r4, #16]
sc = rtems_semaphore_create(
d0d8: e59f007c ldr r0, [pc, #124] ; d15c <rtems_sparse_disk_register+0xec>
d0dc: e3a01001 mov r1, #1
d0e0: e3a02054 mov r2, #84 ; 0x54
d0e4: e3a03000 mov r3, #0
d0e8: e58d4000 str r4, [sp]
d0ec: ebffeb54 bl 7e44 <rtems_semaphore_create>
RTEMS_PRIORITY | RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY,
0,
&sd->mutex
);
if ( sc != RTEMS_SUCCESSFUL ) {
d0f0: e3500000 cmp r0, #0
d0f4: e59dc004 ldr ip, [sp, #4]
d0f8: 1a000015 bne d154 <rtems_sparse_disk_register+0xe4>
return sc;
}
data += sizeof( rtems_sparse_disk );
d0fc: e284301c add r3, r4, #28
sd->blocks_with_buffer = blocks_with_buffer;
sd->key_table = (rtems_sparse_disk_key *) data;
d100: e5843018 str r3, [r4, #24]
data += key_table_size;
d104: e0837007 add r7, r3, r7
return sc;
}
data += sizeof( rtems_sparse_disk );
sd->blocks_with_buffer = blocks_with_buffer;
d108: e5845004 str r5, [r4, #4]
sd->key_table = (rtems_sparse_disk_key *) data;
data += key_table_size;
d10c: e1a03004 mov r3, r4
d110: ea000002 b d120 <rtems_sparse_disk_register+0xb0>
for ( i = 0; i < blocks_with_buffer; ++i, data += media_block_size ) {
sd->key_table[i].data = data;
d114: e5837018 str r7, [r3, #24]
sd->blocks_with_buffer = blocks_with_buffer;
sd->key_table = (rtems_sparse_disk_key *) data;
data += key_table_size;
for ( i = 0; i < blocks_with_buffer; ++i, data += media_block_size ) {
d118: e2800001 add r0, r0, #1
d11c: e0877006 add r7, r7, r6
d120: e1500005 cmp r0, r5
d124: e2833008 add r3, r3, #8
d128: 1afffff9 bne d114 <rtems_sparse_disk_register+0xa4>
sparse_disk_delete,
fill_pattern
);
if ( RTEMS_SUCCESSFUL == sc ) {
sc = rtems_blkdev_create(
d12c: e59f302c ldr r3, [pc, #44] ; d160 <rtems_sparse_disk_register+0xf0>
d130: e1a0000c mov r0, ip
d134: e1a01006 mov r1, r6
d138: e1a02009 mov r2, r9
for ( i = 0; i < blocks_with_buffer; ++i, data += media_block_size ) {
sd->key_table[i].data = data;
}
sd->media_block_size = media_block_size;
d13c: e584600c str r6, [r4, #12]
sparse_disk_delete,
fill_pattern
);
if ( RTEMS_SUCCESSFUL == sc ) {
sc = rtems_blkdev_create(
d140: e58d402c str r4, [sp, #44] ; 0x2c
} else {
sc = RTEMS_INVALID_NUMBER;
}
return sc;
}
d144: e28dd008 add sp, sp, #8
d148: e8bd4ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, lr}
sparse_disk_delete,
fill_pattern
);
if ( RTEMS_SUCCESSFUL == sc ) {
sc = rtems_blkdev_create(
d14c: ea0009ed b f908 <rtems_blkdev_create>
{
rtems_status_code sc;
rtems_blkdev_bnum i;
if ( NULL == sd )
return RTEMS_INVALID_ADDRESS;
d150: e3a00009 mov r0, #9 <== NOT EXECUTED
} else {
sc = RTEMS_INVALID_NUMBER;
}
return sc;
}
d154: e28dd008 add sp, sp, #8 <== NOT EXECUTED
d158: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
0001f174 <rtems_stack_checker_is_blown>:
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
{
1f174: e92d4810 push {r4, fp, lr}
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
1f178: e59f3078 ldr r3, [pc, #120] ; 1f1f8 <rtems_stack_checker_is_blown+0x84>
1f17c: e5933008 ldr r3, [r3, #8]
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
1f180: e59300b8 ldr r0, [r3, #184] ; 0xb8
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
{
1f184: e28db008 add fp, sp, #8
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
1f188: e15b0000 cmp fp, r0
return false;
1f18c: 33a04000 movcc r4, #0
)
{
#if defined(__GNUC__)
void *sp = __builtin_frame_address(0);
if ( sp < the_stack->area ) {
1f190: 3a000004 bcc 1f1a8 <rtems_stack_checker_is_blown+0x34>
return false;
}
if ( sp > (the_stack->area + the_stack->size) ) {
1f194: e59340b4 ldr r4, [r3, #180] ; 0xb4
1f198: e0804004 add r4, r0, r4
}
/*
* Check if blown
*/
bool rtems_stack_checker_is_blown( void )
1f19c: e15b0004 cmp fp, r4
1f1a0: 83a04000 movhi r4, #0
1f1a4: 93a04001 movls r4, #1
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
1f1a8: e59f304c ldr r3, [pc, #76] ; 1f1fc <rtems_stack_checker_is_blown+0x88>
1f1ac: e5933008 ldr r3, [r3, #8]
1f1b0: e3530000 cmp r3, #0
*/
bool rtems_stack_checker_is_blown( void )
{
Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack;
bool sp_ok;
bool pattern_ok = true;
1f1b4: 03a01001 moveq r1, #1
/*
* The stack checker must be initialized before the pattern is there
* to check.
*/
if ( Stack_check_Initialized ) {
1f1b8: 0a000005 beq 1f1d4 <rtems_stack_checker_is_blown+0x60>
pattern_ok = (!memcmp(
1f1bc: e59f103c ldr r1, [pc, #60] ; 1f200 <rtems_stack_checker_is_blown+0x8c>
1f1c0: e2800008 add r0, r0, #8
1f1c4: e3a02010 mov r2, #16
1f1c8: eb005654 bl 34b20 <memcmp>
1f1cc: e2701001 rsbs r1, r0, #1
1f1d0: 33a01000 movcc r1, #0
/*
* Let's report as much as we can.
*/
if ( !sp_ok || !pattern_ok ) {
1f1d4: e3540000 cmp r4, #0
1f1d8: 0a000001 beq 1f1e4 <rtems_stack_checker_is_blown+0x70>
1f1dc: e3510000 cmp r1, #0
1f1e0: 1a000002 bne 1f1f0 <rtems_stack_checker_is_blown+0x7c>
Stack_check_report_blown_task( _Thread_Executing, pattern_ok );
1f1e4: e59f300c ldr r3, [pc, #12] ; 1f1f8 <rtems_stack_checker_is_blown+0x84><== NOT EXECUTED
1f1e8: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
1f1ec: ebffff9c bl 1f064 <Stack_check_report_blown_task> <== NOT EXECUTED
/*
* The Stack Pointer and the Pattern Area are OK so return false.
*/
return false;
}
1f1f0: e3a00000 mov r0, #0
1f1f4: e8bd8810 pop {r4, fp, pc}
00004238 <rtems_termios_close>:
rtems_status_code
rtems_termios_close (void *arg)
{
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
4238: e5903000 ldr r3, [r0]
rtems_interrupt_enable (level);
}
rtems_status_code
rtems_termios_close (void *arg)
{
423c: e92d4030 push {r4, r5, lr}
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
4240: e593402c ldr r4, [r3, #44] ; 0x2c
rtems_status_code sc;
sc = rtems_semaphore_obtain(
4244: e59f3188 ldr r3, [pc, #392] ; 43d4 <rtems_termios_close+0x19c>
4248: e3a01000 mov r1, #0
rtems_interrupt_enable (level);
}
rtems_status_code
rtems_termios_close (void *arg)
{
424c: e1a05000 mov r5, r0
rtems_libio_open_close_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
rtems_status_code sc;
sc = rtems_semaphore_obtain(
4250: e1a02001 mov r2, r1
4254: e5930000 ldr r0, [r3]
4258: eb000751 bl 5fa4 <rtems_semaphore_obtain>
rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL)
425c: e3500000 cmp r0, #0
4260: 1a000026 bne 4300 <rtems_termios_close+0xc8>
rtems_fatal_error_occurred (sc);
if (--tty->refcount == 0) {
4264: e5943008 ldr r3, [r4, #8]
4268: e2433001 sub r3, r3, #1
426c: e3530000 cmp r3, #0
4270: e5843008 str r3, [r4, #8]
4274: 1a000051 bne 43c0 <rtems_termios_close+0x188>
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
4278: e59420cc ldr r2, [r4, #204] ; 0xcc
427c: e59f3154 ldr r3, [pc, #340] ; 43d8 <rtems_termios_close+0x1a0>
4280: e0833282 add r3, r3, r2, lsl #5
4284: e5931004 ldr r1, [r3, #4]
4288: e3510000 cmp r1, #0
428c: 0a000003 beq 42a0 <rtems_termios_close+0x68>
/*
* call discipline-specific close
*/
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
4290: e1a00004 mov r0, r4
4294: e1a0e00f mov lr, pc
4298: e12fff11 bx r1
429c: ea00000a b 42cc <rtems_termios_close+0x94>
} else {
/*
* default: just flush output buffer
*/
sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
42a0: e5940018 ldr r0, [r4, #24]
42a4: e1a02001 mov r2, r1
42a8: eb00073d bl 5fa4 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL) {
42ac: e3500000 cmp r0, #0
42b0: 1a000012 bne 4300 <rtems_termios_close+0xc8>
drainOutput (struct rtems_termios_tty *tty)
{
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
42b4: e59430b4 ldr r3, [r4, #180] ; 0xb4
42b8: e3530000 cmp r3, #0
42bc: 11a00004 movne r0, r4
42c0: 1bfffeb5 blne 3d9c <drainOutput.part.0>
sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL) {
rtems_fatal_error_occurred (sc);
}
drainOutput (tty);
rtems_semaphore_release (tty->osem);
42c4: e5940018 ldr r0, [r4, #24]
42c8: eb00077c bl 60c0 <rtems_semaphore_release>
}
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
42cc: e59430b4 ldr r3, [r4, #180] ; 0xb4
42d0: e3530002 cmp r3, #2
42d4: 1a00000a bne 4304 <rtems_termios_close+0xcc>
/*
* send "terminate" to I/O tasks
*/
sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT );
42d8: e59400c4 ldr r0, [r4, #196] ; 0xc4
42dc: e3a01001 mov r1, #1
42e0: eb000626 bl 5b80 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
42e4: e3500000 cmp r0, #0
42e8: 1a000004 bne 4300 <rtems_termios_close+0xc8>
rtems_fatal_error_occurred (sc);
sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT );
42ec: e59400c8 ldr r0, [r4, #200] ; 0xc8
42f0: e3a01001 mov r1, #1
42f4: eb000621 bl 5b80 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
42f8: e3500000 cmp r0, #0
42fc: 0a000000 beq 4304 <rtems_termios_close+0xcc>
rtems_fatal_error_occurred (sc);
4300: eb0008f2 bl 66d0 <rtems_fatal_error_occurred> <== NOT EXECUTED
}
if (tty->device.lastClose)
4304: e594309c ldr r3, [r4, #156] ; 0x9c
4308: e3530000 cmp r3, #0
(*tty->device.lastClose)(tty->major, tty->minor, arg);
430c: 1284000c addne r0, r4, #12
4310: 18900003 ldmne r0, {r0, r1}
4314: 11a02005 movne r2, r5
4318: 11a0e00f movne lr, pc
431c: 112fff13 bxne r3
if (tty->forw == NULL) {
4320: e5942000 ldr r2, [r4]
4324: e5943004 ldr r3, [r4, #4]
4328: e3520000 cmp r2, #0
rtems_termios_ttyTail = tty->back;
if ( rtems_termios_ttyTail != NULL ) {
rtems_termios_ttyTail->forw = NULL;
}
} else {
tty->forw->back = tty->back;
432c: 15823004 strne r3, [r2, #4]
if (sc != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred (sc);
}
if (tty->device.lastClose)
(*tty->device.lastClose)(tty->major, tty->minor, arg);
if (tty->forw == NULL) {
4330: 1a000003 bne 4344 <rtems_termios_close+0x10c>
rtems_termios_ttyTail = tty->back;
4334: e59f10a0 ldr r1, [pc, #160] ; 43dc <rtems_termios_close+0x1a4>
if ( rtems_termios_ttyTail != NULL ) {
4338: e3530000 cmp r3, #0
rtems_fatal_error_occurred (sc);
}
if (tty->device.lastClose)
(*tty->device.lastClose)(tty->major, tty->minor, arg);
if (tty->forw == NULL) {
rtems_termios_ttyTail = tty->back;
433c: e5813000 str r3, [r1]
if ( rtems_termios_ttyTail != NULL ) {
rtems_termios_ttyTail->forw = NULL;
4340: 15832000 strne r2, [r3]
}
} else {
tty->forw->back = tty->back;
}
if (tty->back == NULL) {
4344: e5942004 ldr r2, [r4, #4]
4348: e5943000 ldr r3, [r4]
434c: e3520000 cmp r2, #0
rtems_termios_ttyHead = tty->forw;
if ( rtems_termios_ttyHead != NULL ) {
rtems_termios_ttyHead->back = NULL;
}
} else {
tty->back->forw = tty->forw;
4350: 15823000 strne r3, [r2]
}
} else {
tty->forw->back = tty->back;
}
if (tty->back == NULL) {
4354: 1a000003 bne 4368 <rtems_termios_close+0x130>
rtems_termios_ttyHead = tty->forw;
4358: e59f1080 ldr r1, [pc, #128] ; 43e0 <rtems_termios_close+0x1a8>
if ( rtems_termios_ttyHead != NULL ) {
435c: e3530000 cmp r3, #0
} else {
tty->forw->back = tty->back;
}
if (tty->back == NULL) {
rtems_termios_ttyHead = tty->forw;
4360: e5813000 str r3, [r1]
if ( rtems_termios_ttyHead != NULL ) {
rtems_termios_ttyHead->back = NULL;
4364: 15832004 strne r2, [r3, #4]
}
} else {
tty->back->forw = tty->forw;
}
rtems_semaphore_delete (tty->isem);
4368: e5940014 ldr r0, [r4, #20]
436c: eb0006e5 bl 5f08 <rtems_semaphore_delete>
rtems_semaphore_delete (tty->osem);
4370: e5940018 ldr r0, [r4, #24]
4374: eb0006e3 bl 5f08 <rtems_semaphore_delete>
rtems_semaphore_delete (tty->rawOutBuf.Semaphore);
4378: e594008c ldr r0, [r4, #140] ; 0x8c
437c: eb0006e1 bl 5f08 <rtems_semaphore_delete>
if ((tty->device.pollRead == NULL) ||
4380: e59430a0 ldr r3, [r4, #160] ; 0xa0
4384: e3530000 cmp r3, #0
4388: 0a000002 beq 4398 <rtems_termios_close+0x160>
438c: e59430b4 ldr r3, [r4, #180] ; 0xb4
4390: e3530002 cmp r3, #2
4394: 1a000001 bne 43a0 <rtems_termios_close+0x168>
(tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN))
rtems_semaphore_delete (tty->rawInBuf.Semaphore);
4398: e5940068 ldr r0, [r4, #104] ; 0x68
439c: eb0006d9 bl 5f08 <rtems_semaphore_delete>
free (tty->rawInBuf.theBuf);
43a0: e5940058 ldr r0, [r4, #88] ; 0x58
43a4: ebfff7df bl 2328 <free>
free (tty->rawOutBuf.theBuf);
43a8: e594007c ldr r0, [r4, #124] ; 0x7c
43ac: ebfff7dd bl 2328 <free>
free (tty->cbuf);
43b0: e594001c ldr r0, [r4, #28]
43b4: ebfff7db bl 2328 <free>
free (tty);
43b8: e1a00004 mov r0, r4
43bc: ebfff7d9 bl 2328 <free>
}
rtems_semaphore_release (rtems_termios_ttyMutex);
43c0: e59f300c ldr r3, [pc, #12] ; 43d4 <rtems_termios_close+0x19c>
43c4: e5930000 ldr r0, [r3]
43c8: eb00073c bl 60c0 <rtems_semaphore_release>
return RTEMS_SUCCESSFUL;
}
43cc: e3a00000 mov r0, #0
43d0: e8bd8030 pop {r4, r5, pc}
000055a0 <rtems_termios_dequeue_characters>:
rtems_status_code sc;
/*
* sum up character count already sent
*/
tty->t_dqlen += len;
55a0: e5902090 ldr r2, [r0, #144] ; 0x90
55a4: e0822001 add r2, r2, r1
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
55a8: e59010b4 ldr r1, [r0, #180] ; 0xb4
55ac: e3510002 cmp r1, #2
* for each transmitted character.
* It returns number of characters left to transmit
*/
int
rtems_termios_dequeue_characters (void *ttyp, int len)
{
55b0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_status_code sc;
/*
* sum up character count already sent
*/
tty->t_dqlen += len;
55b4: e5802090 str r2, [r0, #144] ; 0x90
if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) {
55b8: 1a000004 bne 55d0 <rtems_termios_dequeue_characters+0x30>
/*
* send wake up to transmitter task
*/
sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT);
55bc: e59000c8 ldr r0, [r0, #200] ; 0xc8
55c0: eb00016e bl 5b80 <rtems_event_send>
if (sc != RTEMS_SUCCESSFUL)
55c4: e2503000 subs r3, r0, #0
55c8: 0a00000d beq 5604 <rtems_termios_dequeue_characters+0x64>
rtems_fatal_error_occurred (sc);
55cc: eb00043f bl 66d0 <rtems_fatal_error_occurred> <== NOT EXECUTED
return 0; /* nothing to output in IRQ... */
}
if (tty->t_line == PPPDISC ) {
55d0: e59030cc ldr r3, [r0, #204] ; 0xcc
55d4: e3530005 cmp r3, #5
55d8: 1a000007 bne 55fc <rtems_termios_dequeue_characters+0x5c>
/*
* call any line discipline start function
*/
if (rtems_termios_linesw[tty->t_line].l_start != NULL) {
55dc: e59f3028 ldr r3, [pc, #40] ; 560c <rtems_termios_dequeue_characters+0x6c>
55e0: e59330b4 ldr r3, [r3, #180] ; 0xb4
55e4: e3530000 cmp r3, #0
55e8: 0a000005 beq 5604 <rtems_termios_dequeue_characters+0x64>
rtems_termios_linesw[tty->t_line].l_start(tty);
55ec: e1a0e00f mov lr, pc
55f0: e12fff13 bx r3
}
return 0; /* nothing to output in IRQ... */
55f4: e3a03000 mov r3, #0
55f8: ea000001 b 5604 <rtems_termios_dequeue_characters+0x64>
}
return rtems_termios_refill_transmitter(tty);
}
55fc: e49de004 pop {lr} ; (ldr lr, [sp], #4)
rtems_termios_linesw[tty->t_line].l_start(tty);
}
return 0; /* nothing to output in IRQ... */
}
return rtems_termios_refill_transmitter(tty);
5600: eafff95b b 3b74 <rtems_termios_refill_transmitter>
}
5604: e1a00003 mov r0, r3
5608: e49df004 pop {pc} ; (ldr pc, [sp], #4)
000052a4 <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, const char *buf, int len)
{
52a4: e92d4ff3 push {r0, r1, r4, r5, r6, r7, r8, r9, sl, fp, lr}
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) {
52a8: e59030cc ldr r3, [r0, #204] ; 0xcc
52ac: e59f6288 ldr r6, [pc, #648] ; 553c <rtems_termios_enqueue_raw_characters+0x298>
52b0: e0863283 add r3, r6, r3, lsl #5
52b4: e5937010 ldr r7, [r3, #16]
52b8: e3570000 cmp r7, #0
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, const char *buf, int len)
{
52bc: e1a04000 mov r4, r0
52c0: e1a09001 mov r9, r1
52c4: e1a08002 mov r8, r2
* NOTE: This routine runs in the context of the
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, const char *buf, int len)
52c8: 13a05000 movne r5, #0
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) {
52cc: 1a00000c bne 5304 <rtems_termios_enqueue_raw_characters+0x60>
/*
* 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);
52d0: e2803030 add r3, r0, #48 ; 0x30
52d4: e58d3000 str r3, [sp]
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,
52d8: e280304a add r3, r0, #74 ; 0x4a
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) {
52dc: e1a05007 mov r5, r7
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,
52e0: e58d3004 str r3, [sp, #4]
52e4: ea00008b b 5518 <rtems_termios_enqueue_raw_characters+0x274>
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);
52e8: e59430cc ldr r3, [r4, #204] ; 0xcc
52ec: e7d90005 ldrb r0, [r9, r5]
52f0: e0863283 add r3, r6, r3, lsl #5
52f4: e1a01004 mov r1, r4
52f8: e1a0e00f mov lr, pc
52fc: e593f010 ldr pc, [r3, #16]
5300: e2855001 add r5, r5, #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--) {
5304: e1550008 cmp r5, r8
5308: 1afffff6 bne 52e8 <rtems_termios_enqueue_raw_characters+0x44>
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
530c: e59450e4 ldr r5, [r4, #228] ; 0xe4
5310: e3550000 cmp r5, #0
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
}
return 0;
5314: 13a05000 movne r5, #0
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
5318: 1a000085 bne 5534 <rtems_termios_enqueue_raw_characters+0x290>
531c: e59430dc ldr r3, [r4, #220] ; 0xdc
5320: e3530000 cmp r3, #0
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
tty->tty_rcvwakeup = 1;
}
return 0;
5324: 01a05003 moveq r5, r3
}
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
5328: 0a000081 beq 5534 <rtems_termios_enqueue_raw_characters+0x290>
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
532c: e2840030 add r0, r4, #48 ; 0x30
5330: e59410e0 ldr r1, [r4, #224] ; 0xe0
5334: e1a0e00f mov lr, pc
5338: e12fff13 bx r3
tty->tty_rcvwakeup = 1;
533c: e3a03001 mov r3, #1
5340: e58430e4 str r3, [r4, #228] ; 0xe4
5344: ea00007a b 5534 <rtems_termios_enqueue_raw_characters+0x290>
while (len--) {
c = *buf++;
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
5348: e59430b8 ldr r3, [r4, #184] ; 0xb8
534c: e3130c02 tst r3, #512 ; 0x200
}
return 0;
}
while (len--) {
c = *buf++;
5350: e4d9a001 ldrb sl, [r9], #1
/* FIXME: implement IXANY: any character restarts output */
/* if incoming XON/XOFF controls outgoing stream: */
if (tty->flow_ctrl & FL_MDXON) {
5354: 0a00000e beq 5394 <rtems_termios_enqueue_raw_characters+0xf0>
/* if received char is V_STOP and V_START (both are equal value) */
if (c == tty->termios.c_cc[VSTOP]) {
5358: e5d4204a ldrb r2, [r4, #74] ; 0x4a
535c: e152000a cmp r2, sl
5360: e5d43049 ldrb r3, [r4, #73] ; 0x49
5364: 1a000006 bne 5384 <rtems_termios_enqueue_raw_characters+0xe0>
if (c == tty->termios.c_cc[VSTART]) {
5368: e1530002 cmp r3, r2
/* received VSTOP and VSTART==VSTOP? */
/* then toggle "stop output" status */
tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF;
536c: e59430b8 ldr r3, [r4, #184] ; 0xb8
5370: 02233010 eoreq r3, r3, #16
}
else {
/* VSTOP received (other code than VSTART) */
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
5374: 13833010 orrne r3, r3, #16
5378: e58430b8 str r3, [r4, #184] ; 0xb8
* NOTE: This routine runs in the context of the
* device receive interrupt handler.
* Returns the number of characters dropped because of overflow.
*/
int
rtems_termios_enqueue_raw_characters (void *ttyp, const char *buf, int len)
537c: e3a07001 mov r7, #1
5380: ea000005 b 539c <rtems_termios_enqueue_raw_characters+0xf8>
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
}
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
5384: e153000a cmp r3, sl
/* VSTART received */
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
5388: 059430b8 ldreq r3, [r4, #184] ; 0xb8
538c: 03c33010 biceq r3, r3, #16
/* stop output */
tty->flow_ctrl |= FL_ORCVXOF;
}
flow_rcv = true;
}
else if (c == tty->termios.c_cc[VSTART]) {
5390: 0afffff8 beq 5378 <rtems_termios_enqueue_raw_characters+0xd4>
/* restart output */
tty->flow_ctrl &= ~FL_ORCVXOF;
flow_rcv = true;
}
}
if (flow_rcv) {
5394: e3570000 cmp r7, #0
5398: 0a000014 beq 53f0 <rtems_termios_enqueue_raw_characters+0x14c>
/* restart output according to FL_ORCVXOF flag */
if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
539c: e59430b8 ldr r3, [r4, #184] ; 0xb8
53a0: e2033030 and r3, r3, #48 ; 0x30
53a4: e3530020 cmp r3, #32
53a8: 1a000059 bne 5514 <rtems_termios_enqueue_raw_characters+0x270>
/* disable interrupts */
rtems_interrupt_disable(level);
53ac: ebfff9ec bl 3b64 <arm_interrupt_disable> <== NOT EXECUTED
53b0: e1a06000 mov r6, r0 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
53b4: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
53b8: e3c33020 bic r3, r3, #32 <== NOT EXECUTED
53bc: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
53c0: e5943094 ldr r3, [r4, #148] ; 0x94 <== NOT EXECUTED
53c4: e3530000 cmp r3, #0 <== NOT EXECUTED
53c8: 0a000006 beq 53e8 <rtems_termios_enqueue_raw_characters+0x144><== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
53cc: e5943084 ldr r3, [r4, #132] ; 0x84 <== 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)(
53d0: e594107c ldr r1, [r4, #124] ; 0x7c <== NOT EXECUTED
53d4: e5940010 ldr r0, [r4, #16] <== NOT EXECUTED
53d8: e0811003 add r1, r1, r3 <== NOT EXECUTED
53dc: e3a02001 mov r2, #1 <== NOT EXECUTED
53e0: e1a0e00f mov lr, pc <== NOT EXECUTED
53e4: e594f0a4 ldr pc, [r4, #164] ; 0xa4 <== NOT EXECUTED
53e8: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
53ec: ea000048 b 5514 <rtems_termios_enqueue_raw_characters+0x270><== NOT EXECUTED
}
/* reenable interrupts */
rtems_interrupt_enable(level);
}
} else {
newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size;
53f0: e5940060 ldr r0, [r4, #96] ; 0x60
53f4: e5941064 ldr r1, [r4, #100] ; 0x64
53f8: e2800001 add r0, r0, #1
53fc: eb004503 bl 16810 <__umodsi3>
5400: e1a06000 mov r6, r0
/* if chars_in_buffer > highwater */
rtems_interrupt_disable(level);
5404: ebfff9d6 bl 3b64 <arm_interrupt_disable>
5408: e1a0b000 mov fp, r0
if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size)
540c: e594305c ldr r3, [r4, #92] ; 0x5c
5410: e5940064 ldr r0, [r4, #100] ; 0x64
5414: e0630000 rsb r0, r3, r0
% tty->rawInBuf.Size) > tty->highwater) &&
5418: e5941064 ldr r1, [r4, #100] ; 0x64
541c: e0800006 add r0, r0, r6
5420: eb0044fa bl 16810 <__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)
5424: e59430c0 ldr r3, [r4, #192] ; 0xc0
5428: e1500003 cmp r0, r3
542c: 9a000024 bls 54c4 <rtems_termios_enqueue_raw_characters+0x220>
% tty->rawInBuf.Size) > tty->highwater) &&
!(tty->flow_ctrl & FL_IREQXOF)) {
5430: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== 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) &&
5434: e3130001 tst r3, #1 <== NOT EXECUTED
5438: 1a000021 bne 54c4 <rtems_termios_enqueue_raw_characters+0x220><== NOT EXECUTED
!(tty->flow_ctrl & FL_IREQXOF)) {
/* incoming data stream should be stopped */
tty->flow_ctrl |= FL_IREQXOF;
543c: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
5440: e3833001 orr r3, r3, #1 <== NOT EXECUTED
5444: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF))
5448: e59f30f0 ldr r3, [pc, #240] ; 5540 <rtems_termios_enqueue_raw_characters+0x29c><== NOT EXECUTED
544c: e59420b8 ldr r2, [r4, #184] ; 0xb8 <== NOT EXECUTED
5450: e0023003 and r3, r2, r3 <== NOT EXECUTED
5454: e3530b01 cmp r3, #1024 ; 0x400 <== NOT EXECUTED
== (FL_MDXOF ) ) {
if ((tty->flow_ctrl & FL_OSTOP) ||
5458: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
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))
545c: 1a00000d bne 5498 <rtems_termios_enqueue_raw_characters+0x1f4><== NOT EXECUTED
== (FL_MDXOF ) ) {
if ((tty->flow_ctrl & FL_OSTOP) ||
5460: e3130020 tst r3, #32 <== NOT EXECUTED
5464: 1a000002 bne 5474 <rtems_termios_enqueue_raw_characters+0x1d0><== NOT EXECUTED
5468: e5943094 ldr r3, [r4, #148] ; 0x94 <== NOT EXECUTED
546c: e3530000 cmp r3, #0 <== NOT EXECUTED
5470: 1a000013 bne 54c4 <rtems_termios_enqueue_raw_characters+0x220><== 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;
5474: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
5478: e3833002 orr r3, r3, #2 <== NOT EXECUTED
547c: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
(*tty->device.write)(tty->minor,
5480: e5940010 ldr r0, [r4, #16] <== NOT EXECUTED
5484: e59d1004 ldr r1, [sp, #4] <== NOT EXECUTED
5488: e3a02001 mov r2, #1 <== NOT EXECUTED
548c: e1a0e00f mov lr, pc <== NOT EXECUTED
5490: e594f0a4 ldr pc, [r4, #164] ; 0xa4 <== NOT EXECUTED
5494: ea00000a b 54c4 <rtems_termios_enqueue_raw_characters+0x220><== NOT EXECUTED
(void *)&(tty->termios.c_cc[VSTOP]), 1);
}
} else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) {
5498: e2033f41 and r3, r3, #260 ; 0x104 <== NOT EXECUTED
549c: e3530c01 cmp r3, #256 ; 0x100 <== NOT EXECUTED
54a0: 1a000007 bne 54c4 <rtems_termios_enqueue_raw_characters+0x220><== NOT EXECUTED
tty->flow_ctrl |= FL_IRTSOFF;
54a4: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
54a8: e3833004 orr r3, r3, #4 <== NOT EXECUTED
54ac: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
/* deactivate RTS line */
if (tty->device.stopRemoteTx != NULL) {
54b0: e59430ac ldr r3, [r4, #172] ; 0xac <== NOT EXECUTED
54b4: e3530000 cmp r3, #0 <== NOT EXECUTED
tty->device.stopRemoteTx(tty->minor);
54b8: 15940010 ldrne r0, [r4, #16] <== NOT EXECUTED
54bc: 11a0e00f movne lr, pc <== NOT EXECUTED
54c0: 112fff13 bxne r3 <== NOT EXECUTED
54c4: e129f00b msr CPSR_fc, fp
}
/* reenable interrupts */
rtems_interrupt_enable(level);
if (newTail == tty->rawInBuf.Head) {
54c8: e594305c ldr r3, [r4, #92] ; 0x5c
54cc: e1560003 cmp r6, r3
dropped++;
54d0: 02855001 addeq r5, r5, #1
}
/* reenable interrupts */
rtems_interrupt_enable(level);
if (newTail == tty->rawInBuf.Head) {
54d4: 0a00000e beq 5514 <rtems_termios_enqueue_raw_characters+0x270>
dropped++;
} else {
tty->rawInBuf.theBuf[newTail] = c;
54d8: e5943058 ldr r3, [r4, #88] ; 0x58
54dc: e7c3a006 strb sl, [r3, r6]
tty->rawInBuf.Tail = newTail;
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
54e0: e59430e4 ldr r3, [r4, #228] ; 0xe4
54e4: e3530000 cmp r3, #0
if (newTail == tty->rawInBuf.Head) {
dropped++;
} else {
tty->rawInBuf.theBuf[newTail] = c;
tty->rawInBuf.Tail = newTail;
54e8: e5846060 str r6, [r4, #96] ; 0x60
/*
* check to see if rcv wakeup callback was set
*/
if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) {
54ec: 1a000008 bne 5514 <rtems_termios_enqueue_raw_characters+0x270>
54f0: e59430dc ldr r3, [r4, #220] ; 0xdc
54f4: e3530000 cmp r3, #0
54f8: 0a000005 beq 5514 <rtems_termios_enqueue_raw_characters+0x270>
(*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
54fc: e59d0000 ldr r0, [sp] <== NOT EXECUTED
5500: e59410e0 ldr r1, [r4, #224] ; 0xe0 <== NOT EXECUTED
5504: e1a0e00f mov lr, pc <== NOT EXECUTED
5508: e12fff13 bx r3 <== NOT EXECUTED
tty->tty_rcvwakeup = 1;
550c: e3a03001 mov r3, #1 <== NOT EXECUTED
5510: e58430e4 str r3, [r4, #228] ; 0xe4 <== NOT EXECUTED
5514: e2488001 sub r8, r8, #1
tty->tty_rcvwakeup = 1;
}
return 0;
}
while (len--) {
5518: e3580000 cmp r8, #0
551c: 1affff89 bne 5348 <rtems_termios_enqueue_raw_characters+0xa4>
}
}
}
}
tty->rawInBufDropped += dropped;
5520: e5943078 ldr r3, [r4, #120] ; 0x78
5524: e0833005 add r3, r3, r5
5528: e5843078 str r3, [r4, #120] ; 0x78
rtems_semaphore_release (tty->rawInBuf.Semaphore);
552c: e5940068 ldr r0, [r4, #104] ; 0x68
5530: eb0002e2 bl 60c0 <rtems_semaphore_release>
return dropped;
}
5534: e1a00005 mov r0, r5
5538: e8bd8ffc pop {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
000043fc <rtems_termios_ioctl>:
rtems_status_code
rtems_termios_ioctl (void *arg)
{
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
43fc: e5903000 ldr r3, [r0]
}
}
rtems_status_code
rtems_termios_ioctl (void *arg)
{
4400: e92d40f0 push {r4, r5, r6, r7, lr}
rtems_libio_ioctl_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
4404: e593402c ldr r4, [r3, #44] ; 0x2c
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
rtems_status_code sc;
args->ioctl_return = 0;
4408: e3a01000 mov r1, #0
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;
440c: e5907008 ldr r7, [r0, #8]
rtems_status_code sc;
args->ioctl_return = 0;
4410: e580100c str r1, [r0, #12]
}
}
rtems_status_code
rtems_termios_ioctl (void *arg)
{
4414: e1a06000 mov r6, r0
struct rtems_termios_tty *tty = args->iop->data1;
struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer;
rtems_status_code sc;
args->ioctl_return = 0;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
4418: e1a02001 mov r2, r1
441c: e5940018 ldr r0, [r4, #24]
4420: eb0006df bl 5fa4 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL) {
4424: e2505000 subs r5, r0, #0
4428: 1a0000f7 bne 480c <rtems_termios_ioctl+0x410>
return sc;
}
switch (args->command) {
442c: e5963004 ldr r3, [r6, #4]
4430: e3530005 cmp r3, #5
4434: 0a0000c7 beq 4758 <rtems_termios_ioctl+0x35c>
4438: 8a00000a bhi 4468 <rtems_termios_ioctl+0x6c>
443c: e3530002 cmp r3, #2
4440: 0a00002d beq 44fc <rtems_termios_ioctl+0x100>
4444: 8a000002 bhi 4454 <rtems_termios_ioctl+0x58>
4448: e3530001 cmp r3, #1
444c: 1a000015 bne 44a8 <rtems_termios_ioctl+0xac>
4450: ea000020 b 44d8 <rtems_termios_ioctl+0xdc>
4454: e3530003 cmp r3, #3
4458: 0a00009c beq 46d0 <rtems_termios_ioctl+0x2d4>
445c: e3530004 cmp r3, #4
4460: 1a000010 bne 44a8 <rtems_termios_ioctl+0xac>
4464: ea0000bf b 4768 <rtems_termios_ioctl+0x36c>
4468: e59f23a4 ldr r2, [pc, #932] ; 4814 <rtems_termios_ioctl+0x418>
446c: e1530002 cmp r3, r2
4470: 0a0000d8 beq 47d8 <rtems_termios_ioctl+0x3dc>
4474: 8a000002 bhi 4484 <rtems_termios_ioctl+0x88>
4478: e3530006 cmp r3, #6
447c: 1a000009 bne 44a8 <rtems_termios_ioctl+0xac>
4480: ea000098 b 46e8 <rtems_termios_ioctl+0x2ec>
4484: e59f238c ldr r2, [pc, #908] ; 4818 <rtems_termios_ioctl+0x41c>
4488: e1530002 cmp r3, r2
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_open(tty);
}
break;
case TIOCGETD:
*(int*)(args->buffer)=tty->t_line;
448c: 059420cc ldreq r2, [r4, #204] ; 0xcc
4490: 05963008 ldreq r3, [r6, #8]
4494: 05832000 streq r2, [r3]
args->ioctl_return = 0;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
switch (args->command) {
4498: 0a0000d9 beq 4804 <rtems_termios_ioctl+0x408>
449c: e2822105 add r2, r2, #1073741825 ; 0x40000001
44a0: e1530002 cmp r3, r2
44a4: 0a0000b3 beq 4778 <rtems_termios_ioctl+0x37c>
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
44a8: e59420cc ldr r2, [r4, #204] ; 0xcc
44ac: e59f3368 ldr r3, [pc, #872] ; 481c <rtems_termios_ioctl+0x420>
44b0: e0833282 add r3, r3, r2, lsl #5
44b4: e5933018 ldr r3, [r3, #24]
44b8: e3530000 cmp r3, #0
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
}
else {
sc = RTEMS_INVALID_NUMBER;
44bc: 03a0500a moveq r5, #10
if (sc != RTEMS_SUCCESSFUL) {
return sc;
}
switch (args->command) {
default:
if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) {
44c0: 0a0000cf beq 4804 <rtems_termios_ioctl+0x408>
sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args);
44c4: e1a00004 mov r0, r4
44c8: e1a01006 mov r1, r6
44cc: e1a0e00f mov lr, pc
44d0: e12fff13 bx r3
44d4: ea0000bd b 47d0 <rtems_termios_ioctl+0x3d4>
sc = RTEMS_INVALID_NUMBER;
}
break;
case RTEMS_IO_GET_ATTRIBUTES:
*(struct termios *)args->buffer = tty->termios;
44d8: e284e030 add lr, r4, #48 ; 0x30
44dc: e8be000f ldm lr!, {r0, r1, r2, r3}
44e0: e596c008 ldr ip, [r6, #8]
44e4: e8ac000f stmia ip!, {r0, r1, r2, r3}
44e8: e8be000f ldm lr!, {r0, r1, r2, r3}
44ec: e8ac000f stmia ip!, {r0, r1, r2, r3}
44f0: e59e3000 ldr r3, [lr]
44f4: e58c3000 str r3, [ip]
break;
44f8: ea0000c1 b 4804 <rtems_termios_ioctl+0x408>
case RTEMS_IO_SET_ATTRIBUTES:
tty->termios = *(struct termios *)args->buffer;
44fc: e596e008 ldr lr, [r6, #8]
4500: e8be000f ldm lr!, {r0, r1, r2, r3}
4504: e284c030 add ip, r4, #48 ; 0x30
4508: e8ac000f stmia ip!, {r0, r1, r2, r3}
450c: e8be000f ldm lr!, {r0, r1, r2, r3}
4510: e8ac000f stmia ip!, {r0, r1, r2, r3}
4514: e59e3000 ldr r3, [lr]
4518: e58c3000 str r3, [ip]
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
451c: e59430b8 ldr r3, [r4, #184] ; 0xb8
4520: e3130c02 tst r3, #512 ; 0x200
4524: 0a000018 beq 458c <rtems_termios_ioctl+0x190>
!(tty->termios.c_iflag & IXON)) {
4528: e5943030 ldr r3, [r4, #48] ; 0x30
/*
* check for flow control options to be switched off
*/
/* check for outgoing XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXON) &&
452c: e3130b01 tst r3, #1024 ; 0x400
4530: 1a000015 bne 458c <rtems_termios_ioctl+0x190>
!(tty->termios.c_iflag & IXON)) {
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF);
4534: e59430b8 ldr r3, [r4, #184] ; 0xb8
4538: e3c33e21 bic r3, r3, #528 ; 0x210
453c: e58430b8 str r3, [r4, #184] ; 0xb8
/* has output been stopped due to received XOFF? */
if (tty->flow_ctrl & FL_OSTOP) {
4540: e59430b8 ldr r3, [r4, #184] ; 0xb8
4544: e3130020 tst r3, #32
4548: 0a00000f beq 458c <rtems_termios_ioctl+0x190>
/* disable interrupts */
rtems_interrupt_disable(level);
454c: ebfffd84 bl 3b64 <arm_interrupt_disable> <== NOT EXECUTED
4550: e1a06000 mov r6, r0 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_OSTOP;
4554: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
4558: e3c33020 bic r3, r3, #32 <== NOT EXECUTED
455c: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
/* check for chars in output buffer (or rob_state?) */
if (tty->rawOutBufState != rob_idle) {
4560: e5943094 ldr r3, [r4, #148] ; 0x94 <== NOT EXECUTED
4564: e3530000 cmp r3, #0 <== NOT EXECUTED
4568: 0a000006 beq 4588 <rtems_termios_ioctl+0x18c> <== NOT EXECUTED
/* if chars available, call write function... */
(*tty->device.write)(
tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
456c: e5943084 ldr r3, [r4, #132] ; 0x84 <== 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)(
4570: e594107c ldr r1, [r4, #124] ; 0x7c <== NOT EXECUTED
4574: e5940010 ldr r0, [r4, #16] <== NOT EXECUTED
4578: e0811003 add r1, r1, r3 <== NOT EXECUTED
457c: e3a02001 mov r2, #1 <== NOT EXECUTED
4580: e1a0e00f mov lr, pc <== NOT EXECUTED
4584: e594f0a4 ldr pc, [r4, #164] ; 0xa4 <== NOT EXECUTED
4588: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
/* reenable interrupts */
rtems_interrupt_enable(level);
}
}
/* check for incoming XON/XOFF flow control switched off */
if (( tty->flow_ctrl & FL_MDXOF) && !(tty->termios.c_iflag & IXOFF)) {
458c: e59430b8 ldr r3, [r4, #184] ; 0xb8
4590: e3130b01 tst r3, #1024 ; 0x400
4594: 0a000008 beq 45bc <rtems_termios_ioctl+0x1c0>
4598: e5943030 ldr r3, [r4, #48] ; 0x30
459c: e3130a01 tst r3, #4096 ; 0x1000
45a0: 1a000005 bne 45bc <rtems_termios_ioctl+0x1c0>
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDXOF);
45a4: e59430b8 ldr r3, [r4, #184] ; 0xb8
45a8: e3c33b01 bic r3, r3, #1024 ; 0x400
45ac: e58430b8 str r3, [r4, #184] ; 0xb8
/* FIXME: what happens, if we had sent XOFF but not yet XON? */
tty->flow_ctrl &= ~(FL_ISNTXOF);
45b0: e59430b8 ldr r3, [r4, #184] ; 0xb8
45b4: e3c33002 bic r3, r3, #2
45b8: e58430b8 str r3, [r4, #184] ; 0xb8
}
/* check for incoming RTS/CTS flow control switched off */
if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) {
45bc: e59430b8 ldr r3, [r4, #184] ; 0xb8
45c0: e3130c01 tst r3, #256 ; 0x100
45c4: 0a000010 beq 460c <rtems_termios_ioctl+0x210>
45c8: e5943038 ldr r3, [r4, #56] ; 0x38 <== NOT EXECUTED
45cc: e3530000 cmp r3, #0 <== NOT EXECUTED
45d0: ba00000d blt 460c <rtems_termios_ioctl+0x210> <== NOT EXECUTED
/* clear related flags in flow_ctrl */
tty->flow_ctrl &= ~(FL_MDRTS);
45d4: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
45d8: e3c33c01 bic r3, r3, #256 ; 0x100 <== NOT EXECUTED
45dc: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
/* restart remote Tx, if it was stopped */
if ((tty->flow_ctrl & FL_IRTSOFF) && (tty->device.startRemoteTx != NULL)) {
45e0: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
45e4: e3130004 tst r3, #4 <== NOT EXECUTED
45e8: 0a000004 beq 4600 <rtems_termios_ioctl+0x204> <== NOT EXECUTED
45ec: e59430b0 ldr r3, [r4, #176] ; 0xb0 <== NOT EXECUTED
45f0: e3530000 cmp r3, #0 <== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
45f4: 15940010 ldrne r0, [r4, #16] <== NOT EXECUTED
45f8: 11a0e00f movne lr, pc <== NOT EXECUTED
45fc: 112fff13 bxne r3 <== NOT EXECUTED
}
tty->flow_ctrl &= ~(FL_IRTSOFF);
4600: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
4604: e3c33004 bic r3, r3, #4 <== NOT EXECUTED
4608: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
/*
* check for flow control options to be switched on
*/
/* check for incoming RTS/CTS flow control switched on */
if (tty->termios.c_cflag & CRTSCTS) {
460c: e5943038 ldr r3, [r4, #56] ; 0x38
4610: e3530000 cmp r3, #0
tty->flow_ctrl |= FL_MDRTS;
4614: b59430b8 ldrlt r3, [r4, #184] ; 0xb8
4618: b3833c01 orrlt r3, r3, #256 ; 0x100
461c: b58430b8 strlt r3, [r4, #184] ; 0xb8
}
/* check for incoming XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXOFF) {
4620: e5943030 ldr r3, [r4, #48] ; 0x30
4624: e3130a01 tst r3, #4096 ; 0x1000
tty->flow_ctrl |= FL_MDXOF;
4628: 159420b8 ldrne r2, [r4, #184] ; 0xb8
462c: 13822b01 orrne r2, r2, #1024 ; 0x400
4630: 158420b8 strne r2, [r4, #184] ; 0xb8
}
/* check for outgoing XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXON) {
4634: e3130b01 tst r3, #1024 ; 0x400
tty->flow_ctrl |= FL_MDXON;
4638: 159430b8 ldrne r3, [r4, #184] ; 0xb8
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) {
463c: e594603c ldr r6, [r4, #60] ; 0x3c
if (tty->termios.c_iflag & IXOFF) {
tty->flow_ctrl |= FL_MDXOF;
}
/* check for outgoing XON/XOF flow control switched on */
if (tty->termios.c_iflag & IXON) {
tty->flow_ctrl |= FL_MDXON;
4640: 13833c02 orrne r3, r3, #512 ; 0x200
4644: 158430b8 strne r3, [r4, #184] ; 0xb8
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) {
4648: e2166002 ands r6, r6, #2
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
464c: 13a03000 movne r3, #0
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) {
4650: 1a000013 bne 46a4 <rtems_termios_ioctl+0x2a8>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
4654: e5d47046 ldrb r7, [r4, #70] ; 0x46
rtems_clock_get_ticks_per_second() / 10;
4658: eb0004c1 bl 5964 <rtems_clock_get_ticks_per_second>
465c: e3a0100a mov r1, #10
4660: e0000097 mul r0, r7, r0
4664: eb004823 bl 166f8 <__aeabi_uidiv>
if (tty->termios.c_cc[VTIME]) {
4668: e5d43046 ldrb r3, [r4, #70] ; 0x46
466c: e3530000 cmp r3, #0
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] *
4670: e5840054 str r0, [r4, #84] ; 0x54
4674: e5d42047 ldrb r2, [r4, #71] ; 0x47
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
4678: 0a000005 beq 4694 <rtems_termios_ioctl+0x298>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
if (tty->termios.c_cc[VMIN])
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
467c: e3520000 cmp r2, #0
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
4680: e5840070 str r0, [r4, #112] ; 0x70
if (tty->termios.c_cc[VMIN])
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
4684: 13a00000 movne r0, #0
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->vtimeTicks = tty->termios.c_cc[VTIME] *
rtems_clock_get_ticks_per_second() / 10;
if (tty->termios.c_cc[VTIME]) {
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
4688: e584606c str r6, [r4, #108] ; 0x6c
tty->rawInBufSemaphoreTimeout = tty->vtimeTicks;
if (tty->termios.c_cc[VMIN])
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
468c: e5840074 str r0, [r4, #116] ; 0x74
4690: ea000006 b 46b0 <rtems_termios_ioctl+0x2b4>
else
tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks;
} else {
if (tty->termios.c_cc[VMIN]) {
4694: e3520000 cmp r2, #0
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
} else {
tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT;
4698: 03a03001 moveq r3, #1
469c: 0584306c streq r3, [r4, #108] ; 0x6c
if (tty->termios.c_cc[VMIN])
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
else
tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks;
} else {
if (tty->termios.c_cc[VMIN]) {
46a0: 0a000002 beq 46b0 <rtems_termios_ioctl+0x2b4>
tty->rawInBufSemaphoreOptions = RTEMS_WAIT;
46a4: e584306c str r3, [r4, #108] ; 0x6c
tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT;
46a8: e5843070 str r3, [r4, #112] ; 0x70
tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT;
46ac: e5843074 str r3, [r4, #116] ; 0x74
} else {
tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT;
}
}
}
if (tty->device.setAttributes)
46b0: e59430a8 ldr r3, [r4, #168] ; 0xa8
46b4: e3530000 cmp r3, #0
46b8: 0a000051 beq 4804 <rtems_termios_ioctl+0x408>
(*tty->device.setAttributes)(tty->minor, &tty->termios);
46bc: e5940010 ldr r0, [r4, #16]
46c0: e2841030 add r1, r4, #48 ; 0x30
46c4: e1a0e00f mov lr, pc
46c8: e12fff13 bx r3
46cc: ea00004c b 4804 <rtems_termios_ioctl+0x408>
drainOutput (struct rtems_termios_tty *tty)
{
rtems_interrupt_level level;
rtems_status_code sc;
if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) {
46d0: e59430b4 ldr r3, [r4, #180] ; 0xb4
46d4: e3530000 cmp r3, #0
46d8: 0a000049 beq 4804 <rtems_termios_ioctl+0x408>
46dc: e1a00004 mov r0, r4 <== NOT EXECUTED
46e0: ebfffdad bl 3d9c <drainOutput.part.0> <== NOT EXECUTED
46e4: ea000046 b 4804 <rtems_termios_ioctl+0x408> <== NOT EXECUTED
case RTEMS_IO_TCDRAIN:
drainOutput (tty);
break;
case RTEMS_IO_TCFLUSH:
switch ((intptr_t) args->buffer) {
46e8: e5963008 ldr r3, [r6, #8]
46ec: e3530001 cmp r3, #1
46f0: 0a000008 beq 4718 <rtems_termios_ioctl+0x31c>
46f4: e3530002 cmp r3, #2
46f8: 0a00000b beq 472c <rtems_termios_ioctl+0x330>
46fc: e3530000 cmp r3, #0
case TCIOFLUSH:
flushOutput (tty);
flushInput (tty);
break;
default:
sc = RTEMS_INVALID_NAME;
4700: 13a05003 movne r5, #3
case RTEMS_IO_TCDRAIN:
drainOutput (tty);
break;
case RTEMS_IO_TCFLUSH:
switch ((intptr_t) args->buffer) {
4704: 1a00003e bne 4804 <rtems_termios_ioctl+0x408>
static void
flushInput (struct rtems_termios_tty *tty)
{
rtems_interrupt_level level;
rtems_interrupt_disable (level);
4708: ebfffd15 bl 3b64 <arm_interrupt_disable>
tty->rawInBuf.Tail = 0;
470c: e5845060 str r5, [r4, #96] ; 0x60
tty->rawInBuf.Head = 0;
4710: e584505c str r5, [r4, #92] ; 0x5c
4714: ea00000d b 4750 <rtems_termios_ioctl+0x354>
static void
flushOutput (struct rtems_termios_tty *tty)
{
rtems_interrupt_level level;
rtems_interrupt_disable (level);
4718: ebfffd11 bl 3b64 <arm_interrupt_disable>
tty->rawOutBuf.Tail = 0;
471c: e5845084 str r5, [r4, #132] ; 0x84
tty->rawOutBuf.Head = 0;
tty->rawOutBufState = rob_idle;
4720: e5845094 str r5, [r4, #148] ; 0x94
{
rtems_interrupt_level level;
rtems_interrupt_disable (level);
tty->rawOutBuf.Tail = 0;
tty->rawOutBuf.Head = 0;
4724: e5845080 str r5, [r4, #128] ; 0x80
4728: ea000008 b 4750 <rtems_termios_ioctl+0x354>
static void
flushOutput (struct rtems_termios_tty *tty)
{
rtems_interrupt_level level;
rtems_interrupt_disable (level);
472c: ebfffd0c bl 3b64 <arm_interrupt_disable>
tty->rawOutBuf.Tail = 0;
4730: e5845084 str r5, [r4, #132] ; 0x84
tty->rawOutBuf.Head = 0;
tty->rawOutBufState = rob_idle;
4734: e5845094 str r5, [r4, #148] ; 0x94
{
rtems_interrupt_level level;
rtems_interrupt_disable (level);
tty->rawOutBuf.Tail = 0;
tty->rawOutBuf.Head = 0;
4738: e5845080 str r5, [r4, #128] ; 0x80
473c: e129f000 msr CPSR_fc, r0
static void
flushInput (struct rtems_termios_tty *tty)
{
rtems_interrupt_level level;
rtems_interrupt_disable (level);
4740: ebfffd07 bl 3b64 <arm_interrupt_disable>
tty->rawInBuf.Tail = 0;
4744: e3a03000 mov r3, #0
4748: e5843060 str r3, [r4, #96] ; 0x60
tty->rawInBuf.Head = 0;
474c: e584305c str r3, [r4, #92] ; 0x5c
4750: e129f000 msr CPSR_fc, r0
4754: ea00002a b 4804 <rtems_termios_ioctl+0x408>
break;
}
break;
case RTEMS_IO_SNDWAKEUP:
tty->tty_snd = *wakeup;
4758: e897000c ldm r7, {r2, r3}
475c: e58420d4 str r2, [r4, #212] ; 0xd4
4760: e58430d8 str r3, [r4, #216] ; 0xd8
break;
4764: ea000026 b 4804 <rtems_termios_ioctl+0x408>
case RTEMS_IO_RCVWAKEUP:
tty->tty_rcv = *wakeup;
4768: e897000c ldm r7, {r2, r3}
476c: e58420dc str r2, [r4, #220] ; 0xdc
4770: e58430e0 str r3, [r4, #224] ; 0xe0
break;
4774: ea000022 b 4804 <rtems_termios_ioctl+0x408>
#if 1 /* FIXME */
case TIOCSETD:
/*
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
4778: e59420cc ldr r2, [r4, #204] ; 0xcc
477c: e59f3098 ldr r3, [pc, #152] ; 481c <rtems_termios_ioctl+0x420>
4780: e0833282 add r3, r3, r2, lsl #5
4784: e5933004 ldr r3, [r3, #4]
4788: e3530000 cmp r3, #0
478c: 0a000003 beq 47a0 <rtems_termios_ioctl+0x3a4>
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
4790: e1a00004 mov r0, r4
4794: e1a0e00f mov lr, pc
4798: e12fff13 bx r3
479c: e1a05000 mov r5, r0
}
tty->t_line=*(int*)(args->buffer);
47a0: e5963008 ldr r3, [r6, #8]
tty->t_sc = NULL; /* ensure that no more valid data */
47a4: e3a02000 mov r2, #0
* close old line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_close != NULL) {
sc = rtems_termios_linesw[tty->t_line].l_close(tty);
}
tty->t_line=*(int*)(args->buffer);
47a8: e5933000 ldr r3, [r3]
tty->t_sc = NULL; /* ensure that no more valid data */
47ac: e58420d0 str r2, [r4, #208] ; 0xd0
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
47b0: e59f2064 ldr r2, [pc, #100] ; 481c <rtems_termios_ioctl+0x420>
* 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);
47b4: e58430cc str r3, [r4, #204] ; 0xcc
tty->t_sc = NULL; /* ensure that no more valid data */
/*
* open new line discipline
*/
if (rtems_termios_linesw[tty->t_line].l_open != NULL) {
47b8: e7923283 ldr r3, [r2, r3, lsl #5]
47bc: e3530000 cmp r3, #0
47c0: 0a00000f beq 4804 <rtems_termios_ioctl+0x408>
sc = rtems_termios_linesw[tty->t_line].l_open(tty);
47c4: e1a00004 mov r0, r4
47c8: e1a0e00f mov lr, pc
47cc: e12fff13 bx r3
47d0: e1a05000 mov r5, r0
47d4: ea00000a b 4804 <rtems_termios_ioctl+0x408>
case TIOCGETD:
*(int*)(args->buffer)=tty->t_line;
break;
#endif
case FIONREAD: {
int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head;
47d8: e5942060 ldr r2, [r4, #96] ; 0x60 <== NOT EXECUTED
47dc: e594305c ldr r3, [r4, #92] ; 0x5c <== NOT EXECUTED
if ( rawnc < 0 )
47e0: e0523003 subs r3, r2, r3 <== NOT EXECUTED
rawnc += tty->rawInBuf.Size;
47e4: 45942064 ldrmi r2, [r4, #100] ; 0x64 <== NOT EXECUTED
/* Half guess that this is the right operation */
*(int *)args->buffer = tty->ccount - tty->cindex + rawnc;
47e8: e2840020 add r0, r4, #32 <== NOT EXECUTED
47ec: e8900003 ldm r0, {r0, r1} <== NOT EXECUTED
47f0: e0401001 sub r1, r0, r1 <== NOT EXECUTED
break;
#endif
case FIONREAD: {
int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head;
if ( rawnc < 0 )
rawnc += tty->rawInBuf.Size;
47f4: 40833002 addmi r3, r3, r2 <== NOT EXECUTED
/* Half guess that this is the right operation */
*(int *)args->buffer = tty->ccount - tty->cindex + rawnc;
47f8: e5962008 ldr r2, [r6, #8] <== NOT EXECUTED
47fc: e0813003 add r3, r1, r3 <== NOT EXECUTED
4800: e5823000 str r3, [r2] <== NOT EXECUTED
}
break;
}
rtems_semaphore_release (tty->osem);
4804: e5940018 ldr r0, [r4, #24]
4808: eb00062c bl 60c0 <rtems_semaphore_release>
return sc;
}
480c: e1a00005 mov r0, r5
4810: e8bd80f0 pop {r4, r5, r6, r7, pc}
00004f60 <rtems_termios_read>:
rtems_status_code
rtems_termios_read (void *arg)
{
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
4f60: e5903000 ldr r3, [r0]
return RTEMS_SUCCESSFUL;
}
rtems_status_code
rtems_termios_read (void *arg)
{
4f64: e92d4ff1 push {r0, r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
4f68: e593402c ldr r4, [r3, #44] ; 0x2c
uint32_t count = args->count;
char *buffer = args->buffer;
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
4f6c: e3a01000 mov r1, #0
rtems_status_code
rtems_termios_read (void *arg)
{
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
uint32_t count = args->count;
4f70: e5908010 ldr r8, [r0, #16]
char *buffer = args->buffer;
4f74: e590b00c ldr fp, [r0, #12]
return RTEMS_SUCCESSFUL;
}
rtems_status_code
rtems_termios_read (void *arg)
{
4f78: e1a05000 mov r5, r0
struct rtems_termios_tty *tty = args->iop->data1;
uint32_t count = args->count;
char *buffer = args->buffer;
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
4f7c: e1a02001 mov r2, r1
4f80: e5940014 ldr r0, [r4, #20]
4f84: eb000406 bl 5fa4 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL)
4f88: e2507000 subs r7, r0, #0
4f8c: 1a0000bc bne 5284 <rtems_termios_read+0x324>
return sc;
if (rtems_termios_linesw[tty->t_line].l_read != NULL) {
4f90: e59420cc ldr r2, [r4, #204] ; 0xcc
4f94: e59f32f0 ldr r3, [pc, #752] ; 528c <rtems_termios_read+0x32c>
4f98: e0833282 add r3, r3, r2, lsl #5
4f9c: e5933008 ldr r3, [r3, #8]
4fa0: e3530000 cmp r3, #0
4fa4: 0a000005 beq 4fc0 <rtems_termios_read+0x60>
sc = rtems_termios_linesw[tty->t_line].l_read(tty,args);
4fa8: e1a00004 mov r0, r4
4fac: e1a01005 mov r1, r5
4fb0: e1a0e00f mov lr, pc
4fb4: e12fff13 bx r3
4fb8: e1a07000 mov r7, r0
4fbc: ea0000ac b 5274 <rtems_termios_read+0x314>
tty->tty_rcvwakeup = 0;
rtems_semaphore_release (tty->isem);
return sc;
}
if (tty->cindex == tty->ccount) {
4fc0: e5942024 ldr r2, [r4, #36] ; 0x24
4fc4: e5943020 ldr r3, [r4, #32]
4fc8: e1520003 cmp r2, r3
4fcc: 1a00009f bne 5250 <rtems_termios_read+0x2f0>
tty->cindex = tty->ccount = 0;
tty->read_start_column = tty->column;
4fd0: e5943028 ldr r3, [r4, #40] ; 0x28
4fd4: e584302c str r3, [r4, #44] ; 0x2c
if (tty->device.pollRead != NULL &&
4fd8: e59430a0 ldr r3, [r4, #160] ; 0xa0
4fdc: e3530000 cmp r3, #0
rtems_semaphore_release (tty->isem);
return sc;
}
if (tty->cindex == tty->ccount) {
tty->cindex = tty->ccount = 0;
4fe0: e5847020 str r7, [r4, #32]
4fe4: e5847024 str r7, [r4, #36] ; 0x24
tty->read_start_column = tty->column;
if (tty->device.pollRead != NULL &&
4fe8: 0a00003b beq 50dc <rtems_termios_read+0x17c>
4fec: e59430b4 ldr r3, [r4, #180] ; 0xb4
4ff0: e3530000 cmp r3, #0
4ff4: 1a000038 bne 50dc <rtems_termios_read+0x17c>
static rtems_status_code
fillBufferPoll (struct rtems_termios_tty *tty)
{
int n;
if (tty->termios.c_lflag & ICANON) {
4ff8: e594303c ldr r3, [r4, #60] ; 0x3c
4ffc: e3130002 tst r3, #2
5000: 0a00000d beq 503c <rtems_termios_read+0xdc>
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
5004: e5940010 ldr r0, [r4, #16]
5008: e1a0e00f mov lr, pc
500c: e594f0a0 ldr pc, [r4, #160] ; 0xa0
if (n < 0) {
5010: e3500000 cmp r0, #0
5014: aa000002 bge 5024 <rtems_termios_read+0xc4>
rtems_task_wake_after (1);
5018: e3a00001 mov r0, #1
501c: eb000522 bl 64ac <rtems_task_wake_after>
5020: eafffff7 b 5004 <rtems_termios_read+0xa4>
} else {
if (siproc (n, tty))
5024: e20000ff and r0, r0, #255 ; 0xff
5028: e1a01004 mov r1, r4
502c: ebffff85 bl 4e48 <siproc>
5030: e3500000 cmp r0, #0
5034: 0afffff2 beq 5004 <rtems_termios_read+0xa4>
5038: ea000084 b 5250 <rtems_termios_read+0x2f0>
}
}
} else {
rtems_interval then, now;
then = rtems_clock_get_ticks_since_boot();
503c: eb000250 bl 5984 <rtems_clock_get_ticks_since_boot>
5040: e1a06000 mov r6, r0
for (;;) {
n = (*tty->device.pollRead)(tty->minor);
5044: e5940010 ldr r0, [r4, #16]
5048: e1a0e00f mov lr, pc
504c: e594f0a0 ldr pc, [r4, #160] ; 0xa0
if (n < 0) {
5050: e3500000 cmp r0, #0
5054: aa000013 bge 50a8 <rtems_termios_read+0x148>
if (tty->termios.c_cc[VMIN]) {
5058: e5d43047 ldrb r3, [r4, #71] ; 0x47
505c: e3530000 cmp r3, #0
5060: e5d43046 ldrb r3, [r4, #70] ; 0x46
5064: 0a000005 beq 5080 <rtems_termios_read+0x120>
if (tty->termios.c_cc[VTIME] && tty->ccount) {
5068: e3530000 cmp r3, #0
506c: 0a00000a beq 509c <rtems_termios_read+0x13c>
5070: e5943020 ldr r3, [r4, #32]
5074: e3530000 cmp r3, #0
5078: 0a000007 beq 509c <rtems_termios_read+0x13c>
507c: ea000001 b 5088 <rtems_termios_read+0x128>
if ((now - then) > tty->vtimeTicks) {
break;
}
}
} else {
if (!tty->termios.c_cc[VTIME])
5080: e3530000 cmp r3, #0
5084: 0a000071 beq 5250 <rtems_termios_read+0x2f0>
break;
now = rtems_clock_get_ticks_since_boot();
5088: eb00023d bl 5984 <rtems_clock_get_ticks_since_boot>
if ((now - then) > tty->vtimeTicks) {
508c: e5943054 ldr r3, [r4, #84] ; 0x54
5090: e0660000 rsb r0, r6, r0
5094: e1500003 cmp r0, r3
5098: 8a00006c bhi 5250 <rtems_termios_read+0x2f0>
break;
}
}
rtems_task_wake_after (1);
509c: e3a00001 mov r0, #1
50a0: eb000501 bl 64ac <rtems_task_wake_after>
50a4: eaffffe6 b 5044 <rtems_termios_read+0xe4>
} else {
siproc (n, tty);
50a8: e20000ff and r0, r0, #255 ; 0xff
50ac: e1a01004 mov r1, r4
50b0: ebffff64 bl 4e48 <siproc>
if (tty->ccount >= tty->termios.c_cc[VMIN])
50b4: e5d43047 ldrb r3, [r4, #71] ; 0x47
50b8: e5942020 ldr r2, [r4, #32]
50bc: e1520003 cmp r2, r3
50c0: aa000062 bge 5250 <rtems_termios_read+0x2f0>
break;
if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME])
50c4: e3530000 cmp r3, #0
50c8: 0affffdd beq 5044 <rtems_termios_read+0xe4>
50cc: e5d43046 ldrb r3, [r4, #70] ; 0x46
50d0: e3530000 cmp r3, #0
50d4: 0affffda beq 5044 <rtems_termios_read+0xe4>
50d8: eaffffd7 b 503c <rtems_termios_read+0xdc>
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)(
50dc: e2843049 add r3, r4, #73 ; 0x49
* Fill the input buffer from the raw input queue
*/
static rtems_status_code
fillBufferQueue (struct rtems_termios_tty *tty)
{
rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout;
50e0: e594a074 ldr sl, [r4, #116] ; 0x74
rtems_status_code sc;
int wait = 1;
50e4: e3a06001 mov r6, #1
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
(tty->ccount < (CBUFSIZE-1))) {
50e8: e59f91a0 ldr r9, [pc, #416] ; 5290 <rtems_termios_read+0x330>
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)(
50ec: e58d3000 str r3, [sp]
50f0: ea00003e b 51f0 <rtems_termios_read+0x290>
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;
50f4: e594005c ldr r0, [r4, #92] ; 0x5c
50f8: e5941064 ldr r1, [r4, #100] ; 0x64
50fc: e2800001 add r0, r0, #1
5100: eb0045c2 bl 16810 <__umodsi3>
c = tty->rawInBuf.theBuf[newHead];
5104: e5943058 ldr r3, [r4, #88] ; 0x58
5108: e7d3a000 ldrb sl, [r3, r0]
tty->rawInBuf.Head = newHead;
510c: e584005c str r0, [r4, #92] ; 0x5c
if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size)
5110: e5943060 ldr r3, [r4, #96] ; 0x60
5114: e5942064 ldr r2, [r4, #100] ; 0x64
5118: e0823003 add r3, r2, r3
% tty->rawInBuf.Size)
511c: e0600003 rsb r0, r0, r3
5120: e5941064 ldr r1, [r4, #100] ; 0x64
5124: eb0045b9 bl 16810 <__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)
5128: e59430bc ldr r3, [r4, #188] ; 0xbc
512c: e1500003 cmp r0, r3
5130: 2a00001f bcs 51b4 <rtems_termios_read+0x254>
% tty->rawInBuf.Size)
< tty->lowwater) {
tty->flow_ctrl &= ~FL_IREQXOF;
5134: e59430b8 ldr r3, [r4, #184] ; 0xb8
5138: e3c33001 bic r3, r3, #1
513c: e58430b8 str r3, [r4, #184] ; 0xb8
/* if tx stopped and XON should be sent... */
if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
5140: e59f314c ldr r3, [pc, #332] ; 5294 <rtems_termios_read+0x334>
5144: e59420b8 ldr r2, [r4, #184] ; 0xb8
5148: e0023003 and r3, r2, r3
514c: e59f2140 ldr r2, [pc, #320] ; 5294 <rtems_termios_read+0x334>
5150: e1530002 cmp r3, r2
5154: 1a00000b bne 5188 <rtems_termios_read+0x228>
== (FL_MDXON | FL_ISNTXOF))
&& ((tty->rawOutBufState == rob_idle)
5158: e5943094 ldr r3, [r4, #148] ; 0x94 <== NOT EXECUTED
515c: e3530000 cmp r3, #0 <== NOT EXECUTED
5160: 0a000002 beq 5170 <rtems_termios_read+0x210> <== NOT EXECUTED
|| (tty->flow_ctrl & FL_OSTOP))) {
5164: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
5168: e3130020 tst r3, #32 <== NOT EXECUTED
516c: 0a000005 beq 5188 <rtems_termios_read+0x228> <== NOT EXECUTED
/* XON should be sent now... */
(*tty->device.write)(
5170: e5940010 ldr r0, [r4, #16] <== NOT EXECUTED
5174: e59d1000 ldr r1, [sp] <== NOT EXECUTED
5178: e3a02001 mov r2, #1 <== NOT EXECUTED
517c: e1a0e00f mov lr, pc <== NOT EXECUTED
5180: e594f0a4 ldr pc, [r4, #164] ; 0xa4 <== NOT EXECUTED
5184: ea00000a b 51b4 <rtems_termios_read+0x254> <== NOT EXECUTED
tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1);
} else if (tty->flow_ctrl & FL_MDRTS) {
5188: e59430b8 ldr r3, [r4, #184] ; 0xb8
518c: e3130c01 tst r3, #256 ; 0x100
5190: 0a000007 beq 51b4 <rtems_termios_read+0x254>
tty->flow_ctrl &= ~FL_IRTSOFF;
5194: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
5198: e3c33004 bic r3, r3, #4 <== NOT EXECUTED
519c: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
/* activate RTS line */
if (tty->device.startRemoteTx != NULL) {
51a0: e59430b0 ldr r3, [r4, #176] ; 0xb0 <== NOT EXECUTED
51a4: e3530000 cmp r3, #0 <== NOT EXECUTED
tty->device.startRemoteTx(tty->minor);
51a8: 15940010 ldrne r0, [r4, #16] <== NOT EXECUTED
51ac: 11a0e00f movne lr, pc <== NOT EXECUTED
51b0: 112fff13 bxne r3 <== NOT EXECUTED
}
}
}
/* continue processing new character */
if (tty->termios.c_lflag & ICANON) {
51b4: e594303c ldr r3, [r4, #60] ; 0x3c
51b8: e3130002 tst r3, #2
if (siproc (c, tty))
51bc: e1a0000a mov r0, sl
51c0: e1a01004 mov r1, r4
}
}
}
/* continue processing new character */
if (tty->termios.c_lflag & ICANON) {
51c4: 0a000003 beq 51d8 <rtems_termios_read+0x278>
if (siproc (c, tty))
51c8: ebffff1e bl 4e48 <siproc>
wait = 0;
51cc: e3500000 cmp r0, #0
51d0: 13a06000 movne r6, #0
51d4: ea000004 b 51ec <rtems_termios_read+0x28c>
} else {
siproc (c, tty);
51d8: ebffff1a bl 4e48 <siproc> <== NOT EXECUTED
if (tty->ccount >= tty->termios.c_cc[VMIN])
51dc: e5d43047 ldrb r3, [r4, #71] ; 0x47 <== NOT EXECUTED
51e0: e5942020 ldr r2, [r4, #32] <== NOT EXECUTED
wait = 0;
51e4: e1520003 cmp r2, r3 <== NOT EXECUTED
51e8: a3a06000 movge r6, #0 <== NOT EXECUTED
}
timeout = tty->rawInBufSemaphoreTimeout;
51ec: e594a070 ldr sl, [r4, #112] ; 0x70
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
51f0: e594205c ldr r2, [r4, #92] ; 0x5c
51f4: e5943060 ldr r3, [r4, #96] ; 0x60
51f8: e1520003 cmp r2, r3
51fc: 0a000004 beq 5214 <rtems_termios_read+0x2b4>
(tty->ccount < (CBUFSIZE-1))) {
5200: e5993008 ldr r3, [r9, #8]
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
5204: e5942020 ldr r2, [r4, #32]
(tty->ccount < (CBUFSIZE-1))) {
5208: e2433001 sub r3, r3, #1
while ( wait ) {
/*
* Process characters read from raw queue
*/
while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
520c: e1520003 cmp r2, r3
5210: 3affffb7 bcc 50f4 <rtems_termios_read+0x194>
}
/*
* Wait for characters
*/
if ( wait ) {
5214: e3560000 cmp r6, #0
5218: 0a00000c beq 5250 <rtems_termios_read+0x2f0>
sc = rtems_semaphore_obtain(
521c: e2840068 add r0, r4, #104 ; 0x68
5220: e8900003 ldm r0, {r0, r1}
5224: e1a0200a mov r2, sl
5228: eb00035d bl 5fa4 <rtems_semaphore_obtain>
tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout);
if (sc != RTEMS_SUCCESSFUL)
522c: e3500000 cmp r0, #0
5230: 0affffee beq 51f0 <rtems_termios_read+0x290>
5234: ea000005 b 5250 <rtems_termios_read+0x2f0> <== NOT EXECUTED
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
*buffer++ = tty->cbuf[tty->cindex++];
5238: e594201c ldr r2, [r4, #28]
523c: e7d22003 ldrb r2, [r2, r3]
5240: e2833001 add r3, r3, #1
5244: e4cb2001 strb r2, [fp], #1
5248: e5843024 str r3, [r4, #36] ; 0x24
count--;
524c: e2488001 sub r8, r8, #1
sc = fillBufferQueue (tty);
if (sc != RTEMS_SUCCESSFUL)
tty->cindex = tty->ccount = 0;
}
while (count && (tty->cindex < tty->ccount)) {
5250: e3580000 cmp r8, #0
5254: 0a000003 beq 5268 <rtems_termios_read+0x308>
5258: e2842020 add r2, r4, #32
525c: e892000c ldm r2, {r2, r3}
5260: e1530002 cmp r3, r2
5264: bafffff3 blt 5238 <rtems_termios_read+0x2d8>
*buffer++ = tty->cbuf[tty->cindex++];
count--;
}
args->bytes_moved = args->count - count;
5268: e5953010 ldr r3, [r5, #16]
526c: e0688003 rsb r8, r8, r3
5270: e5858018 str r8, [r5, #24]
tty->tty_rcvwakeup = 0;
5274: e3a03000 mov r3, #0
5278: e58430e4 str r3, [r4, #228] ; 0xe4
rtems_semaphore_release (tty->isem);
527c: e5940014 ldr r0, [r4, #20]
5280: eb00038e bl 60c0 <rtems_semaphore_release>
return sc;
}
5284: e1a00007 mov r0, r7
5288: e8bd8ff8 pop {r3, r4, r5, r6, r7, r8, r9, sl, fp, pc}
00003b74 <rtems_termios_refill_transmitter>:
int nToSend;
rtems_interrupt_level level;
int len;
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
3b74: e59020b8 ldr r2, [r0, #184] ; 0xb8
3b78: e59f31b4 ldr r3, [pc, #436] ; 3d34 <rtems_termios_refill_transmitter+0x1c0>
3b7c: e0023003 and r3, r2, r3
3b80: e59f21b0 ldr r2, [pc, #432] ; 3d38 <rtems_termios_refill_transmitter+0x1c4>
3b84: e1530002 cmp r3, r2
* in task-driven mode, this function is called in Tx task context
* in interrupt-driven mode, this function is called in TxIRQ context
*/
static int
rtems_termios_refill_transmitter (struct rtems_termios_tty *tty)
{
3b88: e92d4070 push {r4, r5, r6, lr}
3b8c: e1a04000 mov r4, r0
int nToSend;
rtems_interrupt_level level;
int len;
/* check for XOF/XON to send */
if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF))
3b90: 1a00000b bne 3bc4 <rtems_termios_refill_transmitter+0x50>
== (FL_MDXOF | FL_IREQXOF)) {
/* XOFF should be sent now... */
(*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1);
3b94: e284104a add r1, r4, #74 ; 0x4a <== NOT EXECUTED
3b98: e3a02001 mov r2, #1 <== NOT EXECUTED
3b9c: e5900010 ldr r0, [r0, #16] <== NOT EXECUTED
3ba0: e1a0e00f mov lr, pc <== NOT EXECUTED
3ba4: e594f0a4 ldr pc, [r4, #164] ; 0xa4 <== NOT EXECUTED
rtems_interrupt_disable(level);
3ba8: ebffffed bl 3b64 <arm_interrupt_disable> <== NOT EXECUTED
tty->t_dqlen--;
3bac: e5943090 ldr r3, [r4, #144] ; 0x90 <== NOT EXECUTED
3bb0: e2433001 sub r3, r3, #1 <== NOT EXECUTED
3bb4: e5843090 str r3, [r4, #144] ; 0x90 <== NOT EXECUTED
tty->flow_ctrl |= FL_ISNTXOF;
3bb8: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
3bbc: e3833002 orr r3, r3, #2 <== NOT EXECUTED
3bc0: ea00000e b 3c00 <rtems_termios_refill_transmitter+0x8c> <== NOT EXECUTED
rtems_interrupt_enable(level);
nToSend = 1;
} else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) {
3bc4: e59030b8 ldr r3, [r0, #184] ; 0xb8
3bc8: e2033003 and r3, r3, #3
3bcc: e3530002 cmp r3, #2
3bd0: 1a00000e bne 3c10 <rtems_termios_refill_transmitter+0x9c>
* 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);
3bd4: e2841049 add r1, r4, #73 ; 0x49 <== NOT EXECUTED
3bd8: e3a02001 mov r2, #1 <== NOT EXECUTED
3bdc: e5900010 ldr r0, [r0, #16] <== NOT EXECUTED
3be0: e1a0e00f mov lr, pc <== NOT EXECUTED
3be4: e594f0a4 ldr pc, [r4, #164] ; 0xa4 <== NOT EXECUTED
rtems_interrupt_disable(level);
3be8: ebffffdd bl 3b64 <arm_interrupt_disable> <== NOT EXECUTED
tty->t_dqlen--;
3bec: e5943090 ldr r3, [r4, #144] ; 0x90 <== NOT EXECUTED
3bf0: e2433001 sub r3, r3, #1 <== NOT EXECUTED
3bf4: e5843090 str r3, [r4, #144] ; 0x90 <== NOT EXECUTED
tty->flow_ctrl &= ~FL_ISNTXOF;
3bf8: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
3bfc: e3c33002 bic r3, r3, #2 <== NOT EXECUTED
3c00: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
#if defined(ARM_MULTILIB_ARCH_V4)
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3c04: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
rtems_interrupt_enable(level);
nToSend = 1;
3c08: e3a05001 mov r5, #1 <== NOT EXECUTED
3c0c: ea000046 b 3d2c <rtems_termios_refill_transmitter+0x1b8> <== NOT EXECUTED
} else {
if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) {
3c10: e5902080 ldr r2, [r0, #128] ; 0x80
3c14: e5903084 ldr r3, [r0, #132] ; 0x84
3c18: e1520003 cmp r2, r3
3c1c: 1a000005 bne 3c38 <rtems_termios_refill_transmitter+0xc4>
/*
* buffer was empty
*/
if (tty->rawOutBufState == rob_wait) {
3c20: e5903094 ldr r3, [r0, #148] ; 0x94
3c24: e3530002 cmp r3, #2
3c28: 1a00003e bne 3d28 <rtems_termios_refill_transmitter+0x1b4>
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
3c2c: e590008c ldr r0, [r0, #140] ; 0x8c <== NOT EXECUTED
3c30: eb000922 bl 60c0 <rtems_semaphore_release> <== NOT EXECUTED
3c34: ea00003b b 3d28 <rtems_termios_refill_transmitter+0x1b4> <== NOT EXECUTED
}
return 0;
}
rtems_interrupt_disable(level);
3c38: ebffffc9 bl 3b64 <arm_interrupt_disable>
len = tty->t_dqlen;
tty->t_dqlen = 0;
3c3c: e3a03000 mov r3, #0
}
return 0;
}
rtems_interrupt_disable(level);
len = tty->t_dqlen;
3c40: e5942090 ldr r2, [r4, #144] ; 0x90
tty->t_dqlen = 0;
3c44: e5843090 str r3, [r4, #144] ; 0x90
3c48: e129f000 msr CPSR_fc, r0
rtems_interrupt_enable(level);
newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size;
3c4c: e5943084 ldr r3, [r4, #132] ; 0x84
3c50: e5941088 ldr r1, [r4, #136] ; 0x88
3c54: e0820003 add r0, r2, r3
3c58: eb004aec bl 16810 <__umodsi3>
tty->rawOutBuf.Tail = newTail;
if (tty->rawOutBufState == rob_wait) {
3c5c: e5943094 ldr r3, [r4, #148] ; 0x94
3c60: e3530002 cmp r3, #2
rtems_interrupt_disable(level);
len = tty->t_dqlen;
tty->t_dqlen = 0;
rtems_interrupt_enable(level);
newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size;
3c64: e1a06000 mov r6, r0
tty->rawOutBuf.Tail = newTail;
3c68: e5840084 str r0, [r4, #132] ; 0x84
if (tty->rawOutBufState == rob_wait) {
/*
* wake up any pending writer task
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
3c6c: 0594008c ldreq r0, [r4, #140] ; 0x8c
3c70: 0b000912 bleq 60c0 <rtems_semaphore_release>
}
if (newTail == tty->rawOutBuf.Head) {
3c74: e5943080 ldr r3, [r4, #128] ; 0x80
3c78: e1560003 cmp r6, r3
3c7c: 1a00000a bne 3cac <rtems_termios_refill_transmitter+0x138>
nToSend = 0;
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
3c80: e59430d4 ldr r3, [r4, #212] ; 0xd4
if (newTail == tty->rawOutBuf.Head) {
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
3c84: e3a05000 mov r5, #0
nToSend = 0;
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
3c88: e1530005 cmp r3, r5
if (newTail == tty->rawOutBuf.Head) {
/*
* Buffer has become empty
*/
tty->rawOutBufState = rob_idle;
3c8c: e5845094 str r5, [r4, #148] ; 0x94
nToSend = 0;
3c90: 01a05003 moveq r5, r3
/*
* check to see if snd wakeup callback was set
*/
if ( tty->tty_snd.sw_pfn != NULL) {
3c94: 0a000021 beq 3d20 <rtems_termios_refill_transmitter+0x1ac>
(*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg);
3c98: e2840030 add r0, r4, #48 ; 0x30 <== NOT EXECUTED
3c9c: e59410d8 ldr r1, [r4, #216] ; 0xd8 <== NOT EXECUTED
3ca0: e1a0e00f mov lr, pc <== NOT EXECUTED
3ca4: e12fff13 bx r3 <== NOT EXECUTED
3ca8: ea00001c b 3d20 <rtems_termios_refill_transmitter+0x1ac> <== NOT EXECUTED
}
}
/* check, whether output should stop due to received XOFF */
else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF))
3cac: e59430b8 ldr r3, [r4, #184] ; 0xb8
3cb0: e2033e21 and r3, r3, #528 ; 0x210
3cb4: e3530e21 cmp r3, #528 ; 0x210
3cb8: 1a000008 bne 3ce0 <rtems_termios_refill_transmitter+0x16c>
== (FL_MDXON | FL_ORCVXOF)) {
/* Buffer not empty, but output stops due to XOFF */
/* set flag, that output has been stopped */
rtems_interrupt_disable(level);
3cbc: ebffffa8 bl 3b64 <arm_interrupt_disable> <== NOT EXECUTED
tty->flow_ctrl |= FL_OSTOP;
3cc0: e59430b8 ldr r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
3cc4: e3833020 orr r3, r3, #32 <== NOT EXECUTED
3cc8: e58430b8 str r3, [r4, #184] ; 0xb8 <== NOT EXECUTED
tty->rawOutBufState = rob_busy; /*apm*/
3ccc: e3a03001 mov r3, #1 <== NOT EXECUTED
3cd0: e5843094 str r3, [r4, #148] ; 0x94 <== NOT EXECUTED
3cd4: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
rtems_interrupt_enable(level);
nToSend = 0;
3cd8: e3a05000 mov r5, #0 <== NOT EXECUTED
3cdc: ea00000f b 3d20 <rtems_termios_refill_transmitter+0x1ac> <== NOT EXECUTED
} else {
/*
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
3ce0: e5943080 ldr r3, [r4, #128] ; 0x80
3ce4: e1560003 cmp r6, r3
nToSend = tty->rawOutBuf.Size - newTail;
3ce8: 85945088 ldrhi r5, [r4, #136] ; 0x88
else
nToSend = tty->rawOutBuf.Head - newTail;
3cec: 95945080 ldrls r5, [r4, #128] ; 0x80
/* 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)) {
3cf0: e59430b8 ldr r3, [r4, #184] ; 0xb8
* Buffer not empty, start tranmitter
*/
if (newTail > tty->rawOutBuf.Head)
nToSend = tty->rawOutBuf.Size - newTail;
else
nToSend = tty->rawOutBuf.Head - newTail;
3cf4: e0665005 rsb r5, r6, r5
/* 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)) {
3cf8: e3130c06 tst r3, #1536 ; 0x600
nToSend = 1;
}
tty->rawOutBufState = rob_busy; /*apm*/
(*tty->device.write)(
3cfc: e594107c ldr r1, [r4, #124] ; 0x7c
nToSend = tty->rawOutBuf.Head - newTail;
/* 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)) {
nToSend = 1;
3d00: 13a05001 movne r5, #1
}
tty->rawOutBufState = rob_busy; /*apm*/
3d04: e3a03001 mov r3, #1
3d08: e5843094 str r3, [r4, #148] ; 0x94
(*tty->device.write)(
3d0c: e5940010 ldr r0, [r4, #16]
3d10: e0811006 add r1, r1, r6
3d14: e1a02005 mov r2, r5
3d18: e1a0e00f mov lr, pc
3d1c: e594f0a4 ldr pc, [r4, #164] ; 0xa4
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
3d20: e5846084 str r6, [r4, #132] ; 0x84
3d24: ea000000 b 3d2c <rtems_termios_refill_transmitter+0x1b8>
/*
* this should never happen...
*/
rtems_semaphore_release (tty->rawOutBuf.Semaphore);
}
return 0;
3d28: e3a05000 mov r5, #0
tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend);
}
tty->rawOutBuf.Tail = newTail; /*apm*/
}
return nToSend;
}
3d2c: e1a00005 mov r0, r5
3d30: e8bd8070 pop {r4, r5, r6, pc}
00004ea4 <rtems_termios_write>:
rtems_status_code
rtems_termios_write (void *arg)
{
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
4ea4: e5903000 ldr r3, [r0]
rtems_termios_puts (&c, 1, tty);
}
rtems_status_code
rtems_termios_write (void *arg)
{
4ea8: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
4eac: e593502c ldr r5, [r3, #44] ; 0x2c
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
4eb0: e3a01000 mov r1, #0
rtems_termios_puts (&c, 1, tty);
}
rtems_status_code
rtems_termios_write (void *arg)
{
4eb4: e1a04000 mov r4, r0
rtems_libio_rw_args_t *args = arg;
struct rtems_termios_tty *tty = args->iop->data1;
rtems_status_code sc;
sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
4eb8: e1a02001 mov r2, r1
4ebc: e5950018 ldr r0, [r5, #24]
4ec0: eb000437 bl 5fa4 <rtems_semaphore_obtain>
if (sc != RTEMS_SUCCESSFUL)
4ec4: e2506000 subs r6, r0, #0
4ec8: 1a000021 bne 4f54 <rtems_termios_write+0xb0>
return sc;
if (rtems_termios_linesw[tty->t_line].l_write != NULL) {
4ecc: e59520cc ldr r2, [r5, #204] ; 0xcc
4ed0: e59f3084 ldr r3, [pc, #132] ; 4f5c <rtems_termios_write+0xb8>
4ed4: e0833282 add r3, r3, r2, lsl #5
4ed8: e593300c ldr r3, [r3, #12]
4edc: e3530000 cmp r3, #0
4ee0: 0a000005 beq 4efc <rtems_termios_write+0x58>
sc = rtems_termios_linesw[tty->t_line].l_write(tty,args);
4ee4: e1a00005 mov r0, r5
4ee8: e1a01004 mov r1, r4
4eec: e1a0e00f mov lr, pc
4ef0: e12fff13 bx r3
4ef4: e1a06000 mov r6, r0
4ef8: ea000013 b 4f4c <rtems_termios_write+0xa8>
rtems_semaphore_release (tty->osem);
return sc;
}
if (tty->termios.c_oflag & OPOST) {
4efc: e5953034 ldr r3, [r5, #52] ; 0x34
4f00: e3130001 tst r3, #1
4f04: 0a00000a beq 4f34 <rtems_termios_write+0x90>
uint32_t count = args->count;
char *buffer = args->buffer;
4f08: e284800c add r8, r4, #12
4f0c: e8980500 ldm r8, {r8, sl}
while (count--)
4f10: e1a07006 mov r7, r6
4f14: ea000003 b 4f28 <rtems_termios_write+0x84>
oproc (*buffer++, tty);
4f18: e7d80007 ldrb r0, [r8, r7]
4f1c: e1a01005 mov r1, r5
4f20: ebfffe7b bl 4914 <oproc>
4f24: e2877001 add r7, r7, #1
return sc;
}
if (tty->termios.c_oflag & OPOST) {
uint32_t count = args->count;
char *buffer = args->buffer;
while (count--)
4f28: e157000a cmp r7, sl
4f2c: 1afffff9 bne 4f18 <rtems_termios_write+0x74>
4f30: ea000003 b 4f44 <rtems_termios_write+0xa0>
oproc (*buffer++, tty);
args->bytes_moved = args->count;
} else {
rtems_termios_puts (args->buffer, args->count, tty);
4f34: e284000c add r0, r4, #12 <== NOT EXECUTED
4f38: e8900003 ldm r0, {r0, r1} <== NOT EXECUTED
4f3c: e1a02005 mov r2, r5 <== NOT EXECUTED
4f40: ebfffe36 bl 4820 <rtems_termios_puts> <== NOT EXECUTED
args->bytes_moved = args->count;
4f44: e5943010 ldr r3, [r4, #16]
4f48: e5843018 str r3, [r4, #24]
}
rtems_semaphore_release (tty->osem);
4f4c: e5950018 ldr r0, [r5, #24]
4f50: eb00045a bl 60c0 <rtems_semaphore_release>
return sc;
}
4f54: e1a00006 mov r0, r6
4f58: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
00002128 <rtems_verror>:
{
int local_errno = 0;
int chars_written = 0;
rtems_status_code status;
if (error_flag & RTEMS_ERROR_PANIC) {
2128: e3100202 tst r0, #536870912 ; 0x20000000
static int rtems_verror(
rtems_error_code_t error_flag,
const char *printf_format,
va_list arglist
)
{
212c: e92d41f0 push {r4, r5, r6, r7, r8, lr}
2130: e1a05000 mov r5, r0
2134: e1a07001 mov r7, r1
2138: e1a04002 mov r4, r2
int local_errno = 0;
int chars_written = 0;
rtems_status_code status;
if (error_flag & RTEMS_ERROR_PANIC) {
213c: 0a00000d beq 2178 <rtems_verror+0x50>
if (rtems_panic_in_progress++)
2140: e59f3124 ldr r3, [pc, #292] ; 226c <rtems_verror+0x144>
2144: e5932000 ldr r2, [r3]
2148: e2821001 add r1, r2, #1
214c: e3520000 cmp r2, #0
2150: e5831000 str r1, [r3]
2154: 0a000003 beq 2168 <rtems_verror+0x40>
*
* This rountine increments the thread dispatch level
*/
RTEMS_INLINE_ROUTINE uint32_t _Thread_Dispatch_increment_disable_level(void)
{
uint32_t level = _Thread_Dispatch_disable_level;
2158: e59f2110 ldr r2, [pc, #272] ; 2270 <rtems_verror+0x148> <== NOT EXECUTED
215c: e5921000 ldr r1, [r2] <== NOT EXECUTED
++level;
2160: e2811001 add r1, r1, #1 <== NOT EXECUTED
_Thread_Dispatch_disable_level = level;
2164: e5821000 str r1, [r2] <== NOT EXECUTED
_Thread_Disable_dispatch(); /* disable task switches */
/* don't aggravate things */
if (rtems_panic_in_progress > 2)
2168: e5933000 ldr r3, [r3]
216c: e3530002 cmp r3, #2
return 0;
2170: c3a04000 movgt r4, #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)
2174: ca00003a bgt 2264 <rtems_verror+0x13c>
return 0;
}
(void) fflush(stdout); /* in case stdout/stderr same */
2178: e59f80f4 ldr r8, [pc, #244] ; 2274 <rtems_verror+0x14c>
217c: e5983000 ldr r3, [r8]
2180: e5930008 ldr r0, [r3, #8]
2184: eb002e67 bl db28 <fflush>
status = error_flag & ~RTEMS_ERROR_MASK;
2188: e3c56207 bic r6, r5, #1879048192 ; 0x70000000
if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
218c: e2155101 ands r5, r5, #1073741824 ; 0x40000000
2190: 0a000001 beq 219c <rtems_verror+0x74>
local_errno = errno;
2194: eb002d66 bl d734 <__errno>
2198: e5905000 ldr r5, [r0]
#if defined(RTEMS_MULTIPROCESSING)
if (_System_state_Is_multiprocessing)
fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node);
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
219c: e5983000 ldr r3, [r8]
21a0: e1a02004 mov r2, r4
21a4: e593000c ldr r0, [r3, #12]
21a8: e1a01007 mov r1, r7
21ac: eb00432e bl 12e6c <vfprintf>
if (status)
21b0: e3560000 cmp r6, #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);
21b4: e1a04000 mov r4, r0
if (status)
21b8: 0a000009 beq 21e4 <rtems_verror+0xbc>
chars_written +=
fprintf(stderr, " (status: %s)", rtems_status_text(status));
21bc: e59f30b0 ldr r3, [pc, #176] ; 2274 <rtems_verror+0x14c>
21c0: e5933000 ldr r3, [r3]
21c4: e1a00006 mov r0, r6
21c8: e593700c ldr r7, [r3, #12]
21cc: ebffffd1 bl 2118 <rtems_status_text>
21d0: e59f10a0 ldr r1, [pc, #160] ; 2278 <rtems_verror+0x150>
21d4: e1a02000 mov r2, r0
21d8: e1a00007 mov r0, r7
21dc: eb002f3e bl dedc <fprintf>
#endif
chars_written += vfprintf(stderr, printf_format, arglist);
if (status)
chars_written +=
21e0: e0844000 add r4, r4, r0
fprintf(stderr, " (status: %s)", rtems_status_text(status));
if (local_errno) {
21e4: e3550000 cmp r5, #0
21e8: 0a000014 beq 2240 <rtems_verror+0x118>
21ec: e59f6080 ldr r6, [pc, #128] ; 2274 <rtems_verror+0x14c>
if ((local_errno > 0) && *strerror(local_errno))
21f0: da00000c ble 2228 <rtems_verror+0x100>
21f4: e1a00005 mov r0, r5
21f8: eb003302 bl ee08 <strerror>
21fc: e5d03000 ldrb r3, [r0]
2200: e3530000 cmp r3, #0
2204: 0a000007 beq 2228 <rtems_verror+0x100>
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
2208: e5963000 ldr r3, [r6]
220c: e1a00005 mov r0, r5
2210: e593600c ldr r6, [r3, #12]
2214: eb0032fb bl ee08 <strerror>
2218: e59f105c ldr r1, [pc, #92] ; 227c <rtems_verror+0x154>
221c: e1a02000 mov r2, r0
2220: e1a00006 mov r0, r6
2224: ea000003 b 2238 <rtems_verror+0x110>
else
chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
2228: e5963000 ldr r3, [r6]
222c: e59f104c ldr r1, [pc, #76] ; 2280 <rtems_verror+0x158>
2230: e593000c ldr r0, [r3, #12]
2234: e1a02005 mov r2, r5
2238: eb002f27 bl dedc <fprintf>
223c: e0844000 add r4, r4, r0
}
chars_written += fprintf(stderr, "\n");
2240: e59f502c ldr r5, [pc, #44] ; 2274 <rtems_verror+0x14c>
2244: e5953000 ldr r3, [r5]
2248: e59f1034 ldr r1, [pc, #52] ; 2284 <rtems_verror+0x15c>
224c: e593000c ldr r0, [r3, #12]
2250: eb002f21 bl dedc <fprintf>
(void) fflush(stderr);
2254: e5953000 ldr r3, [r5]
chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
else
chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
}
chars_written += fprintf(stderr, "\n");
2258: e0844000 add r4, r4, r0
(void) fflush(stderr);
225c: e593000c ldr r0, [r3, #12]
2260: eb002e30 bl db28 <fflush>
return chars_written;
}
2264: e1a00004 mov r0, r4
2268: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
000206e4 <scanInt>:
/**
* Extract an integer value from the database
*/
static int
scanInt(FILE *fp, int *val)
{
206e4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
int sign = 0;
206e8: e3a04000 mov r4, #0
int d;
for (;;) {
c = getc(fp);
206ec: e59fb0dc ldr fp, [pc, #220] ; 207d0 <scanInt+0xec>
limit++;
continue;
}
sign = 1;
}
if (!isdigit(c))
206f0: e59f90dc ldr r9, [pc, #220] ; 207d4 <scanInt+0xf0>
/**
* Extract an integer value from the database
*/
static int
scanInt(FILE *fp, int *val)
{
206f4: e1a05000 mov r5, r0
206f8: e1a0a001 mov sl, r1
int c;
unsigned int i = 0;
unsigned int limit = INT_MAX;
206fc: e3e08102 mvn r8, #-2147483648 ; 0x80000000
*/
static int
scanInt(FILE *fp, int *val)
{
int c;
unsigned int i = 0;
20700: e1a07004 mov r7, r4
unsigned int limit = INT_MAX;
int sign = 0;
int d;
for (;;) {
c = getc(fp);
20704: e5953004 ldr r3, [r5, #4]
20708: e2433001 sub r3, r3, #1
2070c: e3530000 cmp r3, #0
20710: e5853004 str r3, [r5, #4]
20714: a5953000 ldrge r3, [r5]
20718: a4d36001 ldrbge r6, [r3], #1
2071c: a5853000 strge r3, [r5]
20720: aa000003 bge 20734 <scanInt+0x50>
20724: e59b0000 ldr r0, [fp] <== NOT EXECUTED
20728: e1a01005 mov r1, r5 <== NOT EXECUTED
2072c: eb005a2d bl 36fe8 <__srget_r> <== NOT EXECUTED
20730: e1a06000 mov r6, r0 <== NOT EXECUTED
if (c == ':')
20734: e356003a cmp r6, #58 ; 0x3a
20738: 0a00001a beq 207a8 <scanInt+0xc4>
break;
if (sign == 0) {
2073c: e3540000 cmp r4, #0
20740: 1a000004 bne 20758 <scanInt+0x74>
if (c == '-') {
20744: e356002d cmp r6, #45 ; 0x2d
sign = -1;
limit++;
20748: 02888001 addeq r8, r8, #1
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
sign = -1;
2074c: 03e04000 mvneq r4, #0
for (;;) {
c = getc(fp);
if (c == ':')
break;
if (sign == 0) {
if (c == '-') {
20750: 0affffeb beq 20704 <scanInt+0x20>
sign = -1;
limit++;
continue;
}
sign = 1;
20754: e3a04001 mov r4, #1
}
if (!isdigit(c))
20758: e5993000 ldr r3, [r9]
2075c: e0833006 add r3, r3, r6
20760: e5d30001 ldrb r0, [r3, #1]
20764: e2100004 ands r0, r0, #4
20768: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
return 0;
d = c - '0';
if ((i > (limit / 10))
2076c: e1a00008 mov r0, r8
20770: e3a0100a mov r1, #10
20774: eb00a82a bl 4a824 <__aeabi_uidiv>
20778: e1570000 cmp r7, r0
2077c: 8a00000f bhi 207c0 <scanInt+0xdc>
}
sign = 1;
}
if (!isdigit(c))
return 0;
d = c - '0';
20780: e2466030 sub r6, r6, #48 ; 0x30
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
20784: 1a000004 bne 2079c <scanInt+0xb8>
20788: e1a00008 mov r0, r8
2078c: e3a0100a mov r1, #10
20790: eb00a8bb bl 4aa84 <__umodsi3>
20794: e1560000 cmp r6, r0
20798: 8a000008 bhi 207c0 <scanInt+0xdc>
return 0;
i = i * 10 + d;
2079c: e3a0300a mov r3, #10
207a0: e0276793 mla r7, r3, r7, r6
207a4: eaffffd6 b 20704 <scanInt+0x20>
}
if (sign == 0)
207a8: e3540000 cmp r4, #0
return 0;
*val = i * sign;
207ac: 10040497 mulne r4, r7, r4
return 1;
207b0: 13a00001 movne r0, #1
return 0;
i = i * 10 + d;
}
if (sign == 0)
return 0;
*val = i * sign;
207b4: 158a4000 strne r4, [sl]
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
i = i * 10 + d;
}
if (sign == 0)
207b8: 18bd8ff0 popne {r4, r5, r6, r7, r8, r9, sl, fp, pc}
207bc: ea000001 b 207c8 <scanInt+0xe4> <== NOT EXECUTED
if (!isdigit(c))
return 0;
d = c - '0';
if ((i > (limit / 10))
|| ((i == (limit / 10)) && (d > (limit % 10))))
return 0;
207c0: e3a00000 mov r0, #0
207c4: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
i = i * 10 + d;
}
if (sign == 0)
return 0;
207c8: e1a00004 mov r0, r4 <== NOT EXECUTED
*val = i * sign;
return 1;
}
207cc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
00006620 <sigaction>:
struct sigaction *oact
)
{
ISR_Level level;
if ( oact )
6620: e2523000 subs r3, r2, #0
*oact = _POSIX_signals_Vectors[ sig ];
6624: 159f20b4 ldrne r2, [pc, #180] ; 66e0 <sigaction+0xc0>
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
6628: e92d41f0 push {r4, r5, r6, r7, r8, lr}
662c: e1a05001 mov r5, r1
ISR_Level level;
if ( oact )
*oact = _POSIX_signals_Vectors[ sig ];
6630: 13a0100c movne r1, #12
6634: 10222091 mlane r2, r1, r0, r2
int sigaction(
int sig,
const struct sigaction *act,
struct sigaction *oact
)
{
6638: e1a04000 mov r4, r0
ISR_Level level;
if ( oact )
*oact = _POSIX_signals_Vectors[ sig ];
663c: 18920007 ldmne r2, {r0, r1, r2}
6640: 18830007 stmne r3, {r0, r1, r2}
if ( !sig )
6644: e3540000 cmp r4, #0
6648: 0a000004 beq 6660 <sigaction+0x40>
static inline bool is_valid_signo(
int signo
)
{
return ((signo) >= 1 && (signo) <= 32 );
664c: e2443001 sub r3, r4, #1
rtems_set_errno_and_return_minus_one( EINVAL );
if ( !is_valid_signo(sig) )
6650: e353001f cmp r3, #31
6654: 8a000001 bhi 6660 <sigaction+0x40>
*
* NOTE: Solaris documentation claims to "silently enforce" this which
* contradicts the POSIX specification.
*/
if ( sig == SIGKILL )
6658: e3540009 cmp r4, #9
665c: 1a000004 bne 6674 <sigaction+0x54>
rtems_set_errno_and_return_minus_one( EINVAL );
6660: eb002032 bl e730 <__errno>
6664: e3a03016 mov r3, #22
6668: e5803000 str r3, [r0]
666c: e3e00000 mvn r0, #0
6670: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
/*
* Evaluate the new action structure and set the global signal vector
* appropriately.
*/
if ( act ) {
6674: e3550000 cmp r5, #0
6678: 0a000016 beq 66d8 <sigaction+0xb8>
uint32_t level;
#if defined(ARM_MULTILIB_ARCH_V4)
uint32_t arm_switch_reg;
__asm__ volatile (
667c: e10f6000 mrs r6, CPSR
6680: e3863080 orr r3, r6, #128 ; 0x80
6684: e129f003 msr CPSR_fc, r3
* Unless the user is installing the default signal actions, then
* we can just copy the provided sigaction structure into the vectors.
*/
_ISR_Disable( level );
if ( act->sa_handler == SIG_DFL ) {
6688: e5953008 ldr r3, [r5, #8]
668c: e3530000 cmp r3, #0
6690: e59f7048 ldr r7, [pc, #72] ; 66e0 <sigaction+0xc0>
6694: e3a0800c mov r8, #12
6698: 1a000006 bne 66b8 <sigaction+0x98>
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
669c: e0040498 mul r4, r8, r4
66a0: e59f803c ldr r8, [pc, #60] ; 66e4 <sigaction+0xc4>
66a4: e0873004 add r3, r7, r4
66a8: e0884004 add r4, r8, r4
66ac: e8940007 ldm r4, {r0, r1, r2}
66b0: e8830007 stm r3, {r0, r1, r2}
66b4: ea000004 b 66cc <sigaction+0xac>
} else {
_POSIX_signals_Clear_process_signals( sig );
66b8: e1a00004 mov r0, r4
_POSIX_signals_Vectors[ sig ] = *act;
66bc: e0247498 mla r4, r8, r4, r7
_ISR_Disable( level );
if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else {
_POSIX_signals_Clear_process_signals( sig );
66c0: eb00156f bl bc84 <_POSIX_signals_Clear_process_signals>
_POSIX_signals_Vectors[ sig ] = *act;
66c4: e8950007 ldm r5, {r0, r1, r2}
66c8: e8840007 stm r4, {r0, r1, r2}
static inline void arm_interrupt_enable( uint32_t level )
{
#if defined(ARM_MULTILIB_ARCH_V4)
ARM_SWITCH_REGISTERS;
__asm__ volatile (
66cc: e129f006 msr CPSR_fc, r6
* 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;
66d0: e3a00000 mov r0, #0
66d4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
66d8: e1a00005 mov r0, r5 <== NOT EXECUTED
}
66dc: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
00008a28 <sigwait>:
int sigwait(
const sigset_t *set,
int *sig
)
{
8a28: e92d4010 push {r4, lr}
8a2c: e1a04001 mov r4, r1
int status;
status = sigtimedwait( set, NULL, NULL );
8a30: e3a01000 mov r1, #0
8a34: e1a02001 mov r2, r1
8a38: ebffff86 bl 8858 <sigtimedwait>
if ( status != -1 ) {
8a3c: e3700001 cmn r0, #1
8a40: 0a000004 beq 8a58 <sigwait+0x30>
if ( sig )
8a44: e3540000 cmp r4, #0
*sig = status;
8a48: 15840000 strne r0, [r4]
return 0;
8a4c: 13a00000 movne r0, #0
int status;
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
8a50: 18bd8010 popne {r4, pc}
8a54: ea000002 b 8a64 <sigwait+0x3c> <== NOT EXECUTED
*sig = status;
return 0;
}
return errno;
8a58: eb001f78 bl 10840 <__errno>
8a5c: e5900000 ldr r0, [r0]
8a60: e8bd8010 pop {r4, pc}
status = sigtimedwait( set, NULL, NULL );
if ( status != -1 ) {
if ( sig )
*sig = status;
return 0;
8a64: e1a00004 mov r0, r4 <== NOT EXECUTED
}
return errno;
}
8a68: e8bd8010 pop {r4, pc} <== NOT EXECUTED
00004e48 <siproc>:
int i;
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
4e48: e591203c ldr r2, [r1, #60] ; 0x3c
4e4c: e59f304c ldr r3, [pc, #76] ; 4ea0 <siproc+0x58>
4e50: e0023003 and r3, r2, r3
4e54: e3530000 cmp r3, #0
/*
* Process input character, with semaphore.
*/
static int
siproc (unsigned char c, struct rtems_termios_tty *tty)
{
4e58: e92d4030 push {r4, r5, lr}
4e5c: e1a04001 mov r4, r1
4e60: e1a05000 mov r5, r0
int i;
/*
* Obtain output semaphore if character will be echoed
*/
if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) {
4e64: 0a00000b beq 4e98 <siproc+0x50>
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
4e68: e5910018 ldr r0, [r1, #24]
4e6c: e3a01000 mov r1, #0
4e70: e1a02001 mov r2, r1
4e74: eb00044a bl 5fa4 <rtems_semaphore_obtain>
i = iproc (c, tty);
4e78: e1a01004 mov r1, r4
4e7c: e1a00005 mov r0, r5
4e80: ebffff8b bl 4cb4 <iproc>
4e84: e1a05000 mov r5, r0
rtems_semaphore_release (tty->osem);
4e88: e5940018 ldr r0, [r4, #24]
4e8c: eb00048b bl 60c0 <rtems_semaphore_release>
}
else {
i = iproc (c, tty);
}
return i;
}
4e90: e1a00005 mov r0, r5
4e94: e8bd8030 pop {r4, r5, pc}
4e98: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
i = iproc (c, tty);
rtems_semaphore_release (tty->osem);
}
else {
i = iproc (c, tty);
4e9c: eaffff84 b 4cb4 <iproc> <== NOT EXECUTED
0000ce0c <sparse_disk_ioctl>:
/*
* ioctl handler to be passed to the block device handler
*/
static int sparse_disk_ioctl( rtems_disk_device *dd, uint32_t req, void *argp )
{
ce0c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_status_code sc;
rtems_sparse_disk *sd = rtems_disk_get_driver_data( dd );
if ( RTEMS_BLKIO_REQUEST == req ) {
ce10: e59fc244 ldr ip, [pc, #580] ; d05c <sparse_disk_ioctl+0x250>
ce14: e151000c cmp r1, ip
/*
* ioctl handler to be passed to the block device handler
*/
static int sparse_disk_ioctl( rtems_disk_device *dd, uint32_t req, void *argp )
{
ce18: e24dd018 sub sp, sp, #24
ce1c: e1a05002 mov r5, r2
static inline void *rtems_disk_get_driver_data(
const rtems_disk_device *dd
)
{
return dd->driver_data;
ce20: e590403c ldr r4, [r0, #60] ; 0x3c
rtems_status_code sc;
rtems_sparse_disk *sd = rtems_disk_get_driver_data( dd );
if ( RTEMS_BLKIO_REQUEST == req ) {
ce24: 1a000072 bne cff4 <sparse_disk_ioctl+0x1e8>
rtems_blkdev_request *r = argp;
switch ( r->req ) {
ce28: e5921000 ldr r1, [r2]
ce2c: e3510001 cmp r1, #1
ce30: e58d1004 str r1, [sp, #4]
ce34: 8a000082 bhi d044 <sparse_disk_ioctl+0x238>
rtems_blkdev_bnum block;
uint8_t *buff;
size_t buff_size;
unsigned int bytes_handled;
rtems_semaphore_obtain( sparse_disk->mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
ce38: e3a01000 mov r1, #0
ce3c: e5940000 ldr r0, [r4]
ce40: e1a02001 mov r2, r1
static int sparse_disk_read_write(
rtems_sparse_disk *sparse_disk,
rtems_blkdev_request *req,
const bool read )
{
int rv = 0;
ce44: e3a0b000 mov fp, #0
rtems_blkdev_bnum block;
uint8_t *buff;
size_t buff_size;
unsigned int bytes_handled;
rtems_semaphore_obtain( sparse_disk->mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
ce48: ebffec8c bl 8080 <rtems_semaphore_obtain>
for ( req_buffer = 0;
ce4c: e1a0900b mov r9, fp
ce50: ea000059 b cfbc <sparse_disk_ioctl+0x1b0>
( 0 <= rv ) && ( req_buffer < req->bufnum );
++req_buffer ) {
scatter_gather = &req->bufs[req_buffer];
ce54: e1a02209 lsl r2, r9, #4
ce58: e2822018 add r2, r2, #24
ce5c: e0853002 add r3, r5, r2
bytes_handled = 0;
buff = (uint8_t *) scatter_gather->buffer;
ce60: e5931008 ldr r1, [r3, #8]
ce64: e58d900c str r9, [sp, #12]
ce68: e58d1008 str r1, [sp, #8]
block = scatter_gather->block;
ce6c: e7957002 ldr r7, [r5, r2]
buff_size = scatter_gather->length;
ce70: e5936004 ldr r6, [r3, #4]
for ( req_buffer = 0;
( 0 <= rv ) && ( req_buffer < req->bufnum );
++req_buffer ) {
scatter_gather = &req->bufs[req_buffer];
bytes_handled = 0;
ce74: e3a0a000 mov sl, #0
ce78: e1a09005 mov r9, r5
ce7c: ea000043 b cf90 <sparse_disk_ioctl+0x184>
buff = (uint8_t *) scatter_gather->buffer;
block = scatter_gather->block;
buff_size = scatter_gather->length;
while ( ( 0 <= rv ) && ( 0 < buff_size ) ) {
if ( read )
ce80: e59d3004 ldr r3, [sp, #4]
ce84: e59d1008 ldr r1, [sp, #8]
ce88: e3530000 cmp r3, #0
ce8c: e081500a add r5, r1, sl
const rtems_blkdev_bnum block,
uint8_t *buffer,
const size_t buffer_size )
{
rtems_sparse_disk_key *key;
rtems_sparse_disk_key block_key = {
ce90: e58d7010 str r7, [sp, #16]
buff = (uint8_t *) scatter_gather->buffer;
block = scatter_gather->block;
buff_size = scatter_gather->length;
while ( ( 0 <= rv ) && ( 0 < buff_size ) ) {
if ( read )
ce94: 1a000012 bne cee4 <sparse_disk_ioctl+0xd8>
const rtems_blkdev_bnum block,
uint8_t *buffer,
const size_t buffer_size )
{
rtems_sparse_disk_key *key;
rtems_sparse_disk_key block_key = {
ce98: e58d3014 str r3, [sp, #20]
size_t bytes_to_copy = sparse_disk->media_block_size;
if ( buffer_size < bytes_to_copy )
bytes_to_copy = buffer_size;
key = bsearch(
ce9c: e59f31bc ldr r3, [pc, #444] ; d060 <sparse_disk_ioctl+0x254>
rtems_sparse_disk_key *key;
rtems_sparse_disk_key block_key = {
.block = block,
.data = NULL
};
size_t bytes_to_copy = sparse_disk->media_block_size;
cea0: e594b00c ldr fp, [r4, #12]
if ( buffer_size < bytes_to_copy )
bytes_to_copy = buffer_size;
key = bsearch(
cea4: e58d3000 str r3, [sp]
cea8: e28d0010 add r0, sp, #16
ceac: e5941018 ldr r1, [r4, #24]
ceb0: e3a03008 mov r3, #8
ceb4: e5942008 ldr r2, [r4, #8]
ceb8: eb002e4b bl 187ec <bsearch>
rtems_sparse_disk_key *key;
rtems_sparse_disk_key block_key = {
.block = block,
.data = NULL
};
size_t bytes_to_copy = sparse_disk->media_block_size;
cebc: e156000b cmp r6, fp
cec0: 31a0b006 movcc fp, r6
sparse_disk->used_count,
sizeof( rtems_sparse_disk_key ),
sparse_disk_compare
);
if ( NULL != key )
cec4: e2503000 subs r3, r0, #0
memcpy( buffer, key->data, bytes_to_copy );
cec8: 15931004 ldrne r1, [r3, #4]
cecc: e1a00005 mov r0, r5
sparse_disk->used_count,
sizeof( rtems_sparse_disk_key ),
sparse_disk_compare
);
if ( NULL != key )
ced0: 1a000029 bne cf7c <sparse_disk_ioctl+0x170>
memcpy( buffer, key->data, bytes_to_copy );
else
memset( buffer, sparse_disk->fill_pattern, buffer_size );
ced4: e5d41014 ldrb r1, [r4, #20]
ced8: e1a02006 mov r2, r6
cedc: eb00313e bl 193dc <memset>
cee0: ea000027 b cf84 <sparse_disk_ioctl+0x178>
/* we only need to write the block if it is different from the fill pattern.
* If the read method does not find a block it will deliver the fill pattern anyway.
*/
key = bsearch(
cee4: e59f3174 ldr r3, [pc, #372] ; d060 <sparse_disk_ioctl+0x254>
const size_t buffer_size )
{
unsigned int i;
bool block_needs_writing = false;
rtems_sparse_disk_key *key;
rtems_sparse_disk_key block_key = {
cee8: e3a01000 mov r1, #0
.block = block,
.data = NULL
};
size_t bytes_to_copy = sparse_disk->media_block_size;
ceec: e594b00c ldr fp, [r4, #12]
const size_t buffer_size )
{
unsigned int i;
bool block_needs_writing = false;
rtems_sparse_disk_key *key;
rtems_sparse_disk_key block_key = {
cef0: e58d1014 str r1, [sp, #20]
/* we only need to write the block if it is different from the fill pattern.
* If the read method does not find a block it will deliver the fill pattern anyway.
*/
key = bsearch(
cef4: e58d3000 str r3, [sp]
cef8: e28d0010 add r0, sp, #16
cefc: e5941018 ldr r1, [r4, #24]
cf00: e5942008 ldr r2, [r4, #8]
cf04: e3a03008 mov r3, #8
cf08: eb002e37 bl 187ec <bsearch>
rtems_sparse_disk_key *key;
rtems_sparse_disk_key block_key = {
.block = block,
.data = NULL
};
size_t bytes_to_copy = sparse_disk->media_block_size;
cf0c: e156000b cmp r6, fp
cf10: 31a0b006 movcc fp, r6
sparse_disk->used_count,
sizeof( rtems_sparse_disk_key ),
sparse_disk_compare
);
if ( NULL == key ) {
cf14: e2508000 subs r8, r0, #0
cf18: 1a000015 bne cf74 <sparse_disk_ioctl+0x168>
cf1c: ea000004 b cf34 <sparse_disk_ioctl+0x128>
for ( i = 0; ( !block_needs_writing ) && ( i < bytes_to_copy ); ++i ) {
if ( buffer[i] != sparse_disk->fill_pattern )
cf20: e7d53008 ldrb r3, [r5, r8]
sizeof( rtems_sparse_disk_key ),
sparse_disk_compare
);
if ( NULL == key ) {
for ( i = 0; ( !block_needs_writing ) && ( i < bytes_to_copy ); ++i ) {
cf24: e5d42014 ldrb r2, [r4, #20]
cf28: e1520003 cmp r2, r3
cf2c: e2888001 add r8, r8, #1
cf30: 1a000002 bne cf40 <sparse_disk_ioctl+0x134>
cf34: e158000b cmp r8, fp
cf38: 1afffff8 bne cf20 <sparse_disk_ioctl+0x114>
cf3c: ea000010 b cf84 <sparse_disk_ioctl+0x178>
rtems_sparse_disk *sparse_disk,
const rtems_blkdev_bnum block )
{
rtems_sparse_disk_key *key;
if ( sparse_disk->used_count < sparse_disk->blocks_with_buffer ) {
cf40: e5941008 ldr r1, [r4, #8]
cf44: e5943004 ldr r3, [r4, #4]
cf48: e1510003 cmp r1, r3
}
if ( NULL != key )
memcpy( key->data, buffer, bytes_to_copy );
else if ( block_needs_writing )
return -1;
cf4c: 23e0b000 mvncs fp, #0
rtems_sparse_disk *sparse_disk,
const rtems_blkdev_bnum block )
{
rtems_sparse_disk_key *key;
if ( sparse_disk->used_count < sparse_disk->blocks_with_buffer ) {
cf50: 2a00000b bcs cf84 <sparse_disk_ioctl+0x178>
key = &sparse_disk->key_table[sparse_disk->used_count];
cf54: e5940018 ldr r0, [r4, #24]
key->block = block;
cf58: e7807181 str r7, [r0, r1, lsl #3]
const rtems_blkdev_bnum block )
{
rtems_sparse_disk_key *key;
if ( sparse_disk->used_count < sparse_disk->blocks_with_buffer ) {
key = &sparse_disk->key_table[sparse_disk->used_count];
cf5c: e0808181 add r8, r0, r1, lsl #3
key->block = block;
++sparse_disk->used_count;
cf60: e2811001 add r1, r1, #1
cf64: e5841008 str r1, [r4, #8]
qsort( sparse_disk->key_table, sparse_disk->used_count,
cf68: e3a02008 mov r2, #8
cf6c: e59f30ec ldr r3, [pc, #236] ; d060 <sparse_disk_ioctl+0x254>
cf70: eb003155 bl 194cc <qsort>
key = sparse_disk_get_new_block( sparse_disk, block );
}
}
if ( NULL != key )
memcpy( key->data, buffer, bytes_to_copy );
cf74: e5980004 ldr r0, [r8, #4]
cf78: e1a01005 mov r1, r5
cf7c: e1a0200b mov r2, fp
cf80: eb0030df bl 19304 <memcpy>
rv = sparse_disk_write_block( sparse_disk,
block,
&buff[bytes_handled],
buff_size );
++block;
cf84: e2877001 add r7, r7, #1
bytes_handled += rv;
cf88: e08aa00b add sl, sl, fp
buff_size -= rv;
cf8c: e06b6006 rsb r6, fp, r6
bytes_handled = 0;
buff = (uint8_t *) scatter_gather->buffer;
block = scatter_gather->block;
buff_size = scatter_gather->length;
while ( ( 0 <= rv ) && ( 0 < buff_size ) ) {
cf90: e2963000 adds r3, r6, #0
cf94: 13a03001 movne r3, #1
cf98: e35b0000 cmp fp, #0
cf9c: b3a03000 movlt r3, #0
cfa0: e3530000 cmp r3, #0
cfa4: 1affffb5 bne ce80 <sparse_disk_ioctl+0x74>
cfa8: e1a05009 mov r5, r9
cfac: e59d900c ldr r9, [sp, #12]
size_t buff_size;
unsigned int bytes_handled;
rtems_semaphore_obtain( sparse_disk->mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
for ( req_buffer = 0;
cfb0: e35b0000 cmp fp, #0
( 0 <= rv ) && ( req_buffer < req->bufnum );
++req_buffer ) {
cfb4: e2899001 add r9, r9, #1
size_t buff_size;
unsigned int bytes_handled;
rtems_semaphore_obtain( sparse_disk->mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
for ( req_buffer = 0;
cfb8: ba000002 blt cfc8 <sparse_disk_ioctl+0x1bc>
( 0 <= rv ) && ( req_buffer < req->bufnum );
cfbc: e5953010 ldr r3, [r5, #16]
cfc0: e1590003 cmp r9, r3
cfc4: 3affffa2 bcc ce54 <sparse_disk_ioctl+0x48>
bytes_handled += rv;
buff_size -= rv;
}
}
rtems_semaphore_release( sparse_disk->mutex );
cfc8: e5940000 ldr r0, [r4]
cfcc: ebffec72 bl 819c <rtems_semaphore_release>
if ( 0 > rv )
cfd0: e35b0000 cmp fp, #0
static inline void rtems_blkdev_request_done(
rtems_blkdev_request *req,
rtems_status_code status
)
{
(*req->done)(req, status);
cfd4: e1a00005 mov r0, r5
cfd8: e5953004 ldr r3, [r5, #4]
cfdc: b3a0101b movlt r1, #27
cfe0: a3a01000 movge r1, #0
cfe4: e1a0e00f mov lr, pc
cfe8: e12fff13 bx r3
rtems_blkdev_request *r = argp;
switch ( r->req ) {
case RTEMS_BLKDEV_REQ_READ:
case RTEMS_BLKDEV_REQ_WRITE:
return sparse_disk_read_write( sd, r, r->req == RTEMS_BLKDEV_REQ_READ );
cfec: e3a00000 mov r0, #0
cff0: ea000017 b d054 <sparse_disk_ioctl+0x248>
default:
break;
}
} else if ( RTEMS_BLKIO_DELETED == req ) {
cff4: e59fc068 ldr ip, [pc, #104] ; d064 <sparse_disk_ioctl+0x258>
cff8: e151000c cmp r1, ip
cffc: 1a00000e bne d03c <sparse_disk_ioctl+0x230>
sc = rtems_semaphore_delete( sd->mutex );
d000: e5940000 ldr r0, [r4]
d004: ebffebf6 bl 7fe4 <rtems_semaphore_delete>
if ( RTEMS_SUCCESSFUL != sc )
d008: e2505000 subs r5, r0, #0
rtems_fatal_error_occurred( 0xdeadbeef );
d00c: 159f0054 ldrne r0, [pc, #84] ; d068 <sparse_disk_ioctl+0x25c>
d010: 1bffedf2 blne 87e0 <rtems_fatal_error_occurred>
sd->mutex = RTEMS_ID_NONE;
if ( NULL != sd->delete_handler )
d014: e5943010 ldr r3, [r4, #16]
d018: e3530000 cmp r3, #0
sc = rtems_semaphore_delete( sd->mutex );
if ( RTEMS_SUCCESSFUL != sc )
rtems_fatal_error_occurred( 0xdeadbeef );
sd->mutex = RTEMS_ID_NONE;
d01c: e5845000 str r5, [r4]
if ( NULL != sd->delete_handler )
( *sd->delete_handler )( sd );
return 0;
d020: 01a00003 moveq r0, r3
if ( RTEMS_SUCCESSFUL != sc )
rtems_fatal_error_occurred( 0xdeadbeef );
sd->mutex = RTEMS_ID_NONE;
if ( NULL != sd->delete_handler )
d024: 0a00000a beq d054 <sparse_disk_ioctl+0x248>
( *sd->delete_handler )( sd );
d028: e1a00004 mov r0, r4
d02c: e1a0e00f mov lr, pc
d030: e12fff13 bx r3
return 0;
d034: e1a00005 mov r0, r5
d038: ea000005 b d054 <sparse_disk_ioctl+0x248>
} else {
return rtems_blkdev_ioctl( dd, req, argp );
d03c: eb000a94 bl fa94 <rtems_blkdev_ioctl>
d040: ea000003 b d054 <sparse_disk_ioctl+0x248>
}
errno = EINVAL;
d044: eb002e07 bl 18868 <__errno> <== NOT EXECUTED
d048: e3a03016 mov r3, #22 <== NOT EXECUTED
d04c: e5803000 str r3, [r0] <== NOT EXECUTED
return -1;
d050: e3e00000 mvn r0, #0 <== NOT EXECUTED
}
d054: e28dd018 add sp, sp, #24
d058: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
0000594c <sysconf>:
long sysconf(
int name
)
{
if ( name == _SC_CLK_TCK )
594c: e3500002 cmp r0, #2
*/
long sysconf(
int name
)
{
5950: e52de004 push {lr} ; (str lr, [sp, #-4]!)
if ( name == _SC_CLK_TCK )
5954: 1a000004 bne 596c <sysconf+0x20>
return (TOD_MICROSECONDS_PER_SECOND /
5958: e59f3058 ldr r3, [pc, #88] ; 59b8 <sysconf+0x6c>
595c: e59f0058 ldr r0, [pc, #88] ; 59bc <sysconf+0x70>
5960: e593100c ldr r1, [r3, #12]
5964: eb00442b bl 16a18 <__aeabi_uidiv>
5968: e49df004 pop {pc} ; (ldr pc, [sp], #4)
rtems_configuration_get_microseconds_per_tick());
if ( name == _SC_OPEN_MAX )
596c: e3500004 cmp r0, #4
return rtems_libio_number_iops;
5970: 059f3048 ldreq r3, [pc, #72] ; 59c0 <sysconf+0x74>
5974: 05930000 ldreq r0, [r3]
{
if ( name == _SC_CLK_TCK )
return (TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick());
if ( name == _SC_OPEN_MAX )
5978: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
return rtems_libio_number_iops;
if ( name == _SC_GETPW_R_SIZE_MAX )
597c: e3500033 cmp r0, #51 ; 0x33
return 1024;
5980: 03a00b01 moveq r0, #1024 ; 0x400
rtems_configuration_get_microseconds_per_tick());
if ( name == _SC_OPEN_MAX )
return rtems_libio_number_iops;
if ( name == _SC_GETPW_R_SIZE_MAX )
5984: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
return 1024;
if ( name == _SC_PAGESIZE )
5988: e3500008 cmp r0, #8
return PAGE_SIZE;
598c: 03a00a01 moveq r0, #4096 ; 0x1000
return rtems_libio_number_iops;
if ( name == _SC_GETPW_R_SIZE_MAX )
return 1024;
if ( name == _SC_PAGESIZE )
5990: 049df004 popeq {pc} ; (ldreq pc, [sp], #4)
return PAGE_SIZE;
if ( name == _SC_SYMLOOP_MAX )
5994: e350004f cmp r0, #79 ; 0x4f
5998: 0a000004 beq 59b0 <sysconf+0x64>
#if defined(__sparc__)
if ( name == 515 ) /* Solaris _SC_STACK_PROT */
return 0;
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
599c: eb00202c bl da54 <__errno>
59a0: e3a03016 mov r3, #22
59a4: e5803000 str r3, [r0]
59a8: e3e00000 mvn r0, #0
59ac: e49df004 pop {pc} ; (ldr pc, [sp], #4)
if ( name == _SC_PAGESIZE )
return PAGE_SIZE;
if ( name == _SC_SYMLOOP_MAX )
return RTEMS_FILESYSTEM_SYMLOOP_MAX;
59b0: e3a00020 mov r0, #32 <== NOT EXECUTED
if ( name == 515 ) /* Solaris _SC_STACK_PROT */
return 0;
#endif
rtems_set_errno_and_return_minus_one( EINVAL );
}
59b4: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
00018adc <write>:
size_t count
)
{
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
18adc: e59fc07c ldr ip, [pc, #124] ; 18b60 <bsp_section_text_size+0x38>
18ae0: e59cc000 ldr ip, [ip]
18ae4: e150000c cmp r0, ip
ssize_t write(
int fd,
const void *buffer,
size_t count
)
{
18ae8: e92d4030 push {r4, r5, lr}
18aec: e1a04001 mov r4, r1
rtems_libio_t *iop;
rtems_libio_check_fd( fd );
18af0: 2a00000f bcs 18b34 <bsp_section_text_size+0xc>
iop = rtems_libio_iop( fd );
18af4: e59fc068 ldr ip, [pc, #104] ; 18b64 <bsp_section_text_size+0x3c>
18af8: e59cc000 ldr ip, [ip]
18afc: e3a05030 mov r5, #48 ; 0x30
18b00: e020c095 mla r0, r5, r0, ip
rtems_libio_check_is_open( iop );
18b04: e590c00c ldr ip, [r0, #12]
18b08: e31c0c01 tst ip, #256 ; 0x100
18b0c: 0a000008 beq 18b34 <bsp_section_text_size+0xc>
rtems_libio_check_buffer( buffer );
18b10: e3510000 cmp r1, #0
18b14: 1a000002 bne 18b24 <write+0x48>
18b18: ebffd305 bl d734 <__errno> <== NOT EXECUTED
18b1c: e3a03016 mov r3, #22 <== NOT EXECUTED
18b20: ea000005 b 18b3c <bsp_section_text_size+0x14> <== NOT EXECUTED
rtems_libio_check_count( count );
18b24: e3520000 cmp r2, #0
18b28: 0a00000a beq 18b58 <bsp_section_text_size+0x30>
rtems_libio_check_permissions_with_error( iop, LIBIO_FLAGS_WRITE, EBADF );
18b2c: e31c0004 tst ip, #4
18b30: 1a000004 bne 18b48 <bsp_section_text_size+0x20>
18b34: ebffd2fe bl d734 <__errno>
18b38: e3a03009 mov r3, #9
18b3c: e5803000 str r3, [r0]
18b40: e3e00000 mvn r0, #0
18b44: e8bd8030 pop {r4, r5, pc}
/*
* Now process the write() request.
*/
return (*iop->pathinfo.handlers->write_h)( iop, buffer, count );
18b48: e5903020 ldr r3, [r0, #32]
18b4c: e1a0e00f mov lr, pc
18b50: e593f00c ldr pc, [r3, #12]
18b54: e8bd8030 pop {r4, r5, pc}
rtems_libio_check_fd( fd );
iop = rtems_libio_iop( fd );
rtems_libio_check_is_open( iop );
rtems_libio_check_buffer( buffer );
rtems_libio_check_count( count );
18b58: e1a00002 mov r0, r2
/*
* Now process the write() request.
*/
return (*iop->pathinfo.handlers->write_h)( iop, buffer, count );
}
18b5c: e8bd8030 pop {r4, r5, pc}