[guest][vmm] Allow smaller regions of memory

Allow smaller regions of memory to be mapped, and only call SetDefaults
once after all parsing has been completed.

MAC-180

Test: Ran "linux_guest" on a VIM2 with a modified bootloader.
Change-Id: I51987786bdd7031b1a0a7e39d215368372c34f24
diff --git a/bin/guest/vmm/guest_config.cc b/bin/guest/vmm/guest_config.cc
index c2664d7..289a9e0 100644
--- a/bin/guest/vmm/guest_config.cc
+++ b/bin/guest/vmm/guest_config.cc
@@ -214,8 +214,6 @@
   return parse_number(tokens[1], &out->options, fxl::Base::k10);
 }
 
-constexpr size_t kMinMemorySize = 1 << 20;
-
 static zx_status_t parse_memory(const std::string& value, size_t* out) {
   char modifier = 'b';
   size_t size;
@@ -224,6 +222,7 @@
     FXL_LOG(ERROR) << "Value is not a size string: " << value;
     return ZX_ERR_INVALID_ARGS;
   }
+
   switch (modifier) {
     case 'b':
       break;
@@ -241,12 +240,6 @@
       return ZX_ERR_INVALID_ARGS;
   }
 
-  if (size < kMinMemorySize) {
-    FXL_LOG(ERROR) << "Requested memory " << size
-                   << " is less than the minimum supported size "
-                   << kMinMemorySize;
-    return ZX_ERR_INVALID_ARGS;
-  }
   *out = size;
   return ZX_OK;
 }
@@ -349,7 +342,6 @@
     }
   }
 
-  SetDefaults();
   return ZX_OK;
 }
 
@@ -399,6 +391,5 @@
     return ZX_ERR_INVALID_ARGS;
   }
 
-  SetDefaults();
   return ZX_OK;
 }
diff --git a/bin/guest/vmm/guest_config.h b/bin/guest/vmm/guest_config.h
index b5ee709..213e6ad 100644
--- a/bin/guest/vmm/guest_config.h
+++ b/bin/guest/vmm/guest_config.h
@@ -75,12 +75,11 @@
 
   zx_status_t ParseArgcArgv(int argc, char** argv);
   zx_status_t ParseConfig(const std::string& data);
+  void SetDefaults();
 
  private:
   GuestConfig* cfg_;
   std::unordered_map<std::string, OptionHandler> opts_;
-
-  void SetDefaults();
 };
 
 #endif  // GARNET_BIN_GUEST_VMM_GUEST_CONFIG_H_
diff --git a/bin/guest/vmm/guest_config_unittest.cc b/bin/guest/vmm/guest_config_unittest.cc
index 1336810..631b736 100644
--- a/bin/guest/vmm/guest_config_unittest.cc
+++ b/bin/guest/vmm/guest_config_unittest.cc
@@ -231,10 +231,6 @@
   EXPECT_EQ(MemoryPolicy::GUEST_CACHED, memory[1].policy);
 }
 
-TEST_F(GuestConfigParserTest, Memory_TooSmall) {
-  ASSERT_EQ(ZX_ERR_INVALID_ARGS, ParseArg("--memory=1k"));
-}
-
 TEST_F(GuestConfigParserTest, Memory_IllegalModifier) {
   ASSERT_EQ(ZX_ERR_INVALID_ARGS, ParseArg("--memory=5l"));
 }
diff --git a/bin/guest/vmm/main.cc b/bin/guest/vmm/main.cc
index 33d6c86..3c55df9 100644
--- a/bin/guest/vmm/main.cc
+++ b/bin/guest/vmm/main.cc
@@ -77,7 +77,12 @@
       return status;
     }
   }
-  return parser.ParseArgcArgv(argc, argv);
+  zx_status_t status = parser.ParseArgcArgv(argc, argv);
+  if (status != ZX_OK) {
+    return status;
+  }
+  parser.SetDefaults();
+  return ZX_OK;
 }
 
 static zx_gpaddr_t alloc_device_addr(size_t device_size) {