aboutsummaryrefslogtreecommitdiff
path: root/i386
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2023-08-21 01:24:46 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-08-21 01:24:46 +0200
commitf08e34e4ca33cd247d17421f98fbf6e3d96b79be (patch)
treed62bce36b25c1aec78ea51fc120d082effa06413 /i386
parent2b8bf64d3807a3c7eb9c0a88c1469573802d3e26 (diff)
downloadgnumach-f08e34e4ca33cd247d17421f98fbf6e3d96b79be.tar.gz
gnumach-f08e34e4ca33cd247d17421f98fbf6e3d96b79be.tar.bz2
gnumach-f08e34e4ca33cd247d17421f98fbf6e3d96b79be.zip
page segments: Fix more dma32/directmap inversions
We need to make sure segments are in addresses order, and avoid returning dma32 memory when it's not actually within directmap memory.
Diffstat (limited to 'i386')
-rw-r--r--i386/i386/vm_param.h27
-rw-r--r--i386/i386at/biosmem.c7
2 files changed, 22 insertions, 12 deletions
diff --git a/i386/i386/vm_param.h b/i386/i386/vm_param.h
index 19b5d9c1..056aa52e 100644
--- a/i386/i386/vm_param.h
+++ b/i386/i386/vm_param.h
@@ -178,14 +178,23 @@
*/
#define VM_PAGE_SEG_DMA 0
-#ifdef __LP64__
-#define VM_PAGE_SEG_DMA32 1
-#define VM_PAGE_SEG_DIRECTMAP 2
-#define VM_PAGE_SEG_HIGHMEM 3
-#else /* __LP64__ */
-#define VM_PAGE_SEG_DMA32 1 /* Alias for the DIRECTMAP segment */
-#define VM_PAGE_SEG_DIRECTMAP 1
-#define VM_PAGE_SEG_HIGHMEM 2
-#endif /* __LP64__ */
+#if defined(VM_PAGE_DMA32_LIMIT) && (VM_PAGE_DMA32_LIMIT != VM_PAGE_DIRECTMAP_LIMIT)
+
+#if VM_PAGE_DMA32_LIMIT < VM_PAGE_DIRECTMAP_LIMIT
+#define VM_PAGE_SEG_DMA32 (VM_PAGE_SEG_DMA+1)
+#define VM_PAGE_SEG_DIRECTMAP (VM_PAGE_SEG_DMA32+1)
+#define VM_PAGE_SEG_HIGHMEM (VM_PAGE_SEG_DIRECTMAP+1)
+#else /* VM_PAGE_DMA32_LIMIT > VM_PAGE_DIRECTMAP_LIMIT */
+#define VM_PAGE_SEG_DIRECTMAP (VM_PAGE_SEG_DMA+1)
+#define VM_PAGE_SEG_DMA32 (VM_PAGE_SEG_DIRECTMAP+1)
+#define VM_PAGE_SEG_HIGHMEM (VM_PAGE_SEG_DMA32+1)
+#endif
+
+#else
+
+#define VM_PAGE_SEG_DIRECTMAP (VM_PAGE_SEG_DMA+1)
+#define VM_PAGE_SEG_DMA32 VM_PAGE_SEG_DIRECTMAP /* Alias for the DIRECTMAP segment */
+#define VM_PAGE_SEG_HIGHMEM (VM_PAGE_SEG_DIRECTMAP+1)
+#endif
#endif /* _I386_KERNEL_I386_VM_PARAM_ */
diff --git a/i386/i386at/biosmem.c b/i386/i386at/biosmem.c
index 6d0a03ae..03736af3 100644
--- a/i386/i386at/biosmem.c
+++ b/i386/i386at/biosmem.c
@@ -840,10 +840,11 @@ biosmem_directmap_end(void)
{
if (biosmem_segment_size(VM_PAGE_SEG_DIRECTMAP) != 0)
return biosmem_segment_end(VM_PAGE_SEG_DIRECTMAP);
- else if (biosmem_segment_size(VM_PAGE_SEG_DMA32) != 0)
+#if defined(VM_PAGE_DMA32_LIMIT) && (VM_PAGE_DMA32_LIMIT < VM_PAGE_DIRECTMAP_LIMIT)
+ if (biosmem_segment_size(VM_PAGE_SEG_DMA32) != 0)
return biosmem_segment_end(VM_PAGE_SEG_DMA32);
- else
- return biosmem_segment_end(VM_PAGE_SEG_DMA);
+#endif
+ return biosmem_segment_end(VM_PAGE_SEG_DMA);
}
static const char * __init