root/src/system/kernel/arch/arm64/PMAPPhysicalPageMapper.cpp
/*
 * Copyright 2022 Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#include "PMAPPhysicalPageMapper.h"


status_t
PMAPPhysicalPageMapper::GetPage(
        phys_addr_t physicalAddress, addr_t* _virtualAddress, void** _handle)
{
        ASSERT(physicalAddress < KERNEL_PMAP_SIZE);

        *_virtualAddress = KERNEL_PMAP_BASE + physicalAddress;
        *_handle = NULL;

        return B_OK;
}


status_t
PMAPPhysicalPageMapper::PutPage(addr_t virtualAddress, void* handle)
{
        return B_OK;
}


status_t
PMAPPhysicalPageMapper::MemsetPhysical(phys_addr_t address, int value, phys_size_t length)
{
        ASSERT(address < KERNEL_PMAP_SIZE);
        memset(reinterpret_cast<void*>(KERNEL_PMAP_BASE + address), value, length);

        return B_OK;
}

status_t
PMAPPhysicalPageMapper::MemcpyFromPhysical(void* to, phys_addr_t from, size_t length, bool user)
{
        ASSERT(from < KERNEL_PMAP_SIZE);

        if (!user) {
                memcpy(to, reinterpret_cast<void*>(KERNEL_PMAP_BASE + from), length);
                return B_OK;
        } else {
                return user_memcpy(to, reinterpret_cast<void*>(KERNEL_PMAP_BASE + from), length);
        }
}


status_t
PMAPPhysicalPageMapper::MemcpyToPhysical(phys_addr_t to, const void* from, size_t length, bool user)
{
        ASSERT(to < KERNEL_PMAP_SIZE);

        if (!user) {
                memcpy(reinterpret_cast<void*>(KERNEL_PMAP_BASE + to), from, length);
                return B_OK;
        } else {
                return user_memcpy(reinterpret_cast<void*>(KERNEL_PMAP_BASE + to), from, length);
        }

        return B_OK;
}


void
PMAPPhysicalPageMapper::MemcpyPhysicalPage(phys_addr_t to, phys_addr_t from)
{
        ASSERT(to < KERNEL_PMAP_SIZE);
        ASSERT(from < KERNEL_PMAP_SIZE);
        memcpy(reinterpret_cast<void*>(KERNEL_PMAP_BASE + to),
                reinterpret_cast<void*>(KERNEL_PMAP_BASE + from), B_PAGE_SIZE);
}