mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 20:42:44 +02:00
77 lines
3.4 KiB
C
77 lines
3.4 KiB
C
/**
|
|
* @file virtmem.h
|
|
* @brief Virtual memory mapping utilities
|
|
* @author plutoo
|
|
* @copyright libnx Authors
|
|
*/
|
|
#pragma once
|
|
#include "../types.h"
|
|
|
|
/// Address space reservation type (see \ref virtmemAddReservation)
|
|
typedef struct VirtmemReservation VirtmemReservation;
|
|
|
|
/**
|
|
* @brief Reserves a slice of general purpose address space sequentially.
|
|
* @param size Desired size of the slice (rounded up to page alignment).
|
|
* @return Pointer to the slice of address space.
|
|
* @deprecated This function is prone to race conditions, please use \ref virtmemFindAslr or \ref virtmemFindCodeMemory (and, if necessary, \ref virtmemAddReservation) instead.
|
|
*/
|
|
void* DEPRECATED virtmemReserve(size_t size);
|
|
|
|
/**
|
|
* @brief Relinquishes a slice of address space reserved with virtmemReserve (currently no-op).
|
|
* @param addr Pointer to the slice.
|
|
* @param size Size of the slice.
|
|
* @deprecated This function is a companion of \ref virtmemReserve which is deprecated.
|
|
*/
|
|
void DEPRECATED virtmemFree(void* addr, size_t size);
|
|
|
|
/// Locks the virtual memory manager mutex.
|
|
void virtmemLock(void);
|
|
|
|
/// Unlocks the virtual memory manager mutex.
|
|
void virtmemUnlock(void);
|
|
|
|
/**
|
|
* @brief Finds a random slice of free general purpose address space.
|
|
* @param size Desired size of the slice (rounded up to page alignment).
|
|
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
|
|
* @return Pointer to the slice of address space, or NULL on failure.
|
|
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
|
|
*/
|
|
void* virtmemFindAslr(size_t size, size_t guard_size);
|
|
|
|
/**
|
|
* @brief Finds a random slice of free stack address space.
|
|
* @param size Desired size of the slice (rounded up to page alignment).
|
|
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
|
|
* @return Pointer to the slice of address space, or NULL on failure.
|
|
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
|
|
*/
|
|
void* virtmemFindStack(size_t size, size_t guard_size);
|
|
|
|
/**
|
|
* @brief Finds a random slice of free code memory address space.
|
|
* @param size Desired size of the slice (rounded up to page alignment).
|
|
* @param guard_size Desired size of the unmapped guard areas surrounding the slice (rounded up to page alignment).
|
|
* @return Pointer to the slice of address space, or NULL on failure.
|
|
* @note The virtual memory manager mutex must be held during the find-and-map process (see \ref virtmemLock and \ref virtmemUnlock).
|
|
*/
|
|
void* virtmemFindCodeMemory(size_t size, size_t guard_size);
|
|
|
|
/**
|
|
* @brief Reserves a range of memory address space.
|
|
* @param mem Pointer to the address space slice.
|
|
* @param size Size of the slice.
|
|
* @return Pointer to a reservation object, or NULL on failure.
|
|
* @remark This function is intended to be used in lieu of a memory map operation when the memory won't be mapped straight away.
|
|
* @note The virtual memory manager mutex must be held during the find-and-reserve process (see \ref virtmemLock and \ref virtmemUnlock).
|
|
*/
|
|
VirtmemReservation* virtmemAddReservation(void* mem, size_t size);
|
|
|
|
/**
|
|
* @brief Releases a memory address space reservation.
|
|
* @param rv Reservation to release.
|
|
*/
|
|
void virtmemRemoveReservation(VirtmemReservation* rv);
|