* 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:
@@ -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;
|
||||
|
Reference in New Issue
Block a user