[kernel][x86] Add ZBI_TYPE_PLATFORM_ID to x86.

Add support to parse (and patch for mexec) the ZBI_TYPE_PLATFORM_ID
record type.

Bug: ZX-2655

Test: Boot on NUC.
Change-Id: I060a2918d7ec39635bc969efc2b26fb3a0d00aac
diff --git a/kernel/platform/pc/include/platform/pc/bootloader.h b/kernel/platform/pc/include/platform/pc/bootloader.h
index 497a63a..5e1edf0 100644
--- a/kernel/platform/pc/include/platform/pc/bootloader.h
+++ b/kernel/platform/pc/include/platform/pc/bootloader.h
@@ -31,6 +31,9 @@
     zbi_swfb_t fb;
     zbi_uart_t uart;
     zbi_nvram_t nvram;
+
+    uint64_t platform_id_size;
+    zbi_platform_id_t platform_id;
 } pc_bootloader_info_t;
 
 extern pc_bootloader_info_t bootloader;
diff --git a/kernel/platform/pc/platform.cpp b/kernel/platform/pc/platform.cpp
index d0c6725..e11ed5b 100644
--- a/kernel/platform/pc/platform.cpp
+++ b/kernel/platform/pc/platform.cpp
@@ -86,6 +86,12 @@
 
 zbi_result_t process_zbi_item(zbi_header_t* hdr, void* payload, void* cookie) {
     switch (hdr->type) {
+    case ZBI_TYPE_PLATFORM_ID:
+        if (hdr->length >= sizeof(zbi_platform_id_t)) {
+            memcpy(&bootloader.platform_id, payload, sizeof(zbi_platform_id_t));
+            bootloader.platform_id_size = sizeof(zbi_platform_id_t);
+        }
+        break;
     case ZBI_TYPE_ACPI_RSDP:
         if (hdr->length >= sizeof(uint64_t)) {
             bootloader.acpi_rsdp = *((uint64_t*)payload);
@@ -496,7 +502,6 @@
                ctx.ret);
         return ctx.ret;
     }
-
     zbi::Zbi image(bootdata, len);
     zbi_result_t result;
 
@@ -513,6 +518,19 @@
         return ZX_ERR_INTERNAL;
     }
 
+    // Append platform id
+    if (bootloader.platform_id_size) {
+        result = image.AppendSection(sizeof(bootloader.platform_id),
+                                     ZBI_TYPE_PLATFORM_ID, kNoZbiExtra,
+                                     kNoZbiFlags,
+                                     reinterpret_cast<uint8_t *>(&bootloader.platform_id));
+        if (result != ZBI_RESULT_OK) {
+            printf("mexec: Failed to append platform id to bootdata. "
+                   "len = %lu, section length = %lu, retcode = %d\n", len,
+                   sizeof(bootloader.platform_id), result);
+            return ZX_ERR_INTERNAL;
+        }
+    }
     // Append information about the framebuffer to the bootdata
     if (bootloader.fb.base) {
         result = image.AppendSection(sizeof(bootloader.fb),