Skip to content

Commit deb2a1d

Browse files
committed
Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
Pyll ARM64 patches from Catalin Marinas: - Build fix with DMA_CMA enabled - Introduction of PTE_WRITE to distinguish between writable but clean and truly read-only pages - FIQs enabling/disabling clean-up (they aren't used on arm64) - CPU resume fix for the per-cpu offset restoring - Code comment typos * tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux: arm64: mm: Introduce PTE_WRITE arm64: mm: Remove PTE_BIT_FUNC macro arm64: FIQs are unused arm64: mm: fix the function name in comment of cpu_do_switch_mm arm64: fix build error if DMA_CMA is enabled arm64: kernel: fix per-cpu offset restore on resume arm64: mm: fix the function name in comment of __flush_dcache_area arm64: mm: use ubfm for dcache_line_size
2 parents bcc9f96 + c2c93e5 commit deb2a1d

File tree

8 files changed

+74
-43
lines changed

8 files changed

+74
-43
lines changed

arch/arm64/include/asm/dma-contiguous.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#ifdef CONFIG_DMA_CMA
1919

2020
#include <linux/types.h>
21-
#include <asm-generic/dma-contiguous.h>
2221

2322
static inline void
2423
dma_contiguous_early_fixup(phys_addr_t base, unsigned long size) { }

arch/arm64/include/asm/pgtable.h

Lines changed: 63 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
#define PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !pte_present() */
2929
#define PTE_DIRTY (_AT(pteval_t, 1) << 55)
3030
#define PTE_SPECIAL (_AT(pteval_t, 1) << 56)
31-
/* bit 57 for PMD_SECT_SPLITTING */
31+
#define PTE_WRITE (_AT(pteval_t, 1) << 57)
3232
#define PTE_PROT_NONE (_AT(pteval_t, 1) << 58) /* only when !PTE_VALID */
3333

3434
/*
@@ -67,29 +67,29 @@ extern pgprot_t pgprot_default;
6767

6868
#define _MOD_PROT(p, b) __pgprot_modify(p, 0, b)
6969

70-
#define PAGE_NONE __pgprot_modify(pgprot_default, PTE_TYPE_MASK, PTE_PROT_NONE | PTE_RDONLY | PTE_PXN | PTE_UXN)
71-
#define PAGE_SHARED _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
72-
#define PAGE_SHARED_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN)
73-
#define PAGE_COPY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
74-
#define PAGE_COPY_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY)
75-
#define PAGE_READONLY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
76-
#define PAGE_READONLY_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY)
77-
#define PAGE_KERNEL _MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY)
78-
#define PAGE_KERNEL_EXEC _MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY)
70+
#define PAGE_NONE __pgprot_modify(pgprot_default, PTE_TYPE_MASK, PTE_PROT_NONE | PTE_PXN | PTE_UXN)
71+
#define PAGE_SHARED _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE)
72+
#define PAGE_SHARED_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE)
73+
#define PAGE_COPY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
74+
#define PAGE_COPY_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN)
75+
#define PAGE_READONLY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
76+
#define PAGE_READONLY_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN)
77+
#define PAGE_KERNEL _MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY | PTE_WRITE)
78+
#define PAGE_KERNEL_EXEC _MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY | PTE_WRITE)
7979

8080
#define PAGE_HYP _MOD_PROT(pgprot_default, PTE_HYP)
8181
#define PAGE_HYP_DEVICE __pgprot(PROT_DEVICE_nGnRE | PTE_HYP)
8282

8383
#define PAGE_S2 __pgprot_modify(pgprot_default, PTE_S2_MEMATTR_MASK, PTE_S2_MEMATTR(MT_S2_NORMAL) | PTE_S2_RDONLY)
8484
#define PAGE_S2_DEVICE __pgprot(PROT_DEFAULT | PTE_S2_MEMATTR(MT_S2_DEVICE_nGnRE) | PTE_S2_RDWR | PTE_UXN)
8585

86-
#define __PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE | PTE_RDONLY | PTE_PXN | PTE_UXN)
87-
#define __PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
88-
#define __PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN)
89-
#define __PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
90-
#define __PAGE_COPY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY)
91-
#define __PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY)
92-
#define __PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_RDONLY)
86+
#define __PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE | PTE_PXN | PTE_UXN)
87+
#define __PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE)
88+
#define __PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE)
89+
#define __PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
90+
#define __PAGE_COPY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN)
91+
#define __PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
92+
#define __PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN)
9393

9494
#endif /* __ASSEMBLY__ */
9595

@@ -140,22 +140,53 @@ extern struct page *empty_zero_page;
140140
#define pte_dirty(pte) (pte_val(pte) & PTE_DIRTY)
141141
#define pte_young(pte) (pte_val(pte) & PTE_AF)
142142
#define pte_special(pte) (pte_val(pte) & PTE_SPECIAL)
143-
#define pte_write(pte) (!(pte_val(pte) & PTE_RDONLY))
143+
#define pte_write(pte) (pte_val(pte) & PTE_WRITE)
144144
#define pte_exec(pte) (!(pte_val(pte) & PTE_UXN))
145145

146146
#define pte_valid_user(pte) \
147147
((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER))
148148

149-
#define PTE_BIT_FUNC(fn,op) \
150-
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
149+
static inline pte_t pte_wrprotect(pte_t pte)
150+
{
151+
pte_val(pte) &= ~PTE_WRITE;
152+
return pte;
153+
}
154+
155+
static inline pte_t pte_mkwrite(pte_t pte)
156+
{
157+
pte_val(pte) |= PTE_WRITE;
158+
return pte;
159+
}
160+
161+
static inline pte_t pte_mkclean(pte_t pte)
162+
{
163+
pte_val(pte) &= ~PTE_DIRTY;
164+
return pte;
165+
}
166+
167+
static inline pte_t pte_mkdirty(pte_t pte)
168+
{
169+
pte_val(pte) |= PTE_DIRTY;
170+
return pte;
171+
}
151172

152-
PTE_BIT_FUNC(wrprotect, |= PTE_RDONLY);
153-
PTE_BIT_FUNC(mkwrite, &= ~PTE_RDONLY);
154-
PTE_BIT_FUNC(mkclean, &= ~PTE_DIRTY);
155-
PTE_BIT_FUNC(mkdirty, |= PTE_DIRTY);
156-
PTE_BIT_FUNC(mkold, &= ~PTE_AF);
157-
PTE_BIT_FUNC(mkyoung, |= PTE_AF);
158-
PTE_BIT_FUNC(mkspecial, |= PTE_SPECIAL);
173+
static inline pte_t pte_mkold(pte_t pte)
174+
{
175+
pte_val(pte) &= ~PTE_AF;
176+
return pte;
177+
}
178+
179+
static inline pte_t pte_mkyoung(pte_t pte)
180+
{
181+
pte_val(pte) |= PTE_AF;
182+
return pte;
183+
}
184+
185+
static inline pte_t pte_mkspecial(pte_t pte)
186+
{
187+
pte_val(pte) |= PTE_SPECIAL;
188+
return pte;
189+
}
159190

160191
static inline void set_pte(pte_t *ptep, pte_t pte)
161192
{
@@ -170,8 +201,10 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
170201
if (pte_valid_user(pte)) {
171202
if (pte_exec(pte))
172203
__sync_icache_dcache(pte, addr);
173-
if (!pte_dirty(pte))
174-
pte = pte_wrprotect(pte);
204+
if (pte_dirty(pte) && pte_write(pte))
205+
pte_val(pte) &= ~PTE_RDONLY;
206+
else
207+
pte_val(pte) |= PTE_RDONLY;
175208
}
176209

177210
set_pte(ptep, pte);
@@ -345,7 +378,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
345378
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
346379
{
347380
const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY |
348-
PTE_PROT_NONE | PTE_VALID;
381+
PTE_PROT_NONE | PTE_VALID | PTE_WRITE;
349382
pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);
350383
return pte;
351384
}

arch/arm64/kernel/process.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,6 @@ EXPORT_SYMBOL_GPL(pm_power_off);
8585
void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
8686
EXPORT_SYMBOL_GPL(arm_pm_restart);
8787

88-
void arch_cpu_idle_prepare(void)
89-
{
90-
local_fiq_enable();
91-
}
92-
9388
/*
9489
* This is our default idle handler.
9590
*/
@@ -138,7 +133,6 @@ void machine_restart(char *cmd)
138133

139134
/* Disable interrupts first */
140135
local_irq_disable();
141-
local_fiq_disable();
142136

143137
/* Now call the architecture specific reboot code. */
144138
if (arm_pm_restart)

arch/arm64/kernel/smp.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ asmlinkage void secondary_start_kernel(void)
161161
complete(&cpu_running);
162162

163163
local_irq_enable();
164-
local_fiq_enable();
165164
local_async_enable();
166165

167166
/*
@@ -495,7 +494,6 @@ static void ipi_cpu_stop(unsigned int cpu)
495494

496495
set_cpu_online(cpu, false);
497496

498-
local_fiq_disable();
499497
local_irq_disable();
500498

501499
while (1)

arch/arm64/kernel/suspend.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <linux/percpu.h>
12
#include <linux/slab.h>
23
#include <asm/cacheflush.h>
34
#include <asm/cpu_ops.h>
@@ -89,6 +90,13 @@ int cpu_suspend(unsigned long arg)
8990
if (ret == 0) {
9091
cpu_switch_mm(mm->pgd, mm);
9192
flush_tlb_all();
93+
94+
/*
95+
* Restore per-cpu offset before any kernel
96+
* subsystem relying on it has a chance to run.
97+
*/
98+
set_my_cpu_offset(per_cpu_offset(cpu));
99+
92100
/*
93101
* Restore HW breakpoint registers to sane values
94102
* before debug exceptions are possibly reenabled

arch/arm64/mm/cache.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ ENDPROC(flush_icache_range)
146146
ENDPROC(__flush_cache_user_range)
147147

148148
/*
149-
* __flush_kern_dcache_page(kaddr)
149+
* __flush_dcache_area(kaddr, size)
150150
*
151151
* Ensure that the data held in the page kaddr is written back to the
152152
* page in question.

arch/arm64/mm/proc-macros.S

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@
3838
*/
3939
.macro dcache_line_size, reg, tmp
4040
mrs \tmp, ctr_el0 // read CTR
41-
lsr \tmp, \tmp, #16
42-
and \tmp, \tmp, #0xf // cache line size encoding
41+
ubfm \tmp, \tmp, #16, #19 // cache line size encoding
4342
mov \reg, #4 // bytes per word
4443
lsl \reg, \reg, \tmp // actual cache line size
4544
.endm

arch/arm64/mm/proc.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ ENDPROC(cpu_do_resume)
150150
#endif
151151

152152
/*
153-
* cpu_switch_mm(pgd_phys, tsk)
153+
* cpu_do_switch_mm(pgd_phys, tsk)
154154
*
155155
* Set the translation table base pointer to be pgd_phys.
156156
*

0 commit comments

Comments
 (0)