Author: bonefish Date: 2010-06-23 13:13:39 +0200 (Wed, 23 Jun 2010) New Revision: 37225 Changeset: http://dev.haiku-os.org/changeset/37225/haiku Modified: haiku/trunk/data/settings/kernel/drivers/kernel haiku/trunk/headers/private/system/safemode_defs.h haiku/trunk/src/system/boot/loader/load_driver_settings.cpp haiku/trunk/src/system/boot/loader/load_driver_settings.h haiku/trunk/src/system/boot/loader/main.cpp haiku/trunk/src/system/boot/loader/menu.cpp Log: 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. Modified: haiku/trunk/data/settings/kernel/drivers/kernel =================================================================== --- haiku/trunk/data/settings/kernel/drivers/kernel 2010-06-23 11:10:01 UTC (rev 37224) +++ haiku/trunk/data/settings/kernel/drivers/kernel 2010-06-23 11:13:39 UTC (rev 37225) @@ -59,3 +59,6 @@ #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. Modified: haiku/trunk/headers/private/system/safemode_defs.h =================================================================== --- haiku/trunk/headers/private/system/safemode_defs.h 2010-06-23 11:10:01 UTC (rev 37224) +++ haiku/trunk/headers/private/system/safemode_defs.h 2010-06-23 11:13:39 UTC (rev 37225) @@ -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" Modified: haiku/trunk/src/system/boot/loader/load_driver_settings.cpp =================================================================== --- haiku/trunk/src/system/boot/loader/load_driver_settings.cpp 2010-06-23 11:10:01 UTC (rev 37224) +++ haiku/trunk/src/system/boot/loader/load_driver_settings.cpp 2010-06-23 11:13:39 UTC (rev 37225) @@ -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 @@ } +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 @@ 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); +} Modified: haiku/trunk/src/system/boot/loader/load_driver_settings.h =================================================================== --- haiku/trunk/src/system/boot/loader/load_driver_settings.h 2010-06-23 11:10:01 UTC (rev 37224) +++ haiku/trunk/src/system/boot/loader/load_driver_settings.h 2010-06-23 11:13:39 UTC (rev 37225) @@ -13,4 +13,7 @@ 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 */ Modified: haiku/trunk/src/system/boot/loader/main.cpp =================================================================== --- haiku/trunk/src/system/boot/loader/main.cpp 2010-06-23 11:10:01 UTC (rev 37224) +++ haiku/trunk/src/system/boot/loader/main.cpp 2010-06-23 11:13:39 UTC (rev 37225) @@ -113,6 +113,9 @@ 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; Modified: haiku/trunk/src/system/boot/loader/menu.cpp =================================================================== --- haiku/trunk/src/system/boot/loader/menu.cpp 2010-06-23 11:10:01 UTC (rev 37224) +++ haiku/trunk/src/system/boot/loader/menu.cpp 2010-06-23 11:13:39 UTC (rev 37225) @@ -673,6 +673,28 @@ 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();