crossystem devsw_cur returns devsw_boot if virtual dev switch

devsw_cur is really a meaningless concept on systems with virtual dev
switches; it exists primarily to support factory test of physical
developer switches.  However, some plugins use this instead of the
preferred devsw_boot, and it's easier to modify crossystem than the
plugins at this point in time.

BUG=chrome-os-partner:12928
BRANCH=none (affects all current products, but is an OS-level change, not FW)
TEST=manual

- On link, 'crossystem devsw_cur devsw_boot' with dev switch on -> '1 1'
- On link, 'crossystem devsw_cur devsw_boot' with dev switch off -> '0 0'
- On lumpy or earlier, 'crossystem devsw_cur' should return current dev
  switch position; check this by toggling the physical switch without
  rebooting and see that the reported value follows the switch value.

Change-Id: Ie7416e5cb03c133572c32af677b55ed18884dfb8
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/34531
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
(cherry picked from commit 09a8447862c7d111d6abdd7891508df1a8f1cc5b)
Reviewed-on: https://gerrit.chromium.org/gerrit/37255
Reviewed-by: David Hendricks <dhendrix@chromium.org>
Tested-by: Katie Roberts-Hoffman <katierh@chromium.org>
diff --git a/host/arch/arm/lib/crossystem_arch.c b/host/arch/arm/lib/crossystem_arch.c
index f0f7ed0..2534221 100644
--- a/host/arch/arm/lib/crossystem_arch.c
+++ b/host/arch/arm/lib/crossystem_arch.c
@@ -19,6 +19,7 @@
 #include "vboot_common.h"
 #include "vboot_nvstorage.h"
 #include "host_common.h"
+#include "crossystem.h"
 #include "crossystem_arch.h"
 
 #define MOSYS_PATH "/usr/sbin/mosys"
@@ -503,13 +504,18 @@
 }
 
 int VbGetArchPropertyInt(const char* name) {
-  if (!strcasecmp(name, "fmap_base"))
+  if (!strcasecmp(name, "fmap_base")) {
     return ReadFdtInt("fmap-offset");
-  else if (!strcasecmp(name, "devsw_cur"))
+  } else if (!strcasecmp(name, "devsw_cur")) {
+    /* Systems with virtual developer switches return at-boot value */
+    int flags = VbGetSystemPropertyInt("vdat_flags");
+    if ((flags != -1) && (flags & VBSD_HONOR_VIRT_DEV_SWITCH))
+      return VbGetSystemPropertyInt("devsw_boot");
+
     return VbGetVarGpio("developer-switch");
-  else if (!strcasecmp(name, "recoverysw_cur"))
+  } else if (!strcasecmp(name, "recoverysw_cur")) {
     return VbGetVarGpio("recovery-switch");
-  else if (!strcasecmp(name, "wpsw_cur")) {
+  } else if (!strcasecmp(name, "wpsw_cur")) {
     int value;
     /* Try finding the GPIO through the chromeos_arm platform device first. */
     value = VbGetPlatformGpioStatus("write-protect");
diff --git a/host/arch/x86/lib/crossystem_arch.c b/host/arch/x86/lib/crossystem_arch.c
index 448a8ff..23a3bce 100644
--- a/host/arch/x86/lib/crossystem_arch.c
+++ b/host/arch/x86/lib/crossystem_arch.c
@@ -595,7 +595,12 @@
 
   /* Switch positions */
   if (!strcasecmp(name,"devsw_cur")) {
-    value = ReadGpio(GPIO_SIGNAL_TYPE_DEV);
+    /* Systems with virtual developer switches return at-boot value */
+    int flags = VbGetSystemPropertyInt("vdat_flags");
+    if ((flags != -1) && (flags & VBSD_HONOR_VIRT_DEV_SWITCH))
+      value = VbGetSystemPropertyInt("devsw_boot");
+    else
+      value = ReadGpio(GPIO_SIGNAL_TYPE_DEV);
   } else if (!strcasecmp(name,"recoverysw_cur")) {
     value = ReadGpio(GPIO_SIGNAL_TYPE_RECOVERY);
   } else if (!strcasecmp(name,"wpsw_cur")) {