salproc.h revision 1.1 1 /* $NetBSD: salproc.h,v 1.1 2014/04/01 16:16:07 jakllsch Exp $ */
2
3 #ifndef _SAL_PROC_H
4 #define _SAL_PROC_H
5 //
6 //
7 //Copyright (c) 1999 Intel Corporation
8 //
9 //Module Name:
10 //
11 // SalProc.h
12 //
13 //Abstract:
14 //
15 // Main SAL interface routins for IA-64 calls.
16 //
17 //
18 //Revision History
19 //
20 //
21
22 // return value that mimicks r8,r9,r10 & r11 registers
23 typedef struct {
24 UINT64 p0;
25 UINT64 p1;
26 UINT64 p2;
27 UINT64 p3;
28 } rArg;
29
30 #define SAL_PCI_CONFIG_READ 0x01000010
31 #define SAL_PCI_CONFIG_WRITE 0x01000011
32
33 typedef VOID (*PFN)();
34 typedef rArg (*PFN_SAL_PROC)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
35 typedef rArg (*PFN_SAL_CALLBACK)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64);
36
37 typedef struct _PLABEL {
38 UINT64 ProcEntryPoint;
39 UINT64 GP;
40 } PLABEL;
41
42 typedef struct tagIA32_BIOS_REGISTER_STATE {
43
44 // general registers
45 UINT32 eax;
46 UINT32 ecx;
47 UINT32 edx;
48 UINT32 ebx;
49
50 // stack registers
51 UINT32 esp;
52 UINT32 ebp;
53 UINT32 esi;
54 UINT32 edi;
55
56 // eflags
57 UINT32 eflags;
58
59 // instruction pointer
60 UINT32 eip;
61
62 UINT16 cs;
63 UINT16 ds;
64 UINT16 es;
65 UINT16 fs;
66 UINT16 gs;
67 UINT16 ss;
68
69 // Reserved
70 UINT32 Reserved1;
71 UINT64 Reserved2;
72 } IA32_BIOS_REGISTER_STATE;
73
74 VOID EFIInitMsg(VOID);
75
76 EFI_STATUS
77 PlRegisterAndStartTimer(
78 IN UINTN Period
79 );
80
81 EFI_STATUS
82 PlDeRegisterAndCancelTimer(VOID);
83
84 VOID
85 SalProc (
86 IN UINT64 Arg1,
87 IN UINT64 Arg2,
88 IN UINT64 Arg3,
89 IN UINT64 Arg4,
90 IN UINT64 Arg5,
91 IN UINT64 Arg6,
92 IN UINT64 Arg7,
93 IN UINT64 Arg8,
94 OUT rArg *Results OPTIONAL
95 );
96
97 VOID
98 SalCallBack (
99 IN UINT64 Arg1,
100 IN UINT64 Arg2,
101 IN UINT64 Arg3,
102 IN UINT64 Arg4,
103 IN UINT64 Arg5,
104 IN UINT64 Arg6,
105 IN UINT64 Arg7,
106 IN UINT64 Arg8,
107 OUT rArg *Results OPTIONAL
108 );
109
110 VOID
111 RUNTIMEFUNCTION
112 RtSalCallBack (
113 IN UINT64 Arg1,
114 IN UINT64 Arg2,
115 IN UINT64 Arg3,
116 IN UINT64 Arg4,
117 IN UINT64 Arg5,
118 IN UINT64 Arg6,
119 IN UINT64 Arg7,
120 IN UINT64 Arg8,
121 OUT rArg *Results OPTIONAL
122 );
123
124
125 extern PLABEL RtGlobalSalProcEntry;
126 extern PLABEL RtGlobalSALCallBack;
127
128 #pragma pack(1)
129 //
130 // SAL System Table
131 //
132 typedef struct {
133 UINT32 Signature;
134 UINT32 Length;
135 UINT16 Revision;
136 UINT16 EntryCount;
137 UINT8 CheckSum;
138 UINT8 Reserved[7];
139 UINT16 SALA_Ver;
140 UINT16 SALB_Ver;
141 UINT8 OemId[32];
142 UINT8 ProductID[32];
143 UINT8 Reserved2[8];
144 } SAL_SYSTEM_TABLE_HDR;
145
146 #define SAL_ST_ENTRY_POINT 0
147 #define SAL_ST_MEMORY_DESCRIPTOR 1
148 #define SAL_ST_PLATFORM_FEATURES 2
149 #define SAL_ST_TR_USAGE 3
150 #define SAL_ST_PTC 4
151 #define SAL_ST_AP_WAKEUP 5
152
153 typedef struct {
154 UINT8 Type; // Type == 0
155 UINT8 Reserved[7];
156 UINT64 PalProcEntry;
157 UINT64 SalProcEntry;
158 UINT64 GlobalDataPointer;
159 UINT64 Reserved2[2];
160 } SAL_ST_ENTRY_POINT_DESCRIPTOR;
161
162 typedef struct {
163 UINT8 Type; // Type == 1
164 UINT8 NeedVirtualRegistration;
165 UINT8 MemoryAttributes;
166 UINT8 PageAccessRights;
167 UINT8 SupportedAttributes;
168 UINT8 Reserved;
169 UINT16 MemoryType;
170 UINT64 PhysicalMemoryAddress;
171 UINT32 Length;
172 UINT32 Reserved1;
173 UINT64 OemReserved;
174 } SAL_ST_MEMORY_DESCRIPTOR_ENTRY;
175
176 //
177 // MemoryType info
178 //
179 #define SAL_SAPIC_IPI_BLOCK 0x0002
180 #define SAL_IO_PORT_MAPPING 0x0003
181
182 typedef struct {
183 UINT8 Type; // Type == 2
184 UINT8 PlatformFeatures;
185 UINT8 Reserved[14];
186 } SAL_ST_MEMORY_DECRIPTOR;
187
188 typedef struct {
189 UINT8 Type; // Type == 3
190 UINT8 TRType;
191 UINT8 TRNumber;
192 UINT8 Reserved[5];
193 UINT64 VirtualAddress;
194 UINT64 EncodedPageSize;
195 UINT64 Reserved1;
196 } SAL_ST_TR_DECRIPTOR;
197
198 typedef struct {
199 UINT64 NumberOfProcessors;
200 UINT64 LocalIDRegister;
201 } SAL_COHERENCE_DOMAIN_INFO;
202
203 typedef struct {
204 UINT8 Type; // Type == 4
205 UINT8 Reserved[3];
206 UINT32 NumberOfDomains;
207 SAL_COHERENCE_DOMAIN_INFO *DomainInformation;
208 } SAL_ST_CACHE_COHERENCE_DECRIPTOR;
209
210 typedef struct {
211 UINT8 Type; // Type == 5
212 UINT8 WakeUpType;
213 UINT8 Reserved[6];
214 UINT64 ExternalInterruptVector;
215 } SAL_ST_AP_WAKEUP_DECRIPTOR;
216
217 typedef struct {
218 SAL_SYSTEM_TABLE_HDR Header;
219 SAL_ST_ENTRY_POINT_DESCRIPTOR Entry0;
220 } SAL_SYSTEM_TABLE_ASCENDING_ORDER;
221
222 #define FIT_ENTRY_PTR (0x100000000 - 32) // 4GB - 24
223 #define FIT_PALA_ENTRY (0x100000000 - 48) // 4GB - 32
224 #define FIT_PALB_TYPE 01
225
226 typedef struct {
227 UINT64 Address;
228 UINT8 Size[3];
229 UINT8 Reserved;
230 UINT16 Revision;
231 UINT8 Type:7;
232 UINT8 CheckSumValid:1;
233 UINT8 CheckSum;
234 } FIT_ENTRY;
235
236 #pragma pack()
237
238 typedef
239 rArg
240 (*CALL_SAL_PROC)(
241 IN UINT64 Arg1,
242 IN UINT64 Arg2,
243 IN UINT64 Arg3,
244 IN UINT64 Arg4,
245 IN UINT64 Arg5,
246 IN UINT64 Arg6,
247 IN UINT64 Arg7,
248 IN UINT64 Arg8
249 );
250
251 typedef
252 rArg
253 (*CALL_PAL_PROC)(
254 IN UINT64 Arg1,
255 IN UINT64 Arg2,
256 IN UINT64 Arg3,
257 IN UINT64 Arg4
258 );
259
260 extern CALL_SAL_PROC GlobalSalProc;
261 extern CALL_PAL_PROC GlobalPalProc;
262 extern PLABEL SalProcPlabel;
263 extern PLABEL PalProcPlabel;
264
265 #endif
266
267