// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

void InitGoodies(EFI_HANDLE img, EFI_SYSTEM_TABLE* sys);

void WaitAnyKey(void);
void Fatal(const char* msg, EFI_STATUS status);
CHAR16* HandleToString(EFI_HANDLE handle);
const char *efi_strerror(EFI_STATUS status);
const CHAR16 *efi_wstrerror(EFI_STATUS status);
size_t strlen_16(CHAR16 *str);

// Convenience wrappers for Open/Close protocol for use by
// UEFI app code that's not a driver model participant
EFI_STATUS OpenProtocol(EFI_HANDLE h, EFI_GUID* guid, void** ifc);
EFI_STATUS CloseProtocol(EFI_HANDLE h, EFI_GUID* guid);

void* LoadFile(CHAR16* filename, UINTN* size_out);

EFI_STATUS FindPCIMMIO(EFI_BOOT_SERVICES* bs, uint8_t cls, uint8_t sub, uint8_t ifc, uint64_t* mmio);

// GUIDs
extern EFI_GUID SimpleFileSystemProtocol;
extern EFI_GUID FileInfoGUID;

// Global Context
extern EFI_HANDLE gImg;
extern EFI_SYSTEM_TABLE* gSys;
extern EFI_BOOT_SERVICES* gBS;
extern SIMPLE_TEXT_OUTPUT_INTERFACE* gConOut;
