/* * 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; } }
/* * core_init_mmu_map - init tee core default memory mapping * * this routine sets the static default tee core mapping. * * If an error happend: core_init_mmu_map is expected to reset. */ void core_init_mmu_map(void) { struct tee_mmap_region *map; size_t n; for (n = 0; n < ARRAY_SIZE(secure_only); n++) { if (pbuf_intersects(nsec_shared, secure_only[n].paddr, secure_only[n].size)) panic("Invalid memory access config: sec/nsec"); } if (!mem_map_inited) init_mem_map(static_memory_map, ARRAY_SIZE(static_memory_map)); map = static_memory_map; while (map->type != MEM_AREA_NOTYPE) { switch (map->type) { case MEM_AREA_TEE_RAM: if (!pbuf_is_inside(secure_only, map->pa, map->size)) panic("TEE_RAM can't fit in secure_only"); map_tee_ram = map; break; case MEM_AREA_TA_RAM: if (!pbuf_is_inside(secure_only, map->pa, map->size)) panic("TA_RAM can't fit in secure_only"); map_ta_ram = map; break; case MEM_AREA_NSEC_SHM: if (!pbuf_is_inside(nsec_shared, map->pa, map->size)) panic("NS_SHM can't fit in nsec_shared"); map_nsec_shm = map; break; case MEM_AREA_IO_SEC: case MEM_AREA_IO_NSEC: case MEM_AREA_RAM_SEC: case MEM_AREA_RAM_NSEC: case MEM_AREA_RES_VASPACE: break; default: EMSG("Uhandled memtype %d", map->type); panic(); } map++; } /* Check that we have the mandatory memory areas defined */ if (!map_tee_ram || !map_ta_ram || !map_nsec_shm) panic("mandatory area(s) not found"); core_init_mmu_tables(static_memory_map); }
static bool pbuf_is_multipurpose(paddr_t paddr, size_t size) { if (pbuf_intersects(secure_only, paddr, size)) return false; if (pbuf_intersects(nsec_shared, paddr, size)) return false; return pbuf_is_inside(ddr, paddr, size); }
/* * This routine is called when MMU and core memory management are not * initialized. */ struct map_area *bootcfg_get_memory(void) { struct map_area *map; size_t n; for (n = 0; n < ARRAY_SIZE(secure_only); n++) { if (pbuf_intersects(nsec_shared, secure_only[n].paddr, secure_only[n].size)) { EMSG("Invalid memory access configuration: sec/nsec"); return NULL; } } /* Overlapping will be tested later */ map = bootcfg_memory_map; while (map->type != MEM_AREA_NOTYPE) { switch (map->type) { case MEM_AREA_TEE_RAM: if (!pbuf_is_inside(secure_only, map->pa, map->size)) { EMSG("TEE_RAM does not fit in secure_only"); return NULL; } break; case MEM_AREA_TA_RAM: if (!pbuf_is_inside(secure_only, map->pa, map->size)) { EMSG("TA_RAM does not fit in secure_only"); return NULL; } break; /*case MEM_AREA_NSEC_SHM: if (!pbuf_is_inside(nsec_shared, map->pa, map->size)) { EMSG("NSEC_SHM does not fit in nsec_shared"); return NULL; } break;*/ default: /* Other mapped areas are not checked. */ break; } map++; } return bootcfg_memory_map; }
/* 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; } }