blob: 8de2bad9ab954b99be253c20b06127a824766d6d [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (c) 2014, STMicroelectronics International N.V.
*/
#ifndef TEE_MMU_TYPES_H
#define TEE_MMU_TYPES_H
#include <stdint.h>
#include <sys/queue.h>
#include <util.h>
#define TEE_MATTR_VALID_BLOCK BIT(0)
#define TEE_MATTR_TABLE BIT(3)
#define TEE_MATTR_PR BIT(4)
#define TEE_MATTR_PW BIT(5)
#define TEE_MATTR_PX BIT(6)
#define TEE_MATTR_PRW (TEE_MATTR_PR | TEE_MATTR_PW)
#define TEE_MATTR_PRX (TEE_MATTR_PR | TEE_MATTR_PX)
#define TEE_MATTR_PRWX (TEE_MATTR_PRW | TEE_MATTR_PX)
#define TEE_MATTR_UR BIT(7)
#define TEE_MATTR_UW BIT(8)
#define TEE_MATTR_UX BIT(9)
#define TEE_MATTR_URW (TEE_MATTR_UR | TEE_MATTR_UW)
#define TEE_MATTR_URX (TEE_MATTR_UR | TEE_MATTR_UX)
#define TEE_MATTR_URWX (TEE_MATTR_URW | TEE_MATTR_UX)
#define TEE_MATTR_PROT_MASK (TEE_MATTR_PRWX | TEE_MATTR_URWX)
#define TEE_MATTR_GLOBAL BIT(10)
#define TEE_MATTR_SECURE BIT(11)
#define TEE_MATTR_CACHE_MASK 0x7
#define TEE_MATTR_CACHE_SHIFT 12
/* These are shifted TEE_MATTR_CACHE_SHIFT */
#define TEE_MATTR_CACHE_NONCACHE 0
#define TEE_MATTR_CACHE_CACHED 1
/*
* Tags TA mappings which are only used during a single call (open session
* or invoke command parameters).
*/
#define VM_FLAG_EPHEMERAL BIT(0)
/*
* Tags TA mappings that must not be removed (kernel mappings while in user
* mode).
*/
#define VM_FLAG_PERMANENT BIT(1)
/* Tags TA mappings that may be shared with other TAs. */
#define VM_FLAG_SHAREABLE BIT(2)
/* Tags temporary mappings added to load the ldelf binary */
#define VM_FLAG_LDELF BIT(3)
/*
* The mapping should only be mapped read-only, not enforced by the vm_*
* functions.
*/
#define VM_FLAG_READONLY BIT(4)
/*
* Set of flags used by tee_mmu_is_vbuf_inside_ta_private() and
* tee_mmu_is_vbuf_intersect_ta_private() to tell if a certain region is
* mapping TA internal memory or not.
*/
#define VM_FLAGS_NONPRIV (VM_FLAG_EPHEMERAL | \
VM_FLAG_PERMANENT | \
VM_FLAG_SHAREABLE | VM_FLAG_LDELF)
struct tee_mmap_region {
unsigned int type; /* enum teecore_memtypes */
unsigned int region_size;
paddr_t pa;
vaddr_t va;
size_t size;
uint32_t attr; /* TEE_MATTR_* above */
};
struct vm_region {
struct mobj *mobj;
size_t offset;
vaddr_t va;
size_t size;
uint16_t attr; /* TEE_MATTR_* above */
uint16_t flags; /* VM_FLAGS_* above */
TAILQ_ENTRY(vm_region) link;
};
TAILQ_HEAD(vm_region_head, vm_region);
struct vm_info {
struct vm_region_head regions;
unsigned int asid;
};
static inline void mattr_perm_to_str(char *str, size_t size, uint32_t attr)
{
if (size < 7)
return;
str[0] = (attr & TEE_MATTR_UR) ? 'r' : '-';
str[1] = (attr & TEE_MATTR_UW) ? 'w' : '-';
str[2] = (attr & TEE_MATTR_UX) ? 'x' : '-';
str[3] = (attr & TEE_MATTR_PR) ? 'R' : '-';
str[4] = (attr & TEE_MATTR_PW) ? 'W' : '-';
str[5] = (attr & TEE_MATTR_PX) ? 'X' : '-';
str[6] = '\0';
}
#endif