From f90e23f2714cb3173d57ee470f6fdc631561cd13 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 28 Nov 2005 22:32:29 +0000 Subject: * 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. --- winsup/cygwin/fhandler_mem.cc | 145 +----------------------------------------- 1 file changed, 3 insertions(+), 142 deletions(-) (limited to 'winsup/cygwin/fhandler_mem.cc') diff --git a/winsup/cygwin/fhandler_mem.cc b/winsup/cygwin/fhandler_mem.cc index 58d67858d..c0d865d28 100644 --- a/winsup/cygwin/fhandler_mem.cc +++ b/winsup/cygwin/fhandler_mem.cc @@ -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; -- cgit v1.2.3