// Copyright 2019 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 "MemFd.hpp"
#include "../Debug.hpp"

#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>

#ifndef MFD_CLOEXEC
#define MFD_CLOEXEC       0x0001U
#endif

#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__ */

LinuxMemFd::~LinuxMemFd()
{
	close();
}

void LinuxMemFd::importFd(int fd)
{
	close();
	fd_ = fd;
}

int LinuxMemFd::exportFd() const
{
	if (fd_ < 0)
	{
		return fd_;
	}

	// Duplicate file descriptor while setting the clo-on-exec flag (Linux specific).
	return ::fcntl(fd_, F_DUPFD_CLOEXEC, 0);
}

bool LinuxMemFd::allocate(const char* name, size_t size)
{
	close();

#ifndef __NR_memfd_create
	TRACE("memfd_create() not supported on this system!");
	return false;
#else
	// In the event of no system call this returns -1 with errno set
	// as ENOSYS.
	fd_ = syscall(__NR_memfd_create, name, MFD_CLOEXEC);
	if (fd_ < 0)
	{
		TRACE("memfd_create() returned %d: %s", errno, strerror(errno));
		return false;
	}
	// Ensure there is enough space.
	if (size > 0 && ::ftruncate(fd_, size) < 0)
	{
		TRACE("ftruncate() %lld returned %d: %s", (long long)size, errno, strerror(errno));
		close();
		return false;
	}
#endif
	return true;
}

void LinuxMemFd::close()
{
	if (fd_ >= 0)
	{
		// WARNING: Never retry on close() failure, even with EINTR, see
		// https://lwn.net/Articles/576478/ for example.
		int ret = ::close(fd_);
		if (ret < 0) {
			TRACE("LinuxMemFd::close() failed with: %s", strerror(errno));
			assert(false);
		}
		fd_ = -1;
	}
}

void* LinuxMemFd::mapReadWrite(size_t offset, size_t size)
{
	void* addr = ::mmap(nullptr, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd_,
						static_cast<off_t>(offset));
	return (addr == MAP_FAILED) ? nullptr : addr;
}

bool LinuxMemFd::unmap(void* addr, size_t size)
{
	return ::munmap(addr, size) == 0;
}
