efi_stub.c revision 119880
1110211Smarcel/* 2110211Smarcel * Copyright (c) 2003 Marcel Moolenaar 3110211Smarcel * All rights reserved. 4110211Smarcel * 5110211Smarcel * Redistribution and use in source and binary forms, with or without 6110211Smarcel * modification, are permitted provided that the following conditions 7110211Smarcel * are met: 8110211Smarcel * 9110211Smarcel * 1. Redistributions of source code must retain the above copyright 10110211Smarcel * notice, this list of conditions and the following disclaimer. 11110211Smarcel * 2. Redistributions in binary form must reproduce the above copyright 12110211Smarcel * notice, this list of conditions and the following disclaimer in the 13110211Smarcel * documentation and/or other materials provided with the distribution. 14110211Smarcel * 15110211Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16110211Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17110211Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18110211Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19110211Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20110211Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21110211Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22110211Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23110211Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24110211Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25110211Smarcel */ 26110211Smarcel 27119880Sobrien#include <sys/cdefs.h> 28119880Sobrien__FBSDID("$FreeBSD: head/sys/boot/ia64/ski/efi_stub.c 119880 2003-09-08 09:11:32Z obrien $"); 29119880Sobrien 30110211Smarcel#include <sys/types.h> 31110211Smarcel#include <machine/bootinfo.h> 32110211Smarcel#include <efi.h> 33110211Smarcel#include <stand.h> 34110211Smarcel#include "libski.h" 35110211Smarcel 36110211Smarcelextern void acpi_root; 37110211Smarcelextern void sal_systab; 38110211Smarcel 39110211Smarcelextern void acpi_stub_init(void); 40110211Smarcelextern void sal_stub_init(void); 41110211Smarcel 42110211SmarcelEFI_CONFIGURATION_TABLE efi_cfgtab[] = { 43110211Smarcel { ACPI_20_TABLE_GUID, &acpi_root }, 44110211Smarcel { SAL_SYSTEM_TABLE_GUID, &sal_systab } 45110211Smarcel}; 46110211Smarcel 47110211Smarcel 48110211Smarcelstatic EFI_STATUS GetTime(EFI_TIME *, EFI_TIME_CAPABILITIES *); 49110211Smarcelstatic EFI_STATUS SetTime(EFI_TIME *); 50110211Smarcelstatic EFI_STATUS GetWakeupTime(BOOLEAN *, BOOLEAN *, EFI_TIME *); 51110211Smarcelstatic EFI_STATUS SetWakeupTime(BOOLEAN, EFI_TIME *); 52110211Smarcel 53110211Smarcelstatic EFI_STATUS SetVirtualAddressMap(UINTN, UINTN, UINT32, 54110211Smarcel EFI_MEMORY_DESCRIPTOR*); 55110211Smarcelstatic EFI_STATUS ConvertPointer(UINTN, VOID **); 56110211Smarcel 57110211Smarcelstatic EFI_STATUS GetVariable(CHAR16 *, EFI_GUID *, UINT32 *, UINTN *, VOID *); 58110211Smarcelstatic EFI_STATUS GetNextVariableName(UINTN *, CHAR16 *, EFI_GUID *); 59110211Smarcelstatic EFI_STATUS SetVariable(CHAR16 *, EFI_GUID *, UINT32, UINTN, VOID *); 60110211Smarcel 61110211Smarcelstatic EFI_STATUS GetNextHighMonotonicCount(UINT32 *); 62110211Smarcelstatic EFI_STATUS ResetSystem(EFI_RESET_TYPE, EFI_STATUS, UINTN, CHAR16 *); 63110211Smarcel 64110211SmarcelEFI_RUNTIME_SERVICES efi_rttab = { 65110211Smarcel /* Header. */ 66110211Smarcel { EFI_RUNTIME_SERVICES_SIGNATURE, 67110211Smarcel EFI_RUNTIME_SERVICES_REVISION, 68110211Smarcel 0, /* XXX HeaderSize */ 69110211Smarcel 0, /* XXX CRC32 */ 70110211Smarcel }, 71110211Smarcel 72110211Smarcel /* Time services */ 73110211Smarcel GetTime, 74110211Smarcel SetTime, 75110211Smarcel GetWakeupTime, 76110211Smarcel SetWakeupTime, 77110211Smarcel 78110211Smarcel /* Virtual memory services */ 79110211Smarcel SetVirtualAddressMap, 80110211Smarcel ConvertPointer, 81110211Smarcel 82110211Smarcel /* Variable services */ 83110211Smarcel GetVariable, 84110211Smarcel GetNextVariableName, 85110211Smarcel SetVariable, 86110211Smarcel 87110211Smarcel /* Misc */ 88110211Smarcel GetNextHighMonotonicCount, 89110211Smarcel ResetSystem 90110211Smarcel}; 91110211Smarcel 92110211SmarcelEFI_SYSTEM_TABLE efi_systab = { 93110211Smarcel /* Header. */ 94110211Smarcel { EFI_SYSTEM_TABLE_SIGNATURE, 95110211Smarcel EFI_SYSTEM_TABLE_REVISION, 96110211Smarcel 0, /* XXX HeaderSize */ 97110211Smarcel 0, /* XXX CRC32 */ 98110211Smarcel }, 99110211Smarcel 100110211Smarcel /* Firmware info. */ 101110211Smarcel L"FreeBSD", 0, 102110211Smarcel 103110211Smarcel /* Console stuff. */ 104110211Smarcel NULL, NULL, 105110211Smarcel NULL, NULL, 106110211Smarcel NULL, NULL, 107110211Smarcel 108110211Smarcel /* Services (runtime first). */ 109110211Smarcel &efi_rttab, 110110211Smarcel NULL, 111110211Smarcel 112110211Smarcel /* Configuration tables. */ 113110211Smarcel sizeof(efi_cfgtab)/sizeof(EFI_CONFIGURATION_TABLE), 114110211Smarcel efi_cfgtab 115110211Smarcel}; 116110211Smarcel 117110211Smarcelstatic EFI_STATUS 118110211Smarcelunsupported(const char *func) 119110211Smarcel{ 120110211Smarcel printf("EFI: %s not supported\n", func); 121110211Smarcel return (EFI_UNSUPPORTED); 122110211Smarcel} 123110211Smarcel 124110211Smarcelstatic EFI_STATUS 125110211SmarcelGetTime(EFI_TIME *time, EFI_TIME_CAPABILITIES *caps) 126110211Smarcel{ 127110211Smarcel UINT32 comps[8]; 128110211Smarcel 129110211Smarcel ssc((UINT64)comps, 0, 0, 0, SSC_GET_RTC); 130110211Smarcel time->Year = comps[0] + 1900; 131110211Smarcel time->Month = comps[1] + 1; 132110211Smarcel time->Day = comps[2]; 133110211Smarcel time->Hour = comps[3]; 134110211Smarcel time->Minute = comps[4]; 135110211Smarcel time->Second = comps[5]; 136110211Smarcel time->Pad1 = time->Pad2 = 0; 137110211Smarcel time->Nanosecond = 0; 138110211Smarcel time->TimeZone = 0; 139110211Smarcel time->Daylight = 0; 140110211Smarcel return (EFI_SUCCESS); 141110211Smarcel} 142110211Smarcel 143110211Smarcelstatic EFI_STATUS 144110211SmarcelSetTime(EFI_TIME *time) 145110211Smarcel{ 146110211Smarcel return (EFI_SUCCESS); 147110211Smarcel} 148110211Smarcel 149110211Smarcelstatic EFI_STATUS 150110211SmarcelGetWakeupTime(BOOLEAN *enabled, BOOLEAN *pending, EFI_TIME *time) 151110211Smarcel{ 152110211Smarcel return (unsupported(__func__)); 153110211Smarcel} 154110211Smarcel 155110211Smarcelstatic EFI_STATUS 156110211SmarcelSetWakeupTime(BOOLEAN enable, EFI_TIME *time) 157110211Smarcel{ 158110211Smarcel return (unsupported(__func__)); 159110211Smarcel} 160110211Smarcel 161110211Smarcelstatic void 162110211SmarcelReloc(void *addr, UINT64 delta) 163110211Smarcel{ 164110211Smarcel UINT64 **fpp = addr; 165110211Smarcel 166110211Smarcel *fpp[0] += delta; 167110211Smarcel *fpp[1] += delta; 168110211Smarcel *fpp += delta >> 3; 169110211Smarcel} 170110211Smarcel 171110211Smarcelstatic EFI_STATUS 172110211SmarcelSetVirtualAddressMap(UINTN mapsz, UINTN descsz, UINT32 version, 173110211Smarcel EFI_MEMORY_DESCRIPTOR *memmap) 174110211Smarcel{ 175110211Smarcel UINT64 delta; 176110211Smarcel 177110211Smarcel delta = memmap->VirtualStart - memmap->PhysicalStart; 178110211Smarcel Reloc(&efi_rttab.GetTime, delta); 179110211Smarcel Reloc(&efi_rttab.SetTime, delta); 180110211Smarcel return (EFI_SUCCESS); /* Hah... */ 181110211Smarcel} 182110211Smarcel 183110211Smarcelstatic EFI_STATUS 184110211SmarcelConvertPointer(UINTN debug, VOID **addr) 185110211Smarcel{ 186110211Smarcel return (unsupported(__func__)); 187110211Smarcel} 188110211Smarcel 189110211Smarcelstatic EFI_STATUS 190110211SmarcelGetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 *attrs, UINTN *datasz, 191110211Smarcel VOID *data) 192110211Smarcel{ 193110211Smarcel return (unsupported(__func__)); 194110211Smarcel} 195110211Smarcel 196110211Smarcelstatic EFI_STATUS 197110211SmarcelGetNextVariableName(UINTN *namesz, CHAR16 *name, EFI_GUID *vendor) 198110211Smarcel{ 199110211Smarcel return (unsupported(__func__)); 200110211Smarcel} 201110211Smarcel 202110211Smarcelstatic EFI_STATUS 203110211SmarcelSetVariable(CHAR16 *name, EFI_GUID *vendor, UINT32 attrs, UINTN datasz, 204110211Smarcel VOID *data) 205110211Smarcel{ 206110211Smarcel return (unsupported(__func__)); 207110211Smarcel} 208110211Smarcel 209110211Smarcelstatic EFI_STATUS 210110211SmarcelGetNextHighMonotonicCount(UINT32 *high) 211110211Smarcel{ 212110211Smarcel static UINT32 counter = 0; 213110211Smarcel 214110211Smarcel *high = counter++; 215110211Smarcel return (EFI_SUCCESS); 216110211Smarcel} 217110211Smarcel 218110211Smarcelstatic EFI_STATUS 219110211SmarcelResetSystem(EFI_RESET_TYPE type, EFI_STATUS status, UINTN datasz, 220110211Smarcel CHAR16 *data) 221110211Smarcel{ 222110211Smarcel return (unsupported(__func__)); 223110211Smarcel} 224110211Smarcel 225110211Smarcelint 226110211Smarcelski_init_stubs(struct bootinfo *bi) 227110211Smarcel{ 228110211Smarcel EFI_MEMORY_DESCRIPTOR *memp; 229110211Smarcel 230110211Smarcel /* Describe the SKI memory map. */ 231110211Smarcel bi->bi_memmap = (u_int64_t)(bi + 1); 232110211Smarcel bi->bi_memmap_size = 4 * sizeof(EFI_MEMORY_DESCRIPTOR); 233110211Smarcel bi->bi_memdesc_size = sizeof(EFI_MEMORY_DESCRIPTOR); 234110211Smarcel bi->bi_memdesc_version = 1; 235110211Smarcel 236110211Smarcel memp = (EFI_MEMORY_DESCRIPTOR *)bi->bi_memmap; 237110211Smarcel 238110211Smarcel memp[0].Type = EfiPalCode; 239110211Smarcel memp[0].PhysicalStart = 0x100000; 240110211Smarcel memp[0].VirtualStart = 0; 241110211Smarcel memp[0].NumberOfPages = (4L*1024*1024)>>12; 242110211Smarcel memp[0].Attribute = EFI_MEMORY_WB | EFI_MEMORY_RUNTIME; 243110211Smarcel 244110211Smarcel memp[1].Type = EfiConventionalMemory; 245110211Smarcel memp[1].PhysicalStart = 5L*1024*1024; 246110211Smarcel memp[1].VirtualStart = 0; 247110211Smarcel memp[1].NumberOfPages = (128L*1024*1024)>>12; 248110211Smarcel memp[1].Attribute = EFI_MEMORY_WB; 249110211Smarcel 250110211Smarcel memp[2].Type = EfiConventionalMemory; 251110211Smarcel memp[2].PhysicalStart = 4L*1024*1024*1024; 252110211Smarcel memp[2].VirtualStart = 0; 253110211Smarcel memp[2].NumberOfPages = (64L*1024*1024)>>12; 254110211Smarcel memp[2].Attribute = EFI_MEMORY_WB; 255110211Smarcel 256110211Smarcel memp[3].Type = EfiMemoryMappedIOPortSpace; 257110211Smarcel memp[3].PhysicalStart = 0xffffc000000; 258110211Smarcel memp[3].VirtualStart = 0; 259110211Smarcel memp[3].NumberOfPages = (64L*1024*1024)>>12; 260110211Smarcel memp[3].Attribute = EFI_MEMORY_UC; 261110211Smarcel 262110211Smarcel bi->bi_systab = (u_int64_t)&efi_systab; 263110211Smarcel 264110211Smarcel sal_stub_init(); 265110211Smarcel acpi_stub_init(); 266110211Smarcel 267110211Smarcel return (0); 268110211Smarcel} 269