diff --git a/headers/os/kernel/OS.h b/headers/os/kernel/OS.h index 346f4597b6..874fb87f8d 100644 --- a/headers/os/kernel/OS.h +++ b/headers/os/kernel/OS.h @@ -68,7 +68,8 @@ typedef struct area_info { #define B_LAZY_LOCK 1 #define B_FULL_LOCK 2 #define B_CONTIGUOUS 3 -#define B_LOMEM 4 +#define B_LOMEM 4 /* B_CONTIGUOUS, < 16 MB physical address */ +#define B_32_BIT_MEMORY 5 /* B_CONTIGUOUS, < 4 GB physical address */ /* address spec for create_area(), and clone_area() */ #define B_ANY_ADDRESS 0 diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index db78ed93bd..f05784243f 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -1101,6 +1101,7 @@ vm_create_anonymous_area(team_id team, const char *name, addr_t size, wiring = B_CONTIGUOUS; } + physical_address_restrictions stackPhysicalRestrictions; bool doReserveMemory = false; switch (wiring) { case B_NO_LOCK: @@ -1113,11 +1114,25 @@ vm_create_anonymous_area(team_id team, const char *name, addr_t size, case B_ALREADY_WIRED: break; case B_LOMEM: - //case B_SLOWMEM: - dprintf("B_LOMEM/SLOWMEM is not yet supported!\n"); - wiring = B_FULL_LOCK; + { + stackPhysicalRestrictions = *physicalAddressRestrictions; + stackPhysicalRestrictions.high_address = 16 * 1024 * 1024; + physicalAddressRestrictions = &stackPhysicalRestrictions; + wiring = B_CONTIGUOUS; doReserveMemory = true; break; + } + case B_32_BIT_MEMORY: + { + #if B_HAIKU_PHYSICAL_BITS > 32 + stackPhysicalRestrictions = *physicalAddressRestrictions; + stackPhysicalRestrictions.high_address = 0x100000000LL; + physicalAddressRestrictions = &stackPhysicalRestrictions; + #endif + wiring = B_CONTIGUOUS; + doReserveMemory = true; + break; + } default: return B_BAD_VALUE; }