Index: host/lib/crossystem.c |
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c |
index c3bee7529aa1d4fc891e534d8e8fc7b570c15d63..277749b9bf2a91f22ea0509f46c7dee83d95bc54 100644 |
--- a/host/lib/crossystem.c |
+++ b/host/lib/crossystem.c |
@@ -83,6 +83,16 @@ int ReadFileBit(const char* filename, int bitmask) { |
} |
+/* Return true if the FWID starts with the specified string. */ |
+static int FwidStartsWith(const char *start) { |
+ char fwid[128]; |
+ if (!VbGetSystemPropertyString("fwid", fwid, sizeof(fwid))) |
+ return 0; |
+ |
+ return 0 == strncmp(fwid, start, strlen(start)); |
+} |
+ |
+ |
/* Read a GPIO of the specified signal type (see ACPI GPIO SignalType). |
* |
* Returns 1 if the signal is asserted, 0 if not asserted, or -1 if error. */ |
@@ -155,25 +165,31 @@ int ReadGpio(int signal_type) { |
* |
* Returns the property value, or -1 if error. */ |
int VbGetSystemPropertyInt(const char* name) { |
+ int value = -1; |
if (!strcasecmp(name,"devsw_cur")) { |
- return ReadGpio(GPIO_SIGNAL_TYPE_DEV); |
+ value = ReadGpio(GPIO_SIGNAL_TYPE_DEV); |
} else if (!strcasecmp(name,"devsw_boot")) { |
- return ReadFileBit(ACPI_CHSW_PATH, CHSW_DEV_BOOT); |
+ value = ReadFileBit(ACPI_CHSW_PATH, CHSW_DEV_BOOT); |
} else if (!strcasecmp(name,"recoverysw_cur")) { |
- return ReadGpio(GPIO_SIGNAL_TYPE_RECOVERY); |
+ value = ReadGpio(GPIO_SIGNAL_TYPE_RECOVERY); |
} else if (!strcasecmp(name,"recoverysw_boot")) { |
- return ReadFileBit(ACPI_CHSW_PATH, CHSW_RECOVERY_BOOT); |
+ value = ReadFileBit(ACPI_CHSW_PATH, CHSW_RECOVERY_BOOT); |
} else if (!strcasecmp(name,"recoverysw_ec_boot")) { |
- return ReadFileBit(ACPI_CHSW_PATH, CHSW_RECOVERY_EC_BOOT); |
+ value = ReadFileBit(ACPI_CHSW_PATH, CHSW_RECOVERY_EC_BOOT); |
} else if (!strcasecmp(name,"wpsw_cur")) { |
- return ReadGpio(GPIO_SIGNAL_TYPE_WP); |
+ value = ReadGpio(GPIO_SIGNAL_TYPE_WP); |
+ if (-1 != value && FwidStartsWith("Mario.")) |
+ value = 1 - value; /* Mario reports this backwards */ |
} else if (!strcasecmp(name,"wpsw_boot")) { |
- return ReadFileBit(ACPI_CHSW_PATH, CHSW_WP_BOOT); |
- } else |
- return -1; |
+ value = ReadFileBit(ACPI_CHSW_PATH, CHSW_WP_BOOT); |
+ if (-1 != value && FwidStartsWith("Mario.")) |
+ value = 1 - value; /* Mario reports this backwards */ |
+ } |
/* TODO: remaining properties from spec */ |
+ |
+ return value; |
} |