Re: [RFC 1/6] Allow areas in t he lower 1Mb for x86 for vm86 mode.
"Axel Dörfler" <[email protected]> Fri, 02 May 2008 15:02:05 +0200 CEST
| Newsgroups | gmane.os.openbeos.kernel.devel |
|---|---|
| Message-ID | <14161852153-BeMail@zon> |
Jan Klötzke <[email protected]> wrote: > 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. With the comments I made before, I would suggest to commit the following patch. Would this be okay with you, Jan? I mainly added two TODO comments, and made some tiny cleanup. Index: headers/private/kernel/arch/ppc/arch_kernel.h =================================================================== --- headers/private/kernel/arch/ppc/arch_kernel.h (revision 25288) +++ headers/private/kernel/arch/ppc/arch_kernel.h (working copy) @@ -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)) Index: headers/private/kernel/arch/x86/arch_kernel.h =================================================================== --- headers/private/kernel/arch/x86/arch_kernel.h (revision 25288) +++ headers/private/kernel/arch/x86/arch_kernel.h (working copy) @@ -1,7 +1,10 @@ /* -** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. -** Distributed under the terms of the NewOS License. -*/ + * Copyright 2004-2008, Haiku Inc. All rights reserved. + * Distributes under the terms of the MIT license. + * + * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. + * Distributed under the terms of the NewOS License. + */ #ifndef _KERNEL_ARCH_x86_KERNEL_H #define _KERNEL_ARCH_x86_KERNEL_H @@ -14,19 +17,22 @@ #define KERNEL_SIZE 0x80000000 #define KERNEL_TOP (KERNEL_BASE + (KERNEL_SIZE - 1)) -/* -** 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. -*/ -#define USER_BASE 0x100000 -#define USER_SIZE (0x80000000 - (0x10000 + 0x100000)) -#define USER_TOP (USER_BASE + USER_SIZE) +/* User space layout is a little special: + * 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. + * TODO: introduce the 1Mb lower barrier again - it's only used for vm86 mode, + * and this should be moved into the kernel (and address space) completely. + */ +#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) -#endif /* _KERNEL_ARCH_x86_KERNEL_H */ +#endif /* _KERNEL_ARCH_x86_KERNEL_H */ Index: headers/private/kernel/arch/m68k/arch_kernel.h =================================================================== --- headers/private/kernel/arch/m68k/arch_kernel.h (revision 25288) +++ headers/private/kernel/arch/m68k/arch_kernel.h (working copy) @@ -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)) Index: src/system/kernel/vm/vm.cpp =================================================================== --- src/system/kernel/vm/vm.cpp (revision 25288) +++ src/system/kernel/vm/vm.cpp (working copy) @@ -1139,12 +1139,11 @@ } -/** This inserts the area you pass into the specified address space. - * It will also set the "_address" argument to its base address when - * the call succeeds. - * You need to hold the vm_address_space semaphore. - */ - +/*! This inserts the area you pass into the specified address space. + It will also set the "_address" argument to its base address when + the call succeeds. + You need to hold the vm_address_space semaphore. +*/ static status_t insert_area(vm_address_space *addressSpace, void **_address, uint32 addressSpec, addr_t size, vm_area *area) @@ -1167,6 +1166,10 @@ case B_ANY_KERNEL_ADDRESS: case B_ANY_KERNEL_BLOCK_ADDRESS: searchBase = addressSpace->base; + // TODO: remove this again when vm86 mode is moved into the kernel + // completely (currently needs a userland address space!) + if (searchBase == USER_BASE) + searchBase = USER_BASE_ANY; searchEnd = addressSpace->base + (addressSpace->size - 1); break; @@ -1175,7 +1178,7 @@ } status = find_and_insert_area_slot(addressSpace, searchBase, size, - searchEnd, addressSpec, area); + searchEnd, addressSpec, area); if (status == B_OK) { // ToDo: do we have to do anything about B_ANY_KERNEL_ADDRESS // vs. B_ANY_KERNEL_BLOCK_ADDRESS here? ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ Open-beos-kernel-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/open-beos-kernel-devel