9 changed files with 236 additions and 31 deletions
@ -0,0 +1,28 @@ |
|||
/*
|
|||
This file is part of ethash. |
|||
|
|||
ethash is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
ethash is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with ethash. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file mmap.h
|
|||
* @author Lefteris Karapetsas <lefteris@ethdev.com> |
|||
* @date 2015 |
|||
*/ |
|||
#pragma once |
|||
#if defined(__MINGW32__) || defined(_WIN32) |
|||
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); |
|||
#else |
|||
#include <sys/mman.h> |
|||
#endif |
|||
|
|||
|
@ -0,0 +1,101 @@ |
|||
/* mmap() replacement for Windows
|
|||
* |
|||
* Author: Mike Frysinger <vapier@gentoo.org> |
|||
* Placed into the public domain |
|||
*/ |
|||
|
|||
/* References:
|
|||
* CreateFileMapping: http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
|
|||
* CloseHandle: http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx
|
|||
* MapViewOfFile: http://msdn.microsoft.com/en-us/library/aa366761(VS.85).aspx
|
|||
* UnmapViewOfFile: http://msdn.microsoft.com/en-us/library/aa366882(VS.85).aspx
|
|||
*/ |
|||
|
|||
#include <io.h> |
|||
#include <windows.h> |
|||
#include <sys/types.h> |
|||
#include "mmap.h" |
|||
|
|||
#define PROT_READ 0x1 |
|||
#define PROT_WRITE 0x2 |
|||
/* This flag is only available in WinXP+ */ |
|||
#ifdef FILE_MAP_EXECUTE |
|||
#define PROT_EXEC 0x4 |
|||
#else |
|||
#define PROT_EXEC 0x0 |
|||
#define FILE_MAP_EXECUTE 0 |
|||
#endif |
|||
|
|||
#define MAP_SHARED 0x01 |
|||
#define MAP_PRIVATE 0x02 |
|||
#define MAP_ANONYMOUS 0x20 |
|||
#define MAP_ANON MAP_ANONYMOUS |
|||
#define MAP_FAILED ((void *) -1) |
|||
|
|||
#ifdef __USE_FILE_OFFSET64 |
|||
# define DWORD_HI(x) (x >> 32) |
|||
# define DWORD_LO(x) ((x) & 0xffffffff) |
|||
#else |
|||
# define DWORD_HI(x) (0) |
|||
# define DWORD_LO(x) (x) |
|||
#endif |
|||
|
|||
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) |
|||
{ |
|||
if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)) |
|||
return MAP_FAILED; |
|||
if (fd == -1) { |
|||
if (!(flags & MAP_ANON) || offset) |
|||
return MAP_FAILED; |
|||
} else if (flags & MAP_ANON) |
|||
return MAP_FAILED; |
|||
|
|||
DWORD flProtect; |
|||
if (prot & PROT_WRITE) { |
|||
if (prot & PROT_EXEC) |
|||
flProtect = PAGE_EXECUTE_READWRITE; |
|||
else |
|||
flProtect = PAGE_READWRITE; |
|||
} else if (prot & PROT_EXEC) { |
|||
if (prot & PROT_READ) |
|||
flProtect = PAGE_EXECUTE_READ; |
|||
else if (prot & PROT_EXEC) |
|||
flProtect = PAGE_EXECUTE; |
|||
} else |
|||
flProtect = PAGE_READONLY; |
|||
|
|||
off_t end = length + offset; |
|||
HANDLE mmap_fd, h; |
|||
if (fd == -1) |
|||
mmap_fd = INVALID_HANDLE_VALUE; |
|||
else |
|||
mmap_fd = (HANDLE)_get_osfhandle(fd); |
|||
h = CreateFileMapping(mmap_fd, NULL, flProtect, DWORD_HI(end), DWORD_LO(end), NULL); |
|||
if (h == NULL) |
|||
return MAP_FAILED; |
|||
|
|||
DWORD dwDesiredAccess; |
|||
if (prot & PROT_WRITE) |
|||
dwDesiredAccess = FILE_MAP_WRITE; |
|||
else |
|||
dwDesiredAccess = FILE_MAP_READ; |
|||
if (prot & PROT_EXEC) |
|||
dwDesiredAccess |= FILE_MAP_EXECUTE; |
|||
if (flags & MAP_PRIVATE) |
|||
dwDesiredAccess |= FILE_MAP_COPY; |
|||
void *ret = MapViewOfFile(h, dwDesiredAccess, DWORD_HI(offset), DWORD_LO(offset), length); |
|||
if (ret == NULL) { |
|||
CloseHandle(h); |
|||
ret = MAP_FAILED; |
|||
} |
|||
return ret; |
|||
} |
|||
|
|||
static void munmap(void *addr, size_t length) |
|||
{ |
|||
UnmapViewOfFile(addr); |
|||
/* ruh-ro, we leaked handle from CreateFileMapping() ... */ |
|||
} |
|||
|
|||
#undef DWORD_HI |
|||
#undef DWORD_LO |
Loading…
Reference in new issue