// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "ExecutableMemory.hpp"

#include "Debug.hpp"

#if defined(_WIN32)
	#ifndef WIN32_LEAN_AND_MEAN
		#define WIN32_LEAN_AND_MEAN
	#endif
	#include <windows.h>
	#include <intrin.h>
#elif defined(__Fuchsia__)
	#include <unistd.h>
	#include <zircon/process.h>
	#include <zircon/syscalls.h>
#else
	#include <errno.h>
	#include <sys/mman.h>
	#include <stdlib.h>
	#include <unistd.h>
#endif

#include <memory.h>

#undef allocate
#undef deallocate

#if(defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || defined (_M_X64)) && !defined(__x86__)
#define __x86__
#endif

namespace rr {
namespace {

struct Allocation
{
//	size_t bytes;
	unsigned char *block;
};

void *allocateRaw(size_t bytes, size_t alignment)
{
	ASSERT((alignment & (alignment - 1)) == 0);   // Power of 2 alignment.

	#if defined(LINUX_ENABLE_NAMED_MMAP)
		if(alignment < sizeof(void*))
		{
			return malloc(bytes);
		}
		else
		{
			void *allocation;
			int result = posix_memalign(&allocation, alignment, bytes);
			if(result != 0)
			{
				errno = result;
				allocation = nullptr;
			}
			return allocation;
		}
	#else
		unsigned char *block = new unsigned char[bytes + sizeof(Allocation) + alignment];
		unsigned char *aligned = nullptr;

		if(block)
		{
			aligned = (unsigned char*)((uintptr_t)(block + sizeof(Allocation) + alignment - 1) & -(intptr_t)alignment);
			Allocation *allocation = (Allocation*)(aligned - sizeof(Allocation));

		//	allocation->bytes = bytes;
			allocation->block = block;
		}

		return aligned;
	#endif
}

#if defined(_WIN32)
DWORD permissionsToProtectMode(int permissions)
{
	switch(permissions) {
		case PERMISSION_READ:
		  return PAGE_READONLY;
		case PERMISSION_EXECUTE:
		  return PAGE_EXECUTE;
		case PERMISSION_READ | PERMISSION_WRITE:
		  return PAGE_READWRITE;
		case PERMISSION_READ | PERMISSION_EXECUTE:
		  return PAGE_EXECUTE_READ;
		case PERMISSION_READ | PERMISSION_WRITE | PERMISSION_EXECUTE:
		  return PAGE_EXECUTE_READWRITE;
	}
	return PAGE_NOACCESS;
}
#endif

#if !defined(_WIN32) && !defined(__Fuchsia__)
int permissionsToMmapProt(int permissions)
{
	int result = 0;
	if(permissions & PERMISSION_READ)
	{
		result |= PROT_READ;
	}
	if(permissions & PERMISSION_WRITE)
	{
		result |= PROT_WRITE;
	}
	if(permissions & PERMISSION_EXECUTE)
	{
		result |= PROT_EXEC;
	}
	return result;
}
#endif  // !defined(_WIN32) && !defined(__Fuchsia__)

#if defined(LINUX_ENABLE_NAMED_MMAP)
// Create a file descriptor for anonymous memory with the given
// name. Returns -1 on failure.
// TODO: remove once libc wrapper exists.
int memfd_create(const char* name, unsigned int flags)
{
	#if __aarch64__
	#define __NR_memfd_create 279
	#elif __arm__
	#define __NR_memfd_create 279
	#elif __powerpc64__
	#define __NR_memfd_create 360
	#elif __i386__
	#define __NR_memfd_create 356
	#elif __x86_64__
	#define __NR_memfd_create 319
	#endif /* __NR_memfd_create__ */
	#ifdef __NR_memfd_create
		// In the event of no system call this returns -1 with errno set
		// as ENOSYS.
		return syscall(__NR_memfd_create, name, flags);
	#else
		return -1;
	#endif
}

// Returns a file descriptor for use with an anonymous mmap, if
// memfd_create fails, -1 is returned. Note, the mappings should be
// MAP_PRIVATE so that underlying pages aren't shared.
int anonymousFd()
{
	static int fd = memfd_create("SwiftShader JIT", 0);
	return fd;
}

// Ensure there is enough space in the "anonymous" fd for length.
void ensureAnonFileSize(int anonFd, size_t length)
{
	static size_t fileSize = 0;
	if(length > fileSize)
	{
		ftruncate(anonFd, length);
		fileSize = length;
	}
}
#endif  // defined(LINUX_ENABLE_NAMED_MMAP)

#if defined(__Fuchsia__)
zx_vm_option_t permissionsToZxVmOptions(int permissions) {
	zx_vm_option_t result = 0;
	if(permissions & PERMISSION_READ)
	{
		result |= ZX_VM_PERM_READ;
	}
	if(permissions & PERMISSION_WRITE)
	{
		result |= ZX_VM_PERM_WRITE;
	}
	if(permissions & PERMISSION_EXECUTE)
	{
		result |= ZX_VM_PERM_EXECUTE;
	}
	return result;
}
#endif  // defined(__Fuchsia__)

}  // anonymous namespace

size_t memoryPageSize()
{
	static int pageSize = 0;

	if(pageSize == 0)
	{
		#if defined(_WIN32)
			SYSTEM_INFO systemInfo;
			GetSystemInfo(&systemInfo);
			pageSize = systemInfo.dwPageSize;
		#else
			pageSize = sysconf(_SC_PAGESIZE);
		#endif
	}

	return pageSize;
}

void *allocate(size_t bytes, size_t alignment)
{
	void *memory = allocateRaw(bytes, alignment);

	if(memory)
	{
		memset(memory, 0, bytes);
	}

	return memory;
}

void deallocate(void *memory)
{
	#if defined(LINUX_ENABLE_NAMED_MMAP)
		free(memory);
	#else
		if(memory)
		{
			unsigned char *aligned = (unsigned char*)memory;
			Allocation *allocation = (Allocation*)(aligned - sizeof(Allocation));

			delete[] allocation->block;
		}
	#endif
}

// Rounds |x| up to a multiple of |m|, where |m| is a power of 2.
inline uintptr_t roundUp(uintptr_t x, uintptr_t m)
{
	ASSERT(m > 0 && (m & (m - 1)) == 0); // |m| must be a power of 2.
	return (x + m - 1) & ~(m - 1);
}

void *allocateMemoryPages(size_t bytes, int permissions, bool need_exec)
{
	size_t pageSize = memoryPageSize();
	size_t length = roundUp(bytes, pageSize);
	void *mapping = nullptr;

	#if defined(LINUX_ENABLE_NAMED_MMAP)
		int flags = MAP_PRIVATE;

		// Try to name the memory region for the executable code,
		// to aid profilers.
		int anonFd = anonymousFd();
		if(anonFd == -1)
		{
			flags |= MAP_ANONYMOUS;
		}
		else
		{
			ensureAnonFileSize(anonFd, length);
		}

		mapping = mmap(
			nullptr, length, permissionsToMmapProt(permissions), flags, anonFd, 0);

		if(mapping == MAP_FAILED)
		{
			mapping = nullptr;
		}
	#elif defined(__Fuchsia__)
		zx_handle_t vmo;
		if(zx_vmo_create(length, 0, &vmo) != ZX_OK) {
			return nullptr;
		}
		if(need_exec &&
		    zx_vmo_replace_as_executable(vmo, ZX_HANDLE_INVALID, &vmo) != ZX_OK)
		{
			return nullptr;
		}
		zx_vaddr_t reservation;
		zx_status_t status = zx_vmar_map(
			zx_vmar_root_self(), permissionsToZxVmOptions(permissions), 0, vmo,
			0, length, &reservation);
		zx_handle_close(vmo);
		if(status != ZX_OK) {
			return nullptr;
		}

		// zx_vmar_map() returns page-aligned address.
		ASSERT(roundUp(reservation, pageSize) == reservation);

		mapping = reinterpret_cast<void*>(reservation);
	#elif defined(__APPLE__)
		int prot = permissionsToMmapProt(permissions);
		int flags = MAP_PRIVATE | MAP_ANONYMOUS;
		// On macOS 10.14 and higher, executables that are code signed with the
		// "runtime" option cannot execute writable memory by default. They can opt
		// into this capability by specifying the "com.apple.security.cs.allow-jit"
		// code signing entitlement and allocating the region with the MAP_JIT flag.
		mapping = mmap(nullptr, length, prot, flags | MAP_JIT, -1, 0);

		if(mapping == MAP_FAILED)
		{
			// Retry without MAP_JIT (for older macOS versions).
			mapping = mmap(nullptr, length, prot, flags, -1, 0);
		}

		if(mapping == MAP_FAILED)
		{
			mapping = nullptr;
		}
	#else
		mapping = allocate(length, pageSize);
		protectMemoryPages(mapping, length, permissions);
	#endif

	return mapping;
}

void protectMemoryPages(void *memory, size_t bytes, int permissions)
{
	if(bytes == 0)
		return;
	bytes = roundUp(bytes, memoryPageSize());

	#if defined(_WIN32)
		unsigned long oldProtection;
		BOOL result =
			VirtualProtect(memory, bytes, permissionsToProtectMode(permissions),
			               &oldProtection);
		ASSERT(result);
	#elif defined(__Fuchsia__)
		zx_status_t status = zx_vmar_protect(
			zx_vmar_root_self(), permissionsToZxVmOptions(permissions),
			reinterpret_cast<zx_vaddr_t>(memory), bytes);
		ASSERT(status == ZX_OK);
	#else
		int result =
			mprotect(memory, bytes, permissionsToMmapProt(permissions));
		ASSERT(result == 0);
	#endif
}

void deallocateMemoryPages(void *memory, size_t bytes)
{
	#if defined(_WIN32)
		unsigned long oldProtection;
		BOOL result =
			VirtualProtect(memory, bytes, PAGE_READWRITE, &oldProtection);
		ASSERT(result);
		deallocate(memory);
	#elif defined(LINUX_ENABLE_NAMED_MMAP) || defined(__APPLE__)
		size_t pageSize = memoryPageSize();
		size_t length = (bytes + pageSize - 1) & ~(pageSize - 1);
		int result = munmap(memory, length);
		ASSERT(result == 0);
	#elif defined(__Fuchsia__)
		size_t pageSize = memoryPageSize();
		size_t length = roundUp(bytes, pageSize);
		zx_status_t status =  zx_vmar_unmap(
			zx_vmar_root_self(), reinterpret_cast<zx_vaddr_t>(memory), length);
		ASSERT(status == ZX_OK);
	#else
		int result = mprotect(memory, bytes, PROT_READ | PROT_WRITE);
		ASSERT(result == 0);
		deallocate(memory);
	#endif
}

}  // namespace rr
