Added safe mode option B_SAFEMODE_4_GB_MEMORY_LIMIT (plus a boot loader menu

item) and kernel settings option "4gb_memory_limit". Enabling either one
causes the memory beyond 4 GB to be ignored.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37225 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2010-06-23 11:13:39 +00:00
parent ff9151d11f
commit 7b1d69ecbb
6 changed files with 63 additions and 0 deletions

View File

@ -59,3 +59,6 @@ acpi true
#acpi_avoid_full_init true
# Avoids running _INI and _STA methods and final object initialization,
# which may be used to for debugging ACPI issues, false by default
#4gb_memory_limit true
# Ignores all memory beyond the 4 GB address limit. Default is false.

View File

@ -15,6 +15,7 @@
#define B_SAFEMODE_DISABLE_SMP "disable_smp"
#define B_SAFEMODE_DISABLE_HYPER_THREADING "disable_hyperthreading"
#define B_SAFEMODE_FAIL_SAFE_VIDEO_MODE "fail_safe_video_mode"
#define B_SAFEMODE_4_GB_MEMORY_LIMIT "4gb_memory_limit"
#if DEBUG_SPINLOCK_LATENCIES
# define B_SAFEMODE_DISABLE_LATENCY_CHECK "disable_latency_check"

View File

@ -13,6 +13,8 @@
#include <OS.h>
#include <drivers/driver_settings.h>
#include <safemode_defs.h>
#include <boot/driver_settings.h>
#include <boot/kernel_args.h>
#include <boot/stage2.h>
@ -58,6 +60,20 @@ load_driver_settings_file(Directory* directory, const char* name)
}
static void
apply_boot_settings(void* kernelSettings, void* safemodeSettings)
{
#if B_HAIKU_PHYSICAL_BITS > 32
if (get_driver_boolean_parameter(kernelSettings, "4gb_memory_limit", false,
false)
|| get_driver_boolean_parameter(safemodeSettings,
B_SAFEMODE_4_GB_MEMORY_LIMIT, false, false)) {
ignore_physical_memory_ranges_beyond_4gb();
}
#endif
}
// #pragma mark -
@ -133,3 +149,18 @@ add_safe_mode_settings(char* settings)
return B_OK;
}
void
apply_boot_settings()
{
void* kernelSettings = load_driver_settings("kernel");
void* safemodeSettings = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS);
apply_boot_settings(kernelSettings, safemodeSettings);
if (safemodeSettings != NULL)
unload_driver_settings(safemodeSettings);
if (kernelSettings)
unload_driver_settings(kernelSettings);
}

View File

@ -13,4 +13,7 @@ extern status_t add_safe_mode_settings(char *buffer);
extern status_t add_stage2_driver_settings(stage2_args *args);
extern status_t load_driver_settings(stage2_args *args, Directory *volume);
extern void apply_boot_settings();
#endif /* LOAD_DRIVER_SETTINGS_H */

View File

@ -113,6 +113,9 @@ main(stage2_args *args)
load_modules(args, volume);
load_driver_settings(args, volume);
// apply boot settings
apply_boot_settings();
// set up kernel args version info
gKernelArgs.kernel_args_size = sizeof(kernel_args);
gKernelArgs.version = CURRENT_KERNEL_ARGS_VERSION;

View File

@ -673,6 +673,28 @@ add_safe_mode_menu()
item->SetHelpText("Disables IDE DMA, increasing IDE compatibilty "
"at the expense of performance.");
#if B_HAIKU_PHYSICAL_BITS > 32
// check whether we have memory beyond 4 GB
bool hasMemoryBeyond4GB = false;
for (uint32 i = 0; i < gKernelArgs.num_physical_memory_ranges; i++) {
phys_addr_range& range = gKernelArgs.physical_memory_range[i];
if (range.start >= (phys_addr_t)1 << 32) {
hasMemoryBeyond4GB = true;
break;
}
}
// ... add the menu, if so
if (hasMemoryBeyond4GB) {
safeMenu->AddItem(
item = new(nothrow) MenuItem("Ignore memory beyond 4 GiB"));
item->SetData(B_SAFEMODE_4_GB_MEMORY_LIMIT);
item->SetType(MENU_ITEM_MARKABLE);
item->SetHelpText("Ignores all memory beyond the 4 GiB address limit, "
"overriding the setting in the kernel settings file.");
}
#endif
platform_add_menus(safeMenu);
safeMenu->AddSeparatorItem();