uint32_t pt_large_entry(intptr_t phys_addr, enum access priv, enum access unpri, enum mem_type type, enum mem_cache cache_in, enum mem_cache cache_out, bool executable, bool shared, bool global) { uint8_t mem_attr = get_mem_attr(type, cache_in, cache_out); return (phys_addr & ((PT_SIZE << 1) - 1)) | PAG_ACC[priv][unpri] | (executable ? 0 : PAGL_XN) | (shared ? PAG_SHARE : 0) | (global ? 0 : PAG_nG) | ((mem_attr & 0x0F) << 2) | ((mem_attr & 0xF0) << 8) | PTE_T_PAGL; }
uint32_t pd_section_entry(intptr_t phys_addr, uint8_t domain, enum access priv, enum access unpri, enum mem_type type, enum mem_cache cache_in, enum mem_cache cache_out, bool executable, bool shared, bool global) { uint8_t mem_attr = get_mem_attr(type, cache_in, cache_out); return (phys_addr & (SECTION_SIZE - 1)) | PDE_DOMAIN(domain) | SEC_ACC[priv][unpri] | (executable ? 0 : SEC_XN) | (shared ? SEC_SHARE : 0) | (global ? 0 : SEC_nG) | ((mem_attr & 0x0F) << 2) | ((mem_attr & 0xF0) << 8) | PDE_T_SEC; }
int trusty_encode_page_info(struct ns_mem_page_info *inf, struct page *page, pgprot_t pgprot) { int mem_attr; uint64_t pte; if (!inf || !page) return -EINVAL; /* get physical address */ pte = (uint64_t) page_to_phys(page); /* get memory attributes */ mem_attr = get_mem_attr(page, pgprot); if (mem_attr < 0) return mem_attr; if (pgprot_val(pgprot) & _PAGE_USER) pte |= (1 << 6); if (!(pgprot_val(pgprot) & _PAGE_RW)) pte |= (1 << 7); inf->attr = (pte & 0x0000FFFFFFFFFFFFull) | ((uint64_t)mem_attr << 48); return 0; }