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