From b00771f50a1f9d72852de544cff5cbfd951e71ac Mon Sep 17 00:00:00 2001 From: darylm503 Date: Tue, 28 Jun 2011 02:27:55 +0000 Subject: Add device abstraction code for the UEFI Console and UEFI Shell-based file systems. Make argv use narrow characters instead of wide characters. Add setenv functionality. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11907 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Include/Device/Console.h | 62 +++++++ StdLibPrivateInternalFiles/Include/Device/Device.h | 197 +++++++++++++++++++++ 2 files changed, 259 insertions(+) create mode 100644 StdLibPrivateInternalFiles/Include/Device/Console.h create mode 100644 StdLibPrivateInternalFiles/Include/Device/Device.h (limited to 'StdLibPrivateInternalFiles/Include/Device') diff --git a/StdLibPrivateInternalFiles/Include/Device/Console.h b/StdLibPrivateInternalFiles/Include/Device/Console.h new file mode 100644 index 0000000000..6f65660485 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Device/Console.h @@ -0,0 +1,62 @@ +/** @file + Declarations and macros for the console abstraction. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Depends on , , , +**/ +#ifndef _DEVICE_UEFI_CONSOLE_H +#define _DEVICE_UEFI_CONSOLE_H + +#include +#include + +typedef struct { + UINT32 Column; + UINT32 Row; +} CursorXY; + +typedef union { + UINT64 Offset; + CursorXY XYpos; +} XYoffset; + +/* The members Cookie through Abstraction, inclusive, are the same type and order + for all instance structures. + + All instance structures must be a multiple of sizeof(UINTN) bytes long +*/ +typedef struct { + UINT32 Cookie; ///< Special value identifying this as a valid ConInstance + UINT32 InstanceNum; ///< Which instance is this? Zero-based. + EFI_HANDLE Dev; ///< Pointer to either Input or Output Protocol. + DeviceNode *Parent; ///< Points to the parent Device Node. + struct fileops Abstraction; ///< Pointers to functions implementing this device's abstraction. + UINTN Reserved_1; // Ensure that next member starts on an 8-byte boundary + UINT64 NumRead; ///< Number of characters Read. + UINT64 NumWritten; ///< Number of characters Written. + EFI_INPUT_KEY UnGetKey; ///< One-key pushback, for poll(). + UINT32 Reserved_2; // Force the struct to be a multiple of 8-bytes long +} ConInstance; + +__BEGIN_DECLS + +int +EFIAPI +da_ConOpen( + IN struct __filedes *filp, + IN void *DevInstance, + IN CHAR16 *Path, + IN CHAR16 *Flags +); + +__END_DECLS + +#endif /* _DEVICE_UEFI_CONSOLE_H */ diff --git a/StdLibPrivateInternalFiles/Include/Device/Device.h b/StdLibPrivateInternalFiles/Include/Device/Device.h new file mode 100644 index 0000000000..68eade0523 --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/Device/Device.h @@ -0,0 +1,197 @@ +/** @file + Device Abstraction Utility Routines + + Copyright (c) 2011, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Depends upon: +**/ +#ifndef __DEV_UTILITY_H__ +#define __DEV_UTILITY_H__ + +#define CON_COOKIE 0x62416F49 ///< 'IoAb' + +typedef enum { + PathAbsolute = 0, + PathRelative, + PathMapping, + PathError +} PATH_CLASS; + +typedef struct _Device_Node { + LIST_ENTRY DevList; ///< List of registered device abstractions + const CHAR16 *DevName; + const GUID *DevProto; + void *InstanceList; ///< Array of instances for this device + FO_OPEN OpenFunc; + UINT32 InstanceSize; ///< Size of each instance in the InstanceList + UINT32 NumInstances; ///< Number of instances in InstanceList + UINT32 OpModes; ///< Supported modes of operation +} DeviceNode; + +__BEGIN_DECLS + +extern LIST_ENTRY daDeviceList; ///< List of registered devices. +extern DeviceNode *daDefaultDevice; ///< Device to use if nothing else found +extern DeviceNode *daRootDevice; ///< Device containing the root file system +extern DeviceNode *daCurrentDevice; ///< Device currently being accessed + +/** Add a new device to the device list. + + @param DevName Name of the device to add. + @param DevProto Pointer to the GUID identifying the protocol associated with this device. + If DevProto is NULL, startup code will not try to find instances + of this device. + @param OpenFunc Pointer to the device's Open function. + @param InstanceList Optional pointer to the device's initialized instance list. + If InstanceList is NULL, the application startup code will + scan for instances of the protocol identified by DevProto and + populate the InstanceList in the order those protocols are found. + @param NumInstance Number of instances in InstanceList. + @param Modes Bit-mapped flags indicating operations (R, W, RW, ...) permitted to this device. + +**/ +DeviceNode * EFIAPI __DevRegister( const CHAR16 *DevName, GUID *DevProto, FO_OPEN OpenFunc, + void *InstanceList, int NumInstance, UINT32 InstanceSize, UINT32 Modes); + +/** Find a DeviceNode matching DevName or DevProto, or both. + + If DevName is NULL, then the device name is not used in the search. + If DevProto is NULL, then the protocol GUID is not used in the search. + If both are NULL, then INVALID_PARAMETER is returned. + If both DevName and DevProto are specified, then both must match. + If both are specified but only one matches, then DEVICE_ERROR is returned. + + @param DevName Name of the Device Abstraction to find. + @param DevProto GUID of the Protocol associated with the Device Abstraction. + @param Node Pointer to the pointer to receive the found Device Node's address. + + @retval RETURN_SUCCESS The desired Device Node was found. + @retval RETURN_INVALID_PARAMETER Both DevName and DevProto are NULL or Node is NULL. + @retval RETURN_DEVICE_ERROR One, but not both, of DevNode and DevProto matched. +**/ +EFI_STATUS EFIAPI __DevSearch( CHAR16 *DevName, GUID *DevProto, DeviceNode **Node); + +/** Identify the type of path pointed to by Path. + + Paths are classified based upon their initial character sequences. + ^\\ Absolute Path + ^\. Relative Path + ^[^:\\]: Mapping Path + .* Relative Path + + Mapping paths are broken into two parts at the ':'. The part to the left of the ':' + is the Map Name, pointed to by Path, and the part to the right of the ':' is pointed + to by NewPath. + + If Path was not a Mapping Path, then NewPath is set to Path. + + @param[in] Path Pointer to the path to be classified. + @param[out] NewPath Pointer to the path portion of a mapping path. + + @retval PathAbsolute Path is an absolute path. NewPath points to the first '\'. + @retval PathRelative Path is a relative path. NewPath = Path. + @retval PathMapping Path is a mapping path. NewPath points to the ':'. + @retval PathError Path is NULL. +**/ +PATH_CLASS EFIAPI ClassifyPath(IN wchar_t *Path, OUT wchar_t **NewPath, int * const Length); + +/* Normalize a narrow-character path and produce a wide-character path + that has forward slashes replaced with backslashes. + Backslashes are directory separators in UEFI File Paths. + + It is the caller's responsibility to eventually free() the returned buffer. + + @param[in] path A pointer to the narrow-character path to be normalized. + + @return A pointer to a buffer containing the normalized, wide-character, path. +*/ +wchar_t * +NormalizePath( const char *path); + +/** Process a MBCS path returning the final absolute path and the target device. + + @param path + @param FullPath + @param DevNode + + @retval RETURN_SUCCESS + @retval RETURN_INVALID_PARAMETER + @retval RETURN_NOT_FOUND +**/ +RETURN_STATUS +EFIAPI +ParsePath( const char *path, wchar_t **FullPath, DeviceNode **DevNode, int *Which); + +/** Process a wide character string representing a Mapping Path and extract the instance number. + + The instance number is the sequence of decimal digits immediately to the left + of the ":" in the Map Name portion of a Mapping Path. + + This function is called with a pointer to beginning of the Map Name. + Thus Path[Length] must be a ':' and Path[Length - 1] must be a decimal digit. + If either of these are not true, an instance value of 0 is returned. + + If Path is NULL, an instance value of 0 is returned. + + @param[in] Path Points to the beginning of a Mapping Path + @param[in] Length Number of valid characters to the left of the ':' + + @return Returns either 0 or the value of the contiguous digits to the left of the ':'. +**/ +int +EFIAPI +PathInstance( const wchar_t *Path, int length); + +/** Transform a relative path into an absolute path. + + If Path is NULL, return NULL. + Otherwise, pre-pend the CWD to Path then process the resulting path to: + - Replace "/./" with "/" + - Replace "//../" with "/" + - Do not allow one to back up past the root, "/" + + Also sets the Current Working Device to the Root Device. + + Path must be a previously allocated buffer. PathAdjust will + allocate a new buffer to hold the results of the transformation + then free Path. A pointer to the newly allocated buffer is returned. + + @param[in] Path A pointer to the path to be transformed. This buffer + will always be freed. + + @return A pointer to a buffer containing the transformed path. +**/ +wchar_t * +EFIAPI +PathAdjust(wchar_t *Path); + +/** Replace the leading portion of Path with any aliases. + + Aliases are read from /etc/fstab. If there is an associated device, the + Current Working Device is set to that device. + + Path must be a previously allocated buffer. PathAlias will + allocate a new buffer to hold the results of the transformation + then free Path. A pointer to the newly allocated buffer is returned. + + @param[in] Path A pointer to the original, unaliased, path. This + buffer is always freed. + @param[out] Node Filled in with a pointer to the Device Node describing + the device abstraction associated with this path. + + @return A pointer to a buffer containing the aliased path. +**/ +wchar_t * +EFIAPI +PathAlias(wchar_t *Path, DeviceNode **Node); + +__END_DECLS + +#endif /* __DEV_UTILITY_H__ */ -- cgit v1.2.3