arm_reclaim_init.ld.S 1.76 KB
Newer Older
1
/*
2
 * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
3
4
5
6
7
8
9
10
11
12
13
14
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */
#ifndef ARM_RECLAIM_INIT_LD_S
#define ARM_RECLAIM_INIT_LD_S

SECTIONS
{
        .init __STACKS_START__ : {
            . = . + PLATFORM_STACK_SIZE;
            . = ALIGN(PAGE_SIZE);
            __INIT_CODE_START__ = .;
15
	    *(*text.init*);
16
17
18
19
20
21
22
23
24
25
            __INIT_CODE_END__ = .;
        } >RAM

#ifdef BL31_PROGBITS_LIMIT
    ASSERT(__INIT_CODE_END__ <= BL31_PROGBITS_LIMIT,
            "BL31 init has exceeded progbits limit.")
#endif

    ASSERT(__INIT_CODE_END__ <= __STACKS_END__,
        "Init code ends past the end of the stacks")
26

27
28
}

29
30
31
32
33
34
35
36
37
38
39
40
41
42
#undef	MIN
#define	ABS		ABSOLUTE
#define	COUNT		PLATFORM_CORE_COUNT
#define	ALIGN_MASK	~(CACHE_WRITEBACK_GRANULE - 1)

#define PRIMARY_STACK							\
	__STACKS_START__ = .;						\
	*(tzfw_normal_stacks)						\
	OFFSET = ABS(SIZEOF(.init) - (. - __STACKS_START__));		\
	/* Offset sign */						\
	SIGN = ABS(OFFSET) & (1 << 63);					\
	/* Offset mask */						\
	MASK = ABS(SIGN >> 63) - 1;					\
	. +=  ABS(OFFSET) & ABS(MASK);					\
43
	.  = ALIGN(PAGE_SIZE);						\
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
	__STACKS_END__ = .;						\
	/* Total stack size */						\
	SIZE = ABS(. - __STACKS_START__);				\
	/* Maximum primary CPU stack */					\
	STACK = ABS(__STACKS_START__ + SIZE / COUNT) & ALIGN_MASK;	\
	/* Primary CPU stack */						\
	__PRIMARY_STACK__ = MIN(STACK, ABS(__INIT_CODE_START__));

#if (COUNT > 1)
#define	SECONDARY_STACK					\
	/* Size of the secondary CPUs' stack */		\
	REST = ABS(__STACKS_END__ - __PRIMARY_STACK__);	\
	/* Secondary per-CPU stack size */		\
	__STACK_SIZE__ = ABS(REST / (COUNT - 1));
#else
#define	SECONDARY_STACK
#endif

#define STACK_SECTION		\
	stacks (NOLOAD) : {	\
		PRIMARY_STACK	\
		SECONDARY_STACK	\
	}
67
#endif /* ARM_RECLAIM_INIT_LD_S */