Browse Source

From: David Decotigny <decot@googlers.com>
Date: Mon, 28 Jul 2014 21:28:50 -0700
Subject: [PATCH 3/3] make cmdline parsing a 1st class citizen

Refactor ParseCmdline and apps/Alloc+FreePages to factorize
boilerplate and move the new parser to the main API.

Signed-off-by: David Decotigny <decot@googlers.com>
Signed-off-by: Nigel Croxon <nigel.croxon@hp.com>

Nigel Croxon 10 years ago
parent
commit
0ad8fb87cb

+ 4 - 30
gnu-efi-3.0/apps/AllocPages.c

@@ -89,7 +89,6 @@ BS_Code   0000000071902000-00000000721FEFFF 00000000000008FD 000000000000000F
 
 #include <efi.h>
 #include <efilib.h>
-#include <ParseCmdLine.h>
 
 
 #define MAX_NUM_PAGES 0x000000000F000000
@@ -108,12 +107,8 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
 {
 
 	EFI_STATUS efi_status;
-	EFI_GUID LoadedImageProtocol = LOADED_IMAGE_PROTOCOL;
-	EFI_LOADED_IMAGE *info;
-
-	CHAR16 arglist[MAX_ARGS+1] = {0};
-	CHAR16 *argv[MAX_ARGS];
-	INTN argc, arglen;
+	CHAR16 **argv;
+	INTN argc;
 	INTN err = 0;
 #if DEBUG
 	INTN c = 0;
@@ -125,10 +120,6 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
 
 	InitializeLib(image, systab);
 
-        efi_status = uefi_call_wrapper( BS->HandleProtocol, 3, image,
-                &LoadedImageProtocol, &info);
-
-
 	Print(L"AllocatePage: __AllocType__ __MemType__ __NumPages__ [__Addr__]\n");
 	Print(L"__AllocType__ {0,1,2} -- Any, MaxAddr, Addr\n"); 
 	Print(L"__MemType__   {0..13}, Reserved ==0, LCode==1, LData==2, BSCode==3, BSData==4, ...\n");
@@ -138,26 +129,9 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
 	Print(L"\n");
 
 #if DEBUG
-	Print(L"%s\n", info->LoadOptions);
-#endif
-
-
-#if DEBUG
-	Print(L"Set up arglist\n");
-#endif
-	arglen = info->LoadOptionsSize;
-	if (arglen > sizeof(arglist))
-		arglen = sizeof(arglist);
-
-	CopyMem(arglist, info->LoadOptions, arglen);
-#if DEBUG
-	Print(L"arglist = <%s>\n", arglist);
-#endif
-
-#if DEBUG
-	Print(L"Now try ParseCmdLine\n");
+	Print(L"Now get argc/argv\n");
 #endif
-	argc = ParseCmdLine(argv, arglist, arglen);
+	argc = GetShellArgcArgv(image, &argv);
 #if DEBUG
 	Print(L"argc = %d\n", argc);
 #endif

+ 4 - 30
gnu-efi-3.0/apps/FreePages.c

@@ -60,7 +60,6 @@ Available 00000000709FC000-00000000710E3FFF 00000000000006E8 000000000000000F
 
 #include <efi.h>
 #include <efilib.h>
-#include <ParseCmdLine.h>
 
 /*
  * FreePages:  __PhysAddr__ __PgCnt__
@@ -82,12 +81,8 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
 {
 
 	EFI_STATUS efi_status;
-	EFI_GUID LoadedImageProtocol = LOADED_IMAGE_PROTOCOL;
-	EFI_LOADED_IMAGE *info;
-
-	CHAR16 arglist[MAX_ARGS+1] = {0};
-	CHAR16 *argv[MAX_ARGS];
-	INTN argc, arglen;
+	CHAR16 **argv;
+	INTN argc = 0;
 #if DEBUG
 	INTN c = 0;
 #endif
@@ -98,10 +93,6 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
 
 	InitializeLib(image, systab);
 
-        efi_status = uefi_call_wrapper( BS->HandleProtocol, 3, image,
-                &LoadedImageProtocol, &info);
-
-
 	Print(L"FreePages: __PhysAddr__ __PgCnt__\n");
 	Print(L"__PhysAddr__   0... %llx\n", MAX_ADDR);
 	Print(L"__PgCnt__     [0..%lx]\n", MAX_NUM_PAGES);
@@ -109,26 +100,9 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab)
 	Print(L"\n");
 
 #if DEBUG
-	Print(L"%s\n", info->LoadOptions);
-#endif
-
-
-#if DEBUG
-	Print(L"Set up arglist\n");
-#endif
-	arglen = info->LoadOptionsSize;
-	if (arglen > sizeof(arglist))
-		arglen = sizeof(arglist);
-
-	CopyMem(arglist, info->LoadOptions, arglen);
-#if DEBUG
-	Print(L"arglist = <%s>\n", arglist);
-#endif
-
-#if DEBUG
-	Print(L"Now try ParseCmdLine\n");
+	Print(L"Now parse argc/argv\n");
 #endif
-	argc = ParseCmdLine(argv, arglist, arglen);
+	argc = GetShellArgcArgv(image, &argv);
 #if DEBUG
 	Print(L"argc = %d\n", argc);
 #endif

+ 0 - 11
gnu-efi-3.0/inc/ParseCmdLine.h

@@ -1,11 +0,0 @@
-
-
-/*
- * Turn an CHAR16 * command line into a CHAR16 * argv, INT argc pair.
- *
- */
-
-#define MAX_ARGS 512
-
-/* buf will be updated in-place */
-INTN ParseCmdLine(CHAR16 *argv[MAX_ARGS],  CHAR16 *buf, UINTN len);

+ 6 - 0
gnu-efi-3.0/inc/efilib.h

@@ -144,6 +144,12 @@ EFIDebugVariable (
     VOID
     );
 
+INTN
+GetShellArgcArgv(
+    EFI_HANDLE ImageHandle,
+    CHAR16 **Argv[]  /* Statically allocated */
+    );
+
 VOID
 SetCrc (
     IN OUT EFI_TABLE_HEADER *Hdr

+ 1 - 1
gnu-efi-3.0/lib/Makefile

@@ -43,7 +43,7 @@ include $(SRCDIR)/../Make.defaults
 TOPDIR = $(SRCDIR)/..
 
 CDIR = $(TOPDIR)/..
-FILES = ParseCmdLine boxdraw smbios console crc data debug dpath  \
+FILES = boxdraw smbios console crc data debug dpath  \
         error event guid hand hw init lock   \
         misc print sread str \
 	runtime/rtlock runtime/efirtlib runtime/rtstr runtime/vm runtime/rtdata  \

+ 0 - 35
gnu-efi-3.0/lib/ParseCmdLine.c

@@ -1,35 +0,0 @@
-
-/*
- *  Turn an CHAR16 * command line into a CHAR16 * argv, INT argc pair.
- *
- */
-
-
-#include <efi.h>
-#include <efilib.h>
-#include <ParseCmdLine.h>
-
-
-
-INTN ParseCmdLine(CHAR16 *argv[MAX_ARGS], CHAR16 *buf, UINTN len)
-{
-    CHAR16 *arg_start, *c;
-    INTN argc = 0;
-
-    if (len < 2)
-      return -1;
-
-    buf[(len / 2) - 1] = L'\0';
-    for (c = arg_start = buf ; *c ; ++c) {
-      if (*c == L' ') {
-        *c = L'\0';
-        if (argc < MAX_ARGS) argv[argc++] = arg_start;
-        arg_start = c + 1;
-      }
-    }
-
-    if ((*arg_start != L'\0') && (argc < MAX_ARGS))
-      argv[argc++] = arg_start;
-
-    return argc;
-}

+ 48 - 0
gnu-efi-3.0/lib/init.c

@@ -165,6 +165,54 @@ Done:
     }
 }
 
+#ifndef MAX_ARGV_CONTENTS_SIZE
+# define MAX_CMDLINE_SIZE 1024
+#endif
+#ifndef MAX_ARGC
+# define MAX_CMDLINE_ARGC 32
+#endif
+
+INTN
+GetShellArgcArgv(
+    EFI_HANDLE ImageHandle,
+    CHAR16 **ResultArgv[]
+    )
+{
+  EFI_STATUS Status;
+  EFI_LOADED_IMAGE *LoadedImage = NULL;
+  static CHAR16 ArgvContents[MAX_CMDLINE_SIZE];
+  static CHAR16 *Argv[MAX_CMDLINE_ARGC], *ArgStart, *c;
+  UINTN Argc = 0, BufLen;
+
+  Status = uefi_call_wrapper(BS->HandleProtocol, 3,
+                             ImageHandle, &LoadedImageProtocol, &LoadedImage);
+  if (EFI_ERROR(Status))
+    return -1;
+
+  BufLen = LoadedImage->LoadOptionsSize;
+  if (BufLen < 2)  /* We are expecting at least a \0 */
+    return -1;
+  else if (BufLen > sizeof(ArgvContents))
+    BufLen = sizeof(ArgvContents);
+
+  CopyMem(ArgvContents, LoadedImage->LoadOptions, BufLen);
+  ArgvContents[MAX_CMDLINE_SIZE - 1] = L'\0';
+
+  for (c = ArgStart = ArgvContents ; *c != L'\0' ; ++c) {
+    if (*c == L' ') {
+      *c = L'\0';
+      if (Argc < MAX_CMDLINE_ARGC) Argv[Argc++] = ArgStart;
+      ArgStart = c + 1;
+    }
+  }
+
+  if ((*ArgStart != L'\0') && (Argc < MAX_CMDLINE_ARGC))
+    Argv[Argc++] = ArgStart;
+
+  *ResultArgv = Argv;
+  return Argc;
+}
+
 VOID
 EFIDebugVariable (
     VOID