RTEMS 4.11Annotated Report
Sat Mar 12 13:55:51 2011
30010000 <TOD_MICROSECONDS_TO_TICKS>:
uint32_t TOD_MICROSECONDS_TO_TICKS(
uint32_t microseconds
)
{
return (microseconds / rtems_configuration_get_microseconds_per_tick());
30010000: e59f300c ldr r3, [pc, #12] ; 30010014 <TOD_MICROSECONDS_TO_TICKS+0x14><== NOT EXECUTED
#include <rtems/score/tod.h>
uint32_t TOD_MICROSECONDS_TO_TICKS(
uint32_t microseconds
)
{
30010004: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
return (microseconds / rtems_configuration_get_microseconds_per_tick());
30010008: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
3001000c: eb004e4a bl 3002393c <__aeabi_uidiv> <== NOT EXECUTED
}
30010010: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
3000b6f0 <TOD_MILLISECONDS_TO_TICKS>:
uint32_t TOD_MILLISECONDS_TO_TICKS(
uint32_t milliseconds
)
{
return (milliseconds / rtems_configuration_get_milliseconds_per_tick());
3000b6f0: e59f3018 ldr r3, [pc, #24] ; 3000b710 <TOD_MILLISECONDS_TO_TICKS+0x20><== NOT EXECUTED
#include <rtems/score/tod.h>
uint32_t TOD_MILLISECONDS_TO_TICKS(
uint32_t milliseconds
)
{
3000b6f4: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
return (milliseconds / rtems_configuration_get_milliseconds_per_tick());
3000b6f8: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
3000b6fc: e59f3010 ldr r3, [pc, #16] ; 3000b714 <TOD_MILLISECONDS_TO_TICKS+0x24><== NOT EXECUTED
3000b700: e0812193 umull r2, r1, r3, r1 <== NOT EXECUTED
3000b704: e1a01321 lsr r1, r1, #6 <== NOT EXECUTED
3000b708: eb00407a bl 3001b8f8 <__aeabi_uidiv> <== NOT EXECUTED
}
3000b70c: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
3001e278 <TOD_TICKS_PER_SECOND_method>:
#include <rtems/config.h>
#include <rtems/score/tod.h>
uint32_t TOD_TICKS_PER_SECOND_method(void)
{
return (TOD_MICROSECONDS_PER_SECOND /
3001e278: e59f3010 ldr r3, [pc, #16] ; 3001e290 <TOD_TICKS_PER_SECOND_method+0x18><== NOT EXECUTED
#include <rtems/system.h>
#include <rtems/config.h>
#include <rtems/score/tod.h>
uint32_t TOD_TICKS_PER_SECOND_method(void)
{
3001e27c: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
return (TOD_MICROSECONDS_PER_SECOND /
3001e280: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
3001e284: e59f0008 ldr r0, [pc, #8] ; 3001e294 <TOD_TICKS_PER_SECOND_method+0x1c><== NOT EXECUTED
3001e288: ebfff5c4 bl 3001b9a0 <__aeabi_uidiv> <== NOT EXECUTED
rtems_configuration_get_microseconds_per_tick());
}
3001e28c: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
30012d18 <_Barrier_Translate_core_barrier_return_code>:
*/
#if defined(RTEMS_DEBUG)
if ( the_barrier_status > CORE_BARRIER_STATUS_LAST )
return RTEMS_INTERNAL_ERROR;
#endif
return _Barrier_Translate_core_barrier_return_code_[the_barrier_status];
30012d18: e59f3004 ldr r3, [pc, #4] ; 30012d24 <_Barrier_Translate_core_barrier_return_code+0xc><== NOT EXECUTED
}
30012d1c: e7930100 ldr r0, [r3, r0, lsl #2] <== NOT EXECUTED
30012d20: e12fff1e bx lr <== NOT EXECUTED
300122d8 <_CORE_barrier_Release>:
#else
Objects_Id id __attribute__((unused)),
CORE_barrier_API_mp_support_callout api_barrier_mp_support __attribute__((unused))
#endif
)
{
300122d8: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
300122dc: e1a05000 mov r5, r0 <== NOT EXECUTED
Thread_Control *the_thread;
uint32_t count;
count = 0;
300122e0: e3a04000 mov r4, #0 <== NOT EXECUTED
while ( (the_thread = _Thread_queue_Dequeue(&the_barrier->Wait_queue)) ) {
300122e4: ea000000 b 300122ec <_CORE_barrier_Release+0x14> <== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_barrier_mp_support) ( the_thread, id );
#endif
count++;
300122e8: e2844001 add r4, r4, #1 <== NOT EXECUTED
{
Thread_Control *the_thread;
uint32_t count;
count = 0;
while ( (the_thread = _Thread_queue_Dequeue(&the_barrier->Wait_queue)) ) {
300122ec: e1a00005 mov r0, r5 <== NOT EXECUTED
300122f0: ebfff068 bl 3000e498 <_Thread_queue_Dequeue> <== NOT EXECUTED
300122f4: e3500000 cmp r0, #0 <== NOT EXECUTED
300122f8: 1afffffa bne 300122e8 <_CORE_barrier_Release+0x10> <== NOT EXECUTED
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_barrier_mp_support) ( the_thread, id );
#endif
count++;
}
the_barrier->number_of_waiting_threads = 0;
300122fc: e5850048 str r0, [r5, #72] ; 0x48 <== NOT EXECUTED
return count;
}
30012300: e1a00004 mov r0, r4 <== NOT EXECUTED
30012304: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
30012308 <_CORE_barrier_Wait>:
)
{
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
30012308: e59f2078 ldr r2, [pc, #120] ; 30012388 <_CORE_barrier_Wait+0x80><== NOT EXECUTED
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
3001230c: e92d0070 push {r4, r5, r6} <== NOT EXECUTED
Thread_Control *executing;
ISR_Level level;
executing = _Thread_Executing;
30012310: e592c004 ldr ip, [r2, #4] <== NOT EXECUTED
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
30012314: e3a04000 mov r4, #0 <== NOT EXECUTED
30012318: e58c4034 str r4, [ip, #52] ; 0x34 <== NOT EXECUTED
Objects_Id id,
bool wait,
Watchdog_Interval timeout,
CORE_barrier_API_mp_support_callout api_barrier_mp_support
)
{
3001231c: e59d200c ldr r2, [sp, #12] <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
30012320: e10f6000 mrs r6, CPSR <== NOT EXECUTED
30012324: e3864080 orr r4, r6, #128 ; 0x80 <== NOT EXECUTED
30012328: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
_ISR_Disable( level );
the_barrier->number_of_waiting_threads++;
3001232c: e5904048 ldr r4, [r0, #72] ; 0x48 <== NOT EXECUTED
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
30012330: e5905040 ldr r5, [r0, #64] ; 0x40 <== NOT EXECUTED
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
_ISR_Disable( level );
the_barrier->number_of_waiting_threads++;
30012334: e2844001 add r4, r4, #1 <== NOT EXECUTED
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
30012338: e3550000 cmp r5, #0 <== NOT EXECUTED
ISR_Level level;
executing = _Thread_Executing;
executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
_ISR_Disable( level );
the_barrier->number_of_waiting_threads++;
3001233c: e5804048 str r4, [r0, #72] ; 0x48 <== NOT EXECUTED
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
30012340: 1a000002 bne 30012350 <_CORE_barrier_Wait+0x48> <== NOT EXECUTED
if ( the_barrier->number_of_waiting_threads ==
30012344: e5905044 ldr r5, [r0, #68] ; 0x44 <== NOT EXECUTED
30012348: e1540005 cmp r4, r5 <== NOT EXECUTED
3001234c: 0a000008 beq 30012374 <_CORE_barrier_Wait+0x6c> <== NOT EXECUTED
30012350: e3a02001 mov r2, #1 <== NOT EXECUTED
30012354: e5802030 str r2, [r0, #48] ; 0x30 <== NOT EXECUTED
return;
}
}
_Thread_queue_Enter_critical_section( &the_barrier->Wait_queue );
executing->Wait.queue = &the_barrier->Wait_queue;
30012358: e58c0044 str r0, [ip, #68] ; 0x44 <== NOT EXECUTED
executing->Wait.id = id;
3001235c: e58c1020 str r1, [ip, #32] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30012360: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
30012364: e59f2020 ldr r2, [pc, #32] ; 3001238c <_CORE_barrier_Wait+0x84><== NOT EXECUTED
30012368: e1a01003 mov r1, r3 <== NOT EXECUTED
}
3001236c: e8bd0070 pop {r4, r5, r6} <== NOT EXECUTED
_Thread_queue_Enter_critical_section( &the_barrier->Wait_queue );
executing->Wait.queue = &the_barrier->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
30012370: eafff0a6 b 3000e610 <_Thread_queue_Enqueue_with_handler> <== NOT EXECUTED
_ISR_Disable( level );
the_barrier->number_of_waiting_threads++;
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
if ( the_barrier->number_of_waiting_threads ==
the_barrier->Attributes.maximum_count) {
executing->Wait.return_code = CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED;
30012374: e3a03001 mov r3, #1 <== NOT EXECUTED
30012378: e58c3034 str r3, [ip, #52] ; 0x34 <== NOT EXECUTED
3001237c: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
executing->Wait.queue = &the_barrier->Wait_queue;
executing->Wait.id = id;
_ISR_Enable( level );
_Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
}
30012380: e8bd0070 pop {r4, r5, r6} <== NOT EXECUTED
if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
if ( the_barrier->number_of_waiting_threads ==
the_barrier->Attributes.maximum_count) {
executing->Wait.return_code = CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED;
_ISR_Enable( level );
_CORE_barrier_Release( the_barrier, id, api_barrier_mp_support );
30012384: eaffffd3 b 300122d8 <_CORE_barrier_Release> <== NOT EXECUTED
3001b1f0 <_CORE_message_queue_Broadcast>:
{
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
3001b1f0: e590304c ldr r3, [r0, #76] ; 0x4c
Objects_Id id __attribute__((unused)),
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)),
#endif
uint32_t *count
)
{
3001b1f4: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
3001b1f8: e1530002 cmp r3, r2
Objects_Id id __attribute__((unused)),
CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)),
#endif
uint32_t *count
)
{
3001b1fc: e1a07000 mov r7, r0
3001b200: e1a05002 mov r5, r2
3001b204: e1a08001 mov r8, r1
3001b208: e59da020 ldr sl, [sp, #32]
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
3001b20c: 3a000016 bcc 3001b26c <_CORE_message_queue_Broadcast+0x7c>
* NOTE: This check is critical because threads can block on
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
3001b210: e5906048 ldr r6, [r0, #72] ; 0x48
3001b214: e3560000 cmp r6, #0
*count = 0;
3001b218: 13a00000 movne r0, #0
3001b21c: 158a0000 strne r0, [sl]
* NOTE: This check is critical because threads can block on
* send and receive and this ensures that we are broadcasting
* the message to threads waiting to receive -- not to send.
*/
if ( the_message_queue->number_of_pending_messages != 0 ) {
3001b220: 18bd85f0 popne {r4, r5, r6, r7, r8, sl, pc}
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
3001b224: e1a00007 mov r0, r7
3001b228: eb000b0c bl 3001de60 <_Thread_queue_Dequeue>
3001b22c: e2504000 subs r4, r0, #0
3001b230: 0a00000a beq 3001b260 <_CORE_message_queue_Broadcast+0x70>
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
3001b234: e594002c ldr r0, [r4, #44] ; 0x2c
3001b238: e1a01008 mov r1, r8
3001b23c: e1a02005 mov r2, r5
3001b240: eb00201c bl 300232b8 <memcpy>
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
3001b244: e5943028 ldr r3, [r4, #40] ; 0x28
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
3001b248: e1a00007 mov r0, r7
buffer,
waitp->return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
3001b24c: e5835000 str r5, [r3]
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
3001b250: eb000b02 bl 3001de60 <_Thread_queue_Dequeue>
3001b254: e2504000 subs r4, r0, #0
_Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
waitp = &the_thread->Wait;
number_broadcasted += 1;
3001b258: e2866001 add r6, r6, #1
/*
* There must be no pending messages if there is a thread waiting to
* receive a message.
*/
number_broadcasted = 0;
while ((the_thread =
3001b25c: 1afffff4 bne 3001b234 <_CORE_message_queue_Broadcast+0x44>
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
}
*count = number_broadcasted;
3001b260: e58a6000 str r6, [sl]
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
3001b264: e1a00004 mov r0, r4
3001b268: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
Thread_Control *the_thread;
uint32_t number_broadcasted;
Thread_Wait_information *waitp;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
3001b26c: e3a00001 mov r0, #1 <== NOT EXECUTED
#endif
}
*count = number_broadcasted;
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
3001b270: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
300132b8 <_CORE_message_queue_Initialize>:
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Attributes *the_message_queue_attributes,
uint32_t maximum_pending_messages,
size_t maximum_message_size
)
{
300132b8: e92d4070 push {r4, r5, r6, lr}
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
300132bc: e3130003 tst r3, #3
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Attributes *the_message_queue_attributes,
uint32_t maximum_pending_messages,
size_t maximum_message_size
)
{
300132c0: e1a04000 mov r4, r0
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
the_message_queue->number_of_pending_messages = 0;
300132c4: e3a00000 mov r0, #0
CORE_message_queue_Control *the_message_queue,
CORE_message_queue_Attributes *the_message_queue_attributes,
uint32_t maximum_pending_messages,
size_t maximum_message_size
)
{
300132c8: e1a05001 mov r5, r1
300132cc: e24dd004 sub sp, sp, #4
size_t message_buffering_required;
size_t allocated_message_size;
the_message_queue->maximum_pending_messages = maximum_pending_messages;
300132d0: e5842044 str r2, [r4, #68] ; 0x44
the_message_queue->number_of_pending_messages = 0;
300132d4: e5840048 str r0, [r4, #72] ; 0x48
the_message_queue->maximum_message_size = maximum_message_size;
300132d8: e584304c str r3, [r4, #76] ; 0x4c
/*
* Round size up to multiple of a pointer for chain init and
* check for overflow on adding overhead to each message.
*/
allocated_message_size = maximum_message_size;
if (allocated_message_size & (sizeof(uint32_t) - 1)) {
300132dc: 01a01003 moveq r1, r3
300132e0: 0a000005 beq 300132fc <_CORE_message_queue_Initialize+0x44>
allocated_message_size += sizeof(uint32_t);
300132e4: e2831004 add r1, r3, #4 <== NOT EXECUTED
allocated_message_size &= ~(sizeof(uint32_t) - 1);
300132e8: e3c11003 bic r1, r1, #3 <== NOT EXECUTED
}
if (allocated_message_size < maximum_message_size)
300132ec: e1530001 cmp r3, r1 <== NOT EXECUTED
300132f0: 9a000001 bls 300132fc <_CORE_message_queue_Initialize+0x44><== NOT EXECUTED
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
}
300132f4: e28dd004 add sp, sp, #4
300132f8: e8bd8070 pop {r4, r5, r6, pc}
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
300132fc: e2816010 add r6, r1, #16
/*
* Calculate how much total memory is required for message buffering and
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
30013300: e0000692 mul r0, r2, r6
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
30013304: e1500001 cmp r0, r1
return false;
30013308: 33a00000 movcc r0, #0
* check for overflow on the multiplication.
*/
message_buffering_required = (size_t) maximum_pending_messages *
(allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
if (message_buffering_required < allocated_message_size)
3001330c: 3afffff8 bcc 300132f4 <_CORE_message_queue_Initialize+0x3c>
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
30013310: e58d2000 str r2, [sp]
30013314: eb000bc5 bl 30016230 <_Workspace_Allocate>
if (the_message_queue->message_buffers == 0)
30013318: e3500000 cmp r0, #0
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
3001331c: e1a01000 mov r1, r0
return false;
/*
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
30013320: e584005c str r0, [r4, #92] ; 0x5c
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
30013324: e59d2000 ldr r2, [sp]
return false;
30013328: 01a00000 moveq r0, r0
* Attempt to allocate the message memory
*/
the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
_Workspace_Allocate( message_buffering_required );
if (the_message_queue->message_buffers == 0)
3001332c: 0afffff0 beq 300132f4 <_CORE_message_queue_Initialize+0x3c>
/*
* Initialize the pool of inactive messages, pending messages,
* and set of waiting threads.
*/
_Chain_Initialize (
30013330: e2840060 add r0, r4, #96 ; 0x60
30013334: e1a03006 mov r3, r6
30013338: eb00139f bl 300181bc <_Chain_Initialize>
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
3001333c: e2842054 add r2, r4, #84 ; 0x54
head->next = tail;
30013340: e5842050 str r2, [r4, #80] ; 0x50
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
30013344: e2843050 add r3, r4, #80 ; 0x50
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
30013348: e3a02000 mov r2, #0
3001334c: e5842054 str r2, [r4, #84] ; 0x54
tail->previous = head;
30013350: e5843058 str r3, [r4, #88] ; 0x58
allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
);
_Chain_Initialize_empty( &the_message_queue->Pending_messages );
_Thread_queue_Initialize(
30013354: e5951000 ldr r1, [r5]
30013358: e1a00004 mov r0, r4
3001335c: e3510001 cmp r1, #1
30013360: 13a01000 movne r1, #0
30013364: 03a01001 moveq r1, #1
30013368: e3a02080 mov r2, #128 ; 0x80
3001336c: e3a03006 mov r3, #6
30013370: eb000923 bl 30015804 <_Thread_queue_Initialize>
THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
STATES_WAITING_FOR_MESSAGE,
CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
);
return true;
30013374: e3a00001 mov r0, #1
30013378: eaffffdd b 300132f4 <_CORE_message_queue_Initialize+0x3c>
3001345c <_CORE_message_queue_Submit>:
)
{
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
3001345c: e590304c ldr r3, [r0, #76] ; 0x4c
#endif
CORE_message_queue_Submit_types submit_type,
bool wait,
Watchdog_Interval timeout
)
{
30013460: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
30013464: e1530002 cmp r3, r2
#endif
CORE_message_queue_Submit_types submit_type,
bool wait,
Watchdog_Interval timeout
)
{
30013468: e1a04000 mov r4, r0
3001346c: e1a05002 mov r5, r2
30013470: e1a0a001 mov sl, r1
30013474: e59d7020 ldr r7, [sp, #32]
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
30013478: 33a00001 movcc r0, #1
)
{
CORE_message_queue_Buffer_control *the_message;
Thread_Control *the_thread;
if ( size > the_message_queue->maximum_message_size ) {
3001347c: 38bd85f0 popcc {r4, r5, r6, r7, r8, sl, pc}
}
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
30013480: e5946048 ldr r6, [r4, #72] ; 0x48
30013484: e3560000 cmp r6, #0
30013488: 0a000012 beq 300134d8 <_CORE_message_queue_Submit+0x7c>
/*
* No one waiting on the message queue at this time, so attempt to
* queue the message up for a future receive.
*/
if ( the_message_queue->number_of_pending_messages <
3001348c: e5943044 ldr r3, [r4, #68] ; 0x44
30013490: e1530006 cmp r3, r6
30013494: 8a000001 bhi 300134a0 <_CORE_message_queue_Submit+0x44>
);
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
}
#if !defined(RTEMS_SCORE_COREMSG_ENABLE_BLOCKING_SEND)
return CORE_MESSAGE_QUEUE_STATUS_TOO_MANY;
30013498: e3a00002 mov r0, #2 <== NOT EXECUTED
_Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
}
return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT;
#endif
}
3001349c: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
_CORE_message_queue_Allocate_message_buffer (
CORE_message_queue_Control *the_message_queue
)
{
return (CORE_message_queue_Buffer_control *)
_Chain_Get( &the_message_queue->Inactive_messages );
300134a0: e2840060 add r0, r4, #96 ; 0x60
300134a4: ebffff6c bl 3001325c <_Chain_Get>
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
300134a8: e1a0100a mov r1, sl
_CORE_message_queue_Allocate_message_buffer (
CORE_message_queue_Control *the_message_queue
)
{
return (CORE_message_queue_Buffer_control *)
_Chain_Get( &the_message_queue->Inactive_messages );
300134ac: e1a06000 mov r6, r0
const void *source,
void *destination,
size_t size
)
{
memcpy(destination, source, size);
300134b0: e1a02005 mov r2, r5
300134b4: e280000c add r0, r0, #12
300134b8: eb001d6f bl 3001aa7c <memcpy>
size
);
the_message->Contents.size = size;
_CORE_message_queue_Set_message_priority( the_message, submit_type );
_CORE_message_queue_Insert_message(
300134bc: e1a00004 mov r0, r4
_CORE_message_queue_Copy_buffer(
buffer,
the_message->Contents.buffer,
size
);
the_message->Contents.size = size;
300134c0: e5865008 str r5, [r6, #8]
_CORE_message_queue_Set_message_priority( the_message, submit_type );
_CORE_message_queue_Insert_message(
300134c4: e1a01006 mov r1, r6
300134c8: e1a02007 mov r2, r7
300134cc: eb001353 bl 30018220 <_CORE_message_queue_Insert_message>
the_message_queue,
the_message,
submit_type
);
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
300134d0: e3a00000 mov r0, #0
300134d4: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
/*
* Is there a thread currently waiting on this message queue?
*/
if ( the_message_queue->number_of_pending_messages == 0 ) {
the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
300134d8: eb0007bd bl 300153d4 <_Thread_queue_Dequeue>
if ( the_thread ) {
300134dc: e2508000 subs r8, r0, #0
300134e0: 05946048 ldreq r6, [r4, #72] ; 0x48
300134e4: 0affffe8 beq 3001348c <_CORE_message_queue_Submit+0x30>
300134e8: e598002c ldr r0, [r8, #44] ; 0x2c
300134ec: e1a0100a mov r1, sl
300134f0: e1a02005 mov r2, r5
300134f4: eb001d60 bl 3001aa7c <memcpy>
_CORE_message_queue_Copy_buffer(
buffer,
the_thread->Wait.return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
300134f8: e5983028 ldr r3, [r8, #40] ; 0x28
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
300134fc: e1a00006 mov r0, r6
_CORE_message_queue_Copy_buffer(
buffer,
the_thread->Wait.return_argument_second.mutable_object,
size
);
*(size_t *) the_thread->Wait.return_argument = size;
30013500: e5835000 str r5, [r3]
the_thread->Wait.count = (uint32_t) submit_type;
30013504: e5887024 str r7, [r8, #36] ; 0x24
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
(*api_message_queue_mp_support) ( the_thread, id );
#endif
return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
30013508: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
3000a67c <_CORE_mutex_Seize>:
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
3000a67c: e92d41f0 push {r4, r5, r6, r7, r8, lr}
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
3000a680: e59f40b4 ldr r4, [pc, #180] ; 3000a73c <_CORE_mutex_Seize+0xc0>
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
3000a684: e1a05000 mov r5, r0
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
3000a688: e594c000 ldr ip, [r4]
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
3000a68c: e1a06001 mov r6, r1
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
3000a690: e35c0000 cmp ip, #0
Objects_Id _id,
bool _wait,
Watchdog_Interval _timeout,
ISR_Level _level
)
{
3000a694: e1a08003 mov r8, r3
3000a698: e20270ff and r7, r2, #255 ; 0xff
_CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level );
3000a69c: 0a000001 beq 3000a6a8 <_CORE_mutex_Seize+0x2c>
3000a6a0: e3570000 cmp r7, #0
3000a6a4: 1a00000d bne 3000a6e0 <_CORE_mutex_Seize+0x64>
3000a6a8: e1a00005 mov r0, r5
3000a6ac: e28d1018 add r1, sp, #24
3000a6b0: eb0012c1 bl 3000f1bc <_CORE_mutex_Seize_interrupt_trylock>
3000a6b4: e3500000 cmp r0, #0
3000a6b8: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc}
3000a6bc: e3570000 cmp r7, #0
3000a6c0: 1a00000e bne 3000a700 <_CORE_mutex_Seize+0x84>
3000a6c4: e59d3018 ldr r3, [sp, #24] <== NOT EXECUTED
3000a6c8: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
3000a6cc: e59f306c ldr r3, [pc, #108] ; 3000a740 <_CORE_mutex_Seize+0xc4><== NOT EXECUTED
3000a6d0: e3a02001 mov r2, #1 <== NOT EXECUTED
3000a6d4: e5933004 ldr r3, [r3, #4] <== NOT EXECUTED
3000a6d8: e5832034 str r2, [r3, #52] ; 0x34 <== NOT EXECUTED
3000a6dc: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
3000a6e0: e59f305c ldr r3, [pc, #92] ; 3000a744 <_CORE_mutex_Seize+0xc8>
3000a6e4: e5933000 ldr r3, [r3]
3000a6e8: e3530001 cmp r3, #1
3000a6ec: 9affffed bls 3000a6a8 <_CORE_mutex_Seize+0x2c>
3000a6f0: e3a00000 mov r0, #0 <== NOT EXECUTED
3000a6f4: e1a01000 mov r1, r0 <== NOT EXECUTED
3000a6f8: e3a02012 mov r2, #18 <== NOT EXECUTED
3000a6fc: eb0001c8 bl 3000ae24 <_Internal_error_Occurred> <== NOT EXECUTED
3000a700: e59f3038 ldr r3, [pc, #56] ; 3000a740 <_CORE_mutex_Seize+0xc4>
3000a704: e5942000 ldr r2, [r4]
3000a708: e5933004 ldr r3, [r3, #4]
3000a70c: e2822001 add r2, r2, #1
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
3000a710: e3a01001 mov r1, #1
3000a714: e5851030 str r1, [r5, #48] ; 0x30
3000a718: e5842000 str r2, [r4]
3000a71c: e5835044 str r5, [r3, #68] ; 0x44
3000a720: e5836020 str r6, [r3, #32]
3000a724: e59d3018 ldr r3, [sp, #24]
3000a728: e129f003 msr CPSR_fc, r3
3000a72c: e1a00005 mov r0, r5
3000a730: e1a01008 mov r1, r8
3000a734: ebffffb5 bl 3000a610 <_CORE_mutex_Seize_interrupt_blocking>
3000a738: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
3000f1bc <_CORE_mutex_Seize_interrupt_trylock>:
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
3000f1bc: e59f213c ldr r2, [pc, #316] ; 3000f300 <_CORE_mutex_Seize_interrupt_trylock+0x144>
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
3000f1c0: e590c050 ldr ip, [r0, #80] ; 0x50
#if defined(__RTEMS_DO_NOT_INLINE_CORE_MUTEX_SEIZE__)
int _CORE_mutex_Seize_interrupt_trylock(
CORE_mutex_Control *the_mutex,
ISR_Level *level_p
)
{
3000f1c4: e1a03000 mov r3, r0
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
3000f1c8: e5922004 ldr r2, [r2, #4]
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
3000f1cc: e3a00000 mov r0, #0
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
3000f1d0: e15c0000 cmp ip, r0
3000f1d4: e92d40f0 push {r4, r5, r6, r7, lr}
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
3000f1d8: e5820034 str r0, [r2, #52] ; 0x34
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
3000f1dc: 0a00000e beq 3000f21c <_CORE_mutex_Seize_interrupt_trylock+0x60>
return _CORE_mutex_Seize_interrupt_trylock_body( the_mutex, level_p );
}
3000f1e0: e593c048 ldr ip, [r3, #72] ; 0x48
the_mutex->lock = CORE_MUTEX_LOCKED;
the_mutex->holder = executing;
the_mutex->holder_id = executing->Object.id;
3000f1e4: e5925008 ldr r5, [r2, #8]
the_mutex->nest_count = 1;
3000f1e8: e3a04001 mov r4, #1
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
3000f1ec: e35c0002 cmp ip, #2
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
the_mutex->lock = CORE_MUTEX_LOCKED;
3000f1f0: e5830050 str r0, [r3, #80] ; 0x50
the_mutex->holder = executing;
3000f1f4: e583205c str r2, [r3, #92] ; 0x5c
the_mutex->holder_id = executing->Object.id;
3000f1f8: e5835060 str r5, [r3, #96] ; 0x60
the_mutex->nest_count = 1;
3000f1fc: e5834054 str r4, [r3, #84] ; 0x54
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
3000f200: 0a00000e beq 3000f240 <_CORE_mutex_Seize_interrupt_trylock+0x84>
3000f204: e35c0003 cmp ip, #3
3000f208: 0a000013 beq 3000f25c <_CORE_mutex_Seize_interrupt_trylock+0xa0>
3000f20c: e5913000 ldr r3, [r1]
3000f210: e129f003 msr CPSR_fc, r3
executing->resource_count++;
}
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( *level_p );
return 0;
3000f214: e3a00000 mov r0, #0
3000f218: e8bd80f0 pop {r4, r5, r6, r7, pc}
/*
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
3000f21c: e593005c ldr r0, [r3, #92] ; 0x5c
3000f220: e1520000 cmp r2, r0
/*
* The mutex is not available and the caller must deal with the possibility
* of blocking.
*/
return 1;
3000f224: 13a00001 movne r0, #1
/*
* At this point, we know the mutex was not available. If this thread
* is the thread that has locked the mutex, let's see if we are allowed
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
3000f228: 18bd80f0 popne {r4, r5, r6, r7, pc}
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
3000f22c: e5932040 ldr r2, [r3, #64] ; 0x40
3000f230: e3520000 cmp r2, #0
3000f234: 0a000019 beq 3000f2a0 <_CORE_mutex_Seize_interrupt_trylock+0xe4>
/*
* The mutex is not available and the caller must deal with the possibility
* of blocking.
*/
return 1;
3000f238: e3a00001 mov r0, #1
3000f23c: e8bd80f0 pop {r4, r5, r6, r7, pc}
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
3000f240: e592301c ldr r3, [r2, #28]
3000f244: e2833001 add r3, r3, #1
3000f248: e582301c str r3, [r2, #28]
3000f24c: e5913000 ldr r3, [r1]
3000f250: e129f003 msr CPSR_fc, r3
}
if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
_ISR_Enable( *level_p );
return 0;
3000f254: e3a00000 mov r0, #0
3000f258: e8bd80f0 pop {r4, r5, r6, r7, pc}
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
3000f25c: e592c01c ldr ip, [r2, #28]
*/
{
Priority_Control ceiling;
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
3000f260: e593704c ldr r7, [r3, #76] ; 0x4c
current = executing->current_priority;
3000f264: e5926014 ldr r6, [r2, #20]
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
3000f268: e08c5004 add r5, ip, r4
Priority_Control ceiling;
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
current = executing->current_priority;
if ( current == ceiling ) {
3000f26c: e1570006 cmp r7, r6
_Chain_Prepend_unprotected( &executing->lock_mutex,
&the_mutex->queue.lock_queue );
the_mutex->queue.priority_before = executing->current_priority;
#endif
executing->resource_count++;
3000f270: e582501c str r5, [r2, #28]
Priority_Control ceiling;
Priority_Control current;
ceiling = the_mutex->Attributes.priority_ceiling;
current = executing->current_priority;
if ( current == ceiling ) {
3000f274: 0a00001d beq 3000f2f0 <_CORE_mutex_Seize_interrupt_trylock+0x134>
_ISR_Enable( *level_p );
return 0;
}
if ( current > ceiling ) {
3000f278: 3a00000f bcc 3000f2bc <_CORE_mutex_Seize_interrupt_trylock+0x100>
);
_Thread_Enable_dispatch();
return 0;
}
/* if ( current < ceiling ) */ {
executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
3000f27c: e3a05005 mov r5, #5
3000f280: e5825034 str r5, [r2, #52] ; 0x34
the_mutex->lock = CORE_MUTEX_UNLOCKED;
3000f284: e5834050 str r4, [r3, #80] ; 0x50
the_mutex->nest_count = 0; /* undo locking above */
3000f288: e5830054 str r0, [r3, #84] ; 0x54
executing->resource_count--; /* undo locking above */
3000f28c: e582c01c str ip, [r2, #28]
3000f290: e5913000 ldr r3, [r1]
3000f294: e129f003 msr CPSR_fc, r3
_ISR_Enable( *level_p );
return 0;
3000f298: e3a00000 mov r0, #0
3000f29c: e8bd80f0 pop {r4, r5, r6, r7, pc}
* to nest access.
*/
if ( _Thread_Is_executing( the_mutex->holder ) ) {
switch ( the_mutex->Attributes.lock_nesting_behavior ) {
case CORE_MUTEX_NESTING_ACQUIRES:
the_mutex->nest_count++;
3000f2a0: e5932054 ldr r2, [r3, #84] ; 0x54
3000f2a4: e2822001 add r2, r2, #1
3000f2a8: e5832054 str r2, [r3, #84] ; 0x54
3000f2ac: e5913000 ldr r3, [r1]
3000f2b0: e129f003 msr CPSR_fc, r3
_ISR_Enable( *level_p );
return 0;
3000f2b4: e3a00000 mov r0, #0
3000f2b8: e8bd80f0 pop {r4, r5, r6, r7, pc}
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000f2bc: e59f2040 ldr r2, [pc, #64] ; 3000f304 <_CORE_mutex_Seize_interrupt_trylock+0x148><== NOT EXECUTED
3000f2c0: e5920000 ldr r0, [r2] <== NOT EXECUTED
3000f2c4: e2800001 add r0, r0, #1 <== NOT EXECUTED
3000f2c8: e5820000 str r0, [r2] <== NOT EXECUTED
3000f2cc: e5912000 ldr r2, [r1] <== NOT EXECUTED
3000f2d0: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
}
if ( current > ceiling ) {
_Thread_Disable_dispatch();
_ISR_Enable( *level_p );
_Thread_Change_priority(
3000f2d4: e3a02000 mov r2, #0 <== NOT EXECUTED
3000f2d8: e593005c ldr r0, [r3, #92] ; 0x5c <== NOT EXECUTED
3000f2dc: e593104c ldr r1, [r3, #76] ; 0x4c <== NOT EXECUTED
3000f2e0: ebfff24a bl 3000bc10 <_Thread_Change_priority> <== NOT EXECUTED
the_mutex->holder,
the_mutex->Attributes.priority_ceiling,
false
);
_Thread_Enable_dispatch();
3000f2e4: ebfff366 bl 3000c084 <_Thread_Enable_dispatch> <== NOT EXECUTED
return 0;
3000f2e8: e3a00000 mov r0, #0 <== NOT EXECUTED
3000f2ec: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000f2f0: e5913000 ldr r3, [r1] <== NOT EXECUTED
3000f2f4: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
ceiling = the_mutex->Attributes.priority_ceiling;
current = executing->current_priority;
if ( current == ceiling ) {
_ISR_Enable( *level_p );
return 0;
3000f2f8: e3a00000 mov r0, #0 <== NOT EXECUTED
3000f2fc: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000a748 <_CORE_mutex_Surrender>:
* allowed when the mutex in quetion is FIFO or simple Priority
* discipline. But Priority Ceiling or Priority Inheritance mutexes
* must be released by the thread which acquired them.
*/
if ( the_mutex->Attributes.only_owner_release ) {
3000a748: e5d03044 ldrb r3, [r0, #68] ; 0x44
#else
Objects_Id id __attribute__((unused)),
CORE_mutex_API_mp_support_callout api_mutex_mp_support __attribute__((unused))
#endif
)
{
3000a74c: e92d4030 push {r4, r5, lr}
* allowed when the mutex in quetion is FIFO or simple Priority
* discipline. But Priority Ceiling or Priority Inheritance mutexes
* must be released by the thread which acquired them.
*/
if ( the_mutex->Attributes.only_owner_release ) {
3000a750: e3530000 cmp r3, #0
#else
Objects_Id id __attribute__((unused)),
CORE_mutex_API_mp_support_callout api_mutex_mp_support __attribute__((unused))
#endif
)
{
3000a754: e1a04000 mov r4, r0
Thread_Control *the_thread;
Thread_Control *holder;
holder = the_mutex->holder;
3000a758: e590205c ldr r2, [r0, #92] ; 0x5c
* allowed when the mutex in quetion is FIFO or simple Priority
* discipline. But Priority Ceiling or Priority Inheritance mutexes
* must be released by the thread which acquired them.
*/
if ( the_mutex->Attributes.only_owner_release ) {
3000a75c: 0a000004 beq 3000a774 <_CORE_mutex_Surrender+0x2c>
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
3000a760: e59f3110 ldr r3, [pc, #272] ; 3000a878 <_CORE_mutex_Surrender+0x130>
if ( !_Thread_Is_executing( holder ) )
3000a764: e5933004 ldr r3, [r3, #4]
3000a768: e1520003 cmp r2, r3
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
3000a76c: 13a00002 movne r0, #2
* discipline. But Priority Ceiling or Priority Inheritance mutexes
* must be released by the thread which acquired them.
*/
if ( the_mutex->Attributes.only_owner_release ) {
if ( !_Thread_Is_executing( holder ) )
3000a770: 18bd8030 popne {r4, r5, pc}
return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE;
}
/* XXX already unlocked -- not right status */
if ( !the_mutex->nest_count )
3000a774: e5940054 ldr r0, [r4, #84] ; 0x54
3000a778: e3500000 cmp r0, #0
3000a77c: 08bd8030 popeq {r4, r5, pc}
return CORE_MUTEX_STATUS_SUCCESSFUL;
the_mutex->nest_count--;
3000a780: e2400001 sub r0, r0, #1
if ( the_mutex->nest_count != 0 ) {
3000a784: e3500000 cmp r0, #0
/* XXX already unlocked -- not right status */
if ( !the_mutex->nest_count )
return CORE_MUTEX_STATUS_SUCCESSFUL;
the_mutex->nest_count--;
3000a788: e5840054 str r0, [r4, #84] ; 0x54
/* Currently no API exercises this behavior. */
break;
}
#else
/* must be CORE_MUTEX_NESTING_ACQUIRES or we wouldn't be here */
return CORE_MUTEX_STATUS_SUCCESSFUL;
3000a78c: 13a00000 movne r0, #0
if ( !the_mutex->nest_count )
return CORE_MUTEX_STATUS_SUCCESSFUL;
the_mutex->nest_count--;
if ( the_mutex->nest_count != 0 ) {
3000a790: 18bd8030 popne {r4, r5, pc}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
}
3000a794: e5943048 ldr r3, [r4, #72] ; 0x48
/*
* Formally release the mutex before possibly transferring it to a
* blocked thread.
*/
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
3000a798: e3530002 cmp r3, #2
3000a79c: 0a00001f beq 3000a820 <_CORE_mutex_Surrender+0xd8>
3000a7a0: e3530003 cmp r3, #3
3000a7a4: 0a00001d beq 3000a820 <_CORE_mutex_Surrender+0xd8>
if ( holder->resource_count == 0 &&
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
}
}
the_mutex->holder = NULL;
3000a7a8: e3a05000 mov r5, #0
3000a7ac: e584505c str r5, [r4, #92] ; 0x5c
the_mutex->holder_id = 0;
3000a7b0: e5845060 str r5, [r4, #96] ; 0x60
/*
* Now we check if another thread was waiting for this mutex. If so,
* transfer the mutex to that thread.
*/
if ( ( the_thread = _Thread_queue_Dequeue( &the_mutex->Wait_queue ) ) ) {
3000a7b4: e1a00004 mov r0, r4
3000a7b8: eb0006ef bl 3000c37c <_Thread_queue_Dequeue>
3000a7bc: e2503000 subs r3, r0, #0
}
break;
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
3000a7c0: 03a02001 moveq r2, #1
3000a7c4: 05842050 streq r2, [r4, #80] ; 0x50
return CORE_MUTEX_STATUS_SUCCESSFUL;
3000a7c8: 01a00003 moveq r0, r3
/*
* Now we check if another thread was waiting for this mutex. If so,
* transfer the mutex to that thread.
*/
if ( ( the_thread = _Thread_queue_Dequeue( &the_mutex->Wait_queue ) ) ) {
3000a7cc: 08bd8030 popeq {r4, r5, pc}
} else
#endif
{
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
3000a7d0: e5931008 ldr r1, [r3, #8]
the_mutex->nest_count = 1;
switch ( the_mutex->Attributes.discipline ) {
3000a7d4: e5942048 ldr r2, [r4, #72] ; 0x48
} else
#endif
{
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
3000a7d8: e5841060 str r1, [r4, #96] ; 0x60
the_mutex->nest_count = 1;
switch ( the_mutex->Attributes.discipline ) {
3000a7dc: e3520002 cmp r2, #2
#endif
{
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
the_mutex->nest_count = 1;
3000a7e0: e3a01001 mov r1, #1
} else
#endif
{
the_mutex->holder = the_thread;
3000a7e4: e584305c str r3, [r4, #92] ; 0x5c
the_mutex->holder_id = the_thread->Object.id;
the_mutex->nest_count = 1;
3000a7e8: e5841054 str r1, [r4, #84] ; 0x54
switch ( the_mutex->Attributes.discipline ) {
3000a7ec: 0a000018 beq 3000a854 <_CORE_mutex_Surrender+0x10c>
3000a7f0: e3520003 cmp r2, #3 <== NOT EXECUTED
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
3000a7f4: 11a00005 movne r0, r5 <== NOT EXECUTED
the_mutex->holder = the_thread;
the_mutex->holder_id = the_thread->Object.id;
the_mutex->nest_count = 1;
switch ( the_mutex->Attributes.discipline ) {
3000a7f8: 18bd8030 popne {r4, r5, pc} <== NOT EXECUTED
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
3000a7fc: e593201c ldr r2, [r3, #28] <== NOT EXECUTED
if (the_mutex->Attributes.priority_ceiling <
3000a800: e594104c ldr r1, [r4, #76] ; 0x4c <== NOT EXECUTED
3000a804: e593c014 ldr ip, [r3, #20] <== NOT EXECUTED
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
3000a808: e2822001 add r2, r2, #1 <== NOT EXECUTED
if (the_mutex->Attributes.priority_ceiling <
3000a80c: e151000c cmp r1, ip <== NOT EXECUTED
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
3000a810: e583201c str r2, [r3, #28] <== NOT EXECUTED
if (the_mutex->Attributes.priority_ceiling <
3000a814: 3a000013 bcc 3000a868 <_CORE_mutex_Surrender+0x120> <== NOT EXECUTED
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
3000a818: e1a00005 mov r0, r5 <== NOT EXECUTED
}
3000a81c: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
_CORE_mutex_Pop_priority( the_mutex, holder );
if ( pop_status != CORE_MUTEX_STATUS_SUCCESSFUL )
return pop_status;
holder->resource_count--;
3000a820: e592301c ldr r3, [r2, #28]
3000a824: e2433001 sub r3, r3, #1
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
3000a828: e3530000 cmp r3, #0
_CORE_mutex_Pop_priority( the_mutex, holder );
if ( pop_status != CORE_MUTEX_STATUS_SUCCESSFUL )
return pop_status;
holder->resource_count--;
3000a82c: e582301c str r3, [r2, #28]
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
3000a830: 1affffdc bne 3000a7a8 <_CORE_mutex_Surrender+0x60>
holder->real_priority != holder->current_priority ) {
3000a834: e5921018 ldr r1, [r2, #24]
/*
* Whether or not someone is waiting for the mutex, an
* inherited priority must be lowered if this is the last
* mutex (i.e. resource) this task has.
*/
if ( holder->resource_count == 0 &&
3000a838: e5923014 ldr r3, [r2, #20]
3000a83c: e1510003 cmp r1, r3
3000a840: 0affffd8 beq 3000a7a8 <_CORE_mutex_Surrender+0x60>
holder->real_priority != holder->current_priority ) {
_Thread_Change_priority( holder, holder->real_priority, true );
3000a844: e1a00002 mov r0, r2
3000a848: e3a02001 mov r2, #1
3000a84c: eb0004ef bl 3000bc10 <_Thread_Change_priority>
3000a850: eaffffd4 b 3000a7a8 <_CORE_mutex_Surrender+0x60>
case CORE_MUTEX_DISCIPLINES_FIFO:
case CORE_MUTEX_DISCIPLINES_PRIORITY:
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
3000a854: e593201c ldr r2, [r3, #28]
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
3000a858: e1a00005 mov r0, r5
case CORE_MUTEX_DISCIPLINES_FIFO:
case CORE_MUTEX_DISCIPLINES_PRIORITY:
break;
case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
3000a85c: e2822001 add r2, r2, #1
3000a860: e583201c str r2, [r3, #28]
break;
3000a864: e8bd8030 pop {r4, r5, pc}
case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
_CORE_mutex_Push_priority( the_mutex, the_thread );
the_thread->resource_count++;
if (the_mutex->Attributes.priority_ceiling <
the_thread->current_priority){
_Thread_Change_priority(
3000a868: e1a02005 mov r2, r5 <== NOT EXECUTED
3000a86c: eb0004e7 bl 3000bc10 <_Thread_Change_priority> <== NOT EXECUTED
}
}
} else
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL;
3000a870: e1a00005 mov r0, r5 <== NOT EXECUTED
3000a874: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
3000af04 <_Chain_Append_with_empty_check>:
bool _Chain_Append_with_empty_check(
Chain_Control *chain,
Chain_Node *node
)
{
3000af04: e52d4004 push {r4} ; (str r4, [sp, #-4]!) <== NOT EXECUTED
3000af08: e10fc000 mrs ip, CPSR <== NOT EXECUTED
3000af0c: e38c3080 orr r3, ip, #128 ; 0x80 <== NOT EXECUTED
3000af10: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
3000af14: e5903008 ldr r3, [r0, #8] <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
3000af18: e5904000 ldr r4, [r0] <== NOT EXECUTED
== _Chain_Immutable_tail( the_chain );
3000af1c: e2802004 add r2, r0, #4 <== NOT EXECUTED
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
3000af20: e5801008 str r1, [r0, #8] <== NOT EXECUTED
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
3000af24: e881000c stm r1, {r2, r3} <== NOT EXECUTED
tail->previous = the_node;
old_last->next = the_node;
3000af28: e5831000 str r1, [r3] <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
3000af2c: e1540002 cmp r4, r2 <== NOT EXECUTED
3000af30: 13a00000 movne r0, #0 <== NOT EXECUTED
3000af34: 03a00001 moveq r0, #1 <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000af38: e129f00c msr CPSR_fc, ip <== NOT EXECUTED
_ISR_Disable( level );
was_empty = _Chain_Append_with_empty_check_unprotected( chain, node );
_ISR_Enable( level );
return was_empty;
}
3000af3c: e8bd0010 pop {r4} <== NOT EXECUTED
3000af40: e12fff1e bx lr <== NOT EXECUTED
3000af90 <_Chain_Get_with_empty_check>:
bool _Chain_Get_with_empty_check(
Chain_Control *chain,
Chain_Node **node
)
{
3000af90: e52d4004 push {r4} ; (str r4, [sp, #-4]!) <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000af94: e10f4000 mrs r4, CPSR <== NOT EXECUTED
3000af98: e3843080 orr r3, r4, #128 ; 0x80 <== NOT EXECUTED
3000af9c: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
)
{
bool is_empty_now = true;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_first = head->next;
3000afa0: e5903000 ldr r3, [r0] <== NOT EXECUTED
Chain_Node **the_node
)
{
bool is_empty_now = true;
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
3000afa4: e280c004 add ip, r0, #4 <== NOT EXECUTED
Chain_Node *old_first = head->next;
if ( old_first != tail ) {
3000afa8: e15c0003 cmp ip, r3 <== NOT EXECUTED
*the_node = old_first;
is_empty_now = new_first == tail;
} else
*the_node = NULL;
3000afac: 03a03000 moveq r3, #0 <== NOT EXECUTED
3000afb0: 05813000 streq r3, [r1] <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Chain_Get_with_empty_check_unprotected(
Chain_Control *the_chain,
Chain_Node **the_node
)
{
bool is_empty_now = true;
3000afb4: 03a00001 moveq r0, #1 <== NOT EXECUTED
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_first = head->next;
if ( old_first != tail ) {
3000afb8: 0a000006 beq 3000afd8 <_Chain_Get_with_empty_check+0x48> <== NOT EXECUTED
Chain_Node *new_first = old_first->next;
3000afbc: e5932000 ldr r2, [r3] <== NOT EXECUTED
head->next = new_first;
3000afc0: e5802000 str r2, [r0] <== NOT EXECUTED
new_first->previous = head;
3000afc4: e5820004 str r0, [r2, #4] <== NOT EXECUTED
*the_node = old_first;
is_empty_now = new_first == tail;
3000afc8: e15c0002 cmp ip, r2 <== NOT EXECUTED
3000afcc: 13a00000 movne r0, #0 <== NOT EXECUTED
3000afd0: 03a00001 moveq r0, #1 <== NOT EXECUTED
Chain_Node *new_first = old_first->next;
head->next = new_first;
new_first->previous = head;
*the_node = old_first;
3000afd4: e5813000 str r3, [r1] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000afd8: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED
_ISR_Disable( level );
is_empty_now = _Chain_Get_with_empty_check_unprotected( chain, node );
_ISR_Enable( level );
return is_empty_now;
}
3000afdc: e8bd0010 pop {r4} <== NOT EXECUTED
3000afe0: e12fff1e bx lr <== NOT EXECUTED
3000b040 <_Chain_Prepend_with_empty_check>:
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000b040: e10fc000 mrs ip, CPSR <== NOT EXECUTED
3000b044: e38c3080 orr r3, ip, #128 ; 0x80 <== NOT EXECUTED
3000b048: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
_ISR_Disable( level );
was_empty = _Chain_Prepend_with_empty_check_unprotected( chain, node );
_ISR_Enable( level );
return was_empty;
}
3000b04c: e5902000 ldr r2, [r0] <== NOT EXECUTED
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
after_node->next = the_node;
3000b050: e1a03000 mov r3, r0 <== NOT EXECUTED
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
3000b054: e5810004 str r0, [r1, #4] <== NOT EXECUTED
before_node = after_node->next;
after_node->next = the_node;
3000b058: e4831004 str r1, [r3], #4 <== NOT EXECUTED
the_node->next = before_node;
before_node->previous = the_node;
3000b05c: e5821004 str r1, [r2, #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;
3000b060: e5812000 str r2, [r1] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000b064: e129f00c msr CPSR_fc, ip <== NOT EXECUTED
3000b068: e1520003 cmp r2, r3 <== NOT EXECUTED
3000b06c: 13a00000 movne r0, #0 <== NOT EXECUTED
3000b070: 03a00001 moveq r0, #1 <== NOT EXECUTED
3000b074: e12fff1e bx lr <== NOT EXECUTED
300095b4 <_Event_Seize>:
rtems_event_set pending_events;
ISR_Level level;
RTEMS_API_Control *api;
Thread_blocking_operation_States sync_state;
executing = _Thread_Executing;
300095b4: e59fc0fc ldr ip, [pc, #252] ; 300096b8 <_Event_Seize+0x104>
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
300095b8: e92d40f0 push {r4, r5, r6, r7, lr}
rtems_event_set pending_events;
ISR_Level level;
RTEMS_API_Control *api;
Thread_blocking_operation_States sync_state;
executing = _Thread_Executing;
300095bc: e59c4004 ldr r4, [ip, #4]
executing->Wait.return_code = RTEMS_SUCCESSFUL;
300095c0: e3a0c000 mov ip, #0
300095c4: e584c034 str ip, [r4, #52] ; 0x34
api = executing->API_Extensions[ THREAD_API_RTEMS ];
300095c8: e594c0f4 ldr ip, [r4, #244] ; 0xf4
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
300095cc: e10f7000 mrs r7, CPSR
300095d0: e3875080 orr r5, r7, #128 ; 0x80
300095d4: e129f005 msr CPSR_fc, r5
_ISR_Disable( level );
pending_events = api->pending_events;
300095d8: e59c5000 ldr r5, [ip]
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
300095dc: e0106005 ands r6, r0, r5
300095e0: 0a000003 beq 300095f4 <_Event_Seize+0x40>
300095e4: e1500006 cmp r0, r6
300095e8: 0a00001f beq 3000966c <_Event_Seize+0xb8>
(seized_events == event_in || _Options_Is_any( option_set )) ) {
300095ec: e3110002 tst r1, #2 <== NOT EXECUTED
300095f0: 1a00001d bne 3000966c <_Event_Seize+0xb8> <== NOT EXECUTED
_ISR_Enable( level );
*event_out = seized_events;
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
300095f4: e3110001 tst r1, #1
300095f8: 1a000016 bne 30009658 <_Event_Seize+0xa4>
*/
executing->Wait.option = (uint32_t) option_set;
executing->Wait.count = (uint32_t) event_in;
executing->Wait.return_argument = event_out;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
300095fc: e59f50b8 ldr r5, [pc, #184] ; 300096bc <_Event_Seize+0x108>
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
executing->Wait.count = (uint32_t) event_in;
executing->Wait.return_argument = event_out;
30009600: e5843028 str r3, [r4, #40] ; 0x28
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
30009604: e3a03001 mov r3, #1
* set properly when we are marked as in the event critical section.
*
* NOTE: Since interrupts are disabled, this isn't that much of an
* issue but better safe than sorry.
*/
executing->Wait.option = (uint32_t) option_set;
30009608: e5841030 str r1, [r4, #48] ; 0x30
executing->Wait.count = (uint32_t) event_in;
3000960c: e5840024 str r0, [r4, #36] ; 0x24
executing->Wait.return_argument = event_out;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
30009610: e5853000 str r3, [r5]
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30009614: e129f007 msr CPSR_fc, r7
_ISR_Enable( level );
if ( ticks ) {
30009618: e3520000 cmp r2, #0
3000961c: 1a000019 bne 30009688 <_Event_Seize+0xd4>
NULL
);
_Watchdog_Insert_ticks( &executing->Timer, ticks );
}
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
30009620: e1a00004 mov r0, r4
30009624: e3a01c01 mov r1, #256 ; 0x100
30009628: eb000cad bl 3000c8e4 <_Thread_Set_state>
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000962c: e10f2000 mrs r2, CPSR
30009630: e3823080 orr r3, r2, #128 ; 0x80
30009634: e129f003 msr CPSR_fc, r3
_ISR_Disable( level );
sync_state = _Event_Sync_state;
30009638: e5950000 ldr r0, [r5]
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
3000963c: e3a03000 mov r3, #0
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
30009640: e3500001 cmp r0, #1
_Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
_ISR_Disable( level );
sync_state = _Event_Sync_state;
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
30009644: e5853000 str r3, [r5]
if ( sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
30009648: 0a00000c beq 30009680 <_Event_Seize+0xcc>
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
3000964c: e1a01004 mov r1, r4 <== NOT EXECUTED
}
30009650: e8bd40f0 pop {r4, r5, r6, r7, lr} <== NOT EXECUTED
* An interrupt completed the thread's blocking request.
* The blocking thread was satisfied by an ISR or timed out.
*
* WARNING! Returning with interrupts disabled!
*/
_Thread_blocking_operation_Cancel( sync_state, executing, level );
30009654: ea000957 b 3000bbb8 <_Thread_blocking_operation_Cancel> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30009658: e129f007 msr CPSR_fc, r7
return;
}
if ( _Options_Is_no_wait( option_set ) ) {
_ISR_Enable( level );
executing->Wait.return_code = RTEMS_UNSATISFIED;
3000965c: e3a0200d mov r2, #13
30009660: e5842034 str r2, [r4, #52] ; 0x34
*event_out = seized_events;
30009664: e5836000 str r6, [r3]
return;
30009668: e8bd80f0 pop {r4, r5, r6, r7, pc}
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
3000966c: e1c55006 bic r5, r5, r6
pending_events = api->pending_events;
seized_events = _Event_sets_Get( pending_events, event_in );
if ( !_Event_sets_Is_empty( seized_events ) &&
(seized_events == event_in || _Options_Is_any( option_set )) ) {
api->pending_events =
30009670: e58c5000 str r5, [ip]
30009674: e129f007 msr CPSR_fc, r7
_Event_sets_Clear( pending_events, seized_events );
_ISR_Enable( level );
*event_out = seized_events;
30009678: e5836000 str r6, [r3]
return;
3000967c: e8bd80f0 pop {r4, r5, r6, r7, pc}
30009680: e129f002 msr CPSR_fc, r2
30009684: e8bd80f0 pop {r4, r5, r6, r7, pc}
_Event_Sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
_ISR_Enable( level );
if ( ticks ) {
_Watchdog_Initialize(
30009688: e5941008 ldr r1, [r4, #8]
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3000968c: e59f002c ldr r0, [pc, #44] ; 300096c0 <_Event_Seize+0x10c>
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
30009690: e3a03000 mov r3, #0
the_watchdog->routine = routine;
30009694: e5840064 str r0, [r4, #100] ; 0x64
the_watchdog->id = id;
30009698: e5841068 str r1, [r4, #104] ; 0x68
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3000969c: e5843050 str r3, [r4, #80] ; 0x50
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
300096a0: e584306c str r3, [r4, #108] ; 0x6c
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
300096a4: e5842054 str r2, [r4, #84] ; 0x54
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
300096a8: e59f0014 ldr r0, [pc, #20] ; 300096c4 <_Event_Seize+0x110>
300096ac: e2841048 add r1, r4, #72 ; 0x48
300096b0: eb000ded bl 3000ce6c <_Watchdog_Insert>
300096b4: eaffffd9 b 30009620 <_Event_Seize+0x6c>
30009720 <_Event_Surrender>:
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
30009720: e92d40f0 push {r4, r5, r6, r7, lr}
rtems_event_set event_condition;
rtems_event_set seized_events;
rtems_option option_set;
RTEMS_API_Control *api;
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
30009724: e59010f4 ldr r1, [r0, #244] ; 0xf4
option_set = (rtems_option) the_thread->Wait.option;
30009728: e5906030 ldr r6, [r0, #48] ; 0x30
*/
void _Event_Surrender(
Thread_Control *the_thread
)
{
3000972c: e1a04000 mov r4, r0
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
30009730: e10f0000 mrs r0, CPSR
30009734: e3803080 orr r3, r0, #128 ; 0x80
30009738: e129f003 msr CPSR_fc, r3
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
option_set = (rtems_option) the_thread->Wait.option;
_ISR_Disable( level );
pending_events = api->pending_events;
3000973c: e5912000 ldr r2, [r1]
event_condition = (rtems_event_set) the_thread->Wait.count;
30009740: e5943024 ldr r3, [r4, #36] ; 0x24
seized_events = _Event_sets_Get( pending_events, event_condition );
/*
* No events were seized in this operation
*/
if ( _Event_sets_Is_empty( seized_events ) ) {
30009744: e013c002 ands ip, r3, r2
30009748: 0a000020 beq 300097d0 <_Event_Surrender+0xb0>
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
3000974c: e59f50fc ldr r5, [pc, #252] ; 30009850 <_Event_Surrender+0x130>
30009750: e5957000 ldr r7, [r5]
30009754: e3570000 cmp r7, #0
30009758: 0a000002 beq 30009768 <_Event_Surrender+0x48>
3000975c: e5955004 ldr r5, [r5, #4] <== NOT EXECUTED
30009760: e1540005 cmp r4, r5 <== NOT EXECUTED
30009764: 0a000024 beq 300097fc <_Event_Surrender+0xdc> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_EVENT);
30009768: e5945010 ldr r5, [r4, #16]
}
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
3000976c: e3150c01 tst r5, #256 ; 0x100
30009770: 0a000014 beq 300097c8 <_Event_Surrender+0xa8>
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
30009774: e153000c cmp r3, ip
30009778: 0a000001 beq 30009784 <_Event_Surrender+0x64>
3000977c: e3160002 tst r6, #2 <== NOT EXECUTED
30009780: 0a000010 beq 300097c8 <_Event_Surrender+0xa8> <== NOT EXECUTED
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
30009784: e5943028 ldr r3, [r4, #40] ; 0x28
RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
rtems_event_set the_event_set,
rtems_event_set the_mask
)
{
return ( the_event_set & ~(the_mask) );
30009788: e1c2200c bic r2, r2, ip
/*
* Otherwise, this is a normal send to another thread
*/
if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
api->pending_events = _Event_sets_Clear( pending_events, seized_events );
3000978c: e5812000 str r2, [r1]
the_thread->Wait.count = 0;
30009790: e3a02000 mov r2, #0
30009794: e5842024 str r2, [r4, #36] ; 0x24
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
30009798: e583c000 str ip, [r3]
static inline void arm_interrupt_flash( uint32_t level )
{
uint32_t arm_switch_reg;
__asm__ volatile (
3000979c: e10f3000 mrs r3, CPSR
300097a0: e129f000 msr CPSR_fc, r0
300097a4: e129f003 msr CPSR_fc, r3
_ISR_Flash( level );
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
300097a8: e5943050 ldr r3, [r4, #80] ; 0x50
300097ac: e3530002 cmp r3, #2
300097b0: 0a000008 beq 300097d8 <_Event_Surrender+0xb8>
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
300097b4: e129f000 msr CPSR_fc, r0
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
300097b8: e59f1094 ldr r1, [pc, #148] ; 30009854 <_Event_Surrender+0x134>
300097bc: e1a00004 mov r0, r4
}
return;
}
}
_ISR_Enable( level );
}
300097c0: e8bd40f0 pop {r4, r5, r6, r7, lr}
300097c4: ea000951 b 3000bd10 <_Thread_Clear_state>
300097c8: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
300097cc: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
300097d0: e129f000 msr CPSR_fc, r0
300097d4: e8bd80f0 pop {r4, r5, r6, r7, pc}
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
300097d8: e3a03003 mov r3, #3 <== NOT EXECUTED
300097dc: e5843050 str r3, [r4, #80] ; 0x50 <== NOT EXECUTED
300097e0: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
300097e4: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED
300097e8: eb000e0e bl 3000d028 <_Watchdog_Remove> <== NOT EXECUTED
300097ec: e59f1060 ldr r1, [pc, #96] ; 30009854 <_Event_Surrender+0x134><== NOT EXECUTED
300097f0: e1a00004 mov r0, r4 <== NOT EXECUTED
}
return;
}
}
_ISR_Enable( level );
}
300097f4: e8bd40f0 pop {r4, r5, r6, r7, lr} <== NOT EXECUTED
300097f8: ea000944 b 3000bd10 <_Thread_Clear_state> <== NOT EXECUTED
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
300097fc: e59f5054 ldr r5, [pc, #84] ; 30009858 <_Event_Surrender+0x138><== NOT EXECUTED
30009800: e5957000 ldr r7, [r5] <== NOT EXECUTED
/*
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
30009804: e3570002 cmp r7, #2 <== NOT EXECUTED
30009808: 0a000002 beq 30009818 <_Event_Surrender+0xf8> <== NOT EXECUTED
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
3000980c: e5957000 ldr r7, [r5] <== NOT EXECUTED
* If we are in an ISR and sending to the current thread, then
* we have a critical section issue to deal with.
*/
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
30009810: e3570001 cmp r7, #1 <== NOT EXECUTED
30009814: 1affffd3 bne 30009768 <_Event_Surrender+0x48> <== NOT EXECUTED
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
30009818: e153000c cmp r3, ip <== NOT EXECUTED
3000981c: 0a000001 beq 30009828 <_Event_Surrender+0x108> <== NOT EXECUTED
30009820: e3160002 tst r6, #2 <== NOT EXECUTED
30009824: 0a000007 beq 30009848 <_Event_Surrender+0x128> <== NOT EXECUTED
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
30009828: e5943028 ldr r3, [r4, #40] ; 0x28 <== NOT EXECUTED
3000982c: e1c2200c bic r2, r2, ip <== NOT EXECUTED
if ( _ISR_Is_in_progress() &&
_Thread_Is_executing( the_thread ) &&
((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
(_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) {
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
api->pending_events = _Event_sets_Clear( pending_events,seized_events );
30009830: e5812000 str r2, [r1] <== NOT EXECUTED
the_thread->Wait.count = 0;
30009834: e3a02000 mov r2, #0 <== NOT EXECUTED
30009838: e5842024 str r2, [r4, #36] ; 0x24 <== NOT EXECUTED
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
3000983c: e583c000 str ip, [r3] <== NOT EXECUTED
_Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
30009840: e3a03003 mov r3, #3 <== NOT EXECUTED
30009844: e5853000 str r3, [r5] <== NOT EXECUTED
30009848: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
3000984c: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000985c <_Event_Timeout>:
void _Event_Timeout(
Objects_Id id,
void *ignored
)
{
3000985c: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
30009860: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Thread_Control *the_thread;
Objects_Locations location;
ISR_Level level;
the_thread = _Thread_Get( id, &location );
30009864: e1a0100d mov r1, sp <== NOT EXECUTED
30009868: eb000a0e bl 3000c0a8 <_Thread_Get> <== NOT EXECUTED
switch ( location ) {
3000986c: e59d3000 ldr r3, [sp] <== NOT EXECUTED
30009870: e3530000 cmp r3, #0 <== NOT EXECUTED
30009874: 1a000010 bne 300098bc <_Event_Timeout+0x60> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
30009878: e10f2000 mrs r2, CPSR <== NOT EXECUTED
3000987c: e3821080 orr r1, r2, #128 ; 0x80 <== NOT EXECUTED
30009880: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
_ISR_Enable( level );
return;
}
#endif
the_thread->Wait.count = 0;
30009884: e5803024 str r3, [r0, #36] ; 0x24 <== NOT EXECUTED
if ( _Thread_Is_executing( the_thread ) ) {
30009888: e59f304c ldr r3, [pc, #76] ; 300098dc <_Event_Timeout+0x80><== NOT EXECUTED
3000988c: e5933004 ldr r3, [r3, #4] <== NOT EXECUTED
30009890: e1500003 cmp r0, r3 <== NOT EXECUTED
30009894: 0a00000a beq 300098c4 <_Event_Timeout+0x68> <== NOT EXECUTED
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
the_thread->Wait.return_code = RTEMS_TIMEOUT;
30009898: e3a03006 mov r3, #6 <== NOT EXECUTED
3000989c: e5803034 str r3, [r0, #52] ; 0x34 <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
300098a0: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
300098a4: e59f1034 ldr r1, [pc, #52] ; 300098e0 <_Event_Timeout+0x84><== NOT EXECUTED
300098a8: eb000918 bl 3000bd10 <_Thread_Clear_state> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
300098ac: e59f3030 ldr r3, [pc, #48] ; 300098e4 <_Event_Timeout+0x88><== NOT EXECUTED
300098b0: e5932000 ldr r2, [r3] <== NOT EXECUTED
300098b4: e2422001 sub r2, r2, #1 <== NOT EXECUTED
300098b8: e5832000 str r2, [r3] <== NOT EXECUTED
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
300098bc: e28dd004 add sp, sp, #4 <== NOT EXECUTED
300098c0: e8bd8000 pop {pc} <== NOT EXECUTED
}
#endif
the_thread->Wait.count = 0;
if ( _Thread_Is_executing( the_thread ) ) {
if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
300098c4: e59f301c ldr r3, [pc, #28] ; 300098e8 <_Event_Timeout+0x8c><== NOT EXECUTED
300098c8: e5931000 ldr r1, [r3] <== NOT EXECUTED
300098cc: e3510001 cmp r1, #1 <== NOT EXECUTED
_Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
300098d0: 03a01002 moveq r1, #2 <== NOT EXECUTED
300098d4: 05831000 streq r1, [r3] <== NOT EXECUTED
300098d8: eaffffee b 30009898 <_Event_Timeout+0x3c> <== NOT EXECUTED
3000f370 <_Heap_Allocate_aligned_with_boundary>:
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
3000f370: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
3000f374: e1a08002 mov r8, r2
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
3000f378: e5902010 ldr r2, [r0, #16]
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
3000f37c: e24dd01c sub sp, sp, #28
3000f380: e1a05001 mov r5, r1
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
3000f384: e2911004 adds r1, r1, #4
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
3000f388: e1a07000 mov r7, r0
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
3000f38c: e58d1000 str r1, [sp]
Heap_Control *heap,
uintptr_t alloc_size,
uintptr_t alignment,
uintptr_t boundary
)
{
3000f390: e1a0b003 mov fp, r3
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE
- HEAP_ALLOC_BONUS;
uintptr_t const page_size = heap->page_size;
3000f394: e58d200c str r2, [sp, #12]
Heap_Block *block = NULL;
uintptr_t alloc_begin = 0;
uint32_t search_count = 0;
bool search_again = false;
if ( block_size_floor < alloc_size ) {
3000f398: 2a000078 bcs 3000f580 <_Heap_Allocate_aligned_with_boundary+0x210>
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
3000f39c: e3530000 cmp r3, #0
3000f3a0: 1a000074 bne 3000f578 <_Heap_Allocate_aligned_with_boundary+0x208>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
3000f3a4: e5979008 ldr r9, [r7, #8]
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
3000f3a8: e1570009 cmp r7, r9
3000f3ac: 0a000073 beq 3000f580 <_Heap_Allocate_aligned_with_boundary+0x210>
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
3000f3b0: e59d300c ldr r3, [sp, #12]
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
3000f3b4: e2651004 rsb r1, r5, #4
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
3000f3b8: e2833007 add r3, r3, #7
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
3000f3bc: e3a06001 mov r6, #1
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
3000f3c0: e58d3010 str r3, [sp, #16]
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
3000f3c4: e58d1014 str r1, [sp, #20]
/*
* The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag
* field. Thus the value is about one unit larger than the real block
* size. The greater than operator takes this into account.
*/
if ( block->size_and_flag > block_size_floor ) {
3000f3c8: e599a004 ldr sl, [r9, #4]
3000f3cc: e59d2000 ldr r2, [sp]
3000f3d0: e152000a cmp r2, sl
3000f3d4: 2a00004e bcs 3000f514 <_Heap_Allocate_aligned_with_boundary+0x1a4>
if ( alignment == 0 ) {
3000f3d8: e3580000 cmp r8, #0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
3000f3dc: 02894008 addeq r4, r9, #8
3000f3e0: 0a000051 beq 3000f52c <_Heap_Allocate_aligned_with_boundary+0x1bc>
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
3000f3e4: e5973014 ldr r3, [r7, #20]
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
uintptr_t alloc_begin = alloc_end - alloc_size;
3000f3e8: e59d1014 ldr r1, [sp, #20]
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
3000f3ec: e59d2010 ldr r2, [sp, #16]
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000f3f0: e3caa001 bic sl, sl, #1
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
3000f3f4: e089a00a add sl, r9, sl
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS;
uintptr_t alloc_begin = alloc_end - alloc_size;
3000f3f8: e081400a add r4, r1, sl
if ( stats->max_search < search_count ) {
stats->max_search = search_count;
}
return (void *) alloc_begin;
}
3000f3fc: e58d3004 str r3, [sp, #4]
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
+ HEAP_BLOCK_HEADER_SIZE + page_size - 1;
3000f400: e0633002 rsb r3, r3, r2
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
3000f404: e1a00004 mov r0, r4
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const block_end = block_begin + block_size;
uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_begin_ceiling = block_end - min_block_size
3000f408: e083a00a add sl, r3, sl
3000f40c: e1a01008 mov r1, r8
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
3000f410: e2893008 add r3, r9, #8
3000f414: e58d3008 str r3, [sp, #8]
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
3000f418: eb00154b bl 3001494c <__umodsi3>
3000f41c: e0604004 rsb r4, r0, r4
uintptr_t alloc_begin = alloc_end - alloc_size;
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
3000f420: e15a0004 cmp sl, r4
3000f424: 2a000003 bcs 3000f438 <_Heap_Allocate_aligned_with_boundary+0xc8>
3000f428: e1a0000a mov r0, sl <== NOT EXECUTED
3000f42c: e1a01008 mov r1, r8 <== NOT EXECUTED
3000f430: eb001545 bl 3001494c <__umodsi3> <== NOT EXECUTED
3000f434: e060400a rsb r4, r0, sl <== NOT EXECUTED
}
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
3000f438: e35b0000 cmp fp, #0
3000f43c: 0a000026 beq 3000f4dc <_Heap_Allocate_aligned_with_boundary+0x16c>
/* Ensure that the we have a valid new block at the end */
if ( alloc_begin > alloc_begin_ceiling ) {
alloc_begin = _Heap_Align_down( alloc_begin_ceiling, alignment );
}
alloc_end = alloc_begin + alloc_size;
3000f440: e084a005 add sl, r4, r5 <== NOT EXECUTED
3000f444: e1a0000a mov r0, sl <== NOT EXECUTED
3000f448: e1a0100b mov r1, fp <== NOT EXECUTED
3000f44c: eb00153e bl 3001494c <__umodsi3> <== NOT EXECUTED
3000f450: e060000a rsb r0, r0, sl <== NOT EXECUTED
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
3000f454: e15a0000 cmp sl, r0 <== NOT EXECUTED
3000f458: 93a0a000 movls sl, #0 <== NOT EXECUTED
3000f45c: 83a0a001 movhi sl, #1 <== NOT EXECUTED
3000f460: e1540000 cmp r4, r0 <== NOT EXECUTED
3000f464: 23a0a000 movcs sl, #0 <== NOT EXECUTED
3000f468: e35a0000 cmp sl, #0 <== NOT EXECUTED
3000f46c: 0a00001a beq 3000f4dc <_Heap_Allocate_aligned_with_boundary+0x16c><== NOT EXECUTED
alloc_end = alloc_begin + alloc_size;
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
3000f470: e59d1008 ldr r1, [sp, #8] <== NOT EXECUTED
3000f474: e0813005 add r3, r1, r5 <== NOT EXECUTED
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
if ( boundary_line < boundary_floor ) {
3000f478: e1530000 cmp r3, r0 <== NOT EXECUTED
3000f47c: 958d9018 strls r9, [sp, #24] <== NOT EXECUTED
3000f480: 91a09003 movls r9, r3 <== NOT EXECUTED
3000f484: 9a000002 bls 3000f494 <_Heap_Allocate_aligned_with_boundary+0x124><== NOT EXECUTED
3000f488: ea000021 b 3000f514 <_Heap_Allocate_aligned_with_boundary+0x1a4><== NOT EXECUTED
3000f48c: e1590000 cmp r9, r0 <== NOT EXECUTED
3000f490: 8a00003c bhi 3000f588 <_Heap_Allocate_aligned_with_boundary+0x218><== NOT EXECUTED
return 0;
}
alloc_begin = boundary_line - alloc_size;
3000f494: e0654000 rsb r4, r5, r0 <== NOT EXECUTED
3000f498: e1a01008 mov r1, r8 <== NOT EXECUTED
3000f49c: e1a00004 mov r0, r4 <== NOT EXECUTED
3000f4a0: eb001529 bl 3001494c <__umodsi3> <== NOT EXECUTED
3000f4a4: e0604004 rsb r4, r0, r4 <== NOT EXECUTED
alloc_begin = _Heap_Align_down( alloc_begin, alignment );
alloc_end = alloc_begin + alloc_size;
3000f4a8: e084a005 add sl, r4, r5 <== NOT EXECUTED
3000f4ac: e1a0000a mov r0, sl <== NOT EXECUTED
3000f4b0: e1a0100b mov r1, fp <== NOT EXECUTED
3000f4b4: eb001524 bl 3001494c <__umodsi3> <== NOT EXECUTED
3000f4b8: e060000a rsb r0, r0, sl <== NOT EXECUTED
/* Ensure boundary constaint */
if ( boundary != 0 ) {
uintptr_t const boundary_floor = alloc_begin_floor + alloc_size;
uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary );
while ( alloc_begin < boundary_line && boundary_line < alloc_end ) {
3000f4bc: e15a0000 cmp sl, r0 <== NOT EXECUTED
3000f4c0: 93a0a000 movls sl, #0 <== NOT EXECUTED
3000f4c4: 83a0a001 movhi sl, #1 <== NOT EXECUTED
3000f4c8: e1540000 cmp r4, r0 <== NOT EXECUTED
3000f4cc: 23a0a000 movcs sl, #0 <== NOT EXECUTED
3000f4d0: e35a0000 cmp sl, #0 <== NOT EXECUTED
3000f4d4: 1affffec bne 3000f48c <_Heap_Allocate_aligned_with_boundary+0x11c><== NOT EXECUTED
3000f4d8: e59d9018 ldr r9, [sp, #24] <== NOT EXECUTED
boundary_line = _Heap_Align_down( alloc_end, boundary );
}
}
/* Ensure that the we have a valid new block at the beginning */
if ( alloc_begin >= alloc_begin_floor ) {
3000f4dc: e59d2008 ldr r2, [sp, #8]
3000f4e0: e1520004 cmp r2, r4
3000f4e4: 8a00000a bhi 3000f514 <_Heap_Allocate_aligned_with_boundary+0x1a4>
3000f4e8: e59d100c ldr r1, [sp, #12]
3000f4ec: e1a00004 mov r0, r4
3000f4f0: eb001515 bl 3001494c <__umodsi3>
3000f4f4: e3e0a007 mvn sl, #7
3000f4f8: e069a00a rsb sl, r9, sl
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
3000f4fc: e08aa004 add sl, sl, r4
uintptr_t const alloc_block_begin =
(uintptr_t) _Heap_Block_of_alloc_area( alloc_begin, page_size );
uintptr_t const free_size = alloc_block_begin - block_begin;
if ( free_size >= min_block_size || free_size == 0 ) {
3000f500: e59d1004 ldr r1, [sp, #4]
3000f504: e060300a rsb r3, r0, sl
3000f508: e15a0000 cmp sl, r0
3000f50c: 11510003 cmpne r1, r3
3000f510: 9a000005 bls 3000f52c <_Heap_Allocate_aligned_with_boundary+0x1bc>
if ( alloc_begin != 0 ) {
break;
}
block = block->next;
3000f514: e5999008 ldr r9, [r9, #8]
3000f518: e2863001 add r3, r6, #1
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
3000f51c: e1570009 cmp r7, r9
3000f520: 0a00001d beq 3000f59c <_Heap_Allocate_aligned_with_boundary+0x22c>
3000f524: e1a06003 mov r6, r3
3000f528: eaffffa6 b 3000f3c8 <_Heap_Allocate_aligned_with_boundary+0x58>
}
/* Statistics */
++search_count;
if ( alloc_begin != 0 ) {
3000f52c: e3540000 cmp r4, #0
3000f530: 0afffff7 beq 3000f514 <_Heap_Allocate_aligned_with_boundary+0x1a4>
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
3000f534: e5972048 ldr r2, [r7, #72] ; 0x48
stats->searches += search_count;
3000f538: e597304c ldr r3, [r7, #76] ; 0x4c
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
3000f53c: e2822001 add r2, r2, #1
stats->searches += search_count;
3000f540: e0833006 add r3, r3, r6
search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin );
} while ( search_again );
if ( alloc_begin != 0 ) {
/* Statistics */
++stats->allocs;
3000f544: e5872048 str r2, [r7, #72] ; 0x48
stats->searches += search_count;
3000f548: e587304c str r3, [r7, #76] ; 0x4c
block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size );
3000f54c: e1a00007 mov r0, r7
3000f550: e1a01009 mov r1, r9
3000f554: e1a02004 mov r2, r4
3000f558: e1a03005 mov r3, r5
3000f55c: ebffeddf bl 3000ace0 <_Heap_Block_allocate>
3000f560: e1a00004 mov r0, r4
boundary
);
}
/* Statistics */
if ( stats->max_search < search_count ) {
3000f564: e5973044 ldr r3, [r7, #68] ; 0x44
3000f568: e1530006 cmp r3, r6
stats->max_search = search_count;
3000f56c: 35876044 strcc r6, [r7, #68] ; 0x44
}
return (void *) alloc_begin;
}
3000f570: e28dd01c add sp, sp, #28
3000f574: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
/* Integer overflow occured */
return NULL;
}
if ( boundary != 0 ) {
if ( boundary < alloc_size ) {
3000f578: e1550003 cmp r5, r3 <== NOT EXECUTED
3000f57c: 9a000008 bls 3000f5a4 <_Heap_Allocate_aligned_with_boundary+0x234><== NOT EXECUTED
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
3000f580: e3a00000 mov r0, #0
3000f584: eafffff9 b 3000f570 <_Heap_Allocate_aligned_with_boundary+0x200>
3000f588: e59d9018 ldr r9, [sp, #24] <== NOT EXECUTED
if ( alloc_begin != 0 ) {
break;
}
block = block->next;
3000f58c: e2863001 add r3, r6, #1 <== NOT EXECUTED
3000f590: e5999008 ldr r9, [r9, #8] <== NOT EXECUTED
do {
Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
block = _Heap_Free_list_first( heap );
while ( block != free_list_tail ) {
3000f594: e1570009 cmp r7, r9 <== NOT EXECUTED
3000f598: 1affffe1 bne 3000f524 <_Heap_Allocate_aligned_with_boundary+0x1b4><== NOT EXECUTED
3000f59c: e3a00000 mov r0, #0
3000f5a0: eaffffef b 3000f564 <_Heap_Allocate_aligned_with_boundary+0x1f4>
if ( boundary < alloc_size ) {
return NULL;
}
if ( alignment == 0 ) {
alignment = page_size;
3000f5a4: e3580000 cmp r8, #0 <== NOT EXECUTED
3000f5a8: 01a08002 moveq r8, r2 <== NOT EXECUTED
3000f5ac: eaffff7c b 3000f3a4 <_Heap_Allocate_aligned_with_boundary+0x34><== NOT EXECUTED
3000ace0 <_Heap_Block_allocate>:
Heap_Control *heap,
Heap_Block *block,
uintptr_t alloc_begin,
uintptr_t alloc_size
)
{
3000ace0: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
}
_Heap_Protection_block_initialize( heap, block );
return block;
}
3000ace4: e5917004 ldr r7, [r1, #4]
Heap_Control *heap,
Heap_Block *block,
uintptr_t alloc_begin,
uintptr_t alloc_size
)
{
3000ace8: e1a05001 mov r5, r1
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000acec: e3c71001 bic r1, r7, #1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000acf0: e0858001 add r8, r5, r1
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000acf4: e598c004 ldr ip, [r8, #4]
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block(
const Heap_Block *block
)
{
return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE;
3000acf8: e2426008 sub r6, r2, #8
Heap_Block *free_list_anchor = NULL;
_HAssert( alloc_area_begin <= alloc_begin );
if ( _Heap_Is_free( block ) ) {
3000acfc: e31c0001 tst ip, #1
Heap_Control *heap,
Heap_Block *block,
uintptr_t alloc_begin,
uintptr_t alloc_size
)
{
3000ad00: e1a0a003 mov sl, r3
3000ad04: e1a04000 mov r4, r0
Heap_Statistics *const stats = &heap->stats;
uintptr_t const alloc_area_begin = _Heap_Alloc_area_of_block( block );
uintptr_t const alloc_area_offset = alloc_begin - alloc_area_begin;
3000ad08: e0653006 rsb r3, r5, r6
/* Statistics */
--stats->free_blocks;
++stats->used_blocks;
stats->free_size -= _Heap_Block_size( block );
} else {
free_list_anchor = _Heap_Free_list_head( heap );
3000ad0c: 11a09000 movne r9, r0
Heap_Block *free_list_anchor = NULL;
_HAssert( alloc_area_begin <= alloc_begin );
if ( _Heap_Is_free( block ) ) {
3000ad10: 1a00000c bne 3000ad48 <_Heap_Block_allocate+0x68>
free_list_anchor = block->prev;
_Heap_Free_list_remove( block );
/* Statistics */
--stats->free_blocks;
3000ad14: e590e038 ldr lr, [r0, #56] ; 0x38
++stats->used_blocks;
3000ad18: e590c040 ldr ip, [r0, #64] ; 0x40
stats->free_size -= _Heap_Block_size( block );
3000ad1c: e590b030 ldr fp, [r0, #48] ; 0x30
Heap_Block *free_list_anchor = NULL;
_HAssert( alloc_area_begin <= alloc_begin );
if ( _Heap_Is_free( block ) ) {
free_list_anchor = block->prev;
3000ad20: e595900c ldr r9, [r5, #12]
}
_Heap_Protection_block_initialize( heap, block );
return block;
}
3000ad24: e5950008 ldr r0, [r5, #8]
free_list_anchor = block->prev;
_Heap_Free_list_remove( block );
/* Statistics */
--stats->free_blocks;
3000ad28: e24ee001 sub lr, lr, #1
++stats->used_blocks;
3000ad2c: e28cc001 add ip, ip, #1
stats->free_size -= _Heap_Block_size( block );
3000ad30: e061100b rsb r1, r1, fp
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
3000ad34: e5890008 str r0, [r9, #8]
next->prev = prev;
3000ad38: e580900c str r9, [r0, #12]
free_list_anchor = block->prev;
_Heap_Free_list_remove( block );
/* Statistics */
--stats->free_blocks;
3000ad3c: e584e038 str lr, [r4, #56] ; 0x38
++stats->used_blocks;
3000ad40: e584c040 str ip, [r4, #64] ; 0x40
stats->free_size -= _Heap_Block_size( block );
3000ad44: e5841030 str r1, [r4, #48] ; 0x30
} else {
free_list_anchor = _Heap_Free_list_head( heap );
}
if ( alloc_area_offset < heap->page_size ) {
3000ad48: e5941010 ldr r1, [r4, #16]
3000ad4c: e1530001 cmp r3, r1
3000ad50: 3a000027 bcc 3000adf4 <_Heap_Block_allocate+0x114>
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
3000ad54: e1a00002 mov r0, r2
3000ad58: eb0026fb bl 3001494c <__umodsi3>
_HAssert( block_size >= heap->min_block_size );
_HAssert( new_block_size >= heap->min_block_size );
/* Statistics */
stats->free_size += block_size;
3000ad5c: e5943030 ldr r3, [r4, #48] ; 0x30
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
3000ad60: e0606006 rsb r6, r0, r6
_Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
uintptr_t const new_block_begin = (uintptr_t) new_block;
uintptr_t const new_block_size = block_end - new_block_begin;
block_end = new_block_begin;
block_size = block_end - block_begin;
3000ad64: e0651006 rsb r1, r5, r6
_HAssert( block_size >= heap->min_block_size );
_HAssert( new_block_size >= heap->min_block_size );
/* Statistics */
stats->free_size += block_size;
3000ad68: e0833001 add r3, r3, r1
if ( _Heap_Is_prev_used( block ) ) {
3000ad6c: e3170001 tst r7, #1
uintptr_t block_end = block_begin + block_size;
Heap_Block *const new_block =
_Heap_Block_of_alloc_area( alloc_begin, heap->page_size );
uintptr_t const new_block_begin = (uintptr_t) new_block;
uintptr_t const new_block_size = block_end - new_block_begin;
3000ad70: e0668008 rsb r8, r6, r8
_HAssert( block_size >= heap->min_block_size );
_HAssert( new_block_size >= heap->min_block_size );
/* Statistics */
stats->free_size += block_size;
3000ad74: e5843030 str r3, [r4, #48] ; 0x30
if ( _Heap_Is_prev_used( block ) ) {
3000ad78: 1a000013 bne 3000adcc <_Heap_Block_allocate+0xec>
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Prev_block(
const Heap_Block *block
)
{
return (Heap_Block *) ((uintptr_t) block - block->prev_size);
3000ad7c: e5953000 ldr r3, [r5] <== NOT EXECUTED
} else {
Heap_Block *const prev_block = _Heap_Prev_block( block );
uintptr_t const prev_block_size = _Heap_Block_size( prev_block );
block = prev_block;
block_size += prev_block_size;
3000ad80: e1a02009 mov r2, r9 <== NOT EXECUTED
3000ad84: e0635005 rsb r5, r3, r5 <== NOT EXECUTED
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000ad88: e5953004 ldr r3, [r5, #4] <== NOT EXECUTED
3000ad8c: e3c33001 bic r3, r3, #1 <== NOT EXECUTED
3000ad90: e0811003 add r1, r1, r3 <== NOT EXECUTED
}
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
3000ad94: e3813001 orr r3, r1, #1
3000ad98: e5853004 str r3, [r5, #4]
new_block->prev_size = block_size;
3000ad9c: e5861000 str r1, [r6]
new_block->size_and_flag = new_block_size;
_Heap_Block_split( heap, new_block, free_list_anchor, alloc_size );
3000ada0: e1a00004 mov r0, r4
3000ada4: e1a0300a mov r3, sl
}
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
new_block->prev_size = block_size;
new_block->size_and_flag = new_block_size;
3000ada8: e5868004 str r8, [r6, #4]
_Heap_Block_split( heap, new_block, free_list_anchor, alloc_size );
3000adac: e1a01006 mov r1, r6
3000adb0: ebffff1a bl 3000aa20 <_Heap_Block_split>
alloc_size
);
}
/* Statistics */
if ( stats->min_free_size > stats->free_size ) {
3000adb4: e5943030 ldr r3, [r4, #48] ; 0x30
3000adb8: e5942034 ldr r2, [r4, #52] ; 0x34
}
_Heap_Protection_block_initialize( heap, block );
return block;
}
3000adbc: e1a00006 mov r0, r6
alloc_size
);
}
/* Statistics */
if ( stats->min_free_size > stats->free_size ) {
3000adc0: e1520003 cmp r2, r3
stats->min_free_size = stats->free_size;
3000adc4: 85843034 strhi r3, [r4, #52] ; 0x34
}
_Heap_Protection_block_initialize( heap, block );
return block;
}
3000adc8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
_Heap_Free_list_insert_after( free_list_anchor, block );
free_list_anchor = block;
/* Statistics */
++stats->free_blocks;
3000adcc: e5940038 ldr r0, [r4, #56] ; 0x38
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
3000add0: e5993008 ldr r3, [r9, #8]
3000add4: e2800001 add r0, r0, #1
new_block->next = next;
3000add8: e5853008 str r3, [r5, #8]
new_block->prev = block_before;
3000addc: e585900c str r9, [r5, #12]
block_before->next = new_block;
3000ade0: e5895008 str r5, [r9, #8]
next->prev = new_block;
3000ade4: e583500c str r5, [r3, #12]
3000ade8: e1a02005 mov r2, r5
3000adec: e5840038 str r0, [r4, #56] ; 0x38
3000adf0: eaffffe7 b 3000ad94 <_Heap_Block_allocate+0xb4>
Heap_Block *block,
Heap_Block *free_list_anchor,
uintptr_t alloc_size
)
{
_Heap_Block_split( heap, block, free_list_anchor, alloc_size );
3000adf4: e1a00004 mov r0, r4
3000adf8: e1a02009 mov r2, r9
3000adfc: e083300a add r3, r3, sl
3000ae00: e1a01005 mov r1, r5
3000ae04: ebffff05 bl 3000aa20 <_Heap_Block_split>
alloc_size
);
}
/* Statistics */
if ( stats->min_free_size > stats->free_size ) {
3000ae08: e5943030 ldr r3, [r4, #48] ; 0x30
3000ae0c: e5942034 ldr r2, [r4, #52] ; 0x34
Heap_Block *block,
Heap_Block *free_list_anchor,
uintptr_t alloc_size
)
{
_Heap_Block_split( heap, block, free_list_anchor, alloc_size );
3000ae10: e1a06005 mov r6, r5
alloc_size
);
}
/* Statistics */
if ( stats->min_free_size > stats->free_size ) {
3000ae14: e1520003 cmp r2, r3
stats->min_free_size = stats->free_size;
3000ae18: 85843034 strhi r3, [r4, #52] ; 0x34
}
_Heap_Protection_block_initialize( heap, block );
return block;
}
3000ae1c: e1a00006 mov r0, r6
3000ae20: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
3000aa20 <_Heap_Block_split>:
Heap_Control *heap,
Heap_Block *block,
Heap_Block *free_list_anchor,
uintptr_t alloc_size
)
{
3000aa20: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
Heap_Statistics *const stats = &heap->stats;
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
3000aa24: e5905014 ldr r5, [r0, #20]
uintptr_t alloc_size
)
{
Heap_Statistics *const stats = &heap->stats;
uintptr_t const page_size = heap->page_size;
3000aa28: e5906010 ldr r6, [r0, #16]
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const min_alloc_size = min_block_size - HEAP_BLOCK_HEADER_SIZE;
3000aa2c: e2458008 sub r8, r5, #8
return heap->stats.size;
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Max( uintptr_t a, uintptr_t b )
{
return a > b ? a : b;
3000aa30: e1530008 cmp r3, r8
3000aa34: 21a08003 movcs r8, r3
uintptr_t const block_size = _Heap_Block_size( block );
uintptr_t const used_size =
3000aa38: e2888008 add r8, r8, #8
Heap_Control *heap,
Heap_Block *block,
Heap_Block *free_list_anchor,
uintptr_t alloc_size
)
{
3000aa3c: e1a07001 mov r7, r1
3000aa40: e1a04000 mov r4, r0
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
3000aa44: e1a01006 mov r1, r6
3000aa48: e1a00008 mov r0, r8
3000aa4c: e1a09002 mov r9, r2
3000aa50: eb0027bd bl 3001494c <__umodsi3>
}
_Heap_Protection_block_initialize( heap, block );
return block;
}
3000aa54: e597a004 ldr sl, [r7, #4]
if ( remainder != 0 ) {
3000aa58: e3500000 cmp r0, #0
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000aa5c: e3ca2001 bic r2, sl, #1
uintptr_t const used_size =
_Heap_Max( alloc_size, min_alloc_size ) + HEAP_BLOCK_HEADER_SIZE;
uintptr_t const used_block_size = _Heap_Align_up( used_size, page_size );
uintptr_t const free_size = block_size + HEAP_ALLOC_BONUS - used_size;
3000aa60: e2823004 add r3, r2, #4
)
{
uintptr_t remainder = value % alignment;
if ( remainder != 0 ) {
return value - remainder + alignment;
3000aa64: 10886006 addne r6, r8, r6
} else {
return value;
3000aa68: 01a06008 moveq r6, r8
uintptr_t const free_size_limit = min_block_size + HEAP_ALLOC_BONUS;
3000aa6c: e2855004 add r5, r5, #4
uintptr_t const used_size =
_Heap_Max( alloc_size, min_alloc_size ) + HEAP_BLOCK_HEADER_SIZE;
uintptr_t const used_block_size = _Heap_Align_up( used_size, page_size );
uintptr_t const free_size = block_size + HEAP_ALLOC_BONUS - used_size;
3000aa70: e0688003 rsb r8, r8, r3
)
{
uintptr_t remainder = value % alignment;
if ( remainder != 0 ) {
return value - remainder + alignment;
3000aa74: 10606006 rsbne r6, r0, r6
Heap_Block *next_block = _Heap_Block_at( block, block_size );
_HAssert( used_size <= block_size + HEAP_ALLOC_BONUS );
_HAssert( used_size + free_size == block_size + HEAP_ALLOC_BONUS );
if ( free_size >= free_size_limit ) {
3000aa78: e1580005 cmp r8, r5
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000aa7c: e0873002 add r3, r7, r2
3000aa80: 3a00001c bcc 3000aaf8 <_Heap_Block_split+0xd8>
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000aa84: e20aa001 and sl, sl, #1
block->size_and_flag = size | flag;
3000aa88: e186a00a orr sl, r6, sl
3000aa8c: e587a004 str sl, [r7, #4]
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000aa90: e5931004 ldr r1, [r3, #4]
_HAssert( used_block_size + free_block_size == block_size );
_Heap_Block_set_size( block, used_block_size );
/* Statistics */
stats->free_size += free_block_size;
3000aa94: e5940030 ldr r0, [r4, #48] ; 0x30
3000aa98: e3c11001 bic r1, r1, #1
}
_Heap_Protection_block_initialize( heap, block );
return block;
}
3000aa9c: e083c001 add ip, r3, r1
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000aaa0: e59cc004 ldr ip, [ip, #4]
_HAssert( used_size <= block_size + HEAP_ALLOC_BONUS );
_HAssert( used_size + free_size == block_size + HEAP_ALLOC_BONUS );
if ( free_size >= free_size_limit ) {
Heap_Block *const free_block = _Heap_Block_at( block, used_block_size );
uintptr_t free_block_size = block_size - used_block_size;
3000aaa4: e0662002 rsb r2, r6, r2
_HAssert( used_block_size + free_block_size == block_size );
_Heap_Block_set_size( block, used_block_size );
/* Statistics */
stats->free_size += free_block_size;
3000aaa8: e0800002 add r0, r0, r2
if ( _Heap_Is_used( next_block ) ) {
3000aaac: e31c0001 tst ip, #1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000aab0: e0867007 add r7, r6, r7
_HAssert( used_block_size + free_block_size == block_size );
_Heap_Block_set_size( block, used_block_size );
/* Statistics */
stats->free_size += free_block_size;
3000aab4: e5840030 str r0, [r4, #48] ; 0x30
if ( _Heap_Is_used( next_block ) ) {
3000aab8: 1a000012 bne 3000ab08 <_Heap_Block_split+0xe8>
}
_Heap_Protection_block_initialize( heap, block );
return block;
}
3000aabc: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
3000aac0: e593300c ldr r3, [r3, #12] <== NOT EXECUTED
} else {
uintptr_t const next_block_size = _Heap_Block_size( next_block );
_Heap_Free_list_replace( next_block, free_block );
free_block_size += next_block_size;
3000aac4: e0822001 add r2, r2, r1 <== NOT EXECUTED
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
new_block->prev = prev;
3000aac8: e587300c str r3, [r7, #12] <== NOT EXECUTED
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
3000aacc: e5870008 str r0, [r7, #8] <== NOT EXECUTED
new_block->prev = prev;
next->prev = new_block;
3000aad0: e580700c str r7, [r0, #12] <== NOT EXECUTED
prev->next = new_block;
3000aad4: e5837008 str r7, [r3, #8] <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000aad8: e0823007 add r3, r2, r7 <== NOT EXECUTED
next_block = _Heap_Block_at( free_block, free_block_size );
}
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
3000aadc: e3821001 orr r1, r2, #1
3000aae0: e5871004 str r1, [r7, #4]
next_block->prev_size = free_block_size;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
3000aae4: e5931004 ldr r1, [r3, #4]
next_block = _Heap_Block_at( free_block, free_block_size );
}
free_block->size_and_flag = free_block_size | HEAP_PREV_BLOCK_USED;
next_block->prev_size = free_block_size;
3000aae8: e5832000 str r2, [r3]
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
3000aaec: e3c12001 bic r2, r1, #1
3000aaf0: e5832004 str r2, [r3, #4]
3000aaf4: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
_Heap_Protection_block_initialize( heap, free_block );
} else {
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
3000aaf8: e5932004 ldr r2, [r3, #4]
3000aafc: e3822001 orr r2, r2, #1
3000ab00: e5832004 str r2, [r3, #4]
3000ab04: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
if ( _Heap_Is_used( next_block ) ) {
_Heap_Free_list_insert_after( free_list_anchor, free_block );
/* Statistics */
++stats->free_blocks;
3000ab08: e5940038 ldr r0, [r4, #56] ; 0x38
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
3000ab0c: e5991008 ldr r1, [r9, #8]
3000ab10: e2800001 add r0, r0, #1
new_block->next = next;
3000ab14: e5871008 str r1, [r7, #8]
new_block->prev = block_before;
3000ab18: e587900c str r9, [r7, #12]
block_before->next = new_block;
3000ab1c: e5897008 str r7, [r9, #8]
next->prev = new_block;
3000ab20: e581700c str r7, [r1, #12]
3000ab24: e5840038 str r0, [r4, #56] ; 0x38
3000ab28: eaffffeb b 3000aadc <_Heap_Block_split+0xbc>
3000f8f4 <_Heap_Extend>:
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
3000f8f4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
3000f8f8: e1a05000 mov r5, r0 <== NOT EXECUTED
uintptr_t const free_size = stats->free_size;
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
3000f8fc: e0916002 adds r6, r1, r2 <== NOT EXECUTED
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
3000f900: e1a04001 mov r4, r1 <== NOT EXECUTED
Heap_Statistics *const stats = &heap->stats;
Heap_Block *const first_block = heap->first_block;
3000f904: e5908020 ldr r8, [r0, #32] <== NOT EXECUTED
Heap_Block *extend_last_block = NULL;
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
uintptr_t const free_size = stats->free_size;
3000f908: e5951030 ldr r1, [r5, #48] ; 0x30 <== NOT EXECUTED
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
Heap_Block *extend_last_block = NULL;
uintptr_t const page_size = heap->page_size;
3000f90c: e5900010 ldr r0, [r0, #16] <== NOT EXECUTED
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
3000f910: e24dd024 sub sp, sp, #36 ; 0x24 <== NOT EXECUTED
Heap_Block *start_block = first_block;
Heap_Block *merge_below_block = NULL;
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
3000f914: e3a07000 mov r7, #0 <== NOT EXECUTED
Heap_Control *heap,
void *extend_area_begin_ptr,
uintptr_t extend_area_size,
uintptr_t *extended_size_ptr
)
{
3000f918: e58d3010 str r3, [sp, #16] <== NOT EXECUTED
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
Heap_Block *extend_last_block = NULL;
uintptr_t const page_size = heap->page_size;
3000f91c: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
Heap_Block *start_block = first_block;
Heap_Block *merge_below_block = NULL;
Heap_Block *merge_above_block = NULL;
Heap_Block *link_below_block = NULL;
Heap_Block *link_above_block = NULL;
Heap_Block *extend_first_block = NULL;
3000f920: e58d7020 str r7, [sp, #32] <== NOT EXECUTED
Heap_Block *extend_last_block = NULL;
3000f924: e58d701c str r7, [sp, #28] <== NOT EXECUTED
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
3000f928: e5953014 ldr r3, [r5, #20] <== NOT EXECUTED
uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr;
uintptr_t const extend_area_end = extend_area_begin + extend_area_size;
uintptr_t const free_size = stats->free_size;
3000f92c: e58d1018 str r1, [sp, #24] <== NOT EXECUTED
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
return false;
3000f930: 21a00007 movcs r0, r7 <== NOT EXECUTED
uintptr_t const free_size = stats->free_size;
uintptr_t extend_first_block_size = 0;
uintptr_t extended_size = 0;
bool extend_area_ok = false;
if ( extend_area_end < extend_area_begin ) {
3000f934: 3a000001 bcc 3000f940 <_Heap_Extend+0x4c> <== NOT EXECUTED
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
3000f938: e28dd024 add sp, sp, #36 ; 0x24 <== NOT EXECUTED
3000f93c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
if ( extend_area_end < extend_area_begin ) {
return false;
}
extend_area_ok = _Heap_Get_first_and_last_block(
3000f940: e28dc020 add ip, sp, #32 <== NOT EXECUTED
3000f944: e1a01002 mov r1, r2 <== NOT EXECUTED
3000f948: e58dc000 str ip, [sp] <== NOT EXECUTED
3000f94c: e1a00004 mov r0, r4 <== NOT EXECUTED
3000f950: e28dc01c add ip, sp, #28 <== NOT EXECUTED
3000f954: e59d2008 ldr r2, [sp, #8] <== NOT EXECUTED
3000f958: e58dc004 str ip, [sp, #4] <== NOT EXECUTED
3000f95c: ebffed49 bl 3000ae88 <_Heap_Get_first_and_last_block> <== NOT EXECUTED
page_size,
min_block_size,
&extend_first_block,
&extend_last_block
);
if (!extend_area_ok ) {
3000f960: e3500000 cmp r0, #0 <== NOT EXECUTED
3000f964: 0afffff3 beq 3000f938 <_Heap_Extend+0x44> <== NOT EXECUTED
3000f968: e1a09008 mov r9, r8 <== NOT EXECUTED
3000f96c: e1a0b007 mov fp, r7 <== NOT EXECUTED
3000f970: e58d700c str r7, [sp, #12] <== NOT EXECUTED
3000f974: e58d7014 str r7, [sp, #20] <== NOT EXECUTED
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
3000f978: e1590008 cmp r9, r8 <== NOT EXECUTED
3000f97c: 05953018 ldreq r3, [r5, #24] <== NOT EXECUTED
uintptr_t const sub_area_end = start_block->prev_size;
3000f980: e599a000 ldr sl, [r9] <== NOT EXECUTED
return false;
}
do {
uintptr_t const sub_area_begin = (start_block != first_block) ?
(uintptr_t) start_block : heap->area_begin;
3000f984: 11a03009 movne r3, r9 <== NOT EXECUTED
uintptr_t const sub_area_end = start_block->prev_size;
Heap_Block *const end_block =
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
3000f988: e1530006 cmp r3, r6 <== NOT EXECUTED
3000f98c: 3154000a cmpcc r4, sl <== NOT EXECUTED
3000f990: 3a00006c bcc 3000fb48 <_Heap_Extend+0x254> <== NOT EXECUTED
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
}
if ( extend_area_end == sub_area_begin ) {
3000f994: e1530006 cmp r3, r6 <== NOT EXECUTED
3000f998: 058d9014 streq r9, [sp, #20] <== NOT EXECUTED
3000f99c: 0a000001 beq 3000f9a8 <_Heap_Extend+0xb4> <== NOT EXECUTED
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
3000f9a0: e156000a cmp r6, sl <== NOT EXECUTED
3000f9a4: 31a0b009 movcc fp, r9 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
3000f9a8: e1a0000a mov r0, sl <== NOT EXECUTED
3000f9ac: e59d1008 ldr r1, [sp, #8] <== NOT EXECUTED
3000f9b0: eb001538 bl 30014e98 <__umodsi3> <== NOT EXECUTED
3000f9b4: e24a3008 sub r3, sl, #8 <== NOT EXECUTED
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
3000f9b8: e15a0004 cmp sl, r4 <== NOT EXECUTED
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
3000f9bc: e0603003 rsb r3, r0, r3 <== NOT EXECUTED
start_block->prev_size = extend_area_end;
3000f9c0: 05896000 streq r6, [r9] <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_of_alloc_area(
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
3000f9c4: 058d300c streq r3, [sp, #12] <== NOT EXECUTED
merge_below_block = start_block;
} else if ( extend_area_end < sub_area_end ) {
link_below_block = start_block;
}
if ( sub_area_end == extend_area_begin ) {
3000f9c8: 0a000001 beq 3000f9d4 <_Heap_Extend+0xe0> <== NOT EXECUTED
3000f9cc: e154000a cmp r4, sl <== NOT EXECUTED
3000f9d0: 81a07003 movhi r7, r3 <== NOT EXECUTED
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000f9d4: e5939004 ldr r9, [r3, #4] <== NOT EXECUTED
3000f9d8: e3c99001 bic r9, r9, #1 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000f9dc: e0839009 add r9, r3, r9 <== NOT EXECUTED
} else if ( sub_area_end < extend_area_begin ) {
link_above_block = end_block;
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
3000f9e0: e1580009 cmp r8, r9 <== NOT EXECUTED
3000f9e4: 1affffe3 bne 3000f978 <_Heap_Extend+0x84> <== NOT EXECUTED
if ( extend_area_begin < heap->area_begin ) {
3000f9e8: e5953018 ldr r3, [r5, #24] <== NOT EXECUTED
3000f9ec: e1540003 cmp r4, r3 <== NOT EXECUTED
heap->area_begin = extend_area_begin;
3000f9f0: 35854018 strcc r4, [r5, #24] <== NOT EXECUTED
}
start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) );
} while ( start_block != first_block );
if ( extend_area_begin < heap->area_begin ) {
3000f9f4: 3a000002 bcc 3000fa04 <_Heap_Extend+0x110> <== NOT EXECUTED
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
3000f9f8: e595301c ldr r3, [r5, #28] <== NOT EXECUTED
3000f9fc: e1560003 cmp r6, r3 <== NOT EXECUTED
heap->area_end = extend_area_end;
3000fa00: 8585601c strhi r6, [r5, #28] <== NOT EXECUTED
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
3000fa04: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED
3000fa08: e59d201c ldr r2, [sp, #28] <== NOT EXECUTED
extend_last_block->prev_size = extend_first_block_size;
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
3000fa0c: e595c020 ldr ip, [r5, #32] <== NOT EXECUTED
heap->area_begin = extend_area_begin;
} else if ( heap->area_end < extend_area_end ) {
heap->area_end = extend_area_end;
}
extend_first_block_size =
3000fa10: e0631002 rsb r1, r3, r2 <== NOT EXECUTED
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
3000fa14: e3810001 orr r0, r1, #1 <== NOT EXECUTED
}
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
3000fa18: e5836000 str r6, [r3] <== NOT EXECUTED
extend_last_block->prev_size = extend_first_block_size;
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
3000fa1c: e15c0003 cmp ip, r3 <== NOT EXECUTED
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
extend_first_block_size | HEAP_PREV_BLOCK_USED;
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
3000fa20: e5821000 str r1, [r2] <== NOT EXECUTED
extend_last_block->size_and_flag = 0;
3000fa24: e3a01000 mov r1, #0 <== NOT EXECUTED
extend_first_block_size =
(uintptr_t) extend_last_block - (uintptr_t) extend_first_block;
extend_first_block->prev_size = extend_area_end;
extend_first_block->size_and_flag =
3000fa28: e5830004 str r0, [r3, #4] <== NOT EXECUTED
extend_first_block_size | HEAP_PREV_BLOCK_USED;
_Heap_Protection_block_initialize( heap, extend_first_block );
extend_last_block->prev_size = extend_first_block_size;
extend_last_block->size_and_flag = 0;
3000fa2c: e5821004 str r1, [r2, #4] <== NOT EXECUTED
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
heap->first_block = extend_first_block;
3000fa30: 85853020 strhi r3, [r5, #32] <== NOT EXECUTED
extend_last_block->prev_size = extend_first_block_size;
extend_last_block->size_and_flag = 0;
_Heap_Protection_block_initialize( heap, extend_last_block );
if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) {
3000fa34: 8a000002 bhi 3000fa44 <_Heap_Extend+0x150> <== NOT EXECUTED
heap->first_block = extend_first_block;
} else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) {
3000fa38: e5953024 ldr r3, [r5, #36] ; 0x24 <== NOT EXECUTED
3000fa3c: e1530002 cmp r3, r2 <== NOT EXECUTED
heap->last_block = extend_last_block;
3000fa40: 35852024 strcc r2, [r5, #36] ; 0x24 <== NOT EXECUTED
}
if ( merge_below_block != NULL ) {
3000fa44: e59d3014 ldr r3, [sp, #20] <== NOT EXECUTED
3000fa48: e3530000 cmp r3, #0 <== NOT EXECUTED
3000fa4c: 0a000050 beq 3000fb94 <_Heap_Extend+0x2a0> <== NOT EXECUTED
Heap_Control *heap,
uintptr_t extend_area_begin,
Heap_Block *first_block
)
{
uintptr_t const page_size = heap->page_size;
3000fa50: e5958010 ldr r8, [r5, #16] <== NOT EXECUTED
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
3000fa54: e2844008 add r4, r4, #8 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up(
uintptr_t value,
uintptr_t alignment
)
{
uintptr_t remainder = value % alignment;
3000fa58: e1a00004 mov r0, r4 <== NOT EXECUTED
3000fa5c: e1a01008 mov r1, r8 <== NOT EXECUTED
3000fa60: eb00150c bl 30014e98 <__umodsi3> <== NOT EXECUTED
if ( remainder != 0 ) {
3000fa64: e3500000 cmp r0, #0 <== NOT EXECUTED
return value - remainder + alignment;
3000fa68: 10844008 addne r4, r4, r8 <== NOT EXECUTED
3000fa6c: 10604004 rsbne r4, r0, r4 <== NOT EXECUTED
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
3000fa70: e59dc014 ldr ip, [sp, #20] <== NOT EXECUTED
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const new_first_block_begin =
3000fa74: e2441008 sub r1, r4, #8 <== NOT EXECUTED
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
3000fa78: e59c2000 ldr r2, [ip] <== NOT EXECUTED
uintptr_t const new_first_block_alloc_begin =
_Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size );
uintptr_t const new_first_block_begin =
new_first_block_alloc_begin - HEAP_BLOCK_HEADER_SIZE;
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
3000fa7c: e061300c rsb r3, r1, ip <== NOT EXECUTED
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
3000fa80: e3833001 orr r3, r3, #1 <== NOT EXECUTED
uintptr_t const first_block_begin = (uintptr_t) first_block;
uintptr_t const new_first_block_size =
first_block_begin - new_first_block_begin;
Heap_Block *const new_first_block = (Heap_Block *) new_first_block_begin;
new_first_block->prev_size = first_block->prev_size;
3000fa84: e5042008 str r2, [r4, #-8] <== NOT EXECUTED
new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED;
3000fa88: e5813004 str r3, [r1, #4] <== NOT EXECUTED
_Heap_Free_block( heap, new_first_block );
3000fa8c: e1a00005 mov r0, r5 <== NOT EXECUTED
3000fa90: ebffff8f bl 3000f8d4 <_Heap_Free_block> <== NOT EXECUTED
link_below_block,
extend_last_block
);
}
if ( merge_above_block != NULL ) {
3000fa94: e59d000c ldr r0, [sp, #12] <== NOT EXECUTED
3000fa98: e3500000 cmp r0, #0 <== NOT EXECUTED
3000fa9c: 0a00002b beq 3000fb50 <_Heap_Extend+0x25c> <== NOT EXECUTED
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
extend_area_end - last_block_begin - HEAP_BLOCK_HEADER_SIZE,
3000faa0: e2466008 sub r6, r6, #8 <== NOT EXECUTED
uintptr_t extend_area_end
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const last_block_new_size = _Heap_Align_down(
3000faa4: e0606006 rsb r6, r0, r6 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
3000faa8: e5951010 ldr r1, [r5, #16] <== NOT EXECUTED
3000faac: e1a00006 mov r0, r6 <== NOT EXECUTED
3000fab0: eb0014f8 bl 30014e98 <__umodsi3> <== NOT EXECUTED
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
(last_block->size_and_flag - last_block_new_size)
3000fab4: e59d100c ldr r1, [sp, #12] <== NOT EXECUTED
3000fab8: e0606006 rsb r6, r0, r6 <== NOT EXECUTED
3000fabc: e5913004 ldr r3, [r1, #4] <== NOT EXECUTED
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
3000fac0: e0862001 add r2, r6, r1 <== NOT EXECUTED
(last_block->size_and_flag - last_block_new_size)
3000fac4: e0663003 rsb r3, r6, r3 <== NOT EXECUTED
| HEAP_PREV_BLOCK_USED;
3000fac8: e3833001 orr r3, r3, #1 <== NOT EXECUTED
page_size
);
Heap_Block *const new_last_block =
_Heap_Block_at( last_block, last_block_new_size );
new_last_block->size_and_flag =
3000facc: e5823004 str r3, [r2, #4] <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000fad0: e5913004 ldr r3, [r1, #4] <== NOT EXECUTED
(last_block->size_and_flag - last_block_new_size)
| HEAP_PREV_BLOCK_USED;
_Heap_Block_set_size( last_block, last_block_new_size );
_Heap_Free_block( heap, last_block );
3000fad4: e1a00005 mov r0, r5 <== NOT EXECUTED
3000fad8: e2033001 and r3, r3, #1 <== NOT EXECUTED
block->size_and_flag = size | flag;
3000fadc: e1866003 orr r6, r6, r3 <== NOT EXECUTED
3000fae0: e5816004 str r6, [r1, #4] <== NOT EXECUTED
3000fae4: ebffff7a bl 3000f8d4 <_Heap_Free_block> <== NOT EXECUTED
extend_first_block,
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
3000fae8: e59d200c ldr r2, [sp, #12] <== NOT EXECUTED
3000faec: e59d3014 ldr r3, [sp, #20] <== NOT EXECUTED
3000faf0: e3520000 cmp r2, #0 <== NOT EXECUTED
3000faf4: 03530000 cmpeq r3, #0 <== NOT EXECUTED
3000faf8: 0a000021 beq 3000fb84 <_Heap_Extend+0x290> <== NOT EXECUTED
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
}
3000fafc: e5953024 ldr r3, [r5, #36] ; 0x24 <== NOT EXECUTED
* This feature will be used to terminate the scattered heap area list. See
* also _Heap_Extend().
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
3000fb00: e595c020 ldr ip, [r5, #32] <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000fb04: e5930004 ldr r0, [r3, #4] <== NOT EXECUTED
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
3000fb08: e5952030 ldr r2, [r5, #48] ; 0x30 <== NOT EXECUTED
* This feature will be used to terminate the scattered heap area list. See
* also _Heap_Extend().
*/
RTEMS_INLINE_ROUTINE void _Heap_Set_last_block_size( Heap_Control *heap )
{
_Heap_Block_set_size(
3000fb0c: e063c00c rsb ip, r3, ip <== NOT EXECUTED
3000fb10: e59d4018 ldr r4, [sp, #24] <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000fb14: e2000001 and r0, r0, #1 <== NOT EXECUTED
/* Statistics */
stats->size += extended_size;
3000fb18: e595102c ldr r1, [r5, #44] ; 0x2c <== NOT EXECUTED
block->size_and_flag = size | flag;
3000fb1c: e18c0000 orr r0, ip, r0 <== NOT EXECUTED
if ( extended_size_ptr != NULL )
3000fb20: e59dc010 ldr ip, [sp, #16] <== NOT EXECUTED
_Heap_Free_block( heap, extend_first_block );
}
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
3000fb24: e0642002 rsb r2, r4, r2 <== NOT EXECUTED
/* Statistics */
stats->size += extended_size;
if ( extended_size_ptr != NULL )
3000fb28: e35c0000 cmp ip, #0 <== NOT EXECUTED
_Heap_Set_last_block_size( heap );
extended_size = stats->free_size - free_size;
/* Statistics */
stats->size += extended_size;
3000fb2c: e0811002 add r1, r1, r2 <== NOT EXECUTED
3000fb30: e5830004 str r0, [r3, #4] <== NOT EXECUTED
3000fb34: e585102c str r1, [r5, #44] ; 0x2c <== NOT EXECUTED
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
return true;
3000fb38: 13a00001 movne r0, #1 <== NOT EXECUTED
/* Statistics */
stats->size += extended_size;
if ( extended_size_ptr != NULL )
*extended_size_ptr = extended_size;
3000fb3c: 158c2000 strne r2, [ip] <== NOT EXECUTED
return true;
3000fb40: 03a00001 moveq r0, #1 <== NOT EXECUTED
3000fb44: eaffff7b b 3000f938 <_Heap_Extend+0x44> <== NOT EXECUTED
_Heap_Block_of_alloc_area( sub_area_end, page_size );
if (
sub_area_end > extend_area_begin && extend_area_end > sub_area_begin
) {
return false;
3000fb48: e3a00000 mov r0, #0 <== NOT EXECUTED
3000fb4c: eaffff79 b 3000f938 <_Heap_Extend+0x44> <== NOT EXECUTED
);
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
3000fb50: e3570000 cmp r7, #0 <== NOT EXECUTED
3000fb54: 0affffe3 beq 3000fae8 <_Heap_Extend+0x1f4> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000fb58: e5971004 ldr r1, [r7, #4] <== NOT EXECUTED
)
{
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
3000fb5c: e59d2020 ldr r2, [sp, #32] <== NOT EXECUTED
3000fb60: e2011001 and r1, r1, #1 <== NOT EXECUTED
3000fb64: e0672002 rsb r2, r7, r2 <== NOT EXECUTED
}
if ( merge_above_block != NULL ) {
_Heap_Merge_above( heap, merge_above_block, extend_area_end );
} else if ( link_above_block != NULL ) {
_Heap_Link_above(
3000fb68: e59d301c ldr r3, [sp, #28] <== NOT EXECUTED
block->size_and_flag = size | flag;
3000fb6c: e1822001 orr r2, r2, r1 <== NOT EXECUTED
3000fb70: e5872004 str r2, [r7, #4] <== NOT EXECUTED
uintptr_t const link_begin = (uintptr_t) link;
uintptr_t const first_block_begin = (uintptr_t) first_block;
_Heap_Block_set_size( link, first_block_begin - link_begin );
last_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
3000fb74: e5932004 ldr r2, [r3, #4] <== NOT EXECUTED
3000fb78: e3822001 orr r2, r2, #1 <== NOT EXECUTED
3000fb7c: e5832004 str r2, [r3, #4] <== NOT EXECUTED
3000fb80: eaffffd8 b 3000fae8 <_Heap_Extend+0x1f4> <== NOT EXECUTED
extend_last_block
);
}
if ( merge_below_block == NULL && merge_above_block == NULL ) {
_Heap_Free_block( heap, extend_first_block );
3000fb84: e1a00005 mov r0, r5 <== NOT EXECUTED
3000fb88: e59d1020 ldr r1, [sp, #32] <== NOT EXECUTED
3000fb8c: ebffff50 bl 3000f8d4 <_Heap_Free_block> <== NOT EXECUTED
3000fb90: eaffffd9 b 3000fafc <_Heap_Extend+0x208> <== NOT EXECUTED
heap->last_block = extend_last_block;
}
if ( merge_below_block != NULL ) {
_Heap_Merge_below( heap, extend_area_begin, merge_below_block );
} else if ( link_below_block != NULL ) {
3000fb94: e35b0000 cmp fp, #0 <== NOT EXECUTED
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
(link_begin - last_block_begin) | HEAP_PREV_BLOCK_USED;
3000fb98: 1062b00b rsbne fp, r2, fp <== NOT EXECUTED
3000fb9c: 138bb001 orrne fp, fp, #1 <== NOT EXECUTED
)
{
uintptr_t const last_block_begin = (uintptr_t) last_block;
uintptr_t const link_begin = (uintptr_t) link;
last_block->size_and_flag =
3000fba0: 1582b004 strne fp, [r2, #4] <== NOT EXECUTED
3000fba4: eaffffba b 3000fa94 <_Heap_Extend+0x1a0> <== NOT EXECUTED
3000f5b0 <_Heap_Free>:
/*
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
3000f5b0: e2513000 subs r3, r1, #0
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
{
3000f5b4: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
3000f5b8: e1a04000 mov r4, r0
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
return true;
3000f5bc: 03a00001 moveq r0, #1
/*
* If NULL return true so a free on NULL is considered a valid release. This
* is a special case that could be handled by the in heap check how-ever that
* would result in false being returned which is wrong.
*/
if ( alloc_begin_ptr == NULL ) {
3000f5c0: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
3000f5c4: e1a00003 mov r0, r3
3000f5c8: e5941010 ldr r1, [r4, #16]
3000f5cc: e2435008 sub r5, r3, #8
3000f5d0: eb0014dd bl 3001494c <__umodsi3>
RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
3000f5d4: e5942020 ldr r2, [r4, #32]
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
3000f5d8: e0605005 rsb r5, r0, r5
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000f5dc: e1550002 cmp r5, r2
3000f5e0: 3a00002f bcc 3000f6a4 <_Heap_Free+0xf4>
3000f5e4: e5941024 ldr r1, [r4, #36] ; 0x24
3000f5e8: e1550001 cmp r5, r1
3000f5ec: 8a00002c bhi 3000f6a4 <_Heap_Free+0xf4>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
3000f5f0: e595c004 ldr ip, [r5, #4]
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000f5f4: e3cc6001 bic r6, ip, #1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000f5f8: e0853006 add r3, r5, r6
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000f5fc: e1520003 cmp r2, r3
3000f600: 8a000027 bhi 3000f6a4 <_Heap_Free+0xf4>
3000f604: e1510003 cmp r1, r3
3000f608: 3a000027 bcc 3000f6ac <_Heap_Free+0xfc>
3000f60c: e5937004 ldr r7, [r3, #4]
return false;
}
_Heap_Protection_block_check( heap, next_block );
if ( !_Heap_Is_prev_used( next_block ) ) {
3000f610: e2170001 ands r0, r7, #1
3000f614: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
return true;
}
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
3000f618: e1510003 cmp r1, r3
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000f61c: e3c77001 bic r7, r7, #1
3000f620: 03a08000 moveq r8, #0
3000f624: 0a000004 beq 3000f63c <_Heap_Free+0x8c>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
3000f628: e0830007 add r0, r3, r7
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000f62c: e5900004 ldr r0, [r0, #4]
return do_free;
}
#endif
bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr )
3000f630: e3100001 tst r0, #1
3000f634: 13a08000 movne r8, #0
3000f638: 03a08001 moveq r8, #1
next_block_size = _Heap_Block_size( next_block );
next_is_free = next_block != heap->last_block
&& !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size ));
if ( !_Heap_Is_prev_used( block ) ) {
3000f63c: e21c0001 ands r0, ip, #1
3000f640: 1a00001b bne 3000f6b4 <_Heap_Free+0x104>
uintptr_t const prev_size = block->prev_size;
3000f644: e595c000 ldr ip, [r5]
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000f648: e06ca005 rsb sl, ip, r5
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000f64c: e152000a cmp r2, sl
3000f650: 88bd85f0 pophi {r4, r5, r6, r7, r8, sl, pc}
3000f654: e151000a cmp r1, sl
3000f658: 38bd85f0 popcc {r4, r5, r6, r7, r8, sl, pc}
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000f65c: e59a0004 ldr r0, [sl, #4]
return( false );
}
/* As we always coalesce free blocks, the block that preceedes prev_block
must have been used. */
if ( !_Heap_Is_prev_used ( prev_block) ) {
3000f660: e2100001 ands r0, r0, #1
3000f664: 08bd85f0 popeq {r4, r5, r6, r7, r8, sl, pc}
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
3000f668: e3580000 cmp r8, #0
3000f66c: 0a000039 beq 3000f758 <_Heap_Free+0x1a8>
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
3000f670: e5940038 ldr r0, [r4, #56] ; 0x38
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
3000f674: e0867007 add r7, r6, r7
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
3000f678: e5932008 ldr r2, [r3, #8]
_HAssert( false );
return( false );
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
3000f67c: e087c00c add ip, r7, ip
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
3000f680: e593300c ldr r3, [r3, #12]
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
3000f684: e2400001 sub r0, r0, #1
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
3000f688: e38c1001 orr r1, ip, #1
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
3000f68c: e5832008 str r2, [r3, #8]
next->prev = prev;
3000f690: e582300c str r3, [r2, #12]
}
if ( next_is_free ) { /* coalesce both */
uintptr_t const size = block_size + prev_size + next_block_size;
_Heap_Free_list_remove( next_block );
stats->free_blocks -= 1;
3000f694: e5840038 str r0, [r4, #56] ; 0x38
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
3000f698: e58a1004 str r1, [sl, #4]
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
3000f69c: e78ac00c str ip, [sl, ip]
3000f6a0: ea00000f b 3000f6e4 <_Heap_Free+0x134>
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
return false;
3000f6a4: e3a00000 mov r0, #0
3000f6a8: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
3000f6ac: e3a00000 mov r0, #0 <== NOT EXECUTED
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
3000f6b0: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
3000f6b4: e3580000 cmp r8, #0
3000f6b8: 0a000014 beq 3000f710 <_Heap_Free+0x160>
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
3000f6bc: e5932008 ldr r2, [r3, #8]
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
3000f6c0: e0877006 add r7, r7, r6
--stats->used_blocks;
++stats->frees;
stats->free_size += block_size;
return( true );
}
3000f6c4: e593300c ldr r3, [r3, #12]
next_block->prev_size = size;
}
} else if ( next_is_free ) { /* coalesce next */
uintptr_t const size = block_size + next_block_size;
_Heap_Free_list_replace( next_block, block );
block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
3000f6c8: e3871001 orr r1, r7, #1
)
{
Heap_Block *next = old_block->next;
Heap_Block *prev = old_block->prev;
new_block->next = next;
3000f6cc: e5852008 str r2, [r5, #8]
new_block->prev = prev;
3000f6d0: e585300c str r3, [r5, #12]
next->prev = new_block;
prev->next = new_block;
3000f6d4: e5835008 str r5, [r3, #8]
Heap_Block *prev = old_block->prev;
new_block->next = next;
new_block->prev = prev;
next->prev = new_block;
3000f6d8: e582500c str r5, [r2, #12]
3000f6dc: e5851004 str r1, [r5, #4]
next_block = _Heap_Block_at( block, size );
next_block->prev_size = size;
3000f6e0: e7857007 str r7, [r5, r7]
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
3000f6e4: e5942040 ldr r2, [r4, #64] ; 0x40
++stats->frees;
3000f6e8: e5943050 ldr r3, [r4, #80] ; 0x50
stats->free_size += block_size;
3000f6ec: e5941030 ldr r1, [r4, #48] ; 0x30
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
3000f6f0: e2422001 sub r2, r2, #1
++stats->frees;
3000f6f4: e2833001 add r3, r3, #1
stats->free_size += block_size;
3000f6f8: e0816006 add r6, r1, r6
stats->max_free_blocks = stats->free_blocks;
}
}
/* Statistics */
--stats->used_blocks;
3000f6fc: e5842040 str r2, [r4, #64] ; 0x40
++stats->frees;
3000f700: e5843050 str r3, [r4, #80] ; 0x50
stats->free_size += block_size;
3000f704: e5846030 str r6, [r4, #48] ; 0x30
return( true );
3000f708: e3a00001 mov r0, #1
3000f70c: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
next_block->prev_size = size;
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
3000f710: e3862001 orr r2, r6, #1
3000f714: e5852004 str r2, [r5, #4]
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
3000f718: e5942038 ldr r2, [r4, #56] ; 0x38
if ( stats->max_free_blocks < stats->free_blocks ) {
3000f71c: e594c03c ldr ip, [r4, #60] ; 0x3c
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
3000f720: e5930004 ldr r0, [r3, #4]
RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after(
Heap_Block *block_before,
Heap_Block *new_block
)
{
Heap_Block *next = block_before->next;
3000f724: e5941008 ldr r1, [r4, #8]
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
3000f728: e2822001 add r2, r2, #1
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
3000f72c: e3c00001 bic r0, r0, #1
next_block->prev_size = block_size;
/* Statistics */
++stats->free_blocks;
if ( stats->max_free_blocks < stats->free_blocks ) {
3000f730: e152000c cmp r2, ip
new_block->next = next;
3000f734: e5851008 str r1, [r5, #8]
new_block->prev = block_before;
3000f738: e585400c str r4, [r5, #12]
} else { /* no coalesce */
/* Add 'block' to the head of the free blocks list as it tends to
produce less fragmentation than adding to the tail. */
_Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block );
block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
3000f73c: e5830004 str r0, [r3, #4]
block_before->next = new_block;
next->prev = new_block;
3000f740: e581500c str r5, [r1, #12]
next_block->prev_size = block_size;
3000f744: e7856006 str r6, [r5, r6]
{
Heap_Block *next = block_before->next;
new_block->next = next;
new_block->prev = block_before;
block_before->next = new_block;
3000f748: e5845008 str r5, [r4, #8]
/* Statistics */
++stats->free_blocks;
3000f74c: e5842038 str r2, [r4, #56] ; 0x38
if ( stats->max_free_blocks < stats->free_blocks ) {
stats->max_free_blocks = stats->free_blocks;
3000f750: 8584203c strhi r2, [r4, #60] ; 0x3c
3000f754: eaffffe2 b 3000f6e4 <_Heap_Free+0x134>
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block = _Heap_Block_at( prev_block, size );
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
3000f758: e086c00c add ip, r6, ip
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
3000f75c: e38c2001 orr r2, ip, #1
3000f760: e58a2004 str r2, [sl, #4]
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
3000f764: e5932004 ldr r2, [r3, #4]
next_block->prev_size = size;
3000f768: e785c006 str ip, [r5, r6]
_HAssert(!_Heap_Is_prev_used( next_block));
next_block->prev_size = size;
} else { /* coalesce prev */
uintptr_t const size = block_size + prev_size;
prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED;
next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED;
3000f76c: e3c22001 bic r2, r2, #1
3000f770: e5832004 str r2, [r3, #4]
3000f774: eaffffda b 3000f6e4 <_Heap_Free+0x134>
3000f8d4 <_Heap_Free_block>:
static void _Heap_Free_block( Heap_Control *heap, Heap_Block *block )
{
Heap_Statistics *const stats = &heap->stats;
/* Statistics */
++stats->used_blocks;
3000f8d4: e590c040 ldr ip, [r0, #64] ; 0x40 <== NOT EXECUTED
--stats->frees;
3000f8d8: e5902050 ldr r2, [r0, #80] ; 0x50 <== NOT EXECUTED
static void _Heap_Free_block( Heap_Control *heap, Heap_Block *block )
{
Heap_Statistics *const stats = &heap->stats;
/* Statistics */
++stats->used_blocks;
3000f8dc: e28cc001 add ip, ip, #1 <== NOT EXECUTED
--stats->frees;
3000f8e0: e2422001 sub r2, r2, #1 <== NOT EXECUTED
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ));
3000f8e4: e2811008 add r1, r1, #8 <== NOT EXECUTED
static void _Heap_Free_block( Heap_Control *heap, Heap_Block *block )
{
Heap_Statistics *const stats = &heap->stats;
/* Statistics */
++stats->used_blocks;
3000f8e8: e580c040 str ip, [r0, #64] ; 0x40 <== NOT EXECUTED
--stats->frees;
3000f8ec: e5802050 str r2, [r0, #80] ; 0x50 <== NOT EXECUTED
_Heap_Free( heap, (void *) _Heap_Alloc_area_of_block( block ));
3000f8f0: ea0000ac b 3000fba8 <_Heap_Free> <== NOT EXECUTED
30016d48 <_Heap_Resize_block>:
void *alloc_begin_ptr,
uintptr_t new_alloc_size,
uintptr_t *old_size,
uintptr_t *new_size
)
{
30016d48: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
30016d4c: e1a04000 mov r4, r0
30016d50: e1a05001 mov r5, r1
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
30016d54: e1a00001 mov r0, r1
30016d58: e5941010 ldr r1, [r4, #16]
30016d5c: e1a07003 mov r7, r3
30016d60: e1a0a002 mov sl, r2
30016d64: ebfff6f8 bl 3001494c <__umodsi3>
30016d68: e2458008 sub r8, r5, #8
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
30016d6c: e5943020 ldr r3, [r4, #32]
30016d70: e59d601c ldr r6, [sp, #28]
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
30016d74: e0601008 rsb r1, r0, r8
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *const block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
*old_size = 0;
30016d78: e3a02000 mov r2, #0
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
30016d7c: e1530001 cmp r3, r1
30016d80: e5872000 str r2, [r7]
new_alloc_size,
old_size,
new_size
);
}
return HEAP_RESIZE_FATAL_ERROR;
30016d84: 83a00002 movhi r0, #2
uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr;
Heap_Block *const block = _Heap_Block_of_alloc_area( alloc_begin, page_size );
*old_size = 0;
*new_size = 0;
30016d88: e5862000 str r2, [r6]
30016d8c: 88bd85f0 pophi {r4, r5, r6, r7, r8, sl, pc}
30016d90: e5943024 ldr r3, [r4, #36] ; 0x24
30016d94: e1530001 cmp r3, r1
30016d98: 3a000036 bcc 30016e78 <_Heap_Resize_block+0x130>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
30016d9c: e5910004 ldr r0, [r1, #4]
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t block_size = _Heap_Block_size( block );
uintptr_t block_end = block_begin + block_size;
uintptr_t alloc_size = block_end - alloc_begin + HEAP_ALLOC_BONUS;
30016da0: e2653004 rsb r3, r5, #4
30016da4: e3c00001 bic r0, r0, #1
{
Heap_Statistics *const stats = &heap->stats;
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t block_size = _Heap_Block_size( block );
uintptr_t block_end = block_begin + block_size;
30016da8: e0812000 add r2, r1, r0
30016dac: e592c004 ldr ip, [r2, #4]
uintptr_t alloc_size = block_end - alloc_begin + HEAP_ALLOC_BONUS;
30016db0: e0833002 add r3, r3, r2
30016db4: e3ccc001 bic ip, ip, #1
old_size,
new_size
);
}
return HEAP_RESIZE_FATAL_ERROR;
}
30016db8: e082800c add r8, r2, ip
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
30016dbc: e5988004 ldr r8, [r8, #4]
bool next_block_is_free = _Heap_Is_free( next_block );;
_HAssert( _Heap_Is_block_in_heap( heap, next_block ) );
_HAssert( _Heap_Is_prev_used( next_block ) );
*old_size = alloc_size;
30016dc0: e5873000 str r3, [r7]
RTEMS_INLINE_ROUTINE bool _Heap_Is_free(
const Heap_Block *block
)
{
return !_Heap_Is_used( block );
30016dc4: e3180001 tst r8, #1
30016dc8: 13a07000 movne r7, #0
30016dcc: 03a07001 moveq r7, #1
if ( next_block_is_free ) {
30016dd0: e3570000 cmp r7, #0
block_size += next_block_size;
alloc_size += next_block_size;
30016dd4: 1083300c addne r3, r3, ip
_HAssert( _Heap_Is_prev_used( next_block ) );
*old_size = alloc_size;
if ( next_block_is_free ) {
block_size += next_block_size;
30016dd8: 1080000c addne r0, r0, ip
alloc_size += next_block_size;
}
if ( new_alloc_size > alloc_size ) {
30016ddc: e15a0003 cmp sl, r3
return HEAP_RESIZE_UNSATISFIED;
30016de0: 83a00001 movhi r0, #1
if ( next_block_is_free ) {
block_size += next_block_size;
alloc_size += next_block_size;
}
if ( new_alloc_size > alloc_size ) {
30016de4: 88bd85f0 pophi {r4, r5, r6, r7, r8, sl, pc}
return HEAP_RESIZE_UNSATISFIED;
}
if ( next_block_is_free ) {
30016de8: e3570000 cmp r7, #0
30016dec: 0a000011 beq 30016e38 <_Heap_Resize_block+0xf0>
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
30016df0: e591e004 ldr lr, [r1, #4] <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
30016df4: e0803001 add r3, r0, r1 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Heap_Block_set_size(
Heap_Block *block,
uintptr_t size
)
{
uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED;
30016df8: e20ee001 and lr, lr, #1 <== NOT EXECUTED
block->size_and_flag = size | flag;
30016dfc: e180000e orr r0, r0, lr <== NOT EXECUTED
30016e00: e5810004 str r0, [r1, #4] <== NOT EXECUTED
next_block = _Heap_Block_at( block, block_size );
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
/* Statistics */
--stats->free_blocks;
30016e04: e594e038 ldr lr, [r4, #56] ; 0x38 <== NOT EXECUTED
stats->free_size -= next_block_size;
30016e08: e5948030 ldr r8, [r4, #48] ; 0x30 <== NOT EXECUTED
_Heap_Block_set_size( block, block_size );
_Heap_Free_list_remove( next_block );
next_block = _Heap_Block_at( block, block_size );
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
30016e0c: e5937004 ldr r7, [r3, #4] <== NOT EXECUTED
old_size,
new_size
);
}
return HEAP_RESIZE_FATAL_ERROR;
}
30016e10: e5920008 ldr r0, [r2, #8] <== NOT EXECUTED
30016e14: e592200c ldr r2, [r2, #12] <== NOT EXECUTED
_Heap_Block_set_size( block, block_size );
_Heap_Free_list_remove( next_block );
next_block = _Heap_Block_at( block, block_size );
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
30016e18: e3877001 orr r7, r7, #1 <== NOT EXECUTED
/* Statistics */
--stats->free_blocks;
30016e1c: e24ee001 sub lr, lr, #1 <== NOT EXECUTED
stats->free_size -= next_block_size;
30016e20: e06cc008 rsb ip, ip, r8 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block )
{
Heap_Block *next = block->next;
Heap_Block *prev = block->prev;
prev->next = next;
30016e24: e5820008 str r0, [r2, #8] <== NOT EXECUTED
next->prev = prev;
30016e28: e580200c str r2, [r0, #12] <== NOT EXECUTED
_Heap_Block_set_size( block, block_size );
_Heap_Free_list_remove( next_block );
next_block = _Heap_Block_at( block, block_size );
next_block->size_and_flag |= HEAP_PREV_BLOCK_USED;
30016e2c: e5837004 str r7, [r3, #4] <== NOT EXECUTED
/* Statistics */
--stats->free_blocks;
30016e30: e584e038 str lr, [r4, #56] ; 0x38 <== NOT EXECUTED
stats->free_size -= next_block_size;
30016e34: e584c030 str ip, [r4, #48] ; 0x30 <== NOT EXECUTED
}
block = _Heap_Block_allocate( heap, block, alloc_begin, new_alloc_size );
30016e38: e1a02005 mov r2, r5
30016e3c: e1a0300a mov r3, sl
30016e40: e1a00004 mov r0, r4
30016e44: ebffcfa5 bl 3000ace0 <_Heap_Block_allocate>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
30016e48: e5902004 ldr r2, [r0, #4]
30016e4c: e1a03000 mov r3, r0
30016e50: e3c22001 bic r2, r2, #1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
30016e54: e2822004 add r2, r2, #4
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
*new_size = (uintptr_t) next_block - alloc_begin + HEAP_ALLOC_BONUS;
30016e58: e0655002 rsb r5, r5, r2
30016e5c: e0833005 add r3, r3, r5
30016e60: e5863000 str r3, [r6]
/* Statistics */
++stats->resizes;
30016e64: e5943054 ldr r3, [r4, #84] ; 0x54
return HEAP_RESIZE_SUCCESSFUL;
30016e68: e3a00000 mov r0, #0
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
*new_size = (uintptr_t) next_block - alloc_begin + HEAP_ALLOC_BONUS;
/* Statistics */
++stats->resizes;
30016e6c: e2833001 add r3, r3, #1
30016e70: e5843054 str r3, [r4, #84] ; 0x54
30016e74: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
new_alloc_size,
old_size,
new_size
);
}
return HEAP_RESIZE_FATAL_ERROR;
30016e78: e3a00002 mov r0, #2 <== NOT EXECUTED
}
30016e7c: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
30016e80 <_Heap_Size_of_alloc_area>:
bool _Heap_Size_of_alloc_area(
Heap_Control *heap,
void *alloc_begin_ptr,
uintptr_t *alloc_size
)
{
30016e80: e92d40f0 push {r4, r5, r6, r7, lr}
30016e84: e1a04000 mov r4, r0
30016e88: e1a05001 mov r5, r1
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down(
uintptr_t value,
uintptr_t alignment
)
{
return value - (value % alignment);
30016e8c: e1a00001 mov r0, r1
30016e90: e5941010 ldr r1, [r4, #16]
30016e94: e1a07002 mov r7, r2
30016e98: ebfff6ab bl 3001494c <__umodsi3>
30016e9c: e2456008 sub r6, r5, #8
RTEMS_INLINE_ROUTINE bool _Heap_Is_block_in_heap(
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
30016ea0: e5943020 ldr r3, [r4, #32]
uintptr_t alloc_begin,
uintptr_t page_size
)
{
return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size )
- HEAP_BLOCK_HEADER_SIZE);
30016ea4: e0600006 rsb r0, r0, r6
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
30016ea8: e1500003 cmp r0, r3
30016eac: 3a000010 bcc 30016ef4 <_Heap_Size_of_alloc_area+0x74>
30016eb0: e5942024 ldr r2, [r4, #36] ; 0x24
30016eb4: e1500002 cmp r0, r2
30016eb8: 8a00000d bhi 30016ef4 <_Heap_Size_of_alloc_area+0x74>
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
30016ebc: e5906004 ldr r6, [r0, #4]
30016ec0: e3c66001 bic r6, r6, #1
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
30016ec4: e0806006 add r6, r0, r6
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
30016ec8: e1530006 cmp r3, r6
30016ecc: 8a000008 bhi 30016ef4 <_Heap_Size_of_alloc_area+0x74>
30016ed0: e1520006 cmp r2, r6
30016ed4: 3a000008 bcc 30016efc <_Heap_Size_of_alloc_area+0x7c>
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
30016ed8: e5960004 ldr r0, [r6, #4]
block_size = _Heap_Block_size( block );
next_block = _Heap_Block_at( block, block_size );
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
30016edc: e2100001 ands r0, r0, #1
) {
return false;
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
30016ee0: 12655004 rsbne r5, r5, #4
30016ee4: 10856006 addne r6, r5, r6
30016ee8: 15876000 strne r6, [r7]
return true;
30016eec: 13a00001 movne r0, #1
30016ef0: e8bd80f0 pop {r4, r5, r6, r7, pc}
if (
!_Heap_Is_block_in_heap( heap, next_block )
|| !_Heap_Is_prev_used( next_block )
) {
return false;
30016ef4: e3a00000 mov r0, #0 <== NOT EXECUTED
30016ef8: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
30016efc: e3a00000 mov r0, #0 <== NOT EXECUTED
}
*alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin;
return true;
}
30016f00: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000ba78 <_Heap_Walk>:
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
3000ba78: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
if ( !_System_state_Is_up( _System_state_Get() ) ) {
3000ba7c: e59f35d8 ldr r3, [pc, #1496] ; 3000c05c <_Heap_Walk+0x5e4> <== NOT EXECUTED
uintptr_t const min_block_size = heap->min_block_size;
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
3000ba80: e31200ff tst r2, #255 ; 0xff <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
3000ba84: e5933000 ldr r3, [r3] <== NOT EXECUTED
uintptr_t const min_block_size = heap->min_block_size;
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
3000ba88: e59f25d0 ldr r2, [pc, #1488] ; 3000c060 <_Heap_Walk+0x5e8> <== NOT EXECUTED
3000ba8c: e59f95d0 ldr r9, [pc, #1488] ; 3000c064 <_Heap_Walk+0x5ec> <== NOT EXECUTED
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
3000ba90: e1a0a001 mov sl, r1 <== NOT EXECUTED
uintptr_t const min_block_size = heap->min_block_size;
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
3000ba94: 11a09002 movne r9, r2 <== NOT EXECUTED
Heap_Control *heap,
int source,
bool dump
)
{
uintptr_t const page_size = heap->page_size;
3000ba98: e5901010 ldr r1, [r0, #16] <== NOT EXECUTED
Heap_Block *const last_block = heap->last_block;
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
if ( !_System_state_Is_up( _System_state_Get() ) ) {
3000ba9c: e3530003 cmp r3, #3 <== NOT EXECUTED
int source,
bool dump
)
{
uintptr_t const page_size = heap->page_size;
uintptr_t const min_block_size = heap->min_block_size;
3000baa0: e5902014 ldr r2, [r0, #20] <== NOT EXECUTED
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
3000baa4: e5903024 ldr r3, [r0, #36] ; 0x24 <== NOT EXECUTED
bool _Heap_Walk(
Heap_Control *heap,
int source,
bool dump
)
{
3000baa8: e24dd038 sub sp, sp, #56 ; 0x38 <== NOT EXECUTED
3000baac: e1a04000 mov r4, r0 <== NOT EXECUTED
uintptr_t const page_size = heap->page_size;
3000bab0: e58d1024 str r1, [sp, #36] ; 0x24 <== NOT EXECUTED
uintptr_t const min_block_size = heap->min_block_size;
3000bab4: e58d2028 str r2, [sp, #40] ; 0x28 <== NOT EXECUTED
Heap_Block *const first_block = heap->first_block;
3000bab8: e5908020 ldr r8, [r0, #32] <== NOT EXECUTED
Heap_Block *const last_block = heap->last_block;
3000babc: e58d302c str r3, [sp, #44] ; 0x2c <== NOT EXECUTED
Heap_Block *block = first_block;
Heap_Walk_printer printer = dump ?
_Heap_Walk_print : _Heap_Walk_print_nothing;
if ( !_System_state_Is_up( _System_state_Get() ) ) {
3000bac0: 0a000002 beq 3000bad0 <_Heap_Walk+0x58> <== NOT EXECUTED
}
block = next_block;
} while ( block != first_block );
return true;
3000bac4: e3a00001 mov r0, #1 <== NOT EXECUTED
}
3000bac8: e28dd038 add sp, sp, #56 ; 0x38 <== NOT EXECUTED
3000bacc: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
Heap_Block *const first_block = heap->first_block;
Heap_Block *const last_block = heap->last_block;
(*printer)(
3000bad0: e594101c ldr r1, [r4, #28] <== NOT EXECUTED
3000bad4: e5900018 ldr r0, [r0, #24] <== NOT EXECUTED
3000bad8: e5942008 ldr r2, [r4, #8] <== NOT EXECUTED
3000badc: e594300c ldr r3, [r4, #12] <== NOT EXECUTED
3000bae0: e59dc028 ldr ip, [sp, #40] ; 0x28 <== NOT EXECUTED
3000bae4: e58d1008 str r1, [sp, #8] <== NOT EXECUTED
3000bae8: e59d102c ldr r1, [sp, #44] ; 0x2c <== NOT EXECUTED
3000baec: e58d0004 str r0, [sp, #4] <== NOT EXECUTED
3000baf0: e58d1010 str r1, [sp, #16] <== NOT EXECUTED
3000baf4: e58d2014 str r2, [sp, #20] <== NOT EXECUTED
3000baf8: e58d3018 str r3, [sp, #24] <== NOT EXECUTED
3000bafc: e59f2564 ldr r2, [pc, #1380] ; 3000c068 <_Heap_Walk+0x5f0> <== NOT EXECUTED
3000bb00: e58dc000 str ip, [sp] <== NOT EXECUTED
3000bb04: e58d800c str r8, [sp, #12] <== NOT EXECUTED
3000bb08: e1a0000a mov r0, sl <== NOT EXECUTED
3000bb0c: e3a01000 mov r1, #0 <== NOT EXECUTED
3000bb10: e59d3024 ldr r3, [sp, #36] ; 0x24 <== NOT EXECUTED
3000bb14: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bb18: e12fff19 bx r9 <== NOT EXECUTED
heap->area_begin, heap->area_end,
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
3000bb1c: e59d2024 ldr r2, [sp, #36] ; 0x24 <== NOT EXECUTED
3000bb20: e3520000 cmp r2, #0 <== NOT EXECUTED
3000bb24: 0a000026 beq 3000bbc4 <_Heap_Walk+0x14c> <== NOT EXECUTED
(*printer)( source, true, "page size is zero\n" );
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
3000bb28: e59d3024 ldr r3, [sp, #36] ; 0x24 <== NOT EXECUTED
3000bb2c: e2135007 ands r5, r3, #7 <== NOT EXECUTED
3000bb30: 1a00002a bne 3000bbe0 <_Heap_Walk+0x168> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
3000bb34: e59d0028 ldr r0, [sp, #40] ; 0x28 <== NOT EXECUTED
3000bb38: e59d1024 ldr r1, [sp, #36] ; 0x24 <== NOT EXECUTED
3000bb3c: ebffe55f bl 300050c0 <__umodsi3> <== NOT EXECUTED
);
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
3000bb40: e250b000 subs fp, r0, #0 <== NOT EXECUTED
3000bb44: 1a00002c bne 3000bbfc <_Heap_Walk+0x184> <== NOT EXECUTED
3000bb48: e2880008 add r0, r8, #8 <== NOT EXECUTED
3000bb4c: e59d1024 ldr r1, [sp, #36] ; 0x24 <== NOT EXECUTED
3000bb50: ebffe55a bl 300050c0 <__umodsi3> <== NOT EXECUTED
);
return false;
}
if (
3000bb54: e2506000 subs r6, r0, #0 <== NOT EXECUTED
3000bb58: 1a00002f bne 3000bc1c <_Heap_Walk+0x1a4> <== NOT EXECUTED
block = next_block;
} while ( block != first_block );
return true;
}
3000bb5c: e598b004 ldr fp, [r8, #4] <== NOT EXECUTED
);
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
3000bb60: e21b5001 ands r5, fp, #1 <== NOT EXECUTED
3000bb64: 0a000103 beq 3000bf78 <_Heap_Walk+0x500> <== NOT EXECUTED
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000bb68: e59dc02c ldr ip, [sp, #44] ; 0x2c <== NOT EXECUTED
3000bb6c: e59c3004 ldr r3, [ip, #4] <== NOT EXECUTED
3000bb70: e3c33001 bic r3, r3, #1 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000bb74: e08c3003 add r3, ip, r3 <== NOT EXECUTED
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000bb78: e5935004 ldr r5, [r3, #4] <== NOT EXECUTED
);
return false;
}
if ( _Heap_Is_free( last_block ) ) {
3000bb7c: e2155001 ands r5, r5, #1 <== NOT EXECUTED
3000bb80: 0a000008 beq 3000bba8 <_Heap_Walk+0x130> <== NOT EXECUTED
);
return false;
}
if (
3000bb84: e1580003 cmp r8, r3 <== NOT EXECUTED
3000bb88: 0a00002b beq 3000bc3c <_Heap_Walk+0x1c4> <== NOT EXECUTED
_Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block
) {
(*printer)(
3000bb8c: e1a0000a mov r0, sl <== NOT EXECUTED
3000bb90: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bb94: e59f24d0 ldr r2, [pc, #1232] ; 3000c06c <_Heap_Walk+0x5f4> <== NOT EXECUTED
3000bb98: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bb9c: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bba0: e1a00006 mov r0, r6 <== NOT EXECUTED
3000bba4: eaffffc7 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
return false;
}
if ( _Heap_Is_free( last_block ) ) {
(*printer)(
3000bba8: e1a0000a mov r0, sl <== NOT EXECUTED
3000bbac: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bbb0: e59f24b8 ldr r2, [pc, #1208] ; 3000c070 <_Heap_Walk+0x5f8> <== NOT EXECUTED
3000bbb4: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bbb8: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bbbc: e1a00005 mov r0, r5 <== NOT EXECUTED
3000bbc0: eaffffc0 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
first_block, last_block,
first_free_block, last_free_block
);
if ( page_size == 0 ) {
(*printer)( source, true, "page size is zero\n" );
3000bbc4: e1a0000a mov r0, sl <== NOT EXECUTED
3000bbc8: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bbcc: e59f24a0 ldr r2, [pc, #1184] ; 3000c074 <_Heap_Walk+0x5fc> <== NOT EXECUTED
3000bbd0: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bbd4: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bbd8: e59d0024 ldr r0, [sp, #36] ; 0x24 <== NOT EXECUTED
3000bbdc: eaffffb9 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
return false;
}
if ( !_Addresses_Is_aligned( (void *) page_size ) ) {
(*printer)(
3000bbe0: e1a0000a mov r0, sl <== NOT EXECUTED
3000bbe4: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bbe8: e59f2488 ldr r2, [pc, #1160] ; 3000c078 <_Heap_Walk+0x600> <== NOT EXECUTED
3000bbec: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bbf0: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bbf4: e3a00000 mov r0, #0 <== NOT EXECUTED
3000bbf8: eaffffb2 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
return false;
}
if ( !_Heap_Is_aligned( min_block_size, page_size ) ) {
(*printer)(
3000bbfc: e1a0000a mov r0, sl <== NOT EXECUTED
3000bc00: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bc04: e59f2470 ldr r2, [pc, #1136] ; 3000c07c <_Heap_Walk+0x604> <== NOT EXECUTED
3000bc08: e59d3028 ldr r3, [sp, #40] ; 0x28 <== NOT EXECUTED
3000bc0c: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bc10: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bc14: e1a00005 mov r0, r5 <== NOT EXECUTED
3000bc18: eaffffaa b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
}
if (
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size )
) {
(*printer)(
3000bc1c: e1a0000a mov r0, sl <== NOT EXECUTED
3000bc20: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bc24: e59f2454 ldr r2, [pc, #1108] ; 3000c080 <_Heap_Walk+0x608> <== NOT EXECUTED
3000bc28: e1a03008 mov r3, r8 <== NOT EXECUTED
3000bc2c: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bc30: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bc34: e1a0000b mov r0, fp <== NOT EXECUTED
3000bc38: eaffffa2 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
block = next_block;
} while ( block != first_block );
return true;
}
3000bc3c: e5946008 ldr r6, [r4, #8] <== NOT EXECUTED
int source,
Heap_Walk_printer printer,
Heap_Control *heap
)
{
uintptr_t const page_size = heap->page_size;
3000bc40: e5947010 ldr r7, [r4, #16] <== NOT EXECUTED
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
3000bc44: e1540006 cmp r4, r6 <== NOT EXECUTED
3000bc48: 05943020 ldreq r3, [r4, #32] <== NOT EXECUTED
3000bc4c: 0a00002c beq 3000bd04 <_Heap_Walk+0x28c> <== NOT EXECUTED
block = next_block;
} while ( block != first_block );
return true;
}
3000bc50: e5943020 ldr r3, [r4, #32] <== NOT EXECUTED
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000bc54: e1530006 cmp r3, r6 <== NOT EXECUTED
3000bc58: 8a0000cd bhi 3000bf94 <_Heap_Walk+0x51c> <== NOT EXECUTED
3000bc5c: e594c024 ldr ip, [r4, #36] ; 0x24 <== NOT EXECUTED
3000bc60: e15c0006 cmp ip, r6 <== NOT EXECUTED
3000bc64: 3a0000ca bcc 3000bf94 <_Heap_Walk+0x51c> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
3000bc68: e2860008 add r0, r6, #8 <== NOT EXECUTED
3000bc6c: e1a01007 mov r1, r7 <== NOT EXECUTED
3000bc70: e58d3020 str r3, [sp, #32] <== NOT EXECUTED
3000bc74: e58dc01c str ip, [sp, #28] <== NOT EXECUTED
3000bc78: ebffe510 bl 300050c0 <__umodsi3> <== NOT EXECUTED
);
return false;
}
if (
3000bc7c: e3500000 cmp r0, #0 <== NOT EXECUTED
3000bc80: e59d3020 ldr r3, [sp, #32] <== NOT EXECUTED
3000bc84: e59dc01c ldr ip, [sp, #28] <== NOT EXECUTED
3000bc88: 1a0000df bne 3000c00c <_Heap_Walk+0x594> <== NOT EXECUTED
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000bc8c: e5962004 ldr r2, [r6, #4] <== NOT EXECUTED
3000bc90: e3c22001 bic r2, r2, #1 <== NOT EXECUTED
block = next_block;
} while ( block != first_block );
return true;
}
3000bc94: e0862002 add r2, r6, r2 <== NOT EXECUTED
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000bc98: e5922004 ldr r2, [r2, #4] <== NOT EXECUTED
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
3000bc9c: e3120001 tst r2, #1 <== NOT EXECUTED
3000bca0: 1a0000eb bne 3000c054 <_Heap_Walk+0x5dc> <== NOT EXECUTED
3000bca4: e58d8030 str r8, [sp, #48] ; 0x30 <== NOT EXECUTED
3000bca8: e58db034 str fp, [sp, #52] ; 0x34 <== NOT EXECUTED
3000bcac: e1a02004 mov r2, r4 <== NOT EXECUTED
3000bcb0: e1a08003 mov r8, r3 <== NOT EXECUTED
3000bcb4: e1a0b00c mov fp, ip <== NOT EXECUTED
);
return false;
}
if ( free_block->prev != prev_block ) {
3000bcb8: e596100c ldr r1, [r6, #12] <== NOT EXECUTED
3000bcbc: e1510002 cmp r1, r2 <== NOT EXECUTED
3000bcc0: 1a0000da bne 3000c030 <_Heap_Walk+0x5b8> <== NOT EXECUTED
return false;
}
prev_block = free_block;
free_block = free_block->next;
3000bcc4: e5965008 ldr r5, [r6, #8] <== NOT EXECUTED
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *const first_free_block = _Heap_Free_list_first( heap );
const Heap_Block *prev_block = free_list_tail;
const Heap_Block *free_block = first_free_block;
while ( free_block != free_list_tail ) {
3000bcc8: e1540005 cmp r4, r5 <== NOT EXECUTED
3000bccc: 0a000009 beq 3000bcf8 <_Heap_Walk+0x280> <== NOT EXECUTED
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000bcd0: e1580005 cmp r8, r5 <== NOT EXECUTED
3000bcd4: 9a00007d bls 3000bed0 <_Heap_Walk+0x458> <== NOT EXECUTED
if ( !_Heap_Is_block_in_heap( heap, free_block ) ) {
(*printer)(
3000bcd8: e1a0000a mov r0, sl <== NOT EXECUTED
3000bcdc: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bce0: e59f239c ldr r2, [pc, #924] ; 3000c084 <_Heap_Walk+0x60c> <== NOT EXECUTED
3000bce4: e1a03005 mov r3, r5 <== NOT EXECUTED
3000bce8: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bcec: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bcf0: e3a00000 mov r0, #0 <== NOT EXECUTED
3000bcf4: eaffff73 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
3000bcf8: e1a03008 mov r3, r8 <== NOT EXECUTED
3000bcfc: e59db034 ldr fp, [sp, #52] ; 0x34 <== NOT EXECUTED
3000bd00: e59d8030 ldr r8, [sp, #48] ; 0x30 <== NOT EXECUTED
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
3000bd04: e1a06008 mov r6, r8 <== NOT EXECUTED
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000bd08: e3cb7001 bic r7, fp, #1 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
const Heap_Block *block,
uintptr_t offset
)
{
return (Heap_Block *) ((uintptr_t) block + offset);
3000bd0c: e0875006 add r5, r7, r6 <== NOT EXECUTED
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000bd10: e1530005 cmp r3, r5 <== NOT EXECUTED
3000bd14: 9a000008 bls 3000bd3c <_Heap_Walk+0x2c4> <== NOT EXECUTED
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
if ( !_Heap_Is_block_in_heap( heap, next_block ) ) {
(*printer)(
3000bd18: e1a0000a mov r0, sl <== NOT EXECUTED
3000bd1c: e58d5000 str r5, [sp] <== NOT EXECUTED
3000bd20: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bd24: e59f235c ldr r2, [pc, #860] ; 3000c088 <_Heap_Walk+0x610> <== NOT EXECUTED
3000bd28: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bd2c: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bd30: e12fff19 bx r9 <== NOT EXECUTED
"block 0x%08x: next block 0x%08x not in heap\n",
block,
next_block
);
return false;
3000bd34: e3a00000 mov r0, #0 <== NOT EXECUTED
3000bd38: eaffff62 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
3000bd3c: e5943024 ldr r3, [r4, #36] ; 0x24 <== NOT EXECUTED
3000bd40: e1530005 cmp r3, r5 <== NOT EXECUTED
3000bd44: 3afffff3 bcc 3000bd18 <_Heap_Walk+0x2a0> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
3000bd48: e59d1024 ldr r1, [sp, #36] ; 0x24 <== NOT EXECUTED
3000bd4c: e1a00007 mov r0, r7 <== NOT EXECUTED
3000bd50: ebffe4da bl 300050c0 <__umodsi3> <== NOT EXECUTED
uintptr_t const block_begin = (uintptr_t) block;
uintptr_t const block_size = _Heap_Block_size( block );
bool const prev_used = _Heap_Is_prev_used( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
uintptr_t const next_block_begin = (uintptr_t) next_block;
bool const is_not_last_block = block != last_block;
3000bd54: e59d102c ldr r1, [sp, #44] ; 0x2c <== NOT EXECUTED
3000bd58: e0563001 subs r3, r6, r1 <== NOT EXECUTED
3000bd5c: 13a03001 movne r3, #1 <== NOT EXECUTED
);
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
3000bd60: e3500000 cmp r0, #0 <== NOT EXECUTED
3000bd64: 0a000001 beq 3000bd70 <_Heap_Walk+0x2f8> <== NOT EXECUTED
3000bd68: e3530000 cmp r3, #0 <== NOT EXECUTED
3000bd6c: 1a00008a bne 3000bf9c <_Heap_Walk+0x524> <== NOT EXECUTED
);
return false;
}
if ( block_size < min_block_size && is_not_last_block ) {
3000bd70: e59d2028 ldr r2, [sp, #40] ; 0x28 <== NOT EXECUTED
3000bd74: e1520007 cmp r2, r7 <== NOT EXECUTED
3000bd78: 9a000001 bls 3000bd84 <_Heap_Walk+0x30c> <== NOT EXECUTED
3000bd7c: e3530000 cmp r3, #0 <== NOT EXECUTED
3000bd80: 1a00008e bne 3000bfc0 <_Heap_Walk+0x548> <== NOT EXECUTED
);
return false;
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
3000bd84: e1560005 cmp r6, r5 <== NOT EXECUTED
3000bd88: 3a000001 bcc 3000bd94 <_Heap_Walk+0x31c> <== NOT EXECUTED
3000bd8c: e3530000 cmp r3, #0 <== NOT EXECUTED
3000bd90: 1a000094 bne 3000bfe8 <_Heap_Walk+0x570> <== NOT EXECUTED
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000bd94: e5953004 ldr r3, [r5, #4] <== NOT EXECUTED
3000bd98: e20bb001 and fp, fp, #1 <== NOT EXECUTED
);
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
3000bd9c: e3130001 tst r3, #1 <== NOT EXECUTED
3000bda0: 0a000018 beq 3000be08 <_Heap_Walk+0x390> <== NOT EXECUTED
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
}
} else if (prev_used) {
3000bda4: e35b0000 cmp fp, #0 <== NOT EXECUTED
3000bda8: 0a00000c beq 3000bde0 <_Heap_Walk+0x368> <== NOT EXECUTED
(*printer)(
3000bdac: e58d7000 str r7, [sp] <== NOT EXECUTED
3000bdb0: e1a0000a mov r0, sl <== NOT EXECUTED
3000bdb4: e3a01000 mov r1, #0 <== NOT EXECUTED
3000bdb8: e59f22cc ldr r2, [pc, #716] ; 3000c08c <_Heap_Walk+0x614> <== NOT EXECUTED
3000bdbc: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bdc0: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bdc4: e12fff19 bx r9 <== NOT EXECUTED
block->prev_size
);
}
block = next_block;
} while ( block != first_block );
3000bdc8: e1580005 cmp r8, r5 <== NOT EXECUTED
3000bdcc: 0affff3c beq 3000bac4 <_Heap_Walk+0x4c> <== NOT EXECUTED
3000bdd0: e595b004 ldr fp, [r5, #4] <== NOT EXECUTED
3000bdd4: e5943020 ldr r3, [r4, #32] <== NOT EXECUTED
3000bdd8: e1a06005 mov r6, r5 <== NOT EXECUTED
3000bddc: eaffffc9 b 3000bd08 <_Heap_Walk+0x290> <== NOT EXECUTED
"block 0x%08x: size %u\n",
block,
block_size
);
} else {
(*printer)(
3000bde0: e58d7000 str r7, [sp] <== NOT EXECUTED
3000bde4: e5963000 ldr r3, [r6] <== NOT EXECUTED
3000bde8: e1a0000a mov r0, sl <== NOT EXECUTED
3000bdec: e58d3004 str r3, [sp, #4] <== NOT EXECUTED
3000bdf0: e1a0100b mov r1, fp <== NOT EXECUTED
3000bdf4: e59f2294 ldr r2, [pc, #660] ; 3000c090 <_Heap_Walk+0x618> <== NOT EXECUTED
3000bdf8: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bdfc: e1a0e00f mov lr, pc <== NOT EXECUTED
3000be00: e12fff19 bx r9 <== NOT EXECUTED
3000be04: eaffffef b 3000bdc8 <_Heap_Walk+0x350> <== NOT EXECUTED
false,
"block 0x%08x: size %u, prev 0x%08x%s, next 0x%08x%s\n",
block,
block_size,
block->prev,
block->prev == first_free_block ?
3000be08: e596200c ldr r2, [r6, #12] <== NOT EXECUTED
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
3000be0c: e5943008 ldr r3, [r4, #8] <== NOT EXECUTED
block = next_block;
} while ( block != first_block );
return true;
}
3000be10: e594100c ldr r1, [r4, #12] <== NOT EXECUTED
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
3000be14: e1530002 cmp r3, r2 <== NOT EXECUTED
3000be18: 059f0274 ldreq r0, [pc, #628] ; 3000c094 <_Heap_Walk+0x61c><== NOT EXECUTED
3000be1c: 0a000003 beq 3000be30 <_Heap_Walk+0x3b8> <== NOT EXECUTED
block,
block_size,
block->prev,
block->prev == first_free_block ?
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
3000be20: e59f3270 ldr r3, [pc, #624] ; 3000c098 <_Heap_Walk+0x620> <== NOT EXECUTED
3000be24: e1540002 cmp r4, r2 <== NOT EXECUTED
3000be28: e59f026c ldr r0, [pc, #620] ; 3000c09c <_Heap_Walk+0x624> <== NOT EXECUTED
3000be2c: 01a00003 moveq r0, r3 <== NOT EXECUTED
block->next,
block->next == last_free_block ?
3000be30: e5963008 ldr r3, [r6, #8] <== NOT EXECUTED
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
3000be34: e1510003 cmp r1, r3 <== NOT EXECUTED
3000be38: 059f1260 ldreq r1, [pc, #608] ; 3000c0a0 <_Heap_Walk+0x628><== NOT EXECUTED
3000be3c: 0a000003 beq 3000be50 <_Heap_Walk+0x3d8> <== NOT EXECUTED
" (= first free)"
: (block->prev == free_list_head ? " (= head)" : ""),
block->next,
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
3000be40: e59fc25c ldr ip, [pc, #604] ; 3000c0a4 <_Heap_Walk+0x62c> <== NOT EXECUTED
3000be44: e1540003 cmp r4, r3 <== NOT EXECUTED
3000be48: e59f124c ldr r1, [pc, #588] ; 3000c09c <_Heap_Walk+0x624> <== NOT EXECUTED
3000be4c: 01a0100c moveq r1, ip <== NOT EXECUTED
Heap_Block *const last_free_block = _Heap_Free_list_last( heap );
bool const prev_used = _Heap_Is_prev_used( block );
uintptr_t const block_size = _Heap_Block_size( block );
Heap_Block *const next_block = _Heap_Block_at( block, block_size );
(*printer)(
3000be50: e58d2004 str r2, [sp, #4] <== NOT EXECUTED
3000be54: e58d0008 str r0, [sp, #8] <== NOT EXECUTED
3000be58: e58d300c str r3, [sp, #12] <== NOT EXECUTED
3000be5c: e58d1010 str r1, [sp, #16] <== NOT EXECUTED
3000be60: e1a03006 mov r3, r6 <== NOT EXECUTED
3000be64: e58d7000 str r7, [sp] <== NOT EXECUTED
3000be68: e1a0000a mov r0, sl <== NOT EXECUTED
3000be6c: e3a01000 mov r1, #0 <== NOT EXECUTED
3000be70: e59f2230 ldr r2, [pc, #560] ; 3000c0a8 <_Heap_Walk+0x630> <== NOT EXECUTED
3000be74: e1a0e00f mov lr, pc <== NOT EXECUTED
3000be78: e12fff19 bx r9 <== NOT EXECUTED
block->next == last_free_block ?
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
3000be7c: e5953000 ldr r3, [r5] <== NOT EXECUTED
3000be80: e1570003 cmp r7, r3 <== NOT EXECUTED
3000be84: 1a000028 bne 3000bf2c <_Heap_Walk+0x4b4> <== NOT EXECUTED
);
return false;
}
if ( !prev_used ) {
3000be88: e35b0000 cmp fp, #0 <== NOT EXECUTED
3000be8c: 0a000031 beq 3000bf58 <_Heap_Walk+0x4e0> <== NOT EXECUTED
block = next_block;
} while ( block != first_block );
return true;
}
3000be90: e5943008 ldr r3, [r4, #8] <== NOT EXECUTED
)
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
3000be94: e1540003 cmp r4, r3 <== NOT EXECUTED
3000be98: 0a000004 beq 3000beb0 <_Heap_Walk+0x438> <== NOT EXECUTED
if ( free_block == block ) {
3000be9c: e1560003 cmp r6, r3 <== NOT EXECUTED
3000bea0: 0affffc8 beq 3000bdc8 <_Heap_Walk+0x350> <== NOT EXECUTED
return true;
}
free_block = free_block->next;
3000bea4: e5933008 ldr r3, [r3, #8] <== NOT EXECUTED
)
{
const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap );
const Heap_Block *free_block = _Heap_Free_list_first( heap );
while ( free_block != free_list_tail ) {
3000bea8: e1540003 cmp r4, r3 <== NOT EXECUTED
3000beac: 1afffffa bne 3000be9c <_Heap_Walk+0x424> <== NOT EXECUTED
return false;
}
if ( !_Heap_Walk_is_in_free_list( heap, block ) ) {
(*printer)(
3000beb0: e1a0000a mov r0, sl <== NOT EXECUTED
3000beb4: e3a01001 mov r1, #1 <== NOT EXECUTED
3000beb8: e59f21ec ldr r2, [pc, #492] ; 3000c0ac <_Heap_Walk+0x634> <== NOT EXECUTED
3000bebc: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bec0: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bec4: e12fff19 bx r9 <== NOT EXECUTED
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
3000bec8: e3a00000 mov r0, #0 <== NOT EXECUTED
3000becc: eafffefd b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000bed0: e155000b cmp r5, fp <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
3000bed4: e2850008 add r0, r5, #8 <== NOT EXECUTED
3000bed8: e1a01007 mov r1, r7 <== NOT EXECUTED
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000bedc: 8affff7d bhi 3000bcd8 <_Heap_Walk+0x260> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned(
uintptr_t value,
uintptr_t alignment
)
{
return (value % alignment) == 0;
3000bee0: ebffe476 bl 300050c0 <__umodsi3> <== NOT EXECUTED
);
return false;
}
if (
3000bee4: e3500000 cmp r0, #0 <== NOT EXECUTED
3000bee8: 1a000048 bne 3000c010 <_Heap_Walk+0x598> <== NOT EXECUTED
- HEAP_BLOCK_HEADER_SIZE);
}
RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block )
{
return block->size_and_flag & ~HEAP_PREV_BLOCK_USED;
3000beec: e5953004 ldr r3, [r5, #4] <== NOT EXECUTED
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
3000bef0: e1a02006 mov r2, r6 <== NOT EXECUTED
3000bef4: e3c33001 bic r3, r3, #1 <== NOT EXECUTED
block = next_block;
} while ( block != first_block );
return true;
}
3000bef8: e0833005 add r3, r3, r5 <== NOT EXECUTED
block->size_and_flag = size | flag;
}
RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block )
{
return block->size_and_flag & HEAP_PREV_BLOCK_USED;
3000befc: e5933004 ldr r3, [r3, #4] <== NOT EXECUTED
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
3000bf00: e1a06005 mov r6, r5 <== NOT EXECUTED
3000bf04: e3130001 tst r3, #1 <== NOT EXECUTED
3000bf08: 0affff6a beq 3000bcb8 <_Heap_Walk+0x240> <== NOT EXECUTED
(*printer)(
3000bf0c: e1a0000a mov r0, sl <== NOT EXECUTED
3000bf10: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bf14: e59f2194 ldr r2, [pc, #404] ; 3000c0b0 <_Heap_Walk+0x638> <== NOT EXECUTED
3000bf18: e1a03005 mov r3, r5 <== NOT EXECUTED
3000bf1c: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bf20: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bf24: e3a00000 mov r0, #0 <== NOT EXECUTED
3000bf28: eafffee6 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
" (= last free)"
: (block->next == free_list_tail ? " (= tail)" : "")
);
if ( block_size != next_block->prev_size ) {
(*printer)(
3000bf2c: e58d3004 str r3, [sp, #4] <== NOT EXECUTED
3000bf30: e1a0000a mov r0, sl <== NOT EXECUTED
3000bf34: e58d7000 str r7, [sp] <== NOT EXECUTED
3000bf38: e58d5008 str r5, [sp, #8] <== NOT EXECUTED
3000bf3c: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bf40: e59f216c ldr r2, [pc, #364] ; 3000c0b4 <_Heap_Walk+0x63c> <== NOT EXECUTED
3000bf44: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bf48: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bf4c: e12fff19 bx r9 <== NOT EXECUTED
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
3000bf50: e3a00000 mov r0, #0 <== NOT EXECUTED
3000bf54: eafffedb b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
return false;
}
if ( !prev_used ) {
(*printer)(
3000bf58: e1a0000a mov r0, sl <== NOT EXECUTED
3000bf5c: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bf60: e59f2150 ldr r2, [pc, #336] ; 3000c0b8 <_Heap_Walk+0x640> <== NOT EXECUTED
3000bf64: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bf68: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bf6c: e12fff19 bx r9 <== NOT EXECUTED
return false;
}
if ( !_Heap_Is_prev_used( next_block ) ) {
if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) {
return false;
3000bf70: e1a0000b mov r0, fp <== NOT EXECUTED
3000bf74: eafffed3 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
return false;
}
if ( !_Heap_Is_prev_used( first_block ) ) {
(*printer)(
3000bf78: e1a0000a mov r0, sl <== NOT EXECUTED
3000bf7c: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bf80: e59f2134 ldr r2, [pc, #308] ; 3000c0bc <_Heap_Walk+0x644> <== NOT EXECUTED
3000bf84: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bf88: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000bf8c: e1a00005 mov r0, r5 <== NOT EXECUTED
3000bf90: eafffecc b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
const Heap_Control *heap,
const Heap_Block *block
)
{
return (uintptr_t) block >= (uintptr_t) heap->first_block
&& (uintptr_t) block <= (uintptr_t) heap->last_block;
3000bf94: e1a05006 mov r5, r6 <== NOT EXECUTED
3000bf98: eaffff4e b 3000bcd8 <_Heap_Walk+0x260> <== NOT EXECUTED
return false;
}
if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) {
(*printer)(
3000bf9c: e1a0000a mov r0, sl <== NOT EXECUTED
3000bfa0: e58d7000 str r7, [sp] <== NOT EXECUTED
3000bfa4: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bfa8: e59f2110 ldr r2, [pc, #272] ; 3000c0c0 <_Heap_Walk+0x648> <== NOT EXECUTED
3000bfac: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bfb0: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bfb4: e12fff19 bx r9 <== NOT EXECUTED
"block 0x%08x: block size %u not page aligned\n",
block,
block_size
);
return false;
3000bfb8: e3a00000 mov r0, #0 <== NOT EXECUTED
3000bfbc: eafffec1 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
}
if ( block_size < min_block_size && is_not_last_block ) {
(*printer)(
3000bfc0: e58d2004 str r2, [sp, #4] <== NOT EXECUTED
3000bfc4: e1a0000a mov r0, sl <== NOT EXECUTED
3000bfc8: e58d7000 str r7, [sp] <== NOT EXECUTED
3000bfcc: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bfd0: e59f20ec ldr r2, [pc, #236] ; 3000c0c4 <_Heap_Walk+0x64c> <== NOT EXECUTED
3000bfd4: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bfd8: e1a0e00f mov lr, pc <== NOT EXECUTED
3000bfdc: e12fff19 bx r9 <== NOT EXECUTED
block,
block_size,
min_block_size
);
return false;
3000bfe0: e3a00000 mov r0, #0 <== NOT EXECUTED
3000bfe4: eafffeb7 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
}
if ( next_block_begin <= block_begin && is_not_last_block ) {
(*printer)(
3000bfe8: e1a0000a mov r0, sl <== NOT EXECUTED
3000bfec: e58d5000 str r5, [sp] <== NOT EXECUTED
3000bff0: e3a01001 mov r1, #1 <== NOT EXECUTED
3000bff4: e59f20cc ldr r2, [pc, #204] ; 3000c0c8 <_Heap_Walk+0x650> <== NOT EXECUTED
3000bff8: e1a03006 mov r3, r6 <== NOT EXECUTED
3000bffc: e1a0e00f mov lr, pc <== NOT EXECUTED
3000c000: e12fff19 bx r9 <== NOT EXECUTED
"block 0x%08x: next block 0x%08x is not a successor\n",
block,
next_block
);
return false;
3000c004: e3a00000 mov r0, #0 <== NOT EXECUTED
3000c008: eafffeae b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
);
return false;
}
if (
3000c00c: e1a05006 mov r5, r6 <== NOT EXECUTED
!_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size )
) {
(*printer)(
3000c010: e1a0000a mov r0, sl <== NOT EXECUTED
3000c014: e3a01001 mov r1, #1 <== NOT EXECUTED
3000c018: e59f20ac ldr r2, [pc, #172] ; 3000c0cc <_Heap_Walk+0x654> <== NOT EXECUTED
3000c01c: e1a03005 mov r3, r5 <== NOT EXECUTED
3000c020: e1a0e00f mov lr, pc <== NOT EXECUTED
3000c024: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000c028: e3a00000 mov r0, #0 <== NOT EXECUTED
3000c02c: eafffea5 b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
return false;
}
if ( free_block->prev != prev_block ) {
(*printer)(
3000c030: e58d1000 str r1, [sp] <== NOT EXECUTED
3000c034: e1a0000a mov r0, sl <== NOT EXECUTED
3000c038: e3a01001 mov r1, #1 <== NOT EXECUTED
3000c03c: e59f208c ldr r2, [pc, #140] ; 3000c0d0 <_Heap_Walk+0x658> <== NOT EXECUTED
3000c040: e1a03006 mov r3, r6 <== NOT EXECUTED
3000c044: e1a0e00f mov lr, pc <== NOT EXECUTED
3000c048: e12fff19 bx r9 <== NOT EXECUTED
if ( !_System_state_Is_up( _System_state_Get() ) ) {
return true;
}
if ( !_Heap_Walk_check_control( source, printer, heap ) ) {
return false;
3000c04c: e3a00000 mov r0, #0 <== NOT EXECUTED
3000c050: eafffe9c b 3000bac8 <_Heap_Walk+0x50> <== NOT EXECUTED
);
return false;
}
if ( _Heap_Is_used( free_block ) ) {
3000c054: e1a05006 mov r5, r6 <== NOT EXECUTED
3000c058: eaffffab b 3000bf0c <_Heap_Walk+0x494> <== NOT EXECUTED
3000ba20 <_Heap_Walk_print>:
static void _Heap_Walk_print( int source, bool error, const char *fmt, ... )
{
3000ba20: e92d000c push {r2, r3} <== NOT EXECUTED
3000ba24: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
va_list ap;
if ( error ) {
3000ba28: e31100ff tst r1, #255 ; 0xff <== NOT EXECUTED
{
/* Do nothing */
}
static void _Heap_Walk_print( int source, bool error, const char *fmt, ... )
{
3000ba2c: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3000ba30: e1a01000 mov r1, r0 <== NOT EXECUTED
va_list ap;
if ( error ) {
3000ba34: 1a00000a bne 3000ba64 <_Heap_Walk_print+0x44> <== NOT EXECUTED
printk( "FAIL[%d]: ", source );
} else {
printk( "PASS[%d]: ", source );
3000ba38: e59f0030 ldr r0, [pc, #48] ; 3000ba70 <_Heap_Walk_print+0x50><== NOT EXECUTED
3000ba3c: ebfff040 bl 30007b44 <printk> <== NOT EXECUTED
}
va_start( ap, fmt );
3000ba40: e28d300c add r3, sp, #12 <== NOT EXECUTED
vprintk( fmt, ap );
3000ba44: e59d0008 ldr r0, [sp, #8] <== NOT EXECUTED
3000ba48: e1a01003 mov r1, r3 <== NOT EXECUTED
printk( "FAIL[%d]: ", source );
} else {
printk( "PASS[%d]: ", source );
}
va_start( ap, fmt );
3000ba4c: e58d3000 str r3, [sp] <== NOT EXECUTED
vprintk( fmt, ap );
3000ba50: ebfff7cc bl 30009988 <vprintk> <== NOT EXECUTED
va_end( ap );
}
3000ba54: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000ba58: e49de004 pop {lr} ; (ldr lr, [sp], #4) <== NOT EXECUTED
3000ba5c: e28dd008 add sp, sp, #8 <== NOT EXECUTED
3000ba60: e12fff1e bx lr <== NOT EXECUTED
static void _Heap_Walk_print( int source, bool error, const char *fmt, ... )
{
va_list ap;
if ( error ) {
printk( "FAIL[%d]: ", source );
3000ba64: e59f0008 ldr r0, [pc, #8] ; 3000ba74 <_Heap_Walk_print+0x54><== NOT EXECUTED
3000ba68: ebfff035 bl 30007b44 <printk> <== NOT EXECUTED
3000ba6c: eafffff3 b 3000ba40 <_Heap_Walk_print+0x20> <== NOT EXECUTED
3000ba14 <_Heap_Walk_print_nothing>:
int source,
bool error,
const char *fmt,
...
)
{
3000ba14: e92d000c push {r2, r3} <== NOT EXECUTED
/* Do nothing */
}
3000ba18: e28dd008 add sp, sp, #8 <== NOT EXECUTED
3000ba1c: e12fff1e bx lr <== NOT EXECUTED
3000ae24 <_Internal_error_Occurred>:
bool is_internal,
Internal_errors_t the_error
)
{
_Internal_errors_What_happened.the_source = the_source;
3000ae24: e59f303c ldr r3, [pc, #60] ; 3000ae68 <_Internal_error_Occurred+0x44>
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
3000ae28: e201c0ff and ip, r1, #255 ; 0xff
3000ae2c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
_Internal_errors_What_happened.the_error = the_error;
_User_extensions_Fatal( the_source, is_internal, the_error );
3000ae30: e1a0100c mov r1, ip
bool is_internal,
Internal_errors_t the_error
)
{
_Internal_errors_What_happened.the_source = the_source;
3000ae34: e5830000 str r0, [r3]
_Internal_errors_What_happened.is_internal = is_internal;
3000ae38: e5c3c004 strb ip, [r3, #4]
_Internal_errors_What_happened.the_error = the_error;
3000ae3c: e5832008 str r2, [r3, #8]
void _Internal_error_Occurred(
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
3000ae40: e1a04002 mov r4, r2
_Internal_errors_What_happened.the_source = the_source;
_Internal_errors_What_happened.is_internal = is_internal;
_Internal_errors_What_happened.the_error = the_error;
_User_extensions_Fatal( the_source, is_internal, the_error );
3000ae44: eb0007a5 bl 3000cce0 <_User_extensions_Fatal>
RTEMS_INLINE_ROUTINE void _System_state_Set (
System_state_Codes state
)
{
_System_state_Current = state;
3000ae48: e59f301c ldr r3, [pc, #28] ; 3000ae6c <_Internal_error_Occurred+0x48><== NOT EXECUTED
3000ae4c: e3a02005 mov r2, #5 <== NOT EXECUTED
3000ae50: e5832000 str r2, [r3] <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000ae54: e10f2000 mrs r2, CPSR <== NOT EXECUTED
3000ae58: e3823080 orr r3, r2, #128 ; 0x80 <== NOT EXECUTED
3000ae5c: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
_System_state_Set( SYSTEM_STATE_FAILED );
_CPU_Fatal_halt( the_error );
3000ae60: e1a00004 mov r0, r4 <== NOT EXECUTED
3000ae64: eafffffe b 3000ae64 <_Internal_error_Occurred+0x40> <== NOT EXECUTED
3000af2c <_Objects_Extend_information>:
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
3000af2c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
3000af30: e5904034 ldr r4, [r0, #52] ; 0x34
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
3000af34: e24dd014 sub sp, sp, #20
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
3000af38: e3540000 cmp r4, #0
*/
void _Objects_Extend_information(
Objects_Information *information
)
{
3000af3c: e1a05000 mov r5, r0
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
3000af40: e1d070b8 ldrh r7, [r0, #8]
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
3000af44: 0a00009a beq 3000b1b4 <_Objects_Extend_information+0x288>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
3000af48: e1d081b4 ldrh r8, [r0, #20]
3000af4c: e1d0a1b0 ldrh sl, [r0, #16]
3000af50: e1a01008 mov r1, r8
3000af54: e1a0000a mov r0, sl
3000af58: eb002635 bl 30014834 <__aeabi_uidiv>
3000af5c: e1a03800 lsl r3, r0, #16
for ( ; block < block_count; block++ ) {
3000af60: e1b03823 lsrs r3, r3, #16
3000af64: 0a000098 beq 3000b1cc <_Objects_Extend_information+0x2a0>
if ( information->object_blocks[ block ] == NULL ) {
3000af68: e5949000 ldr r9, [r4]
3000af6c: e3590000 cmp r9, #0
3000af70: 01a01008 moveq r1, r8
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
3000af74: 01a06007 moveq r6, r7
index_base = minimum_index;
block = 0;
3000af78: 01a04009 moveq r4, r9
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
3000af7c: 0a00000c beq 3000afb4 <_Objects_Extend_information+0x88>
3000af80: e1a02004 mov r2, r4
3000af84: e1a01008 mov r1, r8
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
3000af88: e1a06007 mov r6, r7
index_base = minimum_index;
block = 0;
3000af8c: e3a04000 mov r4, #0
3000af90: ea000002 b 3000afa0 <_Objects_Extend_information+0x74>
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
if ( information->object_blocks[ block ] == NULL ) {
3000af94: e5b29004 ldr r9, [r2, #4]!
3000af98: e3590000 cmp r9, #0
3000af9c: 0a000004 beq 3000afb4 <_Objects_Extend_information+0x88>
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
3000afa0: e2844001 add r4, r4, #1
3000afa4: e1530004 cmp r3, r4
if ( information->object_blocks[ block ] == NULL ) {
do_extend = false;
break;
} else
index_base += information->allocation_size;
3000afa8: e0866008 add r6, r6, r8
if ( information->object_blocks == NULL )
block_count = 0;
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
3000afac: 8afffff8 bhi 3000af94 <_Objects_Extend_information+0x68>
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
3000afb0: e3a09001 mov r9, #1
} else
index_base += information->allocation_size;
}
}
maximum = (uint32_t) information->maximum + information->allocation_size;
3000afb4: e08aa001 add sl, sl, r1
/*
* We need to limit the number of objects to the maximum number
* representable in the index portion of the object Id. In the
* case of 16-bit Ids, this is only 256 object instances.
*/
if ( maximum > OBJECTS_ID_FINAL_INDEX ) {
3000afb8: e35a0801 cmp sl, #65536 ; 0x10000
3000afbc: 2a000062 bcs 3000b14c <_Objects_Extend_information+0x220>
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
if ( information->auto_extend ) {
3000afc0: e5d52012 ldrb r2, [r5, #18]
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
3000afc4: e5950018 ldr r0, [r5, #24]
if ( information->auto_extend ) {
3000afc8: e3520000 cmp r2, #0
/*
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
3000afcc: e0000091 mul r0, r1, r0
if ( information->auto_extend ) {
3000afd0: 1a00005f bne 3000b154 <_Objects_Extend_information+0x228>
new_object_block = _Workspace_Allocate( block_size );
if ( !new_object_block )
return;
} else {
new_object_block = _Workspace_Allocate_or_fatal_error( block_size );
3000afd4: e58d3000 str r3, [sp]
3000afd8: eb000888 bl 3000d200 <_Workspace_Allocate_or_fatal_error>
3000afdc: e59d3000 ldr r3, [sp]
3000afe0: e1a08000 mov r8, r0
}
/*
* Do we need to grow the tables?
*/
if ( do_extend ) {
3000afe4: e3590000 cmp r9, #0
3000afe8: 0a000038 beq 3000b0d0 <_Objects_Extend_information+0x1a4>
*/
/*
* Up the block count and maximum
*/
block_count++;
3000afec: e283b001 add fp, r3, #1
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
3000aff0: e08b008b add r0, fp, fp, lsl #1
((maximum + minimum_index) * sizeof(Objects_Control *));
3000aff4: e08a0000 add r0, sl, r0
/*
* Allocate the tables and break it up.
*/
block_size = block_count *
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
3000aff8: e0800007 add r0, r0, r7
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
3000affc: e1a00100 lsl r0, r0, #2
3000b000: e58d3000 str r3, [sp]
3000b004: eb000873 bl 3000d1d8 <_Workspace_Allocate>
if ( !object_blocks ) {
3000b008: e2509000 subs r9, r0, #0
3000b00c: e59d3000 ldr r3, [sp]
3000b010: 0a000072 beq 3000b1e0 <_Objects_Extend_information+0x2b4>
* Take the block count down. Saves all the (block_count - 1)
* in the copies.
*/
block_count--;
if ( information->maximum > minimum_index ) {
3000b014: e1d521b0 ldrh r2, [r5, #16]
RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
const void *base,
uintptr_t offset
)
{
return (void *)((uintptr_t)base + offset);
3000b018: e089c10b add ip, r9, fp, lsl #2
3000b01c: e1570002 cmp r7, r2
3000b020: e089b18b add fp, r9, fp, lsl #3
3000b024: 3a000050 bcc 3000b16c <_Objects_Extend_information+0x240>
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
3000b028: e3570000 cmp r7, #0
3000b02c: 13a02000 movne r2, #0
3000b030: 11a0100b movne r1, fp
local_table[ index ] = NULL;
3000b034: 11a00002 movne r0, r2
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
3000b038: 0a000003 beq 3000b04c <_Objects_Extend_information+0x120>
3000b03c: e2822001 add r2, r2, #1
3000b040: e1570002 cmp r7, r2
local_table[ index ] = NULL;
3000b044: e4810004 str r0, [r1], #4
} else {
/*
* Deal with the special case of the 0 to minimum_index
*/
for ( index = 0; index < minimum_index; index++ ) {
3000b048: 8afffffb bhi 3000b03c <_Objects_Extend_information+0x110>
3000b04c: e1a03103 lsl r3, r3, #2
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
3000b050: e1d511b4 ldrh r1, [r5, #20]
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
3000b054: e3a00000 mov r0, #0
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
3000b058: e0861001 add r1, r6, r1
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
3000b05c: e1560001 cmp r6, r1
}
/*
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
3000b060: e7890003 str r0, [r9, r3]
inactive_per_block[block_count] = 0;
3000b064: e78c0003 str r0, [ip, r3]
for ( index=index_base ;
3000b068: 2a000005 bcs 3000b084 <_Objects_Extend_information+0x158>
3000b06c: e08b2106 add r2, fp, r6, lsl #2
* information - object information table
*
* Output parameters: NONE
*/
void _Objects_Extend_information(
3000b070: e1a03006 mov r3, r6
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
index < ( information->allocation_size + index_base );
index++ ) {
3000b074: e2833001 add r3, r3, #1
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
3000b078: e1530001 cmp r3, r1
index < ( information->allocation_size + index_base );
index++ ) {
local_table[ index ] = NULL;
3000b07c: e4820004 str r0, [r2], #4
* Initialise the new entries in the table.
*/
object_blocks[block_count] = NULL;
inactive_per_block[block_count] = 0;
for ( index=index_base ;
3000b080: 3afffffb bcc 3000b074 <_Objects_Extend_information+0x148>
3000b084: e10f3000 mrs r3, CPSR
3000b088: e3832080 orr r2, r3, #128 ; 0x80
3000b08c: e129f002 msr CPSR_fc, r2
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
3000b090: e5952000 ldr r2, [r5]
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
information->maximum_id = _Objects_Build_id(
3000b094: e1d510b4 ldrh r1, [r5, #4]
3000b098: e1a02c02 lsl r2, r2, #24
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
3000b09c: e1a0a80a lsl sl, sl, #16
3000b0a0: e3822801 orr r2, r2, #65536 ; 0x10000
3000b0a4: e1a0a82a lsr sl, sl, #16
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
3000b0a8: e1822d81 orr r2, r2, r1, lsl #27
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
3000b0ac: e182200a orr r2, r2, sl
local_table[ index ] = NULL;
}
_ISR_Disable( level );
old_tables = information->object_blocks;
3000b0b0: e5950034 ldr r0, [r5, #52] ; 0x34
information->object_blocks = object_blocks;
information->inactive_per_block = inactive_per_block;
3000b0b4: e585c030 str ip, [r5, #48] ; 0x30
_ISR_Disable( level );
old_tables = information->object_blocks;
information->object_blocks = object_blocks;
3000b0b8: e5859034 str r9, [r5, #52] ; 0x34
information->inactive_per_block = inactive_per_block;
information->local_table = local_table;
3000b0bc: e585b01c str fp, [r5, #28]
information->maximum = (Objects_Maximum) maximum;
3000b0c0: e1c5a1b0 strh sl, [r5, #16]
information->maximum_id = _Objects_Build_id(
3000b0c4: e585200c str r2, [r5, #12]
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000b0c8: e129f003 msr CPSR_fc, r3
information->maximum
);
_ISR_Enable( level );
_Workspace_Free( old_tables );
3000b0cc: eb000847 bl 3000d1f0 <_Workspace_Free>
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
3000b0d0: e5953034 ldr r3, [r5, #52] ; 0x34
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
3000b0d4: e28d7008 add r7, sp, #8
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
3000b0d8: e7838104 str r8, [r3, r4, lsl #2]
/*
* Initialize objects .. add to a local chain first.
*/
_Chain_Initialize(
3000b0dc: e1a01008 mov r1, r8
3000b0e0: e1a00007 mov r0, r7
3000b0e4: e1d521b4 ldrh r2, [r5, #20]
3000b0e8: e5953018 ldr r3, [r5, #24]
3000b0ec: eb001019 bl 3000f158 <_Chain_Initialize>
}
/*
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
3000b0f0: e1a04104 lsl r4, r4, #2
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
3000b0f4: e2858020 add r8, r5, #32
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
3000b0f8: ea000009 b 3000b124 <_Objects_Extend_information+0x1f8>
3000b0fc: e5953000 ldr r3, [r5]
the_object->id = _Objects_Build_id(
3000b100: e1d520b4 ldrh r2, [r5, #4]
3000b104: e1a03c03 lsl r3, r3, #24
3000b108: e3833801 orr r3, r3, #65536 ; 0x10000
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
3000b10c: e1833d82 orr r3, r3, r2, lsl #27
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
3000b110: e1833006 orr r3, r3, r6
3000b114: e5813008 str r3, [r1, #8]
information->the_class,
_Objects_Local_node,
index
);
_Chain_Append( &information->Inactive, &the_object->Node );
3000b118: e1a00008 mov r0, r8
3000b11c: ebfffcec bl 3000a4d4 <_Chain_Append>
index++;
3000b120: e2866001 add r6, r6, #1
/*
* Move from the local chain, initialise, then append to the inactive chain
*/
index = index_base;
while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
3000b124: e1a00007 mov r0, r7
3000b128: ebfffcfc bl 3000a520 <_Chain_Get>
3000b12c: e2501000 subs r1, r0, #0
3000b130: 1afffff1 bne 3000b0fc <_Objects_Extend_information+0x1d0>
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
3000b134: e1d522bc ldrh r2, [r5, #44] ; 0x2c
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
3000b138: e1d531b4 ldrh r3, [r5, #20]
3000b13c: e5951030 ldr r1, [r5, #48] ; 0x30
information->inactive =
(Objects_Maximum)(information->inactive + information->allocation_size);
3000b140: e0832002 add r2, r3, r2
_Chain_Append( &information->Inactive, &the_object->Node );
index++;
}
information->inactive_per_block[ block ] = information->allocation_size;
3000b144: e7813004 str r3, [r1, r4]
information->inactive =
3000b148: e1c522bc strh r2, [r5, #44] ; 0x2c
(Objects_Maximum)(information->inactive + information->allocation_size);
}
3000b14c: e28dd014 add sp, sp, #20
3000b150: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
block_size = information->allocation_size * information->size;
if ( information->auto_extend ) {
new_object_block = _Workspace_Allocate( block_size );
3000b154: e58d3000 str r3, [sp]
3000b158: eb00081e bl 3000d1d8 <_Workspace_Allocate>
if ( !new_object_block )
3000b15c: e2508000 subs r8, r0, #0
3000b160: e59d3000 ldr r3, [sp]
3000b164: 1affff9e bne 3000afe4 <_Objects_Extend_information+0xb8>
3000b168: eafffff7 b 3000b14c <_Objects_Extend_information+0x220>
/*
* Copy each section of the table over. This has to be performed as
* separate parts as size of each block has changed.
*/
memcpy( object_blocks,
3000b16c: e1a03103 lsl r3, r3, #2
3000b170: e5951034 ldr r1, [r5, #52] ; 0x34
3000b174: e1a02003 mov r2, r3
3000b178: e88d1008 stm sp, {r3, ip}
3000b17c: eb001a17 bl 300119e0 <memcpy>
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
3000b180: e89d1008 ldm sp, {r3, ip}
3000b184: e1a0000c mov r0, ip
3000b188: e1a02003 mov r2, r3
3000b18c: e5951030 ldr r1, [r5, #48] ; 0x30
3000b190: eb001a12 bl 300119e0 <memcpy>
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
3000b194: e1d521b0 ldrh r2, [r5, #16]
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
3000b198: e1a0000b mov r0, fp
information->local_table,
(information->maximum + minimum_index) * sizeof(Objects_Control *) );
3000b19c: e0872002 add r2, r7, r2
information->object_blocks,
block_count * sizeof(void*) );
memcpy( inactive_per_block,
information->inactive_per_block,
block_count * sizeof(uint32_t) );
memcpy( local_table,
3000b1a0: e595101c ldr r1, [r5, #28]
3000b1a4: e1a02102 lsl r2, r2, #2
3000b1a8: eb001a0c bl 300119e0 <memcpy>
3000b1ac: e89d1008 ldm sp, {r3, ip}
3000b1b0: eaffffa6 b 3000b050 <_Objects_Extend_information+0x124>
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
3000b1b4: e1d0a1b0 ldrh sl, [r0, #16]
3000b1b8: e1d011b4 ldrh r1, [r0, #20]
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
3000b1bc: e1a06007 mov r6, r7
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
3000b1c0: e3a09001 mov r9, #1
index_base = minimum_index;
block = 0;
/* if ( information->maximum < minimum_index ) */
if ( information->object_blocks == NULL )
block_count = 0;
3000b1c4: e1a03004 mov r3, r4
3000b1c8: eaffff79 b 3000afb4 <_Objects_Extend_information+0x88>
else {
block_count = information->maximum / information->allocation_size;
for ( ; block < block_count; block++ ) {
3000b1cc: e1a01008 mov r1, r8 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
minimum_index = _Objects_Get_index( information->minimum_id );
3000b1d0: e1a06007 mov r6, r7 <== NOT EXECUTED
/*
* Search for a free block of indexes. If we do NOT need to allocate or
* extend the block table, then we will change do_extend.
*/
do_extend = true;
3000b1d4: e3a09001 mov r9, #1 <== NOT EXECUTED
minimum_index = _Objects_Get_index( information->minimum_id );
index_base = minimum_index;
block = 0;
3000b1d8: e1a04003 mov r4, r3 <== NOT EXECUTED
3000b1dc: eaffff74 b 3000afb4 <_Objects_Extend_information+0x88> <== NOT EXECUTED
(sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) +
((maximum + minimum_index) * sizeof(Objects_Control *));
object_blocks = (void**) _Workspace_Allocate( block_size );
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
3000b1e0: e1a00008 mov r0, r8
3000b1e4: eb000801 bl 3000d1f0 <_Workspace_Free>
return;
3000b1e8: eaffffd7 b 3000b14c <_Objects_Extend_information+0x220>
3000b348 <_Objects_Get>:
* always NULL.
*
* If the Id is valid but the object has not been created yet, then
* the local_table entry will be NULL.
*/
index = id - information->minimum_id + 1;
3000b348: e590c008 ldr ip, [r0, #8]
Objects_Control *_Objects_Get(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
3000b34c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
/*
* If the index is less than maximum, then it is OK to use it to
* index into the local_table array.
*/
if ( index <= information->maximum ) {
3000b350: e1d031b0 ldrh r3, [r0, #16]
* always NULL.
*
* If the Id is valid but the object has not been created yet, then
* the local_table entry will be NULL.
*/
index = id - information->minimum_id + 1;
3000b354: e26cc001 rsb ip, ip, #1
3000b358: e08c1001 add r1, ip, r1
/*
* If the index is less than maximum, then it is OK to use it to
* index into the local_table array.
*/
if ( index <= information->maximum ) {
3000b35c: e1510003 cmp r1, r3
/*
* Object Id is not within this API and Class on this node. So
* it may be global in a multiprocessing system. But it is clearly
* invalid on a single processor system.
*/
*location = OBJECTS_ERROR;
3000b360: 83a03001 movhi r3, #1
Objects_Control *_Objects_Get(
Objects_Information *information,
Objects_Id id,
Objects_Locations *location
)
{
3000b364: e24dd008 sub sp, sp, #8
/*
* Object Id is not within this API and Class on this node. So
* it may be global in a multiprocessing system. But it is clearly
* invalid on a single processor system.
*/
*location = OBJECTS_ERROR;
3000b368: 85823000 strhi r3, [r2]
#if defined(RTEMS_MULTIPROCESSING)
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
3000b36c: 83a00000 movhi r0, #0
/*
* If the index is less than maximum, then it is OK to use it to
* index into the local_table array.
*/
if ( index <= information->maximum ) {
3000b370: 8a000009 bhi 3000b39c <_Objects_Get+0x54>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000b374: e59f3048 ldr r3, [pc, #72] ; 3000b3c4 <_Objects_Get+0x7c>
3000b378: e593c000 ldr ip, [r3]
3000b37c: e28cc001 add ip, ip, #1
3000b380: e583c000 str ip, [r3]
_Thread_Disable_dispatch();
if ( (the_object = information->local_table[ index ]) != NULL ) {
3000b384: e590301c ldr r3, [r0, #28]
3000b388: e7930101 ldr r0, [r3, r1, lsl #2]
3000b38c: e3500000 cmp r0, #0
*location = OBJECTS_LOCAL;
3000b390: 13a03000 movne r3, #0
3000b394: 15823000 strne r3, [r2]
* If the index is less than maximum, then it is OK to use it to
* index into the local_table array.
*/
if ( index <= information->maximum ) {
_Thread_Disable_dispatch();
if ( (the_object = information->local_table[ index ]) != NULL ) {
3000b398: 0a000001 beq 3000b3a4 <_Objects_Get+0x5c>
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
#endif
}
3000b39c: e28dd008 add sp, sp, #8
3000b3a0: e8bd8000 pop {pc}
/*
* Valid Id for this API, Class and Node but the object has not
* been allocated yet.
*/
_Thread_Enable_dispatch();
3000b3a4: e58d0004 str r0, [sp, #4] <== NOT EXECUTED
3000b3a8: e58d2000 str r2, [sp] <== NOT EXECUTED
3000b3ac: eb000334 bl 3000c084 <_Thread_Enable_dispatch> <== NOT EXECUTED
*location = OBJECTS_ERROR;
3000b3b0: e59d2000 ldr r2, [sp] <== NOT EXECUTED
3000b3b4: e3a03001 mov r3, #1 <== NOT EXECUTED
3000b3b8: e5823000 str r3, [r2] <== NOT EXECUTED
return NULL;
3000b3bc: e59d0004 ldr r0, [sp, #4] <== NOT EXECUTED
3000b3c0: eafffff5 b 3000b39c <_Objects_Get+0x54> <== NOT EXECUTED
3000b274 <_Objects_Get_information>:
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
3000b274: e1a01801 lsl r1, r1, #16
3000b278: e92d4030 push {r4, r5, lr}
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
3000b27c: e1b04821 lsrs r4, r1, #16
Objects_Information *_Objects_Get_information(
Objects_APIs the_api,
uint16_t the_class
)
{
3000b280: e1a05000 mov r5, r0
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
return NULL;
3000b284: 01a00004 moveq r0, r4
)
{
Objects_Information *info;
int the_class_api_maximum;
if ( !the_class )
3000b288: 08bd8030 popeq {r4, r5, pc}
/*
* This call implicitly validates the_api so we do not call
* _Objects_Is_api_valid above here.
*/
the_class_api_maximum = _Objects_API_maximum_class( the_api );
3000b28c: eb001139 bl 3000f778 <_Objects_API_maximum_class>
if ( the_class_api_maximum == 0 )
3000b290: e3500000 cmp r0, #0
3000b294: 08bd8030 popeq {r4, r5, pc}
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
3000b298: e1500004 cmp r0, r4
3000b29c: 2a000001 bcs 3000b2a8 <_Objects_Get_information+0x34>
return NULL;
3000b2a0: e3a00000 mov r0, #0 <== NOT EXECUTED
if ( info->maximum == 0 )
return NULL;
#endif
return info;
}
3000b2a4: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
return NULL;
if ( the_class > (uint32_t) the_class_api_maximum )
return NULL;
if ( !_Objects_Information_table[ the_api ] )
3000b2a8: e59f3024 ldr r3, [pc, #36] ; 3000b2d4 <_Objects_Get_information+0x60>
3000b2ac: e7930105 ldr r0, [r3, r5, lsl #2]
3000b2b0: e3500000 cmp r0, #0
3000b2b4: 08bd8030 popeq {r4, r5, pc}
return NULL;
info = _Objects_Information_table[ the_api ][ the_class ];
3000b2b8: e7900104 ldr r0, [r0, r4, lsl #2]
if ( !info )
3000b2bc: e3500000 cmp r0, #0
3000b2c0: 08bd8030 popeq {r4, r5, pc}
* In a multprocessing configuration, we may access remote objects.
* Thus we may have 0 local instances and still have a valid object
* pointer.
*/
#if !defined(RTEMS_MULTIPROCESSING)
if ( info->maximum == 0 )
3000b2c4: e1d031b0 ldrh r3, [r0, #16]
return NULL;
3000b2c8: e3530000 cmp r3, #0
3000b2cc: 03a00000 moveq r0, #0
3000b2d0: e8bd8030 pop {r4, r5, pc}
3000b2d8 <_Objects_Get_isr_disable>:
{
Objects_Control *the_object;
uint32_t index;
ISR_Level level;
index = id - information->minimum_id + 1;
3000b2d8: e590c008 ldr ip, [r0, #8]
Objects_Information *information,
Objects_Id id,
Objects_Locations *location,
ISR_Level *level_p
)
{
3000b2dc: e52d4004 push {r4} ; (str r4, [sp, #-4]!)
Objects_Control *the_object;
uint32_t index;
ISR_Level level;
index = id - information->minimum_id + 1;
3000b2e0: e26cc001 rsb ip, ip, #1
3000b2e4: e08cc001 add ip, ip, r1
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000b2e8: e10f4000 mrs r4, CPSR
3000b2ec: e3841080 orr r1, r4, #128 ; 0x80
3000b2f0: e129f001 msr CPSR_fc, r1
_ISR_Disable( level );
if ( information->maximum >= index ) {
3000b2f4: e1d011b0 ldrh r1, [r0, #16]
3000b2f8: e15c0001 cmp ip, r1
3000b2fc: 8a000008 bhi 3000b324 <_Objects_Get_isr_disable+0x4c>
if ( (the_object = information->local_table[ index ]) != NULL ) {
3000b300: e590101c ldr r1, [r0, #28]
3000b304: e791010c ldr r0, [r1, ip, lsl #2]
3000b308: e3500000 cmp r0, #0
*location = OBJECTS_LOCAL;
3000b30c: 13a01000 movne r1, #0
3000b310: 15821000 strne r1, [r2]
*level_p = level;
3000b314: 15834000 strne r4, [r3]
index = id - information->minimum_id + 1;
_ISR_Disable( level );
if ( information->maximum >= index ) {
if ( (the_object = information->local_table[ index ]) != NULL ) {
3000b318: 0a000006 beq 3000b338 <_Objects_Get_isr_disable+0x60>
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
#endif
}
3000b31c: e8bd0010 pop {r4}
3000b320: e12fff1e bx lr
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000b324: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED
_ISR_Enable( level );
*location = OBJECTS_ERROR;
return NULL;
}
_ISR_Enable( level );
*location = OBJECTS_ERROR;
3000b328: e3a03001 mov r3, #1 <== NOT EXECUTED
3000b32c: e5823000 str r3, [r2] <== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
_Objects_MP_Is_remote( information, id, location, &the_object );
return the_object;
#else
return NULL;
3000b330: e3a00000 mov r0, #0 <== NOT EXECUTED
3000b334: eafffff8 b 3000b31c <_Objects_Get_isr_disable+0x44> <== NOT EXECUTED
3000b338: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED
*location = OBJECTS_LOCAL;
*level_p = level;
return the_object;
}
_ISR_Enable( level );
*location = OBJECTS_ERROR;
3000b33c: e3a03001 mov r3, #1 <== NOT EXECUTED
3000b340: e5823000 str r3, [r2] <== NOT EXECUTED
return NULL;
3000b344: eafffff4 b 3000b31c <_Objects_Get_isr_disable+0x44> <== NOT EXECUTED
3000ce90 <_Objects_Get_name_as_string>:
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
3000ce90: e92d4070 push {r4, r5, r6, lr} <== NOT EXECUTED
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
3000ce94: e2515000 subs r5, r1, #0 <== NOT EXECUTED
char *_Objects_Get_name_as_string(
Objects_Id id,
size_t length,
char *name
)
{
3000ce98: e1a04002 mov r4, r2 <== NOT EXECUTED
3000ce9c: e24dd00c sub sp, sp, #12 <== NOT EXECUTED
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
return NULL;
3000cea0: 01a04005 moveq r4, r5 <== NOT EXECUTED
char lname[5];
Objects_Control *the_object;
Objects_Locations location;
Objects_Id tmpId;
if ( length == 0 )
3000cea4: 1a000002 bne 3000ceb4 <_Objects_Get_name_as_string+0x24> <== NOT EXECUTED
_Thread_Enable_dispatch();
return name;
}
return NULL; /* unreachable path */
}
3000cea8: e1a00004 mov r0, r4 <== NOT EXECUTED
3000ceac: e28dd00c add sp, sp, #12 <== NOT EXECUTED
3000ceb0: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
Objects_Id tmpId;
if ( length == 0 )
return NULL;
if ( name == NULL )
3000ceb4: e3540000 cmp r4, #0 <== NOT EXECUTED
3000ceb8: 0afffffa beq 3000cea8 <_Objects_Get_name_as_string+0x18> <== NOT EXECUTED
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
3000cebc: e3500000 cmp r0, #0 <== NOT EXECUTED
3000cec0: 059f30c4 ldreq r3, [pc, #196] ; 3000cf8c <_Objects_Get_name_as_string+0xfc><== NOT EXECUTED
3000cec4: 11a06000 movne r6, r0 <== NOT EXECUTED
3000cec8: 05933004 ldreq r3, [r3, #4] <== NOT EXECUTED
3000cecc: 05936008 ldreq r6, [r3, #8] <== NOT EXECUTED
information = _Objects_Get_information_id( tmpId );
3000ced0: e1a00006 mov r0, r6 <== NOT EXECUTED
3000ced4: ebffffb3 bl 3000cda8 <_Objects_Get_information_id> <== NOT EXECUTED
if ( !information )
3000ced8: e2503000 subs r3, r0, #0 <== NOT EXECUTED
return NULL;
3000cedc: 01a04003 moveq r4, r3 <== NOT EXECUTED
return NULL;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
information = _Objects_Get_information_id( tmpId );
if ( !information )
3000cee0: 0afffff0 beq 3000cea8 <_Objects_Get_name_as_string+0x18> <== NOT EXECUTED
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
3000cee4: e1a01006 mov r1, r6 <== NOT EXECUTED
3000cee8: e28d2008 add r2, sp, #8 <== NOT EXECUTED
3000ceec: eb000028 bl 3000cf94 <_Objects_Get> <== NOT EXECUTED
switch ( location ) {
3000cef0: e59d3008 ldr r3, [sp, #8] <== NOT EXECUTED
3000cef4: e3530000 cmp r3, #0 <== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
/* not supported */
#endif
case OBJECTS_ERROR:
return NULL;
3000cef8: 13a04000 movne r4, #0 <== NOT EXECUTED
information = _Objects_Get_information_id( tmpId );
if ( !information )
return NULL;
the_object = _Objects_Get( information, tmpId, &location );
switch ( location ) {
3000cefc: 1affffe9 bne 3000cea8 <_Objects_Get_name_as_string+0x18> <== NOT EXECUTED
if ( information->is_string ) {
s = the_object->name.name_p;
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
3000cf00: e590100c ldr r1, [r0, #12] <== NOT EXECUTED
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
3000cf04: e2555001 subs r5, r5, #1 <== NOT EXECUTED
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
3000cf08: e1a02c21 lsr r2, r1, #24 <== NOT EXECUTED
lname[ 1 ] = (u32_name >> 16) & 0xff;
3000cf0c: e1a0c821 lsr ip, r1, #16 <== NOT EXECUTED
lname[ 2 ] = (u32_name >> 8) & 0xff;
3000cf10: e1a00421 lsr r0, r1, #8 <== NOT EXECUTED
} else
#endif
{
uint32_t u32_name = (uint32_t) the_object->name.name_u32;
lname[ 0 ] = (u32_name >> 24) & 0xff;
3000cf14: e5cd2000 strb r2, [sp] <== NOT EXECUTED
lname[ 1 ] = (u32_name >> 16) & 0xff;
3000cf18: e5cdc001 strb ip, [sp, #1] <== NOT EXECUTED
lname[ 2 ] = (u32_name >> 8) & 0xff;
3000cf1c: e5cd0002 strb r0, [sp, #2] <== NOT EXECUTED
lname[ 3 ] = (u32_name >> 0) & 0xff;
3000cf20: e5cd1003 strb r1, [sp, #3] <== NOT EXECUTED
lname[ 4 ] = '\0';
3000cf24: e5cd3004 strb r3, [sp, #4] <== NOT EXECUTED
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
3000cf28: 0a000015 beq 3000cf84 <_Objects_Get_name_as_string+0xf4> <== NOT EXECUTED
3000cf2c: e3520000 cmp r2, #0 <== NOT EXECUTED
3000cf30: 0a000013 beq 3000cf84 <_Objects_Get_name_as_string+0xf4> <== NOT EXECUTED
3000cf34: e59fc054 ldr ip, [pc, #84] ; 3000cf90 <_Objects_Get_name_as_string+0x100><== NOT EXECUTED
3000cf38: e1a01004 mov r1, r4 <== NOT EXECUTED
3000cf3c: ea000002 b 3000cf4c <_Objects_Get_name_as_string+0xbc> <== NOT EXECUTED
3000cf40: e7dd2003 ldrb r2, [sp, r3] <== NOT EXECUTED
3000cf44: e3520000 cmp r2, #0 <== NOT EXECUTED
3000cf48: 0a000009 beq 3000cf74 <_Objects_Get_name_as_string+0xe4> <== NOT EXECUTED
*d = (isprint((unsigned char)*s)) ? *s : '*';
3000cf4c: e59c0000 ldr r0, [ip] <== NOT EXECUTED
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
3000cf50: e2833001 add r3, r3, #1 <== NOT EXECUTED
*d = (isprint((unsigned char)*s)) ? *s : '*';
3000cf54: e0800002 add r0, r0, r2 <== NOT EXECUTED
3000cf58: e5d00001 ldrb r0, [r0, #1] <== NOT EXECUTED
3000cf5c: e3100097 tst r0, #151 ; 0x97 <== NOT EXECUTED
3000cf60: 03a0202a moveq r2, #42 ; 0x2a <== NOT EXECUTED
3000cf64: e4c12001 strb r2, [r1], #1 <== NOT EXECUTED
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
3000cf68: e1530005 cmp r3, r5 <== NOT EXECUTED
3000cf6c: e1a00001 mov r0, r1 <== NOT EXECUTED
3000cf70: 3afffff2 bcc 3000cf40 <_Objects_Get_name_as_string+0xb0> <== NOT EXECUTED
*d = (isprint((unsigned char)*s)) ? *s : '*';
}
}
*d = '\0';
3000cf74: e3a03000 mov r3, #0 <== NOT EXECUTED
3000cf78: e5c03000 strb r3, [r0] <== NOT EXECUTED
_Thread_Enable_dispatch();
3000cf7c: eb000331 bl 3000dc48 <_Thread_Enable_dispatch> <== NOT EXECUTED
return name;
3000cf80: eaffffc8 b 3000cea8 <_Objects_Get_name_as_string+0x18> <== NOT EXECUTED
s = lname;
}
d = name;
if ( s ) {
for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) {
3000cf84: e1a00004 mov r0, r4 <== NOT EXECUTED
3000cf88: eafffff9 b 3000cf74 <_Objects_Get_name_as_string+0xe4> <== NOT EXECUTED
3000b50c <_Objects_Get_next>:
Objects_Information *information,
Objects_Id id,
Objects_Locations *location_p,
Objects_Id *next_id_p
)
{
3000b50c: e92d41f0 push {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
Objects_Control *object;
Objects_Id next_id;
if ( !information )
3000b510: e2504000 subs r4, r0, #0 <== NOT EXECUTED
Objects_Information *information,
Objects_Id id,
Objects_Locations *location_p,
Objects_Id *next_id_p
)
{
3000b514: e1a05002 mov r5, r2 <== NOT EXECUTED
3000b518: e1a08003 mov r8, r3 <== NOT EXECUTED
Objects_Control *object;
Objects_Id next_id;
if ( !information )
return NULL;
3000b51c: 01a00004 moveq r0, r4 <== NOT EXECUTED
)
{
Objects_Control *object;
Objects_Id next_id;
if ( !information )
3000b520: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
return NULL;
if ( !location_p )
3000b524: e3520000 cmp r2, #0 <== NOT EXECUTED
return NULL;
3000b528: 01a00002 moveq r0, r2 <== NOT EXECUTED
Objects_Id next_id;
if ( !information )
return NULL;
if ( !location_p )
3000b52c: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
return NULL;
if ( !next_id_p )
3000b530: e3530000 cmp r3, #0 <== NOT EXECUTED
3000b534: 0a000016 beq 3000b594 <_Objects_Get_next+0x88> <== NOT EXECUTED
return NULL;
if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX)
3000b538: e1b03801 lsls r3, r1, #16 <== NOT EXECUTED
next_id = information->minimum_id;
3000b53c: 05946008 ldreq r6, [r4, #8] <== NOT EXECUTED
else
next_id = id;
3000b540: 11a06001 movne r6, r1 <== NOT EXECUTED
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
3000b544: e1d4c1b0 ldrh ip, [r4, #16] <== NOT EXECUTED
3000b548: e1a07806 lsl r7, r6, #16 <== NOT EXECUTED
3000b54c: e15c0827 cmp ip, r7, lsr #16 <== NOT EXECUTED
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
3000b550: e1a01006 mov r1, r6 <== NOT EXECUTED
3000b554: e1a00004 mov r0, r4 <== NOT EXECUTED
3000b558: e1a02005 mov r2, r5 <== NOT EXECUTED
else
next_id = id;
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
3000b55c: 3a000006 bcc 3000b57c <_Objects_Get_next+0x70> <== NOT EXECUTED
*location_p = OBJECTS_ERROR;
goto final;
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
3000b560: eb00000d bl 3000b59c <_Objects_Get> <== NOT EXECUTED
next_id++;
} while (*location_p != OBJECTS_LOCAL);
3000b564: e5953000 ldr r3, [r5] <== NOT EXECUTED
}
/* try to grab one */
object = _Objects_Get(information, next_id, location_p);
next_id++;
3000b568: e2866001 add r6, r6, #1 <== NOT EXECUTED
} while (*location_p != OBJECTS_LOCAL);
3000b56c: e3530000 cmp r3, #0 <== NOT EXECUTED
3000b570: 1afffff3 bne 3000b544 <_Objects_Get_next+0x38> <== NOT EXECUTED
*next_id_p = next_id;
3000b574: e5886000 str r6, [r8] <== NOT EXECUTED
return object;
3000b578: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
do {
/* walked off end of list? */
if (_Objects_Get_index(next_id) > information->maximum)
{
*location_p = OBJECTS_ERROR;
3000b57c: e3a03001 mov r3, #1 <== NOT EXECUTED
3000b580: e5853000 str r3, [r5] <== NOT EXECUTED
*next_id_p = next_id;
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
3000b584: e3e03000 mvn r3, #0 <== NOT EXECUTED
return 0;
3000b588: e3a00000 mov r0, #0 <== NOT EXECUTED
*next_id_p = next_id;
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
3000b58c: e5883000 str r3, [r8] <== NOT EXECUTED
return 0;
3000b590: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
if ( !location_p )
return NULL;
if ( !next_id_p )
return NULL;
3000b594: e1a00003 mov r0, r3 <== NOT EXECUTED
return object;
final:
*next_id_p = OBJECTS_ID_FINAL;
return 0;
}
3000b598: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
3001cdec <_Objects_Get_no_protection>:
/*
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
3001cdec: e590c008 ldr ip, [r0, #8]
if ( information->maximum >= index ) {
3001cdf0: e1d031b0 ldrh r3, [r0, #16]
/*
* You can't just extract the index portion or you can get tricked
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
3001cdf4: e26cc001 rsb ip, ip, #1
3001cdf8: e08c1001 add r1, ip, r1
if ( information->maximum >= index ) {
3001cdfc: e1510003 cmp r1, r3
3001ce00: 8a000005 bhi 3001ce1c <_Objects_Get_no_protection+0x30>
if ( (the_object = information->local_table[ index ]) != NULL ) {
3001ce04: e590301c ldr r3, [r0, #28]
3001ce08: e7930101 ldr r0, [r3, r1, lsl #2]
3001ce0c: e3500000 cmp r0, #0
*location = OBJECTS_LOCAL;
3001ce10: 13a03000 movne r3, #0
3001ce14: 15823000 strne r3, [r2]
* by a value between 1 and maximum.
*/
index = id - information->minimum_id + 1;
if ( information->maximum >= index ) {
if ( (the_object = information->local_table[ index ]) != NULL ) {
3001ce18: 112fff1e bxne lr
/*
* This isn't supported or required yet for Global objects so
* if it isn't local, we don't find it.
*/
*location = OBJECTS_ERROR;
3001ce1c: e3a03001 mov r3, #1 <== NOT EXECUTED
3001ce20: e5823000 str r3, [r2] <== NOT EXECUTED
return NULL;
3001ce24: e3a00000 mov r0, #0 <== NOT EXECUTED
}
3001ce28: e12fff1e bx lr <== NOT EXECUTED
3000ca5c <_Objects_Id_to_name>:
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
3000ca5c: e3500000 cmp r0, #0 <== NOT EXECUTED
3000ca60: 059f3078 ldreq r3, [pc, #120] ; 3000cae0 <_Objects_Id_to_name+0x84><== NOT EXECUTED
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
3000ca64: e92d4010 push {r4, lr} <== NOT EXECUTED
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
3000ca68: 05933004 ldreq r3, [r3, #4] <== NOT EXECUTED
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
3000ca6c: e1a04001 mov r4, r1 <== NOT EXECUTED
/*
* Caller is trusted for name != NULL.
*/
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
3000ca70: 05931008 ldreq r1, [r3, #8] <== NOT EXECUTED
3000ca74: 11a01000 movne r1, r0 <== NOT EXECUTED
3000ca78: e1a03c21 lsr r3, r1, #24 <== NOT EXECUTED
3000ca7c: e2033007 and r3, r3, #7 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
3000ca80: e2432001 sub r2, r3, #1 <== NOT EXECUTED
3000ca84: e3520002 cmp r2, #2 <== NOT EXECUTED
*/
Objects_Name_or_id_lookup_errors _Objects_Id_to_name (
Objects_Id id,
Objects_Name *name
)
{
3000ca88: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3000ca8c: 8a000010 bhi 3000cad4 <_Objects_Id_to_name+0x78> <== NOT EXECUTED
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
3000ca90: e59f204c ldr r2, [pc, #76] ; 3000cae4 <_Objects_Id_to_name+0x88><== NOT EXECUTED
3000ca94: e7923103 ldr r3, [r2, r3, lsl #2] <== NOT EXECUTED
3000ca98: e3530000 cmp r3, #0 <== NOT EXECUTED
3000ca9c: 0a00000c beq 3000cad4 <_Objects_Id_to_name+0x78> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
3000caa0: e1a02da1 lsr r2, r1, #27 <== NOT EXECUTED
return OBJECTS_INVALID_ID;
the_class = _Objects_Get_class( tmpId );
information = _Objects_Information_table[ the_api ][ the_class ];
3000caa4: e7930102 ldr r0, [r3, r2, lsl #2] <== NOT EXECUTED
if ( !information )
3000caa8: e3500000 cmp r0, #0 <== NOT EXECUTED
3000caac: 0a000008 beq 3000cad4 <_Objects_Id_to_name+0x78> <== NOT EXECUTED
#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES)
if ( information->is_string )
return OBJECTS_INVALID_ID;
#endif
the_object = _Objects_Get( information, tmpId, &ignored_location );
3000cab0: e1a0200d mov r2, sp <== NOT EXECUTED
3000cab4: ebffffc8 bl 3000c9dc <_Objects_Get> <== NOT EXECUTED
if ( !the_object )
3000cab8: e3500000 cmp r0, #0 <== NOT EXECUTED
3000cabc: 0a000004 beq 3000cad4 <_Objects_Id_to_name+0x78> <== NOT EXECUTED
return OBJECTS_INVALID_ID;
*name = the_object->name;
3000cac0: e590300c ldr r3, [r0, #12] <== NOT EXECUTED
3000cac4: e5843000 str r3, [r4] <== NOT EXECUTED
_Thread_Enable_dispatch();
3000cac8: eb000335 bl 3000d7a4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
3000cacc: e3a00000 mov r0, #0 <== NOT EXECUTED
3000cad0: ea000000 b 3000cad8 <_Objects_Id_to_name+0x7c> <== NOT EXECUTED
the_api = _Objects_Get_API( tmpId );
if ( !_Objects_Is_api_valid( the_api ) )
return OBJECTS_INVALID_ID;
if ( !_Objects_Information_table[ the_api ] )
return OBJECTS_INVALID_ID;
3000cad4: e3a00003 mov r0, #3 <== NOT EXECUTED
return OBJECTS_INVALID_ID;
*name = the_object->name;
_Thread_Enable_dispatch();
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
}
3000cad8: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000cadc: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3000b498 <_Objects_Name_to_id_u32>:
Objects_Name name_for_mp;
#endif
/* ASSERT: information->is_string == false */
if ( !id )
3000b498: e3530000 cmp r3, #0
Objects_Information *information,
uint32_t name,
uint32_t node,
Objects_Id *id
)
{
3000b49c: e92d0030 push {r4, r5}
#endif
/* ASSERT: information->is_string == false */
if ( !id )
return OBJECTS_INVALID_ADDRESS;
3000b4a0: 03a00002 moveq r0, #2
Objects_Name name_for_mp;
#endif
/* ASSERT: information->is_string == false */
if ( !id )
3000b4a4: 0a000005 beq 3000b4c0 <_Objects_Name_to_id_u32+0x28>
return OBJECTS_INVALID_ADDRESS;
if ( name == 0 )
3000b4a8: e3510000 cmp r1, #0
3000b4ac: 0a000002 beq 3000b4bc <_Objects_Name_to_id_u32+0x24>
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
3000b4b0: e1d051b0 ldrh r5, [r0, #16]
3000b4b4: e3550000 cmp r5, #0
3000b4b8: 1a000002 bne 3000b4c8 <_Objects_Name_to_id_u32+0x30>
return OBJECTS_INVALID_NAME;
name_for_mp.name_u32 = name;
return _Objects_MP_Global_name_search( information, name_for_mp, node, id );
#else
return OBJECTS_INVALID_NAME;
3000b4bc: e3a00001 mov r0, #1
#endif
}
3000b4c0: e8bd0030 pop {r4, r5}
3000b4c4: e12fff1e bx lr
if ( name == 0 )
return OBJECTS_INVALID_NAME;
search_local_node = false;
if ( information->maximum != 0 &&
3000b4c8: e3720106 cmn r2, #-2147483647 ; 0x80000001
3000b4cc: 13520000 cmpne r2, #0
3000b4d0: 1a00000b bne 3000b504 <_Objects_Name_to_id_u32+0x6c>
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
3000b4d4: e590c01c ldr ip, [r0, #28]
3000b4d8: e3a02001 mov r2, #1
the_object = information->local_table[ index ];
3000b4dc: e5bc0004 ldr r0, [ip, #4]!
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
3000b4e0: e2822001 add r2, r2, #1
the_object = information->local_table[ index ];
if ( !the_object )
3000b4e4: e3500000 cmp r0, #0
3000b4e8: 0a000002 beq 3000b4f8 <_Objects_Name_to_id_u32+0x60>
continue;
if ( name == the_object->name.name_u32 ) {
3000b4ec: e590400c ldr r4, [r0, #12]
3000b4f0: e1540001 cmp r4, r1
3000b4f4: 0a000005 beq 3000b510 <_Objects_Name_to_id_u32+0x78>
_Objects_Is_local_node( node )
))
search_local_node = true;
if ( search_local_node ) {
for ( index = 1; index <= information->maximum; index++ ) {
3000b4f8: e1550002 cmp r5, r2
3000b4fc: 2afffff6 bcs 3000b4dc <_Objects_Name_to_id_u32+0x44>
3000b500: eaffffed b 3000b4bc <_Objects_Name_to_id_u32+0x24> <== NOT EXECUTED
search_local_node = false;
if ( information->maximum != 0 &&
(node == OBJECTS_SEARCH_ALL_NODES ||
node == OBJECTS_SEARCH_LOCAL_NODE ||
3000b504: e3520001 cmp r2, #1 <== NOT EXECUTED
3000b508: 1affffeb bne 3000b4bc <_Objects_Name_to_id_u32+0x24> <== NOT EXECUTED
3000b50c: eafffff0 b 3000b4d4 <_Objects_Name_to_id_u32+0x3c> <== NOT EXECUTED
the_object = information->local_table[ index ];
if ( !the_object )
continue;
if ( name == the_object->name.name_u32 ) {
*id = the_object->id;
3000b510: e5902008 ldr r2, [r0, #8]
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
3000b514: e3a00000 mov r0, #0
the_object = information->local_table[ index ];
if ( !the_object )
continue;
if ( name == the_object->name.name_u32 ) {
*id = the_object->id;
3000b518: e5832000 str r2, [r3]
return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL;
3000b51c: eaffffe7 b 3000b4c0 <_Objects_Name_to_id_u32+0x28>
3000da18 <_Objects_Set_name>:
{
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
3000da18: e1d033b8 ldrh r3, [r0, #56] ; 0x38 <== NOT EXECUTED
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
3000da1c: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
3000da20: e1a00002 mov r0, r2 <== NOT EXECUTED
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
3000da24: e1a05001 mov r5, r1 <== NOT EXECUTED
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
3000da28: e1a01003 mov r1, r3 <== NOT EXECUTED
bool _Objects_Set_name(
Objects_Information *information,
Objects_Control *the_object,
const char *name
)
{
3000da2c: e1a04002 mov r4, r2 <== NOT EXECUTED
size_t length;
const char *s;
s = name;
length = strnlen( name, information->name_length );
3000da30: eb001d58 bl 30014f98 <strnlen> <== NOT EXECUTED
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
3000da34: e5d42000 ldrb r2, [r4] <== NOT EXECUTED
3000da38: e3500001 cmp r0, #1 <== NOT EXECUTED
3000da3c: e1a02c02 lsl r2, r2, #24 <== NOT EXECUTED
3000da40: 9a00000c bls 3000da78 <_Objects_Set_name+0x60> <== NOT EXECUTED
3000da44: e5d43001 ldrb r3, [r4, #1] <== NOT EXECUTED
3000da48: e3500002 cmp r0, #2 <== NOT EXECUTED
3000da4c: e1822803 orr r2, r2, r3, lsl #16 <== NOT EXECUTED
3000da50: 0a000009 beq 3000da7c <_Objects_Set_name+0x64> <== NOT EXECUTED
3000da54: e5d43002 ldrb r3, [r4, #2] <== NOT EXECUTED
3000da58: e3500003 cmp r0, #3 <== NOT EXECUTED
3000da5c: e1822403 orr r2, r2, r3, lsl #8 <== NOT EXECUTED
3000da60: 15d43003 ldrbne r3, [r4, #3] <== NOT EXECUTED
3000da64: 03a03020 moveq r3, #32 <== NOT EXECUTED
3000da68: e1823003 orr r3, r2, r3 <== NOT EXECUTED
3000da6c: e585300c str r3, [r5, #12] <== NOT EXECUTED
);
}
return true;
}
3000da70: e3a00001 mov r0, #1 <== NOT EXECUTED
3000da74: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
d[length] = '\0';
the_object->name.name_p = d;
} else
#endif
{
the_object->name.name_u32 = _Objects_Build_name(
3000da78: e3822602 orr r2, r2, #2097152 ; 0x200000 <== NOT EXECUTED
3000da7c: e3822a02 orr r2, r2, #8192 ; 0x2000 <== NOT EXECUTED
3000da80: e3a03020 mov r3, #32 <== NOT EXECUTED
3000da84: e1823003 orr r3, r2, r3 <== NOT EXECUTED
3000da88: e585300c str r3, [r5, #12] <== NOT EXECUTED
);
}
return true;
}
3000da8c: e3a00001 mov r0, #1 <== NOT EXECUTED
3000da90: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
3000b520 <_Objects_Shrink_information>:
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
3000b520: e92d40f0 push {r4, r5, r6, r7, lr}
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
3000b524: e1d040b8 ldrh r4, [r0, #8]
block_count = (information->maximum - index_base) /
3000b528: e1d051b4 ldrh r5, [r0, #20]
*/
void _Objects_Shrink_information(
Objects_Information *information
)
{
3000b52c: e1a06000 mov r6, r0
/*
* Search the list to find block or chunk with all objects inactive.
*/
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
3000b530: e1d001b0 ldrh r0, [r0, #16]
3000b534: e1a01005 mov r1, r5
3000b538: e0640000 rsb r0, r4, r0
3000b53c: eb0024bc bl 30014834 <__aeabi_uidiv>
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
3000b540: e3500000 cmp r0, #0
3000b544: 08bd80f0 popeq {r4, r5, r6, r7, pc}
if ( information->inactive_per_block[ block ] ==
3000b548: e5962030 ldr r2, [r6, #48] ; 0x30
3000b54c: e5923000 ldr r3, [r2]
3000b550: e1550003 cmp r5, r3
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
3000b554: 13a03000 movne r3, #0
if ( information->inactive_per_block[ block ] ==
3000b558: 1a000005 bne 3000b574 <_Objects_Shrink_information+0x54>
3000b55c: ea000008 b 3000b584 <_Objects_Shrink_information+0x64> <== NOT EXECUTED
3000b560: e5b21004 ldr r1, [r2, #4]!
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
3000b564: e0844005 add r4, r4, r5
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
3000b568: e1550001 cmp r5, r1
information->inactive -= information->allocation_size;
return;
}
index_base += information->allocation_size;
3000b56c: e1a07103 lsl r7, r3, #2
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
if ( information->inactive_per_block[ block ] ==
3000b570: 0a000004 beq 3000b588 <_Objects_Shrink_information+0x68>
index_base = _Objects_Get_index( information->minimum_id );
block_count = (information->maximum - index_base) /
information->allocation_size;
for ( block = 0; block < block_count; block++ ) {
3000b574: e2833001 add r3, r3, #1
3000b578: e1500003 cmp r0, r3
3000b57c: 8afffff7 bhi 3000b560 <_Objects_Shrink_information+0x40>
3000b580: e8bd80f0 pop {r4, r5, r6, r7, pc}
if ( information->inactive_per_block[ block ] ==
3000b584: e3a07000 mov r7, #0 <== NOT EXECUTED
information->allocation_size ) {
/*
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
3000b588: e5960020 ldr r0, [r6, #32]
3000b58c: ea000002 b 3000b59c <_Objects_Shrink_information+0x7c>
if ((index >= index_base) &&
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
}
}
while ( the_object );
3000b590: e3550000 cmp r5, #0
3000b594: 0a00000b beq 3000b5c8 <_Objects_Shrink_information+0xa8>
index = _Objects_Get_index( the_object->id );
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
3000b598: e1a00005 mov r0, r5
* Assume the Inactive chain is never empty at this point
*/
the_object = (Objects_Control *) _Chain_First( &information->Inactive );
do {
index = _Objects_Get_index( the_object->id );
3000b59c: e1d030b8 ldrh r3, [r0, #8]
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
3000b5a0: e5905000 ldr r5, [r0]
if ((index >= index_base) &&
3000b5a4: e1530004 cmp r3, r4
3000b5a8: 3afffff8 bcc 3000b590 <_Objects_Shrink_information+0x70>
(index < (index_base + information->allocation_size))) {
3000b5ac: e1d621b4 ldrh r2, [r6, #20]
3000b5b0: e0842002 add r2, r4, r2
/*
* Get the next node before the node is extracted
*/
extract_me = the_object;
the_object = (Objects_Control *) the_object->Node.next;
if ((index >= index_base) &&
3000b5b4: e1530002 cmp r3, r2
3000b5b8: 2afffff4 bcs 3000b590 <_Objects_Shrink_information+0x70>
(index < (index_base + information->allocation_size))) {
_Chain_Extract( &extract_me->Node );
3000b5bc: ebfffbcf bl 3000a500 <_Chain_Extract>
}
}
while ( the_object );
3000b5c0: e3550000 cmp r5, #0
3000b5c4: 1afffff3 bne 3000b598 <_Objects_Shrink_information+0x78>
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
3000b5c8: e5963034 ldr r3, [r6, #52] ; 0x34
3000b5cc: e7930007 ldr r0, [r3, r7]
3000b5d0: eb000706 bl 3000d1f0 <_Workspace_Free>
information->object_blocks[ block ] = NULL;
information->inactive_per_block[ block ] = 0;
information->inactive -= information->allocation_size;
3000b5d4: e1d602bc ldrh r0, [r6, #44] ; 0x2c
3000b5d8: e1d631b4 ldrh r3, [r6, #20]
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
3000b5dc: e5961034 ldr r1, [r6, #52] ; 0x34
information->inactive_per_block[ block ] = 0;
3000b5e0: e5962030 ldr r2, [r6, #48] ; 0x30
information->inactive -= information->allocation_size;
3000b5e4: e0633000 rsb r3, r3, r0
/*
* Free the memory and reset the structures in the object' information
*/
_Workspace_Free( information->object_blocks[ block ] );
information->object_blocks[ block ] = NULL;
3000b5e8: e7815007 str r5, [r1, r7]
information->inactive_per_block[ block ] = 0;
3000b5ec: e7825007 str r5, [r2, r7]
information->inactive -= information->allocation_size;
3000b5f0: e1c632bc strh r3, [r6, #44] ; 0x2c
return;
3000b5f4: e8bd80f0 pop {r4, r5, r6, r7, pc}
3000b918 <_Protected_heap_Extend>:
bool _Protected_heap_Extend(
Heap_Control *the_heap,
void *starting_address,
uintptr_t size
)
{
3000b918: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED
bool extend_ok;
uintptr_t amount_extended;
_RTEMS_Lock_allocator();
3000b91c: e59f4040 ldr r4, [pc, #64] ; 3000b964 <_Protected_heap_Extend+0x4c><== NOT EXECUTED
bool _Protected_heap_Extend(
Heap_Control *the_heap,
void *starting_address,
uintptr_t size
)
{
3000b920: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3000b924: e1a05000 mov r5, r0 <== NOT EXECUTED
3000b928: e1a07001 mov r7, r1 <== NOT EXECUTED
3000b92c: e1a06002 mov r6, r2 <== NOT EXECUTED
bool extend_ok;
uintptr_t amount_extended;
_RTEMS_Lock_allocator();
3000b930: e5940000 ldr r0, [r4] <== NOT EXECUTED
3000b934: ebfffb94 bl 3000a78c <_API_Mutex_Lock> <== NOT EXECUTED
extend_ok = _Heap_Extend(the_heap, starting_address, size, &amount_extended);
3000b938: e1a01007 mov r1, r7 <== NOT EXECUTED
3000b93c: e1a02006 mov r2, r6 <== NOT EXECUTED
3000b940: e1a0300d mov r3, sp <== NOT EXECUTED
3000b944: e1a00005 mov r0, r5 <== NOT EXECUTED
3000b948: eb000fe9 bl 3000f8f4 <_Heap_Extend> <== NOT EXECUTED
3000b94c: e1a05000 mov r5, r0 <== NOT EXECUTED
_RTEMS_Unlock_allocator();
3000b950: e5940000 ldr r0, [r4] <== NOT EXECUTED
3000b954: ebfffba8 bl 3000a7fc <_API_Mutex_Unlock> <== NOT EXECUTED
return extend_ok;
}
3000b958: e1a00005 mov r0, r5 <== NOT EXECUTED
3000b95c: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000b960: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000bda8 <_Protected_heap_Get_information>:
bool _Protected_heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
3000bda8: e92d4070 push {r4, r5, r6, lr}
if ( !the_heap )
3000bdac: e2505000 subs r5, r0, #0
bool _Protected_heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
3000bdb0: e1a06001 mov r6, r1
if ( !the_heap )
return false;
3000bdb4: 01a00005 moveq r0, r5
bool _Protected_heap_Get_information(
Heap_Control *the_heap,
Heap_Information_block *the_info
)
{
if ( !the_heap )
3000bdb8: 08bd8070 popeq {r4, r5, r6, pc}
return false;
if ( !the_info )
3000bdbc: e3510000 cmp r1, #0
3000bdc0: 0a000009 beq 3000bdec <_Protected_heap_Get_information+0x44>
return false;
_RTEMS_Lock_allocator();
3000bdc4: e59f4028 ldr r4, [pc, #40] ; 3000bdf4 <_Protected_heap_Get_information+0x4c>
3000bdc8: e5940000 ldr r0, [r4]
3000bdcc: ebfffb83 bl 3000abe0 <_API_Mutex_Lock>
_Heap_Get_information( the_heap, the_info );
3000bdd0: e1a00005 mov r0, r5
3000bdd4: e1a01006 mov r1, r6
3000bdd8: eb00110c bl 30010210 <_Heap_Get_information>
_RTEMS_Unlock_allocator();
3000bddc: e5940000 ldr r0, [r4]
3000bde0: ebfffb9a bl 3000ac50 <_API_Mutex_Unlock>
return true;
3000bde4: e3a00001 mov r0, #1
3000bde8: e8bd8070 pop {r4, r5, r6, pc}
{
if ( !the_heap )
return false;
if ( !the_info )
return false;
3000bdec: e1a00001 mov r0, r1 <== NOT EXECUTED
_RTEMS_Lock_allocator();
_Heap_Get_information( the_heap, the_info );
_RTEMS_Unlock_allocator();
return true;
}
3000bdf0: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
30010d54 <_Protected_heap_Walk>:
* then it is forbidden to lock a mutex. But since we are inside
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
30010d54: e59f3054 ldr r3, [pc, #84] ; 30010db0 <_Protected_heap_Walk+0x5c><== NOT EXECUTED
bool _Protected_heap_Walk(
Heap_Control *the_heap,
int source,
bool do_dump
)
{
30010d58: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED
* then it is forbidden to lock a mutex. But since we are inside
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
30010d5c: e5933000 ldr r3, [r3] <== NOT EXECUTED
bool _Protected_heap_Walk(
Heap_Control *the_heap,
int source,
bool do_dump
)
{
30010d60: e1a07000 mov r7, r0 <== NOT EXECUTED
* then it is forbidden to lock a mutex. But since we are inside
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
30010d64: e3530000 cmp r3, #0 <== NOT EXECUTED
bool _Protected_heap_Walk(
Heap_Control *the_heap,
int source,
bool do_dump
)
{
30010d68: e1a06001 mov r6, r1 <== NOT EXECUTED
30010d6c: e20250ff and r5, r2, #255 ; 0xff <== NOT EXECUTED
* then it is forbidden to lock a mutex. But since we are inside
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
30010d70: 0a000002 beq 30010d80 <_Protected_heap_Walk+0x2c> <== NOT EXECUTED
_RTEMS_Lock_allocator();
status = _Heap_Walk( the_heap, source, do_dump );
_RTEMS_Unlock_allocator();
} else {
status = _Heap_Walk( the_heap, source, do_dump );
30010d74: e1a02005 mov r2, r5 <== NOT EXECUTED
}
return status;
}
30010d78: e8bd40f0 pop {r4, r5, r6, r7, lr} <== NOT EXECUTED
if ( !_Thread_Dispatch_disable_level ) {
_RTEMS_Lock_allocator();
status = _Heap_Walk( the_heap, source, do_dump );
_RTEMS_Unlock_allocator();
} else {
status = _Heap_Walk( the_heap, source, do_dump );
30010d7c: eafffbe6 b 3000fd1c <_Heap_Walk> <== NOT EXECUTED
* a critical section, it should be safe to walk it unlocked.
*
* NOTE: Dispatching is also disabled during initialization.
*/
if ( !_Thread_Dispatch_disable_level ) {
_RTEMS_Lock_allocator();
30010d80: e59f402c ldr r4, [pc, #44] ; 30010db4 <_Protected_heap_Walk+0x60><== NOT EXECUTED
30010d84: e5940000 ldr r0, [r4] <== NOT EXECUTED
30010d88: ebfff7dd bl 3000ed04 <_API_Mutex_Lock> <== NOT EXECUTED
status = _Heap_Walk( the_heap, source, do_dump );
30010d8c: e1a02005 mov r2, r5 <== NOT EXECUTED
30010d90: e1a01006 mov r1, r6 <== NOT EXECUTED
30010d94: e1a00007 mov r0, r7 <== NOT EXECUTED
30010d98: ebfffbdf bl 3000fd1c <_Heap_Walk> <== NOT EXECUTED
30010d9c: e1a05000 mov r5, r0 <== NOT EXECUTED
_RTEMS_Unlock_allocator();
30010da0: e5940000 ldr r0, [r4] <== NOT EXECUTED
30010da4: ebfff7f2 bl 3000ed74 <_API_Mutex_Unlock> <== NOT EXECUTED
} else {
status = _Heap_Walk( the_heap, source, do_dump );
}
return status;
}
30010da8: e1a00005 mov r0, r5 <== NOT EXECUTED
30010dac: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000f060 <_RTEMS_Tasks_Invoke_task_variable_dtor>:
{
void (*dtor)(void *);
void *value;
dtor = tvp->dtor;
if (_Thread_Is_executing(the_thread)) {
3000f060: e59f303c ldr r3, [pc, #60] ; 3000f0a4 <_RTEMS_Tasks_Invoke_task_variable_dtor+0x44><== NOT EXECUTED
void _RTEMS_Tasks_Invoke_task_variable_dtor(
Thread_Control *the_thread,
rtems_task_variable_t *tvp
)
{
3000f064: e92d4010 push {r4, lr} <== NOT EXECUTED
void (*dtor)(void *);
void *value;
dtor = tvp->dtor;
if (_Thread_Is_executing(the_thread)) {
3000f068: e5932004 ldr r2, [r3, #4] <== NOT EXECUTED
void _RTEMS_Tasks_Invoke_task_variable_dtor(
Thread_Control *the_thread,
rtems_task_variable_t *tvp
)
{
3000f06c: e1a04001 mov r4, r1 <== NOT EXECUTED
void (*dtor)(void *);
void *value;
dtor = tvp->dtor;
if (_Thread_Is_executing(the_thread)) {
3000f070: e1520000 cmp r2, r0 <== NOT EXECUTED
value = *tvp->ptr;
3000f074: 05912004 ldreq r2, [r1, #4] <== NOT EXECUTED
)
{
void (*dtor)(void *);
void *value;
dtor = tvp->dtor;
3000f078: e5913010 ldr r3, [r1, #16] <== NOT EXECUTED
if (_Thread_Is_executing(the_thread)) {
value = *tvp->ptr;
*tvp->ptr = tvp->gval;
3000f07c: 05911008 ldreq r1, [r1, #8] <== NOT EXECUTED
void (*dtor)(void *);
void *value;
dtor = tvp->dtor;
if (_Thread_Is_executing(the_thread)) {
value = *tvp->ptr;
3000f080: 05920000 ldreq r0, [r2] <== NOT EXECUTED
*tvp->ptr = tvp->gval;
} else {
value = tvp->tval;
3000f084: 1594000c ldrne r0, [r4, #12] <== NOT EXECUTED
void *value;
dtor = tvp->dtor;
if (_Thread_Is_executing(the_thread)) {
value = *tvp->ptr;
*tvp->ptr = tvp->gval;
3000f088: 05821000 streq r1, [r2] <== NOT EXECUTED
} else {
value = tvp->tval;
}
if ( dtor )
3000f08c: e3530000 cmp r3, #0 <== NOT EXECUTED
(*dtor)(value);
3000f090: 11a0e00f movne lr, pc <== NOT EXECUTED
3000f094: 112fff13 bxne r3 <== NOT EXECUTED
_Workspace_Free(tvp);
3000f098: e1a00004 mov r0, r4 <== NOT EXECUTED
}
3000f09c: e8bd4010 pop {r4, lr} <== NOT EXECUTED
}
if ( dtor )
(*dtor)(value);
_Workspace_Free(tvp);
3000f0a0: eafff852 b 3000d1f0 <_Workspace_Free> <== NOT EXECUTED
3000ef2c <_RTEMS_tasks_Delete_extension>:
void _RTEMS_tasks_Delete_extension(
Thread_Control *executing,
Thread_Control *deleted
)
{
3000ef2c: e92d4030 push {r4, r5, lr}
3000ef30: e1a05001 mov r5, r1
/*
* Free per task variable memory
*/
tvp = deleted->task_variables;
3000ef34: e5911100 ldr r1, [r1, #256] ; 0x100
deleted->task_variables = NULL;
3000ef38: e3a03000 mov r3, #0
while (tvp) {
3000ef3c: e3510000 cmp r1, #0
/*
* Free per task variable memory
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
3000ef40: e5853100 str r3, [r5, #256] ; 0x100
while (tvp) {
3000ef44: 1a000001 bne 3000ef50 <_RTEMS_tasks_Delete_extension+0x24>
3000ef48: ea000005 b 3000ef64 <_RTEMS_tasks_Delete_extension+0x38>
next = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
tvp = next;
3000ef4c: e1a01004 mov r1, r4 <== NOT EXECUTED
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
next = (rtems_task_variable_t *)tvp->next;
3000ef50: e5914000 ldr r4, [r1] <== NOT EXECUTED
_RTEMS_Tasks_Invoke_task_variable_dtor( deleted, tvp );
3000ef54: e1a00005 mov r0, r5 <== NOT EXECUTED
3000ef58: eb000040 bl 3000f060 <_RTEMS_Tasks_Invoke_task_variable_dtor><== NOT EXECUTED
* Free per task variable memory
*/
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
3000ef5c: e3540000 cmp r4, #0 <== NOT EXECUTED
3000ef60: 1afffff9 bne 3000ef4c <_RTEMS_tasks_Delete_extension+0x20> <== NOT EXECUTED
/*
* Free API specific memory
*/
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
3000ef64: e59500f4 ldr r0, [r5, #244] ; 0xf4
3000ef68: ebfff8a0 bl 3000d1f0 <_Workspace_Free>
deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
3000ef6c: e3a03000 mov r3, #0
3000ef70: e58530f4 str r3, [r5, #244] ; 0xf4
}
3000ef74: e8bd8030 pop {r4, r5, pc}
3000ee20 <_RTEMS_tasks_Switch_extension>:
/*
* Per Task Variables
*/
tvp = executing->task_variables;
3000ee20: e5903100 ldr r3, [r0, #256] ; 0x100
while (tvp) {
3000ee24: e3530000 cmp r3, #0
3000ee28: 0a000007 beq 3000ee4c <_RTEMS_tasks_Switch_extension+0x2c>
tvp->tval = *tvp->ptr;
3000ee2c: e5932004 ldr r2, [r3, #4] <== NOT EXECUTED
*tvp->ptr = tvp->gval;
3000ee30: e5930008 ldr r0, [r3, #8] <== NOT EXECUTED
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
tvp->tval = *tvp->ptr;
3000ee34: e592c000 ldr ip, [r2] <== NOT EXECUTED
3000ee38: e583c00c str ip, [r3, #12] <== NOT EXECUTED
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
3000ee3c: e5933000 ldr r3, [r3] <== NOT EXECUTED
*/
tvp = executing->task_variables;
while (tvp) {
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
3000ee40: e5820000 str r0, [r2] <== NOT EXECUTED
/*
* Per Task Variables
*/
tvp = executing->task_variables;
while (tvp) {
3000ee44: e3530000 cmp r3, #0 <== NOT EXECUTED
3000ee48: 1afffff7 bne 3000ee2c <_RTEMS_tasks_Switch_extension+0xc> <== NOT EXECUTED
tvp->tval = *tvp->ptr;
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
3000ee4c: e5913100 ldr r3, [r1, #256] ; 0x100
while (tvp) {
3000ee50: e3530000 cmp r3, #0
3000ee54: 012fff1e bxeq lr
tvp->gval = *tvp->ptr;
3000ee58: e5932004 ldr r2, [r3, #4] <== NOT EXECUTED
*tvp->ptr = tvp->tval;
3000ee5c: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
tvp->gval = *tvp->ptr;
3000ee60: e5920000 ldr r0, [r2] <== NOT EXECUTED
3000ee64: e5830008 str r0, [r3, #8] <== NOT EXECUTED
*tvp->ptr = tvp->tval;
tvp = (rtems_task_variable_t *)tvp->next;
3000ee68: e5933000 ldr r3, [r3] <== NOT EXECUTED
}
tvp = heir->task_variables;
while (tvp) {
tvp->gval = *tvp->ptr;
*tvp->ptr = tvp->tval;
3000ee6c: e5821000 str r1, [r2] <== NOT EXECUTED
*tvp->ptr = tvp->gval;
tvp = (rtems_task_variable_t *)tvp->next;
}
tvp = heir->task_variables;
while (tvp) {
3000ee70: e3530000 cmp r3, #0 <== NOT EXECUTED
3000ee74: 1afffff7 bne 3000ee58 <_RTEMS_tasks_Switch_extension+0x38> <== NOT EXECUTED
3000ee78: e12fff1e bx lr <== NOT EXECUTED
3000b140 <_Rate_monotonic_Timeout>:
void _Rate_monotonic_Timeout(
Objects_Id id,
void *ignored
)
{
3000b140: e92d4010 push {r4, lr} <== NOT EXECUTED
3000b144: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3000b148: e1a01000 mov r1, r0 <== NOT EXECUTED
3000b14c: e1a0200d mov r2, sp <== NOT EXECUTED
3000b150: e59f0094 ldr r0, [pc, #148] ; 3000b1ec <_Rate_monotonic_Timeout+0xac><== NOT EXECUTED
3000b154: eb000783 bl 3000cf68 <_Objects_Get> <== NOT EXECUTED
/*
* When we get here, the Timer is already off the chain so we do not
* have to worry about that -- hence no _Watchdog_Remove().
*/
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
3000b158: e59d3000 ldr r3, [sp] <== NOT EXECUTED
3000b15c: e1a04000 mov r4, r0 <== NOT EXECUTED
3000b160: e3530000 cmp r3, #0 <== NOT EXECUTED
3000b164: 1a000010 bne 3000b1ac <_Rate_monotonic_Timeout+0x6c> <== NOT EXECUTED
case OBJECTS_LOCAL:
the_thread = the_period->owner;
3000b168: e5900040 ldr r0, [r0, #64] ; 0x40 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_period (
States_Control the_states
)
{
return (the_states & STATES_WAITING_FOR_PERIOD);
3000b16c: e5903010 ldr r3, [r0, #16] <== NOT EXECUTED
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
3000b170: e3130901 tst r3, #16384 ; 0x4000 <== NOT EXECUTED
3000b174: 0a000003 beq 3000b188 <_Rate_monotonic_Timeout+0x48> <== NOT EXECUTED
3000b178: e5902020 ldr r2, [r0, #32] <== NOT EXECUTED
3000b17c: e5943008 ldr r3, [r4, #8] <== NOT EXECUTED
3000b180: e1520003 cmp r2, r3 <== NOT EXECUTED
3000b184: 0a000014 beq 3000b1dc <_Rate_monotonic_Timeout+0x9c> <== NOT EXECUTED
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
3000b188: e5943038 ldr r3, [r4, #56] ; 0x38 <== NOT EXECUTED
3000b18c: e3530001 cmp r3, #1 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else
the_period->state = RATE_MONOTONIC_EXPIRED;
3000b190: 13a03004 movne r3, #4 <== NOT EXECUTED
3000b194: 15843038 strne r3, [r4, #56] ; 0x38 <== NOT EXECUTED
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
3000b198: 0a000005 beq 3000b1b4 <_Rate_monotonic_Timeout+0x74> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
3000b19c: e59f304c ldr r3, [pc, #76] ; 3000b1f0 <_Rate_monotonic_Timeout+0xb0><== NOT EXECUTED
3000b1a0: e5932000 ldr r2, [r3] <== NOT EXECUTED
3000b1a4: e2422001 sub r2, r2, #1 <== NOT EXECUTED
3000b1a8: e5832000 str r2, [r3] <== NOT EXECUTED
case OBJECTS_REMOTE: /* impossible */
#endif
case OBJECTS_ERROR:
break;
}
}
3000b1ac: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000b1b0: e8bd8010 pop {r4, pc} <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
3000b1b4: e3a03003 mov r3, #3 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
3000b1b8: e1a00004 mov r0, r4 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
_Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length );
} else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
3000b1bc: e5843038 str r3, [r4, #56] ; 0x38 <== NOT EXECUTED
_Rate_monotonic_Initiate_statistics( the_period );
3000b1c0: ebfffe54 bl 3000ab18 <_Rate_monotonic_Initiate_statistics> <== NOT EXECUTED
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3000b1c4: e594303c ldr r3, [r4, #60] ; 0x3c <== NOT EXECUTED
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000b1c8: e59f0024 ldr r0, [pc, #36] ; 3000b1f4 <_Rate_monotonic_Timeout+0xb4><== NOT EXECUTED
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3000b1cc: e584301c str r3, [r4, #28] <== NOT EXECUTED
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000b1d0: e2841010 add r1, r4, #16 <== NOT EXECUTED
3000b1d4: eb000e79 bl 3000ebc0 <_Watchdog_Insert> <== NOT EXECUTED
3000b1d8: eaffffef b 3000b19c <_Rate_monotonic_Timeout+0x5c> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
3000b1dc: e59f1014 ldr r1, [pc, #20] ; 3000b1f8 <_Rate_monotonic_Timeout+0xb8><== NOT EXECUTED
3000b1e0: eb0009d2 bl 3000d930 <_Thread_Clear_state> <== NOT EXECUTED
the_thread = the_period->owner;
if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
the_thread->Wait.id == the_period->Object.id ) {
_Thread_Unblock( the_thread );
_Rate_monotonic_Initiate_statistics( the_period );
3000b1e4: e1a00004 mov r0, r4 <== NOT EXECUTED
3000b1e8: eafffff4 b 3000b1c0 <_Rate_monotonic_Timeout+0x80> <== NOT EXECUTED
3000ad3c <_TOD_Get_uptime_as_timespec>:
*/
void _TOD_Get_uptime_as_timespec(
struct timespec *uptime
)
{
3000ad3c: e92d4010 push {r4, lr} <== NOT EXECUTED
3000ad40: e24dd008 sub sp, sp, #8 <== NOT EXECUTED
3000ad44: e1a04000 mov r4, r0 <== NOT EXECUTED
Timestamp_Control uptime_ts;
/* assume time checked for NULL by caller */
_TOD_Get_uptime( &uptime_ts );
3000ad48: e1a0000d mov r0, sp <== NOT EXECUTED
3000ad4c: eb00129b bl 3000f7c0 <_TOD_Get_uptime> <== NOT EXECUTED
_Timestamp_To_timespec( &uptime_ts, uptime );
3000ad50: e89d000c ldm sp, {r2, r3} <== NOT EXECUTED
3000ad54: e884000c stm r4, {r2, r3} <== NOT EXECUTED
}
3000ad58: e28dd008 add sp, sp, #8 <== NOT EXECUTED
3000ad5c: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3000c3f0 <_TOD_Set>:
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000c3f0: e59f3068 ldr r3, [pc, #104] ; 3000c460 <_TOD_Set+0x70>
*/
void _TOD_Set(
const struct timespec *time
)
{
3000c3f4: e92d4030 push {r4, r5, lr}
3000c3f8: e5932000 ldr r2, [r3]
3000c3fc: e1a05000 mov r5, r0
3000c400: e2822001 add r2, r2, #1
3000c404: e5832000 str r2, [r3]
long seconds;
_Thread_Disable_dispatch();
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
3000c408: e59f4054 ldr r4, [pc, #84] ; 3000c464 <_TOD_Set+0x74>
if ( time->tv_sec < seconds )
3000c40c: e5902000 ldr r2, [r0]
long seconds;
_Thread_Disable_dispatch();
_TOD_Deactivate();
seconds = _TOD_Seconds_since_epoch();
3000c410: e5943000 ldr r3, [r4]
if ( time->tv_sec < seconds )
3000c414: e1530002 cmp r3, r2
3000c418: ca00000b bgt 3000c44c <_TOD_Set+0x5c>
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
_Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
3000c41c: e59f0044 ldr r0, [pc, #68] ; 3000c468 <_TOD_Set+0x78>
3000c420: e3a01000 mov r1, #0
3000c424: e0632002 rsb r2, r3, r2
3000c428: eb0009d9 bl 3000eb94 <_Watchdog_Adjust>
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
3000c42c: e895000c ldm r5, {r2, r3}
3000c430: e5843004 str r3, [r4, #4]
_TOD_Is_set = true;
3000c434: e59f3030 ldr r3, [pc, #48] ; 3000c46c <_TOD_Set+0x7c>
_Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, seconds - time->tv_sec );
else
_Watchdog_Adjust_seconds( WATCHDOG_FORWARD, time->tv_sec - seconds );
/* POSIX format TOD (timespec) */
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
3000c438: e5842000 str r2, [r4]
_TOD_Is_set = true;
3000c43c: e3a02001 mov r2, #1
3000c440: e5c32000 strb r2, [r3]
_TOD_Activate();
_Thread_Enable_dispatch();
}
3000c444: e8bd4030 pop {r4, r5, lr}
_Timestamp_Set( &_TOD_Now, time->tv_sec, time->tv_nsec );
_TOD_Is_set = true;
_TOD_Activate();
_Thread_Enable_dispatch();
3000c448: ea0005fe b 3000dc48 <_Thread_Enable_dispatch>
3000c44c: e59f0014 ldr r0, [pc, #20] ; 3000c468 <_TOD_Set+0x78> <== NOT EXECUTED
3000c450: e3a01001 mov r1, #1 <== NOT EXECUTED
3000c454: e0622003 rsb r2, r2, r3 <== NOT EXECUTED
3000c458: eb0009cd bl 3000eb94 <_Watchdog_Adjust> <== NOT EXECUTED
3000c45c: eafffff2 b 3000c42c <_TOD_Set+0x3c> <== NOT EXECUTED
3000a99c <_TOD_Tickle_ticks>:
*
* Output parameters: NONE
*/
void _TOD_Tickle_ticks( void )
{
3000a99c: e92d4010 push {r4, lr}
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
3000a9a0: e59f2064 ldr r2, [pc, #100] ; 3000aa0c <_TOD_Tickle_ticks+0x70>
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
3000a9a4: e59f3064 ldr r3, [pc, #100] ; 3000aa10 <_TOD_Tickle_ticks+0x74>
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
3000a9a8: e592100c ldr r1, [r2, #12]
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
3000a9ac: e5932000 ldr r2, [r3]
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
3000a9b0: e061c281 rsb ip, r1, r1, lsl #5
*
* Output parameters: NONE
*/
void _TOD_Tickle_ticks( void )
{
3000a9b4: e24dd008 sub sp, sp, #8
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
3000a9b8: e2822001 add r2, r2, #1
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
3000a9bc: e081c10c add ip, r1, ip, lsl #2
3000a9c0: e1a0c18c lsl ip, ip, #3
3000a9c4: e3a0e000 mov lr, #0
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
3000a9c8: e1a0100d mov r1, sp
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
3000a9cc: e5832000 str r2, [r3]
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
3000a9d0: e59f003c ldr r0, [pc, #60] ; 3000aa14 <_TOD_Tickle_ticks+0x78>
{
Timestamp_Control tick;
uint32_t seconds;
/* Convert the tick quantum to a timestamp */
_Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() );
3000a9d4: e58de000 str lr, [sp]
3000a9d8: e58dc004 str ip, [sp, #4]
/* Update the counter of ticks since boot */
_Watchdog_Ticks_since_boot += 1;
/* Update the timespec format uptime */
_Timestamp_Add_to( &_TOD_Uptime, &tick );
3000a9dc: eb000847 bl 3000cb00 <_Timespec_Add_to>
/* we do not care how much the uptime changed */
/* Update the timespec format TOD */
seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick );
3000a9e0: e59f0030 ldr r0, [pc, #48] ; 3000aa18 <_TOD_Tickle_ticks+0x7c>
3000a9e4: e1a0100d mov r1, sp
3000a9e8: eb000844 bl 3000cb00 <_Timespec_Add_to>
while ( seconds ) {
3000a9ec: e2504000 subs r4, r0, #0
3000a9f0: 0a000003 beq 3000aa04 <_TOD_Tickle_ticks+0x68>
*/
RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void )
{
_Watchdog_Tickle( &_Watchdog_Seconds_chain );
3000a9f4: e59f0020 ldr r0, [pc, #32] ; 3000aa1c <_TOD_Tickle_ticks+0x80><== NOT EXECUTED
3000a9f8: eb0009b5 bl 3000d0d4 <_Watchdog_Tickle> <== NOT EXECUTED
3000a9fc: e2544001 subs r4, r4, #1 <== NOT EXECUTED
3000aa00: 1afffffb bne 3000a9f4 <_TOD_Tickle_ticks+0x58> <== NOT EXECUTED
_Watchdog_Tickle_seconds();
seconds--;
}
}
3000aa04: e28dd008 add sp, sp, #8
3000aa08: e8bd8010 pop {r4, pc}
3000abdc <_TOD_Validate>:
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
3000abdc: e59f30b0 ldr r3, [pc, #176] ; 3000ac94 <_TOD_Validate+0xb8>
*/
bool _TOD_Validate(
const rtems_time_of_day *the_tod
)
{
3000abe0: e92d4010 push {r4, lr}
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
3000abe4: e2504000 subs r4, r0, #0
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
3000abe8: e593100c ldr r1, [r3, #12]
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
return false;
3000abec: 01a00004 moveq r0, r4
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
3000abf0: 08bd8010 popeq {r4, pc}
)
{
uint32_t days_in_month;
uint32_t ticks_per_second;
ticks_per_second = TOD_MICROSECONDS_PER_SECOND /
3000abf4: e59f009c ldr r0, [pc, #156] ; 3000ac98 <_TOD_Validate+0xbc>
3000abf8: eb004675 bl 3001c5d4 <__aeabi_uidiv>
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
3000abfc: e5943018 ldr r3, [r4, #24]
3000ac00: e1500003 cmp r0, r3
3000ac04: 9a00001e bls 3000ac84 <_TOD_Validate+0xa8>
(the_tod->ticks >= ticks_per_second) ||
3000ac08: e5943014 ldr r3, [r4, #20]
3000ac0c: e353003b cmp r3, #59 ; 0x3b
3000ac10: 8a00001b bhi 3000ac84 <_TOD_Validate+0xa8>
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
3000ac14: e5943010 ldr r3, [r4, #16]
3000ac18: e353003b cmp r3, #59 ; 0x3b
3000ac1c: 8a000018 bhi 3000ac84 <_TOD_Validate+0xa8>
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
3000ac20: e594300c ldr r3, [r4, #12]
3000ac24: e3530017 cmp r3, #23
3000ac28: 8a000015 bhi 3000ac84 <_TOD_Validate+0xa8>
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
3000ac2c: e5940004 ldr r0, [r4, #4]
rtems_configuration_get_microseconds_per_tick();
if ((!the_tod) ||
(the_tod->ticks >= ticks_per_second) ||
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
3000ac30: e3500000 cmp r0, #0
3000ac34: 08bd8010 popeq {r4, pc}
(the_tod->month == 0) ||
3000ac38: e350000c cmp r0, #12
3000ac3c: 8a000010 bhi 3000ac84 <_TOD_Validate+0xa8>
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
3000ac40: e5943000 ldr r3, [r4]
(the_tod->ticks >= ticks_per_second) ||
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
3000ac44: e59f2050 ldr r2, [pc, #80] ; 3000ac9c <_TOD_Validate+0xc0>
3000ac48: e1530002 cmp r3, r2
3000ac4c: 9a00000c bls 3000ac84 <_TOD_Validate+0xa8>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
3000ac50: e5944008 ldr r4, [r4, #8]
(the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
(the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
3000ac54: e3540000 cmp r4, #0
3000ac58: 0a00000b beq 3000ac8c <_TOD_Validate+0xb0>
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
3000ac5c: e3130003 tst r3, #3
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
3000ac60: 059f3038 ldreq r3, [pc, #56] ; 3000aca0 <_TOD_Validate+0xc4>
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
3000ac64: 159f3034 ldrne r3, [pc, #52] ; 3000aca0 <_TOD_Validate+0xc4>
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
return false;
if ( (the_tod->year % 4) == 0 )
days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
3000ac68: 0280000d addeq r0, r0, #13
3000ac6c: 07930100 ldreq r0, [r3, r0, lsl #2]
else
days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
3000ac70: 17930100 ldrne r0, [r3, r0, lsl #2]
* false - if the the_tod is invalid
*
* NOTE: This routine only works for leap-years through 2099.
*/
bool _TOD_Validate(
3000ac74: e1500004 cmp r0, r4
3000ac78: 33a00000 movcc r0, #0
3000ac7c: 23a00001 movcs r0, #1
3000ac80: e8bd8010 pop {r4, pc}
(the_tod->hour >= TOD_HOURS_PER_DAY) ||
(the_tod->month == 0) ||
(the_tod->month > TOD_MONTHS_PER_YEAR) ||
(the_tod->year < TOD_BASE_YEAR) ||
(the_tod->day == 0) )
return false;
3000ac84: e3a00000 mov r0, #0 <== NOT EXECUTED
3000ac88: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3000ac8c: e1a00004 mov r0, r4 <== NOT EXECUTED
if ( the_tod->day > days_in_month )
return false;
return true;
}
3000ac90: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3000bc10 <_Thread_Change_priority>:
void _Thread_Change_priority(
Thread_Control *the_thread,
Priority_Control new_priority,
bool prepend_it
)
{
3000bc10: e92d40f0 push {r4, r5, r6, r7, lr}
3000bc14: e1a04000 mov r4, r0
3000bc18: e1a07001 mov r7, r1
3000bc1c: e20260ff and r6, r2, #255 ; 0xff
States_Control state, original_state;
/*
* Save original state
*/
original_state = the_thread->current_state;
3000bc20: e5905010 ldr r5, [r0, #16]
/*
* Set a transient state for the thread so it is pulled off the Ready chains.
* This will prevent it from being scheduled no matter what happens in an
* ISR.
*/
_Thread_Set_transient( the_thread );
3000bc24: eb000340 bl 3000c92c <_Thread_Set_transient>
/*
* Do not bother recomputing all the priority related information if
* we are not REALLY changing priority.
*/
if ( the_thread->current_priority != new_priority )
3000bc28: e5943014 ldr r3, [r4, #20]
3000bc2c: e1530007 cmp r3, r7
_Thread_Set_priority( the_thread, new_priority );
3000bc30: 11a00004 movne r0, r4
3000bc34: 11a01007 movne r1, r7
3000bc38: 1b000322 blne 3000c8c8 <_Thread_Set_priority>
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000bc3c: e10f7000 mrs r7, CPSR
3000bc40: e3873080 orr r3, r7, #128 ; 0x80
3000bc44: e129f003 msr CPSR_fc, r3
/*
* If the thread has more than STATES_TRANSIENT set, then it is blocked,
* If it is blocked on a thread queue, then we need to requeue it.
*/
state = the_thread->current_state;
3000bc48: e5943010 ldr r3, [r4, #16]
if ( state != STATES_TRANSIENT ) {
3000bc4c: e3530004 cmp r3, #4
3000bc50: 0a00000b beq 3000bc84 <_Thread_Change_priority+0x74>
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
3000bc54: e3150004 tst r5, #4 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
3000bc58: 03c32004 biceq r2, r3, #4 <== NOT EXECUTED
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
3000bc5c: 05842010 streq r2, [r4, #16] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000bc60: e129f007 msr CPSR_fc, r7 <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
3000bc64: e59f2098 ldr r2, [pc, #152] ; 3000bd04 <_Thread_Change_priority+0xf4><== NOT EXECUTED
3000bc68: e0032002 and r2, r3, r2 <== NOT EXECUTED
_ISR_Enable( level );
if ( _States_Is_waiting_on_thread_queue( state ) ) {
3000bc6c: e3520000 cmp r2, #0 <== NOT EXECUTED
3000bc70: 08bd80f0 popeq {r4, r5, r6, r7, pc} <== NOT EXECUTED
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
3000bc74: e5940044 ldr r0, [r4, #68] ; 0x44 <== NOT EXECUTED
3000bc78: e1a01004 mov r1, r4 <== NOT EXECUTED
if ( !_Thread_Is_executing_also_the_heir() &&
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
_ISR_Enable( level );
}
3000bc7c: e8bd40f0 pop {r4, r5, r6, r7, lr} <== NOT EXECUTED
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) )
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
_ISR_Enable( level );
if ( _States_Is_waiting_on_thread_queue( state ) ) {
_Thread_queue_Requeue( the_thread->Wait.queue, the_thread );
3000bc80: ea0002e4 b 3000c818 <_Thread_queue_Requeue> <== NOT EXECUTED
}
return;
}
/* Only clear the transient state if it wasn't set already */
if ( ! _States_Is_transient( original_state ) ) {
3000bc84: e2155004 ands r5, r5, #4
3000bc88: 159f5078 ldrne r5, [pc, #120] ; 3000bd08 <_Thread_Change_priority+0xf8>
3000bc8c: 0a00000f beq 3000bcd0 <_Thread_Change_priority+0xc0>
static inline void arm_interrupt_flash( uint32_t level )
{
uint32_t arm_switch_reg;
__asm__ volatile (
3000bc90: e10f3000 mrs r3, CPSR
3000bc94: e129f007 msr CPSR_fc, r7
3000bc98: e129f003 msr CPSR_fc, r3
* This kernel routine implements the scheduling decision logic for
* the scheduler. It does NOT dispatch.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( void )
{
_Scheduler.Operations.schedule();
3000bc9c: e1a0e00f mov lr, pc
3000bca0: e595f008 ldr pc, [r5, #8]
* is also the heir thread, and false otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void )
{
return ( _Thread_Executing == _Thread_Heir );
3000bca4: e59f3060 ldr r3, [pc, #96] ; 3000bd0c <_Thread_Change_priority+0xfc>
3000bca8: e5932004 ldr r2, [r3, #4]
* We altered the set of thread priorities. So let's figure out
* who is the heir and if we need to switch to them.
*/
_Scheduler_Schedule();
if ( !_Thread_Is_executing_also_the_heir() &&
3000bcac: e5931008 ldr r1, [r3, #8]
3000bcb0: e1520001 cmp r2, r1
3000bcb4: 0a000003 beq 3000bcc8 <_Thread_Change_priority+0xb8>
3000bcb8: e5d22074 ldrb r2, [r2, #116] ; 0x74
3000bcbc: e3520000 cmp r2, #0
_Thread_Executing->is_preemptible )
_Thread_Dispatch_necessary = true;
3000bcc0: 13a02001 movne r2, #1
3000bcc4: 15c32010 strbne r2, [r3, #16]
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000bcc8: e129f007 msr CPSR_fc, r7
3000bccc: e8bd80f0 pop {r4, r5, r6, r7, pc}
* the TRANSIENT state. So we have to place it on the appropriate
* Ready Queue with interrupts off.
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
if ( prepend_it )
3000bcd0: e3560000 cmp r6, #0
* Interrupts are STILL disabled.
* We now know the thread will be in the READY state when we remove
* the TRANSIENT state. So we have to place it on the appropriate
* Ready Queue with interrupts off.
*/
the_thread->current_state = _States_Clear( STATES_TRANSIENT, state );
3000bcd4: e5845010 str r5, [r4, #16]
if ( prepend_it )
3000bcd8: 0a000004 beq 3000bcf0 <_Thread_Change_priority+0xe0>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue_first( the_thread );
3000bcdc: e59f5024 ldr r5, [pc, #36] ; 3000bd08 <_Thread_Change_priority+0xf8>
3000bce0: e1a00004 mov r0, r4
3000bce4: e1a0e00f mov lr, pc
3000bce8: e595f028 ldr pc, [r5, #40] ; 0x28
3000bcec: eaffffe7 b 3000bc90 <_Thread_Change_priority+0x80>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue(
Thread_Control *the_thread
)
{
_Scheduler.Operations.enqueue( the_thread );
3000bcf0: e59f5010 ldr r5, [pc, #16] ; 3000bd08 <_Thread_Change_priority+0xf8>
3000bcf4: e1a00004 mov r0, r4
3000bcf8: e1a0e00f mov lr, pc
3000bcfc: e595f024 ldr pc, [r5, #36] ; 0x24
3000bd00: eaffffe2 b 3000bc90 <_Thread_Change_priority+0x80>
3000bd5c <_Thread_Close>:
RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id(
Objects_Information *information,
Objects_Control *the_object
)
{
_Objects_Set_local_object(
3000bd5c: e1d120b8 ldrh r2, [r1, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3000bd60: e590301c ldr r3, [r0, #28]
void _Thread_Close(
Objects_Information *information,
Thread_Control *the_thread
)
{
3000bd64: e92d4070 push {r4, r5, r6, lr}
3000bd68: e1a04001 mov r4, r1
3000bd6c: e3a01000 mov r1, #0
3000bd70: e7831102 str r1, [r3, r2, lsl #2]
3000bd74: e1a05000 mov r5, r0
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
3000bd78: e59f608c ldr r6, [pc, #140] ; 3000be0c <_Thread_Close+0xb0>
* disappear and set a transient state on it. So we temporarily
* unnest dispatching.
*/
_Thread_Unnest_dispatch();
_User_extensions_Thread_delete( the_thread );
3000bd7c: e1a00004 mov r0, r4
3000bd80: e5963000 ldr r3, [r6]
3000bd84: e2433001 sub r3, r3, #1
3000bd88: e5863000 str r3, [r6]
3000bd8c: eb000400 bl 3000cd94 <_User_extensions_Thread_delete>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000bd90: e5963000 ldr r3, [r6]
3000bd94: e2833001 add r3, r3, #1
3000bd98: e5863000 str r3, [r6]
/*
* Now we are in a dispatching critical section again and we
* can take the thread OUT of the published set. It is invalid
* to use this thread's Id OR name after this call.
*/
_Objects_Close( information, &the_thread->Object );
3000bd9c: e1a01004 mov r1, r4
3000bda0: e1a00005 mov r0, r5
3000bda4: ebfffc5b bl 3000af18 <_Objects_Close>
/*
* By setting the dormant state, the thread will not be considered
* for scheduling when we remove any blocking states.
*/
_Thread_Set_state( the_thread, STATES_DORMANT );
3000bda8: e1a00004 mov r0, r4
3000bdac: e3a01001 mov r1, #1
3000bdb0: eb0002cb bl 3000c8e4 <_Thread_Set_state>
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
3000bdb4: e1a00004 mov r0, r4
3000bdb8: eb000265 bl 3000c754 <_Thread_queue_Extract_with_proxy>
3000bdbc: e3500000 cmp r0, #0
3000bdc0: 1a000002 bne 3000bdd0 <_Thread_Close+0x74>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
3000bdc4: e5943050 ldr r3, [r4, #80] ; 0x50
3000bdc8: e3530002 cmp r3, #2
3000bdcc: 0a00000b beq 3000be00 <_Thread_Close+0xa4>
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Free(
Thread_Control *the_thread
)
{
return _Scheduler.Operations.free( the_thread );
3000bdd0: e59f3038 ldr r3, [pc, #56] ; 3000be10 <_Thread_Close+0xb4>
3000bdd4: e1a00004 mov r0, r4
3000bdd8: e1a0e00f mov lr, pc
3000bddc: e593f01c ldr pc, [r3, #28]
/*
* Free the rest of the memory associated with this task
* and set the associated pointers to NULL for safety.
*/
_Thread_Stack_Free( the_thread );
the_thread->Start.stack = NULL;
3000bde0: e3a05000 mov r5, #0
/*
* Free the rest of the memory associated with this task
* and set the associated pointers to NULL for safety.
*/
_Thread_Stack_Free( the_thread );
3000bde4: e1a00004 mov r0, r4
3000bde8: eb0002f9 bl 3000c9d4 <_Thread_Stack_Free>
the_thread->Start.stack = NULL;
3000bdec: e58450bc str r5, [r4, #188] ; 0xbc
_Workspace_Free( the_thread->extensions );
3000bdf0: e59400fc ldr r0, [r4, #252] ; 0xfc
3000bdf4: eb0004fd bl 3000d1f0 <_Workspace_Free>
the_thread->extensions = NULL;
3000bdf8: e58450fc str r5, [r4, #252] ; 0xfc
}
3000bdfc: e8bd8070 pop {r4, r5, r6, pc}
*/
_Thread_Set_state( the_thread, STATES_DORMANT );
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
if ( _Watchdog_Is_active( &the_thread->Timer ) )
(void) _Watchdog_Remove( &the_thread->Timer );
3000be00: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED
3000be04: eb000487 bl 3000d028 <_Watchdog_Remove> <== NOT EXECUTED
3000be08: eafffff0 b 3000bdd0 <_Thread_Close+0x74> <== NOT EXECUTED
3000bee8 <_Thread_Delay_ended>:
void _Thread_Delay_ended(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
3000bee8: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
3000beec: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
3000bef0: e1a0100d mov r1, sp <== NOT EXECUTED
3000bef4: eb00006b bl 3000c0a8 <_Thread_Get> <== NOT EXECUTED
switch ( location ) {
3000bef8: e59d3000 ldr r3, [sp] <== NOT EXECUTED
3000befc: e3530000 cmp r3, #0 <== NOT EXECUTED
3000bf00: 1a000005 bne 3000bf1c <_Thread_Delay_ended+0x34> <== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_Clear_state(
3000bf04: e59f1018 ldr r1, [pc, #24] ; 3000bf24 <_Thread_Delay_ended+0x3c><== NOT EXECUTED
3000bf08: ebffff80 bl 3000bd10 <_Thread_Clear_state> <== NOT EXECUTED
3000bf0c: e59f3014 ldr r3, [pc, #20] ; 3000bf28 <_Thread_Delay_ended+0x40><== NOT EXECUTED
3000bf10: e5932000 ldr r2, [r3] <== NOT EXECUTED
3000bf14: e2422001 sub r2, r2, #1 <== NOT EXECUTED
3000bf18: e5832000 str r2, [r3] <== NOT EXECUTED
| STATES_INTERRUPTIBLE_BY_SIGNAL
);
_Thread_Unnest_dispatch();
break;
}
}
3000bf1c: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000bf20: e8bd8000 pop {pc} <== NOT EXECUTED
3000bf2c <_Thread_Dispatch>:
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
3000bf2c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
3000bf30: e59f7138 ldr r7, [pc, #312] ; 3000c070 <_Thread_Dispatch+0x144>
* dispatch thread
* no dispatch thread
*/
void _Thread_Dispatch( void )
{
3000bf34: e24dd010 sub sp, sp, #16
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
3000bf38: e5975004 ldr r5, [r7, #4]
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000bf3c: e10f2000 mrs r2, CPSR
3000bf40: e3823080 orr r3, r2, #128 ; 0x80
3000bf44: e129f003 msr CPSR_fc, r3
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
3000bf48: e5d71010 ldrb r1, [r7, #16]
3000bf4c: e3510000 cmp r1, #0
3000bf50: 0a000043 beq 3000c064 <_Thread_Dispatch+0x138>
heir = _Thread_Heir;
3000bf54: e5974008 ldr r4, [r7, #8]
_Thread_Dispatch_disable_level = 1;
3000bf58: e59f9114 ldr r9, [pc, #276] ; 3000c074 <_Thread_Dispatch+0x148>
3000bf5c: e3a00001 mov r0, #1
_Thread_Dispatch_necessary = false;
3000bf60: e3a01000 mov r1, #0
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
3000bf64: e1550004 cmp r5, r4
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
3000bf68: e5890000 str r0, [r9]
_Thread_Dispatch_necessary = false;
_Thread_Executing = heir;
3000bf6c: e5874004 str r4, [r7, #4]
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
_Thread_Dispatch_necessary = false;
3000bf70: e5c71010 strb r1, [r7, #16]
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
3000bf74: 01a03002 moveq r3, r2
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
3000bf78: 0a000033 beq 3000c04c <_Thread_Dispatch+0x120>
3000bf7c: e28da008 add sl, sp, #8
3000bf80: e1a0800d mov r8, sp
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
3000bf84: e1a06007 mov r6, r7
3000bf88: ea000007 b 3000bfac <_Thread_Dispatch+0x80>
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
3000bf8c: e5964008 ldr r4, [r6, #8] <== NOT EXECUTED
_Thread_Dispatch_disable_level = 1;
3000bf90: e3a01001 mov r1, #1 <== NOT EXECUTED
_Thread_Dispatch_necessary = false;
3000bf94: e3a0b000 mov fp, #0 <== NOT EXECUTED
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
3000bf98: e1540005 cmp r4, r5 <== NOT EXECUTED
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
3000bf9c: e5891000 str r1, [r9] <== NOT EXECUTED
_Thread_Dispatch_necessary = false;
_Thread_Executing = heir;
3000bfa0: e5864004 str r4, [r6, #4] <== NOT EXECUTED
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
heir = _Thread_Heir;
_Thread_Dispatch_disable_level = 1;
_Thread_Dispatch_necessary = false;
3000bfa4: e5c6b010 strb fp, [r6, #16] <== NOT EXECUTED
/*
* When the heir and executing are the same, then we are being
* requested to do the post switch dispatching. This is normally
* done to dispatch signals.
*/
if ( heir == executing )
3000bfa8: 0a000027 beq 3000c04c <_Thread_Dispatch+0x120> <== NOT EXECUTED
*/
#if __RTEMS_ADA__
executing->rtems_ada_self = rtems_ada_self;
rtems_ada_self = heir->rtems_ada_self;
#endif
if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
3000bfac: e594307c ldr r3, [r4, #124] ; 0x7c
3000bfb0: e3530001 cmp r3, #1
heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
3000bfb4: 059fc0bc ldreq ip, [pc, #188] ; 3000c078 <_Thread_Dispatch+0x14c>
3000bfb8: 059c3000 ldreq r3, [ip]
3000bfbc: 05843078 streq r3, [r4, #120] ; 0x78
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000bfc0: e129f002 msr CPSR_fc, r2
_ISR_Enable( level );
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
{
Timestamp_Control uptime, ran;
_TOD_Get_uptime( &uptime );
3000bfc4: e1a0000a mov r0, sl
3000bfc8: eb000cce bl 3000f308 <_TOD_Get_uptime>
_Timestamp_Subtract(
3000bfcc: e1a0200d mov r2, sp
3000bfd0: e1a0100a mov r1, sl
3000bfd4: e59f00a0 ldr r0, [pc, #160] ; 3000c07c <_Thread_Dispatch+0x150>
3000bfd8: eb0002df bl 3000cb5c <_Timespec_Subtract>
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
3000bfdc: e1a0100d mov r1, sp
3000bfe0: e2850084 add r0, r5, #132 ; 0x84
3000bfe4: eb0002c5 bl 3000cb00 <_Timespec_Add_to>
_Thread_Time_of_last_context_switch = uptime;
3000bfe8: e28dc008 add ip, sp, #8
3000bfec: e89c1800 ldm ip, {fp, ip}
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
3000bff0: e59f2088 ldr r2, [pc, #136] ; 3000c080 <_Thread_Dispatch+0x154>
executing->libc_reent = *_Thread_libc_reent;
*_Thread_libc_reent = heir->libc_reent;
}
_User_extensions_Thread_switch( executing, heir );
3000bff4: e1a00005 mov r0, r5
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
3000bff8: e5923000 ldr r3, [r2]
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
3000bffc: e59f2078 ldr r2, [pc, #120] ; 3000c07c <_Thread_Dispatch+0x150>
#endif
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
3000c000: e3530000 cmp r3, #0
&_Thread_Time_of_last_context_switch,
&uptime,
&ran
);
_Timestamp_Add_to( &executing->cpu_time_used, &ran );
_Thread_Time_of_last_context_switch = uptime;
3000c004: e8821800 stm r2, {fp, ip}
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
executing->libc_reent = *_Thread_libc_reent;
3000c008: 15932000 ldrne r2, [r3]
*_Thread_libc_reent = heir->libc_reent;
}
_User_extensions_Thread_switch( executing, heir );
3000c00c: e1a01004 mov r1, r4
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
executing->libc_reent = *_Thread_libc_reent;
3000c010: 158520f0 strne r2, [r5, #240] ; 0xf0
*_Thread_libc_reent = heir->libc_reent;
3000c014: 159420f0 ldrne r2, [r4, #240] ; 0xf0
3000c018: 15832000 strne r2, [r3]
}
_User_extensions_Thread_switch( executing, heir );
3000c01c: eb000382 bl 3000ce2c <_User_extensions_Thread_switch>
if ( executing->fp_context != NULL )
_Context_Save_fp( &executing->fp_context );
#endif
#endif
_Context_Switch( &executing->Registers, &heir->Registers );
3000c020: e28500c0 add r0, r5, #192 ; 0xc0
3000c024: e28410c0 add r1, r4, #192 ; 0xc0
3000c028: eb000550 bl 3000d570 <_CPU_Context_switch>
if ( executing->fp_context != NULL )
_Context_Restore_fp( &executing->fp_context );
#endif
#endif
executing = _Thread_Executing;
3000c02c: e5975004 ldr r5, [r7, #4]
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000c030: e10f3000 mrs r3, CPSR
3000c034: e3832080 orr r2, r3, #128 ; 0x80
3000c038: e129f002 msr CPSR_fc, r2
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
while ( _Thread_Dispatch_necessary == true ) {
3000c03c: e5d71010 ldrb r1, [r7, #16]
3000c040: e1a02003 mov r2, r3
3000c044: e3510000 cmp r1, #0
3000c048: 1affffcf bne 3000bf8c <_Thread_Dispatch+0x60>
_ISR_Disable( level );
}
post_switch:
_Thread_Dispatch_disable_level = 0;
3000c04c: e3a01000 mov r1, #0
3000c050: e5891000 str r1, [r9]
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000c054: e129f003 msr CPSR_fc, r3
_ISR_Enable( level );
_API_extensions_Run_postswitch();
3000c058: ebfff8cb bl 3000a38c <_API_extensions_Run_postswitch>
}
3000c05c: e28dd010 add sp, sp, #16
3000c060: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
Thread_Control *executing;
Thread_Control *heir;
ISR_Level level;
executing = _Thread_Executing;
_ISR_Disable( level );
3000c064: e1a03002 mov r3, r2
3000c068: e59f9004 ldr r9, [pc, #4] ; 3000c074 <_Thread_Dispatch+0x148>
3000c06c: eafffff6 b 3000c04c <_Thread_Dispatch+0x120>
3000c0a8 <_Thread_Get>:
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
3000c0a8: e2503000 subs r3, r0, #0
*/
Thread_Control *_Thread_Get (
Objects_Id id,
Objects_Locations *location
)
{
3000c0ac: e1a02001 mov r2, r1
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
3000c0b0: 0a000014 beq 3000c108 <_Thread_Get+0x60>
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
3000c0b4: e1a01c23 lsr r1, r3, #24
3000c0b8: e2011007 and r1, r1, #7
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
3000c0bc: e2410001 sub r0, r1, #1
3000c0c0: e3500002 cmp r0, #2
3000c0c4: 8a00000b bhi 3000c0f8 <_Thread_Get+0x50>
*/
RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class(
Objects_Id id
)
{
return (uint32_t)
3000c0c8: e1a0cda3 lsr ip, r3, #27
*location = OBJECTS_ERROR;
goto done;
}
the_class = _Objects_Get_class( id );
if ( the_class != 1 ) { /* threads are always first class :) */
3000c0cc: e35c0001 cmp ip, #1
3000c0d0: 1a000008 bne 3000c0f8 <_Thread_Get+0x50>
*location = OBJECTS_ERROR;
goto done;
}
api_information = _Objects_Information_table[ the_api ];
3000c0d4: e59f0054 ldr r0, [pc, #84] ; 3000c130 <_Thread_Get+0x88>
3000c0d8: e7900101 ldr r0, [r0, r1, lsl #2]
* There is no way for this to happen if POSIX is enabled. But there
* is actually a test case in sp43 for this which trips it whether or
* not POSIX is enabled. So in the interest of safety, this is left
* on in all configurations.
*/
if ( !api_information ) {
3000c0dc: e3500000 cmp r0, #0
3000c0e0: 0a000010 beq 3000c128 <_Thread_Get+0x80>
*location = OBJECTS_ERROR;
goto done;
}
information = api_information[ the_class ];
3000c0e4: e5900004 ldr r0, [r0, #4]
if ( !information ) {
3000c0e8: e3500000 cmp r0, #0
3000c0ec: 0a00000d beq 3000c128 <_Thread_Get+0x80>
*location = OBJECTS_ERROR;
goto done;
}
tp = (Thread_Control *) _Objects_Get( information, id, location );
3000c0f0: e1a01003 mov r1, r3
3000c0f4: eafffc93 b 3000b348 <_Objects_Get>
goto done;
}
the_class = _Objects_Get_class( id );
if ( the_class != 1 ) { /* threads are always first class :) */
*location = OBJECTS_ERROR;
3000c0f8: e3a03001 mov r3, #1
3000c0fc: e5823000 str r3, [r2]
{
uint32_t the_api;
uint32_t the_class;
Objects_Information **api_information;
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
3000c100: e3a00000 mov r0, #0
}
the_class = _Objects_Get_class( id );
if ( the_class != 1 ) { /* threads are always first class :) */
*location = OBJECTS_ERROR;
goto done;
3000c104: e12fff1e bx lr
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000c108: e59f1024 ldr r1, [pc, #36] ; 3000c134 <_Thread_Get+0x8c>
3000c10c: e5910000 ldr r0, [r1]
3000c110: e2800001 add r0, r0, #1
3000c114: e5810000 str r0, [r1]
Objects_Information *information;
Thread_Control *tp = (Thread_Control *) 0;
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
_Thread_Disable_dispatch();
*location = OBJECTS_LOCAL;
3000c118: e5823000 str r3, [r2]
tp = _Thread_Executing;
3000c11c: e59f3014 ldr r3, [pc, #20] ; 3000c138 <_Thread_Get+0x90>
3000c120: e5930004 ldr r0, [r3, #4]
goto done;
3000c124: e12fff1e bx lr
goto done;
}
information = api_information[ the_class ];
if ( !information ) {
*location = OBJECTS_ERROR;
3000c128: e582c000 str ip, [r2] <== NOT EXECUTED
goto done;
3000c12c: e12fff1e bx lr <== NOT EXECUTED
3000c2d8 <_Thread_Handler_initialization>:
uint32_t maximum_extensions;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies;
#endif
ticks_per_timeslice = Configuration.ticks_per_timeslice;
3000c2d8: e59f2088 ldr r2, [pc, #136] ; 3000c368 <_Thread_Handler_initialization+0x90>
*
* Output parameters: NONE
*/
void _Thread_Handler_initialization(void)
{
3000c2dc: e52de004 push {lr} ; (str lr, [sp, #-4]!)
#endif
/*
* BOTH stacks hooks must be set or both must be NULL.
* Do not allow mixture.
*/
if ( !( (!Configuration.stack_allocate_hook)
3000c2e0: e592c020 ldr ip, [r2, #32]
== (!Configuration.stack_free_hook) ) )
3000c2e4: e5923024 ldr r3, [r2, #36] ; 0x24
#endif
/*
* BOTH stacks hooks must be set or both must be NULL.
* Do not allow mixture.
*/
if ( !( (!Configuration.stack_allocate_hook)
3000c2e8: e27cc001 rsbs ip, ip, #1
3000c2ec: 33a0c000 movcc ip, #0
3000c2f0: e3530000 cmp r3, #0
3000c2f4: 022cc001 eoreq ip, ip, #1
3000c2f8: e35c0000 cmp ip, #0
uint32_t maximum_extensions;
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies;
#endif
ticks_per_timeslice = Configuration.ticks_per_timeslice;
3000c2fc: e5923010 ldr r3, [r2, #16]
*
* Output parameters: NONE
*/
void _Thread_Handler_initialization(void)
{
3000c300: e24dd00c sub sp, sp, #12
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies;
#endif
ticks_per_timeslice = Configuration.ticks_per_timeslice;
maximum_extensions = Configuration.maximum_extensions;
3000c304: e5922008 ldr r2, [r2, #8]
#endif
/*
* BOTH stacks hooks must be set or both must be NULL.
* Do not allow mixture.
*/
if ( !( (!Configuration.stack_allocate_hook)
3000c308: 1a000012 bne 3000c358 <_Thread_Handler_initialization+0x80>
_Thread_Heir = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Thread_Allocated_fp = NULL;
#endif
_Thread_Maximum_extensions = maximum_extensions;
3000c30c: e59f0058 ldr r0, [pc, #88] ; 3000c36c <_Thread_Handler_initialization+0x94>
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_BAD_STACK_HOOK
);
_Thread_Dispatch_necessary = false;
3000c310: e59fe058 ldr lr, [pc, #88] ; 3000c370 <_Thread_Handler_initialization+0x98>
_Thread_Heir = NULL;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
_Thread_Allocated_fp = NULL;
#endif
_Thread_Maximum_extensions = maximum_extensions;
3000c314: e5802000 str r2, [r0]
_Thread_Ticks_per_timeslice = ticks_per_timeslice;
3000c318: e59f2054 ldr r2, [pc, #84] ; 3000c374 <_Thread_Handler_initialization+0x9c>
/*
* Initialize this class of objects.
*/
_Objects_Initialize_information(
3000c31c: e3a01001 mov r1, #1
_Thread_Allocated_fp = NULL;
#endif
_Thread_Maximum_extensions = maximum_extensions;
_Thread_Ticks_per_timeslice = ticks_per_timeslice;
3000c320: e5823000 str r3, [r2]
/*
* Initialize this class of objects.
*/
_Objects_Initialize_information(
3000c324: e3a03f41 mov r3, #260 ; 0x104
true,
INTERNAL_ERROR_BAD_STACK_HOOK
);
_Thread_Dispatch_necessary = false;
_Thread_Executing = NULL;
3000c328: e58ec004 str ip, [lr, #4]
_Thread_Heir = NULL;
3000c32c: e58ec008 str ip, [lr, #8]
/*
* Initialize this class of objects.
*/
_Objects_Initialize_information(
3000c330: e59f0040 ldr r0, [pc, #64] ; 3000c378 <_Thread_Handler_initialization+0xa0>
3000c334: e88d1008 stm sp, {r3, ip}
3000c338: e1a02001 mov r2, r1
INTERNAL_ERROR_CORE,
true,
INTERNAL_ERROR_BAD_STACK_HOOK
);
_Thread_Dispatch_necessary = false;
3000c33c: e5cec010 strb ip, [lr, #16]
/*
* Initialize this class of objects.
*/
_Objects_Initialize_information(
3000c340: e1a03001 mov r3, r1
3000c344: e3a0c008 mov ip, #8
3000c348: e58dc008 str ip, [sp, #8]
3000c34c: ebfffc1d bl 3000b3c8 <_Objects_Initialize_information>
false, /* true if this is a global object class */
NULL /* Proxy extraction support callout */
#endif
);
}
3000c350: e28dd00c add sp, sp, #12
3000c354: e8bd8000 pop {pc}
* BOTH stacks hooks must be set or both must be NULL.
* Do not allow mixture.
*/
if ( !( (!Configuration.stack_allocate_hook)
== (!Configuration.stack_free_hook) ) )
_Internal_error_Occurred(
3000c358: e3a00000 mov r0, #0 <== NOT EXECUTED
3000c35c: e3a01001 mov r1, #1 <== NOT EXECUTED
3000c360: e3a0200e mov r2, #14 <== NOT EXECUTED
3000c364: ebfffaae bl 3000ae24 <_Internal_error_Occurred> <== NOT EXECUTED
300108c4 <_Thread_Reset>:
void _Thread_Reset(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
300108c4: e92d4030 push {r4, r5, lr}
the_thread->resource_count = 0;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
300108c8: e590c0a4 ldr ip, [r0, #164] ; 0xa4
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
the_thread->resource_count = 0;
the_thread->is_preemptible = the_thread->Start.is_preemptible;
300108cc: e5d0e0a0 ldrb lr, [r0, #160] ; 0xa0
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
the_thread->budget_callout = the_thread->Start.budget_callout;
300108d0: e59030a8 ldr r3, [r0, #168] ; 0xa8
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
the_thread->resource_count = 0;
300108d4: e3a05000 mov r5, #0
300108d8: e580501c str r5, [r0, #28]
the_thread->is_preemptible = the_thread->Start.is_preemptible;
300108dc: e5c0e074 strb lr, [r0, #116] ; 0x74
the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
300108e0: e580c07c str ip, [r0, #124] ; 0x7c
the_thread->budget_callout = the_thread->Start.budget_callout;
300108e4: e5803080 str r3, [r0, #128] ; 0x80
the_thread->Start.pointer_argument = pointer_argument;
300108e8: e5801098 str r1, [r0, #152] ; 0x98
the_thread->Start.numeric_argument = numeric_argument;
300108ec: e580209c str r2, [r0, #156] ; 0x9c
void _Thread_Reset(
Thread_Control *the_thread,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
300108f0: e1a04000 mov r4, r0
the_thread->budget_callout = the_thread->Start.budget_callout;
the_thread->Start.pointer_argument = pointer_argument;
the_thread->Start.numeric_argument = numeric_argument;
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
300108f4: ebfff2db bl 3000d468 <_Thread_queue_Extract_with_proxy>
300108f8: e1500005 cmp r0, r5
300108fc: 1a000002 bne 3001090c <_Thread_Reset+0x48>
if ( _Watchdog_Is_active( &the_thread->Timer ) )
30010900: e5943050 ldr r3, [r4, #80] ; 0x50
30010904: e3530002 cmp r3, #2
30010908: 0a000007 beq 3001092c <_Thread_Reset+0x68>
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
3001090c: e59410b0 ldr r1, [r4, #176] ; 0xb0
30010910: e5943014 ldr r3, [r4, #20]
30010914: e1530001 cmp r3, r1
30010918: 08bd8030 popeq {r4, r5, pc}
the_thread->real_priority = the_thread->Start.initial_priority;
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
3001091c: e1a00004 mov r0, r4
if ( _Watchdog_Is_active( &the_thread->Timer ) )
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
the_thread->real_priority = the_thread->Start.initial_priority;
30010920: e5841018 str r1, [r4, #24]
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
}
}
30010924: e8bd4030 pop {r4, r5, lr}
(void) _Watchdog_Remove( &the_thread->Timer );
}
if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
the_thread->real_priority = the_thread->Start.initial_priority;
_Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
30010928: eafff347 b 3000d64c <_Thread_Set_priority>
the_thread->Start.numeric_argument = numeric_argument;
if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
if ( _Watchdog_Is_active( &the_thread->Timer ) )
(void) _Watchdog_Remove( &the_thread->Timer );
3001092c: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED
30010930: ebfff530 bl 3000ddf8 <_Watchdog_Remove> <== NOT EXECUTED
30010934: eafffff4 b 3001090c <_Thread_Reset+0x48> <== NOT EXECUTED
30010084 <_Thread_Resume>:
*/
void _Thread_Resume(
Thread_Control *the_thread,
bool force
)
{
30010084: e92d4010 push {r4, lr}
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
30010088: e10f4000 mrs r4, CPSR
3001008c: e3842080 orr r2, r4, #128 ; 0x80
30010090: e129f002 msr CPSR_fc, r2
ISR_Level level;
States_Control current_state;
_ISR_Disable( level );
current_state = the_thread->current_state;
30010094: e5902010 ldr r2, [r0, #16]
if ( current_state & STATES_SUSPENDED ) {
30010098: e3120002 tst r2, #2
3001009c: 0a000003 beq 300100b0 <_Thread_Resume+0x2c>
RTEMS_INLINE_ROUTINE States_Control _States_Clear (
States_Control states_to_clear,
States_Control current_state
)
{
return (current_state & ~states_to_clear);
300100a0: e3c22002 bic r2, r2, #2
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
if ( _States_Is_ready( current_state ) ) {
300100a4: e3520000 cmp r2, #0
_ISR_Disable( level );
current_state = the_thread->current_state;
if ( current_state & STATES_SUSPENDED ) {
current_state =
the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state);
300100a8: e5802010 str r2, [r0, #16]
if ( _States_Is_ready( current_state ) ) {
300100ac: 0a000001 beq 300100b8 <_Thread_Resume+0x34>
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
300100b0: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED
_Scheduler_Unblock( the_thread );
}
}
_ISR_Enable( level );
}
300100b4: e8bd8010 pop {r4, pc} <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
Thread_Control *the_thread
)
{
_Scheduler.Operations.unblock( the_thread );
300100b8: e59f300c ldr r3, [pc, #12] ; 300100cc <_Thread_Resume+0x48>
300100bc: e1a0e00f mov lr, pc
300100c0: e593f014 ldr pc, [r3, #20]
300100c4: e129f004 msr CPSR_fc, r4
300100c8: e8bd8010 pop {r4, pc}
3000ca48 <_Thread_Start>:
*/
RTEMS_INLINE_ROUTINE bool _States_Is_dormant (
States_Control the_states
)
{
return (the_states & STATES_DORMANT);
3000ca48: e590c010 ldr ip, [r0, #16]
Thread_Start_types the_prototype,
void *entry_point,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
3000ca4c: e92d4010 push {r4, lr}
if ( _States_Is_dormant( the_thread->current_state ) ) {
3000ca50: e21cc001 ands ip, ip, #1
Thread_Start_types the_prototype,
void *entry_point,
void *pointer_argument,
Thread_Entry_numeric_type numeric_argument
)
{
3000ca54: e1a04000 mov r4, r0
if ( _States_Is_dormant( the_thread->current_state ) ) {
3000ca58: 1a000001 bne 3000ca64 <_Thread_Start+0x1c>
_User_extensions_Thread_start( the_thread );
return true;
}
return false;
3000ca5c: e1a0000c mov r0, ip <== NOT EXECUTED
}
3000ca60: e8bd8010 pop {r4, pc} <== NOT EXECUTED
if ( _States_Is_dormant( the_thread->current_state ) ) {
the_thread->Start.entry_point = (Thread_Entry) entry_point;
the_thread->Start.prototype = the_prototype;
the_thread->Start.pointer_argument = pointer_argument;
3000ca64: e5803098 str r3, [r0, #152] ; 0x98
the_thread->Start.numeric_argument = numeric_argument;
3000ca68: e59d3008 ldr r3, [sp, #8]
Thread_Entry_numeric_type numeric_argument
)
{
if ( _States_Is_dormant( the_thread->current_state ) ) {
the_thread->Start.entry_point = (Thread_Entry) entry_point;
3000ca6c: e5802090 str r2, [r0, #144] ; 0x90
the_thread->Start.prototype = the_prototype;
3000ca70: e5801094 str r1, [r0, #148] ; 0x94
the_thread->Start.pointer_argument = pointer_argument;
the_thread->Start.numeric_argument = numeric_argument;
3000ca74: e580309c str r3, [r0, #156] ; 0x9c
_Thread_Load_environment( the_thread );
3000ca78: eb000b45 bl 3000f794 <_Thread_Load_environment>
_Thread_Ready( the_thread );
3000ca7c: e1a00004 mov r0, r4
3000ca80: eb000be6 bl 3000fa20 <_Thread_Ready>
_User_extensions_Thread_start( the_thread );
3000ca84: e1a00004 mov r0, r4
3000ca88: eb0000d4 bl 3000cde0 <_User_extensions_Thread_start>
return true;
3000ca8c: e3a00001 mov r0, #1
3000ca90: e8bd8010 pop {r4, pc}
30010424 <_Thread_Suspend>:
* select map
*/
void _Thread_Suspend(
Thread_Control *the_thread
)
{
30010424: e92d4010 push {r4, lr}
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
30010428: e10f4000 mrs r4, CPSR
3001042c: e3842080 orr r2, r4, #128 ; 0x80
30010430: e129f002 msr CPSR_fc, r2
ISR_Level level;
_ISR_Disable( level );
if ( !_States_Is_ready( the_thread->current_state ) ) {
30010434: e5902010 ldr r2, [r0, #16]
30010438: e3520000 cmp r2, #0
3001043c: 0a000003 beq 30010450 <_Thread_Suspend+0x2c>
RTEMS_INLINE_ROUTINE States_Control _States_Set (
States_Control states_to_set,
States_Control current_state
)
{
return (current_state | states_to_set);
30010440: e3822002 orr r2, r2, #2 <== NOT EXECUTED
the_thread->current_state =
30010444: e5802010 str r2, [r0, #16] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30010448: e129f004 msr CPSR_fc, r4 <== NOT EXECUTED
3001044c: e8bd8010 pop {r4, pc} <== NOT EXECUTED
_States_Set( STATES_SUSPENDED, the_thread->current_state );
_ISR_Enable( level );
return;
}
the_thread->current_state = STATES_SUSPENDED;
30010450: e3a02002 mov r2, #2
30010454: e5802010 str r2, [r0, #16]
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Block(
Thread_Control *the_thread
)
{
_Scheduler.Operations.block( the_thread );
30010458: e59f300c ldr r3, [pc, #12] ; 3001046c <_Thread_Suspend+0x48>
3001045c: e1a0e00f mov lr, pc
30010460: e593f010 ldr pc, [r3, #16]
30010464: e129f004 msr CPSR_fc, r4
30010468: e8bd8010 pop {r4, pc}
3000ca94 <_Thread_Tickle_timeslice>:
void _Thread_Tickle_timeslice( void )
{
Thread_Control *executing;
executing = _Thread_Executing;
3000ca94: e59f3058 ldr r3, [pc, #88] ; 3000caf4 <_Thread_Tickle_timeslice+0x60>
*
* Output parameters: NONE
*/
void _Thread_Tickle_timeslice( void )
{
3000ca98: e92d4010 push {r4, lr}
Thread_Control *executing;
executing = _Thread_Executing;
3000ca9c: e5934004 ldr r4, [r3, #4]
/*
* If the thread is not preemptible or is not ready, then
* just return.
*/
if ( !executing->is_preemptible )
3000caa0: e5d43074 ldrb r3, [r4, #116] ; 0x74
3000caa4: e3530000 cmp r3, #0
3000caa8: 08bd8010 popeq {r4, pc}
return;
if ( !_States_Is_ready( executing->current_state ) )
3000caac: e5943010 ldr r3, [r4, #16]
3000cab0: e3530000 cmp r3, #0
3000cab4: 18bd8010 popne {r4, pc}
/*
* The cpu budget algorithm determines what happens next.
*/
switch ( executing->budget_algorithm ) {
3000cab8: e594307c ldr r3, [r4, #124] ; 0x7c
3000cabc: e3530001 cmp r3, #1
3000cac0: 18bd8010 popne {r4, pc}
case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
#if defined(RTEMS_SCORE_THREAD_ENABLE_EXHAUST_TIMESLICE)
case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
#endif
if ( (int)(--executing->cpu_time_budget) <= 0 ) {
3000cac4: e5943078 ldr r3, [r4, #120] ; 0x78 <== NOT EXECUTED
3000cac8: e2433001 sub r3, r3, #1 <== NOT EXECUTED
3000cacc: e3530000 cmp r3, #0 <== NOT EXECUTED
3000cad0: e5843078 str r3, [r4, #120] ; 0x78 <== NOT EXECUTED
3000cad4: c8bd8010 popgt {r4, pc} <== NOT EXECUTED
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield();
3000cad8: e59f3018 ldr r3, [pc, #24] ; 3000caf8 <_Thread_Tickle_timeslice+0x64><== NOT EXECUTED
3000cadc: e1a0e00f mov lr, pc <== NOT EXECUTED
3000cae0: e593f00c ldr pc, [r3, #12] <== NOT EXECUTED
* executing thread's timeslice is reset. Otherwise, the
* currently executing thread is placed at the rear of the
* FIFO for this priority and a new heir is selected.
*/
_Scheduler_Yield( );
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
3000cae4: e59f3010 ldr r3, [pc, #16] ; 3000cafc <_Thread_Tickle_timeslice+0x68><== NOT EXECUTED
3000cae8: e5933000 ldr r3, [r3] <== NOT EXECUTED
3000caec: e5843078 str r3, [r4, #120] ; 0x78 <== NOT EXECUTED
3000caf0: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3000bbb8 <_Thread_blocking_operation_Cancel>:
Thread_blocking_operation_States sync_state __attribute__((unused)),
#endif
Thread_Control *the_thread,
ISR_Level level
)
{
3000bbb8: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
/*
* If the sync state is timed out, this is very likely not needed.
* But better safe than sorry when it comes to critical sections.
*/
if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
3000bbbc: e5913050 ldr r3, [r1, #80] ; 0x50 <== NOT EXECUTED
Thread_blocking_operation_States sync_state __attribute__((unused)),
#endif
Thread_Control *the_thread,
ISR_Level level
)
{
3000bbc0: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
/*
* If the sync state is timed out, this is very likely not needed.
* But better safe than sorry when it comes to critical sections.
*/
if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
3000bbc4: e3530002 cmp r3, #2 <== NOT EXECUTED
#endif
/*
* The thread is not waiting on anything after this completes.
*/
the_thread->Wait.queue = NULL;
3000bbc8: e3a03000 mov r3, #0 <== NOT EXECUTED
3000bbcc: e5813044 str r3, [r1, #68] ; 0x44 <== NOT EXECUTED
/*
* If the sync state is timed out, this is very likely not needed.
* But better safe than sorry when it comes to critical sections.
*/
if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
3000bbd0: 0a000005 beq 3000bbec <_Thread_blocking_operation_Cancel+0x34><== NOT EXECUTED
3000bbd4: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
3000bbd8: e1a00001 mov r0, r1 <== NOT EXECUTED
3000bbdc: e59f1028 ldr r1, [pc, #40] ; 3000bc0c <_Thread_blocking_operation_Cancel+0x54><== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
3000bbe0: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000bbe4: e49de004 pop {lr} ; (ldr lr, [sp], #4) <== NOT EXECUTED
3000bbe8: ea000048 b 3000bd10 <_Thread_Clear_state> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
3000bbec: e3a03003 mov r3, #3 <== NOT EXECUTED
3000bbf0: e5813050 str r3, [r1, #80] ; 0x50 <== NOT EXECUTED
3000bbf4: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
* But better safe than sorry when it comes to critical sections.
*/
if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
3000bbf8: e2810048 add r0, r1, #72 ; 0x48 <== NOT EXECUTED
3000bbfc: e58d1000 str r1, [sp] <== NOT EXECUTED
3000bc00: eb000508 bl 3000d028 <_Watchdog_Remove> <== NOT EXECUTED
3000bc04: e59d1000 ldr r1, [sp] <== NOT EXECUTED
3000bc08: eafffff2 b 3000bbd8 <_Thread_blocking_operation_Cancel+0x20><== NOT EXECUTED
3000f7e4 <_Thread_queue_Dequeue_fifo>:
*/
Thread_Control *_Thread_queue_Dequeue_fifo(
Thread_queue_Control *the_thread_queue
)
{
3000f7e4: e92d4030 push {r4, r5, lr}
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000f7e8: e10f2000 mrs r2, CPSR
3000f7ec: e3823080 orr r3, r2, #128 ; 0x80
3000f7f0: e129f003 msr CPSR_fc, r3
return the_thread;
}
_ISR_Enable( level );
return NULL;
}
3000f7f4: e1a03000 mov r3, r0
3000f7f8: e4934004 ldr r4, [r3], #4
{
ISR_Level level;
Thread_Control *the_thread;
_ISR_Disable( level );
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) {
3000f7fc: e1540003 cmp r4, r3
3000f800: 0a000018 beq 3000f868 <_Thread_queue_Dequeue_fifo+0x84>
the_thread = (Thread_Control *)
_Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo );
the_thread->Wait.queue = NULL;
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
3000f804: e5941050 ldr r1, [r4, #80] ; 0x50
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *old_first = head->next;
Chain_Node *new_first = old_first->next;
3000f808: e5943000 ldr r3, [r4]
3000f80c: e3510002 cmp r1, #2
head->next = new_first;
3000f810: e5803000 str r3, [r0]
new_first->previous = head;
3000f814: e5830004 str r0, [r3, #4]
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) {
the_thread = (Thread_Control *)
_Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo );
the_thread->Wait.queue = NULL;
3000f818: e3a03000 mov r3, #0
Thread_Control *the_thread;
_ISR_Disable( level );
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) {
the_thread = (Thread_Control *)
3000f81c: e1a05004 mov r5, r4
_Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo );
the_thread->Wait.queue = NULL;
3000f820: e5843044 str r3, [r4, #68] ; 0x44
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
3000f824: 0a000005 beq 3000f840 <_Thread_queue_Dequeue_fifo+0x5c>
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000f828: e129f002 msr CPSR_fc, r2
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
3000f82c: e59f1040 ldr r1, [pc, #64] ; 3000f874 <_Thread_queue_Dequeue_fifo+0x90>
3000f830: e1a00004 mov r0, r4
3000f834: ebfff135 bl 3000bd10 <_Thread_Clear_state>
return the_thread;
}
_ISR_Enable( level );
return NULL;
}
3000f838: e1a00005 mov r0, r5
3000f83c: e8bd8030 pop {r4, r5, pc}
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
3000f840: e3a03003 mov r3, #3 <== NOT EXECUTED
3000f844: e5843050 str r3, [r4, #80] ; 0x50 <== NOT EXECUTED
3000f848: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
3000f84c: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED
3000f850: ebfff5f4 bl 3000d028 <_Watchdog_Remove> <== NOT EXECUTED
3000f854: e1a00004 mov r0, r4 <== NOT EXECUTED
3000f858: e59f1014 ldr r1, [pc, #20] ; 3000f874 <_Thread_queue_Dequeue_fifo+0x90><== NOT EXECUTED
3000f85c: ebfff12b bl 3000bd10 <_Thread_Clear_state> <== NOT EXECUTED
return the_thread;
}
_ISR_Enable( level );
return NULL;
}
3000f860: e1a00005 mov r0, r5 <== NOT EXECUTED
3000f864: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
3000f868: e129f002 msr CPSR_fc, r2
return the_thread;
}
_ISR_Enable( level );
return NULL;
3000f86c: e3a05000 mov r5, #0
3000f870: eafffff0 b 3000f838 <_Thread_queue_Dequeue_fifo+0x54>
3000c3ec <_Thread_queue_Dequeue_priority>:
*/
Thread_Control *_Thread_queue_Dequeue_priority(
Thread_queue_Control *the_thread_queue
)
{
3000c3ec: e92d4030 push {r4, r5, lr}
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000c3f0: e10fc000 mrs ip, CPSR
3000c3f4: e38c3080 orr r3, ip, #128 ; 0x80
3000c3f8: e129f003 msr CPSR_fc, r3
Chain_Node *new_second_node;
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
3000c3fc: e3a02000 mov r2, #0
for( index=0 ;
3000c400: e1a03002 mov r3, r2
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
3000c404: e0831083 add r1, r3, r3, lsl #1
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
3000c408: e7904002 ldr r4, [r0, r2]
3000c40c: e0801101 add r1, r0, r1, lsl #2
3000c410: e2811004 add r1, r1, #4
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
3000c414: e1540001 cmp r4, r1
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
3000c418: e2833001 add r3, r3, #1
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
3000c41c: 1a000006 bne 3000c43c <_Thread_queue_Dequeue_priority+0x50>
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
3000c420: e3530004 cmp r3, #4
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
3000c424: e282200c add r2, r2, #12
Chain_Node *last_node;
Chain_Node *next_node;
Chain_Node *previous_node;
_ISR_Disable( level );
for( index=0 ;
3000c428: 1afffff5 bne 3000c404 <_Thread_queue_Dequeue_priority+0x18>
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000c42c: e129f00c msr CPSR_fc, ip
/*
* We did not find a thread to unblock.
*/
_ISR_Enable( level );
return NULL;
3000c430: e3a05000 mov r5, #0
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
3000c434: e1a00005 mov r0, r5
3000c438: e8bd8030 pop {r4, r5, pc}
3000c43c: e5943038 ldr r3, [r4, #56] ; 0x38
3000c440: e284203c add r2, r4, #60 ; 0x3c
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
next_node = the_thread->Object.Node.next;
previous_node = the_thread->Object.Node.previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
3000c444: e1530002 cmp r3, r2
*/
_ISR_Enable( level );
return NULL;
dequeue:
the_thread->Wait.queue = NULL;
3000c448: e3a02000 mov r2, #0
3000c44c: e5842044 str r2, [r4, #68] ; 0x44
_ISR_Disable( level );
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
the_thread = (Thread_Control *) _Chain_First(
3000c450: e1a05004 mov r5, r4
dequeue:
the_thread->Wait.queue = NULL;
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
next_node = the_thread->Object.Node.next;
3000c454: e5942000 ldr r2, [r4]
previous_node = the_thread->Object.Node.previous;
3000c458: e5941004 ldr r1, [r4, #4]
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
3000c45c: 0a000020 beq 3000c4e4 <_Thread_queue_Dequeue_priority+0xf8>
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
return( the_thread );
}
3000c460: e5940040 ldr r0, [r4, #64] ; 0x40 <== NOT EXECUTED
next_node = the_thread->Object.Node.next;
previous_node = the_thread->Object.Node.previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
3000c464: e593e000 ldr lr, [r3] <== NOT EXECUTED
previous_node->next = new_first_node;
next_node->previous = new_first_node;
3000c468: e5823004 str r3, [r2, #4] <== NOT EXECUTED
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
previous_node->next = new_first_node;
3000c46c: e5813000 str r3, [r1] <== NOT EXECUTED
next_node->previous = new_first_node;
new_first_node->next = next_node;
new_first_node->previous = previous_node;
3000c470: e5831004 str r1, [r3, #4] <== NOT EXECUTED
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
previous_node->next = new_first_node;
next_node->previous = new_first_node;
new_first_node->next = next_node;
3000c474: e5832000 str r2, [r3] <== NOT EXECUTED
new_first_node->previous = previous_node;
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
3000c478: e5941038 ldr r1, [r4, #56] ; 0x38 <== NOT EXECUTED
3000c47c: e5942040 ldr r2, [r4, #64] ; 0x40 <== NOT EXECUTED
3000c480: e1510002 cmp r1, r2 <== NOT EXECUTED
3000c484: 0a000005 beq 3000c4a0 <_Thread_queue_Dequeue_priority+0xb4><== NOT EXECUTED
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
3000c488: e2831038 add r1, r3, #56 ; 0x38 <== NOT EXECUTED
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
3000c48c: e283203c add r2, r3, #60 ; 0x3c <== NOT EXECUTED
new_second_node->previous = head;
3000c490: e58e1004 str r1, [lr, #4] <== NOT EXECUTED
head->next = new_second_node;
3000c494: e583e038 str lr, [r3, #56] ; 0x38 <== NOT EXECUTED
tail->previous = last_node;
3000c498: e5830040 str r0, [r3, #64] ; 0x40 <== NOT EXECUTED
last_node->next = tail;
3000c49c: e5802000 str r2, [r0] <== NOT EXECUTED
} else {
previous_node->next = next_node;
next_node->previous = previous_node;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
3000c4a0: e5943050 ldr r3, [r4, #80] ; 0x50
3000c4a4: e3530002 cmp r3, #2
3000c4a8: 0a000004 beq 3000c4c0 <_Thread_queue_Dequeue_priority+0xd4>
3000c4ac: e129f00c msr CPSR_fc, ip
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
3000c4b0: e59f1038 ldr r1, [pc, #56] ; 3000c4f0 <_Thread_queue_Dequeue_priority+0x104>
3000c4b4: e1a00004 mov r0, r4
3000c4b8: ebfffe14 bl 3000bd10 <_Thread_Clear_state>
3000c4bc: eaffffdc b 3000c434 <_Thread_queue_Dequeue_priority+0x48>
RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_REMOVE_IT;
3000c4c0: e3a03003 mov r3, #3 <== NOT EXECUTED
3000c4c4: e5843050 str r3, [r4, #80] ; 0x50 <== NOT EXECUTED
3000c4c8: e129f00c msr CPSR_fc, ip <== NOT EXECUTED
_ISR_Enable( level );
_Thread_Unblock( the_thread );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
3000c4cc: e2840048 add r0, r4, #72 ; 0x48 <== NOT EXECUTED
3000c4d0: eb0002d4 bl 3000d028 <_Watchdog_Remove> <== NOT EXECUTED
3000c4d4: e1a00004 mov r0, r4 <== NOT EXECUTED
3000c4d8: e59f1010 ldr r1, [pc, #16] ; 3000c4f0 <_Thread_queue_Dequeue_priority+0x104><== NOT EXECUTED
3000c4dc: ebfffe0b bl 3000bd10 <_Thread_Clear_state> <== NOT EXECUTED
3000c4e0: eaffffd3 b 3000c434 <_Thread_queue_Dequeue_priority+0x48> <== NOT EXECUTED
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
3000c4e4: e5812000 str r2, [r1]
next_node->previous = previous_node;
3000c4e8: e5821004 str r1, [r2, #4]
3000c4ec: eaffffeb b 3000c4a0 <_Thread_queue_Dequeue_priority+0xb4>
3000c5a0 <_Thread_queue_Enqueue_priority>:
Priority_Control priority;
States_Control block_state;
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
3000c5a0: e5913014 ldr r3, [r1, #20]
Thread_blocking_operation_States _Thread_queue_Enqueue_priority (
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread,
ISR_Level *level_p
)
{
3000c5a4: e92d05f0 push {r4, r5, r6, r7, r8, sl}
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 );
3000c5a8: e281403c add r4, r1, #60 ; 0x3c
*/
RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
Chain_Control *the_chain
)
{
Chain_Node *head = _Chain_Head( the_chain );
3000c5ac: e281c038 add ip, r1, #56 ; 0x38
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
3000c5b0: e5814038 str r4, [r1, #56] ; 0x38
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 ) )
3000c5b4: e3130020 tst r3, #32
head->previous = NULL;
3000c5b8: e3a04000 mov r4, #0
3000c5bc: e581403c str r4, [r1, #60] ; 0x3c
tail->previous = head;
3000c5c0: e581c040 str ip, [r1, #64] ; 0x40
RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number (
Priority_Control the_priority
)
{
return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
3000c5c4: e1a07323 lsr r7, r3, #6
_Chain_Initialize_empty( &the_thread->Wait.Block2n );
priority = the_thread->current_priority;
header_index = _Thread_queue_Header_number( priority );
header = &the_thread_queue->Queues.Priority[ header_index ];
block_state = the_thread_queue->state;
3000c5c8: e5905038 ldr r5, [r0, #56] ; 0x38
if ( _Thread_queue_Is_reverse_search( priority ) )
3000c5cc: 1a00001e bne 3000c64c <_Thread_queue_Enqueue_priority+0xac>
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
3000c5d0: e0877087 add r7, r7, r7, lsl #1
3000c5d4: e1a0c107 lsl ip, r7, #2
RTEMS_INLINE_ROUTINE bool _Chain_Is_tail(
Chain_Control *the_chain,
const Chain_Node *the_node
)
{
return (the_node == _Chain_Tail(the_chain));
3000c5d8: e28c7004 add r7, ip, #4
3000c5dc: e080a00c add sl, r0, ip
3000c5e0: e0807007 add r7, r0, r7
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000c5e4: e10f8000 mrs r8, CPSR
3000c5e8: e388c080 orr ip, r8, #128 ; 0x80
3000c5ec: e129f00c msr CPSR_fc, ip
3000c5f0: e59ac000 ldr ip, [sl]
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 ) ) {
3000c5f4: e15c0007 cmp ip, r7
3000c5f8: 1a000009 bne 3000c624 <_Thread_queue_Enqueue_priority+0x84>
3000c5fc: ea000051 b 3000c748 <_Thread_queue_Enqueue_priority+0x1a8>
static inline void arm_interrupt_flash( uint32_t level )
{
uint32_t arm_switch_reg;
__asm__ volatile (
3000c600: e10f6000 mrs r6, CPSR
3000c604: e129f008 msr CPSR_fc, r8
3000c608: e129f006 msr CPSR_fc, r6
RTEMS_INLINE_ROUTINE bool _States_Are_set (
States_Control the_states,
States_Control mask
)
{
return ( (the_states & mask) != STATES_READY);
3000c60c: e59c6010 ldr r6, [ip, #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) ) {
3000c610: e1150006 tst r5, r6
3000c614: 0a000034 beq 3000c6ec <_Thread_queue_Enqueue_priority+0x14c>
_ISR_Enable( level );
goto restart_forward_search;
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
3000c618: e59cc000 ldr ip, [ip]
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 ) ) {
3000c61c: e15c0007 cmp ip, r7
3000c620: 0a000002 beq 3000c630 <_Thread_queue_Enqueue_priority+0x90>
search_priority = search_thread->current_priority;
3000c624: e59c4014 ldr r4, [ip, #20]
if ( priority <= search_priority )
3000c628: e1530004 cmp r3, r4
3000c62c: 8afffff3 bhi 3000c600 <_Thread_queue_Enqueue_priority+0x60>
}
search_thread =
(Thread_Control *)search_thread->Object.Node.next;
}
if ( the_thread_queue->sync_state !=
3000c630: e5905030 ldr r5, [r0, #48] ; 0x30
3000c634: e3550001 cmp r5, #1
3000c638: 0a00002d beq 3000c6f4 <_Thread_queue_Enqueue_priority+0x154>
* 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;
3000c63c: e5828000 str r8, [r2] <== NOT EXECUTED
return the_thread_queue->sync_state;
}
3000c640: e1a00005 mov r0, r5
3000c644: e8bd05f0 pop {r4, r5, r6, r7, r8, sl}
3000c648: e12fff1e bx lr
3000c64c: e0877087 add r7, r7, r7, lsl #1
3000c650: e59fa0f8 ldr sl, [pc, #248] ; 3000c750 <_Thread_queue_Enqueue_priority+0x1b0>
3000c654: e0807107 add r7, r0, r7, lsl #2
the_thread->Wait.queue = the_thread_queue;
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
3000c658: e5da4000 ldrb r4, [sl]
3000c65c: e2844001 add r4, r4, #1
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000c660: e10f8000 mrs r8, CPSR
3000c664: e388c080 orr ip, r8, #128 ; 0x80
3000c668: e129f00c msr CPSR_fc, ip
*
* WARNING! Returning with interrupts disabled!
*/
*level_p = level;
return the_thread_queue->sync_state;
}
3000c66c: e597c008 ldr ip, [r7, #8]
restart_reverse_search:
search_priority = PRIORITY_MAXIMUM + 1;
_ISR_Disable( level );
search_thread = (Thread_Control *) _Chain_Last( header );
while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
3000c670: e15c0007 cmp ip, r7
3000c674: 1a000009 bne 3000c6a0 <_Thread_queue_Enqueue_priority+0x100>
3000c678: ea00000b b 3000c6ac <_Thread_queue_Enqueue_priority+0x10c>
static inline void arm_interrupt_flash( uint32_t level )
{
uint32_t arm_switch_reg;
__asm__ volatile (
3000c67c: e10f6000 mrs r6, CPSR <== NOT EXECUTED
3000c680: e129f008 msr CPSR_fc, r8 <== NOT EXECUTED
3000c684: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
3000c688: e59c6010 ldr r6, [ip, #16] <== NOT EXECUTED
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) ) {
3000c68c: e1150006 tst r5, r6 <== NOT EXECUTED
3000c690: 0a000013 beq 3000c6e4 <_Thread_queue_Enqueue_priority+0x144><== NOT EXECUTED
_ISR_Enable( level );
goto restart_reverse_search;
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
3000c694: e59cc004 ldr ip, [ip, #4] <== NOT EXECUTED
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 ) ) {
3000c698: e15c0007 cmp ip, r7 <== NOT EXECUTED
3000c69c: 0a000002 beq 3000c6ac <_Thread_queue_Enqueue_priority+0x10c><== NOT EXECUTED
search_priority = search_thread->current_priority;
3000c6a0: e59c4014 ldr r4, [ip, #20]
if ( priority >= search_priority )
3000c6a4: e1530004 cmp r3, r4
3000c6a8: 3afffff3 bcc 3000c67c <_Thread_queue_Enqueue_priority+0xdc>
}
search_thread = (Thread_Control *)
search_thread->Object.Node.previous;
}
if ( the_thread_queue->sync_state !=
3000c6ac: e5905030 ldr r5, [r0, #48] ; 0x30
3000c6b0: e3550001 cmp r5, #1
3000c6b4: 1affffe0 bne 3000c63c <_Thread_queue_Enqueue_priority+0x9c>
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( priority == search_priority )
3000c6b8: e1530004 cmp r3, r4
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
3000c6bc: e3a03000 mov r3, #0
3000c6c0: e5803030 str r3, [r0, #48] ; 0x30
if ( priority == search_priority )
3000c6c4: 0a000016 beq 3000c724 <_Thread_queue_Enqueue_priority+0x184>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
next_node = search_node->next;
3000c6c8: e59c3000 ldr r3, [ip]
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
the_node->previous = search_node;
3000c6cc: e8811008 stm r1, {r3, ip}
search_node->next = the_node;
next_node->previous = the_node;
3000c6d0: e5831004 str r1, [r3, #4]
next_node = search_node->next;
the_node = (Chain_Node *) the_thread;
the_node->next = next_node;
the_node->previous = search_node;
search_node->next = the_node;
3000c6d4: e58c1000 str r1, [ip]
next_node->previous = the_node;
the_thread->Wait.queue = the_thread_queue;
3000c6d8: e5810044 str r0, [r1, #68] ; 0x44
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000c6dc: e129f008 msr CPSR_fc, r8
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
3000c6e0: eaffffd6 b 3000c640 <_Thread_queue_Enqueue_priority+0xa0>
3000c6e4: e129f008 msr CPSR_fc, r8 <== NOT EXECUTED
3000c6e8: eaffffda b 3000c658 <_Thread_queue_Enqueue_priority+0xb8> <== NOT EXECUTED
3000c6ec: e129f008 msr CPSR_fc, r8 <== NOT EXECUTED
3000c6f0: eaffffbb b 3000c5e4 <_Thread_queue_Enqueue_priority+0x44> <== NOT EXECUTED
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
if ( priority == search_priority )
3000c6f4: e1530004 cmp r3, r4
if ( the_thread_queue->sync_state !=
THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED )
goto synchronize;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED;
3000c6f8: e3a03000 mov r3, #0
3000c6fc: e5803030 str r3, [r0, #48] ; 0x30
if ( priority == search_priority )
3000c700: 0a000007 beq 3000c724 <_Thread_queue_Enqueue_priority+0x184>
goto equal_priority;
search_node = (Chain_Node *) search_thread;
previous_node = search_node->previous;
3000c704: e59c3004 ldr r3, [ip, #4]
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
3000c708: e581c000 str ip, [r1]
the_node->previous = previous_node;
3000c70c: e5813004 str r3, [r1, #4]
previous_node->next = the_node;
3000c710: e5831000 str r1, [r3]
search_node->previous = the_node;
3000c714: e58c1004 str r1, [ip, #4]
the_thread->Wait.queue = the_thread_queue;
3000c718: e5810044 str r0, [r1, #68] ; 0x44
3000c71c: e129f008 msr CPSR_fc, r8
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
3000c720: eaffffc6 b 3000c640 <_Thread_queue_Enqueue_priority+0xa0>
_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;
3000c724: e59c3040 ldr r3, [ip, #64] ; 0x40 <== NOT EXECUTED
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 );
3000c728: e28c203c add r2, ip, #60 ; 0x3c <== NOT EXECUTED
previous_node = search_node->previous;
the_node = (Chain_Node *) the_thread;
the_node->next = search_node;
3000c72c: e881000c stm r1, {r2, r3} <== NOT EXECUTED
the_node->previous = previous_node;
previous_node->next = the_node;
3000c730: e5831000 str r1, [r3] <== NOT EXECUTED
search_node->previous = the_node;
3000c734: e58c1040 str r1, [ip, #64] ; 0x40 <== NOT EXECUTED
the_thread->Wait.queue = the_thread_queue;
3000c738: e5810044 str r0, [r1, #68] ; 0x44 <== NOT EXECUTED
3000c73c: e129f008 msr CPSR_fc, r8 <== NOT EXECUTED
_ISR_Enable( level );
return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
3000c740: e3a05001 mov r5, #1 <== NOT EXECUTED
3000c744: eaffffbd b 3000c640 <_Thread_queue_Enqueue_priority+0xa0> <== NOT EXECUTED
if ( _Thread_queue_Is_reverse_search( priority ) )
goto restart_reverse_search;
restart_forward_search:
search_priority = PRIORITY_MINIMUM - 1;
3000c748: e3e04000 mvn r4, #0
3000c74c: eaffffb7 b 3000c630 <_Thread_queue_Enqueue_priority+0x90>
30011048 <_Thread_queue_Extract_fifo>:
void _Thread_queue_Extract_fifo(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread
)
{
30011048: e52de004 push {lr} ; (str lr, [sp, #-4]!)
3001104c: e24dd004 sub sp, sp, #4
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
30011050: e10f0000 mrs r0, CPSR
30011054: e3803080 orr r3, r0, #128 ; 0x80
30011058: e129f003 msr CPSR_fc, r3
3001105c: e59f3070 ldr r3, [pc, #112] ; 300110d4 <_Thread_queue_Extract_fifo+0x8c>
30011060: e5912010 ldr r2, [r1, #16]
30011064: e0023003 and r3, r2, r3
ISR_Level level;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
30011068: e3530000 cmp r3, #0
3001106c: 0a00000d beq 300110a8 <_Thread_queue_Extract_fifo+0x60>
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
30011070: e591c050 ldr ip, [r1, #80] ; 0x50
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
30011074: e891000c ldm r1, {r2, r3}
30011078: e35c0002 cmp ip, #2
next->previous = previous;
3001107c: e5823004 str r3, [r2, #4]
previous->next = next;
30011080: e5832000 str r2, [r3]
return;
}
_Chain_Extract_unprotected( &the_thread->Object.Node );
the_thread->Wait.queue = NULL;
30011084: e3a03000 mov r3, #0
30011088: e5813044 str r3, [r1, #68] ; 0x44
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
3001108c: 0a000008 beq 300110b4 <_Thread_queue_Extract_fifo+0x6c>
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30011090: e129f000 msr CPSR_fc, r0
RTEMS_INLINE_ROUTINE void _Thread_Unblock (
Thread_Control *the_thread
)
{
_Thread_Clear_state( the_thread, STATES_BLOCKED );
30011094: e1a00001 mov r0, r1
30011098: e59f1038 ldr r1, [pc, #56] ; 300110d8 <_Thread_queue_Extract_fifo+0x90>
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
3001109c: e28dd004 add sp, sp, #4
300110a0: e49de004 pop {lr} ; (ldr lr, [sp], #4)
300110a4: eaffeb19 b 3000bd10 <_Thread_Clear_state>
300110a8: e129f000 msr CPSR_fc, r0
300110ac: e28dd004 add sp, sp, #4
300110b0: e8bd8000 pop {pc}
300110b4: e3a03003 mov r3, #3 <== NOT EXECUTED
300110b8: e5813050 str r3, [r1, #80] ; 0x50 <== NOT EXECUTED
300110bc: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
300110c0: e2810048 add r0, r1, #72 ; 0x48 <== NOT EXECUTED
300110c4: e58d1000 str r1, [sp] <== NOT EXECUTED
300110c8: ebffefd6 bl 3000d028 <_Watchdog_Remove> <== NOT EXECUTED
300110cc: e59d1000 ldr r1, [sp] <== NOT EXECUTED
300110d0: eaffffef b 30011094 <_Thread_queue_Extract_fifo+0x4c> <== NOT EXECUTED
3000f8e8 <_Thread_queue_Extract_priority_helper>:
void _Thread_queue_Extract_priority_helper(
Thread_queue_Control *the_thread_queue __attribute__((unused)),
Thread_Control *the_thread,
bool requeuing
)
{
3000f8e8: e92d4070 push {r4, r5, r6, lr}
3000f8ec: e20220ff and r2, r2, #255 ; 0xff
3000f8f0: e24dd004 sub sp, sp, #4
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000f8f4: e10fc000 mrs ip, CPSR
3000f8f8: e38c3080 orr r3, ip, #128 ; 0x80
3000f8fc: e129f003 msr CPSR_fc, r3
*/
RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue (
States_Control the_states
)
{
return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
3000f900: e59f30c4 ldr r3, [pc, #196] ; 3000f9cc <_Thread_queue_Extract_priority_helper+0xe4>
3000f904: e5910010 ldr r0, [r1, #16]
3000f908: e0003003 and r3, r0, r3
Chain_Node *new_second_node;
Chain_Node *last_node;
the_node = (Chain_Node *) the_thread;
_ISR_Disable( level );
if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
3000f90c: e3530000 cmp r3, #0
3000f910: 0a000023 beq 3000f9a4 <_Thread_queue_Extract_priority_helper+0xbc>
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
3000f914: e5913038 ldr r3, [r1, #56] ; 0x38 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
3000f918: e281003c add r0, r1, #60 ; 0x3c <== NOT EXECUTED
*/
next_node = the_node->next;
previous_node = the_node->previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
3000f91c: e1530000 cmp r3, r0 <== NOT EXECUTED
/*
* The thread was actually waiting on a thread queue so let's remove it.
*/
next_node = the_node->next;
previous_node = the_node->previous;
3000f920: e8910011 ldm r1, {r0, r4} <== NOT EXECUTED
head->next = new_second_node;
tail->previous = last_node;
last_node->next = tail;
}
} else {
previous_node->next = next_node;
3000f924: 05840000 streq r0, [r4] <== NOT EXECUTED
next_node->previous = previous_node;
3000f928: 05804004 streq r4, [r0, #4] <== NOT EXECUTED
*/
next_node = the_node->next;
previous_node = the_node->previous;
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
3000f92c: 0a00000e beq 3000f96c <_Thread_queue_Extract_priority_helper+0x84><== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
3000f930: e5915040 ldr r5, [r1, #64] ; 0x40 <== NOT EXECUTED
if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
3000f934: e5936000 ldr r6, [r3] <== NOT EXECUTED
previous_node->next = new_first_node;
next_node->previous = new_first_node;
3000f938: e5803004 str r3, [r0, #4] <== NOT EXECUTED
new_first_node = _Chain_First( &the_thread->Wait.Block2n );
new_first_thread = (Thread_Control *) new_first_node;
last_node = _Chain_Last( &the_thread->Wait.Block2n );
new_second_node = new_first_node->next;
previous_node->next = new_first_node;
3000f93c: e5843000 str r3, [r4] <== NOT EXECUTED
next_node->previous = new_first_node;
new_first_node->next = next_node;
new_first_node->previous = previous_node;
3000f940: e8830011 stm r3, {r0, r4} <== NOT EXECUTED
if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
3000f944: e5914038 ldr r4, [r1, #56] ; 0x38 <== NOT EXECUTED
3000f948: e5910040 ldr r0, [r1, #64] ; 0x40 <== NOT EXECUTED
3000f94c: e1540000 cmp r4, r0 <== NOT EXECUTED
3000f950: 0a000005 beq 3000f96c <_Thread_queue_Extract_priority_helper+0x84><== NOT EXECUTED
/* > two threads on 2-n */
head = _Chain_Head( &new_first_thread->Wait.Block2n );
3000f954: e2834038 add r4, r3, #56 ; 0x38 <== NOT EXECUTED
tail = _Chain_Tail( &new_first_thread->Wait.Block2n );
3000f958: e283003c add r0, r3, #60 ; 0x3c <== NOT EXECUTED
new_second_node->previous = head;
3000f95c: e5864004 str r4, [r6, #4] <== NOT EXECUTED
head->next = new_second_node;
3000f960: e5836038 str r6, [r3, #56] ; 0x38 <== NOT EXECUTED
tail->previous = last_node;
3000f964: e5835040 str r5, [r3, #64] ; 0x40 <== NOT EXECUTED
last_node->next = tail;
3000f968: e5850000 str r0, [r5] <== NOT EXECUTED
/*
* If we are not supposed to touch timers or the thread's state, return.
*/
if ( requeuing ) {
3000f96c: e3520000 cmp r2, #0 <== NOT EXECUTED
3000f970: 1a000008 bne 3000f998 <_Thread_queue_Extract_priority_helper+0xb0><== NOT EXECUTED
_ISR_Enable( level );
return;
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
3000f974: e5913050 ldr r3, [r1, #80] ; 0x50 <== NOT EXECUTED
3000f978: e3530002 cmp r3, #2 <== NOT EXECUTED
3000f97c: 0a00000a beq 3000f9ac <_Thread_queue_Extract_priority_helper+0xc4><== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000f980: e129f00c msr CPSR_fc, ip <== NOT EXECUTED
3000f984: e1a00001 mov r0, r1 <== NOT EXECUTED
3000f988: e59f1040 ldr r1, [pc, #64] ; 3000f9d0 <_Thread_queue_Extract_priority_helper+0xe8><== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
_Thread_MP_Free_proxy( the_thread );
#endif
}
3000f98c: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000f990: e8bd4070 pop {r4, r5, r6, lr} <== NOT EXECUTED
3000f994: eafff0dd b 3000bd10 <_Thread_Clear_state> <== NOT EXECUTED
3000f998: e129f00c msr CPSR_fc, ip <== NOT EXECUTED
3000f99c: e28dd004 add sp, sp, #4
3000f9a0: e8bd8070 pop {r4, r5, r6, pc}
3000f9a4: e129f00c msr CPSR_fc, ip
3000f9a8: eafffffb b 3000f99c <_Thread_queue_Extract_priority_helper+0xb4>
3000f9ac: e3a03003 mov r3, #3 <== NOT EXECUTED
3000f9b0: e5813050 str r3, [r1, #80] ; 0x50 <== NOT EXECUTED
3000f9b4: e129f00c msr CPSR_fc, ip <== NOT EXECUTED
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );
} else {
_Watchdog_Deactivate( &the_thread->Timer );
_ISR_Enable( level );
(void) _Watchdog_Remove( &the_thread->Timer );
3000f9b8: e2810048 add r0, r1, #72 ; 0x48 <== NOT EXECUTED
3000f9bc: e58d1000 str r1, [sp] <== NOT EXECUTED
3000f9c0: ebfff598 bl 3000d028 <_Watchdog_Remove> <== NOT EXECUTED
3000f9c4: e59d1000 ldr r1, [sp] <== NOT EXECUTED
3000f9c8: eaffffed b 3000f984 <_Thread_queue_Extract_priority_helper+0x9c><== NOT EXECUTED
30021438 <_Thread_queue_First_priority>:
*/
Thread_Control *_Thread_queue_First_priority (
Thread_queue_Control *the_thread_queue
)
{
30021438: e3a03000 mov r3, #0 <== NOT EXECUTED
uint32_t index;
for( index=0 ;
3002143c: e1a02003 mov r2, r3 <== NOT EXECUTED
30021440: e082c082 add ip, r2, r2, lsl #1 <== NOT EXECUTED
return (Thread_Control *) _Chain_First(
&the_thread_queue->Queues.Priority[ index ]
);
}
return NULL;
}
30021444: e7901003 ldr r1, [r0, r3] <== NOT EXECUTED
30021448: e080c10c add ip, r0, ip, lsl #2 <== NOT EXECUTED
3002144c: e28cc004 add ip, ip, #4 <== NOT EXECUTED
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) )
30021450: e151000c cmp r1, ip <== NOT EXECUTED
{
uint32_t index;
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
30021454: e2822001 add r2, r2, #1 <== NOT EXECUTED
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) )
30021458: 1a000004 bne 30021470 <_Thread_queue_First_priority+0x38> <== NOT EXECUTED
Thread_queue_Control *the_thread_queue
)
{
uint32_t index;
for( index=0 ;
3002145c: e3520004 cmp r2, #4 <== NOT EXECUTED
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
30021460: e283300c add r3, r3, #12 <== NOT EXECUTED
Thread_queue_Control *the_thread_queue
)
{
uint32_t index;
for( index=0 ;
30021464: 1afffff5 bne 30021440 <_Thread_queue_First_priority+0x8> <== NOT EXECUTED
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) )
return (Thread_Control *) _Chain_First(
&the_thread_queue->Queues.Priority[ index ]
);
}
return NULL;
30021468: e3a00000 mov r0, #0 <== NOT EXECUTED
}
3002146c: e12fff1e bx lr <== NOT EXECUTED
for( index=0 ;
index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
index++ ) {
if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) )
return (Thread_Control *) _Chain_First(
30021470: e1a00001 mov r0, r1 <== NOT EXECUTED
30021474: e12fff1e bx lr <== NOT EXECUTED
3000f9d4 <_Thread_queue_Process_timeout>:
#include <rtems/score/tqdata.h>
void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
3000f9d4: e1a01000 mov r1, r0 <== NOT EXECUTED
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
3000f9d8: e5900044 ldr r0, [r0, #68] ; 0x44 <== NOT EXECUTED
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
3000f9dc: e5903030 ldr r3, [r0, #48] ; 0x30 <== NOT EXECUTED
3000f9e0: e3530000 cmp r3, #0 <== NOT EXECUTED
3000f9e4: 0a000003 beq 3000f9f8 <_Thread_queue_Process_timeout+0x24> <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
3000f9e8: e59f202c ldr r2, [pc, #44] ; 3000fa1c <_Thread_queue_Process_timeout+0x48><== NOT EXECUTED
3000f9ec: e5922004 ldr r2, [r2, #4] <== NOT EXECUTED
3000f9f0: e1510002 cmp r1, r2 <== NOT EXECUTED
3000f9f4: 0a000002 beq 3000fa04 <_Thread_queue_Process_timeout+0x30> <== NOT EXECUTED
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
}
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
3000f9f8: e590303c ldr r3, [r0, #60] ; 0x3c <== NOT EXECUTED
3000f9fc: e5813034 str r3, [r1, #52] ; 0x34 <== NOT EXECUTED
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
3000fa00: eaffffb2 b 3000f8d0 <_Thread_queue_Extract> <== NOT EXECUTED
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED &&
_Thread_Is_executing( the_thread ) ) {
if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) {
3000fa04: e3530003 cmp r3, #3 <== NOT EXECUTED
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
3000fa08: 1590303c ldrne r3, [r0, #60] ; 0x3c <== NOT EXECUTED
3000fa0c: 15813034 strne r3, [r1, #52] ; 0x34 <== NOT EXECUTED
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT;
3000fa10: 13a03002 movne r3, #2 <== NOT EXECUTED
3000fa14: 15803030 strne r3, [r0, #48] ; 0x30 <== NOT EXECUTED
3000fa18: e12fff1e bx lr <== NOT EXECUTED
3000c818 <_Thread_queue_Requeue>:
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
3000c818: e92d4070 push {r4, r5, r6, lr} <== NOT EXECUTED
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
3000c81c: e2504000 subs r4, r0, #0 <== NOT EXECUTED
void _Thread_queue_Requeue(
Thread_queue_Control *the_thread_queue,
Thread_Control *the_thread
)
{
3000c820: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3000c824: e1a05001 mov r5, r1 <== NOT EXECUTED
/*
* Just in case the thread really wasn't blocked on a thread queue
* when we get here.
*/
if ( !the_thread_queue )
3000c828: 0a000002 beq 3000c838 <_Thread_queue_Requeue+0x20> <== NOT EXECUTED
/*
* If queueing by FIFO, there is nothing to do. This only applies to
* priority blocking discipline.
*/
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
3000c82c: e5943034 ldr r3, [r4, #52] ; 0x34 <== NOT EXECUTED
3000c830: e3530001 cmp r3, #1 <== NOT EXECUTED
3000c834: 0a000001 beq 3000c840 <_Thread_queue_Requeue+0x28> <== NOT EXECUTED
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
}
_ISR_Enable( level );
}
}
3000c838: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000c83c: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000c840: e10f6000 mrs r6, CPSR <== NOT EXECUTED
3000c844: e3862080 orr r2, r6, #128 ; 0x80 <== NOT EXECUTED
3000c848: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
3000c84c: e59f2034 ldr r2, [pc, #52] ; 3000c888 <_Thread_queue_Requeue+0x70><== NOT EXECUTED
3000c850: e591c010 ldr ip, [r1, #16] <== NOT EXECUTED
3000c854: e00c2002 and r2, ip, r2 <== NOT EXECUTED
Thread_queue_Control *tq = the_thread_queue;
ISR_Level level;
ISR_Level level_ignored;
_ISR_Disable( level );
if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
3000c858: e3520000 cmp r2, #0 <== NOT EXECUTED
3000c85c: 1a000001 bne 3000c868 <_Thread_queue_Requeue+0x50> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000c860: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
3000c864: eafffff3 b 3000c838 <_Thread_queue_Requeue+0x20> <== NOT EXECUTED
_Thread_queue_Enter_critical_section( tq );
_Thread_queue_Extract_priority_helper( tq, the_thread, true );
3000c868: e1a02003 mov r2, r3 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
3000c86c: e5843030 str r3, [r4, #48] ; 0x30 <== NOT EXECUTED
3000c870: eb000c1c bl 3000f8e8 <_Thread_queue_Extract_priority_helper><== NOT EXECUTED
(void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored );
3000c874: e1a00004 mov r0, r4 <== NOT EXECUTED
3000c878: e1a01005 mov r1, r5 <== NOT EXECUTED
3000c87c: e1a0200d mov r2, sp <== NOT EXECUTED
3000c880: ebffff46 bl 3000c5a0 <_Thread_queue_Enqueue_priority> <== NOT EXECUTED
3000c884: eafffff5 b 3000c860 <_Thread_queue_Requeue+0x48> <== NOT EXECUTED
3000c88c <_Thread_queue_Timeout>:
void _Thread_queue_Timeout(
Objects_Id id,
void *ignored __attribute__((unused))
)
{
3000c88c: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
3000c890: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
3000c894: e1a0100d mov r1, sp <== NOT EXECUTED
3000c898: ebfffe02 bl 3000c0a8 <_Thread_Get> <== NOT EXECUTED
switch ( location ) {
3000c89c: e59d3000 ldr r3, [sp] <== NOT EXECUTED
3000c8a0: e3530000 cmp r3, #0 <== NOT EXECUTED
3000c8a4: 1a000004 bne 3000c8bc <_Thread_queue_Timeout+0x30> <== NOT EXECUTED
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE: /* impossible */
#endif
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
3000c8a8: eb000c49 bl 3000f9d4 <_Thread_queue_Process_timeout> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
{
RTEMS_COMPILER_MEMORY_BARRIER();
_Thread_Dispatch_disable_level -= 1;
3000c8ac: e59f3010 ldr r3, [pc, #16] ; 3000c8c4 <_Thread_queue_Timeout+0x38><== NOT EXECUTED
3000c8b0: e5932000 ldr r2, [r3] <== NOT EXECUTED
3000c8b4: e2422001 sub r2, r2, #1 <== NOT EXECUTED
3000c8b8: e5832000 str r2, [r3] <== NOT EXECUTED
_Thread_Unnest_dispatch();
break;
}
}
3000c8bc: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000c8c0: e8bd8000 pop {pc} <== NOT EXECUTED
3001a5b4 <_Timer_server_Body>:
* @a arg points to the corresponding timer server control block.
*/
static rtems_task _Timer_server_Body(
rtems_task_argument arg
)
{
3001a5b4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
3001a5b8: e24dd028 sub sp, sp, #40 ; 0x28 <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
3001a5bc: e28d101c add r1, sp, #28 <== NOT EXECUTED
3001a5c0: e2812004 add r2, r1, #4 <== NOT EXECUTED
3001a5c4: e28d7010 add r7, sp, #16 <== NOT EXECUTED
head->previous = NULL;
tail->previous = head;
3001a5c8: e58d1024 str r1, [sp, #36] ; 0x24 <== NOT EXECUTED
3001a5cc: e2801008 add r1, r0, #8 <== NOT EXECUTED
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
3001a5d0: e3a03000 mov r3, #0 <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
3001a5d4: e287a004 add sl, r7, #4 <== NOT EXECUTED
3001a5d8: e58d1008 str r1, [sp, #8] <== NOT EXECUTED
3001a5dc: e59f91c0 ldr r9, [pc, #448] ; 3001a7a4 <_Timer_server_Body+0x1f0><== NOT EXECUTED
3001a5e0: e2801040 add r1, r0, #64 ; 0x40 <== NOT EXECUTED
3001a5e4: e59fb1bc ldr fp, [pc, #444] ; 3001a7a8 <_Timer_server_Body+0x1f4><== NOT EXECUTED
3001a5e8: e1a04000 mov r4, r0 <== NOT EXECUTED
3001a5ec: e58d201c str r2, [sp, #28] <== NOT EXECUTED
head->previous = NULL;
3001a5f0: e58d3020 str r3, [sp, #32] <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
3001a5f4: e58da010 str sl, [sp, #16] <== NOT EXECUTED
head->previous = NULL;
3001a5f8: e58d3014 str r3, [sp, #20] <== NOT EXECUTED
tail->previous = head;
3001a5fc: e58d7018 str r7, [sp, #24] <== NOT EXECUTED
3001a600: e2806030 add r6, r0, #48 ; 0x30 <== NOT EXECUTED
3001a604: e2808068 add r8, r0, #104 ; 0x68 <== NOT EXECUTED
3001a608: e58d100c str r1, [sp, #12] <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail(
const Chain_Control *the_chain
)
{
return &the_chain->Tail.Node;
3001a60c: e58d2004 str r2, [sp, #4] <== NOT EXECUTED
Chain_Control *tmp;
/*
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
3001a610: e28d201c add r2, sp, #28 <== NOT EXECUTED
3001a614: e58da000 str sl, [sp] <== NOT EXECUTED
3001a618: e59da004 ldr sl, [sp, #4] <== NOT EXECUTED
3001a61c: e5842078 str r2, [r4, #120] ; 0x78 <== NOT EXECUTED
static void _Timer_server_Process_interval_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot;
3001a620: e5993000 ldr r3, [r9] <== NOT EXECUTED
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
3001a624: e594103c ldr r1, [r4, #60] ; 0x3c <== NOT EXECUTED
watchdogs->last_snapshot = snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
3001a628: e1a02007 mov r2, r7 <== NOT EXECUTED
3001a62c: e1a00006 mov r0, r6 <== NOT EXECUTED
/*
* We assume adequate unsigned arithmetic here.
*/
Watchdog_Interval delta = snapshot - watchdogs->last_snapshot;
watchdogs->last_snapshot = snapshot;
3001a630: e584303c str r3, [r4, #60] ; 0x3c <== NOT EXECUTED
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
3001a634: e0611003 rsb r1, r1, r3 <== NOT EXECUTED
3001a638: eb001166 bl 3001ebd8 <_Watchdog_Adjust_to_chain> <== NOT EXECUTED
static void _Timer_server_Process_tod_watchdogs(
Timer_server_Watchdogs *watchdogs,
Chain_Control *fire_chain
)
{
Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
3001a63c: e59b5000 ldr r5, [fp] <== NOT EXECUTED
Watchdog_Interval last_snapshot = watchdogs->last_snapshot;
3001a640: e5942074 ldr r2, [r4, #116] ; 0x74 <== NOT EXECUTED
/*
* 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 ) {
3001a644: e1550002 cmp r5, r2 <== NOT EXECUTED
3001a648: 8a00003c bhi 3001a740 <_Timer_server_Body+0x18c> <== NOT EXECUTED
* TOD has been set forward.
*/
delta = snapshot - last_snapshot;
_Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain );
} else if ( snapshot < last_snapshot ) {
3001a64c: 3a000032 bcc 3001a71c <_Timer_server_Body+0x168> <== NOT EXECUTED
*/
delta = last_snapshot - snapshot;
_Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta );
}
watchdogs->last_snapshot = snapshot;
3001a650: e5845074 str r5, [r4, #116] ; 0x74 <== NOT EXECUTED
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
3001a654: e5940078 ldr r0, [r4, #120] ; 0x78 <== NOT EXECUTED
3001a658: eb0002be bl 3001b158 <_Chain_Get> <== NOT EXECUTED
if ( timer == NULL ) {
3001a65c: e2501000 subs r1, r0, #0 <== NOT EXECUTED
3001a660: 0a00000b beq 3001a694 <_Timer_server_Body+0xe0> <== NOT EXECUTED
static void _Timer_server_Insert_timer(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
3001a664: e5913038 ldr r3, [r1, #56] ; 0x38 <== NOT EXECUTED
3001a668: e3530001 cmp r3, #1 <== NOT EXECUTED
3001a66c: 0a00002f beq 3001a730 <_Timer_server_Body+0x17c> <== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
3001a670: e3530003 cmp r3, #3 <== NOT EXECUTED
3001a674: 1afffff6 bne 3001a654 <_Timer_server_Body+0xa0> <== NOT EXECUTED
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
3001a678: e2811010 add r1, r1, #16 <== NOT EXECUTED
3001a67c: e1a00008 mov r0, r8 <== NOT EXECUTED
3001a680: eb00117f bl 3001ec84 <_Watchdog_Insert> <== NOT EXECUTED
}
static void _Timer_server_Process_insertions( Timer_server_Control *ts )
{
while ( true ) {
Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain );
3001a684: e5940078 ldr r0, [r4, #120] ; 0x78 <== NOT EXECUTED
3001a688: eb0002b2 bl 3001b158 <_Chain_Get> <== NOT EXECUTED
if ( timer == NULL ) {
3001a68c: e2501000 subs r1, r0, #0 <== NOT EXECUTED
3001a690: 1afffff3 bne 3001a664 <_Timer_server_Body+0xb0> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001a694: e10f3000 mrs r3, CPSR <== NOT EXECUTED
3001a698: e3832080 orr r2, r3, #128 ; 0x80 <== NOT EXECUTED
3001a69c: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
* body loop.
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
tmp = ts->insert_chain;
3001a6a0: e5942078 ldr r2, [r4, #120] ; 0x78 <== NOT EXECUTED
if ( _Chain_Is_empty( insert_chain ) ) {
3001a6a4: e59d201c ldr r2, [sp, #28] <== NOT EXECUTED
3001a6a8: e152000a cmp r2, sl <== NOT EXECUTED
ts->insert_chain = NULL;
3001a6ac: 05841078 streq r1, [r4, #120] ; 0x78 <== NOT EXECUTED
*/
_Timer_server_Process_insertions( ts );
_ISR_Disable( level );
tmp = ts->insert_chain;
if ( _Chain_Is_empty( insert_chain ) ) {
3001a6b0: 13a01001 movne r1, #1 <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3001a6b4: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
* Afterwards all timer inserts are directed to this chain and the interval
* and TOD chains will be no more modified by other parties.
*/
ts->insert_chain = insert_chain;
while ( do_loop ) {
3001a6b8: e3510000 cmp r1, #0 <== NOT EXECUTED
3001a6bc: 1affffd7 bne 3001a620 <_Timer_server_Body+0x6c> <== NOT EXECUTED
3001a6c0: e59da000 ldr sl, [sp] <== NOT EXECUTED
_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 ) ) {
3001a6c4: e59d3010 ldr r3, [sp, #16] <== NOT EXECUTED
3001a6c8: e153000a cmp r3, sl <== NOT EXECUTED
3001a6cc: 1a00000a bne 3001a6fc <_Timer_server_Body+0x148> <== NOT EXECUTED
3001a6d0: ea00001f b 3001a754 <_Timer_server_Body+0x1a0> <== 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;
3001a6d4: e5932000 ldr r2, [r3] <== NOT EXECUTED
head->next = new_first;
new_first->previous = head;
3001a6d8: e5827004 str r7, [r2, #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;
3001a6dc: e58d2010 str r2, [sp, #16] <== NOT EXECUTED
* 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;
3001a6e0: e3a02000 mov r2, #0 <== NOT EXECUTED
3001a6e4: e5832008 str r2, [r3, #8] <== NOT EXECUTED
3001a6e8: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
/*
* 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 );
3001a6ec: e5930020 ldr r0, [r3, #32] <== NOT EXECUTED
3001a6f0: e5931024 ldr r1, [r3, #36] ; 0x24 <== NOT EXECUTED
3001a6f4: e1a0e00f mov lr, pc <== NOT EXECUTED
3001a6f8: e593f01c ldr pc, [r3, #28] <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001a6fc: e10f1000 mrs r1, CPSR <== NOT EXECUTED
3001a700: e3813080 orr r3, r1, #128 ; 0x80 <== NOT EXECUTED
3001a704: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
initialized = false;
}
#endif
return status;
}
3001a708: e59d3010 ldr r3, [sp, #16] <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
Chain_Control *the_chain
)
{
if ( !_Chain_Is_empty(the_chain))
3001a70c: e153000a cmp r3, sl <== NOT EXECUTED
3001a710: 1affffef bne 3001a6d4 <_Timer_server_Body+0x120> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3001a714: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
3001a718: eaffffbc b 3001a610 <_Timer_server_Body+0x5c> <== NOT EXECUTED
/*
* 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 );
3001a71c: e1a00008 mov r0, r8 <== NOT EXECUTED
3001a720: e3a01001 mov r1, #1 <== NOT EXECUTED
3001a724: e0652002 rsb r2, r5, r2 <== NOT EXECUTED
3001a728: eb0010f9 bl 3001eb14 <_Watchdog_Adjust> <== NOT EXECUTED
3001a72c: eaffffc7 b 3001a650 <_Timer_server_Body+0x9c> <== NOT EXECUTED
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
3001a730: e1a00006 mov r0, r6 <== NOT EXECUTED
3001a734: e2811010 add r1, r1, #16 <== NOT EXECUTED
3001a738: eb001151 bl 3001ec84 <_Watchdog_Insert> <== NOT EXECUTED
3001a73c: eaffffc4 b 3001a654 <_Timer_server_Body+0xa0> <== NOT EXECUTED
/*
* 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 );
3001a740: e0621005 rsb r1, r2, r5 <== NOT EXECUTED
3001a744: e1a00008 mov r0, r8 <== NOT EXECUTED
3001a748: e1a02007 mov r2, r7 <== NOT EXECUTED
3001a74c: eb001121 bl 3001ebd8 <_Watchdog_Adjust_to_chain> <== NOT EXECUTED
3001a750: eaffffbe b 3001a650 <_Timer_server_Body+0x9c> <== NOT EXECUTED
* the active flag of the timer server is true.
*/
(*watchdog->routine)( watchdog->id, watchdog->user_data );
}
} else {
ts->active = false;
3001a754: e5c4107c strb r1, [r4, #124] ; 0x7c <== NOT EXECUTED
3001a758: e59f104c ldr r1, [pc, #76] ; 3001a7ac <_Timer_server_Body+0x1f8><== NOT EXECUTED
3001a75c: e5913000 ldr r3, [r1] <== NOT EXECUTED
3001a760: e2833001 add r3, r3, #1 <== NOT EXECUTED
3001a764: e5813000 str r3, [r1] <== NOT EXECUTED
/*
* Block until there is something to do.
*/
_Thread_Disable_dispatch();
_Thread_Set_state( ts->thread, STATES_DELAYING );
3001a768: e3a01008 mov r1, #8 <== NOT EXECUTED
3001a76c: e5940000 ldr r0, [r4] <== NOT EXECUTED
3001a770: eb000f43 bl 3001e484 <_Thread_Set_state> <== NOT EXECUTED
_Timer_server_Reset_interval_system_watchdog( ts );
3001a774: e1a00004 mov r0, r4 <== NOT EXECUTED
3001a778: ebffff61 bl 3001a504 <_Timer_server_Reset_interval_system_watchdog><== NOT EXECUTED
_Timer_server_Reset_tod_system_watchdog( ts );
3001a77c: e1a00004 mov r0, r4 <== NOT EXECUTED
3001a780: ebffff75 bl 3001a55c <_Timer_server_Reset_tod_system_watchdog><== NOT EXECUTED
_Thread_Enable_dispatch();
3001a784: eb000cf7 bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
ts->active = true;
3001a788: e3a02001 mov r2, #1 <== NOT EXECUTED
3001a78c: e5c4207c strb r2, [r4, #124] ; 0x7c <== NOT EXECUTED
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
3001a790: e59d0008 ldr r0, [sp, #8] <== NOT EXECUTED
3001a794: eb0011a9 bl 3001ee40 <_Watchdog_Remove> <== NOT EXECUTED
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
3001a798: e59d000c ldr r0, [sp, #12] <== NOT EXECUTED
3001a79c: eb0011a7 bl 3001ee40 <_Watchdog_Remove> <== NOT EXECUTED
3001a7a0: eaffff9a b 3001a610 <_Timer_server_Body+0x5c> <== NOT EXECUTED
3001a504 <_Timer_server_Reset_interval_system_watchdog>:
}
static void _Timer_server_Reset_interval_system_watchdog(
Timer_server_Control *ts
)
{
3001a504: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
3001a508: e2805008 add r5, r0, #8 <== NOT EXECUTED
}
static void _Timer_server_Reset_interval_system_watchdog(
Timer_server_Control *ts
)
{
3001a50c: e1a04000 mov r4, r0 <== NOT EXECUTED
static void _Timer_server_Stop_interval_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog );
3001a510: e1a00005 mov r0, r5 <== NOT EXECUTED
3001a514: eb001249 bl 3001ee40 <_Watchdog_Remove> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001a518: e10f1000 mrs r1, CPSR <== NOT EXECUTED
3001a51c: e3813080 orr r3, r1, #128 ; 0x80 <== NOT EXECUTED
3001a520: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
initialized = false;
}
#endif
return status;
}
3001a524: e5943030 ldr r3, [r4, #48] ; 0x30 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
3001a528: e2842034 add r2, r4, #52 ; 0x34 <== NOT EXECUTED
ISR_Level level;
_Timer_server_Stop_interval_system_watchdog( ts );
_ISR_Disable( level );
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
3001a52c: e1530002 cmp r3, r2 <== NOT EXECUTED
3001a530: 0a000006 beq 3001a550 <_Timer_server_Reset_interval_system_watchdog+0x4c><== NOT EXECUTED
Watchdog_Interval delta_interval =
3001a534: e5933010 ldr r3, [r3, #16] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3001a538: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3001a53c: e59f0014 ldr r0, [pc, #20] ; 3001a558 <_Timer_server_Reset_interval_system_watchdog+0x54><== NOT EXECUTED
3001a540: e1a01005 mov r1, r5 <== NOT EXECUTED
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3001a544: e5843014 str r3, [r4, #20] <== NOT EXECUTED
delta_interval
);
} else {
_ISR_Enable( level );
}
}
3001a548: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3001a54c: ea0011cc b 3001ec84 <_Watchdog_Insert> <== NOT EXECUTED
3001a550: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
3001a554: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
3001a55c <_Timer_server_Reset_tod_system_watchdog>:
}
static void _Timer_server_Reset_tod_system_watchdog(
Timer_server_Control *ts
)
{
3001a55c: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
3001a560: e2805040 add r5, r0, #64 ; 0x40 <== NOT EXECUTED
}
static void _Timer_server_Reset_tod_system_watchdog(
Timer_server_Control *ts
)
{
3001a564: e1a04000 mov r4, r0 <== NOT EXECUTED
static void _Timer_server_Stop_tod_system_watchdog(
Timer_server_Control *ts
)
{
_Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog );
3001a568: e1a00005 mov r0, r5 <== NOT EXECUTED
3001a56c: eb001233 bl 3001ee40 <_Watchdog_Remove> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001a570: e10f1000 mrs r1, CPSR <== NOT EXECUTED
3001a574: e3813080 orr r3, r1, #128 ; 0x80 <== NOT EXECUTED
3001a578: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
initialized = false;
}
#endif
return status;
}
3001a57c: e5943068 ldr r3, [r4, #104] ; 0x68 <== NOT EXECUTED
3001a580: e284206c add r2, r4, #108 ; 0x6c <== NOT EXECUTED
ISR_Level level;
_Timer_server_Stop_tod_system_watchdog( ts );
_ISR_Disable( level );
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
3001a584: e1530002 cmp r3, r2 <== NOT EXECUTED
3001a588: 0a000006 beq 3001a5a8 <_Timer_server_Reset_tod_system_watchdog+0x4c><== NOT EXECUTED
Watchdog_Interval delta_interval =
3001a58c: e5933010 ldr r3, [r3, #16] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3001a590: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
3001a594: e59f0014 ldr r0, [pc, #20] ; 3001a5b0 <_Timer_server_Reset_tod_system_watchdog+0x54><== NOT EXECUTED
3001a598: e1a01005 mov r1, r5 <== NOT EXECUTED
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3001a59c: e584304c str r3, [r4, #76] ; 0x4c <== NOT EXECUTED
delta_interval
);
} else {
_ISR_Enable( level );
}
}
3001a5a0: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
3001a5a4: ea0011b6 b 3001ec84 <_Watchdog_Insert> <== NOT EXECUTED
3001a5a8: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
3001a5ac: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
3001a7b0 <_Timer_server_Schedule_operation_method>:
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
if ( ts->insert_chain == NULL ) {
3001a7b0: e5902078 ldr r2, [r0, #120] ; 0x78 <== NOT EXECUTED
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
3001a7b4: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
if ( ts->insert_chain == NULL ) {
3001a7b8: e3520000 cmp r2, #0 <== NOT EXECUTED
static void _Timer_server_Schedule_operation_method(
Timer_server_Control *ts,
Timer_Control *timer
)
{
3001a7bc: e1a04000 mov r4, r0 <== NOT EXECUTED
3001a7c0: e1a03001 mov r3, r1 <== NOT EXECUTED
if ( ts->insert_chain == NULL ) {
3001a7c4: 0a000002 beq 3001a7d4 <_Timer_server_Schedule_operation_method+0x24><== NOT EXECUTED
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
3001a7c8: e5900078 ldr r0, [r0, #120] ; 0x78 <== NOT EXECUTED
}
}
3001a7cc: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
* server is not preemptible, so we must be in interrupt context here. No
* thread dispatch will happen until the timer server finishes its
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
3001a7d0: ea00024d b 3001b10c <_Chain_Append> <== NOT EXECUTED
3001a7d4: e59f1104 ldr r1, [pc, #260] ; 3001a8e0 <_Timer_server_Schedule_operation_method+0x130><== NOT EXECUTED
3001a7d8: e5910000 ldr r0, [r1] <== NOT EXECUTED
3001a7dc: e2800001 add r0, r0, #1 <== NOT EXECUTED
3001a7e0: e5810000 str r0, [r1] <== NOT EXECUTED
* being inserted. This could result in an integer overflow.
*/
_Thread_Disable_dispatch();
if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) {
3001a7e4: e5931038 ldr r1, [r3, #56] ; 0x38 <== NOT EXECUTED
3001a7e8: e3510001 cmp r1, #1 <== NOT EXECUTED
3001a7ec: 0a000021 beq 3001a878 <_Timer_server_Schedule_operation_method+0xc8><== NOT EXECUTED
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
if ( !ts->active ) {
_Timer_server_Reset_interval_system_watchdog( ts );
}
} else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) {
3001a7f0: e3510003 cmp r1, #3 <== NOT EXECUTED
3001a7f4: 0a000001 beq 3001a800 <_Timer_server_Schedule_operation_method+0x50><== NOT EXECUTED
* critical section. We have to use the protected chain methods because
* we may be interrupted by a higher priority interrupt.
*/
_Chain_Append( ts->insert_chain, &timer->Object.Node );
}
}
3001a7f8: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
if ( !ts->active ) {
_Timer_server_Reset_tod_system_watchdog( ts );
}
}
_Thread_Enable_dispatch();
3001a7fc: ea000cd9 b 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001a800: e10fe000 mrs lr, CPSR <== NOT EXECUTED
3001a804: e38e1080 orr r1, lr, #128 ; 0x80 <== NOT EXECUTED
3001a808: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
initialized = false;
}
#endif
return status;
}
3001a80c: e5941068 ldr r1, [r4, #104] ; 0x68 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool _Chain_Is_empty(
const Chain_Control *the_chain
)
{
return _Chain_Immutable_first( the_chain )
== _Chain_Immutable_tail( the_chain );
3001a810: e284006c add r0, r4, #108 ; 0x6c <== NOT EXECUTED
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
3001a814: e1510000 cmp r1, r0 <== NOT EXECUTED
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
3001a818: e59f00c4 ldr r0, [pc, #196] ; 3001a8e4 <_Timer_server_Schedule_operation_method+0x134><== NOT EXECUTED
last_snapshot = ts->TOD_watchdogs.last_snapshot;
3001a81c: e594c074 ldr ip, [r4, #116] ; 0x74 <== NOT EXECUTED
/*
* We have to advance the last known seconds value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
3001a820: e5900000 ldr r0, [r0] <== NOT EXECUTED
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
3001a824: 0a000008 beq 3001a84c <_Timer_server_Schedule_operation_method+0x9c><== NOT EXECUTED
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
3001a828: e5915010 ldr r5, [r1, #16] <== NOT EXECUTED
if ( snapshot > last_snapshot ) {
3001a82c: e150000c cmp r0, ip <== NOT EXECUTED
}
} else {
/*
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
3001a830: 9085200c addls r2, r5, ip <== NOT EXECUTED
delta_interval += delta;
3001a834: 90602002 rsbls r2, r0, r2 <== NOT EXECUTED
snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
last_snapshot = ts->TOD_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) {
first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain );
delta_interval = first_watchdog->delta_interval;
if ( snapshot > last_snapshot ) {
3001a838: 9a000002 bls 3001a848 <_Timer_server_Schedule_operation_method+0x98><== NOT EXECUTED
/*
* We advanced in time.
*/
delta = snapshot - last_snapshot;
3001a83c: e06cc000 rsb ip, ip, r0 <== NOT EXECUTED
if (delta_interval > delta) {
3001a840: e155000c cmp r5, ip <== NOT EXECUTED
delta_interval -= delta;
3001a844: 806c2005 rsbhi r2, ip, r5 <== NOT EXECUTED
* Someone put us in the past.
*/
delta = last_snapshot - snapshot;
delta_interval += delta;
}
first_watchdog->delta_interval = delta_interval;
3001a848: e5812010 str r2, [r1, #16] <== NOT EXECUTED
}
ts->TOD_watchdogs.last_snapshot = snapshot;
3001a84c: e5840074 str r0, [r4, #116] ; 0x74 <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3001a850: e129f00e msr CPSR_fc, lr <== NOT EXECUTED
_ISR_Enable( level );
_Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker );
3001a854: e2831010 add r1, r3, #16 <== NOT EXECUTED
3001a858: e2840068 add r0, r4, #104 ; 0x68 <== NOT EXECUTED
3001a85c: eb001108 bl 3001ec84 <_Watchdog_Insert> <== NOT EXECUTED
if ( !ts->active ) {
3001a860: e5d4307c ldrb r3, [r4, #124] ; 0x7c <== NOT EXECUTED
3001a864: e3530000 cmp r3, #0 <== NOT EXECUTED
3001a868: 1affffe2 bne 3001a7f8 <_Timer_server_Schedule_operation_method+0x48><== NOT EXECUTED
_Timer_server_Reset_tod_system_watchdog( ts );
3001a86c: e1a00004 mov r0, r4 <== NOT EXECUTED
3001a870: ebffff39 bl 3001a55c <_Timer_server_Reset_tod_system_watchdog><== NOT EXECUTED
3001a874: eaffffdf b 3001a7f8 <_Timer_server_Schedule_operation_method+0x48><== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001a878: e10f5000 mrs r5, CPSR <== NOT EXECUTED
3001a87c: e3851080 orr r1, r5, #128 ; 0x80 <== NOT EXECUTED
3001a880: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
initialized = false;
}
#endif
return status;
}
3001a884: e5941030 ldr r1, [r4, #48] ; 0x30 <== NOT EXECUTED
3001a888: e2840034 add r0, r4, #52 ; 0x34 <== NOT EXECUTED
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
last_snapshot = ts->Interval_watchdogs.last_snapshot;
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
3001a88c: e1510000 cmp r1, r0 <== NOT EXECUTED
/*
* We have to advance the last known ticks value of the server and update
* the watchdog chain accordingly.
*/
_ISR_Disable( level );
snapshot = _Watchdog_Ticks_since_boot;
3001a890: e59f0050 ldr r0, [pc, #80] ; 3001a8e8 <_Timer_server_Schedule_operation_method+0x138><== NOT EXECUTED
3001a894: e5900000 ldr r0, [r0] <== NOT EXECUTED
last_snapshot = ts->Interval_watchdogs.last_snapshot;
3001a898: e594c03c ldr ip, [r4, #60] ; 0x3c <== NOT EXECUTED
if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) {
3001a89c: 0a000004 beq 3001a8b4 <_Timer_server_Schedule_operation_method+0x104><== NOT EXECUTED
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
delta_interval = first_watchdog->delta_interval;
3001a8a0: e591e010 ldr lr, [r1, #16] <== NOT EXECUTED
first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain );
/*
* We assume adequate unsigned arithmetic here.
*/
delta = snapshot - last_snapshot;
3001a8a4: e06cc000 rsb ip, ip, r0 <== NOT EXECUTED
delta_interval = first_watchdog->delta_interval;
if (delta_interval > delta) {
3001a8a8: e15c000e cmp ip, lr <== NOT EXECUTED
delta_interval -= delta;
3001a8ac: 306c200e rsbcc r2, ip, lr <== NOT EXECUTED
} else {
delta_interval = 0;
}
first_watchdog->delta_interval = delta_interval;
3001a8b0: e5812010 str r2, [r1, #16] <== NOT EXECUTED
}
ts->Interval_watchdogs.last_snapshot = snapshot;
3001a8b4: e584003c str r0, [r4, #60] ; 0x3c <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3001a8b8: e129f005 msr CPSR_fc, r5 <== NOT EXECUTED
_ISR_Enable( level );
_Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker );
3001a8bc: e2831010 add r1, r3, #16 <== NOT EXECUTED
3001a8c0: e2840030 add r0, r4, #48 ; 0x30 <== NOT EXECUTED
3001a8c4: eb0010ee bl 3001ec84 <_Watchdog_Insert> <== NOT EXECUTED
if ( !ts->active ) {
3001a8c8: e5d4307c ldrb r3, [r4, #124] ; 0x7c <== NOT EXECUTED
3001a8cc: e3530000 cmp r3, #0 <== NOT EXECUTED
3001a8d0: 1affffc8 bne 3001a7f8 <_Timer_server_Schedule_operation_method+0x48><== NOT EXECUTED
_Timer_server_Reset_interval_system_watchdog( ts );
3001a8d4: e1a00004 mov r0, r4 <== NOT EXECUTED
3001a8d8: ebffff09 bl 3001a504 <_Timer_server_Reset_interval_system_watchdog><== NOT EXECUTED
3001a8dc: eaffffc5 b 3001a7f8 <_Timer_server_Schedule_operation_method+0x48><== NOT EXECUTED
3000cb00 <_Timespec_Add_to>:
uint32_t _Timespec_Add_to(
struct timespec *time,
const struct timespec *add
)
{
3000cb00: e1a03000 mov r3, r0
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
3000cb04: e5902004 ldr r2, [r0, #4]
uint32_t _Timespec_Add_to(
struct timespec *time,
const struct timespec *add
)
{
3000cb08: e52d4004 push {r4} ; (str r4, [sp, #-4]!)
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
3000cb0c: e8910011 ldm r1, {r0, r4}
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
3000cb10: e59fc040 ldr ip, [pc, #64] ; 3000cb58 <_Timespec_Add_to+0x58>
)
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
3000cb14: e5931000 ldr r1, [r3]
time->tv_nsec += add->tv_nsec;
3000cb18: e0844002 add r4, r4, r2
)
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
3000cb1c: e0811000 add r1, r1, r0
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
3000cb20: e154000c cmp r4, ip
3000cb24: e1a02004 mov r2, r4
)
{
uint32_t seconds = add->tv_sec;
/* Add the basics */
time->tv_sec += add->tv_sec;
3000cb28: e8830012 stm r3, {r1, r4}
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
3000cb2c: 9a000007 bls 3000cb50 <_Timespec_Add_to+0x50>
time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
3000cb30: e2822331 add r2, r2, #-1006632960 ; 0xc4000000 <== NOT EXECUTED
3000cb34: e2822865 add r2, r2, #6619136 ; 0x650000 <== NOT EXECUTED
3000cb38: e2822c36 add r2, r2, #13824 ; 0x3600 <== NOT EXECUTED
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
3000cb3c: e152000c cmp r2, ip <== NOT EXECUTED
*
* This routines adds two timespecs. The second argument is added
* to the first.
*/
uint32_t _Timespec_Add_to(
3000cb40: e2811001 add r1, r1, #1 <== NOT EXECUTED
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
time->tv_nsec -= TOD_NANOSECONDS_PER_SECOND;
time->tv_sec++;
seconds++;
3000cb44: e2800001 add r0, r0, #1 <== NOT EXECUTED
/* Add the basics */
time->tv_sec += add->tv_sec;
time->tv_nsec += add->tv_nsec;
/* Now adjust it so nanoseconds is in range */
while ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) {
3000cb48: 8afffff8 bhi 3000cb30 <_Timespec_Add_to+0x30> <== NOT EXECUTED
3000cb4c: e8830006 stm r3, {r1, r2} <== NOT EXECUTED
time->tv_sec++;
seconds++;
}
return seconds;
}
3000cb50: e8bd0010 pop {r4}
3000cb54: e12fff1e bx lr
3000e7b8 <_Timespec_Divide>:
const struct timespec *lhs,
const struct timespec *rhs,
uint32_t *ival_percentage,
uint32_t *fval_percentage
)
{
3000e7b8: e92d48f0 push {r4, r5, r6, r7, fp, lr}
* in a 64-bit integer.
*/
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
left += lhs->tv_nsec;
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
right += rhs->tv_nsec;
3000e7bc: e5916004 ldr r6, [r1, #4]
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
left += lhs->tv_nsec;
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
3000e7c0: e591c000 ldr ip, [r1]
3000e7c4: e59f1074 ldr r1, [pc, #116] ; 3000e840 <_Timespec_Divide+0x88>
right += rhs->tv_nsec;
3000e7c8: e1a07fc6 asr r7, r6, #31
3000e7cc: e0e76c91 smlal r6, r7, r1, ip
const struct timespec *lhs,
const struct timespec *rhs,
uint32_t *ival_percentage,
uint32_t *fval_percentage
)
{
3000e7d0: e1a04003 mov r4, r3
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
left += lhs->tv_nsec;
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
right += rhs->tv_nsec;
if ( right == 0 ) {
3000e7d4: e196c007 orrs ip, r6, r7
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
3000e7d8: e8900808 ldm r0, {r3, fp}
const struct timespec *lhs,
const struct timespec *rhs,
uint32_t *ival_percentage,
uint32_t *fval_percentage
)
{
3000e7dc: e1a05002 mov r5, r2
left += lhs->tv_nsec;
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
right += rhs->tv_nsec;
if ( right == 0 ) {
*ival_percentage = 0;
3000e7e0: 0582c000 streq ip, [r2]
*fval_percentage = 0;
3000e7e4: 0584c000 streq ip, [r4]
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
left += lhs->tv_nsec;
right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
right += rhs->tv_nsec;
if ( right == 0 ) {
3000e7e8: 08bd88f0 popeq {r4, r5, r6, r7, fp, pc}
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND;
left += lhs->tv_nsec;
3000e7ec: e1a0cfcb asr ip, fp, #31 <== NOT EXECUTED
3000e7f0: e0ecb391 smlal fp, ip, r1, r3 <== NOT EXECUTED
* Put it back in the timespec result.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (left * 100000) / right;
3000e7f4: e59fe048 ldr lr, [pc, #72] ; 3000e844 <_Timespec_Divide+0x8c><== NOT EXECUTED
3000e7f8: e1a02006 mov r2, r6 <== NOT EXECUTED
3000e7fc: e0810e9b umull r0, r1, fp, lr <== NOT EXECUTED
3000e800: e1a03007 mov r3, r7 <== NOT EXECUTED
3000e804: e0211c9e mla r1, lr, ip, r1 <== NOT EXECUTED
3000e808: eb003d23 bl 3001dc9c <__udivdi3> <== NOT EXECUTED
*ival_percentage = answer / 1000;
3000e80c: e3a02ffa mov r2, #1000 ; 0x3e8 <== NOT EXECUTED
3000e810: e3a03000 mov r3, #0 <== NOT EXECUTED
* Put it back in the timespec result.
*
* TODO: Rounding on the last digit of the fval.
*/
answer = (left * 100000) / right;
3000e814: e1a06000 mov r6, r0 <== NOT EXECUTED
3000e818: e1a07001 mov r7, r1 <== NOT EXECUTED
*ival_percentage = answer / 1000;
3000e81c: eb003d1e bl 3001dc9c <__udivdi3> <== NOT EXECUTED
*fval_percentage = answer % 1000;
3000e820: e1a01007 mov r1, r7 <== NOT EXECUTED
* TODO: Rounding on the last digit of the fval.
*/
answer = (left * 100000) / right;
*ival_percentage = answer / 1000;
3000e824: e5850000 str r0, [r5] <== NOT EXECUTED
*fval_percentage = answer % 1000;
3000e828: e3a02ffa mov r2, #1000 ; 0x3e8 <== NOT EXECUTED
3000e82c: e3a03000 mov r3, #0 <== NOT EXECUTED
3000e830: e1a00006 mov r0, r6 <== NOT EXECUTED
3000e834: eb003e2a bl 3001e0e4 <__umoddi3> <== NOT EXECUTED
3000e838: e5840000 str r0, [r4] <== NOT EXECUTED
3000e83c: e8bd88f0 pop {r4, r5, r6, r7, fp, pc} <== NOT EXECUTED
3000e7c8 <_Timespec_Divide_by_integer>:
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
t = time->tv_sec;
3000e7c8: e590c000 ldr ip, [r0] <== NOT EXECUTED
t *= TOD_NANOSECONDS_PER_SECOND;
3000e7cc: e59f3068 ldr r3, [pc, #104] ; 3000e83c <_Timespec_Divide_by_integer+0x74><== NOT EXECUTED
void _Timespec_Divide_by_integer(
const struct timespec *time,
uint32_t iterations,
struct timespec *result
)
{
3000e7d0: e92d41f0 push {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
t = time->tv_sec;
t *= TOD_NANOSECONDS_PER_SECOND;
3000e7d4: e086539c umull r5, r6, ip, r3 <== NOT EXECUTED
/*
* For math simplicity just convert the timespec to nanoseconds
* in a 64-bit integer.
*/
t = time->tv_sec;
3000e7d8: e1a0700c mov r7, ip <== NOT EXECUTED
3000e7dc: e1a08fc7 asr r8, r7, #31 <== NOT EXECUTED
t *= TOD_NANOSECONDS_PER_SECOND;
3000e7e0: e0266893 mla r6, r3, r8, r6 <== NOT EXECUTED
t += time->tv_nsec;
3000e7e4: e5900004 ldr r0, [r0, #4] <== NOT EXECUTED
void _Timespec_Divide_by_integer(
const struct timespec *time,
uint32_t iterations,
struct timespec *result
)
{
3000e7e8: e1a04002 mov r4, r2 <== NOT EXECUTED
/*
* Divide to get nanoseconds per iteration
*/
t /= iterations;
3000e7ec: e0957000 adds r7, r5, r0 <== NOT EXECUTED
3000e7f0: e0a68fc0 adc r8, r6, r0, asr #31 <== NOT EXECUTED
3000e7f4: e1a02001 mov r2, r1 <== NOT EXECUTED
3000e7f8: e3a03000 mov r3, #0 <== NOT EXECUTED
3000e7fc: e1a00007 mov r0, r7 <== NOT EXECUTED
3000e800: e1a01008 mov r1, r8 <== NOT EXECUTED
3000e804: eb003b5d bl 3001d580 <__udivdi3> <== NOT EXECUTED
/*
* Put it back in the timespec result
*/
result->tv_sec = t / TOD_NANOSECONDS_PER_SECOND;
3000e808: e59f202c ldr r2, [pc, #44] ; 3000e83c <_Timespec_Divide_by_integer+0x74><== NOT EXECUTED
3000e80c: e3a03000 mov r3, #0 <== NOT EXECUTED
/*
* Divide to get nanoseconds per iteration
*/
t /= iterations;
3000e810: e1a05000 mov r5, r0 <== NOT EXECUTED
3000e814: e1a06001 mov r6, r1 <== NOT EXECUTED
/*
* Put it back in the timespec result
*/
result->tv_sec = t / TOD_NANOSECONDS_PER_SECOND;
3000e818: eb003b58 bl 3001d580 <__udivdi3> <== NOT EXECUTED
result->tv_nsec = t % TOD_NANOSECONDS_PER_SECOND;
3000e81c: e59f2018 ldr r2, [pc, #24] ; 3000e83c <_Timespec_Divide_by_integer+0x74><== NOT EXECUTED
/*
* Put it back in the timespec result
*/
result->tv_sec = t / TOD_NANOSECONDS_PER_SECOND;
3000e820: e5840000 str r0, [r4] <== NOT EXECUTED
result->tv_nsec = t % TOD_NANOSECONDS_PER_SECOND;
3000e824: e3a03000 mov r3, #0 <== NOT EXECUTED
3000e828: e1a01006 mov r1, r6 <== NOT EXECUTED
3000e82c: e1a00005 mov r0, r5 <== NOT EXECUTED
3000e830: eb003c64 bl 3001d9c8 <__umoddi3> <== NOT EXECUTED
3000e834: e5840004 str r0, [r4, #4] <== NOT EXECUTED
}
3000e838: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
3001dfb0 <_Timespec_From_ticks>:
struct timespec *time
)
{
uint32_t usecs;
usecs = ticks * rtems_configuration_get_microseconds_per_tick();
3001dfb0: e59f3034 ldr r3, [pc, #52] ; 3001dfec <_Timespec_From_ticks+0x3c><== NOT EXECUTED
time->tv_sec = usecs / TOD_MICROSECONDS_PER_SECOND;
3001dfb4: e59f2034 ldr r2, [pc, #52] ; 3001dff0 <_Timespec_From_ticks+0x40><== NOT EXECUTED
struct timespec *time
)
{
uint32_t usecs;
usecs = ticks * rtems_configuration_get_microseconds_per_tick();
3001dfb8: e593300c ldr r3, [r3, #12] <== NOT EXECUTED
3001dfbc: e0000093 mul r0, r3, r0 <== NOT EXECUTED
time->tv_sec = usecs / TOD_MICROSECONDS_PER_SECOND;
3001dfc0: e0823290 umull r3, r2, r0, r2 <== NOT EXECUTED
3001dfc4: e1a02922 lsr r2, r2, #18 <== NOT EXECUTED
time->tv_nsec = (usecs % TOD_MICROSECONDS_PER_SECOND) *
3001dfc8: e0623282 rsb r3, r2, r2, lsl #5 <== NOT EXECUTED
3001dfcc: e0633303 rsb r3, r3, r3, lsl #6 <== NOT EXECUTED
3001dfd0: e0823183 add r3, r2, r3, lsl #3 <== NOT EXECUTED
3001dfd4: e0403303 sub r3, r0, r3, lsl #6 <== NOT EXECUTED
3001dfd8: e0630283 rsb r0, r3, r3, lsl #5 <== NOT EXECUTED
3001dfdc: e0833100 add r3, r3, r0, lsl #2 <== NOT EXECUTED
3001dfe0: e1a03183 lsl r3, r3, #3 <== NOT EXECUTED
{
uint32_t usecs;
usecs = ticks * rtems_configuration_get_microseconds_per_tick();
time->tv_sec = usecs / TOD_MICROSECONDS_PER_SECOND;
3001dfe4: e881000c stm r1, {r2, r3} <== NOT EXECUTED
time->tv_nsec = (usecs % TOD_MICROSECONDS_PER_SECOND) *
TOD_NANOSECONDS_PER_MICROSECOND;
}
3001dfe8: e12fff1e bx lr <== NOT EXECUTED
3001dff4 <_Timespec_Is_valid>:
bool _Timespec_Is_valid(
const struct timespec *time
)
{
if ( !time )
3001dff4: e3500000 cmp r0, #0 <== NOT EXECUTED
3001dff8: 012fff1e bxeq lr <== NOT EXECUTED
return false;
if ( time->tv_sec < 0 )
3001dffc: e5903000 ldr r3, [r0] <== NOT EXECUTED
3001e000: e3530000 cmp r3, #0 <== NOT EXECUTED
return false;
3001e004: b3a00000 movlt r0, #0 <== NOT EXECUTED
)
{
if ( !time )
return false;
if ( time->tv_sec < 0 )
3001e008: b12fff1e bxlt lr <== NOT EXECUTED
return false;
if ( time->tv_nsec < 0 )
3001e00c: e5903004 ldr r3, [r0, #4] <== NOT EXECUTED
3001e010: e3530000 cmp r3, #0 <== NOT EXECUTED
3001e014: ba000004 blt 3001e02c <_Timespec_Is_valid+0x38> <== NOT EXECUTED
#include <rtems/system.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
bool _Timespec_Is_valid(
3001e018: e59f0014 ldr r0, [pc, #20] ; 3001e034 <_Timespec_Is_valid+0x40><== NOT EXECUTED
3001e01c: e1530000 cmp r3, r0 <== NOT EXECUTED
3001e020: 83a00000 movhi r0, #0 <== NOT EXECUTED
3001e024: 93a00001 movls r0, #1 <== NOT EXECUTED
3001e028: e12fff1e bx lr <== NOT EXECUTED
if ( time->tv_sec < 0 )
return false;
if ( time->tv_nsec < 0 )
return false;
3001e02c: e3a00000 mov r0, #0 <== NOT EXECUTED
if ( time->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
return false;
return true;
}
3001e030: e12fff1e bx lr <== NOT EXECUTED
3000e878 <_Timespec_Less_than>:
bool _Timespec_Less_than(
const struct timespec *lhs,
const struct timespec *rhs
)
{
if ( lhs->tv_sec < rhs->tv_sec )
3000e878: e5902000 ldr r2, [r0]
3000e87c: e5913000 ldr r3, [r1]
3000e880: e1520003 cmp r2, r3
return true;
3000e884: b3a00001 movlt r0, #1
bool _Timespec_Less_than(
const struct timespec *lhs,
const struct timespec *rhs
)
{
if ( lhs->tv_sec < rhs->tv_sec )
3000e888: b12fff1e bxlt lr
return true;
if ( lhs->tv_sec > rhs->tv_sec )
3000e88c: ca000005 bgt 3000e8a8 <_Timespec_Less_than+0x30>
#include <rtems/system.h>
#include <rtems/score/timespec.h>
#include <rtems/score/tod.h>
bool _Timespec_Less_than(
3000e890: e5900004 ldr r0, [r0, #4]
3000e894: e5913004 ldr r3, [r1, #4]
3000e898: e1500003 cmp r0, r3
3000e89c: a3a00000 movge r0, #0
3000e8a0: b3a00001 movlt r0, #1
3000e8a4: e12fff1e bx lr
{
if ( lhs->tv_sec < rhs->tv_sec )
return true;
if ( lhs->tv_sec > rhs->tv_sec )
return false;
3000e8a8: e3a00000 mov r0, #0 <== NOT EXECUTED
/* ASSERT: lhs->tv_sec == rhs->tv_sec */
if ( lhs->tv_nsec < rhs->tv_nsec )
return true;
return false;
}
3000e8ac: e12fff1e bx lr <== NOT EXECUTED
3000cb5c <_Timespec_Subtract>:
const struct timespec *end,
struct timespec *result
)
{
if (end->tv_nsec < start->tv_nsec) {
3000cb5c: e591c004 ldr ip, [r1, #4]
3000cb60: e5903004 ldr r3, [r0, #4]
void _Timespec_Subtract(
const struct timespec *start,
const struct timespec *end,
struct timespec *result
)
{
3000cb64: e92d0030 push {r4, r5}
if (end->tv_nsec < start->tv_nsec) {
3000cb68: e15c0003 cmp ip, r3
3000cb6c: ba000006 blt 3000cb8c <_Timespec_Subtract+0x30>
result->tv_sec = end->tv_sec - start->tv_sec - 1;
result->tv_nsec =
(TOD_NANOSECONDS_PER_SECOND - start->tv_nsec) + end->tv_nsec;
} else {
result->tv_sec = end->tv_sec - start->tv_sec;
3000cb70: e5914000 ldr r4, [r1]
3000cb74: e5901000 ldr r1, [r0]
result->tv_nsec = end->tv_nsec - start->tv_nsec;
3000cb78: e063300c rsb r3, r3, ip
if (end->tv_nsec < start->tv_nsec) {
result->tv_sec = end->tv_sec - start->tv_sec - 1;
result->tv_nsec =
(TOD_NANOSECONDS_PER_SECOND - start->tv_nsec) + end->tv_nsec;
} else {
result->tv_sec = end->tv_sec - start->tv_sec;
3000cb7c: e0611004 rsb r1, r1, r4
3000cb80: e882000a stm r2, {r1, r3}
result->tv_nsec = end->tv_nsec - start->tv_nsec;
}
}
3000cb84: e8bd0030 pop {r4, r5}
3000cb88: e12fff1e bx lr
struct timespec *result
)
{
if (end->tv_nsec < start->tv_nsec) {
result->tv_sec = end->tv_sec - start->tv_sec - 1;
3000cb8c: e5915000 ldr r5, [r1] <== NOT EXECUTED
result->tv_nsec =
(TOD_NANOSECONDS_PER_SECOND - start->tv_nsec) + end->tv_nsec;
3000cb90: e59f1018 ldr r1, [pc, #24] ; 3000cbb0 <_Timespec_Subtract+0x54><== NOT EXECUTED
struct timespec *result
)
{
if (end->tv_nsec < start->tv_nsec) {
result->tv_sec = end->tv_sec - start->tv_sec - 1;
3000cb94: e5904000 ldr r4, [r0] <== NOT EXECUTED
result->tv_nsec =
(TOD_NANOSECONDS_PER_SECOND - start->tv_nsec) + end->tv_nsec;
3000cb98: e08c1001 add r1, ip, r1 <== NOT EXECUTED
struct timespec *result
)
{
if (end->tv_nsec < start->tv_nsec) {
result->tv_sec = end->tv_sec - start->tv_sec - 1;
3000cb9c: e2450001 sub r0, r5, #1 <== NOT EXECUTED
3000cba0: e0640000 rsb r0, r4, r0 <== NOT EXECUTED
result->tv_nsec =
(TOD_NANOSECONDS_PER_SECOND - start->tv_nsec) + end->tv_nsec;
3000cba4: e0633001 rsb r3, r3, r1 <== NOT EXECUTED
struct timespec *result
)
{
if (end->tv_nsec < start->tv_nsec) {
result->tv_sec = end->tv_sec - start->tv_sec - 1;
3000cba8: e8820009 stm r2, {r0, r3} <== NOT EXECUTED
3000cbac: eafffff4 b 3000cb84 <_Timespec_Subtract+0x28> <== NOT EXECUTED
3001e038 <_Timespec_To_ticks>:
*/
uint32_t _Timespec_To_ticks(
const struct timespec *time
)
{
3001e038: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
3001e03c: e5904000 ldr r4, [r0] <== NOT EXECUTED
*/
uint32_t _Timespec_To_ticks(
const struct timespec *time
)
{
3001e040: e1a05000 mov r5, r0 <== NOT EXECUTED
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
3001e044: e3540000 cmp r4, #0 <== NOT EXECUTED
3001e048: 1a000002 bne 3001e058 <_Timespec_To_ticks+0x20> <== NOT EXECUTED
3001e04c: e5900004 ldr r0, [r0, #4] <== NOT EXECUTED
3001e050: e3500000 cmp r0, #0 <== NOT EXECUTED
3001e054: 08bd8030 popeq {r4, r5, pc} <== NOT EXECUTED
return 0;
ticks = time->tv_sec * TOD_TICKS_PER_SECOND;
3001e058: eb000086 bl 3001e278 <TOD_TICKS_PER_SECOND_method> <== NOT EXECUTED
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
3001e05c: e59f3024 ldr r3, [pc, #36] ; 3001e088 <_Timespec_To_ticks+0x50><== NOT EXECUTED
uint32_t ticks;
if ( (time->tv_sec == 0) && (time->tv_nsec == 0) )
return 0;
ticks = time->tv_sec * TOD_TICKS_PER_SECOND;
3001e060: e0040490 mul r4, r0, r4 <== NOT EXECUTED
ticks += time->tv_nsec / rtems_configuration_get_nanoseconds_per_tick();
3001e064: e593300c ldr r3, [r3, #12] <== NOT EXECUTED
3001e068: e5950004 ldr r0, [r5, #4] <== NOT EXECUTED
3001e06c: e0632283 rsb r2, r3, r3, lsl #5 <== NOT EXECUTED
3001e070: e0833102 add r3, r3, r2, lsl #2 <== NOT EXECUTED
3001e074: e1a01183 lsl r1, r3, #3 <== NOT EXECUTED
3001e078: ebfff648 bl 3001b9a0 <__aeabi_uidiv> <== NOT EXECUTED
if (ticks)
3001e07c: e0940000 adds r0, r4, r0 <== NOT EXECUTED
return ticks;
return 1;
3001e080: 03a00001 moveq r0, #1 <== NOT EXECUTED
}
3001e084: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
3000cce0 <_User_extensions_Fatal>:
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
3000cce0: e92d41f0 push {r4, r5, r6, r7, r8, lr}
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
3000cce4: e59f5040 ldr r5, [pc, #64] ; 3000cd2c <_User_extensions_Fatal+0x4c>
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
3000cce8: e1a08000 mov r8, r0
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
}
}
3000ccec: e5954008 ldr r4, [r5, #8]
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
3000ccf0: e1a07002 mov r7, r2
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
3000ccf4: e1540005 cmp r4, r5
void _User_extensions_Fatal (
Internal_errors_Source the_source,
bool is_internal,
Internal_errors_t the_error
)
{
3000ccf8: e20160ff and r6, r1, #255 ; 0xff
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
3000ccfc: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc}
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
3000cd00: e5943030 ldr r3, [r4, #48] ; 0x30
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
3000cd04: e1a00008 mov r0, r8
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.fatal != NULL )
3000cd08: e3530000 cmp r3, #0
(*the_extension->Callouts.fatal)( the_source, is_internal, the_error );
3000cd0c: e1a01006 mov r1, r6
3000cd10: e1a02007 mov r2, r7
3000cd14: 11a0e00f movne lr, pc
3000cd18: 112fff13 bxne r3
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
!_Chain_Is_head( &_User_extensions_List, the_node ) ;
the_node = the_node->previous ) {
3000cd1c: e5944004 ldr r4, [r4, #4]
)
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
for ( the_node = _Chain_Last( &_User_extensions_List );
3000cd20: e1540005 cmp r4, r5
3000cd24: 1afffff5 bne 3000cd00 <_User_extensions_Fatal+0x20>
3000cd28: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
3000e4d0 <_User_extensions_Remove_set>:
#include <rtems/score/userext.h>
void _User_extensions_Remove_set (
User_extensions_Control *the_extension
)
{
3000e4d0: e92d4010 push {r4, lr}
3000e4d4: e1a04000 mov r4, r0
_Chain_Extract( &the_extension->Node );
3000e4d8: ebfff5f1 bl 3000bca4 <_Chain_Extract>
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL )
3000e4dc: e5943024 ldr r3, [r4, #36] ; 0x24
3000e4e0: e3530000 cmp r3, #0
3000e4e4: 08bd8010 popeq {r4, pc}
_Chain_Extract( &the_extension->Switch.Node );
3000e4e8: e2840008 add r0, r4, #8 <== NOT EXECUTED
}
3000e4ec: e8bd4010 pop {r4, lr} <== NOT EXECUTED
/*
* If a switch handler is present, remove it.
*/
if ( the_extension->Callouts.thread_switch != NULL )
_Chain_Extract( &the_extension->Switch.Node );
3000e4f0: eafff5eb b 3000bca4 <_Chain_Extract> <== NOT EXECUTED
3000cd30 <_User_extensions_Thread_create>:
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
3000cd30: e92d40f0 push {r4, r5, r6, r7, lr}
return false;
}
}
return true;
}
3000cd34: e59f5050 ldr r5, [pc, #80] ; 3000cd8c <_User_extensions_Thread_create+0x5c>
#include <rtems/score/userext.h>
bool _User_extensions_Thread_create (
Thread_Control *the_thread
)
{
3000cd38: e1a06000 mov r6, r0
return false;
}
}
return true;
}
3000cd3c: e4954004 ldr r4, [r5], #4
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
3000cd40: e1540005 cmp r4, r5
3000cd44: 0a00000e beq 3000cd84 <_User_extensions_Thread_create+0x54>
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
status = (*the_extension->Callouts.thread_create)(
3000cd48: e59f7040 ldr r7, [pc, #64] ; 3000cd90 <_User_extensions_Thread_create+0x60>
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
3000cd4c: e5943014 ldr r3, [r4, #20]
status = (*the_extension->Callouts.thread_create)(
3000cd50: e1a01006 mov r1, r6
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
the_extension = (User_extensions_Control *) the_node;
if ( the_extension->Callouts.thread_create != NULL ) {
3000cd54: e3530000 cmp r3, #0
3000cd58: 0a000004 beq 3000cd70 <_User_extensions_Thread_create+0x40>
status = (*the_extension->Callouts.thread_create)(
3000cd5c: e5970004 ldr r0, [r7, #4]
3000cd60: e1a0e00f mov lr, pc
3000cd64: e12fff13 bx r3
_Thread_Executing,
the_thread
);
if ( !status )
3000cd68: e3500000 cmp r0, #0
3000cd6c: 08bd80f0 popeq {r4, r5, r6, r7, pc}
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
!_Chain_Is_tail( &_User_extensions_List, the_node ) ;
the_node = the_node->next ) {
3000cd70: e5944000 ldr r4, [r4]
{
Chain_Node *the_node;
User_extensions_Control *the_extension;
bool status;
for ( the_node = _Chain_First( &_User_extensions_List );
3000cd74: e1540005 cmp r4, r5
3000cd78: 1afffff3 bne 3000cd4c <_User_extensions_Thread_create+0x1c>
if ( !status )
return false;
}
}
return true;
3000cd7c: e3a00001 mov r0, #1
3000cd80: e8bd80f0 pop {r4, r5, r6, r7, pc}
3000cd84: e3a00001 mov r0, #1 <== NOT EXECUTED
}
3000cd88: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000eb94 <_Watchdog_Adjust>:
void _Watchdog_Adjust(
Chain_Control *header,
Watchdog_Adjust_directions direction,
Watchdog_Interval units
)
{
3000eb94: e92d41f0 push {r4, r5, r6, r7, r8, lr}
3000eb98: e1a04000 mov r4, r0
3000eb9c: e1a05002 mov r5, r2
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000eba0: e10f0000 mrs r0, CPSR
3000eba4: e3803080 orr r3, r0, #128 ; 0x80
3000eba8: e129f003 msr CPSR_fc, r3
}
}
_ISR_Enable( level );
}
3000ebac: e1a07004 mov r7, r4
3000ebb0: e4973004 ldr r3, [r7], #4
* hence the compiler must not assume *header to remain
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
3000ebb4: e1530007 cmp r3, r7
3000ebb8: 0a00001a beq 3000ec28 <_Watchdog_Adjust+0x94>
switch ( direction ) {
3000ebbc: e3510000 cmp r1, #0 <== NOT EXECUTED
3000ebc0: 1a00001a bne 3000ec30 <_Watchdog_Adjust+0x9c> <== NOT EXECUTED
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
3000ebc4: e3520000 cmp r2, #0 <== NOT EXECUTED
3000ebc8: 0a000016 beq 3000ec28 <_Watchdog_Adjust+0x94> <== NOT EXECUTED
if ( units < _Watchdog_First( header )->delta_interval ) {
3000ebcc: e5936010 ldr r6, [r3, #16] <== NOT EXECUTED
3000ebd0: e1520006 cmp r2, r6 <== NOT EXECUTED
3000ebd4: 21a01000 movcs r1, r0 <== NOT EXECUTED
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
3000ebd8: 23a08001 movcs r8, #1 <== NOT EXECUTED
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
3000ebdc: 2a000005 bcs 3000ebf8 <_Watchdog_Adjust+0x64> <== NOT EXECUTED
3000ebe0: ea000019 b 3000ec4c <_Watchdog_Adjust+0xb8> <== NOT EXECUTED
switch ( direction ) {
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
3000ebe4: e0555006 subs r5, r5, r6 <== NOT EXECUTED
3000ebe8: 0a00000e beq 3000ec28 <_Watchdog_Adjust+0x94> <== NOT EXECUTED
if ( units < _Watchdog_First( header )->delta_interval ) {
3000ebec: e5936010 ldr r6, [r3, #16] <== NOT EXECUTED
3000ebf0: e1560005 cmp r6, r5 <== NOT EXECUTED
3000ebf4: 8a000014 bhi 3000ec4c <_Watchdog_Adjust+0xb8> <== NOT EXECUTED
_Watchdog_First( header )->delta_interval -= units;
break;
} else {
units -= _Watchdog_First( header )->delta_interval;
_Watchdog_First( header )->delta_interval = 1;
3000ebf8: e5838010 str r8, [r3, #16] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000ebfc: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
_ISR_Enable( level );
_Watchdog_Tickle( header );
3000ec00: e1a00004 mov r0, r4 <== NOT EXECUTED
3000ec04: eb0000ad bl 3000eec0 <_Watchdog_Tickle> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000ec08: e10f0000 mrs r0, CPSR <== NOT EXECUTED
3000ec0c: e3803080 orr r3, r0, #128 ; 0x80 <== NOT EXECUTED
3000ec10: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
}
}
_ISR_Enable( level );
}
3000ec14: e5942000 ldr r2, [r4] <== NOT EXECUTED
3000ec18: e1a01000 mov r1, r0 <== NOT EXECUTED
_Watchdog_Tickle( header );
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
3000ec1c: e1570002 cmp r7, r2 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
3000ec20: e1a03002 mov r3, r2 <== NOT EXECUTED
3000ec24: 1affffee bne 3000ebe4 <_Watchdog_Adjust+0x50> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000ec28: e129f000 msr CPSR_fc, r0
}
}
_ISR_Enable( level );
}
3000ec2c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
* unmodified across that call.
*
* Till Straumann, 7/2003
*/
if ( !_Chain_Is_empty( header ) ) {
switch ( direction ) {
3000ec30: e3510001 cmp r1, #1 <== NOT EXECUTED
3000ec34: 1afffffb bne 3000ec28 <_Watchdog_Adjust+0x94> <== NOT EXECUTED
case WATCHDOG_BACKWARD:
_Watchdog_First( header )->delta_interval += units;
3000ec38: e5932010 ldr r2, [r3, #16] <== NOT EXECUTED
3000ec3c: e0825005 add r5, r2, r5 <== NOT EXECUTED
3000ec40: e5835010 str r5, [r3, #16] <== NOT EXECUTED
3000ec44: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
}
}
_ISR_Enable( level );
}
3000ec48: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
_Watchdog_First( header )->delta_interval += units;
break;
case WATCHDOG_FORWARD:
while ( units ) {
if ( units < _Watchdog_First( header )->delta_interval ) {
_Watchdog_First( header )->delta_interval -= units;
3000ec4c: e0655006 rsb r5, r5, r6 <== NOT EXECUTED
3000ec50: e5835010 str r5, [r3, #16] <== NOT EXECUTED
break;
3000ec54: eafffff3 b 3000ec28 <_Watchdog_Adjust+0x94> <== NOT EXECUTED
3001ebd8 <_Watchdog_Adjust_to_chain>:
{
Watchdog_Interval units = units_arg;
ISR_Level level;
Watchdog_Control *first;
if ( units <= 0 ) {
3001ebd8: e3510000 cmp r1, #0 <== NOT EXECUTED
Chain_Control *header,
Watchdog_Interval units_arg,
Chain_Control *to_fire
)
{
3001ebdc: e92d05f0 push {r4, r5, r6, r7, r8, sl} <== NOT EXECUTED
Watchdog_Interval units = units_arg;
ISR_Level level;
Watchdog_Control *first;
if ( units <= 0 ) {
3001ebe0: 0a000022 beq 3001ec70 <_Watchdog_Adjust_to_chain+0x98> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001ebe4: e10f7000 mrs r7, CPSR <== NOT EXECUTED
3001ebe8: e3873080 orr r3, r7, #128 ; 0x80 <== NOT EXECUTED
3001ebec: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
return;
}
_ISR_Disable( level );
3001ebf0: e1a06000 mov r6, r0 <== NOT EXECUTED
3001ebf4: e4963004 ldr r3, [r6], #4 <== NOT EXECUTED
/*
* The first set happens in less than units, so take all of them
* off the chain and adjust units to reflect this.
*/
units -= first->delta_interval;
first->delta_interval = 0;
3001ebf8: e3a0a000 mov sl, #0 <== NOT EXECUTED
3001ebfc: e2828004 add r8, r2, #4 <== NOT EXECUTED
while ( 1 ) {
if ( units <= 0 ) {
break;
}
if ( _Chain_Is_empty( header ) ) {
3001ec00: e1530006 cmp r3, r6 <== NOT EXECUTED
3001ec04: 0a000018 beq 3001ec6c <_Watchdog_Adjust_to_chain+0x94> <== NOT EXECUTED
/*
* If it is longer than "units" until the first element on the chain
* fires, then bump it and quit.
*/
if ( units < first->delta_interval ) {
3001ec08: e593c010 ldr ip, [r3, #16] <== NOT EXECUTED
3001ec0c: e15c0001 cmp ip, r1 <== NOT EXECUTED
3001ec10: 8a000018 bhi 3001ec78 <_Watchdog_Adjust_to_chain+0xa0> <== NOT EXECUTED
/*
* The first set happens in less than units, so take all of them
* off the chain and adjust units to reflect this.
*/
units -= first->delta_interval;
3001ec14: e06c1001 rsb r1, ip, r1 <== NOT EXECUTED
first->delta_interval = 0;
3001ec18: e583a010 str sl, [r3, #16] <== NOT EXECUTED
)
{
Chain_Node *next;
Chain_Node *previous;
next = the_node->next;
3001ec1c: e5935000 ldr r5, [r3] <== NOT EXECUTED
previous = the_node->previous;
3001ec20: e5934004 ldr r4, [r3, #4] <== NOT EXECUTED
next->previous = previous;
3001ec24: e5854004 str r4, [r5, #4] <== NOT EXECUTED
Chain_Control *the_chain,
Chain_Node *the_node
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
3001ec28: e592c008 ldr ip, [r2, #8] <== NOT EXECUTED
Chain_Node *previous;
next = the_node->next;
previous = the_node->previous;
next->previous = previous;
previous->next = next;
3001ec2c: e5845000 str r5, [r4] <== NOT EXECUTED
)
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
3001ec30: e5838000 str r8, [r3] <== NOT EXECUTED
tail->previous = the_node;
old_last->next = the_node;
3001ec34: e58c3000 str r3, [ip] <== NOT EXECUTED
{
Chain_Node *tail = _Chain_Tail( the_chain );
Chain_Node *old_last = tail->previous;
the_node->next = tail;
tail->previous = the_node;
3001ec38: e5823008 str r3, [r2, #8] <== NOT EXECUTED
old_last->next = the_node;
the_node->previous = old_last;
3001ec3c: e583c004 str ip, [r3, #4] <== NOT EXECUTED
static inline void arm_interrupt_flash( uint32_t level )
{
uint32_t arm_switch_reg;
__asm__ volatile (
3001ec40: e10f3000 mrs r3, CPSR <== NOT EXECUTED
3001ec44: e129f007 msr CPSR_fc, r7 <== NOT EXECUTED
3001ec48: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
break;
}
}
_ISR_Enable( level );
}
3001ec4c: e5903000 ldr r3, [r0] <== NOT EXECUTED
_Chain_Extract_unprotected( &first->Node );
_Chain_Append_unprotected( to_fire, &first->Node );
_ISR_Flash( level );
if ( _Chain_Is_empty( header ) )
3001ec50: e1560003 cmp r6, r3 <== NOT EXECUTED
3001ec54: 0a000002 beq 3001ec64 <_Watchdog_Adjust_to_chain+0x8c> <== NOT EXECUTED
break;
first = _Watchdog_First( header );
if ( first->delta_interval != 0 )
3001ec58: e593c010 ldr ip, [r3, #16] <== NOT EXECUTED
3001ec5c: e35c0000 cmp ip, #0 <== NOT EXECUTED
3001ec60: 0affffed beq 3001ec1c <_Watchdog_Adjust_to_chain+0x44> <== NOT EXECUTED
}
_ISR_Disable( level );
while ( 1 ) {
if ( units <= 0 ) {
3001ec64: e3510000 cmp r1, #0 <== NOT EXECUTED
3001ec68: 1affffe4 bne 3001ec00 <_Watchdog_Adjust_to_chain+0x28> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3001ec6c: e129f007 msr CPSR_fc, r7 <== NOT EXECUTED
break;
}
}
_ISR_Enable( level );
}
3001ec70: e8bd05f0 pop {r4, r5, r6, r7, r8, sl} <== NOT EXECUTED
3001ec74: e12fff1e bx lr <== NOT EXECUTED
/*
* If it is longer than "units" until the first element on the chain
* fires, then bump it and quit.
*/
if ( units < first->delta_interval ) {
first->delta_interval -= units;
3001ec78: e061100c rsb r1, r1, ip <== NOT EXECUTED
3001ec7c: e5831010 str r1, [r3, #16] <== NOT EXECUTED
break;
3001ec80: eafffff9 b 3001ec6c <_Watchdog_Adjust_to_chain+0x94> <== NOT EXECUTED
3000ce6c <_Watchdog_Insert>:
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
3000ce6c: e59f3140 ldr r3, [pc, #320] ; 3000cfb4 <_Watchdog_Insert+0x148>
void _Watchdog_Insert(
Chain_Control *header,
Watchdog_Control *the_watchdog
)
{
3000ce70: e92d01f0 push {r4, r5, r6, r7, r8}
Watchdog_Control *after;
uint32_t insert_isr_nest_level;
Watchdog_Interval delta_interval;
insert_isr_nest_level = _ISR_Nest_level;
3000ce74: e5933000 ldr r3, [r3]
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000ce78: e10f6000 mrs r6, CPSR
3000ce7c: e3862080 orr r2, r6, #128 ; 0x80
3000ce80: e129f002 msr CPSR_fc, r2
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
3000ce84: e5912008 ldr r2, [r1, #8]
3000ce88: e3520000 cmp r2, #0
3000ce8c: 1a000041 bne 3000cf98 <_Watchdog_Insert+0x12c>
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
_Watchdog_Sync_count++;
3000ce90: e59f8120 ldr r8, [pc, #288] ; 3000cfb8 <_Watchdog_Insert+0x14c>
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
3000ce94: e3a0c001 mov ip, #1
_Watchdog_Sync_count++;
3000ce98: e5982000 ldr r2, [r8]
3000ce9c: e59f7118 ldr r7, [pc, #280] ; 3000cfbc <_Watchdog_Insert+0x150>
3000cea0: e2822001 add r2, r2, #1
if ( the_watchdog->state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
return;
}
the_watchdog->state = WATCHDOG_BEING_INSERTED;
3000cea4: e581c008 str ip, [r1, #8]
_Watchdog_Sync_count++;
3000cea8: e5882000 str r2, [r8]
restart:
delta_interval = the_watchdog->initial;
3000ceac: e591200c ldr r2, [r1, #12]
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
3000ceb0: e590c000 ldr ip, [r0]
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
3000ceb4: e3520000 cmp r2, #0
3000ceb8: 0a000023 beq 3000cf4c <_Watchdog_Insert+0xe0>
3000cebc: e59c4000 ldr r4, [ip]
3000cec0: e3540000 cmp r4, #0
3000cec4: 0a000020 beq 3000cf4c <_Watchdog_Insert+0xe0>
break;
if ( delta_interval < after->delta_interval ) {
3000cec8: e59c4010 ldr r4, [ip, #16]
3000cecc: e1520004 cmp r2, r4
3000ced0: 3a000032 bcc 3000cfa0 <_Watchdog_Insert+0x134>
static inline void arm_interrupt_flash( uint32_t level )
{
uint32_t arm_switch_reg;
__asm__ volatile (
3000ced4: e10f5000 mrs r5, CPSR
3000ced8: e129f006 msr CPSR_fc, r6
3000cedc: e129f005 msr CPSR_fc, r5
delta_interval -= after->delta_interval;
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
3000cee0: e5915008 ldr r5, [r1, #8]
3000cee4: e3550001 cmp r5, #1
3000cee8: 1a000023 bne 3000cf7c <_Watchdog_Insert+0x110>
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
3000ceec: e5975000 ldr r5, [r7]
3000cef0: e1530005 cmp r3, r5
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
3000cef4: 20642002 rsbcs r2, r4, r2
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
3000cef8: 2a000010 bcs 3000cf40 <_Watchdog_Insert+0xd4>
3000cefc: ea00002a b 3000cfac <_Watchdog_Insert+0x140> <== NOT EXECUTED
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
3000cf00: e59c4000 ldr r4, [ip] <== NOT EXECUTED
3000cf04: e3540000 cmp r4, #0 <== NOT EXECUTED
3000cf08: 0a00000f beq 3000cf4c <_Watchdog_Insert+0xe0> <== NOT EXECUTED
break;
if ( delta_interval < after->delta_interval ) {
3000cf0c: e59c4010 ldr r4, [ip, #16] <== NOT EXECUTED
3000cf10: e1540002 cmp r4, r2 <== NOT EXECUTED
3000cf14: 8a000021 bhi 3000cfa0 <_Watchdog_Insert+0x134> <== NOT EXECUTED
3000cf18: e10f5000 mrs r5, CPSR <== NOT EXECUTED
3000cf1c: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
3000cf20: e129f005 msr CPSR_fc, r5 <== NOT EXECUTED
delta_interval -= after->delta_interval;
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
3000cf24: e5915008 ldr r5, [r1, #8] <== NOT EXECUTED
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
break;
}
delta_interval -= after->delta_interval;
3000cf28: e0642002 rsb r2, r4, r2 <== NOT EXECUTED
_ISR_Flash( level );
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
3000cf2c: e3550001 cmp r5, #1 <== NOT EXECUTED
3000cf30: 1a000011 bne 3000cf7c <_Watchdog_Insert+0x110> <== NOT EXECUTED
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
3000cf34: e5974000 ldr r4, [r7] <== NOT EXECUTED
3000cf38: e1530004 cmp r3, r4 <== NOT EXECUTED
3000cf3c: 3a00001a bcc 3000cfac <_Watchdog_Insert+0x140> <== NOT EXECUTED
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
3000cf40: e3520000 cmp r2, #0
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
_Watchdog_Sync_count--;
_ISR_Enable( level );
}
3000cf44: e59cc000 ldr ip, [ip]
for ( after = _Watchdog_First( header ) ;
;
after = _Watchdog_Next( after ) ) {
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
3000cf48: 1affffec bne 3000cf00 <_Watchdog_Insert+0x94>
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
3000cf4c: e59c0004 ldr r0, [ip, #4]
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
3000cf50: e59f4068 ldr r4, [pc, #104] ; 3000cfc0 <_Watchdog_Insert+0x154>
)
{
Chain_Node *before_node;
the_node->previous = after_node;
before_node = after_node->next;
3000cf54: e590c000 ldr ip, [r0]
3000cf58: e5944000 ldr r4, [r4]
RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
Watchdog_Control *the_watchdog
)
{
the_watchdog->state = WATCHDOG_ACTIVE;
3000cf5c: e3a05002 mov r5, #2
3000cf60: e5815008 str r5, [r1, #8]
}
}
_Watchdog_Activate( the_watchdog );
the_watchdog->delta_interval = delta_interval;
3000cf64: e5812010 str r2, [r1, #16]
Chain_Node *the_node
)
{
Chain_Node *before_node;
the_node->previous = after_node;
3000cf68: e5810004 str r0, [r1, #4]
before_node = after_node->next;
after_node->next = the_node;
3000cf6c: e5801000 str r1, [r0]
the_node->next = before_node;
before_node->previous = the_node;
3000cf70: e58c1004 str r1, [ip, #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;
3000cf74: e581c000 str ip, [r1]
_Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
the_watchdog->start_time = _Watchdog_Ticks_since_boot;
3000cf78: e5814014 str r4, [r1, #20]
exit_insert:
_Watchdog_Sync_level = insert_isr_nest_level;
3000cf7c: e5873000 str r3, [r7]
_Watchdog_Sync_count--;
3000cf80: e5983000 ldr r3, [r8]
3000cf84: e2433001 sub r3, r3, #1
3000cf88: e5883000 str r3, [r8]
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000cf8c: e129f006 msr CPSR_fc, r6
_ISR_Enable( level );
}
3000cf90: e8bd01f0 pop {r4, r5, r6, r7, r8}
3000cf94: e12fff1e bx lr
3000cf98: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
3000cf9c: eafffffb b 3000cf90 <_Watchdog_Insert+0x124> <== NOT EXECUTED
if ( delta_interval == 0 || !_Watchdog_Next( after ) )
break;
if ( delta_interval < after->delta_interval ) {
after->delta_interval -= delta_interval;
3000cfa0: e0624004 rsb r4, r2, r4 <== NOT EXECUTED
3000cfa4: e58c4010 str r4, [ip, #16] <== NOT EXECUTED
break;
3000cfa8: eaffffe7 b 3000cf4c <_Watchdog_Insert+0xe0> <== NOT EXECUTED
if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
goto exit_insert;
}
if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
_Watchdog_Sync_level = insert_isr_nest_level;
3000cfac: e5873000 str r3, [r7] <== NOT EXECUTED
goto restart;
3000cfb0: eaffffbd b 3000ceac <_Watchdog_Insert+0x40> <== NOT EXECUTED
3000e684 <_Watchdog_Report>:
void _Watchdog_Report(
const char *name,
Watchdog_Control *watch
)
{
3000e684: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
printk(
3000e688: e250c000 subs ip, r0, #0 <== NOT EXECUTED
3000e68c: e591000c ldr r0, [r1, #12] <== NOT EXECUTED
void _Watchdog_Report(
const char *name,
Watchdog_Control *watch
)
{
3000e690: e24dd014 sub sp, sp, #20 <== NOT EXECUTED
printk(
3000e694: e5913010 ldr r3, [r1, #16] <== NOT EXECUTED
3000e698: e88d0003 stm sp, {r0, r1} <== NOT EXECUTED
3000e69c: e591e01c ldr lr, [r1, #28] <== NOT EXECUTED
3000e6a0: 059fc02c ldreq ip, [pc, #44] ; 3000e6d4 <_Watchdog_Report+0x50><== NOT EXECUTED
3000e6a4: e58de008 str lr, [sp, #8] <== NOT EXECUTED
3000e6a8: e591e020 ldr lr, [r1, #32] <== NOT EXECUTED
3000e6ac: 01a0200c moveq r2, ip <== NOT EXECUTED
3000e6b0: e58de00c str lr, [sp, #12] <== NOT EXECUTED
3000e6b4: e5911024 ldr r1, [r1, #36] ; 0x24 <== NOT EXECUTED
3000e6b8: 159f2018 ldrne r2, [pc, #24] ; 3000e6d8 <_Watchdog_Report+0x54><== NOT EXECUTED
3000e6bc: e58d1010 str r1, [sp, #16] <== NOT EXECUTED
3000e6c0: e59f0014 ldr r0, [pc, #20] ; 3000e6dc <_Watchdog_Report+0x58><== NOT EXECUTED
3000e6c4: e1a0100c mov r1, ip <== NOT EXECUTED
3000e6c8: ebffe66a bl 30008078 <printk> <== NOT EXECUTED
watch,
watch->routine,
watch->id,
watch->user_data
);
}
3000e6cc: e28dd014 add sp, sp, #20 <== NOT EXECUTED
3000e6d0: e8bd8000 pop {pc} <== NOT EXECUTED
3000e60c <_Watchdog_Report_chain>:
void _Watchdog_Report_chain(
const char *name,
Chain_Control *header
)
{
3000e60c: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED
3000e610: e1a05000 mov r5, r0 <== NOT EXECUTED
3000e614: e1a04001 mov r4, r1 <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000e618: e10f6000 mrs r6, CPSR <== NOT EXECUTED
3000e61c: e3863080 orr r3, r6, #128 ; 0x80 <== NOT EXECUTED
3000e620: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
3000e624: e59f004c ldr r0, [pc, #76] ; 3000e678 <_Watchdog_Report_chain+0x6c><== NOT EXECUTED
3000e628: e1a02004 mov r2, r4 <== NOT EXECUTED
3000e62c: e1a01005 mov r1, r5 <== NOT EXECUTED
3000e630: ebffe690 bl 30008078 <printk> <== NOT EXECUTED
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
3000e634: e4947004 ldr r7, [r4], #4 <== NOT EXECUTED
ISR_Level level;
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
3000e638: e1570004 cmp r7, r4 <== NOT EXECUTED
3000e63c: 0a00000a beq 3000e66c <_Watchdog_Report_chain+0x60> <== NOT EXECUTED
node != _Chain_Tail(header) ;
node = node->next )
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
3000e640: e1a01007 mov r1, r7 <== NOT EXECUTED
3000e644: e3a00000 mov r0, #0 <== NOT EXECUTED
3000e648: eb00000d bl 3000e684 <_Watchdog_Report> <== NOT EXECUTED
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
node != _Chain_Tail(header) ;
node = node->next )
3000e64c: e5977000 ldr r7, [r7] <== NOT EXECUTED
Chain_Node *node;
_ISR_Disable( level );
printk( "Watchdog Chain: %s %p\n", name, header );
if ( !_Chain_Is_empty( header ) ) {
for ( node = _Chain_First( header ) ;
3000e650: e1570004 cmp r7, r4 <== NOT EXECUTED
3000e654: 1afffff9 bne 3000e640 <_Watchdog_Report_chain+0x34> <== NOT EXECUTED
{
Watchdog_Control *watch = (Watchdog_Control *) node;
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
3000e658: e59f001c ldr r0, [pc, #28] ; 3000e67c <_Watchdog_Report_chain+0x70><== NOT EXECUTED
3000e65c: e1a01005 mov r1, r5 <== NOT EXECUTED
3000e660: ebffe684 bl 30008078 <printk> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000e664: e129f006 msr CPSR_fc, r6 <== NOT EXECUTED
} else {
printk( "Chain is empty\n" );
}
_ISR_Enable( level );
}
3000e668: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
_Watchdog_Report( NULL, watch );
}
printk( "== end of %s \n", name );
} else {
printk( "Chain is empty\n" );
3000e66c: e59f000c ldr r0, [pc, #12] ; 3000e680 <_Watchdog_Report_chain+0x74><== NOT EXECUTED
3000e670: ebffe680 bl 30008078 <printk> <== NOT EXECUTED
3000e674: eafffffa b 3000e664 <_Watchdog_Report_chain+0x58> <== NOT EXECUTED
3000d0d4 <_Watchdog_Tickle>:
*/
void _Watchdog_Tickle(
Chain_Control *header
)
{
3000d0d4: e92d40f0 push {r4, r5, r6, r7, lr}
3000d0d8: e1a06000 mov r6, r0
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000d0dc: e10f7000 mrs r7, CPSR
3000d0e0: e3873080 orr r3, r7, #128 ; 0x80
3000d0e4: e129f003 msr CPSR_fc, r3
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
3000d0e8: e1a05000 mov r5, r0
3000d0ec: e4953004 ldr r3, [r5], #4
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
if ( _Chain_Is_empty( header ) )
3000d0f0: e1530005 cmp r3, r5
3000d0f4: 0a000007 beq 3000d118 <_Watchdog_Tickle+0x44>
* to be inserted has already had its delta_interval adjusted to 0, and
* so is added to the head of the chain with a delta_interval of 0.
*
* Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
*/
if (the_watchdog->delta_interval != 0) {
3000d0f8: e5931010 ldr r1, [r3, #16]
RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
Chain_Control *header
)
{
return ( (Watchdog_Control *) _Chain_First( header ) );
3000d0fc: e1a04003 mov r4, r3
3000d100: e3510000 cmp r1, #0
3000d104: 0a000015 beq 3000d160 <_Watchdog_Tickle+0x8c>
the_watchdog->delta_interval--;
3000d108: e2411001 sub r1, r1, #1
if ( the_watchdog->delta_interval != 0 )
3000d10c: e3510000 cmp r1, #0
* so is added to the head of the chain with a delta_interval of 0.
*
* Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc)
*/
if (the_watchdog->delta_interval != 0) {
the_watchdog->delta_interval--;
3000d110: e5831010 str r1, [r3, #16]
if ( the_watchdog->delta_interval != 0 )
3000d114: 0a000011 beq 3000d160 <_Watchdog_Tickle+0x8c>
* See the comment in watchdoginsert.c and watchdogadjust.c
* about why it's safe not to declare header a pointer to
* volatile data - till, 2003/7
*/
_ISR_Disable( level );
3000d118: e1a02007 mov r2, r7
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000d11c: e129f002 msr CPSR_fc, r2
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
3000d120: e8bd80f0 pop {r4, r5, r6, r7, pc}
_ISR_Enable( level );
switch( watchdog_state ) {
case WATCHDOG_ACTIVE:
(*the_watchdog->routine)(
3000d124: e5940020 ldr r0, [r4, #32] <== NOT EXECUTED
3000d128: e5941024 ldr r1, [r4, #36] ; 0x24 <== NOT EXECUTED
3000d12c: e1a0e00f mov lr, pc <== NOT EXECUTED
3000d130: e594f01c ldr pc, [r4, #28] <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000d134: e10f2000 mrs r2, CPSR <== NOT EXECUTED
3000d138: e3823080 orr r3, r2, #128 ; 0x80 <== NOT EXECUTED
3000d13c: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
leave:
_ISR_Enable(level);
}
3000d140: e5963000 ldr r3, [r6] <== NOT EXECUTED
3000d144: e1a07002 mov r7, r2 <== NOT EXECUTED
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
(the_watchdog->delta_interval == 0) );
3000d148: e1530005 cmp r3, r5 <== NOT EXECUTED
3000d14c: e1a04003 mov r4, r3 <== NOT EXECUTED
3000d150: 0afffff1 beq 3000d11c <_Watchdog_Tickle+0x48> <== NOT EXECUTED
}
_ISR_Disable( level );
the_watchdog = _Watchdog_First( header );
} while ( !_Chain_Is_empty( header ) &&
3000d154: e5933010 ldr r3, [r3, #16] <== NOT EXECUTED
3000d158: e3530000 cmp r3, #0 <== NOT EXECUTED
3000d15c: 1affffee bne 3000d11c <_Watchdog_Tickle+0x48> <== NOT EXECUTED
if ( the_watchdog->delta_interval != 0 )
goto leave;
}
do {
watchdog_state = _Watchdog_Remove( the_watchdog );
3000d160: e1a00004 mov r0, r4 <== NOT EXECUTED
3000d164: ebffffaf bl 3000d028 <_Watchdog_Remove> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000d168: e129f007 msr CPSR_fc, r7 <== NOT EXECUTED
_ISR_Enable( level );
switch( watchdog_state ) {
3000d16c: e3500002 cmp r0, #2 <== NOT EXECUTED
3000d170: 1affffef bne 3000d134 <_Watchdog_Tickle+0x60> <== NOT EXECUTED
3000d174: eaffffea b 3000d124 <_Watchdog_Tickle+0x50> <== NOT EXECUTED
3000d200 <_Workspace_Allocate_or_fatal_error>:
3000d200: e3a02000 mov r2, #0
* _Workspace_Allocate_or_fatal_error
*/
void *_Workspace_Allocate_or_fatal_error(
size_t size
)
{
3000d204: e1a01000 mov r1, r0
3000d208: e52de004 push {lr} ; (str lr, [sp, #-4]!)
3000d20c: e59f0018 ldr r0, [pc, #24] ; 3000d22c <_Workspace_Allocate_or_fatal_error+0x2c>
3000d210: e1a03002 mov r3, r2
3000d214: eb000855 bl 3000f370 <_Heap_Allocate_aligned_with_boundary>
__builtin_return_address( 1 ),
memory
);
#endif
if ( memory == NULL )
3000d218: e3500000 cmp r0, #0
3000d21c: 149df004 popne {pc} ; (ldrne pc, [sp], #4)
_Internal_error_Occurred(
3000d220: e3a01001 mov r1, #1 <== NOT EXECUTED
3000d224: e3a02003 mov r2, #3 <== NOT EXECUTED
3000d228: ebfff6fd bl 3000ae24 <_Internal_error_Occurred> <== NOT EXECUTED
3000d178 <_Workspace_Handler_initialization>:
* _Workspace_Handler_initialization
*/
void _Workspace_Handler_initialization(void)
{
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
3000d178: e59f3050 ldr r3, [pc, #80] ; 3000d1d0 <_Workspace_Handler_initialization+0x58>
/*
* _Workspace_Handler_initialization
*/
void _Workspace_Handler_initialization(void)
{
3000d17c: e92d4030 push {r4, r5, lr}
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
uintptr_t size = Configuration.work_space_size;
if ( Configuration.do_zero_of_workspace )
3000d180: e5d32028 ldrb r2, [r3, #40] ; 0x28
* _Workspace_Handler_initialization
*/
void _Workspace_Handler_initialization(void)
{
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
3000d184: e5935000 ldr r5, [r3]
uintptr_t size = Configuration.work_space_size;
if ( Configuration.do_zero_of_workspace )
3000d188: e3520000 cmp r2, #0
*/
void _Workspace_Handler_initialization(void)
{
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
uintptr_t size = Configuration.work_space_size;
3000d18c: e5934004 ldr r4, [r3, #4]
if ( Configuration.do_zero_of_workspace )
3000d190: 1a000009 bne 3000d1bc <_Workspace_Handler_initialization+0x44>
memset( starting_address, 0, size );
memory_available = _Heap_Initialize(
3000d194: e59f0038 ldr r0, [pc, #56] ; 3000d1d4 <_Workspace_Handler_initialization+0x5c>
3000d198: e1a01005 mov r1, r5
3000d19c: e1a02004 mov r2, r4
3000d1a0: e3a03008 mov r3, #8
3000d1a4: ebfff683 bl 3000abb8 <_Heap_Initialize>
starting_address,
size,
CPU_HEAP_ALIGNMENT
);
if ( memory_available == 0 )
3000d1a8: e3500000 cmp r0, #0
3000d1ac: 18bd8030 popne {r4, r5, pc}
_Internal_error_Occurred(
3000d1b0: e3a01001 mov r1, #1 <== NOT EXECUTED
3000d1b4: e3a02002 mov r2, #2 <== NOT EXECUTED
3000d1b8: ebfff719 bl 3000ae24 <_Internal_error_Occurred> <== NOT EXECUTED
uintptr_t memory_available = 0;
void *starting_address = Configuration.work_space_start;
uintptr_t size = Configuration.work_space_size;
if ( Configuration.do_zero_of_workspace )
memset( starting_address, 0, size );
3000d1bc: e1a00005 mov r0, r5
3000d1c0: e3a01000 mov r1, #0
3000d1c4: e1a02004 mov r2, r4
3000d1c8: eb00123b bl 30011abc <memset>
3000d1cc: eafffff0 b 3000d194 <_Workspace_Handler_initialization+0x1c>
30011900 <rtems_barrier_create>:
rtems_name name,
rtems_attribute attribute_set,
uint32_t maximum_waiters,
rtems_id *id
)
{
30011900: e92d41f0 push {r4, r5, r6, r7, r8, lr}
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
30011904: e2504000 subs r4, r0, #0
rtems_name name,
rtems_attribute attribute_set,
uint32_t maximum_waiters,
rtems_id *id
)
{
30011908: e24dd008 sub sp, sp, #8
3001190c: e1a05001 mov r5, r1
30011910: e1a07003 mov r7, r3
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
30011914: 03a00003 moveq r0, #3
)
{
Barrier_Control *the_barrier;
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
30011918: 0a00001e beq 30011998 <rtems_barrier_create+0x98>
return RTEMS_INVALID_NAME;
if ( !id )
3001191c: e3530000 cmp r3, #0
return RTEMS_INVALID_ADDRESS;
30011920: 03a00009 moveq r0, #9
CORE_barrier_Attributes the_attributes;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
30011924: 0a00001b beq 30011998 <rtems_barrier_create+0x98>
return RTEMS_INVALID_ADDRESS;
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
30011928: e3110010 tst r1, #16
3001192c: 0a00001b beq 300119a0 <rtems_barrier_create+0xa0>
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
30011930: e3a03000 mov r3, #0 <== NOT EXECUTED
if ( maximum_waiters == 0 )
30011934: e3520000 cmp r2, #0 <== NOT EXECUTED
if ( !id )
return RTEMS_INVALID_ADDRESS;
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
30011938: e58d3000 str r3, [sp] <== NOT EXECUTED
if ( maximum_waiters == 0 )
3001193c: 0a00001a beq 300119ac <rtems_barrier_create+0xac> <== NOT EXECUTED
30011940: e59f3078 ldr r3, [pc, #120] ; 300119c0 <rtems_barrier_create+0xc0>
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
the_attributes.maximum_count = maximum_waiters;
30011944: e58d2004 str r2, [sp, #4]
30011948: e5932000 ldr r2, [r3]
3001194c: e2822001 add r2, r2, #1
30011950: e5832000 str r2, [r3]
* This function allocates a barrier control block from
* the inactive chain of free barrier control blocks.
*/
RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Allocate( void )
{
return (Barrier_Control *) _Objects_Allocate( &_Barrier_Information );
30011954: e59f8068 ldr r8, [pc, #104] ; 300119c4 <rtems_barrier_create+0xc4>
30011958: e1a00008 mov r0, r8
3001195c: ebffeda3 bl 3000cff0 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
30011960: e2506000 subs r6, r0, #0
30011964: 0a000012 beq 300119b4 <rtems_barrier_create+0xb4>
return RTEMS_TOO_MANY;
}
the_barrier->attribute_set = attribute_set;
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
30011968: e2860014 add r0, r6, #20
3001196c: e1a0100d mov r1, sp
if ( !the_barrier ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_barrier->attribute_set = attribute_set;
30011970: e5865010 str r5, [r6, #16]
_CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes );
30011974: eb00024c bl 300122ac <_CORE_barrier_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
30011978: e5963008 ldr r3, [r6, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3001197c: e598201c ldr r2, [r8, #28]
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
30011980: e1a01803 lsl r1, r3, #16
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
30011984: e7826721 str r6, [r2, r1, lsr #14]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
30011988: e586400c str r4, [r6, #12]
&_Barrier_Information,
&the_barrier->Object,
(Objects_Name) name
);
*id = the_barrier->Object.id;
3001198c: e5873000 str r3, [r7]
_Thread_Enable_dispatch();
30011990: ebfff202 bl 3000e1a0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
30011994: e3a00000 mov r0, #0
}
30011998: e28dd008 add sp, sp, #8
3001199c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
if ( maximum_waiters == 0 )
return RTEMS_INVALID_NUMBER;
} else
the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE;
300119a0: e3a03001 mov r3, #1
300119a4: e58d3000 str r3, [sp]
300119a8: eaffffe4 b 30011940 <rtems_barrier_create+0x40>
/* Initialize core barrier attributes */
if ( _Attributes_Is_barrier_automatic( attribute_set ) ) {
the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE;
if ( maximum_waiters == 0 )
return RTEMS_INVALID_NUMBER;
300119ac: e3a0000a mov r0, #10 <== NOT EXECUTED
300119b0: eafffff8 b 30011998 <rtems_barrier_create+0x98> <== NOT EXECUTED
_Thread_Disable_dispatch(); /* prevents deletion */
the_barrier = _Barrier_Allocate();
if ( !the_barrier ) {
_Thread_Enable_dispatch();
300119b4: ebfff1f9 bl 3000e1a0 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_TOO_MANY;
300119b8: e3a00005 mov r0, #5 <== NOT EXECUTED
300119bc: eafffff5 b 30011998 <rtems_barrier_create+0x98> <== NOT EXECUTED
30011a78 <rtems_barrier_release>:
rtems_status_code rtems_barrier_release(
rtems_id id,
uint32_t *released
)
{
30011a78: e92d4070 push {r4, r5, r6, lr} <== NOT EXECUTED
Barrier_Control *the_barrier;
Objects_Locations location;
if ( !released )
30011a7c: e2516000 subs r6, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_barrier_release(
rtems_id id,
uint32_t *released
)
{
30011a80: e1a05000 mov r5, r0 <== NOT EXECUTED
30011a84: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Barrier_Control *the_barrier;
Objects_Locations location;
if ( !released )
return RTEMS_INVALID_ADDRESS;
30011a88: 03a00009 moveq r0, #9 <== NOT EXECUTED
)
{
Barrier_Control *the_barrier;
Objects_Locations location;
if ( !released )
30011a8c: 0a00000e beq 30011acc <rtems_barrier_release+0x54> <== NOT EXECUTED
Objects_Id id,
Objects_Locations *location
)
{
return (Barrier_Control *)
_Objects_Get( &_Barrier_Information, id, location );
30011a90: e59f003c ldr r0, [pc, #60] ; 30011ad4 <rtems_barrier_release+0x5c><== NOT EXECUTED
30011a94: e1a01005 mov r1, r5 <== NOT EXECUTED
30011a98: e1a0200d mov r2, sp <== NOT EXECUTED
30011a9c: ebffee84 bl 3000d4b4 <_Objects_Get> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
the_barrier = _Barrier_Get( id, &location );
switch ( location ) {
30011aa0: e59d4000 ldr r4, [sp] <== NOT EXECUTED
30011aa4: e3540000 cmp r4, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30011aa8: 13a00004 movne r0, #4 <== NOT EXECUTED
if ( !released )
return RTEMS_INVALID_ADDRESS;
the_barrier = _Barrier_Get( id, &location );
switch ( location ) {
30011aac: 1a000006 bne 30011acc <rtems_barrier_release+0x54> <== NOT EXECUTED
case OBJECTS_LOCAL:
*released = _CORE_barrier_Release( &the_barrier->Barrier, id, NULL );
30011ab0: e1a01005 mov r1, r5 <== NOT EXECUTED
30011ab4: e1a02004 mov r2, r4 <== NOT EXECUTED
30011ab8: e2800014 add r0, r0, #20 <== NOT EXECUTED
30011abc: eb000205 bl 300122d8 <_CORE_barrier_Release> <== NOT EXECUTED
30011ac0: e5860000 str r0, [r6] <== NOT EXECUTED
_Thread_Enable_dispatch();
30011ac4: ebfff1b5 bl 3000e1a0 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30011ac8: e1a00004 mov r0, r4 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30011acc: e28dd004 add sp, sp, #4 <== NOT EXECUTED
30011ad0: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
30011ad8 <rtems_barrier_wait>:
rtems_status_code rtems_barrier_wait(
rtems_id id,
rtems_interval timeout
)
{
30011ad8: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
30011adc: e1a04000 mov r4, r0 <== NOT EXECUTED
30011ae0: e24dd008 sub sp, sp, #8 <== NOT EXECUTED
30011ae4: e1a05001 mov r5, r1 <== NOT EXECUTED
30011ae8: e59f004c ldr r0, [pc, #76] ; 30011b3c <rtems_barrier_wait+0x64><== NOT EXECUTED
30011aec: e1a01004 mov r1, r4 <== NOT EXECUTED
30011af0: e28d2004 add r2, sp, #4 <== NOT EXECUTED
30011af4: ebffee6e bl 3000d4b4 <_Objects_Get> <== NOT EXECUTED
Barrier_Control *the_barrier;
Objects_Locations location;
the_barrier = _Barrier_Get( id, &location );
switch ( location ) {
30011af8: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
30011afc: e3530000 cmp r3, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30011b00: 13a00004 movne r0, #4 <== NOT EXECUTED
{
Barrier_Control *the_barrier;
Objects_Locations location;
the_barrier = _Barrier_Get( id, &location );
switch ( location ) {
30011b04: 1a00000a bne 30011b34 <rtems_barrier_wait+0x5c> <== NOT EXECUTED
case OBJECTS_LOCAL:
_CORE_barrier_Wait(
30011b08: e2800014 add r0, r0, #20 <== NOT EXECUTED
30011b0c: e58d3000 str r3, [sp] <== NOT EXECUTED
30011b10: e3a02001 mov r2, #1 <== NOT EXECUTED
30011b14: e1a03005 mov r3, r5 <== NOT EXECUTED
30011b18: e1a01004 mov r1, r4 <== NOT EXECUTED
30011b1c: eb0001f9 bl 30012308 <_CORE_barrier_Wait> <== NOT EXECUTED
id,
true,
timeout,
NULL
);
_Thread_Enable_dispatch();
30011b20: ebfff19e bl 3000e1a0 <_Thread_Enable_dispatch> <== NOT EXECUTED
return _Barrier_Translate_core_barrier_return_code(
_Thread_Executing->Wait.return_code );
30011b24: e59f3014 ldr r3, [pc, #20] ; 30011b40 <rtems_barrier_wait+0x68><== NOT EXECUTED
30011b28: e5933004 ldr r3, [r3, #4] <== NOT EXECUTED
true,
timeout,
NULL
);
_Thread_Enable_dispatch();
return _Barrier_Translate_core_barrier_return_code(
30011b2c: e5930034 ldr r0, [r3, #52] ; 0x34 <== NOT EXECUTED
30011b30: eb000478 bl 30012d18 <_Barrier_Translate_core_barrier_return_code><== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30011b34: e28dd008 add sp, sp, #8 <== NOT EXECUTED
30011b38: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
3000b9e4 <rtems_build_id>:
uint32_t the_class,
uint32_t node,
uint32_t index
)
{
return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) |
3000b9e4: e1a00c00 lsl r0, r0, #24 <== NOT EXECUTED
3000b9e8: e1800d81 orr r0, r0, r1, lsl #27 <== NOT EXECUTED
(( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
3000b9ec: e1800003 orr r0, r0, r3 <== NOT EXECUTED
uint32_t node,
uint32_t index
)
{
return _Objects_Build_id( api, class, node, index );
}
3000b9f0: e1800802 orr r0, r0, r2, lsl #16 <== NOT EXECUTED
3000b9f4: e12fff1e bx lr <== NOT EXECUTED
3000b9f8 <rtems_build_name>:
char C1,
char C2,
char C3,
char C4
)
{
3000b9f8: e1a01801 lsl r1, r1, #16 <== NOT EXECUTED
3000b9fc: e1a02402 lsl r2, r2, #8 <== NOT EXECUTED
return _Objects_Build_name( C1, C2, C3, C4 );
3000ba00: e20118ff and r1, r1, #16711680 ; 0xff0000 <== NOT EXECUTED
3000ba04: e1811c00 orr r1, r1, r0, lsl #24 <== NOT EXECUTED
3000ba08: e2022cff and r2, r2, #65280 ; 0xff00 <== NOT EXECUTED
char C1,
char C2,
char C3,
char C4
)
{
3000ba0c: e20330ff and r3, r3, #255 ; 0xff <== NOT EXECUTED
return _Objects_Build_name( C1, C2, C3, C4 );
3000ba10: e1811002 orr r1, r1, r2 <== NOT EXECUTED
}
3000ba14: e1810003 orr r0, r1, r3 <== NOT EXECUTED
3000ba18: e12fff1e bx lr <== NOT EXECUTED
3000aa20 <rtems_chain_append_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
3000aa20: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
3000aa24: e1a04002 mov r4, r2 <== NOT EXECUTED
3000aa28: e1a05003 mov r5, r3 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Append_with_empty_check( chain, node );
3000aa2c: eb000134 bl 3000af04 <_Chain_Append_with_empty_check> <== NOT EXECUTED
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
3000aa30: e3500000 cmp r0, #0 <== NOT EXECUTED
3000aa34: 08bd8030 popeq {r4, r5, pc} <== NOT EXECUTED
sc = rtems_event_send( task, events );
3000aa38: e1a00004 mov r0, r4 <== NOT EXECUTED
3000aa3c: e1a01005 mov r1, r5 <== NOT EXECUTED
}
return sc;
}
3000aa40: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_append_with_empty_check( chain, node );
if ( was_empty ) {
sc = rtems_event_send( task, events );
3000aa44: eafffd87 b 3000a068 <rtems_event_send> <== NOT EXECUTED
3000aa48 <rtems_chain_get_with_notification>:
rtems_chain_control *chain,
rtems_id task,
rtems_event_set events,
rtems_chain_node **node
)
{
3000aa48: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
3000aa4c: e1a04001 mov r4, r1 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool rtems_chain_get_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node **node
)
{
return _Chain_Get_with_empty_check( chain, node );
3000aa50: e1a01003 mov r1, r3 <== NOT EXECUTED
3000aa54: e1a05002 mov r5, r2 <== NOT EXECUTED
3000aa58: eb00014c bl 3000af90 <_Chain_Get_with_empty_check> <== NOT EXECUTED
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
3000aa5c: e3500000 cmp r0, #0 <== NOT EXECUTED
3000aa60: 08bd8030 popeq {r4, r5, pc} <== NOT EXECUTED
sc = rtems_event_send( task, events );
3000aa64: e1a00004 mov r0, r4 <== NOT EXECUTED
3000aa68: e1a01005 mov r1, r5 <== NOT EXECUTED
}
return sc;
}
3000aa6c: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool is_empty = rtems_chain_get_with_empty_check( chain, node );
if ( is_empty ) {
sc = rtems_event_send( task, events );
3000aa70: eafffd7c b 3000a068 <rtems_event_send> <== NOT EXECUTED
3000aa74 <rtems_chain_get_with_wait>:
rtems_chain_control *chain,
rtems_event_set events,
rtems_interval timeout,
rtems_chain_node **node_ptr
)
{
3000aa74: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr} <== NOT EXECUTED
3000aa78: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3000aa7c: e1a07000 mov r7, r0 <== NOT EXECUTED
3000aa80: e1a06001 mov r6, r1 <== NOT EXECUTED
3000aa84: e1a05002 mov r5, r2 <== NOT EXECUTED
3000aa88: e1a0a003 mov sl, r3 <== NOT EXECUTED
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
) {
rtems_event_set out;
sc = rtems_event_receive(
3000aa8c: e1a0800d mov r8, sp <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get(
rtems_chain_control *the_chain
)
{
return _Chain_Get( the_chain );
3000aa90: e1a00007 mov r0, r7 <== NOT EXECUTED
3000aa94: eb000152 bl 3000afe4 <_Chain_Get> <== NOT EXECUTED
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
3000aa98: e2504000 subs r4, r0, #0 <== NOT EXECUTED
) {
rtems_event_set out;
sc = rtems_event_receive(
3000aa9c: e1a02005 mov r2, r5 <== NOT EXECUTED
3000aaa0: e1a0300d mov r3, sp <== NOT EXECUTED
3000aaa4: e1a01004 mov r1, r4 <== NOT EXECUTED
3000aaa8: e1a00006 mov r0, r6 <== NOT EXECUTED
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
3000aaac: 1a000005 bne 3000aac8 <rtems_chain_get_with_wait+0x54> <== NOT EXECUTED
) {
rtems_event_set out;
sc = rtems_event_receive(
3000aab0: ebfffd0f bl 30009ef4 <rtems_event_receive> <== NOT EXECUTED
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
3000aab4: e3500000 cmp r0, #0 <== NOT EXECUTED
3000aab8: 0afffff4 beq 3000aa90 <rtems_chain_get_with_wait+0x1c> <== NOT EXECUTED
timeout,
&out
);
}
*node_ptr = node;
3000aabc: e58a4000 str r4, [sl] <== NOT EXECUTED
return sc;
}
3000aac0: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000aac4: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_chain_node *node = NULL;
while (
sc == RTEMS_SUCCESSFUL
&& (node = rtems_chain_get( chain )) == NULL
3000aac8: e3a00000 mov r0, #0 <== NOT EXECUTED
3000aacc: eafffffa b 3000aabc <rtems_chain_get_with_wait+0x48> <== NOT EXECUTED
3000aad0 <rtems_chain_prepend_with_notification>:
rtems_chain_control *chain,
rtems_chain_node *node,
rtems_id task,
rtems_event_set events
)
{
3000aad0: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
3000aad4: e1a04002 mov r4, r2 <== NOT EXECUTED
3000aad8: e1a05003 mov r5, r3 <== NOT EXECUTED
RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check(
rtems_chain_control *chain,
rtems_chain_node *node
)
{
return _Chain_Prepend_with_empty_check( chain, node );
3000aadc: eb000157 bl 3000b040 <_Chain_Prepend_with_empty_check> <== NOT EXECUTED
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
3000aae0: e3500000 cmp r0, #0 <== NOT EXECUTED
3000aae4: 08bd8030 popeq {r4, r5, pc} <== NOT EXECUTED
sc = rtems_event_send( task, events );
3000aae8: e1a00004 mov r0, r4 <== NOT EXECUTED
3000aaec: e1a01005 mov r1, r5 <== NOT EXECUTED
}
return sc;
}
3000aaf0: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool was_empty = rtems_chain_prepend_with_empty_check( chain, node );
if (was_empty) {
sc = rtems_event_send( task, events );
3000aaf4: eafffd5b b 3000a068 <rtems_event_send> <== NOT EXECUTED
30017014 <rtems_clock_get>:
rtems_status_code rtems_clock_get(
rtems_clock_get_options option,
void *time_buffer
)
{
30017014: e92d4010 push {r4, lr} <== NOT EXECUTED
if ( !time_buffer )
30017018: e2514000 subs r4, r1, #0 <== NOT EXECUTED
3001701c: 0a000012 beq 3001706c <rtems_clock_get+0x58> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
30017020: e3500000 cmp r0, #0 <== NOT EXECUTED
30017024: 0a00000d beq 30017060 <rtems_clock_get+0x4c> <== NOT EXECUTED
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
30017028: e3500001 cmp r0, #1 <== NOT EXECUTED
3001702c: 0a000011 beq 30017078 <rtems_clock_get+0x64> <== NOT EXECUTED
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
30017030: e3500002 cmp r0, #2 <== NOT EXECUTED
30017034: 0a000012 beq 30017084 <rtems_clock_get+0x70> <== NOT EXECUTED
*interval = rtems_clock_get_ticks_since_boot();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
30017038: e3500003 cmp r0, #3 <== NOT EXECUTED
3001703c: 0a000014 beq 30017094 <rtems_clock_get+0x80> <== NOT EXECUTED
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
30017040: e3500004 cmp r0, #4 <== NOT EXECUTED
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
30017044: 13a0300a movne r3, #10 <== NOT EXECUTED
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
30017048: 0a000001 beq 30017054 <rtems_clock_get+0x40> <== NOT EXECUTED
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
3001704c: e1a00003 mov r0, r3 <== NOT EXECUTED
30017050: e8bd8010 pop {r4, pc} <== NOT EXECUTED
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
30017054: e1a00004 mov r0, r4 <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
}
30017058: e8bd4010 pop {r4, lr} <== NOT EXECUTED
*interval = rtems_clock_get_ticks_per_second();
return RTEMS_SUCCESSFUL;
}
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
3001705c: ea000060 b 300171e4 <rtems_clock_get_tod_timeval> <== NOT EXECUTED
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
30017060: e1a00004 mov r0, r4 <== NOT EXECUTED
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
30017064: e8bd4010 pop {r4, lr} <== NOT EXECUTED
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
30017068: ea000027 b 3001710c <rtems_clock_get_tod> <== NOT EXECUTED
rtems_clock_get_options option,
void *time_buffer
)
{
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
3001706c: e3a03009 mov r3, #9 <== NOT EXECUTED
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
30017070: e1a00003 mov r0, r3 <== NOT EXECUTED
30017074: e8bd8010 pop {r4, pc} <== NOT EXECUTED
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
30017078: e1a00004 mov r0, r4 <== NOT EXECUTED
if ( option == RTEMS_CLOCK_GET_TIME_VALUE )
return rtems_clock_get_tod_timeval( (struct timeval *)time_buffer );
return RTEMS_INVALID_NUMBER;
}
3001707c: e8bd4010 pop {r4, lr} <== NOT EXECUTED
if ( option == RTEMS_CLOCK_GET_TOD )
return rtems_clock_get_tod( (rtems_time_of_day *)time_buffer );
if ( option == RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH )
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
30017080: ea000007 b 300170a4 <rtems_clock_get_seconds_since_epoch> <== NOT EXECUTED
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_since_boot();
30017084: eb00001c bl 300170fc <rtems_clock_get_ticks_since_boot> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30017088: e3a03000 mov r3, #0 <== NOT EXECUTED
return rtems_clock_get_seconds_since_epoch((rtems_interval *)time_buffer);
if ( option == RTEMS_CLOCK_GET_TICKS_SINCE_BOOT ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_since_boot();
3001708c: e5840000 str r0, [r4] <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30017090: eaffffed b 3001704c <rtems_clock_get+0x38> <== NOT EXECUTED
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_per_second();
30017094: eb000010 bl 300170dc <rtems_clock_get_ticks_per_second> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30017098: e3a03000 mov r3, #0 <== NOT EXECUTED
}
if ( option == RTEMS_CLOCK_GET_TICKS_PER_SECOND ) {
rtems_interval *interval = (rtems_interval *)time_buffer;
*interval = rtems_clock_get_ticks_per_second();
3001709c: e5840000 str r0, [r4] <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
300170a0: eaffffe9 b 3001704c <rtems_clock_get+0x38> <== NOT EXECUTED
3000a904 <rtems_clock_get_seconds_since_epoch>:
rtems_status_code rtems_clock_get_seconds_since_epoch(
rtems_interval *the_interval
)
{
if ( !the_interval )
3000a904: e2502000 subs r2, r0, #0 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
3000a908: 03a00009 moveq r0, #9 <== NOT EXECUTED
rtems_status_code rtems_clock_get_seconds_since_epoch(
rtems_interval *the_interval
)
{
if ( !the_interval )
3000a90c: 012fff1e bxeq lr <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
3000a910: e59f301c ldr r3, [pc, #28] ; 3000a934 <rtems_clock_get_seconds_since_epoch+0x30><== NOT EXECUTED
3000a914: e5d33000 ldrb r3, [r3] <== NOT EXECUTED
3000a918: e3530000 cmp r3, #0 <== NOT EXECUTED
return RTEMS_NOT_DEFINED;
*the_interval = _TOD_Seconds_since_epoch();
3000a91c: 159f3014 ldrne r3, [pc, #20] ; 3000a938 <rtems_clock_get_seconds_since_epoch+0x34><== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000a920: 13a00000 movne r0, #0 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
*the_interval = _TOD_Seconds_since_epoch();
3000a924: 15933000 ldrne r3, [r3] <== NOT EXECUTED
{
if ( !the_interval )
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
3000a928: 03a0000b moveq r0, #11 <== NOT EXECUTED
*the_interval = _TOD_Seconds_since_epoch();
3000a92c: 15823000 strne r3, [r2] <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
}
3000a930: e12fff1e bx lr <== NOT EXECUTED
300094b4 <rtems_clock_get_ticks_per_second>:
#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
rtems_interval rtems_clock_get_ticks_per_second(void)
{
return TOD_MICROSECONDS_PER_SECOND /
300094b4: e59f3010 ldr r3, [pc, #16] ; 300094cc <rtems_clock_get_ticks_per_second+0x18><== NOT EXECUTED
#include <rtems/score/thread.h>
#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
rtems_interval rtems_clock_get_ticks_per_second(void)
{
300094b8: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
return TOD_MICROSECONDS_PER_SECOND /
300094bc: e593100c ldr r1, [r3, #12] <== NOT EXECUTED
300094c0: e59f0008 ldr r0, [pc, #8] ; 300094d0 <rtems_clock_get_ticks_per_second+0x1c><== NOT EXECUTED
300094c4: eb002cda bl 30014834 <__aeabi_uidiv> <== NOT EXECUTED
rtems_configuration_get_microseconds_per_tick();
}
300094c8: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
300094d4 <rtems_clock_get_ticks_since_boot>:
#include <rtems/score/tod.h>
#include <rtems/score/watchdog.h>
rtems_interval rtems_clock_get_ticks_since_boot(void)
{
return _Watchdog_Ticks_since_boot;
300094d4: e59f3004 ldr r3, [pc, #4] ; 300094e0 <rtems_clock_get_ticks_since_boot+0xc><== NOT EXECUTED
300094d8: e5930000 ldr r0, [r3] <== NOT EXECUTED
}
300094dc: e12fff1e bx lr <== NOT EXECUTED
300171e4 <rtems_clock_get_tod_timeval>:
#include <rtems/score/watchdog.h>
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
300171e4: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
if ( !time )
300171e8: e2504000 subs r4, r0, #0 <== NOT EXECUTED
#include <rtems/score/watchdog.h>
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
300171ec: e24dd008 sub sp, sp, #8 <== NOT EXECUTED
if ( !time )
return RTEMS_INVALID_ADDRESS;
300171f0: 03a00009 moveq r0, #9 <== NOT EXECUTED
rtems_status_code rtems_clock_get_tod_timeval(
struct timeval *time
)
{
if ( !time )
300171f4: 0a000012 beq 30017244 <rtems_clock_get_tod_timeval+0x60> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
300171f8: e59f304c ldr r3, [pc, #76] ; 3001724c <rtems_clock_get_tod_timeval+0x68><== NOT EXECUTED
300171fc: e5d33000 ldrb r3, [r3] <== NOT EXECUTED
30017200: e3530000 cmp r3, #0 <== NOT EXECUTED
return RTEMS_NOT_DEFINED;
30017204: 03a0000b moveq r0, #11 <== NOT EXECUTED
)
{
if ( !time )
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Is_set )
30017208: 0a00000d beq 30017244 <rtems_clock_get_tod_timeval+0x60> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001720c: e10f5000 mrs r5, CPSR <== NOT EXECUTED
30017210: e3853080 orr r3, r5, #128 ; 0x80 <== NOT EXECUTED
30017214: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
ISR_Level level;
struct timespec now;
suseconds_t useconds;
_ISR_Disable(level);
_TOD_Get( &now );
30017218: e1a0000d mov r0, sp <== NOT EXECUTED
3001721c: eb0011bb bl 3001b910 <_TOD_Get> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30017220: e129f005 msr CPSR_fc, r5 <== NOT EXECUTED
_ISR_Enable(level);
useconds = (suseconds_t)now.tv_nsec;
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
30017224: e59f2024 ldr r2, [pc, #36] ; 30017250 <rtems_clock_get_tod_timeval+0x6c><== NOT EXECUTED
_ISR_Disable(level);
_TOD_Get( &now );
_ISR_Enable(level);
useconds = (suseconds_t)now.tv_nsec;
30017228: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
return RTEMS_NOT_DEFINED;
_TOD_Get_timeval( time );
return RTEMS_SUCCESSFUL;
3001722c: e3a00000 mov r0, #0 <== NOT EXECUTED
useconds /= (suseconds_t)TOD_NANOSECONDS_PER_MICROSECOND;
30017230: e0c21293 smull r1, r2, r3, r2 <== NOT EXECUTED
30017234: e1a03fc3 asr r3, r3, #31 <== NOT EXECUTED
30017238: e0633342 rsb r3, r3, r2, asr #6 <== NOT EXECUTED
time->tv_sec = now.tv_sec;
3001723c: e59d2000 ldr r2, [sp] <== NOT EXECUTED
time->tv_usec = useconds;
30017240: e884000c stm r4, {r2, r3} <== NOT EXECUTED
}
30017244: e28dd008 add sp, sp, #8 <== NOT EXECUTED
30017248: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
30009708 <rtems_clock_get_uptime>:
*/
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
if ( !uptime )
30009708: e3500000 cmp r0, #0 <== NOT EXECUTED
* error code - if unsuccessful
*/
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
3000970c: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
if ( !uptime )
30009710: 0a000002 beq 30009720 <rtems_clock_get_uptime+0x18> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_TOD_Get_uptime_as_timespec( uptime );
30009714: eb000588 bl 3000ad3c <_TOD_Get_uptime_as_timespec> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30009718: e3a00000 mov r0, #0 <== NOT EXECUTED
3000971c: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
rtems_status_code rtems_clock_get_uptime(
struct timespec *uptime
)
{
if ( !uptime )
return RTEMS_INVALID_ADDRESS;
30009720: e3a00009 mov r0, #9 <== NOT EXECUTED
_TOD_Get_uptime_as_timespec( uptime );
return RTEMS_SUCCESSFUL;
}
30009724: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
30009500 <rtems_clock_tick>:
*
* NOTE: This routine only works for leap-years through 2099.
*/
rtems_status_code rtems_clock_tick( void )
{
30009500: e52de004 push {lr} ; (str lr, [sp, #-4]!)
_TOD_Tickle_ticks();
30009504: eb000524 bl 3000a99c <_TOD_Tickle_ticks>
*/
RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_ticks( void )
{
_Watchdog_Tickle( &_Watchdog_Ticks_chain );
30009508: e59f0038 ldr r0, [pc, #56] ; 30009548 <rtems_clock_tick+0x48>
3000950c: eb000ef0 bl 3000d0d4 <_Watchdog_Tickle>
_Watchdog_Tickle_ticks();
_Thread_Tickle_timeslice();
30009510: eb000d5f bl 3000ca94 <_Thread_Tickle_timeslice>
* otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_context_switch_necessary( void )
{
return ( _Thread_Dispatch_necessary );
30009514: e59f3030 ldr r3, [pc, #48] ; 3000954c <rtems_clock_tick+0x4c>
30009518: e5d33010 ldrb r3, [r3, #16]
if ( _Thread_Is_context_switch_necessary() &&
3000951c: e3530000 cmp r3, #0
30009520: 0a000003 beq 30009534 <rtems_clock_tick+0x34>
* otherwise.
*/
RTEMS_INLINE_ROUTINE bool _Thread_Is_dispatching_enabled( void )
{
return ( _Thread_Dispatch_disable_level == 0 );
30009524: e59f3024 ldr r3, [pc, #36] ; 30009550 <rtems_clock_tick+0x50><== NOT EXECUTED
30009528: e5933000 ldr r3, [r3] <== NOT EXECUTED
3000952c: e3530000 cmp r3, #0 <== NOT EXECUTED
30009530: 0a000001 beq 3000953c <rtems_clock_tick+0x3c> <== NOT EXECUTED
_Thread_Is_dispatching_enabled() )
_Thread_Dispatch();
return RTEMS_SUCCESSFUL;
}
30009534: e3a00000 mov r0, #0
30009538: e49df004 pop {pc} ; (ldr pc, [sp], #4)
_Thread_Tickle_timeslice();
if ( _Thread_Is_context_switch_necessary() &&
_Thread_Is_dispatching_enabled() )
_Thread_Dispatch();
3000953c: eb000a7a bl 3000bf2c <_Thread_Dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
}
30009540: e3a00000 mov r0, #0 <== NOT EXECUTED
30009544: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
30009554 <rtems_event_receive>:
rtems_event_set event_in,
rtems_option option_set,
rtems_interval ticks,
rtems_event_set *event_out
)
{
30009554: e92d4070 push {r4, r5, r6, lr}
RTEMS_API_Control *api;
if ( !event_out )
30009558: e2536000 subs r6, r3, #0
3000955c: 0a000010 beq 300095a4 <rtems_event_receive+0x50>
return RTEMS_INVALID_ADDRESS;
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
30009560: e59f4044 ldr r4, [pc, #68] ; 300095ac <rtems_event_receive+0x58>
if ( _Event_sets_Is_empty( event_in ) ) {
30009564: e3500000 cmp r0, #0
RTEMS_API_Control *api;
if ( !event_out )
return RTEMS_INVALID_ADDRESS;
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
30009568: e5945004 ldr r5, [r4, #4]
3000956c: e59550f4 ldr r5, [r5, #244] ; 0xf4
if ( _Event_sets_Is_empty( event_in ) ) {
30009570: 1a000002 bne 30009580 <rtems_event_receive+0x2c>
*event_out = api->pending_events;
30009574: e5953000 ldr r3, [r5]
30009578: e5863000 str r3, [r6]
return RTEMS_SUCCESSFUL;
3000957c: e8bd8070 pop {r4, r5, r6, pc}
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
30009580: e59fc028 ldr ip, [pc, #40] ; 300095b0 <rtems_event_receive+0x5c>
30009584: e59ce000 ldr lr, [ip]
30009588: e28ee001 add lr, lr, #1
3000958c: e58ce000 str lr, [ip]
}
_Thread_Disable_dispatch();
_Event_Seize( event_in, option_set, ticks, event_out );
30009590: eb000007 bl 300095b4 <_Event_Seize>
_Thread_Enable_dispatch();
30009594: eb000aba bl 3000c084 <_Thread_Enable_dispatch>
return( _Thread_Executing->Wait.return_code );
30009598: e5943004 ldr r3, [r4, #4]
3000959c: e5930034 ldr r0, [r3, #52] ; 0x34
300095a0: e8bd8070 pop {r4, r5, r6, pc}
)
{
RTEMS_API_Control *api;
if ( !event_out )
return RTEMS_INVALID_ADDRESS;
300095a4: e3a00009 mov r0, #9 <== NOT EXECUTED
_Thread_Disable_dispatch();
_Event_Seize( event_in, option_set, ticks, event_out );
_Thread_Enable_dispatch();
return( _Thread_Executing->Wait.return_code );
}
300095a8: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
3000baf0 <rtems_extension_create>:
rtems_status_code rtems_extension_create(
rtems_name name,
const rtems_extensions_table *extension_table,
rtems_id *id
)
{
3000baf0: e92d41f0 push {r4, r5, r6, r7, r8, lr}
Extension_Control *the_extension;
if ( !id )
3000baf4: e2526000 subs r6, r2, #0
rtems_status_code rtems_extension_create(
rtems_name name,
const rtems_extensions_table *extension_table,
rtems_id *id
)
{
3000baf8: e1a04000 mov r4, r0
3000bafc: e1a08001 mov r8, r1
Extension_Control *the_extension;
if ( !id )
return RTEMS_INVALID_ADDRESS;
3000bb00: 03a00009 moveq r0, #9
rtems_id *id
)
{
Extension_Control *the_extension;
if ( !id )
3000bb04: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc}
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
3000bb08: e3540000 cmp r4, #0
3000bb0c: 1a000001 bne 3000bb18 <rtems_extension_create+0x28>
return RTEMS_INVALID_NAME;
3000bb10: e3a00003 mov r0, #3 <== NOT EXECUTED
);
*id = the_extension->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
3000bb14: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000bb18: e59f306c ldr r3, [pc, #108] ; 3000bb8c <rtems_extension_create+0x9c>
3000bb1c: e5932000 ldr r2, [r3]
3000bb20: e2822001 add r2, r2, #1
3000bb24: e5832000 str r2, [r3]
#ifndef __EXTENSION_MANAGER_inl
#define __EXTENSION_MANAGER_inl
RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Allocate( void )
{
return (Extension_Control *) _Objects_Allocate( &_Extension_Information );
3000bb28: e59f7060 ldr r7, [pc, #96] ; 3000bb90 <rtems_extension_create+0xa0>
3000bb2c: e1a00007 mov r0, r7
3000bb30: eb0003a5 bl 3000c9cc <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_extension = _Extension_Allocate();
if ( !the_extension ) {
3000bb34: e2505000 subs r5, r0, #0
3000bb38: 0a000010 beq 3000bb80 <rtems_extension_create+0x90>
RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table(
User_extensions_Control *extension,
const User_extensions_Table *extension_table
)
{
extension->Callouts = *extension_table;
3000bb3c: e285c024 add ip, r5, #36 ; 0x24
3000bb40: e1a0e008 mov lr, r8
3000bb44: e8be000f ldm lr!, {r0, r1, r2, r3}
3000bb48: e8ac000f stmia ip!, {r0, r1, r2, r3}
3000bb4c: e89e000f ldm lr, {r0, r1, r2, r3}
3000bb50: e88c000f stm ip, {r0, r1, r2, r3}
_User_extensions_Add_set( extension );
3000bb54: e2850010 add r0, r5, #16
3000bb58: eb000b50 bl 3000e8a0 <_User_extensions_Add_set>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
3000bb5c: e5953008 ldr r3, [r5, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3000bb60: e597201c ldr r2, [r7, #28]
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
3000bb64: e1a01803 lsl r1, r3, #16
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3000bb68: e7825721 str r5, [r2, r1, lsr #14]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
3000bb6c: e585400c str r4, [r5, #12]
&_Extension_Information,
&the_extension->Object,
(Objects_Name) name
);
*id = the_extension->Object.id;
3000bb70: e5863000 str r3, [r6]
_Thread_Enable_dispatch();
3000bb74: eb000833 bl 3000dc48 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000bb78: e3a00000 mov r0, #0
3000bb7c: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
_Thread_Disable_dispatch(); /* to prevent deletion */
the_extension = _Extension_Allocate();
if ( !the_extension ) {
_Thread_Enable_dispatch();
3000bb80: eb000830 bl 3000dc48 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_TOO_MANY;
3000bb84: e3a00005 mov r0, #5 <== NOT EXECUTED
3000bb88: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
3000c788 <rtems_extension_ident>:
rtems_status_code rtems_extension_ident(
rtems_name name,
rtems_id *id
)
{
3000c788: e1a02000 mov r2, r0 <== NOT EXECUTED
3000c78c: e1a03001 mov r3, r1 <== NOT EXECUTED
3000c790: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
Objects_Name_or_id_lookup_errors status;
status = _Objects_Name_to_id_u32(
3000c794: e1a01002 mov r1, r2 <== NOT EXECUTED
3000c798: e59f0010 ldr r0, [pc, #16] ; 3000c7b0 <rtems_extension_ident+0x28><== NOT EXECUTED
3000c79c: e3e02102 mvn r2, #-2147483648 ; 0x80000000 <== NOT EXECUTED
3000c7a0: eb0004c0 bl 3000daa8 <_Objects_Name_to_id_u32> <== NOT EXECUTED
name,
OBJECTS_SEARCH_LOCAL_NODE,
id
);
return _Status_Object_name_errors_to_status[ status ];
3000c7a4: e59f3008 ldr r3, [pc, #8] ; 3000c7b4 <rtems_extension_ident+0x2c><== NOT EXECUTED
}
3000c7a8: e7930100 ldr r0, [r3, r0, lsl #2] <== NOT EXECUTED
3000c7ac: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
3000c5cc <rtems_get_version_string>:
#include <rtems/system.h>
const char *rtems_get_version_string(void)
{
return _RTEMS_version;
}
3000c5cc: e59f0000 ldr r0, [pc, #0] ; 3000c5d4 <rtems_get_version_string+0x8><== NOT EXECUTED
3000c5d0: e12fff1e bx lr <== NOT EXECUTED
3000a9fc <rtems_interrupt_disable>:
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000a9fc: e10f0000 mrs r0, CPSR <== NOT EXECUTED
3000aa00: e3803080 orr r3, r0, #128 ; 0x80 <== NOT EXECUTED
3000aa04: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
rtems_interrupt_level previous_level;
_ISR_Disable( previous_level );
return previous_level;
}
3000aa08: e12fff1e bx lr <== NOT EXECUTED
3000aa0c <rtems_interrupt_enable>:
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000aa0c: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
void rtems_interrupt_enable(
rtems_interrupt_level previous_level
)
{
_ISR_Enable( previous_level );
}
3000aa10: e12fff1e bx lr <== NOT EXECUTED
3000aa14 <rtems_interrupt_flash>:
static inline void arm_interrupt_flash( uint32_t level )
{
uint32_t arm_switch_reg;
__asm__ volatile (
3000aa14: e10f3000 mrs r3, CPSR <== NOT EXECUTED
3000aa18: e129f000 msr CPSR_fc, r0 <== NOT EXECUTED
3000aa1c: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
void rtems_interrupt_flash(
rtems_interrupt_level previous_level
)
{
_ISR_Flash( previous_level );
}
3000aa20: e12fff1e bx lr <== NOT EXECUTED
3000aa24 <rtems_interrupt_is_in_progress>:
#undef rtems_interrupt_is_in_progress
bool rtems_interrupt_is_in_progress( void )
{
return _ISR_Is_in_progress();
3000aa24: e59f300c ldr r3, [pc, #12] ; 3000aa38 <rtems_interrupt_is_in_progress+0x14><== NOT EXECUTED
3000aa28: e5930000 ldr r0, [r3] <== NOT EXECUTED
}
3000aa2c: e2500000 subs r0, r0, #0 <== NOT EXECUTED
3000aa30: 13a00001 movne r0, #1 <== NOT EXECUTED
3000aa34: e12fff1e bx lr <== NOT EXECUTED
3000a3cc <rtems_interrupt_level_attribute>:
rtems_attribute rtems_interrupt_level_attribute(
uint32_t level
)
{
return RTEMS_INTERRUPT_LEVEL(level);
}
3000a3cc: e2000080 and r0, r0, #128 ; 0x80 <== NOT EXECUTED
3000a3d0: e12fff1e bx lr <== NOT EXECUTED
30010e1c <rtems_io_close>:
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010e1c: e59fc044 ldr ip, [pc, #68] ; 30010e68 <rtems_io_close+0x4c>
rtems_status_code rtems_io_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010e20: e1a03000 mov r3, r0
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010e24: e59cc000 ldr ip, [ip]
rtems_status_code rtems_io_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010e28: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010e2c: e15c0000 cmp ip, r0
return RTEMS_INVALID_NUMBER;
30010e30: 93a0000a movls r0, #10
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010e34: 949df004 popls {pc} ; (ldrls pc, [sp], #4)
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].close_entry;
30010e38: e59fc02c ldr ip, [pc, #44] ; 30010e6c <rtems_io_close+0x50>
30010e3c: e0833083 add r3, r3, r3, lsl #1
30010e40: e59cc000 ldr ip, [ip]
30010e44: e08c3183 add r3, ip, r3, lsl #3
30010e48: e5933008 ldr r3, [r3, #8]
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
30010e4c: e3530000 cmp r3, #0
30010e50: 0a000002 beq 30010e60 <rtems_io_close+0x44>
30010e54: e1a0e00f mov lr, pc
30010e58: e12fff13 bx r3
30010e5c: e49df004 pop {pc} ; (ldr pc, [sp], #4)
30010e60: e1a00003 mov r0, r3 <== NOT EXECUTED
}
30010e64: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
30010e70 <rtems_io_control>:
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010e70: e59fc044 ldr ip, [pc, #68] ; 30010ebc <rtems_io_control+0x4c>
rtems_status_code rtems_io_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010e74: e1a03000 mov r3, r0
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010e78: e59cc000 ldr ip, [ip]
rtems_status_code rtems_io_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010e7c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010e80: e15c0000 cmp ip, r0
return RTEMS_INVALID_NUMBER;
30010e84: 93a0000a movls r0, #10
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010e88: 949df004 popls {pc} ; (ldrls pc, [sp], #4)
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].control_entry;
30010e8c: e59fc02c ldr ip, [pc, #44] ; 30010ec0 <rtems_io_control+0x50>
30010e90: e0833083 add r3, r3, r3, lsl #1
30010e94: e59cc000 ldr ip, [ip]
30010e98: e08c3183 add r3, ip, r3, lsl #3
30010e9c: e5933014 ldr r3, [r3, #20]
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
30010ea0: e3530000 cmp r3, #0
30010ea4: 0a000002 beq 30010eb4 <rtems_io_control+0x44>
30010ea8: e1a0e00f mov lr, pc
30010eac: e12fff13 bx r3
30010eb0: e49df004 pop {pc} ; (ldr pc, [sp], #4)
30010eb4: e1a00003 mov r0, r3 <== NOT EXECUTED
}
30010eb8: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
30010ec4 <rtems_io_open>:
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010ec4: e59fc044 ldr ip, [pc, #68] ; 30010f10 <rtems_io_open+0x4c>
rtems_status_code rtems_io_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010ec8: e1a03000 mov r3, r0
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010ecc: e59cc000 ldr ip, [ip]
rtems_status_code rtems_io_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010ed0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010ed4: e15c0000 cmp ip, r0
return RTEMS_INVALID_NUMBER;
30010ed8: 93a0000a movls r0, #10
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010edc: 949df004 popls {pc} ; (ldrls pc, [sp], #4)
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].open_entry;
30010ee0: e59fc02c ldr ip, [pc, #44] ; 30010f14 <rtems_io_open+0x50>
30010ee4: e0833083 add r3, r3, r3, lsl #1
30010ee8: e59cc000 ldr ip, [ip]
30010eec: e08c3183 add r3, ip, r3, lsl #3
30010ef0: e5933004 ldr r3, [r3, #4]
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
30010ef4: e3530000 cmp r3, #0
30010ef8: 0a000002 beq 30010f08 <rtems_io_open+0x44>
30010efc: e1a0e00f mov lr, pc
30010f00: e12fff13 bx r3
30010f04: e49df004 pop {pc} ; (ldr pc, [sp], #4)
30010f08: e1a00003 mov r0, r3 <== NOT EXECUTED
}
30010f0c: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
30010f18 <rtems_io_read>:
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010f18: e59fc044 ldr ip, [pc, #68] ; 30010f64 <rtems_io_read+0x4c>
rtems_status_code rtems_io_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010f1c: e1a03000 mov r3, r0
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010f20: e59cc000 ldr ip, [ip]
rtems_status_code rtems_io_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010f24: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010f28: e15c0000 cmp ip, r0
return RTEMS_INVALID_NUMBER;
30010f2c: 93a0000a movls r0, #10
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010f30: 949df004 popls {pc} ; (ldrls pc, [sp], #4)
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].read_entry;
30010f34: e59fc02c ldr ip, [pc, #44] ; 30010f68 <rtems_io_read+0x50>
30010f38: e0833083 add r3, r3, r3, lsl #1
30010f3c: e59cc000 ldr ip, [ip]
30010f40: e08c3183 add r3, ip, r3, lsl #3
30010f44: e593300c ldr r3, [r3, #12]
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
30010f48: e3530000 cmp r3, #0
30010f4c: 0a000002 beq 30010f5c <rtems_io_read+0x44>
30010f50: e1a0e00f mov lr, pc
30010f54: e12fff13 bx r3
30010f58: e49df004 pop {pc} ; (ldr pc, [sp], #4)
30010f5c: e1a00003 mov r0, r3 <== NOT EXECUTED
}
30010f60: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
3000b7a8 <rtems_io_register_driver>:
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
3000b7a8: e59fc150 ldr ip, [pc, #336] ; 3000b900 <rtems_io_register_driver+0x158>
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
3000b7ac: e59f3150 ldr r3, [pc, #336] ; 3000b904 <rtems_io_register_driver+0x15c>
if ( rtems_interrupt_is_in_progress() )
3000b7b0: e59cc000 ldr ip, [ip]
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
3000b7b4: e92d4030 push {r4, r5, lr}
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
3000b7b8: e35c0000 cmp ip, #0
rtems_status_code rtems_io_register_driver(
rtems_device_major_number major,
const rtems_driver_address_table *driver_table,
rtems_device_major_number *registered_major
)
{
3000b7bc: e1a04000 mov r4, r0
rtems_device_major_number major_limit = _IO_Number_of_drivers;
3000b7c0: e5930000 ldr r0, [r3]
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
3000b7c4: 13a00012 movne r0, #18
rtems_device_major_number *registered_major
)
{
rtems_device_major_number major_limit = _IO_Number_of_drivers;
if ( rtems_interrupt_is_in_progress() )
3000b7c8: 18bd8030 popne {r4, r5, pc}
return RTEMS_CALLED_FROM_ISR;
if ( registered_major == NULL )
3000b7cc: e3520000 cmp r2, #0
3000b7d0: 0a00003f beq 3000b8d4 <rtems_io_register_driver+0x12c>
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
if ( driver_table == NULL )
3000b7d4: e3510000 cmp r1, #0
if ( registered_major == NULL )
return RTEMS_INVALID_ADDRESS;
/* Set it to an invalid value */
*registered_major = major_limit;
3000b7d8: e5820000 str r0, [r2]
if ( driver_table == NULL )
3000b7dc: 0a00003c beq 3000b8d4 <rtems_io_register_driver+0x12c>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
3000b7e0: e591c000 ldr ip, [r1]
3000b7e4: e35c0000 cmp ip, #0
3000b7e8: 0a000036 beq 3000b8c8 <rtems_io_register_driver+0x120>
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
3000b7ec: e1500004 cmp r0, r4
3000b7f0: 9a000027 bls 3000b894 <rtems_io_register_driver+0xec>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000b7f4: e59f010c ldr r0, [pc, #268] ; 3000b908 <rtems_io_register_driver+0x160>
3000b7f8: e590c000 ldr ip, [r0]
3000b7fc: e28cc001 add ip, ip, #1
3000b800: e580c000 str ip, [r0]
return RTEMS_INVALID_NUMBER;
_Thread_Disable_dispatch();
if ( major == 0 ) {
3000b804: e3540000 cmp r4, #0
3000b808: 1a000023 bne 3000b89c <rtems_io_register_driver+0xf4>
static rtems_status_code rtems_io_obtain_major_number(
rtems_device_major_number *major
)
{
rtems_device_major_number n = _IO_Number_of_drivers;
3000b80c: e593c000 ldr ip, [r3]
rtems_device_major_number m = 0;
/* major is error checked by caller */
for ( m = 0; m < n; ++m ) {
3000b810: e35c0000 cmp ip, #0
3000b814: 0a000030 beq 3000b8dc <rtems_io_register_driver+0x134>
3000b818: e59fe0ec ldr lr, [pc, #236] ; 3000b90c <rtems_io_register_driver+0x164>
3000b81c: e59e3000 ldr r3, [lr]
3000b820: ea000003 b 3000b834 <rtems_io_register_driver+0x8c>
3000b824: e2844001 add r4, r4, #1
3000b828: e15c0004 cmp ip, r4
3000b82c: e2833018 add r3, r3, #24
3000b830: 9a000005 bls 3000b84c <rtems_io_register_driver+0xa4>
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
3000b834: e5930000 ldr r0, [r3]
3000b838: e3500000 cmp r0, #0
3000b83c: 1afffff8 bne 3000b824 <rtems_io_register_driver+0x7c>
3000b840: e5930004 ldr r0, [r3, #4]
3000b844: e3500000 cmp r0, #0
3000b848: 1afffff5 bne 3000b824 <rtems_io_register_driver+0x7c>
}
/* Assigns invalid value in case of failure */
*major = m;
if ( m != n )
3000b84c: e15c0004 cmp ip, r4
3000b850: 1084c084 addne ip, r4, r4, lsl #1
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
3000b854: e5824000 str r4, [r2]
if ( m != n )
3000b858: 11a0c18c lslne ip, ip, #3
3000b85c: 0a00001f beq 3000b8e0 <rtems_io_register_driver+0x138>
}
*registered_major = major;
}
_IO_Driver_address_table [major] = *driver_table;
3000b860: e59e5000 ldr r5, [lr]
3000b864: e1a0e001 mov lr, r1
3000b868: e085c00c add ip, r5, ip
3000b86c: e8be000f ldm lr!, {r0, r1, r2, r3}
3000b870: e8ac000f stmia ip!, {r0, r1, r2, r3}
3000b874: e89e0003 ldm lr, {r0, r1}
3000b878: e88c0003 stm ip, {r0, r1}
_Thread_Enable_dispatch();
3000b87c: eb0007ae bl 3000d73c <_Thread_Enable_dispatch>
return rtems_io_initialize( major, 0, NULL );
3000b880: e3a01000 mov r1, #0
3000b884: e1a00004 mov r0, r4
3000b888: e1a02001 mov r2, r1
}
3000b88c: e8bd4030 pop {r4, r5, lr}
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
3000b890: ea001f4a b 300135c0 <rtems_io_initialize>
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
if ( major >= major_limit )
return RTEMS_INVALID_NUMBER;
3000b894: e3a0000a mov r0, #10 <== NOT EXECUTED
_IO_Driver_address_table [major] = *driver_table;
_Thread_Enable_dispatch();
return rtems_io_initialize( major, 0, NULL );
}
3000b898: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
3000b89c: e59fe068 ldr lr, [pc, #104] ; 3000b90c <rtems_io_register_driver+0x164><== NOT EXECUTED
3000b8a0: e084c084 add ip, r4, r4, lsl #1 <== NOT EXECUTED
3000b8a4: e59e3000 ldr r3, [lr] <== NOT EXECUTED
3000b8a8: e1a0c18c lsl ip, ip, #3 <== NOT EXECUTED
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
3000b8ac: e793000c ldr r0, [r3, ip] <== NOT EXECUTED
_Thread_Enable_dispatch();
return sc;
}
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
3000b8b0: e083300c add r3, r3, ip <== NOT EXECUTED
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
3000b8b4: e3500000 cmp r0, #0 <== NOT EXECUTED
3000b8b8: 0a00000b beq 3000b8ec <rtems_io_register_driver+0x144> <== NOT EXECUTED
major = *registered_major;
} else {
rtems_driver_address_table *const table = _IO_Driver_address_table + major;
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
3000b8bc: eb00079e bl 3000d73c <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_RESOURCE_IN_USE;
3000b8c0: e3a0000c mov r0, #12 <== NOT EXECUTED
3000b8c4: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
3000b8c8: e591c004 ldr ip, [r1, #4]
3000b8cc: e35c0000 cmp ip, #0
3000b8d0: 1affffc5 bne 3000b7ec <rtems_io_register_driver+0x44>
if ( driver_table == NULL )
return RTEMS_INVALID_ADDRESS;
if ( rtems_io_is_empty_table( driver_table ) )
return RTEMS_INVALID_ADDRESS;
3000b8d4: e3a00009 mov r0, #9 <== NOT EXECUTED
3000b8d8: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
if ( rtems_io_is_empty_table( table ) )
break;
}
/* Assigns invalid value in case of failure */
*major = m;
3000b8dc: e5824000 str r4, [r2] <== NOT EXECUTED
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
3000b8e0: eb000795 bl 3000d73c <_Thread_Enable_dispatch> <== NOT EXECUTED
*major = m;
if ( m != n )
return RTEMS_SUCCESSFUL;
return RTEMS_TOO_MANY;
3000b8e4: e3a00005 mov r0, #5 <== NOT EXECUTED
if ( major == 0 ) {
rtems_status_code sc = rtems_io_obtain_major_number( registered_major );
if ( sc != RTEMS_SUCCESSFUL ) {
_Thread_Enable_dispatch();
return sc;
3000b8e8: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
static inline bool rtems_io_is_empty_table(
const rtems_driver_address_table *table
)
{
return table->initialization_entry == NULL && table->open_entry == NULL;
3000b8ec: e5933004 ldr r3, [r3, #4] <== NOT EXECUTED
3000b8f0: e3530000 cmp r3, #0 <== NOT EXECUTED
3000b8f4: 1afffff0 bne 3000b8bc <rtems_io_register_driver+0x114> <== NOT EXECUTED
if ( !rtems_io_is_empty_table( table ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
*registered_major = major;
3000b8f8: e5824000 str r4, [r2] <== NOT EXECUTED
3000b8fc: eaffffd7 b 3000b860 <rtems_io_register_driver+0xb8> <== NOT EXECUTED
3000b910 <rtems_io_unregister_driver>:
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
if ( rtems_interrupt_is_in_progress() )
3000b910: e59f3060 ldr r3, [pc, #96] ; 3000b978 <rtems_io_unregister_driver+0x68>
*/
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
3000b914: e92d4010 push {r4, lr}
if ( rtems_interrupt_is_in_progress() )
3000b918: e5934000 ldr r4, [r3]
3000b91c: e3540000 cmp r4, #0
return RTEMS_CALLED_FROM_ISR;
3000b920: 13a00012 movne r0, #18
rtems_status_code rtems_io_unregister_driver(
rtems_device_major_number major
)
{
if ( rtems_interrupt_is_in_progress() )
3000b924: 18bd8010 popne {r4, pc}
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
3000b928: e59f304c ldr r3, [pc, #76] ; 3000b97c <rtems_io_unregister_driver+0x6c>
3000b92c: e5933000 ldr r3, [r3]
3000b930: e1530000 cmp r3, r0
3000b934: 8a000001 bhi 3000b940 <rtems_io_unregister_driver+0x30>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
return RTEMS_UNSATISFIED;
3000b938: e3a0000d mov r0, #13 <== NOT EXECUTED
}
3000b93c: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3000b940: e59f3038 ldr r3, [pc, #56] ; 3000b980 <rtems_io_unregister_driver+0x70>
3000b944: e5932000 ldr r2, [r3]
3000b948: e2822001 add r2, r2, #1
3000b94c: e5832000 str r2, [r3]
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
3000b950: e59f302c ldr r3, [pc, #44] ; 3000b984 <rtems_io_unregister_driver+0x74>
&_IO_Driver_address_table[major],
3000b954: e0800080 add r0, r0, r0, lsl #1
if ( rtems_interrupt_is_in_progress() )
return RTEMS_CALLED_FROM_ISR;
if ( major < _IO_Number_of_drivers ) {
_Thread_Disable_dispatch();
memset(
3000b958: e5933000 ldr r3, [r3]
3000b95c: e1a01004 mov r1, r4
3000b960: e3a02018 mov r2, #24
3000b964: e0830180 add r0, r3, r0, lsl #3
3000b968: eb00299d bl 30015fe4 <memset>
&_IO_Driver_address_table[major],
0,
sizeof( rtems_driver_address_table )
);
_Thread_Enable_dispatch();
3000b96c: eb000772 bl 3000d73c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000b970: e1a00004 mov r0, r4
3000b974: e8bd8010 pop {r4, pc}
30010f6c <rtems_io_write>:
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010f6c: e59fc044 ldr ip, [pc, #68] ; 30010fb8 <rtems_io_write+0x4c>
rtems_status_code rtems_io_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010f70: e1a03000 mov r3, r0
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010f74: e59cc000 ldr ip, [ip]
rtems_status_code rtems_io_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *argument
)
{
30010f78: e52de004 push {lr} ; (str lr, [sp, #-4]!)
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010f7c: e15c0000 cmp ip, r0
return RTEMS_INVALID_NUMBER;
30010f80: 93a0000a movls r0, #10
void *argument
)
{
rtems_device_driver_entry callout;
if ( major >= _IO_Number_of_drivers )
30010f84: 949df004 popls {pc} ; (ldrls pc, [sp], #4)
return RTEMS_INVALID_NUMBER;
callout = _IO_Driver_address_table[major].write_entry;
30010f88: e59fc02c ldr ip, [pc, #44] ; 30010fbc <rtems_io_write+0x50>
30010f8c: e0833083 add r3, r3, r3, lsl #1
30010f90: e59cc000 ldr ip, [ip]
30010f94: e08c3183 add r3, ip, r3, lsl #3
30010f98: e5933010 ldr r3, [r3, #16]
return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
30010f9c: e3530000 cmp r3, #0
30010fa0: 0a000002 beq 30010fb0 <rtems_io_write+0x44>
30010fa4: e1a0e00f mov lr, pc
30010fa8: e12fff13 bx r3
30010fac: e49df004 pop {pc} ; (ldr pc, [sp], #4)
30010fb0: e1a00003 mov r0, r3 <== NOT EXECUTED
}
30010fb4: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
3000c958 <rtems_iterate_over_all_threads>:
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
{
3000c958: e92d41f0 push {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
uint32_t i;
uint32_t api_index;
Thread_Control *the_thread;
Objects_Information *information;
if ( !routine )
3000c95c: e2506000 subs r6, r0, #0 <== NOT EXECUTED
3000c960: 08bd81f0 popeq {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
3000c964: e59f705c ldr r7, [pc, #92] ; 3000c9c8 <rtems_iterate_over_all_threads+0x70><== NOT EXECUTED
#endif
#include <rtems/system.h>
#include <rtems/score/thread.h>
void rtems_iterate_over_all_threads(rtems_per_thread_routine routine)
3000c968: e287800c add r8, r7, #12 <== NOT EXECUTED
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
#if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG)
if ( !_Objects_Information_table[ api_index ] )
3000c96c: e5b73004 ldr r3, [r7, #4]! <== NOT EXECUTED
3000c970: e3530000 cmp r3, #0 <== NOT EXECUTED
3000c974: 0a000010 beq 3000c9bc <rtems_iterate_over_all_threads+0x64><== NOT EXECUTED
continue;
#endif
information = _Objects_Information_table[ api_index ][ 1 ];
3000c978: e5935004 ldr r5, [r3, #4] <== NOT EXECUTED
if ( !information )
3000c97c: e3550000 cmp r5, #0 <== NOT EXECUTED
3000c980: 0a00000d beq 3000c9bc <rtems_iterate_over_all_threads+0x64><== NOT EXECUTED
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
3000c984: e1d521b0 ldrh r2, [r5, #16] <== NOT EXECUTED
3000c988: e3520000 cmp r2, #0 <== NOT EXECUTED
3000c98c: 0a00000a beq 3000c9bc <rtems_iterate_over_all_threads+0x64><== NOT EXECUTED
3000c990: e3a04001 mov r4, #1 <== NOT EXECUTED
the_thread = (Thread_Control *)information->local_table[ i ];
3000c994: e595301c ldr r3, [r5, #28] <== NOT EXECUTED
3000c998: e7930104 ldr r0, [r3, r4, lsl #2] <== NOT EXECUTED
if ( !the_thread )
3000c99c: e3500000 cmp r0, #0 <== NOT EXECUTED
3000c9a0: 0a000002 beq 3000c9b0 <rtems_iterate_over_all_threads+0x58><== NOT EXECUTED
continue;
(*routine)(the_thread);
3000c9a4: e1a0e00f mov lr, pc <== NOT EXECUTED
3000c9a8: e12fff16 bx r6 <== NOT EXECUTED
3000c9ac: e1d521b0 ldrh r2, [r5, #16] <== NOT EXECUTED
information = _Objects_Information_table[ api_index ][ 1 ];
if ( !information )
continue;
for ( i=1 ; i <= information->maximum ; i++ ) {
3000c9b0: e2844001 add r4, r4, #1 <== NOT EXECUTED
3000c9b4: e1520004 cmp r2, r4 <== NOT EXECUTED
3000c9b8: 2afffff5 bcs 3000c994 <rtems_iterate_over_all_threads+0x3c><== NOT EXECUTED
Objects_Information *information;
if ( !routine )
return;
for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) {
3000c9bc: e1570008 cmp r7, r8 <== NOT EXECUTED
3000c9c0: 1affffe9 bne 3000c96c <rtems_iterate_over_all_threads+0x14><== NOT EXECUTED
3000c9c4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
30017a90 <rtems_message_queue_broadcast>:
rtems_id id,
const void *buffer,
size_t size,
uint32_t *count
)
{
30017a90: e92d40f0 push {r4, r5, r6, r7, lr}
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status core_status;
if ( !buffer )
30017a94: e2516000 subs r6, r1, #0
rtems_id id,
const void *buffer,
size_t size,
uint32_t *count
)
{
30017a98: e24dd00c sub sp, sp, #12
30017a9c: e1a04000 mov r4, r0
30017aa0: e1a05002 mov r5, r2
30017aa4: e1a07003 mov r7, r3
register Message_queue_Control *the_message_queue;
Objects_Locations location;
CORE_message_queue_Status core_status;
if ( !buffer )
30017aa8: 0a000016 beq 30017b08 <rtems_message_queue_broadcast+0x78>
return RTEMS_INVALID_ADDRESS;
if ( !count )
30017aac: e3530000 cmp r3, #0
30017ab0: 0a000014 beq 30017b08 <rtems_message_queue_broadcast+0x78>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
30017ab4: e59f0054 ldr r0, [pc, #84] ; 30017b10 <rtems_message_queue_broadcast+0x80>
30017ab8: e1a01004 mov r1, r4
30017abc: e28d2008 add r2, sp, #8
30017ac0: eb0014d9 bl 3001ce2c <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
30017ac4: e59d3008 ldr r3, [sp, #8]
30017ac8: e3530000 cmp r3, #0
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30017acc: 13a00004 movne r0, #4
if ( !count )
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
30017ad0: 1a00000a bne 30017b00 <rtems_message_queue_broadcast+0x70>
case OBJECTS_LOCAL:
core_status = _CORE_message_queue_Broadcast(
30017ad4: e58d3000 str r3, [sp]
30017ad8: e1a01006 mov r1, r6
30017adc: e1a03004 mov r3, r4
30017ae0: e1a02005 mov r2, r5
30017ae4: e2800014 add r0, r0, #20
30017ae8: e58d7004 str r7, [sp, #4]
30017aec: eb000dbf bl 3001b1f0 <_CORE_message_queue_Broadcast>
30017af0: e1a04000 mov r4, r0
NULL,
#endif
count
);
_Thread_Enable_dispatch();
30017af4: eb00181b bl 3001db68 <_Thread_Enable_dispatch>
return
30017af8: e1a00004 mov r0, r4
30017afc: eb0000d5 bl 30017e58 <_Message_queue_Translate_core_message_queue_return_code>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30017b00: e28dd00c add sp, sp, #12
30017b04: e8bd80f0 pop {r4, r5, r6, r7, pc}
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
if ( !count )
return RTEMS_INVALID_ADDRESS;
30017b08: e3a00009 mov r0, #9 <== NOT EXECUTED
30017b0c: eafffffb b 30017b00 <rtems_message_queue_broadcast+0x70> <== NOT EXECUTED
3001204c <rtems_message_queue_create>:
uint32_t count,
size_t max_message_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
3001204c: e92d41f0 push {r4, r5, r6, r7, r8, lr}
CORE_message_queue_Attributes the_msgq_attributes;
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
30012050: e2507000 subs r7, r0, #0
uint32_t count,
size_t max_message_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
30012054: e24dd008 sub sp, sp, #8
30012058: e1a04001 mov r4, r1
3001205c: e1a06002 mov r6, r2
30012060: e59d5020 ldr r5, [sp, #32]
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
30012064: 03a00003 moveq r0, #3
CORE_message_queue_Attributes the_msgq_attributes;
#if defined(RTEMS_MULTIPROCESSING)
bool is_global;
#endif
if ( !rtems_is_name_valid( name ) )
30012068: 0a000008 beq 30012090 <rtems_message_queue_create+0x44>
return RTEMS_INVALID_NAME;
if ( !id )
3001206c: e3550000 cmp r5, #0
return RTEMS_INVALID_ADDRESS;
30012070: 03a00009 moveq r0, #9
#endif
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
30012074: 0a000005 beq 30012090 <rtems_message_queue_create+0x44>
if ( (is_global = _Attributes_Is_global( attribute_set ) ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
30012078: e3510000 cmp r1, #0
return RTEMS_INVALID_NUMBER;
3001207c: 03a0000a moveq r0, #10
if ( (is_global = _Attributes_Is_global( attribute_set ) ) &&
!_System_state_Is_multiprocessing )
return RTEMS_MP_NOT_CONFIGURED;
#endif
if ( count == 0 )
30012080: 0a000002 beq 30012090 <rtems_message_queue_create+0x44>
return RTEMS_INVALID_NUMBER;
if ( max_message_size == 0 )
30012084: e3520000 cmp r2, #0
return RTEMS_INVALID_SIZE;
30012088: 03a00008 moveq r0, #8
#endif
if ( count == 0 )
return RTEMS_INVALID_NUMBER;
if ( max_message_size == 0 )
3001208c: 1a000001 bne 30012098 <rtems_message_queue_create+0x4c>
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
30012090: e28dd008 add sp, sp, #8
30012094: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
30012098: e59f2098 ldr r2, [pc, #152] ; 30012138 <rtems_message_queue_create+0xec>
3001209c: e5921000 ldr r1, [r2]
300120a0: e2811001 add r1, r1, #1
300120a4: e5821000 str r1, [r2]
#endif
#endif
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
300120a8: e58d3000 str r3, [sp]
300120ac: eb00170f bl 30017cf0 <_Message_queue_Allocate>
if ( !the_message_queue ) {
300120b0: e2508000 subs r8, r0, #0
300120b4: e59d3000 ldr r3, [sp]
300120b8: 0a00001b beq 3001212c <rtems_message_queue_create+0xe0>
}
#endif
the_message_queue->attribute_set = attribute_set;
if (_Attributes_Is_priority( attribute_set ) )
300120bc: e2132004 ands r2, r3, #4
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_message_queue->attribute_set = attribute_set;
300120c0: e5883010 str r3, [r8, #16]
if (_Attributes_Is_priority( attribute_set ) )
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
300120c4: 13a03001 movne r3, #1
300120c8: 158d3004 strne r3, [sp, #4]
else
the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
300120cc: 058d2004 streq r2, [sp, #4]
if ( ! _CORE_message_queue_Initialize(
300120d0: e2880014 add r0, r8, #20
300120d4: e28d1004 add r1, sp, #4
300120d8: e1a02004 mov r2, r4
300120dc: e1a03006 mov r3, r6
300120e0: eb000474 bl 300132b8 <_CORE_message_queue_Initialize>
300120e4: e3500000 cmp r0, #0
300120e8: 1a000005 bne 30012104 <rtems_message_queue_create+0xb8>
*/
RTEMS_INLINE_ROUTINE void _Message_queue_Free (
Message_queue_Control *the_message_queue
)
{
_Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
300120ec: e59f0048 ldr r0, [pc, #72] ; 3001213c <rtems_message_queue_create+0xf0><== NOT EXECUTED
300120f0: e1a01008 mov r1, r8 <== NOT EXECUTED
300120f4: eb00082a bl 300141a4 <_Objects_Free> <== NOT EXECUTED
_Objects_MP_Close(
&_Message_queue_Information, the_message_queue->Object.id);
#endif
_Message_queue_Free( the_message_queue );
_Thread_Enable_dispatch();
300120f8: eb000bf7 bl 300150dc <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_UNSATISFIED;
300120fc: e3a0000d mov r0, #13 <== NOT EXECUTED
30012100: eaffffe2 b 30012090 <rtems_message_queue_create+0x44> <== NOT EXECUTED
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
30012104: e59f2030 ldr r2, [pc, #48] ; 3001213c <rtems_message_queue_create+0xf0>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
30012108: e5983008 ldr r3, [r8, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3001210c: e592201c ldr r2, [r2, #28]
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
30012110: e1a01803 lsl r1, r3, #16
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
30012114: e7828721 str r8, [r2, r1, lsr #14]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
30012118: e588700c str r7, [r8, #12]
&_Message_queue_Information,
&the_message_queue->Object,
(Objects_Name) name
);
*id = the_message_queue->Object.id;
3001211c: e5853000 str r3, [r5]
name,
0
);
#endif
_Thread_Enable_dispatch();
30012120: eb000bed bl 300150dc <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
30012124: e3a00000 mov r0, #0
30012128: eaffffd8 b 30012090 <rtems_message_queue_create+0x44>
_Thread_Disable_dispatch(); /* protects object pointer */
the_message_queue = _Message_queue_Allocate();
if ( !the_message_queue ) {
_Thread_Enable_dispatch();
3001212c: eb000bea bl 300150dc <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_TOO_MANY;
30012130: e3a00005 mov r0, #5 <== NOT EXECUTED
30012134: eaffffd5 b 30012090 <rtems_message_queue_create+0x44> <== NOT EXECUTED
30017cc4 <rtems_message_queue_get_number_pending>:
rtems_status_code rtems_message_queue_get_number_pending(
rtems_id id,
uint32_t *count
)
{
30017cc4: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
30017cc8: e2514000 subs r4, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_message_queue_get_number_pending(
rtems_id id,
uint32_t *count
)
{
30017ccc: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
30017cd0: e1a01000 mov r1, r0 <== NOT EXECUTED
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
return RTEMS_INVALID_ADDRESS;
30017cd4: 03a00009 moveq r0, #9 <== NOT EXECUTED
)
{
register Message_queue_Control *the_message_queue;
Objects_Locations location;
if ( !count )
30017cd8: 0a00000a beq 30017d08 <rtems_message_queue_get_number_pending+0x44><== NOT EXECUTED
30017cdc: e59f002c ldr r0, [pc, #44] ; 30017d10 <rtems_message_queue_get_number_pending+0x4c><== NOT EXECUTED
30017ce0: e1a0200d mov r2, sp <== NOT EXECUTED
30017ce4: eb001450 bl 3001ce2c <_Objects_Get> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
30017ce8: e59d5000 ldr r5, [sp] <== NOT EXECUTED
30017cec: e3550000 cmp r5, #0 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30017cf0: 13a00004 movne r0, #4 <== NOT EXECUTED
if ( !count )
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
30017cf4: 1a000003 bne 30017d08 <rtems_message_queue_get_number_pending+0x44><== NOT EXECUTED
case OBJECTS_LOCAL:
*count = the_message_queue->message_queue.number_of_pending_messages;
30017cf8: e590305c ldr r3, [r0, #92] ; 0x5c <== NOT EXECUTED
30017cfc: e5843000 str r3, [r4] <== NOT EXECUTED
_Thread_Enable_dispatch();
30017d00: eb001798 bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30017d04: e1a00005 mov r0, r5 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30017d08: e28dd004 add sp, sp, #4 <== NOT EXECUTED
30017d0c: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
30012174 <rtems_message_queue_receive>:
void *buffer,
size_t *size,
rtems_option option_set,
rtems_interval timeout
)
{
30012174: e92d4070 push {r4, r5, r6, lr}
register Message_queue_Control *the_message_queue;
Objects_Locations location;
bool wait;
if ( !buffer )
30012178: e2515000 subs r5, r1, #0
void *buffer,
size_t *size,
rtems_option option_set,
rtems_interval timeout
)
{
3001217c: e24dd00c sub sp, sp, #12
30012180: e1a01000 mov r1, r0
30012184: e1a04002 mov r4, r2
30012188: e1a06003 mov r6, r3
register Message_queue_Control *the_message_queue;
Objects_Locations location;
bool wait;
if ( !buffer )
3001218c: 0a000019 beq 300121f8 <rtems_message_queue_receive+0x84>
return RTEMS_INVALID_ADDRESS;
if ( !size )
30012190: e3520000 cmp r2, #0
30012194: 0a000017 beq 300121f8 <rtems_message_queue_receive+0x84>
Objects_Id id,
Objects_Locations *location
)
{
return (Message_queue_Control *)
_Objects_Get( &_Message_queue_Information, id, location );
30012198: e59f0060 ldr r0, [pc, #96] ; 30012200 <rtems_message_queue_receive+0x8c>
3001219c: e28d2008 add r2, sp, #8
300121a0: eb000856 bl 30014300 <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
300121a4: e59d3008 ldr r3, [sp, #8]
300121a8: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
300121ac: 13a00004 movne r0, #4
if ( !size )
return RTEMS_INVALID_ADDRESS;
the_message_queue = _Message_queue_Get( id, &location );
switch ( location ) {
300121b0: 1a00000e bne 300121f0 <rtems_message_queue_receive+0x7c>
if ( _Options_Is_no_wait( option_set ) )
wait = false;
else
wait = true;
_CORE_message_queue_Seize(
300121b4: e59d301c ldr r3, [sp, #28]
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
300121b8: e2066001 and r6, r6, #1
300121bc: e5901008 ldr r1, [r0, #8]
300121c0: e1a02005 mov r2, r5
300121c4: e2800014 add r0, r0, #20
300121c8: e58d3004 str r3, [sp, #4]
300121cc: e2266001 eor r6, r6, #1
300121d0: e1a03004 mov r3, r4
300121d4: e58d6000 str r6, [sp]
300121d8: eb000467 bl 3001337c <_CORE_message_queue_Seize>
buffer,
size,
wait,
timeout
);
_Thread_Enable_dispatch();
300121dc: eb000bbe bl 300150dc <_Thread_Enable_dispatch>
return _Message_queue_Translate_core_message_queue_return_code(
_Thread_Executing->Wait.return_code
300121e0: e59f301c ldr r3, [pc, #28] ; 30012204 <rtems_message_queue_receive+0x90>
300121e4: e5933004 ldr r3, [r3, #4]
size,
wait,
timeout
);
_Thread_Enable_dispatch();
return _Message_queue_Translate_core_message_queue_return_code(
300121e8: e5930034 ldr r0, [r3, #52] ; 0x34
300121ec: eb000024 bl 30012284 <_Message_queue_Translate_core_message_queue_return_code>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
300121f0: e28dd00c add sp, sp, #12
300121f4: e8bd8070 pop {r4, r5, r6, pc}
if ( !buffer )
return RTEMS_INVALID_ADDRESS;
if ( !size )
return RTEMS_INVALID_ADDRESS;
300121f8: e3a00009 mov r0, #9 <== NOT EXECUTED
300121fc: eafffffb b 300121f0 <rtems_message_queue_receive+0x7c> <== NOT EXECUTED
3000ba1c <rtems_object_api_maximum_class>:
int rtems_object_api_maximum_class(
int api
)
{
return _Objects_API_maximum_class(api);
3000ba1c: ea000632 b 3000d2ec <_Objects_API_maximum_class> <== NOT EXECUTED
3000ba20 <rtems_object_api_minimum_class>:
*/
RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid(
uint32_t the_api
)
{
if ( !the_api || the_api > OBJECTS_APIS_LAST )
3000ba20: e2400001 sub r0, r0, #1 <== NOT EXECUTED
uint32_t api
)
{
if ( _Objects_Is_api_valid( api ) )
return 1;
return -1;
3000ba24: e3500003 cmp r0, #3 <== NOT EXECUTED
}
3000ba28: 33a00001 movcc r0, #1 <== NOT EXECUTED
3000ba2c: 23e00000 mvncs r0, #0 <== NOT EXECUTED
3000ba30: e12fff1e bx lr <== NOT EXECUTED
3000ba34 <rtems_object_get_api_class_name>:
)
{
const rtems_assoc_t *api_assoc;
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
3000ba34: e3500001 cmp r0, #1 <== NOT EXECUTED
const char *rtems_object_get_api_class_name(
int the_api,
int the_class
)
{
3000ba38: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
const rtems_assoc_t *api_assoc;
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
3000ba3c: 0a000004 beq 3000ba54 <rtems_object_get_api_class_name+0x20><== NOT EXECUTED
api_assoc = rtems_object_api_internal_assoc;
else if ( the_api == OBJECTS_CLASSIC_API )
3000ba40: e3500002 cmp r0, #2 <== NOT EXECUTED
api_assoc = rtems_object_api_classic_assoc;
3000ba44: 059f0024 ldreq r0, [pc, #36] ; 3000ba70 <rtems_object_get_api_class_name+0x3c><== NOT EXECUTED
const rtems_assoc_t *api_assoc;
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
api_assoc = rtems_object_api_internal_assoc;
else if ( the_api == OBJECTS_CLASSIC_API )
3000ba48: 0a000002 beq 3000ba58 <rtems_object_get_api_class_name+0x24><== NOT EXECUTED
#ifdef RTEMS_POSIX_API
else if ( the_api == OBJECTS_POSIX_API )
api_assoc = rtems_object_api_posix_assoc;
#endif
else
return "BAD API";
3000ba4c: e59f0020 ldr r0, [pc, #32] ; 3000ba74 <rtems_object_get_api_class_name+0x40><== NOT EXECUTED
3000ba50: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
{
const rtems_assoc_t *api_assoc;
const rtems_assoc_t *class_assoc;
if ( the_api == OBJECTS_INTERNAL_API )
api_assoc = rtems_object_api_internal_assoc;
3000ba54: e59f001c ldr r0, [pc, #28] ; 3000ba78 <rtems_object_get_api_class_name+0x44><== NOT EXECUTED
else if ( the_api == OBJECTS_POSIX_API )
api_assoc = rtems_object_api_posix_assoc;
#endif
else
return "BAD API";
class_assoc = rtems_assoc_ptr_by_local( api_assoc, the_class );
3000ba58: eb0013e6 bl 300109f8 <rtems_assoc_ptr_by_local> <== NOT EXECUTED
if ( class_assoc )
3000ba5c: e3500000 cmp r0, #0 <== NOT EXECUTED
return class_assoc->name;
3000ba60: 15900000 ldrne r0, [r0] <== NOT EXECUTED
api_assoc = rtems_object_api_posix_assoc;
#endif
else
return "BAD API";
class_assoc = rtems_assoc_ptr_by_local( api_assoc, the_class );
if ( class_assoc )
3000ba64: 149df004 popne {pc} ; (ldrne pc, [sp], #4) <== NOT EXECUTED
return class_assoc->name;
return "BAD CLASS";
3000ba68: e59f000c ldr r0, [pc, #12] ; 3000ba7c <rtems_object_get_api_class_name+0x48><== NOT EXECUTED
}
3000ba6c: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
3000ba80 <rtems_object_get_api_name>:
};
const char *rtems_object_get_api_name(
int api
)
{
3000ba80: e1a01000 mov r1, r0 <== NOT EXECUTED
3000ba84: e52de004 push {lr} ; (str lr, [sp, #-4]!) <== NOT EXECUTED
const rtems_assoc_t *api_assoc;
api_assoc = rtems_assoc_ptr_by_local( rtems_objects_api_assoc, api );
3000ba88: e59f0010 ldr r0, [pc, #16] ; 3000baa0 <rtems_object_get_api_name+0x20><== NOT EXECUTED
3000ba8c: eb0013d9 bl 300109f8 <rtems_assoc_ptr_by_local> <== NOT EXECUTED
if ( api_assoc )
3000ba90: e3500000 cmp r0, #0 <== NOT EXECUTED
return api_assoc->name;
3000ba94: 15900000 ldrne r0, [r0] <== NOT EXECUTED
return "BAD CLASS";
3000ba98: 059f0004 ldreq r0, [pc, #4] ; 3000baa4 <rtems_object_get_api_name+0x24><== NOT EXECUTED
}
3000ba9c: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
3000bae0 <rtems_object_get_class_information>:
rtems_status_code rtems_object_get_class_information(
int the_api,
int the_class,
rtems_object_api_class_information *info
)
{
3000bae0: e92d4010 push {r4, lr} <== NOT EXECUTED
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
3000bae4: e2524000 subs r4, r2, #0 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
3000bae8: 03a00009 moveq r0, #9 <== NOT EXECUTED
int i;
/*
* Validate parameters and look up information structure.
*/
if ( !info )
3000baec: 08bd8010 popeq {r4, pc} <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
3000baf0: e1a01801 lsl r1, r1, #16 <== NOT EXECUTED
3000baf4: e1a01821 lsr r1, r1, #16 <== NOT EXECUTED
3000baf8: eb0006d9 bl 3000d664 <_Objects_Get_information> <== NOT EXECUTED
if ( !obj_info )
3000bafc: e3500000 cmp r0, #0 <== NOT EXECUTED
3000bb00: 0a000018 beq 3000bb68 <rtems_object_get_class_information+0x88><== NOT EXECUTED
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
3000bb04: e1d011b0 ldrh r1, [r0, #16] <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
3000bb08: e590c008 ldr ip, [r0, #8] <== NOT EXECUTED
info->maximum_id = obj_info->maximum_id;
3000bb0c: e590200c ldr r2, [r0, #12] <== NOT EXECUTED
info->auto_extend = obj_info->auto_extend;
3000bb10: e5d03012 ldrb r3, [r0, #18] <== NOT EXECUTED
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
3000bb14: e3510000 cmp r1, #0 <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
/*
* Return information about this object class to the user.
*/
info->minimum_id = obj_info->minimum_id;
3000bb18: e584c000 str ip, [r4] <== NOT EXECUTED
info->maximum_id = obj_info->maximum_id;
3000bb1c: e5842004 str r2, [r4, #4] <== NOT EXECUTED
info->auto_extend = obj_info->auto_extend;
3000bb20: e5c4300c strb r3, [r4, #12] <== NOT EXECUTED
info->maximum = obj_info->maximum;
3000bb24: e5841008 str r1, [r4, #8] <== NOT EXECUTED
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
3000bb28: 01a0c001 moveq ip, r1 <== NOT EXECUTED
3000bb2c: 0a00000a beq 3000bb5c <rtems_object_get_class_information+0x7c><== NOT EXECUTED
3000bb30: e3a02001 mov r2, #1 <== NOT EXECUTED
3000bb34: e590001c ldr r0, [r0, #28] <== NOT EXECUTED
3000bb38: e1a03002 mov r3, r2 <== NOT EXECUTED
3000bb3c: e3a0c000 mov ip, #0 <== NOT EXECUTED
if ( !obj_info->local_table[i] )
3000bb40: e7902102 ldr r2, [r0, r2, lsl #2] <== NOT EXECUTED
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
3000bb44: e2833001 add r3, r3, #1 <== NOT EXECUTED
if ( !obj_info->local_table[i] )
3000bb48: e3520000 cmp r2, #0 <== NOT EXECUTED
unallocated++;
3000bb4c: 028cc001 addeq ip, ip, #1 <== NOT EXECUTED
info->minimum_id = obj_info->minimum_id;
info->maximum_id = obj_info->maximum_id;
info->auto_extend = obj_info->auto_extend;
info->maximum = obj_info->maximum;
for ( unallocated=0, i=1 ; i <= info->maximum ; i++ )
3000bb50: e1510003 cmp r1, r3 <== NOT EXECUTED
3000bb54: e1a02003 mov r2, r3 <== NOT EXECUTED
3000bb58: 2afffff8 bcs 3000bb40 <rtems_object_get_class_information+0x60><== NOT EXECUTED
if ( !obj_info->local_table[i] )
unallocated++;
info->unallocated = unallocated;
3000bb5c: e584c010 str ip, [r4, #16] <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000bb60: e3a00000 mov r0, #0 <== NOT EXECUTED
3000bb64: e8bd8010 pop {r4, pc} <== NOT EXECUTED
if ( !info )
return RTEMS_INVALID_ADDRESS;
obj_info = _Objects_Get_information( the_api, the_class );
if ( !obj_info )
return RTEMS_INVALID_NUMBER;
3000bb68: e3a0000a mov r0, #10 <== NOT EXECUTED
unallocated++;
info->unallocated = unallocated;
return RTEMS_SUCCESSFUL;
}
3000bb6c: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3000ae28 <rtems_object_get_classic_name>:
rtems_status_code rtems_object_get_classic_name(
rtems_id id,
rtems_name *name
)
{
3000ae28: e92d4010 push {r4, lr} <== NOT EXECUTED
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
3000ae2c: e2514000 subs r4, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_object_get_classic_name(
rtems_id id,
rtems_name *name
)
{
3000ae30: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
return RTEMS_INVALID_ADDRESS;
3000ae34: 03a00009 moveq r0, #9 <== NOT EXECUTED
)
{
Objects_Name_or_id_lookup_errors status;
Objects_Name name_u;
if ( !name )
3000ae38: 0a000005 beq 3000ae54 <rtems_object_get_classic_name+0x2c> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
status = _Objects_Id_to_name( id, &name_u );
3000ae3c: e1a0100d mov r1, sp <== NOT EXECUTED
3000ae40: eb000705 bl 3000ca5c <_Objects_Id_to_name> <== NOT EXECUTED
*name = name_u.name_u32;
3000ae44: e59d3000 ldr r3, [sp] <== NOT EXECUTED
3000ae48: e5843000 str r3, [r4] <== NOT EXECUTED
return _Status_Object_name_errors_to_status[ status ];
3000ae4c: e59f3008 ldr r3, [pc, #8] ; 3000ae5c <rtems_object_get_classic_name+0x34><== NOT EXECUTED
3000ae50: e7930100 ldr r0, [r3, r0, lsl #2] <== NOT EXECUTED
}
3000ae54: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000ae58: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3000b03c <rtems_object_get_name>:
Objects_Id id,
size_t length,
char *name
)
{
return _Objects_Get_name_as_string( id, length, name );
3000b03c: ea000793 b 3000ce90 <_Objects_Get_name_as_string> <== NOT EXECUTED
3000bb74 <rtems_object_id_api_maximum>:
#undef rtems_object_id_api_maximum
int rtems_object_id_api_maximum(void)
{
return OBJECTS_APIS_LAST;
}
3000bb74: e3a00003 mov r0, #3 <== NOT EXECUTED
3000bb78: e12fff1e bx lr <== NOT EXECUTED
3000bb7c <rtems_object_id_api_minimum>:
#undef rtems_object_id_api_minimum
int rtems_object_id_api_minimum(void)
{
return OBJECTS_INTERNAL_API;
}
3000bb7c: e3a00001 mov r0, #1 <== NOT EXECUTED
3000bb80: e12fff1e bx lr <== NOT EXECUTED
3000bb84 <rtems_object_id_get_api>:
*/
RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API(
Objects_Id id
)
{
return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS);
3000bb84: e1a00c20 lsr r0, r0, #24 <== NOT EXECUTED
int rtems_object_id_get_api(
rtems_id id
)
{
return _Objects_Get_API( id );
}
3000bb88: e2000007 and r0, r0, #7 <== NOT EXECUTED
3000bb8c: e12fff1e bx lr <== NOT EXECUTED
3000bb90 <rtems_object_id_get_class>:
int rtems_object_id_get_class(
rtems_id id
)
{
return _Objects_Get_class( id );
}
3000bb90: e1a00da0 lsr r0, r0, #27 <== NOT EXECUTED
3000bb94: e12fff1e bx lr <== NOT EXECUTED
3000bb98 <rtems_object_id_get_index>:
#undef rtems_object_id_get_index
int rtems_object_id_get_index(
rtems_id id
)
{
return _Objects_Get_index( id );
3000bb98: e1a00800 lsl r0, r0, #16 <== NOT EXECUTED
}
3000bb9c: e1a00820 lsr r0, r0, #16 <== NOT EXECUTED
3000bba0: e12fff1e bx lr <== NOT EXECUTED
3000bba4 <rtems_object_id_get_node>:
* be a single processor system.
*/
#if defined(RTEMS_USE_16_BIT_OBJECT)
return 1;
#else
return (id >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS;
3000bba4: e1a00820 lsr r0, r0, #16 <== NOT EXECUTED
int rtems_object_id_get_node(
rtems_id id
)
{
return _Objects_Get_node( id );
}
3000bba8: e20000ff and r0, r0, #255 ; 0xff <== NOT EXECUTED
3000bbac: e12fff1e bx lr <== NOT EXECUTED
3000bbb0 <rtems_object_set_name>:
*/
rtems_status_code rtems_object_set_name(
rtems_id id,
const char *name
)
{
3000bbb0: e92d4070 push {r4, r5, r6, lr} <== NOT EXECUTED
Objects_Information *information;
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
3000bbb4: e2515000 subs r5, r1, #0 <== NOT EXECUTED
*/
rtems_status_code rtems_object_set_name(
rtems_id id,
const char *name
)
{
3000bbb8: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
return RTEMS_INVALID_ADDRESS;
3000bbbc: 03a00009 moveq r0, #9 <== NOT EXECUTED
Objects_Information *information;
Objects_Locations location;
Objects_Control *the_object;
Objects_Id tmpId;
if ( !name )
3000bbc0: 0a000010 beq 3000bc08 <rtems_object_set_name+0x58> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id;
3000bbc4: e3500000 cmp r0, #0 <== NOT EXECUTED
3000bbc8: 059f3058 ldreq r3, [pc, #88] ; 3000bc28 <rtems_object_set_name+0x78><== NOT EXECUTED
3000bbcc: 11a04000 movne r4, r0 <== NOT EXECUTED
3000bbd0: 05933004 ldreq r3, [r3, #4] <== NOT EXECUTED
3000bbd4: 05934008 ldreq r4, [r3, #8] <== NOT EXECUTED
information = _Objects_Get_information_id( tmpId );
3000bbd8: e1a00004 mov r0, r4 <== NOT EXECUTED
3000bbdc: eb00069b bl 3000d650 <_Objects_Get_information_id> <== NOT EXECUTED
if ( !information )
3000bbe0: e2506000 subs r6, r0, #0 <== NOT EXECUTED
3000bbe4: 0a000006 beq 3000bc04 <rtems_object_set_name+0x54> <== NOT EXECUTED
return RTEMS_INVALID_ID;
the_object = _Objects_Get( information, tmpId, &location );
3000bbe8: e1a01004 mov r1, r4 <== NOT EXECUTED
3000bbec: e1a0200d mov r2, sp <== NOT EXECUTED
3000bbf0: eb000711 bl 3000d83c <_Objects_Get> <== NOT EXECUTED
switch ( location ) {
3000bbf4: e59d4000 ldr r4, [sp] <== NOT EXECUTED
information = _Objects_Get_information_id( tmpId );
if ( !information )
return RTEMS_INVALID_ID;
the_object = _Objects_Get( information, tmpId, &location );
3000bbf8: e1a01000 mov r1, r0 <== NOT EXECUTED
switch ( location ) {
3000bbfc: e3540000 cmp r4, #0 <== NOT EXECUTED
3000bc00: 0a000002 beq 3000bc10 <rtems_object_set_name+0x60> <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000bc04: e3a00004 mov r0, #4 <== NOT EXECUTED
}
3000bc08: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000bc0c: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
the_object = _Objects_Get( information, tmpId, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Objects_Set_name( information, the_object, name );
3000bc10: e1a02005 mov r2, r5 <== NOT EXECUTED
3000bc14: e1a00006 mov r0, r6 <== NOT EXECUTED
3000bc18: eb00077e bl 3000da18 <_Objects_Set_name> <== NOT EXECUTED
_Thread_Enable_dispatch();
3000bc1c: eb000a75 bl 3000e5f8 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000bc20: e1a00004 mov r0, r4 <== NOT EXECUTED
3000bc24: eafffff7 b 3000bc08 <rtems_object_set_name+0x58> <== NOT EXECUTED
30017ee4 <rtems_partition_create>:
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
30017ee4: e92d47f0 push {r4, r5, r6, r7, r8, r9, sl, lr}
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
30017ee8: e2506000 subs r6, r0, #0
uint32_t length,
uint32_t buffer_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
30017eec: e24dd008 sub sp, sp, #8
30017ef0: e1a04001 mov r4, r1
30017ef4: e59d502c ldr r5, [sp, #44] ; 0x2c
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
30017ef8: 03a00003 moveq r0, #3
rtems_id *id
)
{
register Partition_Control *the_partition;
if ( !rtems_is_name_valid( name ) )
30017efc: 0a000031 beq 30017fc8 <rtems_partition_create+0xe4>
return RTEMS_INVALID_NAME;
if ( !starting_address )
30017f00: e3510000 cmp r1, #0
30017f04: 0a000033 beq 30017fd8 <rtems_partition_create+0xf4>
return RTEMS_INVALID_ADDRESS;
if ( !id )
30017f08: e3550000 cmp r5, #0
30017f0c: 0a000031 beq 30017fd8 <rtems_partition_create+0xf4>
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
30017f10: e3520000 cmp r2, #0
30017f14: 13530000 cmpne r3, #0
30017f18: 0a00002c beq 30017fd0 <rtems_partition_create+0xec>
30017f1c: e1520003 cmp r2, r3
30017f20: 3a00002a bcc 30017fd0 <rtems_partition_create+0xec>
30017f24: e3130007 tst r3, #7
30017f28: 1a000028 bne 30017fd0 <rtems_partition_create+0xec>
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
if ( !_Addresses_Is_aligned( starting_address ) )
30017f2c: e2118007 ands r8, r1, #7
30017f30: 1a000028 bne 30017fd8 <rtems_partition_create+0xf4>
30017f34: e59f10b0 ldr r1, [pc, #176] ; 30017fec <rtems_partition_create+0x108>
30017f38: e5910000 ldr r0, [r1]
30017f3c: e2800001 add r0, r0, #1
30017f40: e5810000 str r0, [r1]
* This function allocates a partition control block from
* the inactive chain of free partition control blocks.
*/
RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
{
return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
30017f44: e59fa0a4 ldr sl, [pc, #164] ; 30017ff0 <rtems_partition_create+0x10c>
30017f48: e58d2004 str r2, [sp, #4]
30017f4c: e1a0000a mov r0, sl
30017f50: e58d3000 str r3, [sp]
30017f54: eb001273 bl 3001c928 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
30017f58: e2507000 subs r7, r0, #0
30017f5c: e59d2004 ldr r2, [sp, #4]
30017f60: e59d3000 ldr r3, [sp]
30017f64: 0a00001d beq 30017fe0 <rtems_partition_create+0xfc>
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
30017f68: e59d1028 ldr r1, [sp, #40] ; 0x28
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
the_partition->length = length;
30017f6c: e5872014 str r2, [r7, #20]
the_partition->buffer_size = buffer_size;
30017f70: e5873018 str r3, [r7, #24]
the_partition->attribute_set = attribute_set;
30017f74: e587101c str r1, [r7, #28]
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_partition->starting_address = starting_address;
30017f78: e5874010 str r4, [r7, #16]
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
_Chain_Initialize( &the_partition->Memory, starting_address,
30017f7c: e1a01003 mov r1, r3
the_partition->starting_address = starting_address;
the_partition->length = length;
the_partition->buffer_size = buffer_size;
the_partition->attribute_set = attribute_set;
the_partition->number_of_used_blocks = 0;
30017f80: e5878020 str r8, [r7, #32]
_Chain_Initialize( &the_partition->Memory, starting_address,
30017f84: e1a00002 mov r0, r2
30017f88: e58d3000 str r3, [sp]
30017f8c: eb006063 bl 30030120 <__aeabi_uidiv>
30017f90: e2879024 add r9, r7, #36 ; 0x24
30017f94: e1a02000 mov r2, r0
30017f98: e1a01004 mov r1, r4
30017f9c: e1a00009 mov r0, r9
30017fa0: e59d3000 ldr r3, [sp]
30017fa4: eb000c78 bl 3001b18c <_Chain_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
30017fa8: e5973008 ldr r3, [r7, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
30017fac: e59a201c ldr r2, [sl, #28]
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
30017fb0: e1a01803 lsl r1, r3, #16
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
30017fb4: e7827721 str r7, [r2, r1, lsr #14]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
30017fb8: e587600c str r6, [r7, #12]
&_Partition_Information,
&the_partition->Object,
(Objects_Name) name
);
*id = the_partition->Object.id;
30017fbc: e5853000 str r3, [r5]
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
30017fc0: eb0016e8 bl 3001db68 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
30017fc4: e1a00008 mov r0, r8
}
30017fc8: e28dd008 add sp, sp, #8
30017fcc: e8bd87f0 pop {r4, r5, r6, r7, r8, r9, sl, pc}
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( length == 0 || buffer_size == 0 || length < buffer_size ||
!_Partition_Is_buffer_size_aligned( buffer_size ) )
return RTEMS_INVALID_SIZE;
30017fd0: e3a00008 mov r0, #8 <== NOT EXECUTED
30017fd4: eafffffb b 30017fc8 <rtems_partition_create+0xe4> <== NOT EXECUTED
if ( !_Addresses_Is_aligned( starting_address ) )
return RTEMS_INVALID_ADDRESS;
30017fd8: e3a00009 mov r0, #9 <== NOT EXECUTED
30017fdc: eafffff9 b 30017fc8 <rtems_partition_create+0xe4> <== NOT EXECUTED
_Thread_Disable_dispatch(); /* prevents deletion */
the_partition = _Partition_Allocate();
if ( !the_partition ) {
_Thread_Enable_dispatch();
30017fe0: eb0016e0 bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_TOO_MANY;
30017fe4: e3a00005 mov r0, #5 <== NOT EXECUTED
30017fe8: eafffff6 b 30017fc8 <rtems_partition_create+0xe4> <== NOT EXECUTED
30017ff4 <rtems_partition_delete>:
*/
rtems_status_code rtems_partition_delete(
rtems_id id
)
{
30017ff4: e92d4030 push {r4, r5, lr}
30017ff8: e24dd004 sub sp, sp, #4
30017ffc: e1a01000 mov r1, r0
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
30018000: e1a0200d mov r2, sp
30018004: e59f0054 ldr r0, [pc, #84] ; 30018060 <rtems_partition_delete+0x6c>
30018008: eb001387 bl 3001ce2c <_Objects_Get>
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
3001800c: e59d3000 ldr r3, [sp]
30018010: e1a04000 mov r4, r0
30018014: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30018018: 13a00004 movne r0, #4
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
3001801c: 1a000004 bne 30018034 <rtems_partition_delete+0x40>
case OBJECTS_LOCAL:
if ( the_partition->number_of_used_blocks == 0 ) {
30018020: e5945020 ldr r5, [r4, #32]
30018024: e3550000 cmp r5, #0
30018028: 0a000003 beq 3001803c <rtems_partition_delete+0x48>
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
3001802c: eb0016cd bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_RESOURCE_IN_USE;
30018030: e3a0000c mov r0, #12 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30018034: e28dd004 add sp, sp, #4
30018038: e8bd8030 pop {r4, r5, pc}
the_partition = _Partition_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_partition->number_of_used_blocks == 0 ) {
_Objects_Close( &_Partition_Information, &the_partition->Object );
3001803c: e1a01004 mov r1, r4
30018040: e59f0018 ldr r0, [pc, #24] ; 30018060 <rtems_partition_delete+0x6c>
30018044: eb00125c bl 3001c9bc <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Partition_Free (
Partition_Control *the_partition
)
{
_Objects_Free( &_Partition_Information, &the_partition->Object );
30018048: e59f0010 ldr r0, [pc, #16] ; 30018060 <rtems_partition_delete+0x6c>
3001804c: e1a01004 mov r1, r4
30018050: eb00130e bl 3001cc90 <_Objects_Free>
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
30018054: eb0016c3 bl 3001db68 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
30018058: e1a00005 mov r0, r5
3001805c: eafffff4 b 30018034 <rtems_partition_delete+0x40>
30018110 <rtems_partition_return_buffer>:
rtems_status_code rtems_partition_return_buffer(
rtems_id id,
void *buffer
)
{
30018110: e92d4070 push {r4, r5, r6, lr}
30018114: e1a03000 mov r3, r0
30018118: e24dd004 sub sp, sp, #4
3001811c: e1a04001 mov r4, r1
Objects_Id id,
Objects_Locations *location
)
{
return (Partition_Control *)
_Objects_Get( &_Partition_Information, id, location );
30018120: e59f008c ldr r0, [pc, #140] ; 300181b4 <rtems_partition_return_buffer+0xa4>
30018124: e1a01003 mov r1, r3
30018128: e1a0200d mov r2, sp
3001812c: eb00133e bl 3001ce2c <_Objects_Get>
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
30018130: e59d3000 ldr r3, [sp]
30018134: e1a05000 mov r5, r0
30018138: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3001813c: 13a00004 movne r0, #4
{
register Partition_Control *the_partition;
Objects_Locations location;
the_partition = _Partition_Get( id, &location );
switch ( location ) {
30018140: 1a000016 bne 300181a0 <rtems_partition_return_buffer+0x90>
)
{
void *starting;
void *ending;
starting = the_partition->starting_address;
30018144: e5950010 ldr r0, [r5, #16]
30018148: e5953014 ldr r3, [r5, #20]
3001814c: e0803003 add r3, r0, r3
const void *address,
const void *base,
const void *limit
)
{
return (address >= base && address <= limit);
30018150: e1540003 cmp r4, r3
30018154: 83a03000 movhi r3, #0
30018158: 93a03001 movls r3, #1
3001815c: e1540000 cmp r4, r0
30018160: 33a03000 movcc r3, #0
ending = _Addresses_Add_offset( starting, the_partition->length );
return (
_Addresses_Is_in_range( the_buffer, starting, ending ) &&
30018164: e3530000 cmp r3, #0
30018168: 0a00000e beq 300181a8 <rtems_partition_return_buffer+0x98>
offset = (uint32_t) _Addresses_Subtract(
the_buffer,
the_partition->starting_address
);
return ((offset % the_partition->buffer_size) == 0);
3001816c: e0600004 rsb r0, r0, r4
30018170: e5951018 ldr r1, [r5, #24]
30018174: eb00602f bl 30030238 <__umodsi3>
starting = the_partition->starting_address;
ending = _Addresses_Add_offset( starting, the_partition->length );
return (
_Addresses_Is_in_range( the_buffer, starting, ending ) &&
30018178: e2506000 subs r6, r0, #0
3001817c: 1a000009 bne 300181a8 <rtems_partition_return_buffer+0x98>
RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
Partition_Control *the_partition,
Chain_Node *the_buffer
)
{
_Chain_Append( &the_partition->Memory, the_buffer );
30018180: e2850024 add r0, r5, #36 ; 0x24
30018184: e1a01004 mov r1, r4
30018188: eb000bdf bl 3001b10c <_Chain_Append>
case OBJECTS_LOCAL:
if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
3001818c: e5953020 ldr r3, [r5, #32]
30018190: e2433001 sub r3, r3, #1
30018194: e5853020 str r3, [r5, #32]
_Thread_Enable_dispatch();
30018198: eb001672 bl 3001db68 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3001819c: e1a00006 mov r0, r6
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
300181a0: e28dd004 add sp, sp, #4
300181a4: e8bd8070 pop {r4, r5, r6, pc}
_Partition_Free_buffer( the_partition, buffer );
the_partition->number_of_used_blocks -= 1;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
300181a8: eb00166e bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
300181ac: e3a00009 mov r0, #9 <== NOT EXECUTED
300181b0: eafffffa b 300181a0 <rtems_partition_return_buffer+0x90> <== NOT EXECUTED
300174d4 <rtems_port_create>:
void *internal_start,
void *external_start,
uint32_t length,
rtems_id *id
)
{
300174d4: e92d40f0 push {r4, r5, r6, r7, lr}
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
300174d8: e2504000 subs r4, r0, #0
void *internal_start,
void *external_start,
uint32_t length,
rtems_id *id
)
{
300174dc: e24dd00c sub sp, sp, #12
300174e0: e59d5020 ldr r5, [sp, #32]
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
300174e4: 03a00003 moveq r0, #3
rtems_id *id
)
{
register Dual_ported_memory_Control *the_port;
if ( !rtems_is_name_valid( name ) )
300174e8: 0a000005 beq 30017504 <rtems_port_create+0x30>
return RTEMS_INVALID_NAME;
if ( !id )
300174ec: e3550000 cmp r5, #0
300174f0: 0a000002 beq 30017500 <rtems_port_create+0x2c>
* id - port id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_port_create(
300174f4: e1826001 orr r6, r2, r1
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( !_Addresses_Is_aligned( internal_start ) ||
300174f8: e2166007 ands r6, r6, #7
300174fc: 0a000002 beq 3001750c <rtems_port_create+0x38>
!_Addresses_Is_aligned( external_start ) )
return RTEMS_INVALID_ADDRESS;
30017500: e3a00009 mov r0, #9 <== NOT EXECUTED
);
*id = the_port->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
30017504: e28dd00c add sp, sp, #12
30017508: e8bd80f0 pop {r4, r5, r6, r7, pc}
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3001750c: e59f0074 ldr r0, [pc, #116] ; 30017588 <rtems_port_create+0xb4>
30017510: e590c000 ldr ip, [r0]
30017514: e28cc001 add ip, ip, #1
30017518: e580c000 str ip, [r0]
*/
RTEMS_INLINE_ROUTINE Dual_ported_memory_Control
*_Dual_ported_memory_Allocate ( void )
{
return (Dual_ported_memory_Control *)
_Objects_Allocate( &_Dual_ported_memory_Information );
3001751c: e59f7068 ldr r7, [pc, #104] ; 3001758c <rtems_port_create+0xb8>
30017520: e58d1008 str r1, [sp, #8]
30017524: e1a00007 mov r0, r7
30017528: e58d2004 str r2, [sp, #4]
3001752c: e58d3000 str r3, [sp]
30017530: eb0014fc bl 3001c928 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_port = _Dual_ported_memory_Allocate();
if ( !the_port ) {
30017534: e3500000 cmp r0, #0
30017538: e59d1008 ldr r1, [sp, #8]
3001753c: e59d2004 ldr r2, [sp, #4]
30017540: e59d3000 ldr r3, [sp]
30017544: 0a00000c beq 3001757c <rtems_port_create+0xa8>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
30017548: e590c008 ldr ip, [r0, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3001754c: e597e01c ldr lr, [r7, #28]
return RTEMS_TOO_MANY;
}
the_port->internal_base = internal_start;
the_port->external_base = external_start;
the_port->length = length - 1;
30017550: e2433001 sub r3, r3, #1
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
30017554: e1a0780c lsl r7, ip, #16
if ( !the_port ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_port->internal_base = internal_start;
30017558: e5801010 str r1, [r0, #16]
the_port->external_base = external_start;
3001755c: e5802014 str r2, [r0, #20]
the_port->length = length - 1;
30017560: e5803018 str r3, [r0, #24]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
30017564: e78e0727 str r0, [lr, r7, lsr #14]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
30017568: e580400c str r4, [r0, #12]
&_Dual_ported_memory_Information,
&the_port->Object,
(Objects_Name) name
);
*id = the_port->Object.id;
3001756c: e585c000 str ip, [r5]
_Thread_Enable_dispatch();
30017570: eb00197c bl 3001db68 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
30017574: e1a00006 mov r0, r6
30017578: eaffffe1 b 30017504 <rtems_port_create+0x30>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_port = _Dual_ported_memory_Allocate();
if ( !the_port ) {
_Thread_Enable_dispatch();
3001757c: eb001979 bl 3001db68 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
30017580: e3a00005 mov r0, #5
30017584: eaffffde b 30017504 <rtems_port_create+0x30>
300181b8 <rtems_rate_monotonic_cancel>:
*/
rtems_status_code rtems_rate_monotonic_cancel(
rtems_id id
)
{
300181b8: e92d4030 push {r4, r5, lr}
300181bc: e24dd004 sub sp, sp, #4
300181c0: e1a01000 mov r1, r0
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
300181c4: e1a0200d mov r2, sp
300181c8: e59f0050 ldr r0, [pc, #80] ; 30018220 <rtems_rate_monotonic_cancel+0x68>
300181cc: eb001316 bl 3001ce2c <_Objects_Get>
Rate_monotonic_Control *the_period;
Objects_Locations location;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
300181d0: e59d4000 ldr r4, [sp]
300181d4: e1a05000 mov r5, r0
300181d8: e3540000 cmp r4, #0
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
300181dc: 13a00004 movne r0, #4
{
Rate_monotonic_Control *the_period;
Objects_Locations location;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
300181e0: 1a000006 bne 30018200 <rtems_rate_monotonic_cancel+0x48>
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
300181e4: e59f3038 ldr r3, [pc, #56] ; 30018224 <rtems_rate_monotonic_cancel+0x6c>
300181e8: e5952040 ldr r2, [r5, #64] ; 0x40
300181ec: e5933004 ldr r3, [r3, #4]
300181f0: e1520003 cmp r2, r3
300181f4: 0a000003 beq 30018208 <rtems_rate_monotonic_cancel+0x50>
_Thread_Enable_dispatch();
300181f8: eb00165a bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_NOT_OWNER_OF_RESOURCE;
300181fc: e3a00017 mov r0, #23 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30018200: e28dd004 add sp, sp, #4
30018204: e8bd8030 pop {r4, r5, pc}
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
(void) _Watchdog_Remove( &the_period->Timer );
30018208: e2850010 add r0, r5, #16
3001820c: eb001b0b bl 3001ee40 <_Watchdog_Remove>
the_period->state = RATE_MONOTONIC_INACTIVE;
30018210: e5854038 str r4, [r5, #56] ; 0x38
_Thread_Enable_dispatch();
30018214: eb001653 bl 3001db68 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
30018218: e1a00004 mov r0, r4
3001821c: eafffff7 b 30018200 <rtems_rate_monotonic_cancel+0x48>
3000a944 <rtems_rate_monotonic_create>:
rtems_status_code rtems_rate_monotonic_create(
rtems_name name,
rtems_id *id
)
{
3000a944: e92d4070 push {r4, r5, r6, lr}
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
3000a948: e2504000 subs r4, r0, #0
rtems_status_code rtems_rate_monotonic_create(
rtems_name name,
rtems_id *id
)
{
3000a94c: e1a05001 mov r5, r1
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
3000a950: 03a00003 moveq r0, #3
rtems_id *id
)
{
Rate_monotonic_Control *the_period;
if ( !rtems_is_name_valid( name ) )
3000a954: 08bd8070 popeq {r4, r5, r6, pc}
return RTEMS_INVALID_NAME;
if ( !id )
3000a958: e3510000 cmp r1, #0
3000a95c: 0a00002c beq 3000aa14 <rtems_rate_monotonic_create+0xd0>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000a960: e59f30b4 ldr r3, [pc, #180] ; 3000aa1c <rtems_rate_monotonic_create+0xd8>
3000a964: e5932000 ldr r2, [r3]
3000a968: e2822001 add r2, r2, #1
3000a96c: e5832000 str r2, [r3]
* the inactive chain of free period control blocks.
*/
RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void )
{
return (Rate_monotonic_Control *)
_Objects_Allocate( &_Rate_monotonic_Information );
3000a970: e59f60a8 ldr r6, [pc, #168] ; 3000aa20 <rtems_rate_monotonic_create+0xdc>
3000a974: e1a00006 mov r0, r6
3000a978: eb000808 bl 3000c9a0 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_period = _Rate_monotonic_Allocate();
if ( !the_period ) {
3000a97c: e3500000 cmp r0, #0
3000a980: 0a000020 beq 3000aa08 <rtems_rate_monotonic_create+0xc4>
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_period->owner = _Thread_Executing;
3000a984: e59f3098 ldr r3, [pc, #152] ; 3000aa24 <rtems_rate_monotonic_create+0xe0>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
3000a988: e5902008 ldr r2, [r0, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3000a98c: e596101c ldr r1, [r6, #28]
3000a990: e593e004 ldr lr, [r3, #4]
the_period->state = RATE_MONOTONIC_INACTIVE;
3000a994: e3a06000 mov r6, #0
_Watchdog_Initialize( &the_period->Timer, NULL, 0, NULL );
_Rate_monotonic_Reset_statistics( the_period );
3000a998: e3e03102 mvn r3, #-2147483648 ; 0x80000000
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
3000a99c: e1a0c802 lsl ip, r2, #16
if ( !the_period ) {
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_period->owner = _Thread_Executing;
3000a9a0: e580e040 str lr, [r0, #64] ; 0x40
the_period->state = RATE_MONOTONIC_INACTIVE;
3000a9a4: e5806038 str r6, [r0, #56] ; 0x38
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3000a9a8: e5806018 str r6, [r0, #24]
the_watchdog->routine = routine;
3000a9ac: e580602c str r6, [r0, #44] ; 0x2c
the_watchdog->id = id;
3000a9b0: e5806030 str r6, [r0, #48] ; 0x30
the_watchdog->user_data = user_data;
3000a9b4: e5806034 str r6, [r0, #52] ; 0x34
_Watchdog_Initialize( &the_period->Timer, NULL, 0, NULL );
_Rate_monotonic_Reset_statistics( the_period );
3000a9b8: e5806054 str r6, [r0, #84] ; 0x54
3000a9bc: e5806058 str r6, [r0, #88] ; 0x58
3000a9c0: e5806064 str r6, [r0, #100] ; 0x64
3000a9c4: e5806068 str r6, [r0, #104] ; 0x68
3000a9c8: e580606c str r6, [r0, #108] ; 0x6c
3000a9cc: e5806070 str r6, [r0, #112] ; 0x70
3000a9d0: e580607c str r6, [r0, #124] ; 0x7c
3000a9d4: e5806080 str r6, [r0, #128] ; 0x80
3000a9d8: e5806084 str r6, [r0, #132] ; 0x84
3000a9dc: e5806088 str r6, [r0, #136] ; 0x88
3000a9e0: e580305c str r3, [r0, #92] ; 0x5c
3000a9e4: e5803060 str r3, [r0, #96] ; 0x60
3000a9e8: e5803074 str r3, [r0, #116] ; 0x74
3000a9ec: e5803078 str r3, [r0, #120] ; 0x78
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3000a9f0: e781072c str r0, [r1, ip, lsr #14]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
3000a9f4: e580400c str r4, [r0, #12]
&_Rate_monotonic_Information,
&the_period->Object,
(Objects_Name) name
);
*id = the_period->Object.id;
3000a9f8: e5852000 str r2, [r5]
_Thread_Enable_dispatch();
3000a9fc: eb000ca8 bl 3000dca4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000aa00: e1a00006 mov r0, r6
3000aa04: e8bd8070 pop {r4, r5, r6, pc}
_Thread_Disable_dispatch(); /* to prevent deletion */
the_period = _Rate_monotonic_Allocate();
if ( !the_period ) {
_Thread_Enable_dispatch();
3000aa08: eb000ca5 bl 3000dca4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_TOO_MANY;
3000aa0c: e3a00005 mov r0, #5 <== NOT EXECUTED
3000aa10: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
3000aa14: e3a00009 mov r0, #9 <== NOT EXECUTED
);
*id = the_period->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
3000aa18: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
30010b0c <rtems_rate_monotonic_get_statistics>:
rtems_status_code rtems_rate_monotonic_get_statistics(
rtems_id id,
rtems_rate_monotonic_period_statistics *statistics
)
{
30010b0c: e92d4bf0 push {r4, r5, r6, r7, r8, r9, fp, lr} <== NOT EXECUTED
Objects_Locations location;
Rate_monotonic_Control *the_period;
rtems_rate_monotonic_period_statistics *dst;
Rate_monotonic_Statistics *src;
if ( !statistics )
30010b10: e2514000 subs r4, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_rate_monotonic_get_statistics(
rtems_id id,
rtems_rate_monotonic_period_statistics *statistics
)
{
30010b14: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
30010b18: e1a01000 mov r1, r0 <== NOT EXECUTED
Rate_monotonic_Control *the_period;
rtems_rate_monotonic_period_statistics *dst;
Rate_monotonic_Statistics *src;
if ( !statistics )
return RTEMS_INVALID_ADDRESS;
30010b1c: 03a00009 moveq r0, #9 <== NOT EXECUTED
Objects_Locations location;
Rate_monotonic_Control *the_period;
rtems_rate_monotonic_period_statistics *dst;
Rate_monotonic_Statistics *src;
if ( !statistics )
30010b20: 0a000024 beq 30010bb8 <rtems_rate_monotonic_get_statistics+0xac><== NOT EXECUTED
30010b24: e59f0094 ldr r0, [pc, #148] ; 30010bc0 <rtems_rate_monotonic_get_statistics+0xb4><== NOT EXECUTED
30010b28: e1a0200d mov r2, sp <== NOT EXECUTED
30010b2c: ebfff10d bl 3000cf68 <_Objects_Get> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
30010b30: e59d5000 ldr r5, [sp] <== NOT EXECUTED
30010b34: e3550000 cmp r5, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30010b38: 13a00004 movne r0, #4 <== NOT EXECUTED
if ( !statistics )
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
30010b3c: 1a00001d bne 30010bb8 <rtems_rate_monotonic_get_statistics+0xac><== NOT EXECUTED
case OBJECTS_LOCAL:
dst = statistics;
src = &the_period->Statistics;
dst->count = src->count;
30010b40: e590e054 ldr lr, [r0, #84] ; 0x54 <== NOT EXECUTED
dst->missed_count = src->missed_count;
30010b44: e5901058 ldr r1, [r0, #88] ; 0x58 <== NOT EXECUTED
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec( &src->min_cpu_time, &dst->min_cpu_time );
_Timestamp_To_timespec( &src->max_cpu_time, &dst->max_cpu_time );
_Timestamp_To_timespec( &src->total_cpu_time, &dst->total_cpu_time );
_Timestamp_To_timespec( &src->min_wall_time, &dst->min_wall_time );
30010b48: e2803074 add r3, r0, #116 ; 0x74 <== NOT EXECUTED
30010b4c: e893000c ldm r3, {r2, r3} <== NOT EXECUTED
dst = statistics;
src = &the_period->Statistics;
dst->count = src->count;
dst->missed_count = src->missed_count;
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec( &src->min_cpu_time, &dst->min_cpu_time );
30010b50: e280905c add r9, r0, #92 ; 0x5c <== NOT EXECUTED
30010b54: e8990300 ldm r9, {r8, r9} <== NOT EXECUTED
_Timestamp_To_timespec( &src->max_cpu_time, &dst->max_cpu_time );
30010b58: e2807064 add r7, r0, #100 ; 0x64 <== NOT EXECUTED
30010b5c: e89700c0 ldm r7, {r6, r7} <== NOT EXECUTED
_Timestamp_To_timespec( &src->total_cpu_time, &dst->total_cpu_time );
30010b60: e280c06c add ip, r0, #108 ; 0x6c <== NOT EXECUTED
30010b64: e89c1800 ldm ip, {fp, ip} <== NOT EXECUTED
_Timestamp_To_timespec( &src->min_wall_time, &dst->min_wall_time );
30010b68: e5842020 str r2, [r4, #32] <== NOT EXECUTED
30010b6c: e5843024 str r3, [r4, #36] ; 0x24 <== NOT EXECUTED
_Timestamp_To_timespec( &src->max_wall_time, &dst->max_wall_time );
30010b70: e280307c add r3, r0, #124 ; 0x7c <== NOT EXECUTED
30010b74: e893000c ldm r3, {r2, r3} <== NOT EXECUTED
30010b78: e5842028 str r2, [r4, #40] ; 0x28 <== NOT EXECUTED
30010b7c: e584302c str r3, [r4, #44] ; 0x2c <== NOT EXECUTED
_Timestamp_To_timespec( &src->total_wall_time, &dst->total_wall_time );
30010b80: e2803084 add r3, r0, #132 ; 0x84 <== NOT EXECUTED
30010b84: e893000c ldm r3, {r2, r3} <== NOT EXECUTED
switch ( location ) {
case OBJECTS_LOCAL:
dst = statistics;
src = &the_period->Statistics;
dst->count = src->count;
30010b88: e584e000 str lr, [r4] <== NOT EXECUTED
_Timestamp_To_timespec( &src->min_cpu_time, &dst->min_cpu_time );
_Timestamp_To_timespec( &src->max_cpu_time, &dst->max_cpu_time );
_Timestamp_To_timespec( &src->total_cpu_time, &dst->total_cpu_time );
_Timestamp_To_timespec( &src->min_wall_time, &dst->min_wall_time );
_Timestamp_To_timespec( &src->max_wall_time, &dst->max_wall_time );
_Timestamp_To_timespec( &src->total_wall_time, &dst->total_wall_time );
30010b8c: e5842030 str r2, [r4, #48] ; 0x30 <== NOT EXECUTED
30010b90: e5843034 str r3, [r4, #52] ; 0x34 <== NOT EXECUTED
case OBJECTS_LOCAL:
dst = statistics;
src = &the_period->Statistics;
dst->count = src->count;
dst->missed_count = src->missed_count;
30010b94: e5841004 str r1, [r4, #4] <== NOT EXECUTED
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec( &src->min_cpu_time, &dst->min_cpu_time );
30010b98: e5848008 str r8, [r4, #8] <== NOT EXECUTED
30010b9c: e584900c str r9, [r4, #12] <== NOT EXECUTED
_Timestamp_To_timespec( &src->max_cpu_time, &dst->max_cpu_time );
30010ba0: e5846010 str r6, [r4, #16] <== NOT EXECUTED
30010ba4: e5847014 str r7, [r4, #20] <== NOT EXECUTED
_Timestamp_To_timespec( &src->total_cpu_time, &dst->total_cpu_time );
30010ba8: e584b018 str fp, [r4, #24] <== NOT EXECUTED
30010bac: e584c01c str ip, [r4, #28] <== NOT EXECUTED
dst->min_wall_time = src->min_wall_time;
dst->max_wall_time = src->max_wall_time;
dst->total_wall_time = src->total_wall_time;
#endif
_Thread_Enable_dispatch();
30010bb0: ebfff43b bl 3000dca4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30010bb4: e1a00005 mov r0, r5 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30010bb8: e28dd004 add sp, sp, #4 <== NOT EXECUTED
30010bbc: e8bd8bf0 pop {r4, r5, r6, r7, r8, r9, fp, pc} <== NOT EXECUTED
30010bc4 <rtems_rate_monotonic_get_status>:
rtems_status_code rtems_rate_monotonic_get_status(
rtems_id id,
rtems_rate_monotonic_period_status *status
)
{
30010bc4: e92d4010 push {r4, lr} <== NOT EXECUTED
Objects_Locations location;
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
30010bc8: e2514000 subs r4, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_rate_monotonic_get_status(
rtems_id id,
rtems_rate_monotonic_period_status *status
)
{
30010bcc: e24dd014 sub sp, sp, #20 <== NOT EXECUTED
30010bd0: e1a01000 mov r1, r0 <== NOT EXECUTED
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
return RTEMS_INVALID_ADDRESS;
30010bd4: 03a00009 moveq r0, #9 <== NOT EXECUTED
Objects_Locations location;
Rate_monotonic_Period_time_t since_last_period;
Rate_monotonic_Control *the_period;
bool valid_status;
if ( !status )
30010bd8: 0a000013 beq 30010c2c <rtems_rate_monotonic_get_status+0x68><== NOT EXECUTED
30010bdc: e28d2010 add r2, sp, #16 <== NOT EXECUTED
30010be0: e59f008c ldr r0, [pc, #140] ; 30010c74 <rtems_rate_monotonic_get_status+0xb0><== NOT EXECUTED
30010be4: ebfff0df bl 3000cf68 <_Objects_Get> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
30010be8: e59d2010 ldr r2, [sp, #16] <== NOT EXECUTED
30010bec: e1a03000 mov r3, r0 <== NOT EXECUTED
30010bf0: e3520000 cmp r2, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30010bf4: 13a00004 movne r0, #4 <== NOT EXECUTED
if ( !status )
return RTEMS_INVALID_ADDRESS;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
30010bf8: 1a00000b bne 30010c2c <rtems_rate_monotonic_get_status+0x68><== NOT EXECUTED
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
30010bfc: e5932040 ldr r2, [r3, #64] ; 0x40 <== NOT EXECUTED
status->state = the_period->state;
30010c00: e5933038 ldr r3, [r3, #56] ; 0x38 <== NOT EXECUTED
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
30010c04: e5922008 ldr r2, [r2, #8] <== NOT EXECUTED
status->state = the_period->state;
/*
* If the period is inactive, there is no information.
*/
if ( status->state == RATE_MONOTONIC_INACTIVE ) {
30010c08: e3530000 cmp r3, #0 <== NOT EXECUTED
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
status->owner = the_period->owner->Object.id;
30010c0c: e884000c stm r4, {r2, r3} <== NOT EXECUTED
status->state = the_period->state;
/*
* If the period is inactive, there is no information.
*/
if ( status->state == RATE_MONOTONIC_INACTIVE ) {
30010c10: 1a000007 bne 30010c34 <rtems_rate_monotonic_get_status+0x70><== NOT EXECUTED
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timespec_Set_to_zero( &status->since_last_period );
30010c14: e5843008 str r3, [r4, #8] <== NOT EXECUTED
30010c18: e584300c str r3, [r4, #12] <== NOT EXECUTED
_Timespec_Set_to_zero( &status->executed_since_last_period );
30010c1c: e5843010 str r3, [r4, #16] <== NOT EXECUTED
30010c20: e5843014 str r3, [r4, #20] <== NOT EXECUTED
status->since_last_period = since_last_period;
status->executed_since_last_period = executed;
#endif
}
_Thread_Enable_dispatch();
30010c24: ebfff41e bl 3000dca4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30010c28: e3a00000 mov r0, #0 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30010c2c: e28dd014 add sp, sp, #20 <== NOT EXECUTED
30010c30: e8bd8010 pop {r4, pc} <== NOT EXECUTED
} else {
/*
* Grab the current status.
*/
valid_status =
30010c34: e1a0100d mov r1, sp <== NOT EXECUTED
30010c38: e28d2008 add r2, sp, #8 <== NOT EXECUTED
30010c3c: ebffe785 bl 3000aa58 <_Rate_monotonic_Get_status> <== NOT EXECUTED
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
30010c40: e3500000 cmp r0, #0 <== NOT EXECUTED
30010c44: 0a000007 beq 30010c68 <rtems_rate_monotonic_get_status+0xa4><== NOT EXECUTED
_Thread_Enable_dispatch();
return RTEMS_NOT_DEFINED;
}
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
_Timestamp_To_timespec(
30010c48: e89d000c ldm sp, {r2, r3} <== NOT EXECUTED
30010c4c: e5842008 str r2, [r4, #8] <== NOT EXECUTED
30010c50: e584300c str r3, [r4, #12] <== NOT EXECUTED
&since_last_period, &status->since_last_period
);
_Timestamp_To_timespec(
30010c54: e28d3008 add r3, sp, #8 <== NOT EXECUTED
30010c58: e893000c ldm r3, {r2, r3} <== NOT EXECUTED
30010c5c: e5842010 str r2, [r4, #16] <== NOT EXECUTED
30010c60: e5843014 str r3, [r4, #20] <== NOT EXECUTED
30010c64: eaffffee b 30010c24 <rtems_rate_monotonic_get_status+0x60> <== NOT EXECUTED
valid_status =
_Rate_monotonic_Get_status(
the_period, &since_last_period, &executed
);
if (!valid_status) {
_Thread_Enable_dispatch();
30010c68: ebfff40d bl 3000dca4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_NOT_DEFINED;
30010c6c: e3a0000b mov r0, #11 <== NOT EXECUTED
30010c70: eaffffed b 30010c2c <rtems_rate_monotonic_get_status+0x68> <== NOT EXECUTED
3000ac84 <rtems_rate_monotonic_period>:
rtems_status_code rtems_rate_monotonic_period(
rtems_id id,
rtems_interval length
)
{
3000ac84: e92d41f0 push {r4, r5, r6, r7, r8, lr}
3000ac88: e1a04000 mov r4, r0
3000ac8c: e24dd008 sub sp, sp, #8
3000ac90: e1a05001 mov r5, r1
Objects_Id id,
Objects_Locations *location
)
{
return (Rate_monotonic_Control *)
_Objects_Get( &_Rate_monotonic_Information, id, location );
3000ac94: e59f017c ldr r0, [pc, #380] ; 3000ae18 <rtems_rate_monotonic_period+0x194>
3000ac98: e1a01004 mov r1, r4
3000ac9c: e28d2004 add r2, sp, #4
3000aca0: eb0008b0 bl 3000cf68 <_Objects_Get>
rtems_rate_monotonic_period_states local_state;
ISR_Level level;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
3000aca4: e59d3004 ldr r3, [sp, #4]
3000aca8: e1a06000 mov r6, r0
3000acac: e3530000 cmp r3, #0
3000acb0: 1a000008 bne 3000acd8 <rtems_rate_monotonic_period+0x54>
RTEMS_INLINE_ROUTINE bool _Thread_Is_executing (
const Thread_Control *the_thread
)
{
return ( the_thread == _Thread_Executing );
3000acb4: e59f7160 ldr r7, [pc, #352] ; 3000ae1c <rtems_rate_monotonic_period+0x198>
case OBJECTS_LOCAL:
if ( !_Thread_Is_executing( the_period->owner ) ) {
3000acb8: e5902040 ldr r2, [r0, #64] ; 0x40
3000acbc: e5973004 ldr r3, [r7, #4]
3000acc0: e1520003 cmp r2, r3
3000acc4: 0a000005 beq 3000ace0 <rtems_rate_monotonic_period+0x5c>
_Thread_Enable_dispatch();
3000acc8: eb000bf5 bl 3000dca4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_NOT_OWNER_OF_RESOURCE;
3000accc: e3a00017 mov r0, #23 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000acd0: e28dd008 add sp, sp, #8
3000acd4: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000acd8: e3a00004 mov r0, #4 <== NOT EXECUTED
3000acdc: eafffffb b 3000acd0 <rtems_rate_monotonic_period+0x4c> <== NOT EXECUTED
if ( !_Thread_Is_executing( the_period->owner ) ) {
_Thread_Enable_dispatch();
return RTEMS_NOT_OWNER_OF_RESOURCE;
}
if ( length == RTEMS_PERIOD_STATUS ) {
3000ace0: e3550000 cmp r5, #0
3000ace4: 1a000008 bne 3000ad0c <rtems_rate_monotonic_period+0x88>
switch ( the_period->state ) {
3000ace8: e5903038 ldr r3, [r0, #56] ; 0x38
3000acec: e3530004 cmp r3, #4
3000acf0: 959f2128 ldrls r2, [pc, #296] ; 3000ae20 <rtems_rate_monotonic_period+0x19c>
3000acf4: 81a00005 movhi r0, r5
3000acf8: 97920103 ldrls r0, [r2, r3, lsl #2]
the_period->state = RATE_MONOTONIC_ACTIVE;
the_period->next_length = length;
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
3000acfc: e58d0000 str r0, [sp]
3000ad00: eb000be7 bl 3000dca4 <_Thread_Enable_dispatch>
return RTEMS_TIMEOUT;
3000ad04: e59d0000 ldr r0, [sp]
3000ad08: eafffff0 b 3000acd0 <rtems_rate_monotonic_period+0x4c>
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000ad0c: e10f8000 mrs r8, CPSR
3000ad10: e3883080 orr r3, r8, #128 ; 0x80
3000ad14: e129f003 msr CPSR_fc, r3
_Thread_Enable_dispatch();
return( return_value );
}
_ISR_Disable( level );
if ( the_period->state == RATE_MONOTONIC_INACTIVE ) {
3000ad18: e5903038 ldr r3, [r0, #56] ; 0x38
3000ad1c: e3530000 cmp r3, #0
3000ad20: 0a00000e beq 3000ad60 <rtems_rate_monotonic_period+0xdc>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
3000ad24: e3530002 cmp r3, #2
3000ad28: 0a00001f beq 3000adac <rtems_rate_monotonic_period+0x128>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
if ( the_period->state == RATE_MONOTONIC_EXPIRED ) {
3000ad2c: e3530004 cmp r3, #4 <== NOT EXECUTED
3000ad30: 1affffe8 bne 3000acd8 <rtems_rate_monotonic_period+0x54> <== NOT EXECUTED
/*
* Update statistics from the concluding period
*/
_Rate_monotonic_Update_statistics( the_period );
3000ad34: ebffff97 bl 3000ab98 <_Rate_monotonic_Update_statistics> <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000ad38: e129f008 msr CPSR_fc, r8 <== NOT EXECUTED
_ISR_Enable( level );
the_period->state = RATE_MONOTONIC_ACTIVE;
3000ad3c: e3a03002 mov r3, #2 <== NOT EXECUTED
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000ad40: e59f00dc ldr r0, [pc, #220] ; 3000ae24 <rtems_rate_monotonic_period+0x1a0><== NOT EXECUTED
3000ad44: e2861010 add r1, r6, #16 <== NOT EXECUTED
3000ad48: e5863038 str r3, [r6, #56] ; 0x38 <== NOT EXECUTED
the_period->next_length = length;
3000ad4c: e586503c str r5, [r6, #60] ; 0x3c <== NOT EXECUTED
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3000ad50: e586501c str r5, [r6, #28] <== NOT EXECUTED
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000ad54: eb000f99 bl 3000ebc0 <_Watchdog_Insert> <== NOT EXECUTED
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
return RTEMS_TIMEOUT;
3000ad58: e3a00006 mov r0, #6 <== NOT EXECUTED
3000ad5c: eaffffe6 b 3000acfc <rtems_rate_monotonic_period+0x78> <== NOT EXECUTED
3000ad60: e129f008 msr CPSR_fc, r8
_ISR_Enable( level );
/*
* Baseline statistics information for the beginning of a period.
*/
_Rate_monotonic_Initiate_statistics( the_period );
3000ad64: ebffff6b bl 3000ab18 <_Rate_monotonic_Initiate_statistics>
the_period->state = RATE_MONOTONIC_ACTIVE;
3000ad68: e3a03002 mov r3, #2
3000ad6c: e5863038 str r3, [r6, #56] ; 0x38
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3000ad70: e59f30b0 ldr r3, [pc, #176] ; 3000ae28 <rtems_rate_monotonic_period+0x1a4>
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3000ad74: e3a07000 mov r7, #0
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000ad78: e59f00a4 ldr r0, [pc, #164] ; 3000ae24 <rtems_rate_monotonic_period+0x1a0>
3000ad7c: e2861010 add r1, r6, #16
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3000ad80: e586302c str r3, [r6, #44] ; 0x2c
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3000ad84: e5867018 str r7, [r6, #24]
the_watchdog->routine = routine;
the_watchdog->id = id;
3000ad88: e5864030 str r4, [r6, #48] ; 0x30
the_watchdog->user_data = user_data;
3000ad8c: e5867034 str r7, [r6, #52] ; 0x34
_Rate_monotonic_Timeout,
id,
NULL
);
the_period->next_length = length;
3000ad90: e586503c str r5, [r6, #60] ; 0x3c
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3000ad94: e586501c str r5, [r6, #28]
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000ad98: eb000f88 bl 3000ebc0 <_Watchdog_Insert>
_Watchdog_Insert_ticks( &the_period->Timer, length );
_Thread_Enable_dispatch();
3000ad9c: e58d7000 str r7, [sp]
3000ada0: eb000bbf bl 3000dca4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000ada4: e59d0000 ldr r0, [sp]
3000ada8: eaffffc8 b 3000acd0 <rtems_rate_monotonic_period+0x4c>
if ( the_period->state == RATE_MONOTONIC_ACTIVE ) {
/*
* Update statistics from the concluding period.
*/
_Rate_monotonic_Update_statistics( the_period );
3000adac: ebffff79 bl 3000ab98 <_Rate_monotonic_Update_statistics>
/*
* This tells the _Rate_monotonic_Timeout that this task is
* in the process of blocking on the period and that we
* may be changing the length of the next period.
*/
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
3000adb0: e3a03001 mov r3, #1
3000adb4: e5863038 str r3, [r6, #56] ; 0x38
the_period->next_length = length;
3000adb8: e586503c str r5, [r6, #60] ; 0x3c
3000adbc: e129f008 msr CPSR_fc, r8
_ISR_Enable( level );
_Thread_Executing->Wait.id = the_period->Object.id;
3000adc0: e5973004 ldr r3, [r7, #4]
3000adc4: e5962008 ldr r2, [r6, #8]
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
3000adc8: e1a00003 mov r0, r3
the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
the_period->next_length = length;
_ISR_Enable( level );
_Thread_Executing->Wait.id = the_period->Object.id;
3000adcc: e5832020 str r2, [r3, #32]
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
3000add0: e3a01901 mov r1, #16384 ; 0x4000
3000add4: eb000dca bl 3000e504 <_Thread_Set_state>
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000add8: e10f2000 mrs r2, CPSR
3000addc: e3823080 orr r3, r2, #128 ; 0x80
3000ade0: e129f003 msr CPSR_fc, r3
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
the_period->state = RATE_MONOTONIC_ACTIVE;
3000ade4: e3a01002 mov r1, #2
/*
* Did the watchdog timer expire while we were actually blocking
* on it?
*/
_ISR_Disable( level );
local_state = the_period->state;
3000ade8: e5963038 ldr r3, [r6, #56] ; 0x38
the_period->state = RATE_MONOTONIC_ACTIVE;
3000adec: e5861038 str r1, [r6, #56] ; 0x38
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000adf0: e129f002 msr CPSR_fc, r2
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
3000adf4: e3530003 cmp r3, #3
3000adf8: 0a000002 beq 3000ae08 <rtems_rate_monotonic_period+0x184>
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
_Thread_Enable_dispatch();
3000adfc: eb000ba8 bl 3000dca4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000ae00: e3a00000 mov r0, #0 <== NOT EXECUTED
3000ae04: eaffffb1 b 3000acd0 <rtems_rate_monotonic_period+0x4c> <== NOT EXECUTED
/*
* If it did, then we want to unblock ourself and continue as
* if nothing happen. The period was reset in the timeout routine.
*/
if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
_Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
3000ae08: e5970004 ldr r0, [r7, #4] <== NOT EXECUTED
3000ae0c: e3a01901 mov r1, #16384 ; 0x4000 <== NOT EXECUTED
3000ae10: eb000ac6 bl 3000d930 <_Thread_Clear_state> <== NOT EXECUTED
3000ae14: eafffff8 b 3000adfc <rtems_rate_monotonic_period+0x178> <== NOT EXECUTED
3000b068 <rtems_rate_monotonic_report_statistics>:
}
}
void rtems_rate_monotonic_report_statistics( void )
{
rtems_rate_monotonic_report_statistics_with_plugin( NULL, printk_plugin );
3000b068: e59f1004 ldr r1, [pc, #4] ; 3000b074 <rtems_rate_monotonic_report_statistics+0xc><== NOT EXECUTED
3000b06c: e3a00000 mov r0, #0 <== NOT EXECUTED
3000b070: eaffff6d b 3000ae2c <rtems_rate_monotonic_report_statistics_with_plugin><== NOT EXECUTED
3000ae2c <rtems_rate_monotonic_report_statistics_with_plugin>:
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
3000ae2c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
3000ae30: e2515000 subs r5, r1, #0 <== NOT EXECUTED
*/
void rtems_rate_monotonic_report_statistics_with_plugin(
void *context,
rtems_printk_plugin_t print
)
{
3000ae34: e24dd078 sub sp, sp, #120 ; 0x78 <== NOT EXECUTED
3000ae38: e1a08000 mov r8, r0 <== NOT EXECUTED
rtems_id id;
rtems_rate_monotonic_period_statistics the_stats;
rtems_rate_monotonic_period_status the_status;
char name[5];
if ( !print )
3000ae3c: 0a000047 beq 3000af60 <rtems_rate_monotonic_report_statistics_with_plugin+0x134><== NOT EXECUTED
return;
(*print)( context, "Period information by period\n" );
3000ae40: e59f11f4 ldr r1, [pc, #500] ; 3000b03c <rtems_rate_monotonic_report_statistics_with_plugin+0x210><== NOT EXECUTED
3000ae44: e1a0e00f mov lr, pc <== NOT EXECUTED
3000ae48: e12fff15 bx r5 <== NOT EXECUTED
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
(*print)( context, "--- CPU times are in seconds ---\n" );
3000ae4c: e59f11ec ldr r1, [pc, #492] ; 3000b040 <rtems_rate_monotonic_report_statistics_with_plugin+0x214><== NOT EXECUTED
3000ae50: e1a00008 mov r0, r8 <== NOT EXECUTED
3000ae54: e1a0e00f mov lr, pc <== NOT EXECUTED
3000ae58: e12fff15 bx r5 <== NOT EXECUTED
(*print)( context, "--- Wall times are in seconds ---\n" );
3000ae5c: e59f11e0 ldr r1, [pc, #480] ; 3000b044 <rtems_rate_monotonic_report_statistics_with_plugin+0x218><== NOT EXECUTED
3000ae60: e1a00008 mov r0, r8 <== NOT EXECUTED
3000ae64: e1a0e00f mov lr, pc <== NOT EXECUTED
3000ae68: e12fff15 bx r5 <== NOT EXECUTED
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000ae6c: e59f61d4 ldr r6, [pc, #468] ; 3000b048 <rtems_rate_monotonic_report_statistics_with_plugin+0x21c><== NOT EXECUTED
Be sure to test the various cases.
(*print)( context,"\
1234567890123456789012345678901234567890123456789012345678901234567890123456789\
\n");
*/
(*print)( context, " ID OWNER COUNT MISSED "
3000ae70: e59f11d4 ldr r1, [pc, #468] ; 3000b04c <rtems_rate_monotonic_report_statistics_with_plugin+0x220><== NOT EXECUTED
3000ae74: e1a00008 mov r0, r8 <== NOT EXECUTED
3000ae78: e1a0e00f mov lr, pc <== NOT EXECUTED
3000ae7c: e12fff15 bx r5 <== NOT EXECUTED
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
" "
#endif
" WALL TIME\n"
);
(*print)( context, " "
3000ae80: e1a00008 mov r0, r8 <== NOT EXECUTED
3000ae84: e59f11c4 ldr r1, [pc, #452] ; 3000b050 <rtems_rate_monotonic_report_statistics_with_plugin+0x224><== NOT EXECUTED
3000ae88: e1a0e00f mov lr, pc <== NOT EXECUTED
3000ae8c: e12fff15 bx r5 <== NOT EXECUTED
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000ae90: e5964008 ldr r4, [r6, #8] <== NOT EXECUTED
3000ae94: e596300c ldr r3, [r6, #12] <== NOT EXECUTED
3000ae98: e1540003 cmp r4, r3 <== NOT EXECUTED
3000ae9c: 8a00002f bhi 3000af60 <rtems_rate_monotonic_report_statistics_with_plugin+0x134><== NOT EXECUTED
3000aea0: e28d7018 add r7, sp, #24 <== NOT EXECUTED
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
3000aea4: e2870018 add r0, r7, #24 <== NOT EXECUTED
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
3000aea8: e2871030 add r1, r7, #48 ; 0x30 <== NOT EXECUTED
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
(*print)( context,
3000aeac: e59fa1a0 ldr sl, [pc, #416] ; 3000b054 <rtems_rate_monotonic_report_statistics_with_plugin+0x228><== NOT EXECUTED
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
3000aeb0: e28d9070 add r9, sp, #112 ; 0x70 <== NOT EXECUTED
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
3000aeb4: e58d0010 str r0, [sp, #16] <== NOT EXECUTED
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
3000aeb8: e28db068 add fp, sp, #104 ; 0x68 <== NOT EXECUTED
{
#ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
3000aebc: e58d1014 str r1, [sp, #20] <== NOT EXECUTED
3000aec0: ea000003 b 3000aed4 <rtems_rate_monotonic_report_statistics_with_plugin+0xa8><== NOT EXECUTED
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000aec4: e596300c ldr r3, [r6, #12] <== NOT EXECUTED
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
3000aec8: e2844001 add r4, r4, #1 <== NOT EXECUTED
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000aecc: e1530004 cmp r3, r4 <== NOT EXECUTED
3000aed0: 3a000022 bcc 3000af60 <rtems_rate_monotonic_report_statistics_with_plugin+0x134><== NOT EXECUTED
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
status = rtems_rate_monotonic_get_statistics( id, &the_stats );
3000aed4: e1a00004 mov r0, r4 <== NOT EXECUTED
3000aed8: e1a01007 mov r1, r7 <== NOT EXECUTED
3000aedc: eb00170a bl 30010b0c <rtems_rate_monotonic_get_statistics> <== NOT EXECUTED
if ( status != RTEMS_SUCCESSFUL )
3000aee0: e3500000 cmp r0, #0 <== NOT EXECUTED
3000aee4: 1afffff6 bne 3000aec4 <rtems_rate_monotonic_report_statistics_with_plugin+0x98><== NOT EXECUTED
#if defined(RTEMS_DEBUG)
status = rtems_rate_monotonic_get_status( id, &the_status );
if ( status != RTEMS_SUCCESSFUL )
continue;
#else
(void) rtems_rate_monotonic_get_status( id, &the_status );
3000aee8: e28d1050 add r1, sp, #80 ; 0x50 <== NOT EXECUTED
3000aeec: e1a00004 mov r0, r4 <== NOT EXECUTED
3000aef0: eb001733 bl 30010bc4 <rtems_rate_monotonic_get_status> <== NOT EXECUTED
#endif
rtems_object_get_name( the_status.owner, sizeof(name), name );
3000aef4: e1a02009 mov r2, r9 <== NOT EXECUTED
3000aef8: e3a01005 mov r1, #5 <== NOT EXECUTED
3000aefc: e59d0050 ldr r0, [sp, #80] ; 0x50 <== NOT EXECUTED
3000af00: eb0000bd bl 3000b1fc <rtems_object_get_name> <== NOT EXECUTED
/*
* Print part of report line that is not dependent on granularity
*/
(*print)( context,
3000af04: e59d3018 ldr r3, [sp, #24] <== NOT EXECUTED
3000af08: e59f1148 ldr r1, [pc, #328] ; 3000b058 <rtems_rate_monotonic_report_statistics_with_plugin+0x22c><== NOT EXECUTED
3000af0c: e58d3000 str r3, [sp] <== NOT EXECUTED
3000af10: e59d301c ldr r3, [sp, #28] <== NOT EXECUTED
3000af14: e1a02004 mov r2, r4 <== NOT EXECUTED
3000af18: e58d3004 str r3, [sp, #4] <== NOT EXECUTED
3000af1c: e1a00008 mov r0, r8 <== NOT EXECUTED
3000af20: e1a03009 mov r3, r9 <== NOT EXECUTED
3000af24: e1a0e00f mov lr, pc <== NOT EXECUTED
3000af28: e12fff15 bx r5 <== NOT EXECUTED
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
3000af2c: e59d3018 ldr r3, [sp, #24] <== NOT EXECUTED
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
3000af30: e59d0010 ldr r0, [sp, #16] <== NOT EXECUTED
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
3000af34: e3530000 cmp r3, #0 <== NOT EXECUTED
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
3000af38: e1a0200b mov r2, fp <== NOT EXECUTED
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
(*print)( context, "\n" );
3000af3c: e59f1118 ldr r1, [pc, #280] ; 3000b05c <rtems_rate_monotonic_report_statistics_with_plugin+0x230><== NOT EXECUTED
);
/*
* If the count is zero, don't print statistics
*/
if (the_stats.count == 0) {
3000af40: 1a000008 bne 3000af68 <rtems_rate_monotonic_report_statistics_with_plugin+0x13c><== NOT EXECUTED
(*print)( context, "\n" );
3000af44: e1a00008 mov r0, r8 <== NOT EXECUTED
3000af48: e1a0e00f mov lr, pc <== NOT EXECUTED
3000af4c: e12fff15 bx r5 <== NOT EXECUTED
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000af50: e596300c ldr r3, [r6, #12] <== NOT EXECUTED
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
3000af54: e2844001 add r4, r4, #1 <== NOT EXECUTED
/*
* Cycle through all possible ids and try to report on each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000af58: e1530004 cmp r3, r4 <== NOT EXECUTED
3000af5c: 2affffdc bcs 3000aed4 <rtems_rate_monotonic_report_statistics_with_plugin+0xa8><== NOT EXECUTED
the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall
);
#endif
}
}
}
3000af60: e28dd078 add sp, sp, #120 ; 0x78 <== NOT EXECUTED
3000af64: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
struct timespec cpu_average;
struct timespec *min_cpu = &the_stats.min_cpu_time;
struct timespec *max_cpu = &the_stats.max_cpu_time;
struct timespec *total_cpu = &the_stats.total_cpu_time;
_Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average );
3000af68: e1a01003 mov r1, r3 <== NOT EXECUTED
3000af6c: eb000e15 bl 3000e7c8 <_Timespec_Divide_by_integer> <== NOT EXECUTED
(*print)( context,
3000af70: e59d102c ldr r1, [sp, #44] ; 0x2c <== NOT EXECUTED
3000af74: e59d2024 ldr r2, [sp, #36] ; 0x24 <== NOT EXECUTED
3000af78: e0c0e19a smull lr, r0, sl, r1 <== NOT EXECUTED
3000af7c: e59d3028 ldr r3, [sp, #40] ; 0x28 <== NOT EXECUTED
3000af80: e1a01fc1 asr r1, r1, #31 <== NOT EXECUTED
3000af84: e0611340 rsb r1, r1, r0, asr #6 <== NOT EXECUTED
3000af88: e58d3000 str r3, [sp] <== NOT EXECUTED
3000af8c: e58d1004 str r1, [sp, #4] <== NOT EXECUTED
3000af90: e0c3c29a smull ip, r3, sl, r2 <== NOT EXECUTED
3000af94: e1a01fc2 asr r1, r2, #31 <== NOT EXECUTED
3000af98: e59d2068 ldr r2, [sp, #104] ; 0x68 <== NOT EXECUTED
3000af9c: e0613343 rsb r3, r1, r3, asr #6 <== NOT EXECUTED
3000afa0: e58d2008 str r2, [sp, #8] <== NOT EXECUTED
3000afa4: e59d206c ldr r2, [sp, #108] ; 0x6c <== NOT EXECUTED
3000afa8: e0c1029a smull r0, r1, sl, r2 <== NOT EXECUTED
3000afac: e1a02fc2 asr r2, r2, #31 <== NOT EXECUTED
3000afb0: e0622341 rsb r2, r2, r1, asr #6 <== NOT EXECUTED
3000afb4: e58d200c str r2, [sp, #12] <== NOT EXECUTED
3000afb8: e59f10a0 ldr r1, [pc, #160] ; 3000b060 <rtems_rate_monotonic_report_statistics_with_plugin+0x234><== NOT EXECUTED
3000afbc: e59d2020 ldr r2, [sp, #32] <== NOT EXECUTED
3000afc0: e1a00008 mov r0, r8 <== NOT EXECUTED
3000afc4: e1a0e00f mov lr, pc <== NOT EXECUTED
3000afc8: e12fff15 bx r5 <== NOT EXECUTED
struct timespec wall_average;
struct timespec *min_wall = &the_stats.min_wall_time;
struct timespec *max_wall = &the_stats.max_wall_time;
struct timespec *total_wall = &the_stats.total_wall_time;
_Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average);
3000afcc: e59d1018 ldr r1, [sp, #24] <== NOT EXECUTED
3000afd0: e59d0014 ldr r0, [sp, #20] <== NOT EXECUTED
3000afd4: e1a0200b mov r2, fp <== NOT EXECUTED
3000afd8: eb000dfa bl 3000e7c8 <_Timespec_Divide_by_integer> <== NOT EXECUTED
(*print)( context,
3000afdc: e59d2040 ldr r2, [sp, #64] ; 0x40 <== NOT EXECUTED
3000afe0: e59d303c ldr r3, [sp, #60] ; 0x3c <== NOT EXECUTED
3000afe4: e58d2000 str r2, [sp] <== NOT EXECUTED
3000afe8: e59d2044 ldr r2, [sp, #68] ; 0x44 <== NOT EXECUTED
3000afec: e0c0139a smull r1, r0, sl, r3 <== NOT EXECUTED
3000aff0: e0c1c29a smull ip, r1, sl, r2 <== NOT EXECUTED
3000aff4: e1a02fc2 asr r2, r2, #31 <== NOT EXECUTED
3000aff8: e0622341 rsb r2, r2, r1, asr #6 <== NOT EXECUTED
3000affc: e58d2004 str r2, [sp, #4] <== NOT EXECUTED
3000b000: e59d2068 ldr r2, [sp, #104] ; 0x68 <== NOT EXECUTED
3000b004: e1a03fc3 asr r3, r3, #31 <== NOT EXECUTED
3000b008: e58d2008 str r2, [sp, #8] <== NOT EXECUTED
3000b00c: e59d206c ldr r2, [sp, #108] ; 0x6c <== NOT EXECUTED
3000b010: e0633340 rsb r3, r3, r0, asr #6 <== NOT EXECUTED
3000b014: e0cce29a smull lr, ip, sl, r2 <== NOT EXECUTED
3000b018: e1a02fc2 asr r2, r2, #31 <== NOT EXECUTED
3000b01c: e062234c rsb r2, r2, ip, asr #6 <== NOT EXECUTED
3000b020: e58d200c str r2, [sp, #12] <== NOT EXECUTED
3000b024: e59f1038 ldr r1, [pc, #56] ; 3000b064 <rtems_rate_monotonic_report_statistics_with_plugin+0x238><== NOT EXECUTED
3000b028: e1a00008 mov r0, r8 <== NOT EXECUTED
3000b02c: e59d2038 ldr r2, [sp, #56] ; 0x38 <== NOT EXECUTED
3000b030: e1a0e00f mov lr, pc <== NOT EXECUTED
3000b034: e12fff15 bx r5 <== NOT EXECUTED
3000b038: eaffffa1 b 3000aec4 <rtems_rate_monotonic_report_statistics_with_plugin+0x98><== NOT EXECUTED
3000b078 <rtems_rate_monotonic_reset_all_statistics>:
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
3000b078: e59f3040 ldr r3, [pc, #64] ; 3000b0c0 <rtems_rate_monotonic_reset_all_statistics+0x48><== NOT EXECUTED
/*
* rtems_rate_monotonic_reset_all_statistics
*/
void rtems_rate_monotonic_reset_all_statistics( void )
{
3000b07c: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
3000b080: e5932000 ldr r2, [r3] <== NOT EXECUTED
3000b084: e2822001 add r2, r2, #1 <== NOT EXECUTED
3000b088: e5832000 str r2, [r3] <== NOT EXECUTED
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000b08c: e59f5030 ldr r5, [pc, #48] ; 3000b0c4 <rtems_rate_monotonic_reset_all_statistics+0x4c><== NOT EXECUTED
3000b090: e5954008 ldr r4, [r5, #8] <== NOT EXECUTED
3000b094: e595300c ldr r3, [r5, #12] <== NOT EXECUTED
3000b098: e1540003 cmp r4, r3 <== NOT EXECUTED
3000b09c: 8a000005 bhi 3000b0b8 <rtems_rate_monotonic_reset_all_statistics+0x40><== NOT EXECUTED
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
(void) rtems_rate_monotonic_reset_statistics( id );
3000b0a0: e1a00004 mov r0, r4 <== NOT EXECUTED
3000b0a4: eb000007 bl 3000b0c8 <rtems_rate_monotonic_reset_statistics><== NOT EXECUTED
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000b0a8: e595300c ldr r3, [r5, #12] <== NOT EXECUTED
id <= _Rate_monotonic_Information.maximum_id ;
id++ ) {
3000b0ac: e2844001 add r4, r4, #1 <== NOT EXECUTED
/*
* Cycle through all possible ids and try to reset each one. If it
* is a period that is inactive, we just get an error back. No big deal.
*/
for ( id=_Rate_monotonic_Information.minimum_id ;
3000b0b0: e1530004 cmp r3, r4 <== NOT EXECUTED
3000b0b4: 2afffff9 bcs 3000b0a0 <rtems_rate_monotonic_reset_all_statistics+0x28><== NOT EXECUTED
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
}
3000b0b8: e8bd4030 pop {r4, r5, lr} <== NOT EXECUTED
}
/*
* Done so exit thread dispatching disabled critical section.
*/
_Thread_Enable_dispatch();
3000b0bc: ea000af8 b 3000dca4 <_Thread_Enable_dispatch> <== NOT EXECUTED
3000b0c8 <rtems_rate_monotonic_reset_statistics>:
*/
rtems_status_code rtems_rate_monotonic_reset_statistics(
rtems_id id
)
{
3000b0c8: e92d4010 push {r4, lr} <== NOT EXECUTED
3000b0cc: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3000b0d0: e1a01000 mov r1, r0 <== NOT EXECUTED
3000b0d4: e1a0200d mov r2, sp <== NOT EXECUTED
3000b0d8: e59f005c ldr r0, [pc, #92] ; 3000b13c <rtems_rate_monotonic_reset_statistics+0x74><== NOT EXECUTED
3000b0dc: eb0007a1 bl 3000cf68 <_Objects_Get> <== NOT EXECUTED
Objects_Locations location;
Rate_monotonic_Control *the_period;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
3000b0e0: e59d4000 ldr r4, [sp] <== NOT EXECUTED
3000b0e4: e3540000 cmp r4, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000b0e8: 13a00004 movne r0, #4 <== NOT EXECUTED
{
Objects_Locations location;
Rate_monotonic_Control *the_period;
the_period = _Rate_monotonic_Get( id, &location );
switch ( location ) {
3000b0ec: 1a000010 bne 3000b134 <rtems_rate_monotonic_reset_statistics+0x6c><== NOT EXECUTED
case OBJECTS_LOCAL:
_Rate_monotonic_Reset_statistics( the_period );
3000b0f0: e3e03102 mvn r3, #-2147483648 ; 0x80000000 <== NOT EXECUTED
3000b0f4: e5804054 str r4, [r0, #84] ; 0x54 <== NOT EXECUTED
3000b0f8: e5804058 str r4, [r0, #88] ; 0x58 <== NOT EXECUTED
3000b0fc: e5804064 str r4, [r0, #100] ; 0x64 <== NOT EXECUTED
3000b100: e5804068 str r4, [r0, #104] ; 0x68 <== NOT EXECUTED
3000b104: e580406c str r4, [r0, #108] ; 0x6c <== NOT EXECUTED
3000b108: e5804070 str r4, [r0, #112] ; 0x70 <== NOT EXECUTED
3000b10c: e580407c str r4, [r0, #124] ; 0x7c <== NOT EXECUTED
3000b110: e5804080 str r4, [r0, #128] ; 0x80 <== NOT EXECUTED
3000b114: e5804084 str r4, [r0, #132] ; 0x84 <== NOT EXECUTED
3000b118: e5804088 str r4, [r0, #136] ; 0x88 <== NOT EXECUTED
3000b11c: e580305c str r3, [r0, #92] ; 0x5c <== NOT EXECUTED
3000b120: e5803060 str r3, [r0, #96] ; 0x60 <== NOT EXECUTED
3000b124: e5803074 str r3, [r0, #116] ; 0x74 <== NOT EXECUTED
3000b128: e5803078 str r3, [r0, #120] ; 0x78 <== NOT EXECUTED
_Thread_Enable_dispatch();
3000b12c: eb000adc bl 3000dca4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000b130: e1a00004 mov r0, r4 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000b134: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000b138: e8bd8010 pop {r4, pc} <== NOT EXECUTED
3001899c <rtems_region_create>:
uintptr_t length,
uintptr_t page_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
3001899c: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
300189a0: e2509000 subs r9, r0, #0
uintptr_t length,
uintptr_t page_size,
rtems_attribute attribute_set,
rtems_id *id
)
{
300189a4: e24dd004 sub sp, sp, #4
300189a8: e1a05001 mov r5, r1
300189ac: e1a07002 mov r7, r2
300189b0: e1a06003 mov r6, r3
300189b4: e59db02c ldr fp, [sp, #44] ; 0x2c
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
300189b8: 03a05003 moveq r5, #3
)
{
rtems_status_code return_status;
Region_Control *the_region;
if ( !rtems_is_name_valid( name ) )
300189bc: 0a00001a beq 30018a2c <rtems_region_create+0x90>
return RTEMS_INVALID_NAME;
if ( !starting_address )
300189c0: e3550000 cmp r5, #0
300189c4: 0a000035 beq 30018aa0 <rtems_region_create+0x104>
return RTEMS_INVALID_ADDRESS;
if ( !id )
300189c8: e35b0000 cmp fp, #0
300189cc: 0a000033 beq 30018aa0 <rtems_region_create+0x104>
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
300189d0: e59f80d0 ldr r8, [pc, #208] ; 30018aa8 <rtems_region_create+0x10c>
* This function allocates a region control block from
* the inactive chain of free region control blocks.
*/
RTEMS_INLINE_ROUTINE Region_Control *_Region_Allocate( void )
{
return (Region_Control *) _Objects_Allocate( &_Region_Information );
300189d4: e59fa0d0 ldr sl, [pc, #208] ; 30018aac <rtems_region_create+0x110>
300189d8: e5980000 ldr r0, [r8]
300189dc: eb0009a1 bl 3001b068 <_API_Mutex_Lock>
300189e0: e1a0000a mov r0, sl
300189e4: eb000fcf bl 3001c928 <_Objects_Allocate>
the_region = _Region_Allocate();
if ( !the_region )
300189e8: e2504000 subs r4, r0, #0
return_status = RTEMS_TOO_MANY;
300189ec: 03a05005 moveq r5, #5
_RTEMS_Lock_allocator(); /* to prevent deletion */
the_region = _Region_Allocate();
if ( !the_region )
300189f0: 0a00000b beq 30018a24 <rtems_region_create+0x88>
return_status = RTEMS_TOO_MANY;
else {
the_region->maximum_segment_size = _Heap_Initialize(
300189f4: e2840068 add r0, r4, #104 ; 0x68
300189f8: e1a01005 mov r1, r5
300189fc: e1a02007 mov r2, r7
30018a00: e1a03006 mov r3, r6
30018a04: eb000ea5 bl 3001c4a0 <_Heap_Initialize>
&the_region->Memory, starting_address, length, page_size
);
if ( !the_region->maximum_segment_size ) {
30018a08: e3500000 cmp r0, #0
if ( !the_region )
return_status = RTEMS_TOO_MANY;
else {
the_region->maximum_segment_size = _Heap_Initialize(
30018a0c: e584005c str r0, [r4, #92] ; 0x5c
&the_region->Memory, starting_address, length, page_size
);
if ( !the_region->maximum_segment_size ) {
30018a10: 1a000008 bne 30018a38 <rtems_region_create+0x9c>
*/
RTEMS_INLINE_ROUTINE void _Region_Free (
Region_Control *the_region
)
{
_Objects_Free( &_Region_Information, &the_region->Object );
30018a14: e1a0000a mov r0, sl <== NOT EXECUTED
30018a18: e1a01004 mov r1, r4 <== NOT EXECUTED
30018a1c: eb00109b bl 3001cc90 <_Objects_Free> <== NOT EXECUTED
_Region_Free( the_region );
return_status = RTEMS_INVALID_SIZE;
30018a20: e3a05008 mov r5, #8 <== NOT EXECUTED
*id = the_region->Object.id;
return_status = RTEMS_SUCCESSFUL;
}
}
_RTEMS_Unlock_allocator();
30018a24: e5980000 ldr r0, [r8]
30018a28: eb0009aa bl 3001b0d8 <_API_Mutex_Unlock>
return return_status;
}
30018a2c: e1a00005 mov r0, r5
30018a30: e28dd004 add sp, sp, #4
30018a34: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
the_region->length = length;
the_region->page_size = page_size;
the_region->attribute_set = attribute_set;
the_region->number_of_used_blocks = 0;
_Thread_queue_Initialize(
30018a38: e59d3028 ldr r3, [sp, #40] ; 0x28
the_region->starting_address = starting_address;
the_region->length = length;
the_region->page_size = page_size;
the_region->attribute_set = attribute_set;
the_region->number_of_used_blocks = 0;
30018a3c: e3a0c000 mov ip, #0
_Thread_queue_Initialize(
30018a40: e3130004 tst r3, #4
return_status = RTEMS_INVALID_SIZE;
}
else {
the_region->starting_address = starting_address;
30018a44: e5845050 str r5, [r4, #80] ; 0x50
the_region->length = length;
the_region->page_size = page_size;
the_region->attribute_set = attribute_set;
30018a48: e5843060 str r3, [r4, #96] ; 0x60
the_region->number_of_used_blocks = 0;
30018a4c: e584c064 str ip, [r4, #100] ; 0x64
}
else {
the_region->starting_address = starting_address;
the_region->length = length;
30018a50: e5847054 str r7, [r4, #84] ; 0x54
the_region->page_size = page_size;
30018a54: e5846058 str r6, [r4, #88] ; 0x58
the_region->attribute_set = attribute_set;
the_region->number_of_used_blocks = 0;
_Thread_queue_Initialize(
30018a58: e2840010 add r0, r4, #16
30018a5c: 03a01000 moveq r1, #0
30018a60: 13a01001 movne r1, #1
30018a64: e3a02040 mov r2, #64 ; 0x40
30018a68: e3a03006 mov r3, #6
30018a6c: e58dc000 str ip, [sp]
30018a70: eb001606 bl 3001e290 <_Thread_queue_Initialize>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
30018a74: e5943008 ldr r3, [r4, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
30018a78: e59a201c ldr r2, [sl, #28]
&the_region->Object,
(Objects_Name) name
);
*id = the_region->Object.id;
return_status = RTEMS_SUCCESSFUL;
30018a7c: e59dc000 ldr ip, [sp]
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
30018a80: e1a01803 lsl r1, r3, #16
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
30018a84: e7824721 str r4, [r2, r1, lsr #14]
}
}
_RTEMS_Unlock_allocator();
30018a88: e5980000 ldr r0, [r8]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
30018a8c: e584900c str r9, [r4, #12]
&_Region_Information,
&the_region->Object,
(Objects_Name) name
);
*id = the_region->Object.id;
30018a90: e58b3000 str r3, [fp]
return_status = RTEMS_SUCCESSFUL;
30018a94: e1a0500c mov r5, ip
}
}
_RTEMS_Unlock_allocator();
30018a98: eb00098e bl 3001b0d8 <_API_Mutex_Unlock>
30018a9c: eaffffe2 b 30018a2c <rtems_region_create+0x90>
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
if ( !id )
return RTEMS_INVALID_ADDRESS;
30018aa0: e3a05009 mov r5, #9 <== NOT EXECUTED
30018aa4: eaffffe0 b 30018a2c <rtems_region_create+0x90> <== NOT EXECUTED
30018b34 <rtems_region_extend>:
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
uintptr_t length
)
{
30018b34: e92d41f0 push {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
bool extend_ok;
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
30018b38: e2518000 subs r8, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_region_extend(
rtems_id id,
void *starting_address,
uintptr_t length
)
{
30018b3c: e1a05000 mov r5, r0 <== NOT EXECUTED
30018b40: e24dd008 sub sp, sp, #8 <== NOT EXECUTED
30018b44: e1a07002 mov r7, r2 <== NOT EXECUTED
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
return RTEMS_INVALID_ADDRESS;
30018b48: 03a05009 moveq r5, #9 <== NOT EXECUTED
bool extend_ok;
Objects_Locations location;
rtems_status_code return_status;
Region_Control *the_region;
if ( !starting_address )
30018b4c: 0a00000d beq 30018b88 <rtems_region_extend+0x54> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
30018b50: e59f407c ldr r4, [pc, #124] ; 30018bd4 <rtems_region_extend+0xa0><== NOT EXECUTED
30018b54: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018b58: eb000942 bl 3001b068 <_API_Mutex_Lock> <== NOT EXECUTED
Objects_Id id,
Objects_Locations *location
)
{
return (Region_Control *)
_Objects_Get_no_protection( &_Region_Information, id, location );
30018b5c: e1a01005 mov r1, r5 <== NOT EXECUTED
30018b60: e59f0070 ldr r0, [pc, #112] ; 30018bd8 <rtems_region_extend+0xa4><== NOT EXECUTED
30018b64: e1a0200d mov r2, sp <== NOT EXECUTED
30018b68: eb00109f bl 3001cdec <_Objects_Get_no_protection> <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
30018b6c: e59d5000 ldr r5, [sp] <== NOT EXECUTED
30018b70: e1a06000 mov r6, r0 <== NOT EXECUTED
30018b74: e3550000 cmp r5, #0 <== NOT EXECUTED
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
30018b78: 13a05004 movne r5, #4 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator(); /* to prevent deletion */
the_region = _Region_Get( id, &location );
switch ( location ) {
30018b7c: 0a000004 beq 30018b94 <rtems_region_extend+0x60> <== NOT EXECUTED
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
30018b80: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018b84: eb000953 bl 3001b0d8 <_API_Mutex_Unlock> <== NOT EXECUTED
return return_status;
}
30018b88: e1a00005 mov r0, r5 <== NOT EXECUTED
30018b8c: e28dd008 add sp, sp, #8 <== NOT EXECUTED
30018b90: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
extend_ok = _Heap_Extend(
30018b94: e2800068 add r0, r0, #104 ; 0x68 <== NOT EXECUTED
30018b98: e1a01008 mov r1, r8 <== NOT EXECUTED
30018b9c: e1a02007 mov r2, r7 <== NOT EXECUTED
30018ba0: e28d3004 add r3, sp, #4 <== NOT EXECUTED
30018ba4: eb000c7d bl 3001bda0 <_Heap_Extend> <== NOT EXECUTED
starting_address,
length,
&amount_extended
);
if ( extend_ok ) {
30018ba8: e3500000 cmp r0, #0 <== NOT EXECUTED
the_region->length += amount_extended;
the_region->maximum_segment_size += amount_extended;
return_status = RTEMS_SUCCESSFUL;
} else {
return_status = RTEMS_INVALID_ADDRESS;
30018bac: 03a05009 moveq r5, #9 <== NOT EXECUTED
starting_address,
length,
&amount_extended
);
if ( extend_ok ) {
30018bb0: 0afffff2 beq 30018b80 <rtems_region_extend+0x4c> <== NOT EXECUTED
the_region->length += amount_extended;
30018bb4: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
30018bb8: e5962054 ldr r2, [r6, #84] ; 0x54 <== NOT EXECUTED
the_region->maximum_segment_size += amount_extended;
30018bbc: e596105c ldr r1, [r6, #92] ; 0x5c <== NOT EXECUTED
length,
&amount_extended
);
if ( extend_ok ) {
the_region->length += amount_extended;
30018bc0: e0822003 add r2, r2, r3 <== NOT EXECUTED
the_region->maximum_segment_size += amount_extended;
30018bc4: e0813003 add r3, r1, r3 <== NOT EXECUTED
length,
&amount_extended
);
if ( extend_ok ) {
the_region->length += amount_extended;
30018bc8: e5862054 str r2, [r6, #84] ; 0x54 <== NOT EXECUTED
the_region->maximum_segment_size += amount_extended;
30018bcc: e586305c str r3, [r6, #92] ; 0x5c <== NOT EXECUTED
30018bd0: eaffffea b 30018b80 <rtems_region_extend+0x4c> <== NOT EXECUTED
30018bdc <rtems_region_get_free_information>:
rtems_status_code rtems_region_get_free_information(
rtems_id id,
Heap_Information_block *the_info
)
{
30018bdc: e92d4070 push {r4, r5, r6, lr} <== NOT EXECUTED
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
30018be0: e2515000 subs r5, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_region_get_free_information(
rtems_id id,
Heap_Information_block *the_info
)
{
30018be4: e1a06000 mov r6, r0 <== NOT EXECUTED
30018be8: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
30018bec: 03a06009 moveq r6, #9 <== NOT EXECUTED
{
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
30018bf0: 0a00000c beq 30018c28 <rtems_region_get_free_information+0x4c><== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
30018bf4: e59f4054 ldr r4, [pc, #84] ; 30018c50 <rtems_region_get_free_information+0x74><== NOT EXECUTED
30018bf8: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018bfc: eb000919 bl 3001b068 <_API_Mutex_Lock> <== NOT EXECUTED
30018c00: e1a01006 mov r1, r6 <== NOT EXECUTED
30018c04: e59f0048 ldr r0, [pc, #72] ; 30018c54 <rtems_region_get_free_information+0x78><== NOT EXECUTED
30018c08: e1a0200d mov r2, sp <== NOT EXECUTED
30018c0c: eb001076 bl 3001cdec <_Objects_Get_no_protection> <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
30018c10: e59d6000 ldr r6, [sp] <== NOT EXECUTED
30018c14: e3560000 cmp r6, #0 <== NOT EXECUTED
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
30018c18: 13a06004 movne r6, #4 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
30018c1c: 0a000004 beq 30018c34 <rtems_region_get_free_information+0x58><== NOT EXECUTED
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
30018c20: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018c24: eb00092b bl 3001b0d8 <_API_Mutex_Unlock> <== NOT EXECUTED
return return_status;
}
30018c28: e1a00006 mov r0, r6 <== NOT EXECUTED
30018c2c: e28dd004 add sp, sp, #4 <== NOT EXECUTED
30018c30: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_info->Used.number = 0;
30018c34: e585600c str r6, [r5, #12] <== NOT EXECUTED
the_info->Used.total = 0;
30018c38: e5856014 str r6, [r5, #20] <== NOT EXECUTED
the_info->Used.largest = 0;
30018c3c: e5856010 str r6, [r5, #16] <== NOT EXECUTED
_Heap_Get_free_information( &the_region->Memory, &the_info->Free );
30018c40: e2800068 add r0, r0, #104 ; 0x68 <== NOT EXECUTED
30018c44: e1a01005 mov r1, r5 <== NOT EXECUTED
30018c48: eb000d73 bl 3001c21c <_Heap_Get_free_information> <== NOT EXECUTED
return_status = RTEMS_SUCCESSFUL;
break;
30018c4c: eafffff3 b 30018c20 <rtems_region_get_free_information+0x44><== NOT EXECUTED
30018c58 <rtems_region_get_information>:
rtems_status_code rtems_region_get_information(
rtems_id id,
Heap_Information_block *the_info
)
{
30018c58: e92d4070 push {r4, r5, r6, lr} <== NOT EXECUTED
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
30018c5c: e2515000 subs r5, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_region_get_information(
rtems_id id,
Heap_Information_block *the_info
)
{
30018c60: e1a06000 mov r6, r0 <== NOT EXECUTED
30018c64: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
30018c68: 03a06009 moveq r6, #9 <== NOT EXECUTED
{
Objects_Locations location;
rtems_status_code return_status;
register Region_Control *the_region;
if ( !the_info )
30018c6c: 0a00000c beq 30018ca4 <rtems_region_get_information+0x4c> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
30018c70: e59f4048 ldr r4, [pc, #72] ; 30018cc0 <rtems_region_get_information+0x68><== NOT EXECUTED
30018c74: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018c78: eb0008fa bl 3001b068 <_API_Mutex_Lock> <== NOT EXECUTED
30018c7c: e1a01006 mov r1, r6 <== NOT EXECUTED
30018c80: e59f003c ldr r0, [pc, #60] ; 30018cc4 <rtems_region_get_information+0x6c><== NOT EXECUTED
30018c84: e1a0200d mov r2, sp <== NOT EXECUTED
30018c88: eb001057 bl 3001cdec <_Objects_Get_no_protection> <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
30018c8c: e59d6000 ldr r6, [sp] <== NOT EXECUTED
30018c90: e3560000 cmp r6, #0 <== NOT EXECUTED
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
30018c94: 13a06004 movne r6, #4 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
30018c98: 0a000004 beq 30018cb0 <rtems_region_get_information+0x58> <== NOT EXECUTED
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
30018c9c: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018ca0: eb00090c bl 3001b0d8 <_API_Mutex_Unlock> <== NOT EXECUTED
return return_status;
}
30018ca4: e1a00006 mov r0, r6 <== NOT EXECUTED
30018ca8: e28dd004 add sp, sp, #4 <== NOT EXECUTED
30018cac: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
_Heap_Get_information( &the_region->Memory, the_info );
30018cb0: e2800068 add r0, r0, #104 ; 0x68 <== NOT EXECUTED
30018cb4: e1a01005 mov r1, r5 <== NOT EXECUTED
30018cb8: eb000d71 bl 3001c284 <_Heap_Get_information> <== NOT EXECUTED
return_status = RTEMS_SUCCESSFUL;
break;
30018cbc: eafffff6 b 30018c9c <rtems_region_get_information+0x44> <== NOT EXECUTED
30018e0c <rtems_region_get_segment_size>:
rtems_status_code rtems_region_get_segment_size(
rtems_id id,
void *segment,
uintptr_t *size
)
{
30018e0c: e92d40f0 push {r4, r5, r6, r7, lr} <== NOT EXECUTED
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
register Region_Control *the_region;
if ( !segment )
30018e10: e2516000 subs r6, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_region_get_segment_size(
rtems_id id,
void *segment,
uintptr_t *size
)
{
30018e14: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
30018e18: e1a07000 mov r7, r0 <== NOT EXECUTED
30018e1c: e1a05002 mov r5, r2 <== NOT EXECUTED
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
register Region_Control *the_region;
if ( !segment )
30018e20: 0a00001b beq 30018e94 <rtems_region_get_segment_size+0x88> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( !size )
30018e24: e3520000 cmp r2, #0 <== NOT EXECUTED
30018e28: 0a000019 beq 30018e94 <rtems_region_get_segment_size+0x88> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
30018e2c: e59f4068 ldr r4, [pc, #104] ; 30018e9c <rtems_region_get_segment_size+0x90><== NOT EXECUTED
30018e30: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018e34: eb00088b bl 3001b068 <_API_Mutex_Lock> <== NOT EXECUTED
30018e38: e59f0060 ldr r0, [pc, #96] ; 30018ea0 <rtems_region_get_segment_size+0x94><== NOT EXECUTED
30018e3c: e1a01007 mov r1, r7 <== NOT EXECUTED
30018e40: e1a0200d mov r2, sp <== NOT EXECUTED
30018e44: eb000fe8 bl 3001cdec <_Objects_Get_no_protection> <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
30018e48: e59d3000 ldr r3, [sp] <== NOT EXECUTED
30018e4c: e3530000 cmp r3, #0 <== NOT EXECUTED
30018e50: 0a000007 beq 30018e74 <rtems_region_get_segment_size+0x68> <== NOT EXECUTED
void *segment,
uintptr_t *size
)
{
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
30018e54: e3530001 cmp r3, #1 <== NOT EXECUTED
30018e58: 03a05004 moveq r5, #4 <== NOT EXECUTED
30018e5c: 13a05000 movne r5, #0 <== NOT EXECUTED
case OBJECTS_ERROR:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
30018e60: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018e64: eb00089b bl 3001b0d8 <_API_Mutex_Unlock> <== NOT EXECUTED
return return_status;
}
30018e68: e1a00005 mov r0, r5 <== NOT EXECUTED
30018e6c: e28dd004 add sp, sp, #4 <== NOT EXECUTED
30018e70: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Heap_Size_of_alloc_area( &the_region->Memory, segment, size ) )
30018e74: e1a02005 mov r2, r5 <== NOT EXECUTED
30018e78: e2800068 add r0, r0, #104 ; 0x68 <== NOT EXECUTED
30018e7c: e1a01006 mov r1, r6 <== NOT EXECUTED
30018e80: eb000e6f bl 3001c844 <_Heap_Size_of_alloc_area> <== NOT EXECUTED
void *segment,
uintptr_t *size
)
{
Objects_Locations location;
rtems_status_code return_status = RTEMS_SUCCESSFUL;
30018e84: e3500000 cmp r0, #0 <== NOT EXECUTED
30018e88: 03a05009 moveq r5, #9 <== NOT EXECUTED
30018e8c: 13a05000 movne r5, #0 <== NOT EXECUTED
30018e90: eafffff2 b 30018e60 <rtems_region_get_segment_size+0x54> <== NOT EXECUTED
if ( !segment )
return RTEMS_INVALID_ADDRESS;
if ( !size )
return RTEMS_INVALID_ADDRESS;
30018e94: e3a05009 mov r5, #9 <== NOT EXECUTED
30018e98: eafffff2 b 30018e68 <rtems_region_get_segment_size+0x5c> <== NOT EXECUTED
30018ed4 <rtems_region_resize_segment>:
rtems_id id,
void *segment,
uintptr_t size,
uintptr_t *old_size
)
{
30018ed4: e92d41f0 push {r4, r5, r6, r7, r8, lr} <== NOT EXECUTED
uintptr_t osize;
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
30018ed8: e2535000 subs r5, r3, #0 <== NOT EXECUTED
rtems_id id,
void *segment,
uintptr_t size,
uintptr_t *old_size
)
{
30018edc: e1a08000 mov r8, r0 <== NOT EXECUTED
30018ee0: e24dd010 sub sp, sp, #16 <== NOT EXECUTED
30018ee4: e1a07001 mov r7, r1 <== NOT EXECUTED
30018ee8: e1a06002 mov r6, r2 <== NOT EXECUTED
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
return RTEMS_INVALID_ADDRESS;
30018eec: 03a00009 moveq r0, #9 <== NOT EXECUTED
uintptr_t osize;
rtems_status_code return_status;
Heap_Resize_status status;
register Region_Control *the_region;
if ( !old_size )
30018ef0: 0a00000d beq 30018f2c <rtems_region_resize_segment+0x58> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
_RTEMS_Lock_allocator();
30018ef4: e59f408c ldr r4, [pc, #140] ; 30018f88 <rtems_region_resize_segment+0xb4><== NOT EXECUTED
30018ef8: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018efc: eb000859 bl 3001b068 <_API_Mutex_Lock> <== NOT EXECUTED
30018f00: e1a01008 mov r1, r8 <== NOT EXECUTED
30018f04: e59f0080 ldr r0, [pc, #128] ; 30018f8c <rtems_region_resize_segment+0xb8><== NOT EXECUTED
30018f08: e28d2008 add r2, sp, #8 <== NOT EXECUTED
30018f0c: eb000fb6 bl 3001cdec <_Objects_Get_no_protection> <== NOT EXECUTED
the_region = _Region_Get( id, &location );
switch ( location ) {
30018f10: e59d3008 ldr r3, [sp, #8] <== NOT EXECUTED
30018f14: e1a08000 mov r8, r0 <== NOT EXECUTED
30018f18: e3530000 cmp r3, #0 <== NOT EXECUTED
30018f1c: 0a000004 beq 30018f34 <rtems_region_resize_segment+0x60> <== NOT EXECUTED
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
30018f20: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018f24: eb00086b bl 3001b0d8 <_API_Mutex_Unlock> <== NOT EXECUTED
return return_status;
30018f28: e3a00004 mov r0, #4 <== NOT EXECUTED
}
30018f2c: e28dd010 add sp, sp, #16 <== NOT EXECUTED
30018f30: e8bd81f0 pop {r4, r5, r6, r7, r8, pc} <== NOT EXECUTED
case OBJECTS_LOCAL:
_Region_Debug_Walk( the_region, 7 );
status = _Heap_Resize_block(
30018f34: e28d300c add r3, sp, #12 <== NOT EXECUTED
30018f38: e58d3000 str r3, [sp] <== NOT EXECUTED
30018f3c: e1a02006 mov r2, r6 <== NOT EXECUTED
30018f40: e28d3004 add r3, sp, #4 <== NOT EXECUTED
30018f44: e2800068 add r0, r0, #104 ; 0x68 <== NOT EXECUTED
30018f48: e1a01007 mov r1, r7 <== NOT EXECUTED
30018f4c: eb000dee bl 3001c70c <_Heap_Resize_block> <== NOT EXECUTED
segment,
(uint32_t) size,
&osize,
&avail_size
);
*old_size = (uint32_t) osize;
30018f50: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
30018f54: e2506000 subs r6, r0, #0 <== NOT EXECUTED
segment,
(uint32_t) size,
&osize,
&avail_size
);
*old_size = (uint32_t) osize;
30018f58: e5853000 str r3, [r5] <== NOT EXECUTED
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
30018f5c: 1a000003 bne 30018f70 <rtems_region_resize_segment+0x9c> <== NOT EXECUTED
_Region_Process_queue( the_region ); /* unlocks allocator */
30018f60: e1a00008 mov r0, r8 <== NOT EXECUTED
30018f64: eb001f33 bl 30020c38 <_Region_Process_queue> <== NOT EXECUTED
else
_RTEMS_Unlock_allocator();
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
30018f68: e1a00006 mov r0, r6 <== NOT EXECUTED
30018f6c: eaffffee b 30018f2c <rtems_region_resize_segment+0x58> <== NOT EXECUTED
_Region_Debug_Walk( the_region, 8 );
if ( status == HEAP_RESIZE_SUCCESSFUL )
_Region_Process_queue( the_region ); /* unlocks allocator */
else
_RTEMS_Unlock_allocator();
30018f70: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018f74: eb000857 bl 3001b0d8 <_API_Mutex_Unlock> <== NOT EXECUTED
if (status == HEAP_RESIZE_SUCCESSFUL)
return RTEMS_SUCCESSFUL;
if (status == HEAP_RESIZE_UNSATISFIED)
return RTEMS_UNSATISFIED;
30018f78: e3560001 cmp r6, #1 <== NOT EXECUTED
30018f7c: 13a00009 movne r0, #9 <== NOT EXECUTED
30018f80: 03a0000d moveq r0, #13 <== NOT EXECUTED
30018f84: eaffffe8 b 30018f2c <rtems_region_resize_segment+0x58> <== NOT EXECUTED
30018f90 <rtems_region_return_segment>:
rtems_status_code rtems_region_return_segment(
rtems_id id,
void *segment
)
{
30018f90: e92d40f0 push {r4, r5, r6, r7, lr}
uint32_t size;
#endif
int status;
register Region_Control *the_region;
_RTEMS_Lock_allocator();
30018f94: e59f4078 ldr r4, [pc, #120] ; 30019014 <rtems_region_return_segment+0x84>
rtems_status_code rtems_region_return_segment(
rtems_id id,
void *segment
)
{
30018f98: e24dd004 sub sp, sp, #4
30018f9c: e1a06000 mov r6, r0
uint32_t size;
#endif
int status;
register Region_Control *the_region;
_RTEMS_Lock_allocator();
30018fa0: e5940000 ldr r0, [r4]
rtems_status_code rtems_region_return_segment(
rtems_id id,
void *segment
)
{
30018fa4: e1a05001 mov r5, r1
uint32_t size;
#endif
int status;
register Region_Control *the_region;
_RTEMS_Lock_allocator();
30018fa8: eb00082e bl 3001b068 <_API_Mutex_Lock>
30018fac: e1a01006 mov r1, r6
30018fb0: e59f0060 ldr r0, [pc, #96] ; 30019018 <rtems_region_return_segment+0x88>
30018fb4: e1a0200d mov r2, sp
30018fb8: eb000f8b bl 3001cdec <_Objects_Get_no_protection>
the_region = _Region_Get( id, &location );
switch ( location ) {
30018fbc: e59d6000 ldr r6, [sp]
30018fc0: e1a07000 mov r7, r0
30018fc4: e3560000 cmp r6, #0
break;
#endif
case OBJECTS_ERROR:
default:
return_status = RTEMS_INVALID_ID;
30018fc8: 13a06004 movne r6, #4
register Region_Control *the_region;
_RTEMS_Lock_allocator();
the_region = _Region_Get( id, &location );
switch ( location ) {
30018fcc: 1a000005 bne 30018fe8 <rtems_region_return_segment+0x58>
RTEMS_INLINE_ROUTINE bool _Region_Free_segment (
Region_Control *the_region,
void *the_segment
)
{
return _Heap_Free( &the_region->Memory, the_segment );
30018fd0: e2800068 add r0, r0, #104 ; 0x68
30018fd4: e1a01005 mov r1, r5
30018fd8: eb000c1d bl 3001c054 <_Heap_Free>
#endif
status = _Region_Free_segment( the_region, segment );
_Region_Debug_Walk( the_region, 4 );
if ( !status )
30018fdc: e3500000 cmp r0, #0
return_status = RTEMS_INVALID_ADDRESS;
30018fe0: 03a06009 moveq r6, #9
#endif
status = _Region_Free_segment( the_region, segment );
_Region_Debug_Walk( the_region, 4 );
if ( !status )
30018fe4: 1a000004 bne 30018ffc <rtems_region_return_segment+0x6c>
default:
return_status = RTEMS_INVALID_ID;
break;
}
_RTEMS_Unlock_allocator();
30018fe8: e5940000 ldr r0, [r4] <== NOT EXECUTED
30018fec: eb000839 bl 3001b0d8 <_API_Mutex_Unlock> <== NOT EXECUTED
return return_status;
}
30018ff0: e1a00006 mov r0, r6
30018ff4: e28dd004 add sp, sp, #4
30018ff8: e8bd80f0 pop {r4, r5, r6, r7, pc}
_Region_Debug_Walk( the_region, 4 );
if ( !status )
return_status = RTEMS_INVALID_ADDRESS;
else {
the_region->number_of_used_blocks -= 1;
30018ffc: e5973064 ldr r3, [r7, #100] ; 0x64
_Region_Process_queue(the_region); /* unlocks allocator */
30019000: e1a00007 mov r0, r7
_Region_Debug_Walk( the_region, 4 );
if ( !status )
return_status = RTEMS_INVALID_ADDRESS;
else {
the_region->number_of_used_blocks -= 1;
30019004: e2433001 sub r3, r3, #1
30019008: e5873064 str r3, [r7, #100] ; 0x64
_Region_Process_queue(the_region); /* unlocks allocator */
3001900c: eb001f09 bl 30020c38 <_Region_Process_queue>
return RTEMS_SUCCESSFUL;
30019010: eafffff6 b 30018ff0 <rtems_region_return_segment+0x60>
300098ec <rtems_semaphore_create>:
uint32_t count,
rtems_attribute attribute_set,
rtems_task_priority priority_ceiling,
rtems_id *id
)
{
300098ec: e92d41f0 push {r4, r5, r6, r7, r8, lr}
register Semaphore_Control *the_semaphore;
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
300098f0: e2505000 subs r5, r0, #0
uint32_t count,
rtems_attribute attribute_set,
rtems_task_priority priority_ceiling,
rtems_id *id
)
{
300098f4: e24dd020 sub sp, sp, #32
300098f8: e1a04001 mov r4, r1
300098fc: e59d6038 ldr r6, [sp, #56] ; 0x38
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
30009900: 03a00003 moveq r0, #3
register Semaphore_Control *the_semaphore;
CORE_mutex_Attributes the_mutex_attr;
CORE_semaphore_Attributes the_semaphore_attr;
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
30009904: 0a000008 beq 3000992c <rtems_semaphore_create+0x40>
return RTEMS_INVALID_NAME;
if ( !id )
30009908: e3560000 cmp r6, #0
return RTEMS_INVALID_ADDRESS;
3000990c: 03a00009 moveq r0, #9
CORE_mutex_Status mutex_status;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
30009910: 0a000005 beq 3000992c <rtems_semaphore_create+0x40>
return RTEMS_NOT_DEFINED;
} else
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
30009914: e21210c0 ands r1, r2, #192 ; 0xc0
30009918: 0a000037 beq 300099fc <rtems_semaphore_create+0x110>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_binary_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_BINARY_SEMAPHORE);
3000991c: e2028030 and r8, r2, #48 ; 0x30
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
30009920: e3580010 cmp r8, #16
30009924: 0a000002 beq 30009934 <rtems_semaphore_create+0x48>
}
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
30009928: e3a0000b mov r0, #11 <== NOT EXECUTED
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
3000992c: e28dd020 add sp, sp, #32
30009930: e8bd81f0 pop {r4, r5, r6, r7, r8, pc}
#endif
if ( _Attributes_Is_inherit_priority( attribute_set ) ||
_Attributes_Is_priority_ceiling( attribute_set ) ) {
if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) &&
30009934: e3120004 tst r2, #4
30009938: 0afffffa beq 30009928 <rtems_semaphore_create+0x3c>
_Attributes_Is_priority( attribute_set ) ) )
return RTEMS_NOT_DEFINED;
}
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
3000993c: e35100c0 cmp r1, #192 ; 0xc0
30009940: 0afffff8 beq 30009928 <rtems_semaphore_create+0x3c>
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
30009944: e3540001 cmp r4, #1
return RTEMS_INVALID_NUMBER;
30009948: 83a0000a movhi r0, #10
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
3000994c: 8afffff6 bhi 3000992c <rtems_semaphore_create+0x40>
rtems_fatal_error_occurred( 99 );
}
}
#endif
_Thread_Dispatch_disable_level += 1;
30009950: e59f1150 ldr r1, [pc, #336] ; 30009aa8 <rtems_semaphore_create+0x1bc>
30009954: e5910000 ldr r0, [r1]
30009958: e2800001 add r0, r0, #1
3000995c: e5810000 str r0, [r1]
* This function allocates a semaphore control block from
* the inactive chain of free semaphore control blocks.
*/
RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void )
{
return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information );
30009960: e59f0144 ldr r0, [pc, #324] ; 30009aac <rtems_semaphore_create+0x1c0>
30009964: e58d2004 str r2, [sp, #4]
30009968: e58d3000 str r3, [sp]
3000996c: eb000544 bl 3000ae84 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
30009970: e2507000 subs r7, r0, #0
30009974: e59d2004 ldr r2, [sp, #4]
30009978: e59d3000 ldr r3, [sp]
3000997c: 0a00002f beq 30009a40 <rtems_semaphore_create+0x154>
the_semaphore->attribute_set = attribute_set;
/*
* Initialize it as a counting semaphore.
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
30009980: e3580000 cmp r8, #0
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
#endif
the_semaphore->attribute_set = attribute_set;
30009984: e5872010 str r2, [r7, #16]
/*
* Initialize it as a counting semaphore.
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
30009988: 0a00001e beq 30009a08 <rtems_semaphore_create+0x11c>
} else {
/*
* It is either simple binary semaphore or a more powerful mutex
* style binary semaphore. This is the mutex style.
*/
if ( _Attributes_Is_priority( attribute_set ) )
3000998c: e2121004 ands r1, r2, #4
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
30009990: 13a01001 movne r1, #1
30009994: 158d1010 strne r1, [sp, #16]
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
30009998: 058d1010 streq r1, [sp, #16]
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
3000999c: e3580010 cmp r8, #16
300099a0: 0a000029 beq 30009a4c <rtems_semaphore_create+0x160>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
the_mutex_attr.only_owner_release = true;
}
}
} else /* must be simple binary semaphore */ {
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS;
300099a4: e3a03001 mov r3, #1
300099a8: e58d3008 str r3, [sp, #8]
the_mutex_attr.only_owner_release = false;
300099ac: e3a03000 mov r3, #0
300099b0: e5cd300c strb r3, [sp, #12]
}
mutex_status = _CORE_mutex_Initialize(
300099b4: e3540001 cmp r4, #1
300099b8: 13a02000 movne r2, #0
300099bc: 03a02001 moveq r2, #1
300099c0: e2870014 add r0, r7, #20
300099c4: e28d1008 add r1, sp, #8
300099c8: eb0002e2 bl 3000a558 <_CORE_mutex_Initialize>
&the_semaphore->Core_control.mutex,
&the_mutex_attr,
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
300099cc: e3500005 cmp r0, #5
300099d0: 0a00002e beq 30009a90 <rtems_semaphore_create+0x1a4>
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
300099d4: e59f20d0 ldr r2, [pc, #208] ; 30009aac <rtems_semaphore_create+0x1c0>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
300099d8: e5973008 ldr r3, [r7, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
300099dc: e592201c ldr r2, [r2, #28]
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
300099e0: e1a01803 lsl r1, r3, #16
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
300099e4: e7827721 str r7, [r2, r1, lsr #14]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
300099e8: e587500c str r5, [r7, #12]
&_Semaphore_Information,
&the_semaphore->Object,
(Objects_Name) name
);
*id = the_semaphore->Object.id;
300099ec: e5863000 str r3, [r6]
the_semaphore->Object.id,
name,
0 /* Not used */
);
#endif
_Thread_Enable_dispatch();
300099f0: eb0009a3 bl 3000c084 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
300099f4: e3a00000 mov r0, #0
300099f8: eaffffcb b 3000992c <rtems_semaphore_create+0x40>
if ( _Attributes_Is_inherit_priority( attribute_set ) &&
_Attributes_Is_priority_ceiling( attribute_set ) )
return RTEMS_NOT_DEFINED;
if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) )
300099fc: e2128030 ands r8, r2, #48 ; 0x30
30009a00: 1affffcf bne 30009944 <rtems_semaphore_create+0x58>
30009a04: eaffffd1 b 30009950 <rtems_semaphore_create+0x64>
/*
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
if ( _Attributes_Is_priority( attribute_set ) )
30009a08: e3120004 tst r2, #4
*/
if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
/*
* This effectively disables limit checking.
*/
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
30009a0c: e3e03000 mvn r3, #0
30009a10: e58d3018 str r3, [sp, #24]
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
30009a14: 13a03001 movne r3, #1
30009a18: 158d301c strne r3, [sp, #28]
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
_CORE_semaphore_Initialize(
30009a1c: e2870014 add r0, r7, #20
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
/*
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
30009a20: e3a03000 mov r3, #0
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
_CORE_semaphore_Initialize(
30009a24: e28d1018 add r1, sp, #24
30009a28: e1a02004 mov r2, r4
the_semaphore_attr.maximum_count = 0xFFFFFFFF;
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
else
the_semaphore_attr.discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
30009a2c: 058d801c streq r8, [sp, #28]
/*
* The following are just to make Purify happy.
*/
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
30009a30: e58d3008 str r3, [sp, #8]
the_mutex_attr.priority_ceiling = PRIORITY_MINIMUM;
30009a34: e58d3014 str r3, [sp, #20]
_CORE_semaphore_Initialize(
30009a38: eb000390 bl 3000a880 <_CORE_semaphore_Initialize>
30009a3c: eaffffe4 b 300099d4 <rtems_semaphore_create+0xe8>
_Thread_Disable_dispatch(); /* prevents deletion */
the_semaphore = _Semaphore_Allocate();
if ( !the_semaphore ) {
_Thread_Enable_dispatch();
30009a40: eb00098f bl 3000c084 <_Thread_Enable_dispatch>
return RTEMS_TOO_MANY;
30009a44: e3a00005 mov r0, #5
30009a48: eaffffb7 b 3000992c <rtems_semaphore_create+0x40>
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.only_owner_release = false;
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
30009a4c: e59d0010 ldr r0, [sp, #16]
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
30009a50: e3a01000 mov r1, #0
the_mutex_attr.only_owner_release = false;
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
30009a54: e3500001 cmp r0, #1
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY;
else
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
the_mutex_attr.priority_ceiling = priority_ceiling;
30009a58: e58d3014 str r3, [sp, #20]
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
30009a5c: e58d1008 str r1, [sp, #8]
the_mutex_attr.only_owner_release = false;
30009a60: e5cd100c strb r1, [sp, #12]
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
30009a64: 1affffd2 bne 300099b4 <rtems_semaphore_create+0xc8>
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
30009a68: e3120040 tst r2, #64 ; 0x40
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
30009a6c: 13a03002 movne r3, #2
30009a70: 158d3010 strne r3, [sp, #16]
the_mutex_attr.only_owner_release = true;
30009a74: 15cd000c strbne r0, [sp, #12]
the_mutex_attr.priority_ceiling = priority_ceiling;
the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
the_mutex_attr.only_owner_release = false;
if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
30009a78: 1affffcd bne 300099b4 <rtems_semaphore_create+0xc8>
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
the_mutex_attr.only_owner_release = true;
} else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) {
30009a7c: e3120080 tst r2, #128 ; 0x80
the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
30009a80: 13a03003 movne r3, #3
30009a84: 158d3010 strne r3, [sp, #16]
the_mutex_attr.only_owner_release = true;
30009a88: 15cd000c strbne r0, [sp, #12]
30009a8c: eaffffc8 b 300099b4 <rtems_semaphore_create+0xc8>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
30009a90: e59f0014 ldr r0, [pc, #20] ; 30009aac <rtems_semaphore_create+0x1c0>
30009a94: e1a01007 mov r1, r7
30009a98: eb0005d3 bl 3000b1ec <_Objects_Free>
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
);
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
_Semaphore_Free( the_semaphore );
_Thread_Enable_dispatch();
30009a9c: eb000978 bl 3000c084 <_Thread_Enable_dispatch>
return RTEMS_INVALID_PRIORITY;
30009aa0: e3a00013 mov r0, #19
30009aa4: eaffffa0 b 3000992c <rtems_semaphore_create+0x40>
30009ab0 <rtems_semaphore_delete>:
#endif
rtems_status_code rtems_semaphore_delete(
rtems_id id
)
{
30009ab0: e92d4010 push {r4, lr}
30009ab4: e24dd004 sub sp, sp, #4
30009ab8: e1a01000 mov r1, r0
Objects_Id id,
Objects_Locations *location
)
{
return (Semaphore_Control *)
_Objects_Get( &_Semaphore_Information, id, location );
30009abc: e1a0200d mov r2, sp
30009ac0: e59f0088 ldr r0, [pc, #136] ; 30009b50 <rtems_semaphore_delete+0xa0>
30009ac4: eb00061f bl 3000b348 <_Objects_Get>
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
30009ac8: e59d3000 ldr r3, [sp]
30009acc: e1a04000 mov r4, r0
30009ad0: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30009ad4: 13a00004 movne r0, #4
{
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
30009ad8: 1a000009 bne 30009b04 <rtems_semaphore_delete+0x54>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_counting_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_COUNTING_SEMAPHORE);
30009adc: e5941010 ldr r1, [r4, #16]
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
30009ae0: e2111030 ands r1, r1, #48 ; 0x30
30009ae4: 0a000015 beq 30009b40 <rtems_semaphore_delete+0x90>
if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) &&
30009ae8: e5943064 ldr r3, [r4, #100] ; 0x64
30009aec: e3530000 cmp r3, #0
30009af0: 1a000005 bne 30009b0c <rtems_semaphore_delete+0x5c>
30009af4: e3510020 cmp r1, #32
30009af8: 0a000003 beq 30009b0c <rtems_semaphore_delete+0x5c>
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
30009afc: eb000960 bl 3000c084 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_RESOURCE_IN_USE;
30009b00: e3a0000c mov r0, #12 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30009b04: e28dd004 add sp, sp, #4
30009b08: e8bd8010 pop {r4, pc}
!_Attributes_Is_simple_binary_semaphore(
the_semaphore->attribute_set ) ) {
_Thread_Enable_dispatch();
return RTEMS_RESOURCE_IN_USE;
}
_CORE_mutex_Flush(
30009b0c: e2840014 add r0, r4, #20
30009b10: e3a01000 mov r1, #0
30009b14: e3a02003 mov r2, #3
30009b18: eb00028d bl 3000a554 <_CORE_mutex_Flush>
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_WAS_DELETED
);
}
_Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
30009b1c: e1a01004 mov r1, r4
30009b20: e59f0028 ldr r0, [pc, #40] ; 30009b50 <rtems_semaphore_delete+0xa0>
30009b24: eb0004fb bl 3000af18 <_Objects_Close>
*/
RTEMS_INLINE_ROUTINE void _Semaphore_Free (
Semaphore_Control *the_semaphore
)
{
_Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
30009b28: e59f0020 ldr r0, [pc, #32] ; 30009b50 <rtems_semaphore_delete+0xa0>
30009b2c: e1a01004 mov r1, r4
30009b30: eb0005ad bl 3000b1ec <_Objects_Free>
0, /* Not used */
0 /* Not used */
);
}
#endif
_Thread_Enable_dispatch();
30009b34: eb000952 bl 3000c084 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
30009b38: e3a00000 mov r0, #0
30009b3c: eafffff0 b 30009b04 <rtems_semaphore_delete+0x54>
&the_semaphore->Core_control.mutex,
SEMAPHORE_MP_OBJECT_WAS_DELETED,
CORE_MUTEX_WAS_DELETED
);
} else {
_CORE_semaphore_Flush(
30009b40: e2840014 add r0, r4, #20
30009b44: e3a02002 mov r2, #2
30009b48: eb00034b bl 3000a87c <_CORE_semaphore_Flush>
30009b4c: eafffff2 b 30009b1c <rtems_semaphore_delete+0x6c>
3001308c <rtems_semaphore_flush>:
#endif
rtems_status_code rtems_semaphore_flush(
rtems_id id
)
{
3001308c: e52de004 push {lr} ; (str lr, [sp, #-4]!)
30013090: e24dd004 sub sp, sp, #4
30013094: e1a01000 mov r1, r0
30013098: e1a0200d mov r2, sp
3001309c: e59f004c ldr r0, [pc, #76] ; 300130f0 <rtems_semaphore_flush+0x64>
300130a0: ebffe650 bl 3000c9e8 <_Objects_Get>
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
300130a4: e59d3000 ldr r3, [sp]
300130a8: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
300130ac: 13a00004 movne r0, #4
{
register Semaphore_Control *the_semaphore;
Objects_Locations location;
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
300130b0: 1a000007 bne 300130d4 <rtems_semaphore_flush+0x48>
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_counting_semaphore(
rtems_attribute attribute_set
)
{
return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_COUNTING_SEMAPHORE);
300130b4: e5901010 ldr r1, [r0, #16]
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
300130b8: e2111030 ands r1, r1, #48 ; 0x30
300130bc: 1a000006 bne 300130dc <rtems_semaphore_flush+0x50>
&the_semaphore->Core_control.mutex,
SEND_OBJECT_WAS_DELETED,
CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT
);
} else {
_CORE_semaphore_Flush(
300130c0: e2800014 add r0, r0, #20 <== NOT EXECUTED
300130c4: e3a02001 mov r2, #1 <== NOT EXECUTED
300130c8: ebffe393 bl 3000bf1c <_CORE_semaphore_Flush> <== NOT EXECUTED
&the_semaphore->Core_control.semaphore,
SEND_OBJECT_WAS_DELETED,
CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT
);
}
_Thread_Enable_dispatch();
300130cc: ebffe99a bl 3000d73c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
300130d0: e3a00000 mov r0, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
300130d4: e28dd004 add sp, sp, #4
300130d8: e8bd8000 pop {pc}
the_semaphore = _Semaphore_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
_CORE_mutex_Flush(
300130dc: e2800014 add r0, r0, #20
300130e0: e1a01003 mov r1, r3
300130e4: e3a02001 mov r2, #1
300130e8: ebffe2c1 bl 3000bbf4 <_CORE_mutex_Flush>
300130ec: eafffff6 b 300130cc <rtems_semaphore_flush+0x40>
30009b54 <rtems_semaphore_obtain>:
rtems_status_code rtems_semaphore_obtain(
rtems_id id,
rtems_option option_set,
rtems_interval timeout
)
{
30009b54: e92d40f0 push {r4, r5, r6, r7, lr}
30009b58: e1a04000 mov r4, r0
30009b5c: e24dd00c sub sp, sp, #12
Objects_Locations *location,
ISR_Level *level
)
{
return (Semaphore_Control *)
_Objects_Get_isr_disable( &_Semaphore_Information, id, location, level );
30009b60: e28d3004 add r3, sp, #4
30009b64: e1a05001 mov r5, r1
30009b68: e1a06002 mov r6, r2
30009b6c: e59f00f4 ldr r0, [pc, #244] ; 30009c68 <rtems_semaphore_obtain+0x114>
30009b70: e1a01004 mov r1, r4
30009b74: e28d2008 add r2, sp, #8
30009b78: eb0005d6 bl 3000b2d8 <_Objects_Get_isr_disable>
register Semaphore_Control *the_semaphore;
Objects_Locations location;
ISR_Level level;
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
switch ( location ) {
30009b7c: e59d3008 ldr r3, [sp, #8]
30009b80: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30009b84: 13a00004 movne r0, #4
register Semaphore_Control *the_semaphore;
Objects_Locations location;
ISR_Level level;
the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level );
switch ( location ) {
30009b88: 1a00000e bne 30009bc8 <rtems_semaphore_obtain+0x74>
30009b8c: e5903010 ldr r3, [r0, #16]
case OBJECTS_LOCAL:
if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) {
30009b90: e2133030 ands r3, r3, #48 ; 0x30
30009b94: 0a00000d beq 30009bd0 <rtems_semaphore_obtain+0x7c>
_CORE_mutex_Seize(
30009b98: e59d3004 ldr r3, [sp, #4]
*/
RTEMS_INLINE_ROUTINE bool _Options_Is_no_wait (
rtems_option option_set
)
{
return (option_set & RTEMS_NO_WAIT) ? true : false;
30009b9c: e2052001 and r2, r5, #1
30009ba0: e58d3000 str r3, [sp]
30009ba4: e2800014 add r0, r0, #20
30009ba8: e1a03006 mov r3, r6
30009bac: e2222001 eor r2, r2, #1
30009bb0: e1a01004 mov r1, r4
30009bb4: eb0002b0 bl 3000a67c <_CORE_mutex_Seize>
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
_Thread_Executing->Wait.return_code );
30009bb8: e59f30ac ldr r3, [pc, #172] ; 30009c6c <rtems_semaphore_obtain+0x118>
30009bbc: e5933004 ldr r3, [r3, #4]
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
level
);
return _Semaphore_Translate_core_mutex_return_code(
30009bc0: e5930034 ldr r0, [r3, #52] ; 0x34
30009bc4: eb00004c bl 30009cfc <_Semaphore_Translate_core_mutex_return_code>
break;
}
return RTEMS_INVALID_ID;
}
30009bc8: e28dd00c add sp, sp, #12
30009bcc: e8bd80f0 pop {r4, r5, r6, r7, pc}
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
30009bd0: e59f7094 ldr r7, [pc, #148] ; 30009c6c <rtems_semaphore_obtain+0x118>
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
30009bd4: e590105c ldr r1, [r0, #92] ; 0x5c
{
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
30009bd8: e5972004 ldr r2, [r7, #4]
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
30009bdc: e3510000 cmp r1, #0
Thread_Control *executing;
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
30009be0: e5823034 str r3, [r2, #52] ; 0x34
if ( the_semaphore->count != 0 ) {
30009be4: 1a000009 bne 30009c10 <rtems_semaphore_obtain+0xbc>
the_semaphore->count -= 1;
_ISR_Enable( *level_p );
return;
}
if ( !wait ) {
30009be8: e3150001 tst r5, #1
30009bec: 0a00000c beq 30009c24 <rtems_semaphore_obtain+0xd0>
30009bf0: e59d3004 ldr r3, [sp, #4] <== NOT EXECUTED
30009bf4: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
_ISR_Enable( *level_p );
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
30009bf8: e3a03001 mov r3, #1 <== NOT EXECUTED
30009bfc: e5823034 str r3, [r2, #52] ; 0x34 <== NOT EXECUTED
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
_Thread_Executing->Wait.return_code );
30009c00: e5973004 ldr r3, [r7, #4]
id,
((_Options_Is_no_wait( option_set )) ? false : true),
timeout,
&level
);
return _Semaphore_Translate_core_semaphore_return_code(
30009c04: e5930034 ldr r0, [r3, #52] ; 0x34
30009c08: eb00003f bl 30009d0c <_Semaphore_Translate_core_semaphore_return_code>
30009c0c: eaffffed b 30009bc8 <rtems_semaphore_obtain+0x74>
/* disabled when you get here */
executing = _Thread_Executing;
executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
if ( the_semaphore->count != 0 ) {
the_semaphore->count -= 1;
30009c10: e2411001 sub r1, r1, #1
30009c14: e580105c str r1, [r0, #92] ; 0x5c
30009c18: e59d3004 ldr r3, [sp, #4]
30009c1c: e129f003 msr CPSR_fc, r3
30009c20: eafffff6 b 30009c00 <rtems_semaphore_obtain+0xac>
30009c24: e59f3044 ldr r3, [pc, #68] ; 30009c70 <rtems_semaphore_obtain+0x11c>
30009c28: e5931000 ldr r1, [r3]
30009c2c: e2811001 add r1, r1, #1
30009c30: e5831000 str r1, [r3]
RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
Thread_queue_Control *the_thread_queue
)
{
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED;
30009c34: e3a01001 mov r1, #1
return;
}
_Thread_Disable_dispatch();
_Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
executing->Wait.queue = &the_semaphore->Wait_queue;
30009c38: e2803014 add r3, r0, #20
30009c3c: e5801044 str r1, [r0, #68] ; 0x44
30009c40: e5823044 str r3, [r2, #68] ; 0x44
executing->Wait.id = id;
30009c44: e5824020 str r4, [r2, #32]
30009c48: e59d2004 ldr r2, [sp, #4]
30009c4c: e129f002 msr CPSR_fc, r2
_ISR_Enable( *level_p );
_Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout );
30009c50: e59f201c ldr r2, [pc, #28] ; 30009c74 <rtems_semaphore_obtain+0x120>
30009c54: e1a00003 mov r0, r3
30009c58: e1a01006 mov r1, r6
30009c5c: eb000a24 bl 3000c4f4 <_Thread_queue_Enqueue_with_handler>
_Thread_Enable_dispatch();
30009c60: eb000907 bl 3000c084 <_Thread_Enable_dispatch>
30009c64: eaffffe5 b 30009c00 <rtems_semaphore_obtain+0xac>
300194ec <rtems_signal_send>:
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
300194ec: e92d4010 push {r4, lr}
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
300194f0: e2514000 subs r4, r1, #0
rtems_status_code rtems_signal_send(
rtems_id id,
rtems_signal_set signal_set
)
{
300194f4: e24dd004 sub sp, sp, #4
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
300194f8: 03a0000a moveq r0, #10
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !signal_set )
300194fc: 1a000001 bne 30019508 <rtems_signal_send+0x1c>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
30019500: e28dd004 add sp, sp, #4
30019504: e8bd8010 pop {r4, pc}
ASR_Information *asr;
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
30019508: e1a0100d mov r1, sp
3001950c: eb00119e bl 3001db8c <_Thread_Get>
switch ( location ) {
30019510: e59d3000 ldr r3, [sp]
30019514: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30019518: 13a00004 movne r0, #4
if ( !signal_set )
return RTEMS_INVALID_NUMBER;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
3001951c: 1afffff7 bne 30019500 <rtems_signal_send+0x14>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
30019520: e59030f4 ldr r3, [r0, #244] ; 0xf4
asr = &api->Signal;
if ( ! _ASR_Is_null_handler( asr->handler ) ) {
30019524: e593200c ldr r2, [r3, #12]
30019528: e3520000 cmp r2, #0
3001952c: 0a00001c beq 300195a4 <rtems_signal_send+0xb8>
if ( asr->is_enabled ) {
30019530: e5d32008 ldrb r2, [r3, #8]
30019534: e3520000 cmp r2, #0
30019538: 0a00000f beq 3001957c <rtems_signal_send+0x90>
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001953c: e10f2000 mrs r2, CPSR
30019540: e3821080 orr r1, r2, #128 ; 0x80
30019544: e129f001 msr CPSR_fc, r1
)
{
ISR_Level _level;
_ISR_Disable( _level );
*signal_set |= signals;
30019548: e5931014 ldr r1, [r3, #20]
3001954c: e1814004 orr r4, r1, r4
30019550: e5834014 str r4, [r3, #20]
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30019554: e129f002 msr CPSR_fc, r2
_ASR_Post_signals( signal_set, &asr->signals_posted );
if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
30019558: e59f3050 ldr r3, [pc, #80] ; 300195b0 <rtems_signal_send+0xc4>
3001955c: e5932000 ldr r2, [r3]
30019560: e3520000 cmp r2, #0
30019564: 0a00000b beq 30019598 <rtems_signal_send+0xac>
30019568: e5932004 ldr r2, [r3, #4] <== NOT EXECUTED
3001956c: e1500002 cmp r0, r2 <== NOT EXECUTED
_Thread_Dispatch_necessary = true;
30019570: 03a02001 moveq r2, #1 <== NOT EXECUTED
30019574: 05c32010 strbeq r2, [r3, #16] <== NOT EXECUTED
30019578: ea000006 b 30019598 <rtems_signal_send+0xac> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001957c: e10f2000 mrs r2, CPSR <== NOT EXECUTED
30019580: e3821080 orr r1, r2, #128 ; 0x80 <== NOT EXECUTED
30019584: e129f001 msr CPSR_fc, r1 <== NOT EXECUTED
30019588: e5931018 ldr r1, [r3, #24] <== NOT EXECUTED
3001958c: e1814004 orr r4, r1, r4 <== NOT EXECUTED
30019590: e5834018 str r4, [r3, #24] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30019594: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
} else {
_ASR_Post_signals( signal_set, &asr->signals_pending );
}
_Thread_Enable_dispatch();
30019598: eb001172 bl 3001db68 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3001959c: e3a00000 mov r0, #0
300195a0: eaffffd6 b 30019500 <rtems_signal_send+0x14>
}
_Thread_Enable_dispatch();
300195a4: eb00116f bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_NOT_DEFINED;
300195a8: e3a0000b mov r0, #11 <== NOT EXECUTED
300195ac: eaffffd3 b 30019500 <rtems_signal_send+0x14> <== NOT EXECUTED
30009d20 <rtems_task_create>:
size_t stack_size,
rtems_mode initial_modes,
rtems_attribute attribute_set,
rtems_id *id
)
{
30009d20: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
30009d24: e24dd01c sub sp, sp, #28
30009d28: e59d9044 ldr r9, [sp, #68] ; 0x44
30009d2c: e1a04000 mov r4, r0
Priority_Control core_priority;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !id )
30009d30: e3590000 cmp r9, #0
size_t stack_size,
rtems_mode initial_modes,
rtems_attribute attribute_set,
rtems_id *id
)
{
30009d34: e1a0a001 mov sl, r1
30009d38: e1a06002 mov r6, r2
30009d3c: e1a05003 mov r5, r3
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !id )
return RTEMS_INVALID_ADDRESS;
30009d40: 03a00009 moveq r0, #9
Priority_Control core_priority;
RTEMS_API_Control *api;
ASR_Information *asr;
if ( !id )
30009d44: 0a000031 beq 30009e10 <rtems_task_create+0xf0>
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
30009d48: e3540000 cmp r4, #0
return RTEMS_INVALID_NAME;
30009d4c: 03a00003 moveq r0, #3
if ( !id )
return RTEMS_INVALID_ADDRESS;
if ( !rtems_is_name_valid( name ) )
30009d50: 0a00002e beq 30009e10 <rtems_task_create+0xf0>
/*
* Validate the RTEMS API priority and convert it to the core priority range.
*/
if ( !_Attributes_Is_system_task( the_attribute_set ) ) {
30009d54: e59d3040 ldr r3, [sp, #64] ; 0x40
30009d58: e3130902 tst r3, #32768 ; 0x8000
30009d5c: 1a000005 bne 30009d78 <rtems_task_create+0x58>
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
30009d60: e3510000 cmp r1, #0
30009d64: 0a00002b beq 30009e18 <rtems_task_create+0xf8>
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
30009d68: e59f30e0 ldr r3, [pc, #224] ; 30009e50 <rtems_task_create+0x130>
30009d6c: e5d33000 ldrb r3, [r3]
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
30009d70: e1510003 cmp r1, r3
30009d74: 8a000027 bhi 30009e18 <rtems_task_create+0xf8>
*/
/*
* Lock the allocator mutex for protection
*/
_RTEMS_Lock_allocator();
30009d78: e59fb0d4 ldr fp, [pc, #212] ; 30009e54 <rtems_task_create+0x134>
30009d7c: e59b0000 ldr r0, [fp]
30009d80: eb0001aa bl 3000a430 <_API_Mutex_Lock>
* This function allocates a task control block from
* the inactive chain of free task control blocks.
*/
RTEMS_INLINE_ROUTINE Thread_Control *_RTEMS_tasks_Allocate( void )
{
return (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information );
30009d84: e59f00cc ldr r0, [pc, #204] ; 30009e58 <rtems_task_create+0x138>
30009d88: eb00043d bl 3000ae84 <_Objects_Allocate>
* the event of an error.
*/
the_thread = _RTEMS_tasks_Allocate();
if ( !the_thread ) {
30009d8c: e2507000 subs r7, r0, #0
30009d90: 0a00002a beq 30009e40 <rtems_task_create+0x120>
/*
* Initialize the core thread for this task.
*/
status = _Thread_Initialize(
30009d94: e3150c01 tst r5, #256 ; 0x100
30009d98: 13a01000 movne r1, #0
30009d9c: 03a01001 moveq r1, #1
30009da0: e3150c02 tst r5, #512 ; 0x200
*/
RTEMS_INLINE_ROUTINE bool _Attributes_Is_floating_point(
rtems_attribute attribute_set
)
{
return ( attribute_set & RTEMS_FLOATING_POINT ) ? true : false;
30009da4: e3a08000 mov r8, #0
30009da8: 03a02000 moveq r2, #0
30009dac: 13a02001 movne r2, #1
*/
RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
Modes_Control mode_set
)
{
return ( mode_set & RTEMS_INTERRUPT_MASK );
30009db0: e2053080 and r3, r5, #128 ; 0x80
30009db4: e58d1008 str r1, [sp, #8]
30009db8: e58d200c str r2, [sp, #12]
30009dbc: e58d3014 str r3, [sp, #20]
30009dc0: e59f0090 ldr r0, [pc, #144] ; 30009e58 <rtems_task_create+0x138>
30009dc4: e1a01007 mov r1, r7
30009dc8: e1a02008 mov r2, r8
30009dcc: e1a03006 mov r3, r6
30009dd0: e88d0500 stm sp, {r8, sl}
30009dd4: e58d8010 str r8, [sp, #16]
30009dd8: e58d4018 str r4, [sp, #24]
30009ddc: eb0008d6 bl 3000c13c <_Thread_Initialize>
NULL, /* no budget algorithm callout */
_Modes_Get_interrupt_level(initial_modes),
(Objects_Name) name
);
if ( !status ) {
30009de0: e1500008 cmp r0, r8
30009de4: 0a00000d beq 30009e20 <rtems_task_create+0x100>
_RTEMS_Unlock_allocator();
return RTEMS_UNSATISFIED;
}
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
30009de8: e59720f4 ldr r2, [r7, #244] ; 0xf4
asr->is_enabled = _Modes_Is_asr_disabled(initial_modes) ? false : true;
*id = the_thread->Object.id;
30009dec: e5973008 ldr r3, [r7, #8]
* id - thread id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_task_create(
30009df0: e3150b01 tst r5, #1024 ; 0x400
30009df4: 13a01000 movne r1, #0
30009df8: 03a01001 moveq r1, #1
);
}
#endif
_RTEMS_Unlock_allocator();
30009dfc: e59b0000 ldr r0, [fp]
* id - thread id
* RTEMS_SUCCESSFUL - if successful
* error code - if unsuccessful
*/
rtems_status_code rtems_task_create(
30009e00: e5c21008 strb r1, [r2, #8]
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
asr->is_enabled = _Modes_Is_asr_disabled(initial_modes) ? false : true;
*id = the_thread->Object.id;
30009e04: e5893000 str r3, [r9]
);
}
#endif
_RTEMS_Unlock_allocator();
30009e08: eb0001a4 bl 3000a4a0 <_API_Mutex_Unlock>
return RTEMS_SUCCESSFUL;
30009e0c: e1a00008 mov r0, r8
}
30009e10: e28dd01c add sp, sp, #28
30009e14: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
* Validate the RTEMS API priority and convert it to the core priority range.
*/
if ( !_Attributes_Is_system_task( the_attribute_set ) ) {
if ( !_RTEMS_tasks_Priority_is_valid( initial_priority ) )
return RTEMS_INVALID_PRIORITY;
30009e18: e3a00013 mov r0, #19 <== NOT EXECUTED
30009e1c: eafffffb b 30009e10 <rtems_task_create+0xf0> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE void _RTEMS_tasks_Free (
Thread_Control *the_task
)
{
_Objects_Free(
30009e20: e5970008 ldr r0, [r7, #8]
30009e24: eb00050d bl 3000b260 <_Objects_Get_information_id>
30009e28: e1a01007 mov r1, r7
30009e2c: eb0004ee bl 3000b1ec <_Objects_Free>
#if defined(RTEMS_MULTIPROCESSING)
if ( is_global )
_Objects_MP_Free_global_object( the_global_object );
#endif
_RTEMS_tasks_Free( the_thread );
_RTEMS_Unlock_allocator();
30009e30: e59b0000 ldr r0, [fp]
30009e34: eb000199 bl 3000a4a0 <_API_Mutex_Unlock>
return RTEMS_UNSATISFIED;
30009e38: e3a0000d mov r0, #13
30009e3c: eafffff3 b 30009e10 <rtems_task_create+0xf0>
*/
the_thread = _RTEMS_tasks_Allocate();
if ( !the_thread ) {
_RTEMS_Unlock_allocator();
30009e40: e59b0000 ldr r0, [fp]
30009e44: eb000195 bl 3000a4a0 <_API_Mutex_Unlock>
return RTEMS_TOO_MANY;
30009e48: e3a00005 mov r0, #5
30009e4c: eaffffef b 30009e10 <rtems_task_create+0xf0>
30009e5c <rtems_task_delete>:
*/
rtems_status_code rtems_task_delete(
rtems_id id
)
{
30009e5c: e92d4070 push {r4, r5, r6, lr}
register Thread_Control *the_thread;
Objects_Locations location;
Objects_Information *the_information;
_RTEMS_Lock_allocator();
30009e60: e59f4070 ldr r4, [pc, #112] ; 30009ed8 <rtems_task_delete+0x7c>
*/
rtems_status_code rtems_task_delete(
rtems_id id
)
{
30009e64: e24dd004 sub sp, sp, #4
30009e68: e1a05000 mov r5, r0
register Thread_Control *the_thread;
Objects_Locations location;
Objects_Information *the_information;
_RTEMS_Lock_allocator();
30009e6c: e5940000 ldr r0, [r4]
30009e70: eb00016e bl 3000a430 <_API_Mutex_Lock>
the_thread = _Thread_Get( id, &location );
30009e74: e1a00005 mov r0, r5
30009e78: e1a0100d mov r1, sp
30009e7c: eb000889 bl 3000c0a8 <_Thread_Get>
switch ( location ) {
30009e80: e59d5000 ldr r5, [sp]
Objects_Locations location;
Objects_Information *the_information;
_RTEMS_Lock_allocator();
the_thread = _Thread_Get( id, &location );
30009e84: e1a06000 mov r6, r0
switch ( location ) {
30009e88: e3550000 cmp r5, #0
30009e8c: 1a00000d bne 30009ec8 <rtems_task_delete+0x6c>
case OBJECTS_LOCAL:
the_information = _Objects_Get_information_id( the_thread->Object.id );
30009e90: e5900008 ldr r0, [r0, #8]
30009e94: eb0004f1 bl 3000b260 <_Objects_Get_information_id>
0 /* Not used */
);
}
#endif
_Thread_Close( the_information, the_thread );
30009e98: e1a01006 mov r1, r6
30009e9c: eb0007ae bl 3000bd5c <_Thread_Close>
30009ea0: e5960008 ldr r0, [r6, #8]
30009ea4: eb0004ed bl 3000b260 <_Objects_Get_information_id>
30009ea8: e1a01006 mov r1, r6
30009eac: eb0004ce bl 3000b1ec <_Objects_Free>
_RTEMS_tasks_Free( the_thread );
_RTEMS_Unlock_allocator();
30009eb0: e5940000 ldr r0, [r4]
30009eb4: eb000179 bl 3000a4a0 <_API_Mutex_Unlock>
_Thread_Enable_dispatch();
30009eb8: eb000871 bl 3000c084 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
30009ebc: e1a00005 mov r0, r5
break;
}
_RTEMS_Unlock_allocator();
return RTEMS_INVALID_ID;
}
30009ec0: e28dd004 add sp, sp, #4
30009ec4: e8bd8070 pop {r4, r5, r6, pc}
case OBJECTS_ERROR:
break;
}
_RTEMS_Unlock_allocator();
30009ec8: e5940000 ldr r0, [r4] <== NOT EXECUTED
30009ecc: eb000173 bl 3000a4a0 <_API_Mutex_Unlock> <== NOT EXECUTED
return RTEMS_INVALID_ID;
30009ed0: e3a00004 mov r0, #4 <== NOT EXECUTED
30009ed4: eafffff9 b 30009ec0 <rtems_task_delete+0x64> <== NOT EXECUTED
3000c128 <rtems_task_get_note>:
rtems_status_code rtems_task_get_note(
rtems_id id,
uint32_t notepad,
uint32_t *note
)
{
3000c128: e92d4030 push {r4, r5, lr}
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
3000c12c: e59f30a8 ldr r3, [pc, #168] ; 3000c1dc <rtems_task_get_note+0xb4>
rtems_status_code rtems_task_get_note(
rtems_id id,
uint32_t notepad,
uint32_t *note
)
{
3000c130: e1a0c000 mov ip, r0
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
3000c134: e5d33004 ldrb r3, [r3, #4]
rtems_status_code rtems_task_get_note(
rtems_id id,
uint32_t notepad,
uint32_t *note
)
{
3000c138: e24dd008 sub sp, sp, #8
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
3000c13c: e3530000 cmp r3, #0
rtems_status_code rtems_task_get_note(
rtems_id id,
uint32_t notepad,
uint32_t *note
)
{
3000c140: e1a04001 mov r4, r1
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
3000c144: 03a00016 moveq r0, #22
{
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
3000c148: 0a000019 beq 3000c1b4 <rtems_task_get_note+0x8c>
return RTEMS_NOT_CONFIGURED;
if ( !note )
3000c14c: e3520000 cmp r2, #0
return RTEMS_INVALID_ADDRESS;
3000c150: 03a00009 moveq r0, #9
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
if ( !note )
3000c154: 0a000016 beq 3000c1b4 <rtems_task_get_note+0x8c>
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
3000c158: e351000f cmp r1, #15
return RTEMS_INVALID_NUMBER;
3000c15c: 83a0000a movhi r0, #10
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
3000c160: 8a000013 bhi 3000c1b4 <rtems_task_get_note+0x8c>
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
3000c164: e35c0000 cmp ip, #0
3000c168: 0a000013 beq 3000c1bc <rtems_task_get_note+0x94>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
3000c16c: e59f306c ldr r3, [pc, #108] ; 3000c1e0 <rtems_task_get_note+0xb8>
3000c170: e5933004 ldr r3, [r3, #4]
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
3000c174: e5931008 ldr r1, [r3, #8]
3000c178: e15c0001 cmp ip, r1
3000c17c: 0a000010 beq 3000c1c4 <rtems_task_get_note+0x9c>
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
3000c180: e28d1004 add r1, sp, #4
3000c184: e58d2000 str r2, [sp]
3000c188: eb00094a bl 3000e6b8 <_Thread_Get>
switch ( location ) {
3000c18c: e89d0024 ldm sp, {r2, r5}
3000c190: e3550000 cmp r5, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000c194: 13a00004 movne r0, #4
*note = api->Notepads[ notepad ];
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
switch ( location ) {
3000c198: 1a000005 bne 3000c1b4 <rtems_task_get_note+0x8c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
3000c19c: e59030f4 ldr r3, [r0, #244] ; 0xf4
3000c1a0: e2844008 add r4, r4, #8
3000c1a4: e7933104 ldr r3, [r3, r4, lsl #2]
3000c1a8: e5823000 str r3, [r2]
_Thread_Enable_dispatch();
3000c1ac: eb000938 bl 3000e694 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000c1b0: e1a00005 mov r0, r5
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000c1b4: e28dd008 add sp, sp, #8
3000c1b8: e8bd8030 pop {r4, r5, pc}
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
3000c1bc: e59f301c ldr r3, [pc, #28] ; 3000c1e0 <rtems_task_get_note+0xb8><== NOT EXECUTED
3000c1c0: e5933004 ldr r3, [r3, #4] <== NOT EXECUTED
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
3000c1c4: e59330f4 ldr r3, [r3, #244] ; 0xf4 <== NOT EXECUTED
3000c1c8: e2844008 add r4, r4, #8 <== NOT EXECUTED
3000c1cc: e7933104 ldr r3, [r3, r4, lsl #2] <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000c1d0: e3a00000 mov r0, #0 <== NOT EXECUTED
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
*note = api->Notepads[ notepad ];
3000c1d4: e5823000 str r3, [r2] <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000c1d8: eafffff5 b 3000c1b4 <rtems_task_get_note+0x8c> <== NOT EXECUTED
30009edc <rtems_task_ident>:
rtems_id *id
)
{
Objects_Name_or_id_lookup_errors status;
if ( !id )
30009edc: e2523000 subs r3, r2, #0
rtems_status_code rtems_task_ident(
rtems_name name,
uint32_t node,
rtems_id *id
)
{
30009ee0: e52de004 push {lr} ; (str lr, [sp, #-4]!)
30009ee4: e1a0c000 mov ip, r0
30009ee8: e1a02001 mov r2, r1
Objects_Name_or_id_lookup_errors status;
if ( !id )
30009eec: 0a00000c beq 30009f24 <rtems_task_ident+0x48>
return RTEMS_INVALID_ADDRESS;
if ( name == OBJECTS_ID_OF_SELF ) {
30009ef0: e3500000 cmp r0, #0
30009ef4: 1a000004 bne 30009f0c <rtems_task_ident+0x30>
*id = _Thread_Executing->Object.id;
30009ef8: e59f202c ldr r2, [pc, #44] ; 30009f2c <rtems_task_ident+0x50><== NOT EXECUTED
30009efc: e5922004 ldr r2, [r2, #4] <== NOT EXECUTED
30009f00: e5922008 ldr r2, [r2, #8] <== NOT EXECUTED
30009f04: e5832000 str r2, [r3] <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30009f08: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
}
status = _Objects_Name_to_id_u32( &_RTEMS_tasks_Information, name, node, id );
30009f0c: e59f001c ldr r0, [pc, #28] ; 30009f30 <rtems_task_ident+0x54>
30009f10: e1a0100c mov r1, ip
30009f14: eb00055f bl 3000b498 <_Objects_Name_to_id_u32>
return _Status_Object_name_errors_to_status[ status ];
30009f18: e59f3014 ldr r3, [pc, #20] ; 30009f34 <rtems_task_ident+0x58>
30009f1c: e7930100 ldr r0, [r3, r0, lsl #2]
30009f20: e49df004 pop {pc} ; (ldr pc, [sp], #4)
)
{
Objects_Name_or_id_lookup_errors status;
if ( !id )
return RTEMS_INVALID_ADDRESS;
30009f24: e3a00009 mov r0, #9 <== NOT EXECUTED
}
status = _Objects_Name_to_id_u32( &_RTEMS_tasks_Information, name, node, id );
return _Status_Object_name_errors_to_status[ status ];
}
30009f28: e49df004 pop {pc} ; (ldr pc, [sp], #4) <== NOT EXECUTED
30019918 <rtems_task_is_suspended>:
*/
rtems_status_code rtems_task_is_suspended(
rtems_id id
)
{
30019918: e92d4010 push {r4, lr} <== NOT EXECUTED
3001991c: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
30019920: e1a0100d mov r1, sp <== NOT EXECUTED
30019924: eb001098 bl 3001db8c <_Thread_Get> <== NOT EXECUTED
switch ( location ) {
30019928: e59d3000 ldr r3, [sp] <== NOT EXECUTED
3001992c: e3530000 cmp r3, #0 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30019930: 13a00004 movne r0, #4 <== NOT EXECUTED
{
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
30019934: 1a000004 bne 3001994c <rtems_task_is_suspended+0x34> <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _States_Is_suspended (
States_Control the_states
)
{
return (the_states & STATES_SUSPENDED);
30019938: e5904010 ldr r4, [r0, #16] <== NOT EXECUTED
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
3001993c: e2144002 ands r4, r4, #2 <== NOT EXECUTED
30019940: 0a000003 beq 30019954 <rtems_task_is_suspended+0x3c> <== NOT EXECUTED
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
30019944: eb001087 bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_ALREADY_SUSPENDED;
30019948: e3a0000f mov r0, #15 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3001994c: e28dd004 add sp, sp, #4 <== NOT EXECUTED
30019950: e8bd8010 pop {r4, pc} <== NOT EXECUTED
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
_Thread_Enable_dispatch();
30019954: eb001083 bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
30019958: e1a00004 mov r0, r4 <== NOT EXECUTED
3001995c: eafffffa b 3001994c <rtems_task_is_suspended+0x34> <== NOT EXECUTED
30010ca8 <rtems_task_mode>:
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
30010ca8: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
30010cac: e2525000 subs r5, r2, #0
rtems_status_code rtems_task_mode(
rtems_mode mode_set,
rtems_mode mask,
rtems_mode *previous_mode_set
)
{
30010cb0: e1a04000 mov r4, r0
30010cb4: e1a06001 mov r6, r1
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
30010cb8: 03a00009 moveq r0, #9
ASR_Information *asr;
bool is_asr_enabled = false;
bool needs_asr_dispatching = false;
rtems_mode old_mode;
if ( !previous_mode_set )
30010cbc: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
30010cc0: e59f9148 ldr r9, [pc, #328] ; 30010e10 <rtems_task_mode+0x168>
30010cc4: e5997004 ldr r7, [r9, #4]
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
30010cc8: e5d7a074 ldrb sl, [r7, #116] ; 0x74
if ( !previous_mode_set )
return RTEMS_INVALID_ADDRESS;
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
30010ccc: e59780f4 ldr r8, [r7, #244] ; 0xf4
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
30010cd0: e597307c ldr r3, [r7, #124] ; 0x7c
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
30010cd4: e35a0000 cmp sl, #0
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
30010cd8: e5d8b008 ldrb fp, [r8, #8]
executing = _Thread_Executing;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
asr = &api->Signal;
old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT;
30010cdc: 03a0ac01 moveq sl, #256 ; 0x100
30010ce0: 13a0a000 movne sl, #0
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
30010ce4: e3530000 cmp r3, #0
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
30010ce8: 138aac02 orrne sl, sl, #512 ; 0x200
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
30010cec: e35b0000 cmp fp, #0
30010cf0: 03a0bb01 moveq fp, #1024 ; 0x400
30010cf4: 13a0b000 movne fp, #0
old_mode |= _ISR_Get_level();
30010cf8: ebfff232 bl 3000d5c8 <_CPU_ISR_Get_level>
if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
old_mode |= RTEMS_NO_TIMESLICE;
else
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
30010cfc: e18bb000 orr fp, fp, r0
old_mode |= _ISR_Get_level();
30010d00: e18ba00a orr sl, fp, sl
*previous_mode_set = old_mode;
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
30010d04: e3160c01 tst r6, #256 ; 0x100
old_mode |= RTEMS_TIMESLICE;
old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR;
old_mode |= _ISR_Get_level();
*previous_mode_set = old_mode;
30010d08: e585a000 str sl, [r5]
/*
* These are generic thread scheduling characteristics.
*/
if ( mask & RTEMS_PREEMPT_MASK )
30010d0c: 0a000003 beq 30010d20 <rtems_task_mode+0x78>
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
30010d10: e3140c01 tst r4, #256 ; 0x100
30010d14: 13a03000 movne r3, #0
30010d18: 03a03001 moveq r3, #1
30010d1c: e5c73074 strb r3, [r7, #116] ; 0x74
if ( mask & RTEMS_TIMESLICE_MASK ) {
30010d20: e3160c02 tst r6, #512 ; 0x200
30010d24: 1a000028 bne 30010dcc <rtems_task_mode+0x124>
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
30010d28: e3160080 tst r6, #128 ; 0x80
30010d2c: 1a00002f bne 30010df0 <rtems_task_mode+0x148>
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
30010d30: e2166b01 ands r6, r6, #1024 ; 0x400
30010d34: 0a000012 beq 30010d84 <rtems_task_mode+0xdc>
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
30010d38: e3140b01 tst r4, #1024 ; 0x400
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
30010d3c: e5d82008 ldrb r2, [r8, #8]
* Output:
* *previous_mode_set - previous mode set
* always return RTEMS_SUCCESSFUL;
*/
rtems_status_code rtems_task_mode(
30010d40: 13a03000 movne r3, #0
30010d44: 03a03001 moveq r3, #1
is_asr_enabled = false;
needs_asr_dispatching = false;
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
30010d48: e1520003 cmp r2, r3
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
30010d4c: 03a06000 moveq r6, #0
if ( mask & RTEMS_ASR_MASK ) {
is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true;
if ( is_asr_enabled != asr->is_enabled ) {
30010d50: 0a00000b beq 30010d84 <rtems_task_mode+0xdc>
asr->is_enabled = is_asr_enabled;
30010d54: e5c83008 strb r3, [r8, #8]
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
30010d58: e10f3000 mrs r3, CPSR
30010d5c: e3832080 orr r2, r3, #128 ; 0x80
30010d60: e129f002 msr CPSR_fc, r2
{
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
_signals = information->signals_pending;
30010d64: e5981018 ldr r1, [r8, #24]
information->signals_pending = information->signals_posted;
30010d68: e5982014 ldr r2, [r8, #20]
information->signals_posted = _signals;
30010d6c: e5881014 str r1, [r8, #20]
rtems_signal_set _signals;
ISR_Level _level;
_ISR_Disable( _level );
_signals = information->signals_pending;
information->signals_pending = information->signals_posted;
30010d70: e5882018 str r2, [r8, #24]
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
30010d74: e129f003 msr CPSR_fc, r3
_ASR_Swap_signals( asr );
if ( _ASR_Are_signals_pending( asr ) ) {
30010d78: e5986014 ldr r6, [r8, #20]
30010d7c: e3560000 cmp r6, #0
/*
* This is specific to the RTEMS API
*/
is_asr_enabled = false;
needs_asr_dispatching = false;
30010d80: 13a06001 movne r6, #1
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
30010d84: e59f3088 ldr r3, [pc, #136] ; 30010e14 <rtems_task_mode+0x16c>
30010d88: e5933000 ldr r3, [r3]
30010d8c: e3530003 cmp r3, #3
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
30010d90: 13a00000 movne r0, #0
needs_asr_dispatching = true;
}
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
30010d94: 18bd8ff0 popne {r4, r5, r6, r7, r8, r9, sl, fp, pc}
{
Thread_Control *executing;
executing = _Thread_Executing;
if ( are_signals_pending ||
30010d98: e3560000 cmp r6, #0
bool are_signals_pending
)
{
Thread_Control *executing;
executing = _Thread_Executing;
30010d9c: e5993004 ldr r3, [r9, #4]
if ( are_signals_pending ||
30010da0: 1a000015 bne 30010dfc <rtems_task_mode+0x154>
30010da4: e59f2064 ldr r2, [pc, #100] ; 30010e10 <rtems_task_mode+0x168>
30010da8: e5922008 ldr r2, [r2, #8]
30010dac: e1530002 cmp r3, r2
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
}
return RTEMS_SUCCESSFUL;
30010db0: 01a00006 moveq r0, r6
30010db4: 08bd8ff0 popeq {r4, r5, r6, r7, r8, r9, sl, fp, pc}
(!_Thread_Is_heir( executing ) && executing->is_preemptible) ) {
30010db8: e5d33074 ldrb r3, [r3, #116] ; 0x74
30010dbc: e3530000 cmp r3, #0
30010dc0: 1a00000d bne 30010dfc <rtems_task_mode+0x154>
30010dc4: e1a00006 mov r0, r6 <== NOT EXECUTED
}
30010dc8: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
*/
if ( mask & RTEMS_PREEMPT_MASK )
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
30010dcc: e2143c02 ands r3, r4, #512 ; 0x200
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
30010dd0: 159f3040 ldrne r3, [pc, #64] ; 30010e18 <rtems_task_mode+0x170>
if ( mask & RTEMS_PREEMPT_MASK )
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
30010dd4: 13a02001 movne r2, #1
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
30010dd8: 15933000 ldrne r3, [r3]
if ( mask & RTEMS_PREEMPT_MASK )
executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false;
if ( mask & RTEMS_TIMESLICE_MASK ) {
if ( _Modes_Is_timeslice(mode_set) ) {
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
30010ddc: 1587207c strne r2, [r7, #124] ; 0x7c
executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
30010de0: 15873078 strne r3, [r7, #120] ; 0x78
} else
executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
30010de4: 0587307c streq r3, [r7, #124] ; 0x7c
}
/*
* Set the new interrupt level
*/
if ( mask & RTEMS_INTERRUPT_MASK )
30010de8: e3160080 tst r6, #128 ; 0x80
30010dec: 0affffcf beq 30010d30 <rtems_task_mode+0x88>
*/
RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
Modes_Control mode_set
)
{
_ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
30010df0: e2040080 and r0, r4, #128 ; 0x80
30010df4: ebfff1ee bl 3000d5b4 <_CPU_ISR_Set_level>
30010df8: eaffffcc b 30010d30 <rtems_task_mode+0x88>
_Thread_Dispatch_necessary = true;
30010dfc: e3a03001 mov r3, #1
30010e00: e5c93010 strb r3, [r9, #16]
}
}
if ( _System_state_Is_up( _System_state_Get() ) ) {
if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) )
_Thread_Dispatch();
30010e04: ebffec48 bl 3000bf2c <_Thread_Dispatch>
}
return RTEMS_SUCCESSFUL;
30010e08: e3a00000 mov r0, #0
30010e0c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
3000ac40 <rtems_task_restart>:
rtems_status_code rtems_task_restart(
rtems_id id,
uint32_t argument
)
{
3000ac40: e92d4030 push {r4, r5, lr}
3000ac44: e24dd004 sub sp, sp, #4
3000ac48: e1a05001 mov r5, r1
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
3000ac4c: e1a0100d mov r1, sp
3000ac50: eb000859 bl 3000cdbc <_Thread_Get>
switch ( location ) {
3000ac54: e59d4000 ldr r4, [sp]
3000ac58: e3540000 cmp r4, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000ac5c: 13a00004 movne r0, #4
{
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
3000ac60: 1a000006 bne 3000ac80 <rtems_task_restart+0x40>
case OBJECTS_LOCAL:
if ( _Thread_Restart( the_thread, NULL, argument ) ) {
3000ac64: e1a01004 mov r1, r4
3000ac68: e1a02005 mov r2, r5
3000ac6c: eb000a5a bl 3000d5dc <_Thread_Restart>
3000ac70: e3500000 cmp r0, #0
3000ac74: 1a000003 bne 3000ac88 <rtems_task_restart+0x48>
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
3000ac78: eb000846 bl 3000cd98 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
3000ac7c: e3a0000e mov r0, #14 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000ac80: e28dd004 add sp, sp, #4
3000ac84: e8bd8030 pop {r4, r5, pc}
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Restart( the_thread, NULL, argument ) ) {
_Thread_Enable_dispatch();
3000ac88: eb000842 bl 3000cd98 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000ac8c: e1a00004 mov r0, r4
3000ac90: eafffffa b 3000ac80 <rtems_task_restart+0x40>
3000d68c <rtems_task_resume>:
*/
rtems_status_code rtems_task_resume(
rtems_id id
)
{
3000d68c: e92d4010 push {r4, lr}
3000d690: e24dd004 sub sp, sp, #4
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
3000d694: e1a0100d mov r1, sp
3000d698: eb000871 bl 3000f864 <_Thread_Get>
switch ( location ) {
3000d69c: e59d4000 ldr r4, [sp]
)
{
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
3000d6a0: e1a03000 mov r3, r0
switch ( location ) {
3000d6a4: e3540000 cmp r4, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000d6a8: 13a00004 movne r0, #4
{
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
3000d6ac: 1a000004 bne 3000d6c4 <rtems_task_resume+0x38>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_suspended (
States_Control the_states
)
{
return (the_states & STATES_SUSPENDED);
3000d6b0: e5933010 ldr r3, [r3, #16]
case OBJECTS_LOCAL:
if ( _States_Is_suspended( the_thread->current_state ) ) {
3000d6b4: e3130002 tst r3, #2
3000d6b8: 1a000003 bne 3000d6cc <rtems_task_resume+0x40>
_Thread_Resume( the_thread, true );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
3000d6bc: eb00085f bl 3000f840 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
3000d6c0: e3a0000e mov r0, #14 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000d6c4: e28dd004 add sp, sp, #4
3000d6c8: e8bd8010 pop {r4, pc}
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( _States_Is_suspended( the_thread->current_state ) ) {
_Thread_Resume( the_thread, true );
3000d6cc: e3a01001 mov r1, #1
3000d6d0: eb000a6b bl 30010084 <_Thread_Resume>
_Thread_Enable_dispatch();
3000d6d4: eb000859 bl 3000f840 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000d6d8: e1a00004 mov r0, r4
3000d6dc: eafffff8 b 3000d6c4 <rtems_task_resume+0x38>
3000c2dc <rtems_task_set_note>:
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
3000c2dc: e92d4030 push {r4, r5, lr}
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
3000c2e0: e59f3094 ldr r3, [pc, #148] ; 3000c37c <rtems_task_set_note+0xa0>
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
3000c2e4: e1a0c000 mov ip, r0
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
3000c2e8: e5d33004 ldrb r3, [r3, #4]
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
3000c2ec: e24dd008 sub sp, sp, #8
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
3000c2f0: e3530000 cmp r3, #0
rtems_status_code rtems_task_set_note(
rtems_id id,
uint32_t notepad,
uint32_t note
)
{
3000c2f4: e1a04001 mov r4, r1
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
return RTEMS_NOT_CONFIGURED;
3000c2f8: 03a00016 moveq r0, #22
{
register Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
if ( !rtems_configuration_get_notepads_enabled() )
3000c2fc: 0a000015 beq 3000c358 <rtems_task_set_note+0x7c>
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
3000c300: e351000f cmp r1, #15
return RTEMS_INVALID_NUMBER;
3000c304: 83a0000a movhi r0, #10
/*
* NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would
* be checking an unsigned number for being negative.
*/
if ( notepad > RTEMS_NOTEPAD_LAST )
3000c308: 8a000012 bhi 3000c358 <rtems_task_set_note+0x7c>
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
3000c30c: e35c0000 cmp ip, #0
3000c310: 0a000012 beq 3000c360 <rtems_task_set_note+0x84>
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
3000c314: e59f3064 ldr r3, [pc, #100] ; 3000c380 <rtems_task_set_note+0xa4>
3000c318: e5933004 ldr r3, [r3, #4]
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
3000c31c: e5931008 ldr r1, [r3, #8]
3000c320: e15c0001 cmp ip, r1
3000c324: 0a00000f beq 3000c368 <rtems_task_set_note+0x8c>
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
3000c328: e28d1004 add r1, sp, #4
3000c32c: e58d2000 str r2, [sp]
3000c330: eb0008e0 bl 3000e6b8 <_Thread_Get>
switch ( location ) {
3000c334: e89d0024 ldm sp, {r2, r5}
3000c338: e3550000 cmp r5, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000c33c: 13a00004 movne r0, #4
api->Notepads[ notepad ] = note;
return RTEMS_SUCCESSFUL;
}
the_thread = _Thread_Get( id, &location );
switch ( location ) {
3000c340: 1a000004 bne 3000c358 <rtems_task_set_note+0x7c>
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
3000c344: e59030f4 ldr r3, [r0, #244] ; 0xf4
3000c348: e2844008 add r4, r4, #8
3000c34c: e7832104 str r2, [r3, r4, lsl #2]
_Thread_Enable_dispatch();
3000c350: eb0008cf bl 3000e694 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000c354: e1a00005 mov r0, r5
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000c358: e28dd008 add sp, sp, #8
3000c35c: e8bd8030 pop {r4, r5, pc}
/*
* Optimize the most likely case to avoid the Thread_Dispatch.
*/
if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
3000c360: e59f3018 ldr r3, [pc, #24] ; 3000c380 <rtems_task_set_note+0xa4><== NOT EXECUTED
3000c364: e5933004 ldr r3, [r3, #4] <== NOT EXECUTED
_Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ];
api->Notepads[ notepad ] = note;
3000c368: e59330f4 ldr r3, [r3, #244] ; 0xf4 <== NOT EXECUTED
3000c36c: e2844008 add r4, r4, #8 <== NOT EXECUTED
3000c370: e7832104 str r2, [r3, r4, lsl #2] <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000c374: e3a00000 mov r0, #0 <== NOT EXECUTED
3000c378: eafffff6 b 3000c358 <rtems_task_set_note+0x7c> <== NOT EXECUTED
3000e550 <rtems_task_set_priority>:
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
3000e550: e92d4030 push {r4, r5, lr}
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
3000e554: e2514000 subs r4, r1, #0
rtems_status_code rtems_task_set_priority(
rtems_id id,
rtems_task_priority new_priority,
rtems_task_priority *old_priority
)
{
3000e558: e24dd004 sub sp, sp, #4
3000e55c: e1a05002 mov r5, r2
register Thread_Control *the_thread;
Objects_Locations location;
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
3000e560: 0a000004 beq 3000e578 <rtems_task_set_priority+0x28>
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
3000e564: e59f3078 ldr r3, [pc, #120] ; 3000e5e4 <rtems_task_set_priority+0x94>
3000e568: e5d33000 ldrb r3, [r3]
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
3000e56c: e1540003 cmp r4, r3
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
3000e570: 83a00013 movhi r0, #19
3000e574: 8a000018 bhi 3000e5dc <rtems_task_set_priority+0x8c>
if ( !old_priority )
3000e578: e3550000 cmp r5, #0
return RTEMS_INVALID_ADDRESS;
3000e57c: 03a00009 moveq r0, #9
if ( new_priority != RTEMS_CURRENT_PRIORITY &&
!_RTEMS_tasks_Priority_is_valid( new_priority ) )
return RTEMS_INVALID_PRIORITY;
if ( !old_priority )
3000e580: 0a000015 beq 3000e5dc <rtems_task_set_priority+0x8c>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
3000e584: e1a0100d mov r1, sp
3000e588: eb0008cc bl 300108c0 <_Thread_Get>
switch ( location ) {
3000e58c: e59d3000 ldr r3, [sp]
3000e590: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000e594: 13a00004 movne r0, #4
if ( !old_priority )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
3000e598: 1a00000f bne 3000e5dc <rtems_task_set_priority+0x8c>
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
3000e59c: e5903014 ldr r3, [r0, #20]
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
3000e5a0: e3540000 cmp r4, #0
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
3000e5a4: e5853000 str r3, [r5]
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
3000e5a8: 0a000009 beq 3000e5d4 <rtems_task_set_priority+0x84>
the_thread->real_priority = new_priority;
if ( the_thread->resource_count == 0 ||
3000e5ac: e590301c ldr r3, [r0, #28]
case OBJECTS_LOCAL:
/* XXX need helper to "convert" from core priority */
*old_priority = the_thread->current_priority;
if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
the_thread->real_priority = new_priority;
3000e5b0: e5804018 str r4, [r0, #24]
if ( the_thread->resource_count == 0 ||
3000e5b4: e3530000 cmp r3, #0
3000e5b8: 0a000002 beq 3000e5c8 <rtems_task_set_priority+0x78>
3000e5bc: e5903014 ldr r3, [r0, #20] <== NOT EXECUTED
3000e5c0: e1540003 cmp r4, r3 <== NOT EXECUTED
3000e5c4: 2a000002 bcs 3000e5d4 <rtems_task_set_priority+0x84> <== NOT EXECUTED
the_thread->current_priority > new_priority )
_Thread_Change_priority( the_thread, new_priority, false );
3000e5c8: e1a01004 mov r1, r4
3000e5cc: e3a02000 mov r2, #0
3000e5d0: eb000794 bl 30010428 <_Thread_Change_priority>
}
_Thread_Enable_dispatch();
3000e5d4: eb0008b0 bl 3001089c <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000e5d8: e3a00000 mov r0, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000e5dc: e28dd004 add sp, sp, #4
3000e5e0: e8bd8030 pop {r4, r5, pc}
30009fc8 <rtems_task_start>:
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
30009fc8: e92d4070 push {r4, r5, r6, lr}
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
30009fcc: e2515000 subs r5, r1, #0
rtems_status_code rtems_task_start(
rtems_id id,
rtems_task_entry entry_point,
rtems_task_argument argument
)
{
30009fd0: e24dd008 sub sp, sp, #8
30009fd4: e1a06002 mov r6, r2
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
30009fd8: 03a00009 moveq r0, #9
)
{
register Thread_Control *the_thread;
Objects_Locations location;
if ( entry_point == NULL )
30009fdc: 0a00000e beq 3000a01c <rtems_task_start+0x54>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
30009fe0: e28d1004 add r1, sp, #4
30009fe4: eb00082f bl 3000c0a8 <_Thread_Get>
switch ( location ) {
30009fe8: e59d4004 ldr r4, [sp, #4]
30009fec: e3540000 cmp r4, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
30009ff0: 13a00004 movne r0, #4
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
30009ff4: 1a000008 bne 3000a01c <rtems_task_start+0x54>
case OBJECTS_LOCAL:
if ( _Thread_Start(
30009ff8: e1a01004 mov r1, r4
30009ffc: e1a02005 mov r2, r5
3000a000: e1a03004 mov r3, r4
3000a004: e58d6000 str r6, [sp]
3000a008: eb000a8e bl 3000ca48 <_Thread_Start>
3000a00c: e3500000 cmp r0, #0
3000a010: 1a000003 bne 3000a024 <rtems_task_start+0x5c>
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
3000a014: eb00081a bl 3000c084 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
3000a018: e3a0000e mov r0, #14 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000a01c: e28dd008 add sp, sp, #8
3000a020: e8bd8070 pop {r4, r5, r6, pc}
switch ( location ) {
case OBJECTS_LOCAL:
if ( _Thread_Start(
the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
_Thread_Enable_dispatch();
3000a024: eb000816 bl 3000c084 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000a028: e1a00004 mov r0, r4
3000a02c: eafffffa b 3000a01c <rtems_task_start+0x54>
3000d930 <rtems_task_suspend>:
*/
rtems_status_code rtems_task_suspend(
rtems_id id
)
{
3000d930: e92d4010 push {r4, lr}
3000d934: e24dd004 sub sp, sp, #4
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
3000d938: e1a0100d mov r1, sp
3000d93c: eb00083d bl 3000fa38 <_Thread_Get>
switch ( location ) {
3000d940: e59d3000 ldr r3, [sp]
)
{
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
3000d944: e1a02000 mov r2, r0
switch ( location ) {
3000d948: e3530000 cmp r3, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000d94c: 13a00004 movne r0, #4
{
register Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
3000d950: 1a000004 bne 3000d968 <rtems_task_suspend+0x38>
*/
RTEMS_INLINE_ROUTINE bool _States_Is_suspended (
States_Control the_states
)
{
return (the_states & STATES_SUSPENDED);
3000d954: e5924010 ldr r4, [r2, #16]
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
3000d958: e2144002 ands r4, r4, #2
3000d95c: 0a000003 beq 3000d970 <rtems_task_suspend+0x40>
_Thread_Suspend( the_thread );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
_Thread_Enable_dispatch();
3000d960: eb00082b bl 3000fa14 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_ALREADY_SUSPENDED;
3000d964: e3a0000f mov r0, #15 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000d968: e28dd004 add sp, sp, #4
3000d96c: e8bd8010 pop {r4, pc}
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( !_States_Is_suspended( the_thread->current_state ) ) {
_Thread_Suspend( the_thread );
3000d970: eb000aab bl 30010424 <_Thread_Suspend>
_Thread_Enable_dispatch();
3000d974: eb000826 bl 3000fa14 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000d978: e1a00004 mov r0, r4
3000d97c: eafffff9 b 3000d968 <rtems_task_suspend+0x38>
3000addc <rtems_task_variable_add>:
rtems_status_code rtems_task_variable_add(
rtems_id tid,
void **ptr,
void (*dtor)(void *)
)
{
3000addc: e92d4070 push {r4, r5, r6, lr}
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
3000ade0: e2514000 subs r4, r1, #0
rtems_status_code rtems_task_variable_add(
rtems_id tid,
void **ptr,
void (*dtor)(void *)
)
{
3000ade4: e24dd004 sub sp, sp, #4
3000ade8: e1a05002 mov r5, r2
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
3000adec: 03a00009 moveq r0, #9
{
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *new;
if ( !ptr )
3000adf0: 0a000016 beq 3000ae50 <rtems_task_variable_add+0x74>
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
3000adf4: e1a0100d mov r1, sp
3000adf8: eb00087a bl 3000cfe8 <_Thread_Get>
switch (location) {
3000adfc: e59d3000 ldr r3, [sp]
rtems_task_variable_t *tvp, *new;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
3000ae00: e1a06000 mov r6, r0
switch (location) {
3000ae04: e3530000 cmp r3, #0
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000ae08: 13a00004 movne r0, #4
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
switch (location) {
3000ae0c: 1a00000f bne 3000ae50 <rtems_task_variable_add+0x74>
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
3000ae10: e5963100 ldr r3, [r6, #256] ; 0x100
while (tvp) {
3000ae14: e3530000 cmp r3, #0
3000ae18: 1a000011 bne 3000ae64 <rtems_task_variable_add+0x88>
/*
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
3000ae1c: e3a00014 mov r0, #20
3000ae20: eb000cbc bl 3000e118 <_Workspace_Allocate>
if (new == NULL) {
3000ae24: e3500000 cmp r0, #0
3000ae28: 0a000014 beq 3000ae80 <rtems_task_variable_add+0xa4>
_Thread_Enable_dispatch();
return RTEMS_NO_MEMORY;
}
new->gval = *ptr;
3000ae2c: e5942000 ldr r2, [r4]
new->ptr = ptr;
new->dtor = dtor;
new->next = (struct rtems_task_variable_tt *)the_thread->task_variables;
3000ae30: e5963100 ldr r3, [r6, #256] ; 0x100
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
return RTEMS_NO_MEMORY;
}
new->gval = *ptr;
3000ae34: e5802008 str r2, [r0, #8]
new->ptr = ptr;
3000ae38: e5804004 str r4, [r0, #4]
new->dtor = dtor;
3000ae3c: e5805010 str r5, [r0, #16]
new->next = (struct rtems_task_variable_tt *)the_thread->task_variables;
3000ae40: e5803000 str r3, [r0]
the_thread->task_variables = new;
3000ae44: e5860100 str r0, [r6, #256] ; 0x100
_Thread_Enable_dispatch();
3000ae48: eb00085d bl 3000cfc4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000ae4c: e3a00000 mov r0, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000ae50: e28dd004 add sp, sp, #4
3000ae54: e8bd8070 pop {r4, r5, r6, pc}
if (tvp->ptr == ptr) {
tvp->dtor = dtor;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
3000ae58: e5933000 ldr r3, [r3] <== NOT EXECUTED
case OBJECTS_LOCAL:
/*
* Figure out if the variable is already in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
3000ae5c: e3530000 cmp r3, #0 <== NOT EXECUTED
3000ae60: 0affffed beq 3000ae1c <rtems_task_variable_add+0x40> <== NOT EXECUTED
if (tvp->ptr == ptr) {
3000ae64: e5932004 ldr r2, [r3, #4] <== NOT EXECUTED
3000ae68: e1520004 cmp r2, r4 <== NOT EXECUTED
3000ae6c: 1afffff9 bne 3000ae58 <rtems_task_variable_add+0x7c> <== NOT EXECUTED
tvp->dtor = dtor;
3000ae70: e5835010 str r5, [r3, #16] <== NOT EXECUTED
_Thread_Enable_dispatch();
3000ae74: eb000852 bl 3000cfc4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000ae78: e3a00000 mov r0, #0 <== NOT EXECUTED
3000ae7c: eafffff3 b 3000ae50 <rtems_task_variable_add+0x74> <== NOT EXECUTED
* Now allocate memory for this task variable.
*/
new = (rtems_task_variable_t *)
_Workspace_Allocate(sizeof(rtems_task_variable_t));
if (new == NULL) {
_Thread_Enable_dispatch();
3000ae80: eb00084f bl 3000cfc4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_NO_MEMORY;
3000ae84: e3a0001a mov r0, #26 <== NOT EXECUTED
3000ae88: eafffff0 b 3000ae50 <rtems_task_variable_add+0x74> <== NOT EXECUTED
3000ae8c <rtems_task_variable_delete>:
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
3000ae8c: e92d4010 push {r4, lr} <== NOT EXECUTED
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
3000ae90: e2514000 subs r4, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_task_variable_delete(
rtems_id tid,
void **ptr
)
{
3000ae94: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
3000ae98: 03a00009 moveq r0, #9 <== NOT EXECUTED
{
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp, *prev;
if ( !ptr )
3000ae9c: 0a000015 beq 3000aef8 <rtems_task_variable_delete+0x6c> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
3000aea0: e1a0100d mov r1, sp <== NOT EXECUTED
3000aea4: eb00084f bl 3000cfe8 <_Thread_Get> <== NOT EXECUTED
switch (location) {
3000aea8: e59d3000 ldr r3, [sp] <== NOT EXECUTED
3000aeac: e3530000 cmp r3, #0 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000aeb0: 13a00004 movne r0, #4 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
prev = NULL;
the_thread = _Thread_Get (tid, &location);
switch (location) {
3000aeb4: 1a00000f bne 3000aef8 <rtems_task_variable_delete+0x6c> <== NOT EXECUTED
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
3000aeb8: e5903100 ldr r3, [r0, #256] ; 0x100 <== NOT EXECUTED
while (tvp) {
3000aebc: e3530000 cmp r3, #0 <== NOT EXECUTED
3000aec0: 0a00000a beq 3000aef0 <rtems_task_variable_delete+0x64> <== NOT EXECUTED
if (tvp->ptr == ptr) {
3000aec4: e5932004 ldr r2, [r3, #4] <== NOT EXECUTED
3000aec8: e1520004 cmp r2, r4 <== NOT EXECUTED
3000aecc: 1a000004 bne 3000aee4 <rtems_task_variable_delete+0x58> <== NOT EXECUTED
3000aed0: ea000010 b 3000af18 <rtems_task_variable_delete+0x8c> <== NOT EXECUTED
3000aed4: e5912004 ldr r2, [r1, #4] <== NOT EXECUTED
3000aed8: e1520004 cmp r2, r4 <== NOT EXECUTED
3000aedc: 0a000007 beq 3000af00 <rtems_task_variable_delete+0x74> <== NOT EXECUTED
3000aee0: e1a03001 mov r3, r1 <== NOT EXECUTED
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
3000aee4: e5931000 ldr r1, [r3] <== NOT EXECUTED
the_thread = _Thread_Get (tid, &location);
switch (location) {
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
3000aee8: e3510000 cmp r1, #0 <== NOT EXECUTED
3000aeec: 1afffff8 bne 3000aed4 <rtems_task_variable_delete+0x48> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
}
prev = tvp;
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
3000aef0: eb000833 bl 3000cfc4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
3000aef4: e3a00009 mov r0, #9 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000aef8: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000aefc: e8bd8010 pop {r4, pc} <== NOT EXECUTED
case OBJECTS_LOCAL:
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
3000af00: e5912000 ldr r2, [r1] <== NOT EXECUTED
3000af04: e5832000 str r2, [r3] <== NOT EXECUTED
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
_RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp );
3000af08: eb000028 bl 3000afb0 <_RTEMS_Tasks_Invoke_task_variable_dtor><== NOT EXECUTED
_Thread_Enable_dispatch();
3000af0c: eb00082c bl 3000cfc4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000af10: e3a00000 mov r0, #0 <== NOT EXECUTED
3000af14: eafffff7 b 3000aef8 <rtems_task_variable_delete+0x6c> <== NOT EXECUTED
while (tvp) {
if (tvp->ptr == ptr) {
if (prev)
prev->next = tvp->next;
else
the_thread->task_variables = (rtems_task_variable_t *)tvp->next;
3000af18: e5932000 ldr r2, [r3] <== NOT EXECUTED
3000af1c: e1a01003 mov r1, r3 <== NOT EXECUTED
3000af20: e5802100 str r2, [r0, #256] ; 0x100 <== NOT EXECUTED
3000af24: eafffff7 b 3000af08 <rtems_task_variable_delete+0x7c> <== NOT EXECUTED
3000af28 <rtems_task_variable_get>:
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
3000af28: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
3000af2c: e2514000 subs r4, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_task_variable_get(
rtems_id tid,
void **ptr,
void **result
)
{
3000af30: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3000af34: e1a05002 mov r5, r2 <== NOT EXECUTED
Thread_Control *the_thread;
Objects_Locations location;
rtems_task_variable_t *tvp;
if ( !ptr )
3000af38: 0a000017 beq 3000af9c <rtems_task_variable_get+0x74> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( !result )
3000af3c: e3520000 cmp r2, #0 <== NOT EXECUTED
3000af40: 0a000015 beq 3000af9c <rtems_task_variable_get+0x74> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
3000af44: e1a0100d mov r1, sp <== NOT EXECUTED
3000af48: eb000826 bl 3000cfe8 <_Thread_Get> <== NOT EXECUTED
switch (location) {
3000af4c: e59d3000 ldr r3, [sp] <== NOT EXECUTED
3000af50: e3530000 cmp r3, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000af54: 13a00004 movne r0, #4 <== NOT EXECUTED
if ( !result )
return RTEMS_INVALID_ADDRESS;
the_thread = _Thread_Get (tid, &location);
switch (location) {
3000af58: 1a00000d bne 3000af94 <rtems_task_variable_get+0x6c> <== NOT EXECUTED
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
3000af5c: e5903100 ldr r3, [r0, #256] ; 0x100 <== NOT EXECUTED
while (tvp) {
3000af60: e3530000 cmp r3, #0 <== NOT EXECUTED
3000af64: 1a000003 bne 3000af78 <rtems_task_variable_get+0x50> <== NOT EXECUTED
3000af68: ea00000d b 3000afa4 <rtems_task_variable_get+0x7c> <== NOT EXECUTED
*/
*result = tvp->tval;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
3000af6c: e5933000 ldr r3, [r3] <== NOT EXECUTED
case OBJECTS_LOCAL:
/*
* Figure out if the variable is in this task's list.
*/
tvp = the_thread->task_variables;
while (tvp) {
3000af70: e3530000 cmp r3, #0 <== NOT EXECUTED
3000af74: 0a00000a beq 3000afa4 <rtems_task_variable_get+0x7c> <== NOT EXECUTED
if (tvp->ptr == ptr) {
3000af78: e5932004 ldr r2, [r3, #4] <== NOT EXECUTED
3000af7c: e1520004 cmp r2, r4 <== NOT EXECUTED
3000af80: 1afffff9 bne 3000af6c <rtems_task_variable_get+0x44> <== NOT EXECUTED
/*
* Should this return the current (i.e not the
* saved) value if `tid' is the current task?
*/
*result = tvp->tval;
3000af84: e593300c ldr r3, [r3, #12] <== NOT EXECUTED
3000af88: e5853000 str r3, [r5] <== NOT EXECUTED
_Thread_Enable_dispatch();
3000af8c: eb00080c bl 3000cfc4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000af90: e3a00000 mov r0, #0 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000af94: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3000af98: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
if ( !ptr )
return RTEMS_INVALID_ADDRESS;
if ( !result )
return RTEMS_INVALID_ADDRESS;
3000af9c: e3a00009 mov r0, #9 <== NOT EXECUTED
3000afa0: eafffffb b 3000af94 <rtems_task_variable_get+0x6c> <== NOT EXECUTED
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
tvp = (rtems_task_variable_t *)tvp->next;
}
_Thread_Enable_dispatch();
3000afa4: eb000806 bl 3000cfc4 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
3000afa8: e3a00009 mov r0, #9 <== NOT EXECUTED
3000afac: eafffff8 b 3000af94 <rtems_task_variable_get+0x6c> <== NOT EXECUTED
3000a030 <rtems_task_wake_after>:
3000a030: e59f307c ldr r3, [pc, #124] ; 3000a0b4 <rtems_task_wake_after+0x84>
*/
rtems_status_code rtems_task_wake_after(
rtems_interval ticks
)
{
3000a034: e92d4030 push {r4, r5, lr}
3000a038: e5932000 ldr r2, [r3]
3000a03c: e1a04000 mov r4, r0
3000a040: e2822001 add r2, r2, #1
3000a044: e5832000 str r2, [r3]
_Thread_Disable_dispatch();
if ( ticks == 0 ) {
3000a048: e3500000 cmp r0, #0
3000a04c: 0a000012 beq 3000a09c <rtems_task_wake_after+0x6c>
_Scheduler_Yield();
} else {
_Thread_Set_state( _Thread_Executing, STATES_DELAYING );
3000a050: e59f5060 ldr r5, [pc, #96] ; 3000a0b8 <rtems_task_wake_after+0x88><== NOT EXECUTED
3000a054: e3a01008 mov r1, #8 <== NOT EXECUTED
3000a058: e5950004 ldr r0, [r5, #4] <== NOT EXECUTED
3000a05c: eb000a20 bl 3000c8e4 <_Thread_Set_state> <== NOT EXECUTED
_Watchdog_Initialize(
&_Thread_Executing->Timer,
3000a060: e5951004 ldr r1, [r5, #4] <== NOT EXECUTED
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3000a064: e59f0050 ldr r0, [pc, #80] ; 3000a0bc <rtems_task_wake_after+0x8c><== NOT EXECUTED
_Thread_Disable_dispatch();
if ( ticks == 0 ) {
_Scheduler_Yield();
} else {
_Thread_Set_state( _Thread_Executing, STATES_DELAYING );
_Watchdog_Initialize(
3000a068: e5912008 ldr r2, [r1, #8] <== NOT EXECUTED
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3000a06c: e3a03000 mov r3, #0 <== NOT EXECUTED
3000a070: e5813050 str r3, [r1, #80] ; 0x50 <== NOT EXECUTED
the_watchdog->routine = routine;
the_watchdog->id = id;
3000a074: e5812068 str r2, [r1, #104] ; 0x68 <== NOT EXECUTED
the_watchdog->user_data = user_data;
3000a078: e581306c str r3, [r1, #108] ; 0x6c <== NOT EXECUTED
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3000a07c: e5810064 str r0, [r1, #100] ; 0x64 <== NOT EXECUTED
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3000a080: e5814054 str r4, [r1, #84] ; 0x54 <== NOT EXECUTED
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000a084: e59f0034 ldr r0, [pc, #52] ; 3000a0c0 <rtems_task_wake_after+0x90><== NOT EXECUTED
3000a088: e2811048 add r1, r1, #72 ; 0x48 <== NOT EXECUTED
3000a08c: eb000b76 bl 3000ce6c <_Watchdog_Insert> <== NOT EXECUTED
_Thread_Executing->Object.id,
NULL
);
_Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
}
_Thread_Enable_dispatch();
3000a090: eb0007fb bl 3000c084 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
}
3000a094: e3a00000 mov r0, #0 <== NOT EXECUTED
3000a098: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
* always operates on the scheduler that 'owns' the currently executing
* thread.
*/
RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void )
{
_Scheduler.Operations.yield();
3000a09c: e59f3020 ldr r3, [pc, #32] ; 3000a0c4 <rtems_task_wake_after+0x94>
3000a0a0: e1a0e00f mov lr, pc
3000a0a4: e593f00c ldr pc, [r3, #12]
_Thread_Executing->Object.id,
NULL
);
_Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
}
_Thread_Enable_dispatch();
3000a0a8: eb0007f5 bl 3000c084 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
}
3000a0ac: e3a00000 mov r0, #0
3000a0b0: e8bd8030 pop {r4, r5, pc}
3000b0ec <rtems_task_wake_when>:
rtems_time_of_day *time_buffer
)
{
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
3000b0ec: e59f30bc ldr r3, [pc, #188] ; 3000b1b0 <rtems_task_wake_when+0xc4>
*/
rtems_status_code rtems_task_wake_when(
rtems_time_of_day *time_buffer
)
{
3000b0f0: e92d40f0 push {r4, r5, r6, r7, lr}
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
3000b0f4: e5d33000 ldrb r3, [r3]
*/
rtems_status_code rtems_task_wake_when(
rtems_time_of_day *time_buffer
)
{
3000b0f8: e1a05000 mov r5, r0
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
3000b0fc: e3530000 cmp r3, #0
return RTEMS_NOT_DEFINED;
3000b100: 03a0000b moveq r0, #11
rtems_time_of_day *time_buffer
)
{
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
3000b104: 08bd80f0 popeq {r4, r5, r6, r7, pc}
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
3000b108: e3550000 cmp r5, #0
return RTEMS_INVALID_ADDRESS;
3000b10c: 03a00009 moveq r0, #9
Watchdog_Interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !time_buffer )
3000b110: 08bd80f0 popeq {r4, r5, r6, r7, pc}
return RTEMS_INVALID_ADDRESS;
time_buffer->ticks = 0;
3000b114: e3a04000 mov r4, #0
3000b118: e5854018 str r4, [r5, #24]
if ( !_TOD_Validate( time_buffer ) )
3000b11c: ebfffcfa bl 3000a50c <_TOD_Validate>
3000b120: e1500004 cmp r0, r4
return RTEMS_INVALID_CLOCK;
3000b124: 03a00014 moveq r0, #20
if ( !time_buffer )
return RTEMS_INVALID_ADDRESS;
time_buffer->ticks = 0;
if ( !_TOD_Validate( time_buffer ) )
3000b128: 08bd80f0 popeq {r4, r5, r6, r7, pc}
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
3000b12c: e1a00005 mov r0, r5
3000b130: ebfffcca bl 3000a460 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
3000b134: e59f6078 ldr r6, [pc, #120] ; 3000b1b4 <rtems_task_wake_when+0xc8>
time_buffer->ticks = 0;
if ( !_TOD_Validate( time_buffer ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( time_buffer );
3000b138: e1a05000 mov r5, r0
if ( seconds <= _TOD_Seconds_since_epoch() )
3000b13c: e5963000 ldr r3, [r6]
3000b140: e1500003 cmp r0, r3
3000b144: 8a000001 bhi 3000b150 <rtems_task_wake_when+0x64>
return RTEMS_INVALID_CLOCK;
3000b148: e3a00014 mov r0, #20 <== NOT EXECUTED
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
3000b14c: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000b150: e59f3060 ldr r3, [pc, #96] ; 3000b1b8 <rtems_task_wake_when+0xcc>
3000b154: e5932000 ldr r2, [r3]
3000b158: e2822001 add r2, r2, #1
3000b15c: e5832000 str r2, [r3]
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
3000b160: e59f7054 ldr r7, [pc, #84] ; 3000b1bc <rtems_task_wake_when+0xd0>
3000b164: e3a01010 mov r1, #16
3000b168: e5970004 ldr r0, [r7, #4]
3000b16c: eb000a28 bl 3000da14 <_Thread_Set_state>
_Watchdog_Initialize(
&_Thread_Executing->Timer,
3000b170: e5971004 ldr r1, [r7, #4]
_Thread_Delay_ended,
_Thread_Executing->Object.id,
NULL
);
_Watchdog_Insert_seconds(
3000b174: e5962000 ldr r2, [r6]
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
_Thread_Disable_dispatch();
_Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
_Watchdog_Initialize(
3000b178: e5913008 ldr r3, [r1, #8]
&_Thread_Executing->Timer,
_Thread_Delay_ended,
_Thread_Executing->Object.id,
NULL
);
_Watchdog_Insert_seconds(
3000b17c: e0625005 rsb r5, r2, r5
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3000b180: e59f2038 ldr r2, [pc, #56] ; 3000b1c0 <rtems_task_wake_when+0xd4>
the_watchdog->id = id;
3000b184: e5813068 str r3, [r1, #104] ; 0x68
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3000b188: e5812064 str r2, [r1, #100] ; 0x64
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
3000b18c: e59f0030 ldr r0, [pc, #48] ; 3000b1c4 <rtems_task_wake_when+0xd8>
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3000b190: e5814050 str r4, [r1, #80] ; 0x50
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
3000b194: e581406c str r4, [r1, #108] ; 0x6c
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3000b198: e5815054 str r5, [r1, #84] ; 0x54
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
3000b19c: e2811048 add r1, r1, #72 ; 0x48
3000b1a0: eb000bae bl 3000e060 <_Watchdog_Insert>
&_Thread_Executing->Timer,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
3000b1a4: eb000802 bl 3000d1b4 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000b1a8: e1a00004 mov r0, r4 <== NOT EXECUTED
3000b1ac: e8bd80f0 pop {r4, r5, r6, r7, pc} <== NOT EXECUTED
3000a524 <rtems_timer_create>:
rtems_status_code rtems_timer_create(
rtems_name name,
rtems_id *id
)
{
3000a524: e92d4070 push {r4, r5, r6, lr}
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
3000a528: e2504000 subs r4, r0, #0
rtems_status_code rtems_timer_create(
rtems_name name,
rtems_id *id
)
{
3000a52c: e1a05001 mov r5, r1
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
3000a530: 03a00003 moveq r0, #3
rtems_id *id
)
{
Timer_Control *the_timer;
if ( !rtems_is_name_valid( name ) )
3000a534: 08bd8070 popeq {r4, r5, r6, pc}
return RTEMS_INVALID_NAME;
if ( !id )
3000a538: e3510000 cmp r1, #0
3000a53c: 0a00001b beq 3000a5b0 <rtems_timer_create+0x8c>
3000a540: e59f3070 ldr r3, [pc, #112] ; 3000a5b8 <rtems_timer_create+0x94>
3000a544: e5932000 ldr r2, [r3]
3000a548: e2822001 add r2, r2, #1
3000a54c: e5832000 str r2, [r3]
* This function allocates a timer control block from
* the inactive chain of free timer control blocks.
*/
RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Allocate( void )
{
return (Timer_Control *) _Objects_Allocate( &_Timer_Information );
3000a550: e59f6064 ldr r6, [pc, #100] ; 3000a5bc <rtems_timer_create+0x98>
3000a554: e1a00006 mov r0, r6
3000a558: eb0003c6 bl 3000b478 <_Objects_Allocate>
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
3000a55c: e3500000 cmp r0, #0
3000a560: 0a00000f beq 3000a5a4 <rtems_timer_create+0x80>
Objects_Name name
)
{
_Objects_Set_local_object(
information,
_Objects_Get_index( the_object->id ),
3000a564: e5903008 ldr r3, [r0, #8]
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3000a568: e596201c ldr r2, [r6, #28]
Objects_Information *information,
Objects_Control *the_object,
Objects_Name name
)
{
_Objects_Set_local_object(
3000a56c: e1a01803 lsl r1, r3, #16
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3000a570: e3a06000 mov r6, #0
_Thread_Enable_dispatch();
return RTEMS_TOO_MANY;
}
the_timer->the_class = TIMER_DORMANT;
3000a574: e3a0c004 mov ip, #4
3000a578: e580c038 str ip, [r0, #56] ; 0x38
3000a57c: e5806018 str r6, [r0, #24]
the_watchdog->routine = routine;
3000a580: e580602c str r6, [r0, #44] ; 0x2c
the_watchdog->id = id;
3000a584: e5806030 str r6, [r0, #48] ; 0x30
the_watchdog->user_data = user_data;
3000a588: e5806034 str r6, [r0, #52] ; 0x34
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return;
#endif
information->local_table[ index ] = the_object;
3000a58c: e7820721 str r0, [r2, r1, lsr #14]
information,
_Objects_Get_index( the_object->id ),
the_object
);
the_object->name = name;
3000a590: e580400c str r4, [r0, #12]
&_Timer_Information,
&the_timer->Object,
(Objects_Name) name
);
*id = the_timer->Object.id;
3000a594: e5853000 str r3, [r5]
_Thread_Enable_dispatch();
3000a598: eb000814 bl 3000c5f0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000a59c: e1a00006 mov r0, r6
3000a5a0: e8bd8070 pop {r4, r5, r6, pc}
_Thread_Disable_dispatch(); /* to prevent deletion */
the_timer = _Timer_Allocate();
if ( !the_timer ) {
_Thread_Enable_dispatch();
3000a5a4: eb000811 bl 3000c5f0 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_TOO_MANY;
3000a5a8: e3a00005 mov r0, #5 <== NOT EXECUTED
3000a5ac: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
if ( !id )
return RTEMS_INVALID_ADDRESS;
3000a5b0: e3a00009 mov r0, #9 <== NOT EXECUTED
);
*id = the_timer->Object.id;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}
3000a5b4: e8bd8070 pop {r4, r5, r6, pc} <== NOT EXECUTED
3000a5c0 <rtems_timer_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3000a5c0: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
3000a5c4: e2516000 subs r6, r1, #0
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3000a5c8: e1a05000 mov r5, r0
3000a5cc: e24dd004 sub sp, sp, #4
3000a5d0: e1a04002 mov r4, r2
3000a5d4: e1a07003 mov r7, r3
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
3000a5d8: 03a0000a moveq r0, #10
{
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
if ( ticks == 0 )
3000a5dc: 0a000020 beq 3000a664 <rtems_timer_fire_after+0xa4>
return RTEMS_INVALID_NUMBER;
if ( !routine )
3000a5e0: e3520000 cmp r2, #0
return RTEMS_INVALID_ADDRESS;
3000a5e4: 03a00009 moveq r0, #9
ISR_Level level;
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
if ( !routine )
3000a5e8: 0a00001d beq 3000a664 <rtems_timer_fire_after+0xa4>
Objects_Id id,
Objects_Locations *location
)
{
return (Timer_Control *)
_Objects_Get( &_Timer_Information, id, location );
3000a5ec: e59f0088 ldr r0, [pc, #136] ; 3000a67c <rtems_timer_fire_after+0xbc>
3000a5f0: e1a01005 mov r1, r5
3000a5f4: e1a0200d mov r2, sp
3000a5f8: eb0004cf bl 3000b93c <_Objects_Get>
return RTEMS_INVALID_ADDRESS;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3000a5fc: e59d3000 ldr r3, [sp]
3000a600: e1a08000 mov r8, r0
3000a604: e3530000 cmp r3, #0
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3000a608: 13a00004 movne r0, #4
if ( !routine )
return RTEMS_INVALID_ADDRESS;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3000a60c: 1a000014 bne 3000a664 <rtems_timer_fire_after+0xa4>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
3000a610: e288a010 add sl, r8, #16
3000a614: e1a0000a mov r0, sl
3000a618: eb000bdd bl 3000d594 <_Watchdog_Remove>
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3000a61c: e10f2000 mrs r2, CPSR
3000a620: e3823080 orr r3, r2, #128 ; 0x80
3000a624: e129f003 msr CPSR_fc, r3
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
3000a628: e5983018 ldr r3, [r8, #24]
3000a62c: e3530000 cmp r3, #0
3000a630: 1a00000d bne 3000a66c <rtems_timer_fire_after+0xac>
/*
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
the_timer->the_class = TIMER_INTERVAL;
3000a634: e5883038 str r3, [r8, #56] ; 0x38
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3000a638: e5883018 str r3, [r8, #24]
the_watchdog->routine = routine;
3000a63c: e588402c str r4, [r8, #44] ; 0x2c
the_watchdog->id = id;
3000a640: e5885030 str r5, [r8, #48] ; 0x30
the_watchdog->user_data = user_data;
3000a644: e5887034 str r7, [r8, #52] ; 0x34
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3000a648: e129f002 msr CPSR_fc, r2
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000a64c: e59f002c ldr r0, [pc, #44] ; 3000a680 <rtems_timer_fire_after+0xc0>
3000a650: e1a0100a mov r1, sl
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3000a654: e588601c str r6, [r8, #28]
_Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
3000a658: eb000b5e bl 3000d3d8 <_Watchdog_Insert>
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_ISR_Enable( level );
_Watchdog_Insert_ticks( &the_timer->Ticker, ticks );
_Thread_Enable_dispatch();
3000a65c: eb0007e3 bl 3000c5f0 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3000a660: e3a00000 mov r0, #0
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3000a664: e28dd004 add sp, sp, #4
3000a668: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc}
3000a66c: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
_Thread_Enable_dispatch();
3000a670: eb0007de bl 3000c5f0 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3000a674: e3a00000 mov r0, #0 <== NOT EXECUTED
3000a678: eafffff9 b 3000a664 <rtems_timer_fire_after+0xa4> <== NOT EXECUTED
3001a0f4 <rtems_timer_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a0f4: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr}
3001a0f8: e1a05000 mov r5, r0
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
3001a0fc: e59f00d0 ldr r0, [pc, #208] ; 3001a1d4 <rtems_timer_fire_when+0xe0>
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a100: e24dd004 sub sp, sp, #4
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
3001a104: e5d0c000 ldrb ip, [r0]
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a108: e1a06001 mov r6, r1
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
3001a10c: e35c0000 cmp ip, #0
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a110: e1a04002 mov r4, r2
3001a114: e1a07003 mov r7, r3
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
3001a118: 03a0000b moveq r0, #11
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
if ( !_TOD_Is_set )
3001a11c: 1a000001 bne 3001a128 <rtems_timer_fire_when+0x34>
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3001a120: e28dd004 add sp, sp, #4
3001a124: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc}
rtems_interval seconds;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !_TOD_Validate( wall_time ) )
3001a128: e1a00001 mov r0, r1
3001a12c: ebfff4b6 bl 3001740c <_TOD_Validate>
3001a130: e3500000 cmp r0, #0
3001a134: 0a000009 beq 3001a160 <rtems_timer_fire_when+0x6c>
return RTEMS_INVALID_CLOCK;
if ( !routine )
3001a138: e3540000 cmp r4, #0
return RTEMS_INVALID_ADDRESS;
3001a13c: 03a00009 moveq r0, #9
return RTEMS_NOT_DEFINED;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
if ( !routine )
3001a140: 0afffff6 beq 3001a120 <rtems_timer_fire_when+0x2c>
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
3001a144: e1a00006 mov r0, r6
3001a148: ebfff484 bl 30017360 <_TOD_To_seconds>
if ( seconds <= _TOD_Seconds_since_epoch() )
3001a14c: e59f8084 ldr r8, [pc, #132] ; 3001a1d8 <rtems_timer_fire_when+0xe4>
return RTEMS_INVALID_CLOCK;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
seconds = _TOD_To_seconds( wall_time );
3001a150: e1a06000 mov r6, r0
if ( seconds <= _TOD_Seconds_since_epoch() )
3001a154: e5983000 ldr r3, [r8]
3001a158: e1500003 cmp r0, r3
3001a15c: 8a000001 bhi 3001a168 <rtems_timer_fire_when+0x74>
return RTEMS_INVALID_CLOCK;
3001a160: e3a00014 mov r0, #20 <== NOT EXECUTED
3001a164: eaffffed b 3001a120 <rtems_timer_fire_when+0x2c> <== NOT EXECUTED
3001a168: e59f006c ldr r0, [pc, #108] ; 3001a1dc <rtems_timer_fire_when+0xe8>
3001a16c: e1a01005 mov r1, r5
3001a170: e1a0200d mov r2, sp
3001a174: eb000b2c bl 3001ce2c <_Objects_Get>
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a178: e59da000 ldr sl, [sp]
3001a17c: e1a09000 mov r9, r0
3001a180: e35a0000 cmp sl, #0
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3001a184: 13a00004 movne r0, #4
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a188: 1affffe4 bne 3001a120 <rtems_timer_fire_when+0x2c>
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
3001a18c: e289b010 add fp, r9, #16
3001a190: e1a0000b mov r0, fp
3001a194: eb001329 bl 3001ee40 <_Watchdog_Remove>
the_timer->the_class = TIMER_TIME_OF_DAY;
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_Watchdog_Insert_seconds(
3001a198: e5983000 ldr r3, [r8]
)
{
the_watchdog->initial = units;
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
3001a19c: e59f003c ldr r0, [pc, #60] ; 3001a1e0 <rtems_timer_fire_when+0xec>
3001a1a0: e0636006 rsb r6, r3, r6
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY;
3001a1a4: e3a03002 mov r3, #2
3001a1a8: e5893038 str r3, [r9, #56] ; 0x38
3001a1ac: e1a0100b mov r1, fp
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3001a1b0: e589a018 str sl, [r9, #24]
the_watchdog->routine = routine;
3001a1b4: e589402c str r4, [r9, #44] ; 0x2c
the_watchdog->id = id;
3001a1b8: e5895030 str r5, [r9, #48] ; 0x30
the_watchdog->user_data = user_data;
3001a1bc: e5897034 str r7, [r9, #52] ; 0x34
Watchdog_Control *the_watchdog,
Watchdog_Interval units
)
{
the_watchdog->initial = units;
3001a1c0: e589601c str r6, [r9, #28]
_Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
3001a1c4: eb0012ae bl 3001ec84 <_Watchdog_Insert>
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
_Watchdog_Insert_seconds(
&the_timer->Ticker,
seconds - _TOD_Seconds_since_epoch()
);
_Thread_Enable_dispatch();
3001a1c8: eb000e66 bl 3001db68 <_Thread_Enable_dispatch>
return RTEMS_SUCCESSFUL;
3001a1cc: e1a0000a mov r0, sl
3001a1d0: eaffffd2 b 3001a120 <rtems_timer_fire_when+0x2c>
3001a1e4 <rtems_timer_get_information>:
rtems_status_code rtems_timer_get_information(
rtems_id id,
rtems_timer_information *the_info
)
{
3001a1e4: e92d4030 push {r4, r5, lr} <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
if ( !the_info )
3001a1e8: e2514000 subs r4, r1, #0 <== NOT EXECUTED
rtems_status_code rtems_timer_get_information(
rtems_id id,
rtems_timer_information *the_info
)
{
3001a1ec: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
3001a1f0: e1a01000 mov r1, r0 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
3001a1f4: 03a00009 moveq r0, #9 <== NOT EXECUTED
)
{
Timer_Control *the_timer;
Objects_Locations location;
if ( !the_info )
3001a1f8: 0a00000e beq 3001a238 <rtems_timer_get_information+0x54> <== NOT EXECUTED
3001a1fc: e59f003c ldr r0, [pc, #60] ; 3001a240 <rtems_timer_get_information+0x5c><== NOT EXECUTED
3001a200: e1a0200d mov r2, sp <== NOT EXECUTED
3001a204: eb000b08 bl 3001ce2c <_Objects_Get> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a208: e59d5000 ldr r5, [sp] <== NOT EXECUTED
3001a20c: e3550000 cmp r5, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3001a210: 13a00004 movne r0, #4 <== NOT EXECUTED
if ( !the_info )
return RTEMS_INVALID_ADDRESS;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a214: 1a000007 bne 3001a238 <rtems_timer_get_information+0x54> <== NOT EXECUTED
case OBJECTS_LOCAL:
the_info->the_class = the_timer->the_class;
3001a218: e590c038 ldr ip, [r0, #56] ; 0x38 <== NOT EXECUTED
the_info->initial = the_timer->Ticker.initial;
3001a21c: e590101c ldr r1, [r0, #28] <== NOT EXECUTED
the_info->start_time = the_timer->Ticker.start_time;
3001a220: e5902024 ldr r2, [r0, #36] ; 0x24 <== NOT EXECUTED
the_info->stop_time = the_timer->Ticker.stop_time;
3001a224: e5903028 ldr r3, [r0, #40] ; 0x28 <== NOT EXECUTED
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
the_info->the_class = the_timer->the_class;
3001a228: e584c000 str ip, [r4] <== NOT EXECUTED
the_info->initial = the_timer->Ticker.initial;
3001a22c: e984000e stmib r4, {r1, r2, r3} <== NOT EXECUTED
the_info->start_time = the_timer->Ticker.start_time;
the_info->stop_time = the_timer->Ticker.stop_time;
_Thread_Enable_dispatch();
3001a230: eb000e4c bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3001a234: e1a00005 mov r0, r5 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3001a238: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3001a23c: e8bd8030 pop {r4, r5, pc} <== NOT EXECUTED
3001a8ec <rtems_timer_initiate_server>:
rtems_status_code rtems_timer_initiate_server(
uint32_t priority,
uint32_t stack_size,
rtems_attribute attribute_set
)
{
3001a8ec: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
3001a8f0: e3500000 cmp r0, #0 <== NOT EXECUTED
3001a8f4: e24dd00c sub sp, sp, #12 <== NOT EXECUTED
3001a8f8: e1a06001 mov r6, r1 <== NOT EXECUTED
3001a8fc: e1a08002 mov r8, r2 <== NOT EXECUTED
3001a900: 0a00004a beq 3001aa30 <rtems_timer_initiate_server+0x144> <== NOT EXECUTED
( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
3001a904: e59f313c ldr r3, [pc, #316] ; 3001aa48 <rtems_timer_initiate_server+0x15c><== NOT EXECUTED
3001a908: e5d33000 ldrb r3, [r3] <== NOT EXECUTED
*/
RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid (
rtems_task_priority the_priority
)
{
return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
3001a90c: e1500003 cmp r0, r3 <== NOT EXECUTED
3001a910: 9a00004a bls 3001aa40 <rtems_timer_initiate_server+0x154> <== NOT EXECUTED
* structured so we check it is invalid before looking for
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
3001a914: e3700001 cmn r0, #1 <== NOT EXECUTED
return RTEMS_INVALID_PRIORITY;
_priority = 0;
3001a918: 03a07000 moveq r7, #0 <== NOT EXECUTED
* structured so we check it is invalid before looking for
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
3001a91c: 1a000043 bne 3001aa30 <rtems_timer_initiate_server+0x144> <== NOT EXECUTED
3001a920: e59f3124 ldr r3, [pc, #292] ; 3001aa4c <rtems_timer_initiate_server+0x160><== NOT EXECUTED
3001a924: e5932000 ldr r2, [r3] <== NOT EXECUTED
3001a928: e2822001 add r2, r2, #1 <== NOT EXECUTED
3001a92c: e5832000 str r2, [r3] <== NOT EXECUTED
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
3001a930: e59f4118 ldr r4, [pc, #280] ; 3001aa50 <rtems_timer_initiate_server+0x164><== NOT EXECUTED
initialized = true;
3001a934: e3a03001 mov r3, #1 <== NOT EXECUTED
/*
* Just to make sure this is only called once.
*/
_Thread_Disable_dispatch();
tmpInitialized = initialized;
3001a938: e5d45000 ldrb r5, [r4] <== NOT EXECUTED
initialized = true;
3001a93c: e5c43000 strb r3, [r4] <== NOT EXECUTED
_Thread_Enable_dispatch();
3001a940: eb000c88 bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
if ( tmpInitialized )
3001a944: e3550000 cmp r5, #0 <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
3001a948: 13a0300e movne r3, #14 <== NOT EXECUTED
_Thread_Disable_dispatch();
tmpInitialized = initialized;
initialized = true;
_Thread_Enable_dispatch();
if ( tmpInitialized )
3001a94c: 1a000038 bne 3001aa34 <rtems_timer_initiate_server+0x148> <== NOT EXECUTED
* other library rules. For example, if using a TSR written in Ada the
* Server should run at the same priority as the priority Ada task.
* Otherwise, the priority ceiling for the mutex used to protect the
* GNAT run-time is violated.
*/
status = rtems_task_create(
3001a950: e388c902 orr ip, r8, #32768 ; 0x8000 <== NOT EXECUTED
3001a954: e3a03c01 mov r3, #256 ; 0x100 <== NOT EXECUTED
3001a958: e58dc000 str ip, [sp] <== NOT EXECUTED
3001a95c: e59f00f0 ldr r0, [pc, #240] ; 3001aa54 <rtems_timer_initiate_server+0x168><== NOT EXECUTED
3001a960: e28dc008 add ip, sp, #8 <== NOT EXECUTED
3001a964: e1a01007 mov r1, r7 <== NOT EXECUTED
3001a968: e1a02006 mov r2, r6 <== NOT EXECUTED
3001a96c: e58dc004 str ip, [sp, #4] <== NOT EXECUTED
3001a970: ebfffb0f bl 300195b4 <rtems_task_create> <== NOT EXECUTED
/* user may want floating point but we need */
/* system task specified for 0 priority */
attribute_set | RTEMS_SYSTEM_TASK,
&id /* get the id back */
);
if (status) {
3001a974: e2503000 subs r3, r0, #0 <== NOT EXECUTED
initialized = false;
3001a978: 15c45000 strbne r5, [r4] <== NOT EXECUTED
/* user may want floating point but we need */
/* system task specified for 0 priority */
attribute_set | RTEMS_SYSTEM_TASK,
&id /* get the id back */
);
if (status) {
3001a97c: 1a00002c bne 3001aa34 <rtems_timer_initiate_server+0x148> <== NOT EXECUTED
*/
#if defined(RTEMS_DEBUG)
if ( index > information->maximum )
return NULL;
#endif
return information->local_table[ index ];
3001a980: e59f20d0 ldr r2, [pc, #208] ; 3001aa58 <rtems_timer_initiate_server+0x16c><== NOT EXECUTED
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
&_RTEMS_tasks_Information,
_Objects_Get_index(id)
3001a984: e59de008 ldr lr, [sp, #8] <== NOT EXECUTED
3001a988: e592201c ldr r2, [r2, #28] <== NOT EXECUTED
3001a98c: e1a0180e lsl r1, lr, #16 <== NOT EXECUTED
/*
* We work with the TCB pointer, not the ID, so we need to convert
* to a TCB pointer from here out.
*/
ts->thread = (Thread_Control *)_Objects_Get_local_object(
3001a990: e7922721 ldr r2, [r2, r1, lsr #14] <== NOT EXECUTED
3001a994: e1a0c004 mov ip, r4 <== NOT EXECUTED
3001a998: e5ac2004 str r2, [ip, #4]! <== NOT EXECUTED
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
3001a99c: e59f10b8 ldr r1, [pc, #184] ; 3001aa5c <rtems_timer_initiate_server+0x170><== NOT EXECUTED
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
3001a9a0: e59f20b8 ldr r2, [pc, #184] ; 3001aa60 <rtems_timer_initiate_server+0x174><== NOT EXECUTED
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
3001a9a4: e5918000 ldr r8, [r1] <== NOT EXECUTED
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
3001a9a8: e592a000 ldr sl, [r2] <== NOT EXECUTED
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
ts->Interval_watchdogs.last_snapshot = _Watchdog_Ticks_since_boot;
3001a9ac: e5848040 str r8, [r4, #64] ; 0x40 <== NOT EXECUTED
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
head->previous = NULL;
3001a9b0: e5843038 str r3, [r4, #56] ; 0x38 <== NOT EXECUTED
ts->TOD_watchdogs.last_snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch();
3001a9b4: e584a078 str sl, [r4, #120] ; 0x78 <== NOT EXECUTED
3001a9b8: e5843070 str r3, [r4, #112] ; 0x70 <== NOT EXECUTED
ts->insert_chain = NULL;
3001a9bc: e584307c str r3, [r4, #124] ; 0x7c <== NOT EXECUTED
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3001a9c0: e5843014 str r3, [r4, #20] <== NOT EXECUTED
ts->active = false;
3001a9c4: e5c43080 strb r3, [r4, #128] ; 0x80 <== NOT EXECUTED
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
3001a9c8: e5843030 str r3, [r4, #48] ; 0x30 <== NOT EXECUTED
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3001a9cc: e584304c str r3, [r4, #76] ; 0x4c <== NOT EXECUTED
the_watchdog->routine = routine;
the_watchdog->id = id;
the_watchdog->user_data = user_data;
3001a9d0: e5843068 str r3, [r4, #104] ; 0x68 <== NOT EXECUTED
/*
* Initialize the pointer to the timer schedule method so applications that
* do not use the Timer Server do not have to pull it in.
*/
ts->schedule_operation = _Timer_server_Schedule_operation_method;
3001a9d4: e59f3088 ldr r3, [pc, #136] ; 3001aa64 <rtems_timer_initiate_server+0x178><== NOT EXECUTED
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3001a9d8: e59f5088 ldr r5, [pc, #136] ; 3001aa68 <rtems_timer_initiate_server+0x17c><== NOT EXECUTED
3001a9dc: e5843008 str r3, [r4, #8] <== NOT EXECUTED
ts->active = false;
/*
* The default timer server is now available.
*/
_Timer_server = ts;
3001a9e0: e59f3084 ldr r3, [pc, #132] ; 3001aa6c <rtems_timer_initiate_server+0x180><== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
3001a9e4: e2847038 add r7, r4, #56 ; 0x38 <== NOT EXECUTED
3001a9e8: e583c000 str ip, [r3] <== NOT EXECUTED
head->previous = NULL;
tail->previous = head;
3001a9ec: e2849034 add r9, r4, #52 ; 0x34 <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
3001a9f0: e284b070 add fp, r4, #112 ; 0x70 <== NOT EXECUTED
head->previous = NULL;
tail->previous = head;
3001a9f4: e284606c add r6, r4, #108 ; 0x6c <== NOT EXECUTED
/*
* Start the timer server
*/
status = rtems_task_start(
3001a9f8: e1a0000e mov r0, lr <== NOT EXECUTED
3001a9fc: e59f106c ldr r1, [pc, #108] ; 3001aa70 <rtems_timer_initiate_server+0x184><== NOT EXECUTED
3001aa00: e1a0200c mov r2, ip <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
3001aa04: e5847034 str r7, [r4, #52] ; 0x34 <== NOT EXECUTED
head->previous = NULL;
tail->previous = head;
3001aa08: e584903c str r9, [r4, #60] ; 0x3c <== NOT EXECUTED
)
{
Chain_Node *head = _Chain_Head( the_chain );
Chain_Node *tail = _Chain_Tail( the_chain );
head->next = tail;
3001aa0c: e584b06c str fp, [r4, #108] ; 0x6c <== NOT EXECUTED
head->previous = NULL;
tail->previous = head;
3001aa10: e5846074 str r6, [r4, #116] ; 0x74 <== NOT EXECUTED
3001aa14: e5845028 str r5, [r4, #40] ; 0x28 <== NOT EXECUTED
the_watchdog->id = id;
3001aa18: e584e02c str lr, [r4, #44] ; 0x2c <== NOT EXECUTED
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
the_watchdog->routine = routine;
3001aa1c: e5845060 str r5, [r4, #96] ; 0x60 <== NOT EXECUTED
the_watchdog->id = id;
3001aa20: e584e064 str lr, [r4, #100] ; 0x64 <== NOT EXECUTED
3001aa24: ebfffca4 bl 30019cbc <rtems_task_start> <== NOT EXECUTED
3001aa28: e1a03000 mov r3, r0 <== NOT EXECUTED
if (status) {
initialized = false;
}
#endif
return status;
3001aa2c: ea000000 b 3001aa34 <rtems_timer_initiate_server+0x148> <== NOT EXECUTED
* a specific invalid value as the default.
*/
_priority = priority;
if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) {
if ( priority != RTEMS_TIMER_SERVER_DEFAULT_PRIORITY )
return RTEMS_INVALID_PRIORITY;
3001aa30: e3a03013 mov r3, #19 <== NOT EXECUTED
initialized = false;
}
#endif
return status;
}
3001aa34: e1a00003 mov r0, r3 <== NOT EXECUTED
3001aa38: e28dd00c add sp, sp, #12 <== NOT EXECUTED
3001aa3c: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
3001aa40: e1a07000 mov r7, r0 <== NOT EXECUTED
3001aa44: eaffffb5 b 3001a920 <rtems_timer_initiate_server+0x34> <== NOT EXECUTED
3001a274 <rtems_timer_reset>:
*/
rtems_status_code rtems_timer_reset(
rtems_id id
)
{
3001a274: e92d4070 push {r4, r5, r6, lr}
3001a278: e24dd004 sub sp, sp, #4
3001a27c: e1a01000 mov r1, r0
3001a280: e1a0200d mov r2, sp
3001a284: e59f0088 ldr r0, [pc, #136] ; 3001a314 <rtems_timer_reset+0xa0>
3001a288: eb000ae7 bl 3001ce2c <_Objects_Get>
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a28c: e59d4000 ldr r4, [sp]
3001a290: e1a06000 mov r6, r0
3001a294: e3540000 cmp r4, #0
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3001a298: 13a05004 movne r5, #4
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a29c: 1a000006 bne 3001a2bc <rtems_timer_reset+0x48>
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
3001a2a0: e5905038 ldr r5, [r0, #56] ; 0x38
3001a2a4: e3550000 cmp r5, #0
3001a2a8: 0a000006 beq 3001a2c8 <rtems_timer_reset+0x54>
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
3001a2ac: e3550001 cmp r5, #1 <== NOT EXECUTED
/*
* Must be dormant or time of day timer (e.g. TIMER_DORMANT,
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
3001a2b0: 13a0500b movne r5, #11 <== NOT EXECUTED
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
3001a2b4: 0a00000b beq 3001a2e8 <rtems_timer_reset+0x74> <== NOT EXECUTED
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
}
_Thread_Enable_dispatch();
3001a2b8: eb000e2a bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3001a2bc: e1a00005 mov r0, r5
3001a2c0: e28dd004 add sp, sp, #4
3001a2c4: e8bd8070 pop {r4, r5, r6, pc}
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
3001a2c8: e2806010 add r6, r0, #16
3001a2cc: e1a00006 mov r0, r6
3001a2d0: eb0012da bl 3001ee40 <_Watchdog_Remove>
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
3001a2d4: e59f003c ldr r0, [pc, #60] ; 3001a318 <rtems_timer_reset+0xa4>
3001a2d8: e1a01006 mov r1, r6
3001a2dc: eb001268 bl 3001ec84 <_Watchdog_Insert>
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
}
_Thread_Enable_dispatch();
3001a2e0: eb000e20 bl 3001db68 <_Thread_Enable_dispatch>
3001a2e4: eafffff4 b 3001a2bc <rtems_timer_reset+0x48>
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
Timer_server_Control *timer_server = _Timer_server;
3001a2e8: e59f302c ldr r3, [pc, #44] ; 3001a31c <rtems_timer_reset+0xa8><== NOT EXECUTED
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
3001a2ec: e2800010 add r0, r0, #16 <== NOT EXECUTED
case OBJECTS_LOCAL:
if ( the_timer->the_class == TIMER_INTERVAL ) {
_Watchdog_Remove( &the_timer->Ticker );
_Watchdog_Insert( &_Watchdog_Ticks_chain, &the_timer->Ticker );
} else if ( the_timer->the_class == TIMER_INTERVAL_ON_TASK ) {
Timer_server_Control *timer_server = _Timer_server;
3001a2f0: e5935000 ldr r5, [r3] <== NOT EXECUTED
if ( !timer_server ) {
_Thread_Enable_dispatch();
return RTEMS_INCORRECT_STATE;
}
#endif
_Watchdog_Remove( &the_timer->Ticker );
3001a2f4: eb0012d1 bl 3001ee40 <_Watchdog_Remove> <== NOT EXECUTED
(*timer_server->schedule_operation)( timer_server, the_timer );
3001a2f8: e1a00005 mov r0, r5 <== NOT EXECUTED
3001a2fc: e1a01006 mov r1, r6 <== NOT EXECUTED
3001a300: e1a0e00f mov lr, pc <== NOT EXECUTED
3001a304: e595f004 ldr pc, [r5, #4] <== NOT EXECUTED
rtems_id id
)
{
Timer_Control *the_timer;
Objects_Locations location;
rtems_status_code status = RTEMS_SUCCESSFUL;
3001a308: e1a05004 mov r5, r4 <== NOT EXECUTED
* TIMER_TIME_OF_DAY, or TIMER_TIME_OF_DAY_ON_TASK). We
* can only reset active interval timers.
*/
status = RTEMS_NOT_DEFINED;
}
_Thread_Enable_dispatch();
3001a30c: eb000e15 bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
3001a310: eaffffe9 b 3001a2bc <rtems_timer_reset+0x48> <== NOT EXECUTED
3001a320 <rtems_timer_server_fire_after>:
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a320: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr} <== NOT EXECUTED
3001a324: e1a07000 mov r7, r0 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
3001a328: e59f00cc ldr r0, [pc, #204] ; 3001a3fc <rtems_timer_server_fire_after+0xdc><== NOT EXECUTED
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a32c: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
3001a330: e5904000 ldr r4, [r0] <== NOT EXECUTED
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a334: e1a06001 mov r6, r1 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
3001a338: e3540000 cmp r4, #0 <== NOT EXECUTED
rtems_id id,
rtems_interval ticks,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a33c: e1a05002 mov r5, r2 <== NOT EXECUTED
3001a340: e1a08003 mov r8, r3 <== NOT EXECUTED
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
3001a344: 03a0000e moveq r0, #14 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
ISR_Level level;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
3001a348: 0a000005 beq 3001a364 <rtems_timer_server_fire_after+0x44> <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
if ( !routine )
3001a34c: e3520000 cmp r2, #0 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
3001a350: 03a00009 moveq r0, #9 <== NOT EXECUTED
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !routine )
3001a354: 0a000002 beq 3001a364 <rtems_timer_server_fire_after+0x44> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
3001a358: e3510000 cmp r1, #0 <== NOT EXECUTED
return RTEMS_INVALID_NUMBER;
3001a35c: 03a0000a moveq r0, #10 <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
if ( !routine )
return RTEMS_INVALID_ADDRESS;
if ( ticks == 0 )
3001a360: 1a000001 bne 3001a36c <rtems_timer_server_fire_after+0x4c> <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3001a364: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3001a368: e8bd85f0 pop {r4, r5, r6, r7, r8, sl, pc} <== NOT EXECUTED
3001a36c: e59f008c ldr r0, [pc, #140] ; 3001a400 <rtems_timer_server_fire_after+0xe0><== NOT EXECUTED
3001a370: e1a01007 mov r1, r7 <== NOT EXECUTED
3001a374: e1a0200d mov r2, sp <== NOT EXECUTED
3001a378: eb000aab bl 3001ce2c <_Objects_Get> <== NOT EXECUTED
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a37c: e59d3000 ldr r3, [sp] <== NOT EXECUTED
3001a380: e1a0a000 mov sl, r0 <== NOT EXECUTED
3001a384: e3530000 cmp r3, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3001a388: 13a00004 movne r0, #4 <== NOT EXECUTED
if ( ticks == 0 )
return RTEMS_INVALID_NUMBER;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a38c: 1afffff4 bne 3001a364 <rtems_timer_server_fire_after+0x44> <== NOT EXECUTED
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
3001a390: e28a0010 add r0, sl, #16 <== NOT EXECUTED
3001a394: eb0012a9 bl 3001ee40 <_Watchdog_Remove> <== NOT EXECUTED
static inline uint32_t arm_interrupt_disable( void )
{
uint32_t arm_switch_reg;
uint32_t level;
__asm__ volatile (
3001a398: e10f2000 mrs r2, CPSR <== NOT EXECUTED
3001a39c: e3823080 orr r3, r2, #128 ; 0x80 <== NOT EXECUTED
3001a3a0: e129f003 msr CPSR_fc, r3 <== NOT EXECUTED
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
3001a3a4: e59a3018 ldr r3, [sl, #24] <== NOT EXECUTED
3001a3a8: e3530000 cmp r3, #0 <== NOT EXECUTED
3001a3ac: 1a00000e bne 3001a3ec <rtems_timer_server_fire_after+0xcc> <== NOT EXECUTED
/*
* OK. Now we now the timer was not rescheduled by an interrupt
* so we can atomically initialize it as in use.
*/
the_timer->the_class = TIMER_INTERVAL_ON_TASK;
3001a3b0: e3a01001 mov r1, #1 <== NOT EXECUTED
3001a3b4: e58a1038 str r1, [sl, #56] ; 0x38 <== NOT EXECUTED
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3001a3b8: e58a3018 str r3, [sl, #24] <== NOT EXECUTED
the_watchdog->routine = routine;
3001a3bc: e58a502c str r5, [sl, #44] ; 0x2c <== NOT EXECUTED
the_watchdog->id = id;
3001a3c0: e58a7030 str r7, [sl, #48] ; 0x30 <== NOT EXECUTED
the_watchdog->user_data = user_data;
3001a3c4: e58a8034 str r8, [sl, #52] ; 0x34 <== NOT EXECUTED
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = ticks;
3001a3c8: e58a601c str r6, [sl, #28] <== NOT EXECUTED
static inline void arm_interrupt_enable( uint32_t level )
{
ARM_SWITCH_REGISTERS;
__asm__ volatile (
3001a3cc: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
_ISR_Enable( level );
(*timer_server->schedule_operation)( timer_server, the_timer );
3001a3d0: e1a00004 mov r0, r4 <== NOT EXECUTED
3001a3d4: e1a0100a mov r1, sl <== NOT EXECUTED
3001a3d8: e1a0e00f mov lr, pc <== NOT EXECUTED
3001a3dc: e594f004 ldr pc, [r4, #4] <== NOT EXECUTED
_Thread_Enable_dispatch();
3001a3e0: eb000de0 bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3001a3e4: e3a00000 mov r0, #0 <== NOT EXECUTED
3001a3e8: eaffffdd b 3001a364 <rtems_timer_server_fire_after+0x44> <== NOT EXECUTED
3001a3ec: e129f002 msr CPSR_fc, r2 <== NOT EXECUTED
* higher priority interrupt. If so, abandon this insert.
*/
if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) {
_ISR_Enable( level );
_Thread_Enable_dispatch();
3001a3f0: eb000ddc bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3001a3f4: e3a00000 mov r0, #0 <== NOT EXECUTED
3001a3f8: eaffffd9 b 3001a364 <rtems_timer_server_fire_after+0x44> <== NOT EXECUTED
3001a404 <rtems_timer_server_fire_when>:
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a404: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} <== NOT EXECUTED
3001a408: e1a06000 mov r6, r0 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
3001a40c: e59f00e0 ldr r0, [pc, #224] ; 3001a4f4 <rtems_timer_server_fire_when+0xf0><== NOT EXECUTED
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a410: e24dd004 sub sp, sp, #4 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
3001a414: e5904000 ldr r4, [r0] <== NOT EXECUTED
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a418: e1a07001 mov r7, r1 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
3001a41c: e3540000 cmp r4, #0 <== NOT EXECUTED
rtems_id id,
rtems_time_of_day *wall_time,
rtems_timer_service_routine_entry routine,
void *user_data
)
{
3001a420: e1a05002 mov r5, r2 <== NOT EXECUTED
3001a424: e1a08003 mov r8, r3 <== NOT EXECUTED
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
3001a428: 03a0000e moveq r0, #14 <== NOT EXECUTED
Timer_Control *the_timer;
Objects_Locations location;
rtems_interval seconds;
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
3001a42c: 0a00000c beq 3001a464 <rtems_timer_server_fire_when+0x60> <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
3001a430: e59f30c0 ldr r3, [pc, #192] ; 3001a4f8 <rtems_timer_server_fire_when+0xf4><== NOT EXECUTED
3001a434: e5d33000 ldrb r3, [r3] <== NOT EXECUTED
3001a438: e3530000 cmp r3, #0 <== NOT EXECUTED
return RTEMS_NOT_DEFINED;
3001a43c: 03a0000b moveq r0, #11 <== NOT EXECUTED
Timer_server_Control *timer_server = _Timer_server;
if ( !timer_server )
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
3001a440: 0a000007 beq 3001a464 <rtems_timer_server_fire_when+0x60> <== NOT EXECUTED
return RTEMS_NOT_DEFINED;
if ( !routine )
3001a444: e3520000 cmp r2, #0 <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
3001a448: 03a00009 moveq r0, #9 <== NOT EXECUTED
return RTEMS_INCORRECT_STATE;
if ( !_TOD_Is_set )
return RTEMS_NOT_DEFINED;
if ( !routine )
3001a44c: 0a000004 beq 3001a464 <rtems_timer_server_fire_when+0x60> <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
3001a450: e1a00001 mov r0, r1 <== NOT EXECUTED
3001a454: ebfff3ec bl 3001740c <_TOD_Validate> <== NOT EXECUTED
3001a458: e3500000 cmp r0, #0 <== NOT EXECUTED
3001a45c: 1a000002 bne 3001a46c <rtems_timer_server_fire_when+0x68> <== NOT EXECUTED
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
3001a460: e3a00014 mov r0, #20 <== NOT EXECUTED
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
}
3001a464: e28dd004 add sp, sp, #4 <== NOT EXECUTED
3001a468: e8bd8ff0 pop {r4, r5, r6, r7, r8, r9, sl, fp, pc} <== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
3001a46c: e1a00007 mov r0, r7 <== NOT EXECUTED
3001a470: ebfff3ba bl 30017360 <_TOD_To_seconds> <== NOT EXECUTED
if ( seconds <= _TOD_Seconds_since_epoch() )
3001a474: e59fa080 ldr sl, [pc, #128] ; 3001a4fc <rtems_timer_server_fire_when+0xf8><== NOT EXECUTED
return RTEMS_INVALID_ADDRESS;
if ( !_TOD_Validate( wall_time ) )
return RTEMS_INVALID_CLOCK;
seconds = _TOD_To_seconds( wall_time );
3001a478: e1a07000 mov r7, r0 <== NOT EXECUTED
if ( seconds <= _TOD_Seconds_since_epoch() )
3001a47c: e59a3000 ldr r3, [sl] <== NOT EXECUTED
3001a480: e1500003 cmp r0, r3 <== NOT EXECUTED
3001a484: 9afffff5 bls 3001a460 <rtems_timer_server_fire_when+0x5c> <== NOT EXECUTED
3001a488: e59f0070 ldr r0, [pc, #112] ; 3001a500 <rtems_timer_server_fire_when+0xfc><== NOT EXECUTED
3001a48c: e1a01006 mov r1, r6 <== NOT EXECUTED
3001a490: e1a0200d mov r2, sp <== NOT EXECUTED
3001a494: eb000a64 bl 3001ce2c <_Objects_Get> <== NOT EXECUTED
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a498: e59d9000 ldr r9, [sp] <== NOT EXECUTED
3001a49c: e1a0b000 mov fp, r0 <== NOT EXECUTED
3001a4a0: e3590000 cmp r9, #0 <== NOT EXECUTED
#endif
case OBJECTS_ERROR:
break;
}
return RTEMS_INVALID_ID;
3001a4a4: 13a00004 movne r0, #4 <== NOT EXECUTED
seconds = _TOD_To_seconds( wall_time );
if ( seconds <= _TOD_Seconds_since_epoch() )
return RTEMS_INVALID_CLOCK;
the_timer = _Timer_Get( id, &location );
switch ( location ) {
3001a4a8: 1affffed bne 3001a464 <rtems_timer_server_fire_when+0x60> <== NOT EXECUTED
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
3001a4ac: e28b0010 add r0, fp, #16 <== NOT EXECUTED
3001a4b0: eb001262 bl 3001ee40 <_Watchdog_Remove> <== NOT EXECUTED
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
3001a4b4: e59a3000 ldr r3, [sl] <== NOT EXECUTED
(*timer_server->schedule_operation)( timer_server, the_timer );
3001a4b8: e1a00004 mov r0, r4 <== NOT EXECUTED
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
3001a4bc: e0637007 rsb r7, r3, r7 <== NOT EXECUTED
the_timer = _Timer_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
3001a4c0: e3a03003 mov r3, #3 <== NOT EXECUTED
3001a4c4: e58b3038 str r3, [fp, #56] ; 0x38 <== NOT EXECUTED
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
(*timer_server->schedule_operation)( timer_server, the_timer );
3001a4c8: e1a0100b mov r1, fp <== NOT EXECUTED
Watchdog_Service_routine_entry routine,
Objects_Id id,
void *user_data
)
{
the_watchdog->state = WATCHDOG_INACTIVE;
3001a4cc: e58b9018 str r9, [fp, #24] <== NOT EXECUTED
the_watchdog->routine = routine;
3001a4d0: e58b502c str r5, [fp, #44] ; 0x2c <== NOT EXECUTED
the_watchdog->id = id;
3001a4d4: e58b6030 str r6, [fp, #48] ; 0x30 <== NOT EXECUTED
the_watchdog->user_data = user_data;
3001a4d8: e58b8034 str r8, [fp, #52] ; 0x34 <== NOT EXECUTED
case OBJECTS_LOCAL:
(void) _Watchdog_Remove( &the_timer->Ticker );
the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK;
_Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch();
3001a4dc: e58b701c str r7, [fp, #28] <== NOT EXECUTED
(*timer_server->schedule_operation)( timer_server, the_timer );
3001a4e0: e1a0e00f mov lr, pc <== NOT EXECUTED
3001a4e4: e594f004 ldr pc, [r4, #4] <== NOT EXECUTED
_Thread_Enable_dispatch();
3001a4e8: eb000d9e bl 3001db68 <_Thread_Enable_dispatch> <== NOT EXECUTED
return RTEMS_SUCCESSFUL;
3001a4ec: e1a00009 mov r0, r9 <== NOT EXECUTED
3001a4f0: eaffffdb b 3001a464 <rtems_timer_server_fire_when+0x60> <== NOT EXECUTED