:: commit d56ff6f7cb714ba59aede09551506fb25b31a2f6

Andy-Python-Programmer <andypythonappdeveloper@gmail.com> — 2022-09-12 06:51

parents: fe647a067f

DTB: ensure the `dtb_ptr` is an HHDM address

* Ensure that the `dtb_ptr` is an HHDM address
* If DTB is not found, do not generate the response

Signed-off-by: Andy-Python-Programmer <andypythonappdeveloper@gmail.com>
diff --git a/PROTOCOL.md b/PROTOCOL.md
index 4e01d222..5b656cf2 100644
--- a/PROTOCOL.md
+++ b/PROTOCOL.md
@@ -1079,5 +1079,7 @@ struct limine_dtb_response {
 
 * `dtb_ptr` - Virtual pointer to the device tree blob.
 
+Note: If the DTB cannot be found, the response will *not* be generated.
+
 Note: Information contained in the `/chosen` node may not reflect the information
 given by bootloader tags, and as such the `/chosen` node properties should be ignored.
diff --git a/common/protos/limine.c b/common/protos/limine.c
index 5a33ae55..8745772d 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -540,9 +540,6 @@ FEAT_START
     }
 
 #if defined (UEFI)
-    struct limine_dtb_response *dtb_response =
-        ext_mem_alloc(sizeof(struct limine_dtb_response));
-
     // TODO: Looking for the DTB should be moved out of here and into lib/, because:
     // 1. We will need it for core bring-up for the SMP request.
     // 2. We will need to patch it for the Linux boot protocol to set the initramfs
@@ -555,11 +552,15 @@ FEAT_START
     for (size_t i = 0; i < gST->NumberOfTableEntries; i++) {
         EFI_CONFIGURATION_TABLE *cur_table = &gST->ConfigurationTable[i];
 
-        if (memcmp(&cur_table->VendorGuid, &dtb_guid, sizeof(EFI_GUID)) == 0)
-            dtb_response->dtb_ptr = (uint64_t)(uintptr_t)cur_table->VendorTable;
+        if (memcmp(&cur_table->VendorGuid, &dtb_guid, sizeof(EFI_GUID)) == 0) {
+            struct limine_dtb_response *dtb_response = 
+                ext_mem_alloc(sizeof(struct limine_dtb_response));
+            dtb_response->dtb_ptr = reported_addr((void *)cur_table->VendorTable);
+            dtb_request->response = reported_addr(dtb_response);
+            break;
+        }
     }
 
-    dtb_request->response = reported_addr(dtb_response);
 #endif
 
 FEAT_END
tab: 248 wrap: offon