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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
|
#ifndef _SAL_PROC_H
#define _SAL_PROC_H
//
//
//Copyright (c) 1999 Intel Corporation
//
//Module Name:
//
// SalProc.h
//
//Abstract:
//
// Main SAL interface routins for IA-64 calls.
//
//
//Revision History
//
//
// return value that mimicks r8,r9,r10 & r11 registers
typedef struct {
UINT64 p0;
UINT64 p1;
UINT64 p2;
UINT64 p3;
} rArg;
#define SAL_PCI_CONFIG_READ 0x01000010
#define SAL_PCI_CONFIG_WRITE 0x01000011
typedef VOID (*PFN)();
typedef rArg (*PFN_SAL_PROC)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
typedef rArg (*PFN_SAL_CALLBACK)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
typedef struct _PLABEL {
UINT64 ProcEntryPoint;
UINT64 GP;
} PLABEL;
typedef struct tagIA32_BIOS_REGISTER_STATE {
// general registers
UINT32 eax;
UINT32 ecx;
UINT32 edx;
UINT32 ebx;
// stack registers
UINT32 esp;
UINT32 ebp;
UINT32 esi;
UINT32 edi;
// eflags
UINT32 eflags;
// instruction pointer
UINT32 eip;
UINT16 cs;
UINT16 ds;
UINT16 es;
UINT16 fs;
UINT16 gs;
UINT16 ss;
// Reserved
UINT32 Reserved1;
UINT64 Reserved2;
} IA32_BIOS_REGISTER_STATE;
VOID EFIInitMsg(VOID);
EFI_STATUS
PlRegisterAndStartTimer(
IN UINTN Period
);
EFI_STATUS
PlDeRegisterAndCancelTimer(VOID);
VOID
SalProc (
IN UINT64 Arg1,
IN UINT64 Arg2,
IN UINT64 Arg3,
IN UINT64 Arg4,
IN UINT64 Arg5,
IN UINT64 Arg6,
IN UINT64 Arg7,
IN UINT64 Arg8,
OUT rArg *Results OPTIONAL
);
VOID
SalCallBack (
IN UINT64 Arg1,
IN UINT64 Arg2,
IN UINT64 Arg3,
IN UINT64 Arg4,
IN UINT64 Arg5,
IN UINT64 Arg6,
IN UINT64 Arg7,
IN UINT64 Arg8,
OUT rArg *Results OPTIONAL
);
VOID
RUNTIMEFUNCTION
RtSalCallBack (
IN UINT64 Arg1,
IN UINT64 Arg2,
IN UINT64 Arg3,
IN UINT64 Arg4,
IN UINT64 Arg5,
IN UINT64 Arg6,
IN UINT64 Arg7,
IN UINT64 Arg8,
OUT rArg *Results OPTIONAL
);
extern PLABEL RtGlobalSalProcEntry;
extern PLABEL RtGlobalSALCallBack;
#pragma pack(1)
//
// SAL System Table
//
typedef struct {
UINT32 Signature;
UINT32 Length;
UINT16 Revision;
UINT16 EntryCount;
UINT8 CheckSum;
UINT8 Reserved[7];
UINT16 SALA_Ver;
UINT16 SALB_Ver;
UINT8 OemId[32];
UINT8 ProductID[32];
UINT8 Reserved2[8];
} SAL_SYSTEM_TABLE_HDR;
#define SAL_ST_ENTRY_POINT 0
#define SAL_ST_MEMORY_DESCRIPTOR 1
#define SAL_ST_PLATFORM_FEATURES 2
#define SAL_ST_TR_USAGE 3
#define SAL_ST_PTC 4
#define SAL_ST_AP_WAKEUP 5
typedef struct {
UINT8 Type; // Type == 0
UINT8 Reserved[7];
UINT64 PalProcEntry;
UINT64 SalProcEntry;
UINT64 GlobalDataPointer;
UINT64 Reserved2[2];
} SAL_ST_ENTRY_POINT_DESCRIPTOR;
typedef struct {
UINT8 Type; // Type == 1
UINT8 NeedVirtualRegistration;
UINT8 MemoryAttributes;
UINT8 PageAccessRights;
UINT8 SupportedAttributes;
UINT8 Reserved;
UINT16 MemoryType;
UINT64 PhysicalMemoryAddress;
UINT32 Length;
UINT32 Reserved1;
UINT64 OemReserved;
} SAL_ST_MEMORY_DESCRIPTOR_ENTRY;
//
// MemoryType info
//
#define SAL_SAPIC_IPI_BLOCK 0x0002
#define SAL_IO_PORT_MAPPING 0x0003
typedef struct {
UINT8 Type; // Type == 2
UINT8 PlatformFeatures;
UINT8 Reserved[14];
} SAL_ST_MEMORY_DECRIPTOR;
typedef struct {
UINT8 Type; // Type == 3
UINT8 TRType;
UINT8 TRNumber;
UINT8 Reserved[5];
UINT64 VirtualAddress;
UINT64 EncodedPageSize;
UINT64 Reserved1;
} SAL_ST_TR_DECRIPTOR;
typedef struct {
UINT64 NumberOfProcessors;
UINT64 LocalIDRegister;
} SAL_COHERENCE_DOMAIN_INFO;
typedef struct {
UINT8 Type; // Type == 4
UINT8 Reserved[3];
UINT32 NumberOfDomains;
SAL_COHERENCE_DOMAIN_INFO *DomainInformation;
} SAL_ST_CACHE_COHERENCE_DECRIPTOR;
typedef struct {
UINT8 Type; // Type == 5
UINT8 WakeUpType;
UINT8 Reserved[6];
UINT64 ExternalInterruptVector;
} SAL_ST_AP_WAKEUP_DECRIPTOR;
typedef struct {
SAL_SYSTEM_TABLE_HDR Header;
SAL_ST_ENTRY_POINT_DESCRIPTOR Entry0;
} SAL_SYSTEM_TABLE_ASCENDING_ORDER;
#define FIT_ENTRY_PTR (0x100000000 - 32) // 4GB - 24
#define FIT_PALA_ENTRY (0x100000000 - 48) // 4GB - 32
#define FIT_PALB_TYPE 01
typedef struct {
UINT64 Address;
UINT8 Size[3];
UINT8 Reserved;
UINT16 Revision;
UINT8 Type:7;
UINT8 CheckSumValid:1;
UINT8 CheckSum;
} FIT_ENTRY;
#pragma pack()
typedef
rArg
(*CALL_SAL_PROC)(
IN UINT64 Arg1,
IN UINT64 Arg2,
IN UINT64 Arg3,
IN UINT64 Arg4,
IN UINT64 Arg5,
IN UINT64 Arg6,
IN UINT64 Arg7,
IN UINT64 Arg8
);
typedef
rArg
(*CALL_PAL_PROC)(
IN UINT64 Arg1,
IN UINT64 Arg2,
IN UINT64 Arg3,
IN UINT64 Arg4
);
extern CALL_SAL_PROC GlobalSalProc;
extern CALL_PAL_PROC GlobalPalProc;
extern PLABEL SalProcPlabel;
extern PLABEL PalProcPlabel;
#endif
|