| Index: host/lib/crossystem.c
|
| diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c
|
| index 5951e10b7bd839c24e6e8f3b65a8d54dd6b672bb..17f4f505c764c3677d785b4101fa729e2f9ad608 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;
|
|
|