summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--host/lib/crossystem.c54
-rw-r--r--utility/crossystem_main.c1
2 files changed, 51 insertions, 4 deletions
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c
index 5951e10b..17f4f505 100644
--- a/host/lib/crossystem.c
+++ b/host/lib/crossystem.c
@@ -54,6 +54,10 @@
#define BINF0_S3_RESUME_FAILED 10
/* Recovery caused by TPM error */
#define BINF0_RECOVERY_TPM_ERROR 11
+/* Firmware types from BINF.3 */
+#define BINF3_RECOVERY 0
+#define BINF3_NORMAL 1
+#define BINF3_DEVELOPER 2
/* Base name for ACPI files */
#define ACPI_BASE_PATH "/sys/devices/platform/chromeos_acpi"
@@ -69,9 +73,12 @@
#define GPIO_BASE_PATH "/sys/class/gpio"
#define GPIO_EXPORT_PATH GPIO_BASE_PATH "/export"
-/* Base name for NVRAM file */
+/* Filename for NVRAM file */
#define NVRAM_PATH "/dev/nvram"
+/* Filename for kernel command line */
+#define KERNEL_CMDLINE_PATH "/proc/cmdline"
+
/* Copy up to dest_size-1 characters from src to dest, ensuring null
termination (which strncpy() doesn't do). Returns the destination
@@ -414,11 +421,11 @@ const char* VbReadMainFwType(char* dest, int size) {
/* Try reading type from BINF.3 */
switch(ReadFileInt(ACPI_BINF_PATH ".3")) {
- case 0:
+ case BINF3_RECOVERY:
return StrCopy(dest, "recovery", size);
- case 1:
+ case BINF3_NORMAL:
return StrCopy(dest, "normal", size);
- case 2:
+ case BINF3_DEVELOPER:
return StrCopy(dest, "developer", size);
default:
break; /* Fall through to legacy handling */
@@ -450,6 +457,43 @@ const char* VbReadMainFwType(char* dest, int size) {
}
+/* Determine whether OS-level debugging should be allowed. Passed the
+ * destination and its size. Returns 1 if yes, 0 if no, -1 if error. */
+int VbGetCrosDebug(void) {
+ FILE* f = NULL;
+ char buf[4096] = "";
+ int binf3;
+ char *t, *saveptr;
+
+ /* Try reading firmware type from BINF.3. */
+ binf3 = ReadFileInt(ACPI_BINF_PATH ".3");
+ if (BINF3_RECOVERY == binf3)
+ return 0; /* Recovery mode never allows debug. */
+ else if (BINF3_DEVELOPER == binf3)
+ return 1; /* Developer firmware always allows debug. */
+
+ /* Normal new firmware, older ChromeOS firmware, or non-Chrome firmware.
+ * For all these cases, check /proc/cmdline for cros_debug. */
+ f = fopen(KERNEL_CMDLINE_PATH, "rt");
+ if (f) {
+ if (NULL == fgets(buf, sizeof(buf), f))
+ *buf = 0;
+ fclose(f);
+ }
+ for (t = strtok_r(buf, " ", &saveptr); t; t=strtok_r(NULL, " ", &saveptr)) {
+ if (0 == strcmp(t, "cros_debug"))
+ return 1;
+ }
+
+ /* Normal new firmware or older Chrome OS firmware allows debug if the
+ * dev switch is on. */
+ if (1 == ReadFileBit(ACPI_CHSW_PATH, CHSW_DEV_BOOT))
+ return 1;
+
+ /* All other cases disallow debug. */
+ return 0;
+}
+
/* Read a system property integer.
*
@@ -512,6 +556,8 @@ int VbGetSystemPropertyInt(const char* name) {
return VbGetRecoveryReason();
} else if (!strcasecmp(name,"fmap_base")) {
value = ReadFileInt(ACPI_FMAP_PATH);
+ } else if (!strcasecmp(name,"cros_debug")) {
+ value = VbGetCrosDebug();
}
return value;
diff --git a/utility/crossystem_main.c b/utility/crossystem_main.c
index 35d6ea70..584de594 100644
--- a/utility/crossystem_main.c
+++ b/utility/crossystem_main.c
@@ -34,6 +34,7 @@ const Param sys_param_list[] = {
{"savedmem_size", 0, 0, "RAM debug data area size in bytes"},
{"fmap_base", 0, 0, "Main firmware flashmap physical address", "0x%08x"},
{"tried_fwb", 0, 0, "Tried firmware B before A this boot"},
+ {"cros_debug", 0, 0, "OS should allow debug features"},
/* Read-only strings */
{"hwid", 1, 0, "Hardware ID"},
{"fwid", 1, 0, "Active firmware ID"},