// *++
//
// Copyright (c) 2014, ARM Ltd. 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.
//
//
// Module Name:
//
//   RunAxfStrings.uni
//
// Abstract:
//
//   String definitions for the Shell 'runaxf' command
//
// Revision History:
//
// --*/

/=#

#langdef   en-US "English"

#string STR_RUNAXF_BAD_FILE        #language en-US  "File type not supported\n"
#string STR_RUNAXF_BAD_ARCH        #language en-US  "Architecture not supported\n"
#string STR_RUNAXF_INVALID_ARG     #language en-US  "Invalid argument(s)\n"
#string STR_RUNAXF_FILE_NOT_FOUND  #language en-US  "File not found : %s\n"
#string STR_RUNAXF_NO_MEM          #language en-US  "Out of Memory\n"
#string STR_RUNAXF_READ_FAIL       #language en-US  "Failed to read file\n"

#string STR_RUNAXF_ELFMAGIC        #language en-US  "Wrong magic number. The file is either not an ELF binary or it is corrupted.\n"
#string STR_RUNAXF_ELFNOTEXEC      #language en-US  "Wrong ELF file type, expected an executable file.\n"
#string STR_RUNAXF_ELFNOPROG       #language en-US  "No program header table found in ELF file.\n"
#string STR_RUNAXF_ELFWRONGCLASS   #language en-US  "Invalid ELF Class type.\n"
#string STR_RUNAXF_ELFBADFORMAT    #language en-US  "ELF file format is incorrect (filesize > memorysize).\n"
#string STR_RUNAXF_ELFBADHEADER    #language en-US  "Invalid ELF header.\n"
#string STR_RUNAXF_ELFFAILSEG      #language en-US  "Failed to load segment from ELF file.\n
#string STR_RUNAXF_ELFNOSEG        #language en-US  "The ELF file must have at least 1 loadable segment.\n"

#string STR_RUNAXF_ELFWRONGCLASS_32  #language en-US  "Wrong file class, expected 32-bit ELF file.\n"
#string STR_RUNAXF_ELFWRONGCLASS_64  #language en-US  "Wrong file class, expected 64-bit ELF file.\n"
#string STR_RUNAXF_ELFWRONGMACH_32   #language en-US  "Wrong machine type, expected ARM.\n"
#string STR_RUNAXF_ELFWRONGMACH_64   #language en-US  "Wrong machine type, expected AARCH64.\n"

#string STR_GET_HELP_RUNAXF        #language en-US ""
".TH runaxf 0 "load and execute AXF binary"\r\n"
".SH NAME\r\n"
"Loads and executes ARM Executable File (AXF).\r\n"
".SH SYNOPSIS\r\n"
"runaxf file\r\n"
".SH OPTIONS\r\n"
"file        AXF binary to load and execute.\r\n"
".SH DESCRIPTION\r\n"
"Loads and executes ARM Executable File (AXF). This function is not expected to return.\r\n"

".SH RETURNVALUES\r\n"
"SHELL_DEVICE_ERROR       The operation failed to complete.\r\n"
"SHELL_INVALID_PARAMETER  One of the passed in parameters was incorrectly formatted or its value was out of bounds.\r\n"
"SHELL_UNSUPPORTED        The action as requested was unsupported.\r\n"
"SHELL_OUT_OF_RESOURCES   There was insufficient free space for the request to be completed.\r\n"
".SH EXAMPLES\r\n"
"  fs0:\> runaxf file.axf\r\n"
