Index: host/lib/crossystem.c |
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c |
index b43c502d23437b2e2fd9d9a43ae5f0d964985c7d..6ba67e6460800ea0e84f30ae4a56a05e7664f91a 100644 |
--- a/host/lib/crossystem.c |
+++ b/host/lib/crossystem.c |
@@ -16,6 +16,7 @@ |
#include "utility.h" |
#include "vboot_common.h" |
#include "vboot_nvstorage.h" |
+#include "vboot_struct.h" |
/* ACPI constants from Chrome OS Main Processor Firmware Spec */ |
/* GPIO signal types */ |
@@ -87,10 +88,23 @@ |
/* A structure to contain buffer data retrieved from the ACPI. */ |
typedef struct { |
int buffer_size; |
- void* buffer; |
+ uint8_t* buffer; |
} AcpiBuffer; |
+/* Fields that GetVdatString() can get */ |
+typedef enum VdatStringField { |
+ VDAT_STRING_TIMERS = 0, /* Timer values */ |
+ VDAT_STRING_LOAD_FIRMWARE_DEBUG /* LoadFirmware() debug information */ |
+} VdatStringField; |
+ |
+ |
+/* Fields that GetVdatInt() can get */ |
+typedef enum VdatIntField { |
+ VDAT_INT_FLAGS = 0 /* Flags */ |
+} VdatIntField; |
+ |
+ |
/* Copy up to dest_size-1 characters from src to dest, ensuring null |
termination (which strncpy() doesn't do). Returns the destination |
string. */ |
@@ -319,7 +333,7 @@ AcpiBuffer* VbGetBuffer(const char* filename) |
do { |
struct stat fs; |
- unsigned char* output_ptr; |
+ uint8_t* output_ptr; |
int rv, i, real_size; |
rv = stat(filename, &fs); |
@@ -334,23 +348,18 @@ AcpiBuffer* VbGetBuffer(const char* filename) |
if (!file_buffer) |
break; |
- |
real_size = fread(file_buffer, 1, fs.st_size, f); |
if (!real_size) |
break; |
+ file_buffer[real_size] = '\0'; |
- /* each byte in the output will replace two characters and a space in the |
- * input, so the output size does not exceed input side/3 (a little less |
- * if account for newline characters). |
- */ |
+ /* Each byte in the output will replace two characters and a space |
+ * in the input, so the output size does not exceed input side/3 |
+ * (a little less if account for newline characters). */ |
acpi_buffer = Malloc(sizeof(AcpiBuffer) + real_size/3); |
- |
if (!acpi_buffer) |
break; |
- |
- file_buffer[real_size] = '\0'; |
- |
- acpi_buffer->buffer = acpi_buffer + 1; |
+ acpi_buffer->buffer = (uint8_t*)(acpi_buffer + 1); |
acpi_buffer->buffer_size = 0; |
output_ptr = acpi_buffer->buffer; |
@@ -604,6 +613,71 @@ int VbGetCrosDebug(void) { |
} |
+char* GetVdatString(char* dest, int size, VdatStringField field) |
+{ |
+ VbSharedDataHeader* sh; |
+ AcpiBuffer* ab = VbGetBuffer(ACPI_VDAT_PATH); |
+ if (!ab) |
+ return NULL; |
+ |
+ sh = (VbSharedDataHeader*)ab->buffer; |
+ |
+ switch (field) { |
+ case VDAT_STRING_TIMERS: |
+ snprintf(dest, size, |
+ "LFS=%" PRIu64 ",%" PRIu64 |
+ " LF=%" PRIu64 ",%" PRIu64 |
+ " LK=%" PRIu64 ",%" PRIu64, |
+ sh->timer_load_firmware_start_enter, |
+ sh->timer_load_firmware_start_exit, |
+ sh->timer_load_firmware_enter, |
+ sh->timer_load_firmware_exit, |
+ sh->timer_load_kernel_enter, |
+ sh->timer_load_kernel_exit); |
+ break; |
+ |
+ case VDAT_STRING_LOAD_FIRMWARE_DEBUG: |
+ snprintf(dest, size, |
+ "check=%d,%d index=0x%02x tpmver=0x%x lowestver=0x%x", |
+ sh->check_fw_a_result, |
+ sh->check_fw_b_result, |
+ sh->firmware_index, |
+ sh->fw_version_tpm_start, |
+ sh->fw_version_lowest); |
+ break; |
+ |
+ default: |
+ Free(ab); |
+ return NULL; |
+ } |
+ |
+ Free(ab); |
+ return dest; |
+} |
+ |
+ |
+int GetVdatInt(VdatIntField field) { |
+ VbSharedDataHeader* sh; |
+ AcpiBuffer* ab = VbGetBuffer(ACPI_VDAT_PATH); |
+ int value = -1; |
+ |
+ if (!ab) |
+ return -1; |
+ |
+ sh = (VbSharedDataHeader*)ab->buffer; |
+ |
+ switch (field) { |
+ case VDAT_INT_FLAGS: |
+ value = (int)sh->flags; |
+ break; |
+ |
+ } |
+ |
+ Free(ab); |
+ return value; |
+} |
+ |
+ |
/* Read a system property integer. |
* |
* Returns the property value, or -1 if error. */ |
@@ -671,37 +745,13 @@ int VbGetSystemPropertyInt(const char* name) { |
value = ReadFileInt(ACPI_FMAP_PATH); |
} else if (!strcasecmp(name,"cros_debug")) { |
value = VbGetCrosDebug(); |
+ } else if (!strcasecmp(name,"vdat_flags")) { |
+ value = GetVdatInt(VDAT_INT_FLAGS); |
} |
return value; |
} |
-/* This function is just an example illustrating the use of VbGetBuffer(). It |
- * converts the binary contents of the buffer into a space delimetered hex |
- * string. It is expected to be replaced with a function which has knowledge |
- * of the buffer data structure. |
- */ |
-char* GetVdatBuffer(void) |
-{ |
- char* buffer, *src, *p; |
- int i; |
- |
- AcpiBuffer* ab = VbGetBuffer(ACPI_VDAT_PATH); |
- if (!ab) |
- return NULL; |
- |
- buffer = Malloc(ab->buffer_size * 3 + 2); |
- p = buffer; |
- src = ab->buffer; |
- for (i = 0; i < ab->buffer_size; i++) { |
- snprintf(p, 4, " %2.2x", *src++); |
- p += 3; |
- } |
- *p = '\0'; |
- Free(ab); |
- return buffer; |
-} |
- |
/* Read a system property string into a destination buffer of the specified |
* size. |
* |
@@ -745,8 +795,10 @@ const char* VbGetSystemPropertyString(const char* name, char* dest, int size) { |
default: |
return NULL; |
} |
- } else if (!strcasecmp(name, "vdat")) { |
- return GetVdatBuffer(); |
+ } else if (!strcasecmp(name, "vdat_timers")) { |
+ return GetVdatString(dest, size, VDAT_STRING_TIMERS); |
+ } else if (!strcasecmp(name, "vdat_lfdebug")) { |
+ return GetVdatString(dest, size, VDAT_STRING_LOAD_FIRMWARE_DEBUG); |
} else |
return NULL; |
} |