Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 24 additions & 17 deletions arch/arm64/kernel/haoc/iee/iee-func.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ static void iee_may_split_pmd(pud_t *pudp, unsigned long addr, unsigned int orde
pgprot = __pgprot(pgprot_val(pgprot) | PTE_CONT);

entry = mk_pte(page + i, pgprot);
set_pte(ptep, entry);
__set_pte(ptep, entry);
}
}

Expand Down Expand Up @@ -125,21 +125,25 @@ void iee_set_logical_mem(unsigned long addr, unsigned int order, bool prot)
/* Protect addresses one by one on this pte table.*/
for (int i = 0; i < (1UL << order); i++) {
/* Clear continuous bits first. */
if (pte_val(*ptep) & PTE_CONT && !iee_support_cont_pte(addr, order)) {
if (pte_val(__ptep_get(ptep)) & PTE_CONT &&
!iee_support_cont_pte(addr, order)) {
pte_t *cont_ptep = pte_offset_kernel(pmdp, addr & CONT_PTE_MASK);

for (int j = 0; j < CONT_PTES; j++) {
set_pte(cont_ptep, __pte(pte_val(*cont_ptep) & ~PTE_CONT));
pte_t cont_pte = __ptep_get(cont_ptep);

__set_pte(cont_ptep,
__pte(pte_val(cont_pte) & ~PTE_CONT));
cont_ptep++;
}
}

pte = READ_ONCE(*ptep);
pte = __ptep_get(ptep);
if (prot)
pte = __pte((pte_val(pte) | PTE_RDONLY) & ~PTE_DBM);
else
pte = __pte(pte_val(pte) & ~PTE_RDONLY);
set_pte(ptep, pte);
__set_pte(ptep, pte);

ptep++;
}
Expand Down Expand Up @@ -186,14 +190,14 @@ void set_iee_address(unsigned long addr, unsigned int order, bool valid)
addr, end_addr);

for (int i = 0; i < (1UL << order); i++) {
pte_t pte = READ_ONCE(*ptep);
pte_t pte = __ptep_get(ptep);

if (valid)
pte = __pte(pte_val(pte) | PTE_VALID);
else
pte = __pte(pte_val(pte) & ~PTE_VALID);

set_pte(ptep, pte);
__set_pte(ptep, pte);
ptep++;
}
}
Expand All @@ -219,24 +223,24 @@ static void iee_set_sensitive_pte(pte_t *lm_ptep, pte_t *iee_ptep, int order,
int i;

if (use_block_pmd) {
pmd_t pmd = __pmd(pte_val(READ_ONCE(*lm_ptep)));
pmd_t pmd = __pmd(pte_val(__ptep_get(lm_ptep)));

pmd = __pmd((pmd_val(pmd) | PMD_SECT_RDONLY) & ~PTE_DBM);
WRITE_ONCE(*lm_ptep, __pte(pmd_val(pmd)));
for (i = 0; i < (1 << order); i++) {
pte_t pte = READ_ONCE(*iee_ptep);
pte_t pte = __ptep_get(iee_ptep);

pte = __pte(pte_val(pte) | PTE_VALID);
WRITE_ONCE(*iee_ptep, pte);
iee_ptep++;
}
} else {
for (i = 0; i < (1 << order); i++) {
pte_t pte = READ_ONCE(*lm_ptep);
pte_t pte = __ptep_get(lm_ptep);

pte = __pte((pte_val(pte) | PTE_RDONLY) & ~PTE_DBM);
WRITE_ONCE(*lm_ptep, pte);
pte = READ_ONCE(*iee_ptep);
pte = __ptep_get(iee_ptep);
pte = __pte(pte_val(pte) | PTE_VALID);
WRITE_ONCE(*iee_ptep, pte);
lm_ptep++;
Expand All @@ -252,24 +256,24 @@ static void iee_unset_sensitive_pte(pte_t *lm_ptep, pte_t *iee_ptep, int order,
int i;

if (use_block_pmd) {
pmd_t pmd = __pmd(pte_val(READ_ONCE(*lm_ptep)));
pmd_t pmd = __pmd(pte_val(__ptep_get(lm_ptep)));

pmd = __pmd(pmd_val(pmd) | PTE_DBM);
WRITE_ONCE(*lm_ptep, __pte(pmd_val(pmd)));
for (i = 0; i < (1 << order); i++) {
pte_t pte = READ_ONCE(*iee_ptep);
pte_t pte = __ptep_get(iee_ptep);

pte = __pte(pte_val(pte) & ~PTE_VALID);
WRITE_ONCE(*iee_ptep, pte);
iee_ptep++;
}
} else {
for (i = 0; i < (1 << order); i++) {
pte_t pte = READ_ONCE(*lm_ptep);
pte_t pte = __ptep_get(lm_ptep);

pte = __pte(pte_val(pte) | PTE_DBM);
WRITE_ONCE(*lm_ptep, pte);
pte = READ_ONCE(*iee_ptep);
pte = __ptep_get(iee_ptep);
pte = __pte(pte_val(pte) & ~PTE_VALID);
WRITE_ONCE(*iee_ptep, pte);
lm_ptep++;
Expand Down Expand Up @@ -306,14 +310,17 @@ void put_pages_into_iee_block(unsigned long addr, int order)
lm_ptep = pte_offset_kernel(pmdp, addr);

// Handling cont mapping.
if (((1 << order) < CONT_PTES) && (pte_val(*lm_ptep) & PTE_CONT)) {
if (((1 << order) < CONT_PTES) &&
(pte_val(__ptep_get(lm_ptep)) & PTE_CONT)) {
// The beginning of cont mapping.
int i;
pte_t *ptep = pte_offset_kernel(pmdp, addr & CONT_PTE_MASK);

if (order < CONFIG_ARM64_CONT_PTE_SHIFT) {
for (i = 0; i < CONT_PTES; i++) {
set_pte(ptep, __pte(pte_val(*ptep) & ~PTE_CONT));
pte_t pte = __ptep_get(ptep);

__set_pte(ptep, __pte(pte_val(pte) & ~PTE_CONT));
ptep++;
}
}
Expand Down
6 changes: 3 additions & 3 deletions arch/arm64/kernel/haoc/iee/iee-mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,16 +236,16 @@ static void iee_init_pte(pmd_t *pmdp, unsigned long addr, unsigned long end,

ptep = pte_set_fixmap_offset(pmdp, addr);
do {
pte_t old_pte = ptep_get(ptep);
pte_t old_pte = __ptep_get(ptep);

set_pte(ptep, pfn_pte(__phys_to_pfn(phys), prot));
__set_pte(ptep, pfn_pte(__phys_to_pfn(phys), prot));

/*
* After the PTE entry has been populated once, we
* only allow updates to the permission attributes.
*/
IEE_CHECK(!pgattr_change_is_safe(pte_val(old_pte),
pte_val(ptep_get(ptep))));
pte_val(__ptep_get(ptep))));

phys += PAGE_SIZE;
} while (ptep++, addr += PAGE_SIZE, addr != end);
Expand Down
8 changes: 4 additions & 4 deletions arch/arm64/kernel/haoc/iee/iee-token.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ void __init iee_prepare_init_task_token(void)
pud_t *pudp = pud_offset(p4dp, init_token_addr);
pmd_t *pmdp = pmd_offset(pudp, init_token_addr);
pte_t *ptep = pte_offset_kernel(pmdp, init_token_addr);
pte_t pte = READ_ONCE(*ptep);
pte_t pte = __ptep_get(ptep);

pte = __pte(((pte_val(pte) | PTE_VALID) & ~PTE_ADDR_MASK)
| __phys_to_pte_val(init_token_page));
Expand All @@ -42,7 +42,7 @@ void __init iee_prepare_init_task_token(void)
write_sysreg(read_sysreg(TCR_EL1) & ~(TCR_HPD1 | TCR_A1), tcr_el1);
isb();
#else
set_pte(ptep, pte);
__set_pte(ptep, pte);
#endif

init_token_addr += PAGE_SIZE;
Expand Down Expand Up @@ -83,7 +83,7 @@ static inline void iee_set_token(unsigned long token_addr, unsigned long token_p

/* map new pages to IEE addresses one by one or clear them. */
for (int i = 0; i < (1UL << order); i++) {
pte_t pte = READ_ONCE(*ptep);
pte_t pte = __ptep_get(ptep);

if (prot) {
/* rewrite physical address on pte. */
Expand All @@ -97,7 +97,7 @@ static inline void iee_set_token(unsigned long token_addr, unsigned long token_p
curr_addr += PAGE_SIZE;
}

set_pte(ptep, pte);
__set_pte(ptep, pte);
ptep++;
}

Expand Down