mirror of
https://github.com/oopuuu/zTC1.git
synced 2025-12-17 15:38:14 +08:00
72 lines
1.2 KiB
C
72 lines
1.2 KiB
C
/**************************************************
|
|
*
|
|
* Code that performs copy initialization of global data.
|
|
* New style init table.
|
|
*
|
|
* Copyright 2008 IAR Systems. All rights reserved.
|
|
*
|
|
* $Revision: 45563 $
|
|
*
|
|
**************************************************/
|
|
|
|
#include "data_init3.h"
|
|
|
|
#pragma language = extended
|
|
#pragma build_attribute vfpcc_compatible
|
|
#pragma build_attribute arm_thumb_compatible
|
|
#pragma build_attribute ropi_compatible
|
|
#pragma build_attribute rwpi_compatible
|
|
|
|
/* Format:
|
|
Size1
|
|
SrcAddr1-.
|
|
DestAddr1 /abs or SBrel)
|
|
Size2
|
|
SrcAddr2-.
|
|
DestAddr2 (abs or SBrel)
|
|
...
|
|
0
|
|
*/
|
|
|
|
|
|
__no_init uint32_t __iar_SB @ r9;
|
|
|
|
init_fun_t __iar_copy_init2;
|
|
|
|
#pragma type_attribute=__thumb __interwork
|
|
uint32_t const *
|
|
__iar_copy_init3(uint32_t const * p);
|
|
|
|
#pragma type_attribute=__thumb __interwork
|
|
uint32_t const *
|
|
__iar_copy_init3(uint32_t const * p)
|
|
{
|
|
uint32_t size;
|
|
while ((size = *p++) != 0)
|
|
{
|
|
uint32_t const * src;
|
|
uint32_t d;
|
|
uint32_t * dest;
|
|
|
|
src = (uint32_t*)((char const *)p + *(int32_t *)p);
|
|
p++;
|
|
|
|
d = *p++;
|
|
|
|
if( d & 1 )
|
|
{
|
|
d -= 1;
|
|
d += __iar_SB;
|
|
}
|
|
|
|
dest = (uint32_t *)d;
|
|
|
|
do
|
|
{
|
|
*dest++ = *src++;
|
|
size -= 4;
|
|
} while (size != 0);
|
|
}
|
|
return p;
|
|
}
|