diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-08-09 23:55:34 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-08-09 23:58:07 +0200 |
commit | eff4f7477b38b5b794ce1ede7766af1dcb6f8fde (patch) | |
tree | 870db1a361e7ad39d01d552f6ba4c7b3633ff3e2 /i386/i386at | |
parent | 486fba5505fc0c579321fd8cc125bac8058d197f (diff) | |
download | gnumach-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.c | 19 |
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); |