efi_stub.c revision 119880
1/*
2 * Copyright (c) 2003 Marcel Moolenaar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: head/sys/boot/ia64/ski/efi_stub.c 119880 2003-09-08 09:11:32Z obrien $");
29
30#include <sys/types.h>
31#include <machine/bootinfo.h>
32#include <efi.h>
33#include <stand.h>
34#include "libski.h"
35
36extern void acpi_root;
37extern void sal_systab;
38
39extern void acpi_stub_init(void);
40extern void sal_stub_init(void);
41
42EFI_CONFIGURATION_TABLE efi_cfgtab[] = {
43	{ ACPI_20_TABLE_GUID,		&acpi_root },
44	{ SAL_SYSTEM_TABLE_GUID,	&sal_systab }
45};
46
47
48static EFI_STATUS GetTime(EFI_TIME *, EFI_TIME_CAPABILITIES *);
49static EFI_STATUS SetTime(EFI_TIME *);
50static EFI_STATUS GetWakeupTime(BOOLEAN *, BOOLEAN *, EFI_TIME *);
51static EFI_STATUS SetWakeupTime(BOOLEAN, EFI_TIME *);
52
53static EFI_STATUS SetVirtualAddressMap(UINTN, UINTN, UINT32,
54    EFI_MEMORY_DESCRIPTOR*);
55static EFI_STATUS ConvertPointer(UINTN, VOID **);
56
57static EFI_STATUS GetVariable(CHAR16 *, EFI_GUID *, UINT32 *, UINTN *, VOID *);
58static EFI_STATUS GetNextVariableName(UINTN *, CHAR16 *, EFI_GUID *);
59static EFI_STATUS SetVariable(CHAR16 *, EFI_GUID *, UINT32, UINTN, VOID *);
60
61static EFI_STATUS GetNextHighMonotonicCount(UINT32 *);
62static EFI_STATUS ResetSystem(EFI_RESET_TYPE, EFI_STATUS, UINTN, CHAR16 *);
63
64EFI_RUNTIME_SERVICES efi_rttab = {
65	/* Header. */
66	{	EFI_RUNTIME_SERVICES_SIGNATURE,
67		EFI_RUNTIME_SERVICES_REVISION,
68		0,			/* XXX HeaderSize */
69		0,			/* XXX CRC32 */
70	},
71
72	/* Time services */
73	GetTime,
74	SetTime,
75	GetWakeupTime,
76	SetWakeupTime,
77
78	/* Virtual memory services */
79	SetVirtualAddressMap,
80	ConvertPointer,
81
82	/* Variable services */
83	GetVariable,
84	GetNextVariableName,
85	SetVariable,
86
87	/* Misc */
88	GetNextHighMonotonicCount,
89	ResetSystem
90};
91
92EFI_SYSTEM_TABLE efi_systab = {
93	/* Header. */
94	{	EFI_SYSTEM_TABLE_SIGNATURE,
95		EFI_SYSTEM_TABLE_REVISION,
96		0,	/* XXX HeaderSize */
97		0,	/* XXX CRC32 */
98	},
99
100	/* Firmware info. */
101	L"FreeBSD", 0,
102
103	/* Console stuff. */
104	NULL, NULL,
105	NULL, NULL,
106	NULL, NULL,
107
108	/* Services (runtime first). */
109	&efi_rttab,
110	NULL,
111
112	/* Configuration tables. */
113	sizeof(efi_cfgtab)/sizeof(EFI_CONFIGURATION_TABLE),
114	efi_cfgtab
115};
116
117static EFI_STATUS
118unsupported(const char *func)
119{
120	printf("EFI: %s not supported\n", func);
121	return (EFI_UNSUPPORTED);
122}
123
124static EFI_STATUS
125GetTime(EFI_TIME *time, EFI_TIME_CAPABILITIES *caps)
126{
127	UINT32 comps[8];
128
129	ssc((UINT64)comps, 0, 0, 0, SSC_GET_RTC);
130	time->Year = comps[0] + 1900;
131	time->Month = comps[1] + 1;
132	time->Day = comps[2];
133	time->Hour = comps[3];
134	time->Minute = comps[4];
135	time->Second = comps[5];
136	time->Pad1 = time->Pad2 = 0;
137	time->Nanosecond = 0;
138	time->TimeZone = 0;
139	time->Daylight = 0;
140	return (EFI_SUCCESS);
141}
142
143static EFI_STATUS
144SetTime(EFI_TIME *time)
145{
146	return (EFI_SUCCESS);
147}
148
149static EFI_STATUS
150GetWakeupTime(BOOLEAN *enabled, BOOLEAN *pending, EFI_TIME *time)
151{
152	return (unsupported(__func__));
153}
154
155static EFI_STATUS
156SetWakeupTime(BOOLEAN enable, EFI_TIME *time)
157{
158	return (unsupported(__func__));
159}
160
161static void
162Reloc(void *addr, UINT64 delta)
163{
164	UINT64 **fpp = addr;
165
166	*fpp[0] += delta;
167	*fpp[1] += delta;
168	*fpp += delta >> 3;
169}
170
171static EFI_STATUS
172SetVirtualAddressMap(UINTN mapsz, UINTN descsz, UINT32 version,
173    EFI_MEMORY_DESCRIPTOR *memmap)
174{
175	UINT64 delta;
176
177	delta = memmap->VirtualStart - memmap->PhysicalStart;
178	Reloc(&efi_rttab.GetTime, delta);
179	Reloc(&efi_rttab.SetTime, delta);
180	return (EFI_SUCCESS);		/* Hah... */
181}
182
183static EFI_STATUS
184ConvertPointer(UINTN debug, VOID **addr)
185{
186	return (unsupported(__func__));
187}
188
189static EFI_STATUS
190GetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 *attrs, UINTN *datasz,
191    VOID *data)
192{
193	return (unsupported(__func__));
194}
195
196static EFI_STATUS
197GetNextVariableName(UINTN *namesz, CHAR16 *name, EFI_GUID *vendor)
198{
199	return (unsupported(__func__));
200}
201
202static EFI_STATUS
203SetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 attrs, UINTN datasz,
204    VOID *data)
205{
206	return (unsupported(__func__));
207}
208
209static EFI_STATUS
210GetNextHighMonotonicCount(UINT32 *high)
211{
212	static UINT32 counter = 0;
213
214	*high = counter++;
215	return (EFI_SUCCESS);
216}
217
218static EFI_STATUS
219ResetSystem(EFI_RESET_TYPE type, EFI_STATUS status, UINTN datasz,
220    CHAR16 *data)
221{
222	return (unsupported(__func__));
223}
224
225int
226ski_init_stubs(struct bootinfo *bi)
227{
228	EFI_MEMORY_DESCRIPTOR *memp;
229
230	/* Describe the SKI memory map. */
231	bi->bi_memmap = (u_int64_t)(bi + 1);
232	bi->bi_memmap_size = 4 * sizeof(EFI_MEMORY_DESCRIPTOR);
233	bi->bi_memdesc_size = sizeof(EFI_MEMORY_DESCRIPTOR);
234	bi->bi_memdesc_version = 1;
235
236	memp = (EFI_MEMORY_DESCRIPTOR *)bi->bi_memmap;
237
238	memp[0].Type = EfiPalCode;
239	memp[0].PhysicalStart = 0x100000;
240	memp[0].VirtualStart = 0;
241	memp[0].NumberOfPages = (4L*1024*1024)>>12;
242	memp[0].Attribute = EFI_MEMORY_WB | EFI_MEMORY_RUNTIME;
243
244	memp[1].Type = EfiConventionalMemory;
245	memp[1].PhysicalStart = 5L*1024*1024;
246	memp[1].VirtualStart = 0;
247	memp[1].NumberOfPages = (128L*1024*1024)>>12;
248	memp[1].Attribute = EFI_MEMORY_WB;
249
250	memp[2].Type = EfiConventionalMemory;
251	memp[2].PhysicalStart = 4L*1024*1024*1024;
252	memp[2].VirtualStart = 0;
253	memp[2].NumberOfPages = (64L*1024*1024)>>12;
254	memp[2].Attribute = EFI_MEMORY_WB;
255
256	memp[3].Type = EfiMemoryMappedIOPortSpace;
257	memp[3].PhysicalStart = 0xffffc000000;
258	memp[3].VirtualStart = 0;
259	memp[3].NumberOfPages = (64L*1024*1024)>>12;
260	memp[3].Attribute = EFI_MEMORY_UC;
261
262	bi->bi_systab = (u_int64_t)&efi_systab;
263
264	sal_stub_init();
265	acpi_stub_init();
266
267	return (0);
268}
269