Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/x86/x86 If hvm_start_info has no memmap_entries, fa...



details:   https://anonhg.NetBSD.org/src/rev/3782217e95da
branches:  trunk
changeset: 971763:3782217e95da
user:      bouyer <bouyer%NetBSD.org@localhost>
date:      Sun May 03 17:22:03 2020 +0000

description:
If hvm_start_info has no memmap_entries, fall back to XENMEM_memory_map
hypercall.

diffstat:

 sys/arch/x86/x86/x86_machdep.c |  60 +++++++++++++++++++++++++++++------------
 1 files changed, 42 insertions(+), 18 deletions(-)

diffs (88 lines):

diff -r 396aba0ffad1 -r 3782217e95da sys/arch/x86/x86/x86_machdep.c
--- a/sys/arch/x86/x86/x86_machdep.c    Sun May 03 16:32:16 2020 +0000
+++ b/sys/arch/x86/x86/x86_machdep.c    Sun May 03 17:22:03 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: x86_machdep.c,v 1.141 2020/05/02 16:44:36 bouyer Exp $ */
+/*     $NetBSD: x86_machdep.c,v 1.142 2020/05/03 17:22:03 bouyer Exp $ */
 
 /*-
  * Copyright (c) 2002, 2006, 2007 YAMAMOTO Takashi,
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.141 2020/05/02 16:44:36 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.142 2020/05/03 17:22:03 bouyer Exp $");
 
 #include "opt_modular.h"
 #include "opt_physmem.h"
@@ -846,6 +846,45 @@
        }
 }
 
+#ifdef XEN
+static void
+x86_add_xen_clusters(void)
+{
+       if (hvm_start_info->memmap_entries > 0) {
+               struct hvm_memmap_table_entry *map_entry;
+               map_entry = (void *)((uintptr_t)hvm_start_info->memmap_paddr + KERNBASE);
+               for (int i = 0; i < hvm_start_info->memmap_entries; i++) {
+                       if (map_entry[i].size < PAGE_SIZE)
+                               continue;
+                       switch(map_entry[i].type) {
+                       case XEN_HVM_MEMMAP_TYPE_RAM:
+                               x86_add_cluster(map_entry[i].addr,
+                                   map_entry[i].size, BIM_Memory);
+                               break;
+                       case XEN_HVM_MEMMAP_TYPE_ACPI:
+                               x86_add_cluster(map_entry[i].addr,
+                                   map_entry[i].size, BIM_ACPI);
+                               break;
+                       }
+               }
+       } else {
+               struct xen_memory_map memmap;
+               static struct _xen_mmap {
+                       struct btinfo_memmap bim;
+                       struct bi_memmap_entry map[128]; /* same as FreeBSD */
+               } __packed xen_mmap;
+               int err;
+
+               memmap.nr_entries = 128;
+               set_xen_guest_handle(memmap.buffer, &xen_mmap.bim.entry[0]);
+               if ((err = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap))
+                   < 0)
+                       panic("XENMEM_memory_map %d", err);
+               xen_mmap.bim.num = memmap.nr_entries;
+               x86_parse_clusters(&xen_mmap.bim);
+       }
+}
+#endif /* XEN */
 /*
  * init_x86_clusters: retrieve the memory clusters provided by the BIOS, and
  * initialize mem_clusters.
@@ -862,22 +901,7 @@
         */
 #ifdef XEN
        if (vm_guest == VM_GUEST_XENPVH) {
-               struct hvm_memmap_table_entry *map_entry;
-               map_entry = (void *)((uintptr_t)hvm_start_info->memmap_paddr + KERNBASE);
-               for (int i = 0; i < hvm_start_info->memmap_entries; i++) {
-                       if (map_entry[i].size < PAGE_SIZE)
-                               continue;
-                       switch(map_entry[i].type) {
-                       case XEN_HVM_MEMMAP_TYPE_RAM:
-                               x86_add_cluster(map_entry[i].addr,
-                                   map_entry[i].size, BIM_Memory);
-                               break;
-                       case XEN_HVM_MEMMAP_TYPE_ACPI:
-                               x86_add_cluster(map_entry[i].addr,
-                                   map_entry[i].size, BIM_ACPI);
-                               break;
-                       }
-               }
+               x86_add_xen_clusters();
        }
 #endif /* XEN */
 



Home | Main Index | Thread Index | Old Index