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