[haiku-development] [PATCH 1/5] Allow areas in the lower 1Mb for x86 for vm86 mode.

  • From: Jan Klötzke <jan.kloetzke@xxxxxxxxxx>
  • To: haiku-development@xxxxxxxxxxxxx
  • Date: Sat, 19 Apr 2008 19:28:12 +0200

A vm86 mode task can access only the lower 1Mb of the virtual address space.
Allow areas to be explicityl created also in this region for x86 but keep
automatically placed areas (addressSpec = B_ANY_*) out of it.
---
 headers/private/kernel/arch/m68k/arch_kernel.h |    7 ++++---
 headers/private/kernel/arch/ppc/arch_kernel.h  |    7 ++++---
 headers/private/kernel/arch/x86/arch_kernel.h  |   18 ++++++++++--------
 src/system/kernel/vm/vm.cpp                    |    2 ++
 4 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/headers/private/kernel/arch/m68k/arch_kernel.h 
b/headers/private/kernel/arch/m68k/arch_kernel.h
index 1c8886a..d212052 100644
--- a/headers/private/kernel/arch/m68k/arch_kernel.h
+++ b/headers/private/kernel/arch/m68k/arch_kernel.h
@@ -20,9 +20,10 @@
 ** region wont be placed there. The 64kb region assures a user space thread 
cannot pass
 ** a buffer into the kernel as part of a syscall that would cross into kernel 
space.
 */
-#define USER_BASE   0x100000
-#define USER_SIZE   (0x80000000 - (0x10000 + 0x100000))
-#define USER_TOP    (USER_BASE + USER_SIZE)
+#define USER_BASE     0x100000
+#define USER_BASE_ANY USER_BASE
+#define USER_SIZE     (0x80000000 - (0x10000 + 0x100000))
+#define USER_TOP      (USER_BASE + USER_SIZE)
 
 #define USER_STACK_REGION 0x70000000
 #define USER_STACK_REGION_SIZE (USER_BASE + (USER_SIZE - USER_STACK_REGION))
diff --git a/headers/private/kernel/arch/ppc/arch_kernel.h 
b/headers/private/kernel/arch/ppc/arch_kernel.h
index 72ed6b8..862a541 100644
--- a/headers/private/kernel/arch/ppc/arch_kernel.h
+++ b/headers/private/kernel/arch/ppc/arch_kernel.h
@@ -20,9 +20,10 @@
 ** region wont be placed there. The 64kb region assures a user space thread 
cannot pass
 ** a buffer into the kernel as part of a syscall that would cross into kernel 
space.
 */
-#define USER_BASE   0x100000
-#define USER_SIZE   (0x80000000 - (0x10000 + 0x100000))
-#define USER_TOP    (USER_BASE + USER_SIZE)
+#define USER_BASE     0x100000
+#define USER_BASE_ANY USER_BASE
+#define USER_SIZE     (0x80000000 - (0x10000 + 0x100000))
+#define USER_TOP      (USER_BASE + USER_SIZE)
 
 #define USER_STACK_REGION 0x70000000
 #define USER_STACK_REGION_SIZE (USER_BASE + (USER_SIZE - USER_STACK_REGION))
diff --git a/headers/private/kernel/arch/x86/arch_kernel.h 
b/headers/private/kernel/arch/x86/arch_kernel.h
index 586c1bf..1988c9a 100644
--- a/headers/private/kernel/arch/x86/arch_kernel.h
+++ b/headers/private/kernel/arch/x86/arch_kernel.h
@@ -16,15 +16,17 @@
 
 /*
 ** User space layout is a little special:
-** The user space does not completely cover the space not covered by the 
kernel.
-** This is accomplished by starting user space at 1Mb and running to 64kb 
short of kernel space.
-** The lower 1Mb reserved spot makes it easy to find null pointer references 
and guarantees a
-** region wont be placed there. The 64kb region assures a user space thread 
cannot pass
-** a buffer into the kernel as part of a syscall that would cross into kernel 
space.
+** The user space does not completely cover the space not covered by the
+** kernel. There is a gap of 64kb between the user and kernel space. The 64kb
+** region assures a user space thread cannot pass a buffer into the kernel as
+** part of a syscall that would cross into kernel space.
+** Furthermore no areas are placed in the lower 1Mb unless the application
+** explicitly requests it to find null pointer references.
 */
-#define USER_BASE   0x100000
-#define USER_SIZE   (0x80000000 - (0x10000 + 0x100000))
-#define USER_TOP    (USER_BASE + USER_SIZE)
+#define USER_BASE     0x00
+#define USER_BASE_ANY 0x100000
+#define USER_SIZE     (KERNEL_BASE - 0x10000)
+#define USER_TOP      (USER_BASE + USER_SIZE)
 
 #define USER_STACK_REGION 0x70000000
 #define USER_STACK_REGION_SIZE (USER_TOP - USER_STACK_REGION)
diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp
index 50307a6..03cfb93 100644
--- a/src/system/kernel/vm/vm.cpp
+++ b/src/system/kernel/vm/vm.cpp
@@ -1167,6 +1167,8 @@ insert_area(vm_address_space *addressSpace, void 
**_address,
                case B_ANY_KERNEL_ADDRESS:
                case B_ANY_KERNEL_BLOCK_ADDRESS:
                        searchBase = addressSpace->base;
+                       if (searchBase < USER_BASE_ANY)
+                               searchBase = USER_BASE_ANY;
                        searchEnd = addressSpace->base + (addressSpace->size - 
1);
                        break;
 
-- 
1.5.4.2


Other related posts: