libnx/nx/include/switch/kernel/tmem.h

96 lines
3.6 KiB
C

/**
* @file tmem.h
* @brief Transfer memory handling
* @author plutoo
* @copyright libnx Authors
* @remark Transfer memory differs from shared memory in the fact that the user process (as opposed to the kernel) allocates and owns its backing memory.
*/
#pragma once
#include "../types.h"
#include "../kernel/svc.h"
/// Transfer memory information structure.
typedef struct {
Handle handle; ///< Kernel object handle.
size_t size; ///< Size of the transfer memory object.
Permission perm; ///< Permissions of the transfer memory object.
void* src_addr; ///< Address of the source backing memory.
void* map_addr; ///< Address to which the transfer memory object is mapped.
} TransferMemory;
/**
* @brief Creates a transfer memory object.
* @param t Transfer memory information structure that will be filled in.
* @param size Size of the transfer memory object to create.
* @param perm Permissions with which to protect the transfer memory in the local process.
* @return Result code.
*/
Result tmemCreate(TransferMemory* t, size_t size, Permission perm);
/**
* @brief Creates a transfer memory object from existing memory.
* @param t Transfer memory information structure that will be filled in.
* @param buf Pointer to a page-aligned buffer.
* @param size Size of the transfer memory object to create.
* @param perm Permissions with which to protect the transfer memory in the local process.
* @return Result code.
*/
Result tmemCreateFromMemory(TransferMemory* t, void* buf, size_t size, Permission perm);
/**
* @brief Loads a transfer memory object coming from a remote process.
* @param t Transfer memory information structure which will be filled in.
* @param handle Handle of the transfer memory object.
* @param size Size of the transfer memory object that is being loaded.
* @param perm Permissions which the transfer memory is expected to have in the process that owns the memory.
* @warning This is a privileged operation; in normal circumstances applications shouldn't use this function.
*/
void tmemLoadRemote(TransferMemory* t, Handle handle, size_t size, Permission perm);
/**
* @brief Maps a transfer memory object.
* @param t Transfer memory information structure.
* @return Result code.
* @warning This is a privileged operation; in normal circumstances applications cannot use this function.
*/
Result tmemMap(TransferMemory* t);
/**
* @brief Unmaps a transfer memory object.
* @param t Transfer memory information structure.
* @return Result code.
* @warning This is a privileged operation; in normal circumstances applications cannot use this function.
*/
Result tmemUnmap(TransferMemory* t);
/**
* @brief Retrieves the mapped address of a transfer memory object.
* @param t Transfer memory information structure.
* @return Mapped address of the transfer memory object.
*/
static inline void* tmemGetAddr(TransferMemory* t){
return t->map_addr;
}
/**
* @brief Closes handle of a transfer memory object.
* @param t Transfer memory information structure.
* @return Result code.
*/
Result tmemCloseHandle(TransferMemory* t);
/**
* @brief Waits until source backing memory permissions match perm.
* @param t Transfer memory information structure.
* @param perm Permissions which the source backing memory is expected to have before return.
* @return Result code.
*/
Result tmemWaitForPermission(TransferMemory* t, Permission perm);
/**
* @brief Frees up resources used by a transfer memory object, unmapping and closing handles, etc.
* @param t Transfer memory information structure.
* @return Result code.
*/
Result tmemClose(TransferMemory* t);