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