aboutsummaryrefslogtreecommitdiff
path: root/i386/i386at
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2023-08-09 23:55:34 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-08-09 23:58:07 +0200
commiteff4f7477b38b5b794ce1ede7766af1dcb6f8fde (patch)
tree870db1a361e7ad39d01d552f6ba4c7b3633ff3e2 /i386/i386at
parent486fba5505fc0c579321fd8cc125bac8058d197f (diff)
downloadgnumach-eff4f7477b38b5b794ce1ede7766af1dcb6f8fde.tar.gz
gnumach-eff4f7477b38b5b794ce1ede7766af1dcb6f8fde.tar.bz2
gnumach-eff4f7477b38b5b794ce1ede7766af1dcb6f8fde.zip
Fix missing DMA32 limit
Rumpdisk needs to allocate dma32 memory areas, so we do always need this limit. The non-Xen x86_64 case had a typo, and the 32bit PAE case didn't have the DMA32 limit. Also, we have to cope with VM_PAGE_DMA32_LIMIT being either above or below VM_PAGE_DIRECTMAP_LIMIT depending on the cases.
Diffstat (limited to 'i386/i386at')
-rw-r--r--i386/i386at/biosmem.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/i386/i386at/biosmem.c b/i386/i386at/biosmem.c
index 880989fe..6d0a03ae 100644
--- a/i386/i386at/biosmem.c
+++ b/i386/i386at/biosmem.c
@@ -692,7 +692,9 @@ biosmem_bootstrap_common(void)
biosmem_set_segment(VM_PAGE_SEG_DMA, phys_start, phys_end);
phys_start = VM_PAGE_DMA_LIMIT;
+
#ifdef VM_PAGE_DMA32_LIMIT
+#if VM_PAGE_DMA32_LIMIT < VM_PAGE_DIRECTMAP_LIMIT
phys_end = VM_PAGE_DMA32_LIMIT;
error = biosmem_map_find_avail(&phys_start, &phys_end);
@@ -702,7 +704,9 @@ biosmem_bootstrap_common(void)
biosmem_set_segment(VM_PAGE_SEG_DMA32, phys_start, phys_end);
phys_start = VM_PAGE_DMA32_LIMIT;
+#endif
#endif /* VM_PAGE_DMA32_LIMIT */
+
phys_end = VM_PAGE_DIRECTMAP_LIMIT;
error = biosmem_map_find_avail(&phys_start, &phys_end);
@@ -712,6 +716,21 @@ biosmem_bootstrap_common(void)
biosmem_set_segment(VM_PAGE_SEG_DIRECTMAP, phys_start, phys_end);
phys_start = VM_PAGE_DIRECTMAP_LIMIT;
+
+#ifdef VM_PAGE_DMA32_LIMIT
+#if VM_PAGE_DMA32_LIMIT > VM_PAGE_DIRECTMAP_LIMIT
+ phys_end = VM_PAGE_DMA32_LIMIT;
+ error = biosmem_map_find_avail(&phys_start, &phys_end);
+
+ if (error)
+ return;
+
+ biosmem_set_segment(VM_PAGE_SEG_DMA32, phys_start, phys_end);
+
+ phys_start = VM_PAGE_DMA32_LIMIT;
+#endif
+#endif /* VM_PAGE_DMA32_LIMIT */
+
phys_end = VM_PAGE_HIGHMEM_LIMIT;
error = biosmem_map_find_avail(&phys_start, &phys_end);