/* * test attributes of target physical buffer * * Flags: pbuf_is(SECURE, NOT_SECURE, RAM, IOMEM, KEYVAULT). * */ bool core_pbuf_is(uint32_t attr, paddr_t pbuf, size_t len) { struct tee_mmap_region *map; /* Empty buffers complies with anything */ if (len == 0) return true; switch (attr) { case CORE_MEM_SEC: return pbuf_is_inside(secure_only, pbuf, len); case CORE_MEM_NON_SEC: return pbuf_is_inside(nsec_shared, pbuf, len); case CORE_MEM_TEE_RAM: return pbuf_inside_map_area(pbuf, len, map_tee_ram); case CORE_MEM_TA_RAM: return pbuf_inside_map_area(pbuf, len, map_ta_ram); case CORE_MEM_NSEC_SHM: return pbuf_inside_map_area(pbuf, len, map_nsec_shm); case CORE_MEM_MULTPURPOSE: return pbuf_is_multipurpose(pbuf, len); case CORE_MEM_EXTRAM: return pbuf_is_inside(ddr, pbuf, len); case CORE_MEM_CACHED: map = find_map_by_pa(pbuf); if (map == NULL || !pbuf_inside_map_area(pbuf, len, map)) return false; return map->attr >> TEE_MATTR_CACHE_SHIFT == TEE_MATTR_CACHE_CACHED; default: return false; } }
/* Wrapper for the platform specific pbuf_is() service. */ static bool pbuf_is(enum buf_is_attr attr, paddr_t paddr, size_t size) { switch (attr) { case CORE_MEM_SEC: return pbuf_is_inside(secure_only, paddr, size); case CORE_MEM_NON_SEC: return pbuf_is_inside(nsec_shared, paddr, size); case CORE_MEM_MULTPURPOSE: return pbuf_is_multipurpose(paddr, size); case CORE_MEM_EXTRAM: return pbuf_is_inside(ddr, paddr, size); default: EMSG("Unexpected request: attr=%X", attr); return false; } }
/* * Wrapper for the platform specific pbuf_is() service. */ static bool pbuf_is(enum buf_is_attr attr, unsigned long paddr, size_t size) { switch (attr) { case CORE_MEM_SEC: return core_is_buffer_inside(paddr, size, secure_only.paddr, secure_only.size); case CORE_MEM_NON_SEC: return core_is_buffer_inside(paddr, size, nsec_shared.paddr, nsec_shared.size); case CORE_MEM_MULTPURPOSE: return pbuf_is_multipurpose(paddr, size); case CORE_MEM_EXTRAM: return pbuf_is_ddr(paddr, size); default: EMSG("unpexted request: attr=%X", attr); return false; } }