* autoload.cc (NtCreateSection): Define.

* cygheap.cc (_csbrk): Call getpagesize instead of getshmlba.
	* dcrt0.cc (dll_crt0_0): Call mmap_init.
	* external.cc (cygwin_internal): Call getpagesize instead of getshmlba.
	* fhandler.h (fhandler_base::mmap): Change access to prot parameter.
	(fhandler_base::fixup_mmap_after_fork): Ditto.
	(fhandler_disk_file::mmap): Ditto.
	(fhandler_disk_file::fixup_mmap_after_fork): Ditto.
	(fhandler_dev_mem::mmap): Ditto.
	(fhandler_dev_mem::fixup_mmap_after_fork): Ditto.
	* fhandler_mem.cc (fhandler_dev_mem::write): Call getsystempagesize
	instead of getpagesize.
	(fhandler_dev_mem::read): Ditto.
	(fhandler_dev_mem::fstat): Ditto.
	(fhandler_dev_mem::mmap): Move to mmap.cc.
	(fhandler_dev_mem::munmap): Ditto.
	(fhandler_dev_mem::msync): Ditto.
	(fhandler_dev_mem::fixup_mmap_after_fork): Ditto.
	* fhandler_proc.cc (format_proc_meminfo): Call getsystempagesize
	instead of getpagesize.
	* fhandler_process.cc (format_process_stat): Ditto.
	(format_process_status): Ditto.
	(get_mem_values): Ditto.
	* mmap.cc: Fix formatting.  Try to make more readable and modular.
	Take advantage of pagesize==granularity.
	(gen_protect): New static function to evaluate Windows
	protection bits from POSIX protection and flags.
	(gen_access): Ditto for Windows access mode.
	(VirtualProt9x): Wrapper function to call VirtualProtect on 9x.
	(VirtualProtNT): Ditto for NT.
	(VirtualProtEx9x): Ditto for VirtualProtectEx on 9x.
	(VirtualProtExNT): Ditto for NT.
	(CreateMapping9x): Wrapper function for creating a mapping handle on 9x.
	(CreateMappingNT): Ditto for NT.
	(MapView9x): Wrapper function to map a view on 9x.
	(MapViewNT): Ditto for NT.
	(mmap_funcs_9x): Structure containing function pointers to wrapper
	functions for 9x.
	(mmap_funcs_nt): Ditto for NT.
	(mmap_func): Pointer to wrapper functions used in subsequent code.
	(mmap_init): Initialize mmap_func depending on OS.
	(class mmap_record): Use sensible member names.  Add POSIX protection
	member. Drop Windows access flags member.  Constify more methods.
	Use accessors instead of direct member access inside of own methods.
	(mmap_record::gen_protect): Class wrapper to evaluate matching
	Windows protection bits.
	(mmap_record::gen_access): Ditto for Windows access flags.
	(mmap_record::compatible_flags): New function to check if flags are
	compatible with flags of existing map.
	(list::add_record): Drop offset and length arguments.
	(class map): Change counters to unsigned.  Match usage throughout.
	(mmapped_areas): Convert from pointer to global struct.
	(mmap_record::alloc_page_map): Simplify.
	(mmap_record::map_pages): Ditto.
	(mmap_record::fixup_page_map): Delete.
	(mmap64): Simplify.  Add workaround for Windows 98 bug.  Fix bug on
	NT that existing anonymous mappings weren't searched for a match.
	(munmap): Add workaround for Windows 98 bug.
	(msync): Simplify.
	(mprotect): Handle existing maps correctly.
	(mlock): Add local pagesize variable and enlightening comment.
	(fhandler_disk_file::mmap): Main functionality now in CreateMapping/
	MapView wrapper functions.
	(fhandler_disk_file::fixup_mmap_after_fork): Call MapView wrapper.
	(fhandler_dev_mem::mmap): Moved from fhandler_mem.cc.  Simplify by
	calling MapViewNT.
	(fhandler_dev_mem::munmap): Moved from fhandler_mem.cc.
	(fhandler_dev_mem::msync): Ditto.
	(fhandler_dev_mem::fixup_mmap_after_fork): Ditto.  Call MapViewNT.
	(fixup_mmaps_after_fork): Restructure and hopefully speed up loop for
	setting protection and memory content on MAP_PRIVATE maps.
	* ntdll.h (AT_ROUND_TO_PAGE): Remove define.
	(AT_EXTENDABLE_FILE): Add define.
	(NtCreateSection): Add prototype.
	* syscalls.cc (getpagesize): Return granularity as pagesize now.
	(getsystempagesize): New function to retrieve "real" pagesize.
	(getshmlba): Delete since it's replaced by getpagesize now.
	* wincap.h (wincaps::has_mmap_alignment_bug): New element.
	* wincap.cc: Implement above element throughout.
	* winsup.h (getshmlba): Drop prototype.
	(getsystempagesize): Add prototype.
	(mmap_init): Ditto.
	* include/sys/mman.h: (Not yet) define MAP_NORESERVE.
This commit is contained in:
Corinna Vinschen
2005-11-28 22:32:29 +00:00
parent 87b69d9243
commit f90e23f271
16 changed files with 889 additions and 770 deletions

View File

@@ -136,7 +136,7 @@ fhandler_dev_mem::write (const void *ptr, size_t ulen)
PHYSICAL_ADDRESS phys;
NTSTATUS ret;
void *viewmem = NULL;
DWORD len = ulen + getpagesize () - 1;
DWORD len = ulen + getsystempagesize () - 1;
phys.QuadPart = (ULONGLONG) pos;
if ((ret = NtMapViewOfSection (get_handle (),
@@ -188,7 +188,7 @@ fhandler_dev_mem::read (void *ptr, size_t& ulen)
PHYSICAL_ADDRESS phys;
NTSTATUS ret;
void *viewmem = NULL;
DWORD len = ulen + getpagesize () - 1;
DWORD len = ulen + getsystempagesize () - 1;
phys.QuadPart = (ULONGLONG) pos;
if ((ret = NtMapViewOfSection (get_handle (),
@@ -251,150 +251,11 @@ fhandler_dev_mem::lseek (_off64_t offset, int whence)
return pos;
}
HANDLE
fhandler_dev_mem::mmap (caddr_t *addr, size_t len, DWORD access,
int flags, _off64_t off)
{
if (off >= mem_size
|| (DWORD) len >= mem_size
|| off + len >= mem_size)
{
set_errno (EINVAL);
syscall_printf ("-1 = mmap(): illegal parameter, set EINVAL");
return INVALID_HANDLE_VALUE;
}
UNICODE_STRING memstr;
RtlInitUnicodeString (&memstr, L"\\device\\physicalmemory");
OBJECT_ATTRIBUTES attr;
InitializeObjectAttributes (&attr, &memstr,
OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
NULL, NULL);
ACCESS_MASK section_access;
ULONG protect;
if (access & FILE_MAP_COPY)
{
section_access = SECTION_MAP_READ | SECTION_MAP_WRITE;
protect = PAGE_WRITECOPY;
}
else if (access & FILE_MAP_WRITE)
{
section_access = SECTION_MAP_READ | SECTION_MAP_WRITE;
protect = PAGE_READWRITE;
}
else
{
section_access = SECTION_MAP_READ;
protect = PAGE_READONLY;
}
HANDLE h;
NTSTATUS ret = NtOpenSection (&h, section_access, &attr);
if (!NT_SUCCESS (ret))
{
__seterrno_from_nt_status (ret);
syscall_printf ("-1 = mmap(): NtOpenSection failed with %E");
return INVALID_HANDLE_VALUE;
}
PHYSICAL_ADDRESS phys;
void *base = *addr;
DWORD dlen = len;
phys.QuadPart = (ULONGLONG) off;
if ((ret = NtMapViewOfSection (h,
INVALID_HANDLE_VALUE,
&base,
0L,
dlen,
&phys,
&dlen,
ViewShare /*??*/,
0,
protect)) != STATUS_SUCCESS)
{
__seterrno_from_nt_status (ret);
syscall_printf ("-1 = mmap(): NtMapViewOfSection failed with %E");
return INVALID_HANDLE_VALUE;
}
if ((flags & MAP_FIXED) && base != *addr)
{
set_errno (EINVAL);
syscall_printf ("-1 = mmap(): address shift with MAP_FIXED given");
NtUnmapViewOfSection (INVALID_HANDLE_VALUE, base);
return INVALID_HANDLE_VALUE;
}
*addr = (caddr_t) base;
return h;
}
int
fhandler_dev_mem::munmap (HANDLE h, caddr_t addr, size_t len)
{
NTSTATUS ret;
if (!NT_SUCCESS (ret = NtUnmapViewOfSection (INVALID_HANDLE_VALUE, addr)))
{
__seterrno_from_nt_status (ret);
return -1;
}
CloseHandle (h);
return 0;
}
int
fhandler_dev_mem::msync (HANDLE h, caddr_t addr, size_t len, int flags)
{
return 0;
}
bool
fhandler_dev_mem::fixup_mmap_after_fork (HANDLE h, DWORD access, int flags,
_off64_t offset, DWORD size,
void *address)
{
DWORD ret;
PHYSICAL_ADDRESS phys;
void *base = address;
DWORD dlen = size;
ULONG protect;
if (access & FILE_MAP_COPY)
protect = PAGE_WRITECOPY;
else if (access & FILE_MAP_WRITE)
protect = PAGE_READWRITE;
else
protect = PAGE_READONLY;
phys.QuadPart = (ULONGLONG) offset;
if ((ret = NtMapViewOfSection (h,
INVALID_HANDLE_VALUE,
&base,
0L,
dlen,
&phys,
&dlen,
ViewShare /*??*/,
0,
protect)) != STATUS_SUCCESS)
{
__seterrno_from_nt_status (ret);
syscall_printf ("-1 = fixup_mmap_after_fork(): NtMapViewOfSection failed with %E");
return false;
}
return base == address;
}
int
fhandler_dev_mem::fstat (struct __stat64 *buf)
{
fhandler_base::fstat (buf);
buf->st_blksize = getpagesize ();
buf->st_blksize = getsystempagesize ();
if (is_auto_device ())
{
buf->st_mode = S_IFCHR;