176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- * 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2007-2008 H. Peter Anvin - All Rights Reserved 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2012 Intel Corporation; author: H. Peter Anvin 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Chandramouli Narayanan 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or modify 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * it under the terms of the GNU General Public License as published by 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Free Software Foundation, Inc., 53 Temple Place Ste 330, 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Boston MA 02111-1307, USA; either version 2 of the License, or 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (at your option) any later version; incorporated herein by reference. 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */ 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Miscellaneous functions for UEFI support 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * We assume that EFI library initialization has completed 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * and we have access to the global EFI exported variables 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "efi.h" 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "fio.h" 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Variables that need to be exported 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * efi_errno - maintains the errors from EFI calls to display error messages. 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS efi_errno = EFI_SUCCESS; 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Locals 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * vol_root - handle to the root device for file operations 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic EFI_FILE_HANDLE vol_root; 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Table of UEFI error messages to be indexed with the EFI errno 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Update error message list as needed 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic CHAR16 *uefi_errmsg[] = { 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_UNDEFINED", /* should not get here */ 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_LOAD_ERROR", 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_INVALID_PARAMETER", 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_UNSUPPORTED", 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_BAD_BUFFER_SIZE", 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_BUFFER_TOO_SMALL", 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_NOT_READY", 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_DEVICE_ERROR", 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_WRITE_PROTECTED", 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_OUT_OF_RESOURCES", 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_VOLUME_CORRUPTED", 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_VOLUME_FULL", 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_NO_MEDIA", 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_MEDIA_CHANGED", 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_NOT_FOUND", 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_ACCESS_DENIED", 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_NO_RESPONSE", 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_NO_MAPPING", 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_TIMEOUT", 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_NOT_STARTED", 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_ALREADY_STARTED", 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_ABORTED", 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_ICMP_ERROR", 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_TFTP_ERROR", 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman L"EFI_PROTOCOL_ERROR" 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic UINTN nerrs = sizeof(uefi_errmsg)/sizeof(CHAR16 *); 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Generic write error message; there is no gnu lib api to write to StdErr 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * For now, everything goes ConOut 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid efi_printerr( 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman CHAR16 *fmt, 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ... 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ) 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_list args; 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_start (args, fmt); 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman VPrint (fmt, args); 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_end (args); 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Simple console logger of efi-specific error messages. It uses 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * gnu-efi library Print function to do the job. 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid efi_perror(CHAR16 *prog) 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Ensure that the err number lies within range 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Beware: unsigned comparisons fail on efi, signed comparisons work 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (EFI_ERROR(efi_errno) && (INTN)efi_errno < (INTN)nerrs) 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_printerr(L"%s: %s\n", prog, uefi_errmsg[efi_errno]); 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Write to UEFI ConOut */ 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid efi_printout( 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman CHAR16 *fmt, 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ... 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ) 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_list args; 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_start (args, fmt); 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman VPrint (fmt, args); 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman va_end (args); 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* IMPORTANT: 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * efi_setvol_root() needs to be called from efi main. 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The rest of the ADV support relies on the file i/o environment 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * setup here. In order to use the EFI file support, we need 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * to set up the volume root. Subsequent file operations need the root to 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * access the interface routines. 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS efi_set_volroot(EFI_HANDLE device_handle) 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman vol_root = LibOpenRoot(device_handle); 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!vol_root) { 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return EFI_DEVICE_ERROR; 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return EFI_SUCCESS; 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* File operations using EFI runtime services */ 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Open the file using EFI runtime service 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Opening a file in EFI requires a handle to the device 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * root in order to use the interface to the file operations supported by UEFI. 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * For now, assume device volume root handle from the loaded image 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Return a valid handle if open succeeded and null otherwise. 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * UEFI returns a bogus handle on error, so return null handle on error. 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * TODO: 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1. Validate the assumption about the root device 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2. Can EFI open a file with full path name specification? 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3. Look into gnu-efi helper functions for dealing with device path/file path 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 4. Consider utilizing EFI file open attributes. 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 5. In EFI, file attributes can be specified only at the time of creation. 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * How do we support the equivalent of set_attributes() and clear_attributes() 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 14276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_FILE_HANDLE efi_open(CHAR16 *file, UINT64 mode) 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* initialize with NULL handle since EFI open returns bogus */ 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_FILE_HANDLE fd = NULL; 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT(vol_root); 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Note that the attributes parameter is none for now */ 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(vol_root->Open, 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5, 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman vol_root, 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &fd, 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman file, 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mode, 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 0); 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return fd; 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * read/write wrapper functions for UEFI 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Read or write the specified number of bytes starting at the 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * offset specified. 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Returns: 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * number of bytes read/written on success 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * -1 on error 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Wrapper function to read from a file */ 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansize_t efi_xpread(EFI_FILE_HANDLE fd, void *buf, size_t count, off_t offset) 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT(fd); 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(fd->SetPosition, 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2, 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fd, 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman offset); 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (EFI_ERROR(efi_errno)) return -1; 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(fd->Read, 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3, 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fd, 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &count, 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman buf); 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (EFI_ERROR(efi_errno)) return -1; 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return count; 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Wrapper function to write */ 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansize_t efi_xpwrite(EFI_FILE_HANDLE fd, void *buf, size_t count, off_t offset) 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT(fd); 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(fd->SetPosition, 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2, 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fd, 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman offset); 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (EFI_ERROR(efi_errno)) return -1; 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(fd->Write, 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3, 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fd, 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &count, 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman buf); 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (EFI_ERROR(efi_errno)) return -1; 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return count; 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* For an open handle, return the generic file info excluding 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the variable-length filename in the EFI_FILE_INFO structure. 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint efi_fstat(EFI_FILE_HANDLE fd, EFI_FILE_INFO *st) 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_FILE_INFO *finfo; 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT(fd); 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo = LibFileInfo(fd); 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (finfo) { 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uefi_call_wrapper(BS->CopyMem, 3, (VOID *)st, (VOID *)finfo, SIZE_OF_EFI_FILE_INFO); 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FreePool(finfo); 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* gnu-efi lib does not return EFI status; export a generic device error for now */ 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = EFI_DEVICE_ERROR; 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* set/clear_attributes() 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Currently handles only VFAT filesystem 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * TODO: 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1. Assumes VFAT file system. 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2. How do we support other file systems? 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid efi_set_attributes(EFI_FILE_HANDLE fd) 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_FILE_INFO *finfo; 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT(fd); 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo = LibFileInfo(fd); 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (finfo) { 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Hidden+System+Readonly */ 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo->Attribute = EFI_FILE_READ_ONLY|EFI_FILE_HIDDEN|EFI_FILE_SYSTEM; 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(fd->SetInfo, 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4, 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fd, 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &GenericFileInfo, 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo->Size, 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo); 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FreePool(finfo); 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else efi_errno = EFI_NOT_FOUND; 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid efi_clear_attributes(EFI_FILE_HANDLE fd) 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman EFI_FILE_INFO *finfo; 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT(fd); 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo = LibFileInfo(fd); 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (finfo) { 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo->Attribute = 0; /* no attributes */ 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(fd->SetInfo, 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4, 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman fd, 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman &GenericFileInfo, 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo->Size, 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman finfo); 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman FreePool(finfo); 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else efi_errno = EFI_NOT_FOUND; 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Implement the sync operation using the EFI Flush file operation*/ 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid efi_sync(EFI_FILE_HANDLE fd) 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT(fd); 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(fd->Flush, 1, fd); 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Close the file */ 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid efi_close(EFI_FILE_HANDLE fd) 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ASSERT(fd); 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman efi_errno = uefi_call_wrapper(fd->Close, 1, fd); 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 284