Home | History | Annotate | Download | only in UefiShellDebug1CommandsLib
      1 /** @file
      2   Main file for Dblk shell Debug1 function.
      3 
      4   (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
      5   Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #include "UefiShellDebug1CommandsLib.h"
     17 #include <Protocol/BlockIo.h>
     18 
     19 /**
     20   Display blocks to the screen.
     21 
     22   @param[in] DevPath      The device path to get the blocks from.
     23   @param[in] Lba          The Lba number to start from.
     24   @param[in] BlockCount   How many blocks to display.
     25 
     26   @retval SHELL_SUCCESS   The display was successful.
     27 **/
     28 SHELL_STATUS
     29 EFIAPI
     30 DisplayTheBlocks(
     31   IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath,
     32   IN CONST UINT64                   Lba,
     33   IN CONST UINT8                    BlockCount
     34   )
     35 {
     36   EFI_BLOCK_IO_PROTOCOL     *BlockIo;
     37   EFI_HANDLE                BlockIoHandle;
     38   EFI_STATUS                Status;
     39   SHELL_STATUS              ShellStatus;
     40   UINT8                     *Buffer;
     41   UINTN                     BufferSize;
     42 
     43   ShellStatus = SHELL_SUCCESS;
     44 
     45   Status = gBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, (EFI_DEVICE_PATH_PROTOCOL **)&DevPath, &BlockIoHandle);
     46   if (EFI_ERROR(Status)) {
     47     return (SHELL_NOT_FOUND);
     48   }
     49 
     50   Status = gBS->OpenProtocol(BlockIoHandle, &gEfiBlockIoProtocolGuid, (VOID**)&BlockIo, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
     51   if (EFI_ERROR(Status)) {
     52     return (SHELL_NOT_FOUND);
     53   }
     54 
     55   BufferSize = BlockIo->Media->BlockSize * BlockCount;
     56   if (BufferSize > 0) {
     57     Buffer     = AllocateZeroPool(BufferSize);
     58   } else {
     59     ShellPrintEx(-1,-1,L"  BlockSize: 0x%08x, BlockCount: 0x%08x\r\n", BlockIo->Media->BlockSize, BlockCount);
     60     Buffer    = NULL;
     61   }
     62 
     63   Status = BlockIo->ReadBlocks(BlockIo, BlockIo->Media->MediaId, Lba, BufferSize, Buffer);
     64   if (!EFI_ERROR(Status) && Buffer != NULL) {
     65     ShellPrintHiiEx(
     66       -1,
     67       -1,
     68       NULL,
     69       STRING_TOKEN (STR_DBLK_HEADER),
     70       gShellDebug1HiiHandle,
     71       Lba,
     72       BufferSize,
     73       BlockIo
     74       );
     75 
     76     DumpHex(2,0,BufferSize,Buffer);
     77   } else {
     78     ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_READ_FAIL), gShellDebug1HiiHandle, L"dblk", L"BlockIo");
     79     ShellStatus = SHELL_DEVICE_ERROR;
     80   }
     81 
     82   if (Buffer != NULL) {
     83     FreePool(Buffer);
     84   }
     85 
     86   gBS->CloseProtocol(BlockIoHandle, &gEfiBlockIoProtocolGuid, gImageHandle, NULL);
     87   return (ShellStatus);
     88 }
     89 
     90 /**
     91   Function for 'dblk' command.
     92 
     93   @param[in] ImageHandle  Handle to the Image (NULL if Internal).
     94   @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
     95 **/
     96 SHELL_STATUS
     97 EFIAPI
     98 ShellCommandRunDblk (
     99   IN EFI_HANDLE        ImageHandle,
    100   IN EFI_SYSTEM_TABLE  *SystemTable
    101   )
    102 {
    103   EFI_STATUS                Status;
    104   LIST_ENTRY                *Package;
    105   CHAR16                    *ProblemParam;
    106   SHELL_STATUS              ShellStatus;
    107   CONST CHAR16              *BlockName;
    108   CONST CHAR16              *LbaString;
    109   CONST CHAR16              *BlockCountString;
    110   UINT64                    Lba;
    111   UINT64                    BlockCount;
    112   EFI_DEVICE_PATH_PROTOCOL  *DevPath;
    113 
    114   ShellStatus         = SHELL_SUCCESS;
    115   Status              = EFI_SUCCESS;
    116 
    117   //
    118   // initialize the shell lib (we must be in non-auto-init...)
    119   //
    120   Status = ShellInitialize();
    121   ASSERT_EFI_ERROR(Status);
    122 
    123   Status = CommandInit();
    124   ASSERT_EFI_ERROR(Status);
    125 
    126   //
    127   // parse the command line
    128   //
    129   Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
    130   if (EFI_ERROR(Status)) {
    131     if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
    132       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"dblk", ProblemParam);
    133       FreePool(ProblemParam);
    134       ShellStatus = SHELL_INVALID_PARAMETER;
    135     } else {
    136       ASSERT(FALSE);
    137     }
    138   } else {
    139     if (ShellCommandLineGetCount(Package) > 4) {
    140       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"dblk");
    141       ShellStatus = SHELL_INVALID_PARAMETER;
    142     } else if (ShellCommandLineGetCount(Package) < 2) {
    143       ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"dblk");
    144       ShellStatus = SHELL_INVALID_PARAMETER;
    145     } else {
    146       //
    147       // Parse the params
    148       //
    149       BlockName         = ShellCommandLineGetRawValue(Package, 1);
    150       LbaString         = ShellCommandLineGetRawValue(Package, 2);
    151       BlockCountString  = ShellCommandLineGetRawValue(Package, 3);
    152 
    153       if (LbaString == NULL) {
    154         Lba = 0;
    155       } else {
    156         if (!ShellIsHexOrDecimalNumber(LbaString, TRUE, FALSE)) {
    157           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", LbaString);
    158           ShellStatus = SHELL_INVALID_PARAMETER;
    159         }
    160         ShellConvertStringToUint64(LbaString, &Lba, TRUE, FALSE);
    161       }
    162 
    163       if (BlockCountString == NULL) {
    164         BlockCount = 1;
    165       } else {
    166         if (!ShellIsHexOrDecimalNumber(BlockCountString, TRUE, FALSE)) {
    167           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockCountString);
    168           ShellStatus = SHELL_INVALID_PARAMETER;
    169         }
    170         ShellConvertStringToUint64(BlockCountString, &BlockCount, TRUE, FALSE);
    171         if (BlockCount > 0x10) {
    172           BlockCount = 0x10;
    173         } else if (BlockCount == 0) {
    174           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockCountString);
    175           ShellStatus = SHELL_INVALID_PARAMETER;
    176         }
    177       }
    178 
    179       if (ShellStatus == SHELL_SUCCESS) {
    180         //
    181         // do the work if we have a valid block identifier
    182         //
    183         if (gEfiShellProtocol->GetDevicePathFromMap(BlockName) == NULL) {
    184           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"dblk", BlockName);
    185           ShellStatus = SHELL_INVALID_PARAMETER;
    186         } else {
    187           DevPath = (EFI_DEVICE_PATH_PROTOCOL*)gEfiShellProtocol->GetDevicePathFromMap(BlockName);
    188           if (gBS->LocateDevicePath(&gEfiBlockIoProtocolGuid, &DevPath, NULL) == EFI_NOT_FOUND) {
    189             ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_MAP_PROTOCOL), gShellDebug1HiiHandle, L"dblk", BlockName, L"BlockIo");
    190             ShellStatus = SHELL_INVALID_PARAMETER;
    191           } else {
    192             ShellStatus = DisplayTheBlocks(gEfiShellProtocol->GetDevicePathFromMap(BlockName), Lba, (UINT8)BlockCount);
    193           }
    194         }
    195       }
    196     }
    197 
    198     ShellCommandLineFreeVarList (Package);
    199   }
    200   return (ShellStatus);
    201 }
    202