bootloader: Translate kernel args before adding them to kernel_args_range.

Chunks may be physically contiguous, but virtually disjoint. Adding
physical addresses may cause ranges to be merged incorrectly.

Signed-off-by: Jessica Hamilton <jessica.l.hamilton@gmail.com>
This commit is contained in:
Henry Harrington 2014-10-22 18:25:05 +01:00 committed by Jessica Hamilton
parent 21e3ac6cf5
commit 82dcc31606
4 changed files with 14 additions and 19 deletions

View File

@ -28,6 +28,8 @@ extern status_t platform_init_heap(struct stage2_args *args, void **_base, void
extern status_t platform_allocate_region(void **_virtualAddress, size_t size,
uint8 protection, bool exactAddress);
extern status_t platform_free_region(void *address, size_t size);
extern status_t platform_bootloader_address_to_kernel_address(void *address, uint64_t *_result);
extern status_t platform_kernel_address_to_bootloader_address(uint64_t address, void **_result);
/* boot options */
#define BOOT_OPTION_MENU 1

View File

@ -101,15 +101,6 @@ typedef ELFLoader<ELF32Class> ELF32Loader;
#ifdef BOOT_SUPPORT_ELF64
#ifdef _BOOT_PLATFORM_EFI
extern "C" status_t
platform_bootloader_address_to_kernel_address(void *address, uint64_t *_result);
extern "C" status_t
platform_kernel_address_to_bootloader_address(uint64_t address, void **_result);
#endif
struct ELF64Class {
static const uint8 kIdentClass = ELFCLASS64;

View File

@ -370,7 +370,13 @@ kernel_args_malloc(size_t size)
return NULL;
}
#ifdef _BOOT_PLATFORM_EFI
uint64 translated_block;
platform_bootloader_address_to_kernel_address(block, &translated_block);
if (add_kernel_args_range((void *)translated_block, size) != B_OK)
#else
if (add_kernel_args_range(block, size) != B_OK)
#endif
panic("kernel_args max range too low!\n");
return block;
}
@ -385,7 +391,13 @@ kernel_args_malloc(size_t size)
sFirstFree = (void*)((addr_t)block + size);
sLast = block;
sFree = kChunkSize - size;
#ifdef _BOOT_PLATFORM_EFI
uint64 translated_block;
platform_bootloader_address_to_kernel_address(block, &translated_block);
if (add_kernel_args_range((void *)translated_block, kChunkSize) != B_OK)
#else
if (add_kernel_args_range(block, kChunkSize) != B_OK)
#endif
panic("kernel_args max range too low!\n");
return block;

View File

@ -122,16 +122,6 @@ convert_kernel_args()
image = next;
}
// Set correct kernel args range addresses.
dprintf("kernel args ranges:\n");
for (uint32 i = 0; i < gKernelArgs.num_kernel_args_ranges; i++) {
gKernelArgs.kernel_args_range[i].start = fix_address(
gKernelArgs.kernel_args_range[i].start);
dprintf(" base %#018" B_PRIx64 ", length %#018" B_PRIx64 "\n",
gKernelArgs.kernel_args_range[i].start,
gKernelArgs.kernel_args_range[i].size);
}
// Fix driver settings files.
driver_settings_file* file = gKernelArgs.driver_settings;
fix_address(gKernelArgs.driver_settings);