summaryrefslogtreecommitdiffstats
path: root/sbe/image/base_ppe_header.S
blob: 2cfbb23fa5eb74d647c0bee8cf3d0e529a30abb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
//-----------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2014
// *! All Rights Reserved -- Property of IBM
// *! *** IBM Confidential ***
//-----------------------------------------------------------------------------

/// \file base_ppe_header.S
/// \brief code to create header, toc, strings, fixed and fixed_toc sections
///
/// function P9XipHeader creates header section, function .proc_sbe_fixed
/// creates fixed, fixed_toc sections
#include "p9_xip_image.h"
#include "proc_sbe_fixed.H"


#define IMAGE_SPACE_UNDEFINED 0xffff
#define IMAGE_SPACE_OCI       0x8000
#define IMAGE_SPACE_PNOR      0x800b
#define IMAGE_SPACE_OTPROM    0x0001
#define IMAGE_SPACE_SEEPROM   0x800c
#define IMAGE_SPACE_BASE      0x0008



	.macro	..checku, x:req, bits:req, err="Unsigned value too large"

	.if	(((\bits) <= 0) || ((\bits) > 63))
	.error	"The number of bits must be in the range 0 < bits < 64"
	.endif

	.iflt	(\x)
	.error  "An unsigned value is required here"
        .endif

	.ifgt	((\x) - (0xffffffffffffffff >> (64 - (\bits))))
	.error	"\err"
	.endif

	.endm

    .macro  ..check_u16, u16
	..checku (\u16), 16, "Unsigned immediate is larger than 16 bits"
    .endm


    .macro  ..set_default_space, s
	..check_u16 (\s)
    .set    _PGAS_DEFAULT_SPACE, (\s)
    .endm

	.macro	..check_default_space
	.if	(_PGAS_DEFAULT_SPACE == IMAGE_SPACE_UNDEFINED)
	.error	"The PGAS default address space has not been defined"
	.endif
	.endm


	.macro	.quada, offset:req
	..check_default_space
	.long   _PGAS_DEFAULT_SPACE
	.long	(\offset)
	.endm


//    .macro	P9XipHeader, magic, link_address, entry_point, image_size

	.macro	P9XipSection, s:req, alignment=1, empty=0
__\s\()_section:
	.if	\empty
		.long	0
		.long	0
	.else
		.long	_\s\()_offset
		.long	_\s\()_size
	.endif
		.byte	(\alignment)
        .byte	0, 0, 0
	.endm


	.macro	P9XipHeader, magic, link_address, entry_point, image_size

	.section .header, "a", @progbits


	//////////////////////////////////////////////////////////////////////
	// Identification - 8-byte aligned; 8 Entries; TOC-Indexed
	//////////////////////////////////////////////////////////////////////

__magic:
	.quad	(\magic)
__L1_LoaderAddr:
	.quad	0
__L2_LoaderAddr:
	.quad	0
__kernelAddr:
	.quad   0
__link_address:
	.quada	(\link_address)
__header_64_reserved:
	.quad	0, 0, 0

	.xip_toc magic, P9_XIP_UINT64, __magic
	.xip_toc L1_LoaderAddr, P9_XIP_UINT64, __L1_LoaderAddr
	.xip_toc L2_LoaderAddr, P9_XIP_UINT64, __L2_LoaderAddr
	.xip_toc kernelAddr, P9_XIP_UINT64, __kernelAddr
	.xip_toc link_address, P9_XIP_UINT64, __link_address	
     
        //////////////////////////////////////////////////////////////////////
        // Section Table - 8-byte aligned; 16 entries; Not TOC-Indexed
        //////////////////////////////////////////////////////////////////////

        P9XipSection header
        P9XipSection fixed,                8
        P9XipSection fixed_toc,            8
        P9XipSection loader_text,          4
        P9XipSection loader_data,          8
        P9XipSection text,                 4
        P9XipSection data,                 8
        P9XipSection toc,                  4
        P9XipSection strings
        P9XipSection base,                 4, empty=1
        P9XipSection baseloader,           8, empty=1
        P9XipSection overlay,              8, empty=1
        P9XipSection rings,                8, empty=1
        P9XipSection hbbl,                 8, empty=1


        //////////////////////////////////////////////////////////////////////
        // Other Information - 4-byte aligned; 8 entries; TOC-Indexed
        //////////////////////////////////////////////////////////////////////

__image_size:
	.long	(\image_size)
__build_date:
	.long	0
__build_time:
	.long	0
__header_32_reserved:
	.long	0, 0, 0, 0, 0

	.xip_toc image_size, P9_XIP_UINT32, __image_size
	.xip_toc build_date, P9_XIP_UINT32, __build_date
	.xip_toc build_time, P9_XIP_UINT32, __build_time


        //////////////////////////////////////////////////////////////////////
        // Other Information - 1-byte aligned; 8 entries; TOC-Indexed
        //////////////////////////////////////////////////////////////////////

__header_version:
	.byte	P9_XIP_HEADER_VERSION
__toc_normalized:
	.byte	0
__toc_sorted:
	.byte	0
__header_8_reserved:
	.byte	0, 0, 0, 0, 0

	.xip_toc header_version, P9_XIP_UINT8, __header_version
	.xip_toc toc_normalized, P9_XIP_UINT8, __toc_normalized
	.xip_toc toc_sorted, P9_XIP_UINT8, __toc_sorted


        //////////////////////////////////////////////////////////////////////
        // Strings; 64 characters allocated; TOC-Indexed
        //////////////////////////////////////////////////////////////////////

__build_user:
	.asciz	"unknown        "         # 16 Characters allocated
__build_host:
	.asciz	"unknown                " # 24 characters allocated
__header_string_reserved:
	.space	24, 0

	.xip_toc build_user, P9_XIP_STRING, __build_user
	.xip_toc build_host, P9_XIP_STRING, __build_host


	.endm


    .section .fixed, "a", @progbits
    .section .fixed_toc, "a", @progbits
    .section .loader_data, "a", @progbits
    .section .loader_text, "a", @progbits

    .section .toc, "a", @progbits
    .section .strings, "aS", @progbits

    ..set_default_space IMAGE_SPACE_SEEPROM
    P9XipHeader P9_SEEPROM_MAGIC, 0x80000000, 0x80000C78, _seeprom_size

    // Create the .fixed section
    .proc_sbe_fixed_system
    .proc_sbe_fixed_proc_chip
    .proc_sbe_fixed_perv
    .proc_sbe_fixed_core
    .proc_sbe_fixed_ex
    .proc_sbe_fixed_eq
OpenPOWER on IntegriCloud