summaryrefslogtreecommitdiff
path: root/StdLibPrivateInternalFiles/Include/Device
diff options
context:
space:
mode:
authordarylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-28 02:27:55 +0000
committerdarylm503 <darylm503@6f19259b-4bc3-4df7-8a09-765794883524>2011-06-28 02:27:55 +0000
commitb00771f50a1f9d72852de544cff5cbfd951e71ac (patch)
tree2f1a5e599f295f7c482aeef0ab6f4f4f7988e982 /StdLibPrivateInternalFiles/Include/Device
parent46293a42153faa86393856da12e99fb85a0fca06 (diff)
downloadedk2-platforms-b00771f50a1f9d72852de544cff5cbfd951e71ac.tar.xz
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
Diffstat (limited to 'StdLibPrivateInternalFiles/Include/Device')
-rw-r--r--StdLibPrivateInternalFiles/Include/Device/Console.h62
-rw-r--r--StdLibPrivateInternalFiles/Include/Device/Device.h197
2 files changed, 259 insertions, 0 deletions
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.<BR>
+ 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 <kfile.h>, <Device/Device.h>, <Protocol/SimpleTextIn.h>, <Uefi/UefiBaseType.h>
+**/
+#ifndef _DEVICE_UEFI_CONSOLE_H
+#define _DEVICE_UEFI_CONSOLE_H
+
+#include <kfile.h>
+#include <Device/Device.h>
+
+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.<BR>
+ 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: <kfile.h>
+**/
+#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 "/<dirname>/../" 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__ */