| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
vm_page_grab_contig does not necessarily allocate at the beginning of
the DMA segment, so rather allocate by hand very early.
|
|
|
|
|
| |
We need to make sure segments are in addresses order, and avoid returning
dma32 memory when it's not actually within directmap memory.
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* i386/i386/vm_param.h: adjust constants to the new kernel map
- the boothdr.S code already sets up a temporary map to higher
addresses, so we can use INIT_VM_MIN_KERNEL_ADDRESS as in xen
- increase the kernel map size to accomodate for bigger structures
and more memory
- adjust kernel max address and directmap limit
* i386/i386at/biosmem.c: enable directmap check also on x86_64
* i386/include/mach/i386/vm_param.h: increase user virtual memory
limit as it's not conflicting with the kernel's anymore
* i386/intel/pmap.h: adjust lin2pdenum_cont() and INTEL_PTE_PFN to the
new kernel map
* x86_64/Makefrag.am: change KERNEL_MAP_BASE to be above 4G, and
according to mcmodel=kernel. This will allow to use the full memory
address space.
Message-Id: <20230212172818.1511405-10-luca@orpolo.org>
|
|
|
|
| |
Message-Id: <20220215064133.68593-1-damien@zamaudio.com>
|
|
|
|
|
|
|
| |
The segment code actually has vm_page entries for reserved pages, and
thus memmmap would reject mapping ACPI pages. Taking the information
from biosmem is much more precise, and indeed knows all hardware quirks
which can now be dropped from memmmap.
|
|
|
|
|
| |
* i386/i386at/biosmem.c: Include <inttypes.h>
(biosmem_map_show, biosmem_load_segment): Use PRIx64.
|
|
|
|
|
|
|
| |
* i386/i386at/biosmem.c (boot_panic): Use %s format instead of passing
the string directly to `panic'.
(biosmem_unregister_boot_data): Use %s format instead of passing
`biosmem_panic_inval_boot_data' directly to `panic'.
|
|
|
|
|
| |
* i386/i386at/biosmem.c (biosmem_type_desc, biosmem_map_show): Define
even if DEBUG is 0. But show biosmem heap addresses only if DEBUG is 1.
|
|
|
|
|
|
|
|
|
|
| |
* i386/i386at/biosmem.c (biosmem_setup): Load the HIGHMEM segment if
present.
(biosmem_free_usable): Report high memory as usable.
* vm/vm_page.c (vm_page_boot_table_size, vm_page_table_size,
vm_page_mem_size, vm_page_mem_free): Scan all segments.
* vm/vm_resident.c (vm_page_grab): Describe allocation strategy
with regard to the HIGHMEM segment.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The old assumption that all physical memory is directly mapped in
kernel space is about to go away. Those variables are directly linked
to that assumption.
* i386/i386/model_dep.h (phys_first_addr): Remove extern declaration.
(phys_last_addr): Likewise.
* i386/i386/phys.c (pmap_zero_page): Use VM_PAGE_DIRECTMAP_LIMIT
instead of phys_last_addr.
(pmap_copy_page, copy_to_phys, copy_from_phys): Likewise.
* i386/i386/trap.c (user_trap): Remove check against phys_last_addr.
* i386/i386at/biosmem.c (biosmem_bootstrap_common): Don't set
phys_last_addr.
* i386/i386at/mem.c (memmmap): Use vm_page_lookup_pa to determine if
a physical address references physical memory.
* i386/i386at/model_dep.c (phys_first_addr): Remove variable.
(phys_last_addr): Likewise.
(pmap_free_pages, pmap_valid_page): Remove functions.
* i386/intel/pmap.c: Include i386at/biosmem.h.
(pa_index): Turn into an alias for vm_page_table_index.
(pmap_bootstrap): Replace uses of phys_first_addr and phys_last_addr
as appropriate.
(pmap_virtual_space): Use vm_page_table_size instead of phys_first_addr
and phys_last_addr to obtain the number of physical pages.
(pmap_verify_free): Remove function.
(valid_page): Turn this macro into an inline function and rewrite
using vm_page_lookup_pa.
(pmap_page_table_page_alloc): Build the pmap VM object using
vm_page_table_size to determine its size.
(pmap_remove_range, pmap_page_protect, phys_attribute_clear,
phys_attribute_test): Turn page indexes into unsigned long integers.
(pmap_enter): Likewise. In addition, use either vm_page_lookup_pa or
biosmem_directmap_end to determine if a physical address references
physical memory.
* i386/xen/xen.c (hyp_p2m_init): Use vm_page_table_size instead of
phys_last_addr to obtain the number of physical pages.
* kern/startup.c (phys_first_addr): Remove extern declaration.
(phys_last_addr): Likewise.
* linux/dev/init/main.c (linux_init): Use vm_page_seg_end with the
appropriate segment selector instead of phys_last_addr to determine
where high memory starts.
* vm/pmap.h: Update requirements description.
(pmap_free_pages, pmap_valid_page): Remove declarations.
* vm/vm_page.c (vm_page_seg_end, vm_page_boot_table_size,
vm_page_table_size, vm_page_table_index): New functions.
* vm/vm_page.h (vm_page_seg_end, vm_page_table_size,
vm_page_table_index): New function declarations.
* vm/vm_resident.c (vm_page_bucket_count, vm_page_hash_mask): Define
as unsigned long integers.
(vm_page_bootstrap): Compute VP table size based on the page table
size instead of the value returned by pmap_free_pages.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Import upstream biosmem changes and adjust for local modifications.
Specifically, this change makes the biosmem module reliably track all
boot data by storing their addresses in a sorted array. This allows
both the early page allocator and the biosmem_free_usable function
to accurately find any range of free pages.
* i386/i386at/biosmem.c: Remove inclusion of <i386at/elf.h>.
(_start, _end): Remove variable declarations.
(BIOSMEM_MAX_BOOT_DATA): New macro.
(struct biosmem_boot_data): New type.
(biosmem_boot_data_array, biosmem_nr_boot_data): New variables.
(biosmem_heap_start, biosmem_heap_bottom, biosmem_heap_top,
biosmem_heap_end): Change type to phys_addr_t.
(biosmem_panic_inval_boot_data): New variable.
(biosmem_panic_too_many_boot_data): Likewise.
(biosmem_panic_toobig_msg): Variable renamed ...
(biosmem_panic_too_big_msg): ... to this.
(biosmem_register_boot_data): New function.
(biosmem_unregister_boot_data): Likewise.
(biosmem_map_adjust): Update reference to panic message.
(biosmem_map_find_avail): Add detailed description.
(biosmem_save_cmdline_sizes): Remove function.
(biosmem_find_heap_clip): Likewise.
(biosmem_find_heap): Likewise.
(biosmem_find_avail_clip, biosmem_find_avail): New functions.
(biosmem_setup_allocator): Receive const multiboot info, replace
calls to biosmem_find_heap with calls to biosmem_find_avail and
update accordingly. Register the heap as boot data.
(biosmem_xen_bootstrap): Register the Xen boot info and the heap as
boot data.
(biosmem_bootstrap): Receive const multiboot information. Remove call
to biosmem_save_cmdline_sizes.
(biosmem_bootalloc): Remove assertion on the VM system state.
(biosmem_type_desc, biosmem_map_show): Build only if DEBUG is true.
(biosmem_unregister_temporary_boot_data): New function.
(biosmem_free_usable_range): Change address range format.
(biosmem_free_usable_entry): Rewrite to use biosmem_find_avail
without abusing it.
(biosmem_free_usable): Call biosmem_unregister_temporary_boot_data,
update call to biosmem_free_usable_entry.
* i386/i386at/biosmem.h (biosmem_register_boot_data): New function.
(biosmem_bootalloc): Update description.
(biosmem_bootstrap): Update description and declaration.
(biosmem_free_usable): Likewise.
* i386/i386at/model_dep.c: Include <i386at/elf.h>.
(machine_init): Update call to biosmem_free_usable.
(register_boot_data): New function.
(i386at_init): Call register_boot_data where appropriate.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Import upstream biosmem and vm_page changes, and adjust for local
modifications.
Specifically, the biosmem module was mistakenly loading physical
segments that did not clip with the heap as completely available.
This change makes it load them as completely unavailable during
startup, and once the VM system is ready, additional pages are
loaded.
* i386/i386at/biosmem.c (DEBUG): New macro.
(struct biosmem_segment): Remove members `avail_start' and `avail_end'.
(biosmem_heap_cur): Remove variable.
(biosmem_heap_bottom, biosmem_heap_top, biosmem_heap_topdown): New variables.
(biosmem_find_boot_data_update, biosmem_find_boot_data): Remove functions.
(biosmem_find_heap_clip, biosmem_find_heap): New functions.
(biosmem_setup_allocator): Rewritten to use the new biosmem_find_heap
function.
(biosmem_bootalloc): Support both bottom-up and top-down allocations.
(biosmem_directmap_size): Renamed to ...
(biosmem_directmap_end): ... this function.
(biosmem_load_segment): Fix segment loading.
(biosmem_setup): Restrict usable memory to the directmap segment.
(biosmem_free_usable_range): Add checks on input parameters.
(biosmem_free_usable_update_start, biosmem_free_usable_start,
biosmem_free_usable_reserved, biosmem_free_usable_end): Remove functions.
(biosmem_free_usable_entry): Rewritten to use the new biosmem_find_heap
function.
(biosmem_free_usable): Restrict usable memory to the directmap segment.
* i386/i386at/biosmem.h (biosmem_bootalloc): Update description.
(biosmem_directmap_size): Renamed to ...
(biosmem_directmap_end): ... this function.
(biosmem_free_usable): Update declaration.
* i386/i386at/model_dep.c (machine_init): Call biosmem_free_usable.
* vm/vm_page.c (DEBUG): New macro.
(struct vm_page_seg): New member `heap_present'.
(vm_page_load): Remove heap related parameters.
(vm_page_load_heap): New function.
* vm/vm_page.h (vm_page_load): Remove heap related parameters. Update
description.
(vm_page_load_heap): New function.
|
|
|
|
| |
* i386/i386at/biosmem.c (biosmem_bootstrap): Remove unused variables.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The Xen target was completely ignored when porting the biosmem and
vm_page physical memory allocators. Let's fix this.
* i386/Makefrag.am (libkernel_a_SOURCES): Add i386/i386at/biosmem.{c,h}.
* i386/i386/vm_page.h (VM_PAGE_MAX_SEGS, VM_PAGE_DIRECTMAP_LIMIT,
VM_PAGE_HIGHMEM_LIMIT): Define for Xen.
* i386/i386at/biosmem.c: Include mach/xen.h.
(biosmem_panic_setup_msg): Comment out for Xen since it's unused.
(biosmem_map_build, biosmem_map_build_simple,
biosmem_save_cmdline_sizes, biosmem_find_boot_data_update,
biosmem_find_boot_data, biosmem_setup_allocator): Likewise.
(biosmem_bootstrap_common): New function.
(biosmem_xen_bootstrap): Likewise, for Xen.
(biosmem_bootalloc): Perform bottom-up allocations for Xen.
* i386/i386at/biosmem.h (biosmem_xen_bootstrap): New prototype, for Xen.
* i386/i386at/model_dep.c (i386at_init): Call biosmem_xen_bootstrap instead
of biosmem_bootstrap on Xen.
* i386/include/mach/i386/vm_types.h (phys_addr_t): Define as an unsigned
64-bits integer when PAE is enabled.
|
|
* i386/i386at/biosmem.c: New file.
* i386/i386at/biosmem.h: Likewise.
|