diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 478ca65d5..80da78a18 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +2003-09-09 Corinna Vinschen + + * mmap.cc (mmap64): Change address types from caddr_t to void * + according to SUSv3. + (mmap): Ditto. + (munmap): Ditto. + (msync): Ditto. + (mprotect): Ditto. Move to before the fhandler methods. + * include/sys/mman.h: Change prototypes accordingly. + 2003-09-08 Christopher Faylor * dcrt0.cc (dlL_crt0_1): Set __argc_safe after __argc is absolutely diff --git a/winsup/cygwin/include/sys/mman.h b/winsup/cygwin/include/sys/mman.h index 5059f894a..13393e9cc 100644 --- a/winsup/cygwin/include/sys/mman.h +++ b/winsup/cygwin/include/sys/mman.h @@ -41,11 +41,11 @@ extern "C" { #define MS_INVALIDATE 4 #ifndef __INSIDE_CYGWIN__ -extern caddr_t mmap (caddr_t __addr, size_t __len, int __prot, int __flags, int __fd, off_t __off); +extern void *mmap (void *__addr, size_t __len, int __prot, int __flags, int __fd, off_t __off); #endif -extern int munmap (caddr_t __addr, size_t __len); -extern int mprotect (caddr_t __addr, size_t __len, int __prot); -extern int msync (caddr_t __addr, size_t __len, int __flags); +extern int munmap (void *__addr, size_t __len); +extern int mprotect (void *__addr, size_t __len, int __prot); +extern int msync (void *__addr, size_t __len, int __flags); #ifdef __cplusplus }; diff --git a/winsup/cygwin/mmap.cc b/winsup/cygwin/mmap.cc index af7d327bc..d8cb4eb5a 100644 --- a/winsup/cygwin/mmap.cc +++ b/winsup/cygwin/mmap.cc @@ -448,8 +448,8 @@ map::del_list (int i) } } -extern "C" caddr_t -mmap64 (caddr_t addr, size_t len, int prot, int flags, int fd, _off64_t off) +extern "C" void * +mmap64 (void *addr, size_t len, int prot, int flags, int fd, _off64_t off) { syscall_printf ("addr %x, len %u, prot %x, flags %x, fd %d, off %D", addr, len, prot, flags, fd, off); @@ -576,7 +576,7 @@ mmap64 (caddr_t addr, size_t len, int prot, int flags, int fd, _off64_t off) && (wincap.has_working_copy_on_write () || fd != -1)) access = FILE_MAP_COPY; - caddr_t base = addr; + caddr_t base = (caddr_t)addr; /* This shifts the base address to the next lower 64K boundary. The offset is re-added when evaluating the return value. */ if (base) @@ -631,8 +631,8 @@ mmap64 (caddr_t addr, size_t len, int prot, int flags, int fd, _off64_t off) return ret; } -extern "C" caddr_t -mmap (caddr_t addr, size_t len, int prot, int flags, int fd, _off_t off) +extern "C" void * +mmap (void *addr, size_t len, int prot, int flags, int fd, _off_t off) { return mmap64 (addr, len, prot, flags, fd, (_off64_t)off); } @@ -640,7 +640,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, _off_t off) /* munmap () removes all mmapped pages between addr and addr+len. */ extern "C" int -munmap (caddr_t addr, size_t len) +munmap (void *addr, size_t len) { syscall_printf ("munmap (addr %x, len %u)", addr, len); @@ -672,7 +672,7 @@ munmap (caddr_t addr, size_t len) caddr_t u_addr; DWORD u_len; - while ((record_idx = map_list->search_record(addr, len, u_addr, + while ((record_idx = map_list->search_record((caddr_t)addr, len, u_addr, u_len, record_idx)) >= 0) { mmap_record *rec = map_list->get_record (record_idx); @@ -680,7 +680,7 @@ munmap (caddr_t addr, size_t len) { /* The whole record has been unmapped, so... */ fhandler_base *fh = rec->alloc_fh (); - fh->munmap (rec->get_handle (), addr, len); + fh->munmap (rec->get_handle (), (caddr_t)addr, len); rec->free_fh (fh); /* ...delete the record. */ @@ -703,7 +703,7 @@ munmap (caddr_t addr, size_t len) /* Sync file with memory. Ignore flags for now. */ extern "C" int -msync (caddr_t addr, size_t len, int flags) +msync (void *addr, size_t len, int flags) { syscall_printf ("addr = %x, len = %u, flags = %x", addr, len, flags); @@ -740,14 +740,15 @@ msync (caddr_t addr, size_t len, int flags) (rec = map_list->get_record (record_idx)); ++record_idx) { - if (rec->access (addr)) + if (rec->access ((caddr_t)addr)) { /* Check whole area given by len. */ for (DWORD i = getpagesize (); i < len; ++i) - if (!rec->access (addr + i)) + if (!rec->access ((caddr_t)addr + i)) goto invalid_address_range; fhandler_base *fh = rec->alloc_fh (); - int ret = fh->msync (rec->get_handle (), addr, len, flags); + int ret = fh->msync (rec->get_handle (), (caddr_t)addr, len, + flags); rec->free_fh (fh); if (ret) @@ -771,6 +772,62 @@ invalid_address_range: return -1; } +/* Set memory protection */ + +extern "C" int +mprotect (void *addr, size_t len, int prot) +{ + DWORD old_prot; + DWORD new_prot = 0; + + syscall_printf ("mprotect (addr %x, len %u, prot %x)", addr, len, prot); + + if (!wincap.virtual_protect_works_on_shared_pages () + && addr >= (caddr_t)0x80000000 && addr <= (caddr_t)0xBFFFFFFF) + { + syscall_printf ("0 = mprotect (9x: No VirtualProtect on shared memory)"); + return 0; + } + + switch (prot) + { + case PROT_READ | PROT_WRITE | PROT_EXEC: + case PROT_WRITE | PROT_EXEC: + new_prot = PAGE_EXECUTE_READWRITE; + break; + case PROT_READ | PROT_WRITE: + case PROT_WRITE: + new_prot = PAGE_READWRITE; + break; + case PROT_READ | PROT_EXEC: + new_prot = PAGE_EXECUTE_READ; + break; + case PROT_READ: + new_prot = PAGE_READONLY; + break; + case PROT_EXEC: + new_prot = PAGE_EXECUTE; + break; + case PROT_NONE: + new_prot = PAGE_NOACCESS; + break; + default: + syscall_printf ("-1 = mprotect (): invalid prot value"); + set_errno (EINVAL); + return -1; + } + + if (VirtualProtect (addr, len, new_prot, &old_prot) == 0) + { + __seterrno (); + syscall_printf ("-1 = mprotect (): %E"); + return -1; + } + + syscall_printf ("0 = mprotect ()"); + return 0; +} + /* * Base implementation: * @@ -930,62 +987,6 @@ fhandler_disk_file::fixup_mmap_after_fork (HANDLE h, DWORD access, DWORD offset, return base == address; } -/* Set memory protection */ - -extern "C" int -mprotect (caddr_t addr, size_t len, int prot) -{ - DWORD old_prot; - DWORD new_prot = 0; - - syscall_printf ("mprotect (addr %x, len %u, prot %x)", addr, len, prot); - - if (!wincap.virtual_protect_works_on_shared_pages () - && addr >= (caddr_t)0x80000000 && addr <= (caddr_t)0xBFFFFFFF) - { - syscall_printf ("0 = mprotect (9x: No VirtualProtect on shared memory)"); - return 0; - } - - switch (prot) - { - case PROT_READ | PROT_WRITE | PROT_EXEC: - case PROT_WRITE | PROT_EXEC: - new_prot = PAGE_EXECUTE_READWRITE; - break; - case PROT_READ | PROT_WRITE: - case PROT_WRITE: - new_prot = PAGE_READWRITE; - break; - case PROT_READ | PROT_EXEC: - new_prot = PAGE_EXECUTE_READ; - break; - case PROT_READ: - new_prot = PAGE_READONLY; - break; - case PROT_EXEC: - new_prot = PAGE_EXECUTE; - break; - case PROT_NONE: - new_prot = PAGE_NOACCESS; - break; - default: - syscall_printf ("-1 = mprotect (): invalid prot value"); - set_errno (EINVAL); - return -1; - } - - if (VirtualProtect (addr, len, new_prot, &old_prot) == 0) - { - __seterrno (); - syscall_printf ("-1 = mprotect (): %E"); - return -1; - } - - syscall_printf ("0 = mprotect ()"); - return 0; -} - /* * Call to re-create all the file mappings in a forked * child. Called from the child in initialization. At this