/* mmapio.c -- File views using mmap.
   Copyright (C) 2012-2018 Free Software Foundation, Inc.
   Written by Ian Lance Taylor, Google.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

    (1) Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    (2) Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in
    the documentation and/or other materials provided with the
    distribution.

    (3) The name of the author may not be used to
    endorse or promote products derived from this software without
    specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.  */

#include "config.h"

#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include "backtrace.h"
#include "backtrace_t.h"
#include "internal.h"

#include "sgx_trts.h"

#ifndef PROT_READ
#define PROT_READ 0x1
#endif

#ifndef PROT_WRITE
#define PROT_WRITE 0x2
#endif

#ifndef MAP_SHARED
#define MAP_SHARED 0x01
#endif

#ifndef MAP_PRIVATE
#define MAP_PRIVATE 0x02
#endif

#ifndef MAP_FAILED
#define MAP_FAILED ((void *)-1)
#endif

/* This file implements file views and memory allocation when mmap is
   available.  */

/* Create a view of SIZE bytes from DESCRIPTOR at OFFSET.  */

extern int getpagesize(void);

int
backtrace_get_view(struct backtrace_state* state ATTRIBUTE_UNUSED,
                   int descriptor, off_t offset, size_t size,
                   backtrace_error_callback error_callback,
                   void* data, struct backtrace_view* view) {
    size_t pagesize = 0;
    unsigned int inpage = 0;
    off_t pageoff;
    void* map = NULL;
    int error = 0;

    pagesize = getpagesize();
    inpage = offset % pagesize;
    pageoff = offset - inpage;

    size += inpage;
    size = (size + (pagesize - 1)) & ~(pagesize - 1);

    uint32_t status = u_mmap_ocall(&map, &error, NULL, size, PROT_READ, MAP_PRIVATE,
                      descriptor, pageoff);

    if (status != 0) {
        error_callback(data, "sgx ocall failed", status);
        return 0;
    }

    if (!sgx_is_outside_enclave(map, size)) {
        error_callback(data, "mmap result error", error);
        return 0;
    }

    //map = mmap (NULL, size, PROT_READ, MAP_PRIVATE, descriptor, pageoff);
    if (map == MAP_FAILED) {
        error_callback(data, "mmap", error);
        return 0;
    }

    view->data = (char*) map + inpage;
    view->base = map;
    view->len = size;

    return 1;
}

/* Release a view read by backtrace_get_view.  */

void
backtrace_release_view(struct backtrace_state* state ATTRIBUTE_UNUSED,
                       struct backtrace_view* view,
                       backtrace_error_callback error_callback,
                       void* data) {
    union {
        const void* cv;
        void* v;
    } const_cast;

    const_cast.cv = view->base;
    //if (munmap (const_cast.v, view->len) < 0)
    //  error_callback (data, "munmap", errno);

    int retval = 0;
    int error = 0;
    uint32_t status = u_munmap_ocall(&retval, &error, const_cast.v, view->len);

    if (status != 0) {
        error_callback(data, "sgx ocall failed", status);
    } else if (retval == -1) {
        error_callback(data, "munmap", error);
    }

    return;
}
