Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}