Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-aarch64

Pull arm64 fixes from Catalin Marinas:
- Page protection fixes, including proper PAGE_NONE handling
- Timezone vdso sequence counting fix
- Additional compat syscall wiring

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-aarch64:
arm64: compat: add syscall table entries for new syscalls
arm64: mm: introduce present, faulting entries for PAGE_NONE
arm64: mm: only wrprotect clean ptes if they are present
arm64: vdso: remove broken, redundant sequence counting for timezones

+26 -23
+20 -16
arch/arm64/include/asm/pgtable.h
··· 24 24 /* 25 25 * Software defined PTE bits definition. 26 26 */ 27 - #define PTE_VALID (_AT(pteval_t, 1) << 0) /* pte_present() check */ 27 + #define PTE_VALID (_AT(pteval_t, 1) << 0) 28 + #define PTE_PROT_NONE (_AT(pteval_t, 1) << 1) /* only when !PTE_VALID */ 28 29 #define PTE_FILE (_AT(pteval_t, 1) << 2) /* only when !pte_present() */ 29 30 #define PTE_DIRTY (_AT(pteval_t, 1) << 55) 30 31 #define PTE_SPECIAL (_AT(pteval_t, 1) << 56) ··· 61 60 62 61 extern pgprot_t pgprot_default; 63 62 64 - #define _MOD_PROT(p, b) __pgprot(pgprot_val(p) | (b)) 63 + #define __pgprot_modify(prot,mask,bits) \ 64 + __pgprot((pgprot_val(prot) & ~(mask)) | (bits)) 65 65 66 - #define PAGE_NONE _MOD_PROT(pgprot_default, PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) 66 + #define _MOD_PROT(p, b) __pgprot_modify(p, 0, b) 67 + 68 + #define PAGE_NONE __pgprot_modify(pgprot_default, PTE_TYPE_MASK, PTE_PROT_NONE) 67 69 #define PAGE_SHARED _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) 68 70 #define PAGE_SHARED_EXEC _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN) 69 71 #define PAGE_COPY _MOD_PROT(pgprot_default, PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) ··· 76 72 #define PAGE_KERNEL _MOD_PROT(pgprot_default, PTE_PXN | PTE_UXN | PTE_DIRTY) 77 73 #define PAGE_KERNEL_EXEC _MOD_PROT(pgprot_default, PTE_UXN | PTE_DIRTY) 78 74 79 - #define __PAGE_NONE __pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) 75 + #define __PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE) 80 76 #define __PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) 81 77 #define __PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN) 82 78 #define __PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_RDONLY) ··· 129 125 /* 130 126 * The following only work if pte_present(). Undefined behaviour otherwise. 131 127 */ 132 - #define pte_present(pte) (pte_val(pte) & PTE_VALID) 128 + #define pte_present(pte) (pte_val(pte) & (PTE_VALID | PTE_PROT_NONE)) 133 129 #define pte_dirty(pte) (pte_val(pte) & PTE_DIRTY) 134 130 #define pte_young(pte) (pte_val(pte) & PTE_AF) 135 131 #define pte_special(pte) (pte_val(pte) & PTE_SPECIAL) 136 132 #define pte_write(pte) (!(pte_val(pte) & PTE_RDONLY)) 137 133 #define pte_exec(pte) (!(pte_val(pte) & PTE_UXN)) 138 134 139 - #define pte_present_exec_user(pte) \ 140 - ((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == \ 141 - (PTE_VALID | PTE_USER)) 135 + #define pte_valid_user(pte) \ 136 + ((pte_val(pte) & (PTE_VALID | PTE_USER)) == (PTE_VALID | PTE_USER)) 142 137 143 138 #define PTE_BIT_FUNC(fn,op) \ 144 139 static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; } ··· 160 157 static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, 161 158 pte_t *ptep, pte_t pte) 162 159 { 163 - if (pte_present_exec_user(pte)) 164 - __sync_icache_dcache(pte, addr); 165 - if (!pte_dirty(pte)) 166 - pte = pte_wrprotect(pte); 160 + if (pte_valid_user(pte)) { 161 + if (pte_exec(pte)) 162 + __sync_icache_dcache(pte, addr); 163 + if (!pte_dirty(pte)) 164 + pte = pte_wrprotect(pte); 165 + } 166 + 167 167 set_pte(ptep, pte); 168 168 } 169 169 ··· 175 169 */ 176 170 #define pte_huge(pte) ((pte_val(pte) & PTE_TYPE_MASK) == PTE_TYPE_HUGEPAGE) 177 171 #define pte_mkhuge(pte) (__pte((pte_val(pte) & ~PTE_TYPE_MASK) | PTE_TYPE_HUGEPAGE)) 178 - 179 - #define __pgprot_modify(prot,mask,bits) \ 180 - __pgprot((pgprot_val(prot) & ~(mask)) | (bits)) 181 172 182 173 #define __HAVE_ARCH_PTE_SPECIAL 183 174 ··· 267 264 268 265 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) 269 266 { 270 - const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY; 267 + const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | 268 + PTE_PROT_NONE | PTE_VALID; 271 269 pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); 272 270 return pte; 273 271 }
+6 -1
arch/arm64/include/asm/unistd32.h
··· 395 395 __SYSCALL(371, compat_sys_open_by_handle_at) 396 396 __SYSCALL(372, compat_sys_clock_adjtime) 397 397 __SYSCALL(373, sys_syncfs) 398 + __SYSCALL(374, compat_sys_sendmmsg) 399 + __SYSCALL(375, sys_setns) 400 + __SYSCALL(376, compat_sys_process_vm_readv) 401 + __SYSCALL(377, compat_sys_process_vm_writev) 402 + __SYSCALL(378, sys_ni_syscall) /* 378 for kcmp */ 398 403 399 - #define __NR_compat_syscalls 374 404 + #define __NR_compat_syscalls 379 400 405 401 406 /* 402 407 * Compat syscall numbers used by the AArch64 kernel.
-4
arch/arm64/kernel/vdso.c
··· 252 252 253 253 void update_vsyscall_tz(void) 254 254 { 255 - ++vdso_data->tb_seq_count; 256 - smp_wmb(); 257 255 vdso_data->tz_minuteswest = sys_tz.tz_minuteswest; 258 256 vdso_data->tz_dsttime = sys_tz.tz_dsttime; 259 - smp_wmb(); 260 - ++vdso_data->tb_seq_count; 261 257 }
-2
arch/arm64/kernel/vdso/gettimeofday.S
··· 73 73 /* If tz is NULL, return 0. */ 74 74 cbz x1, 3f 75 75 ldp w4, w5, [vdso_data, #VDSO_TZ_MINWEST] 76 - seqcnt_read w9 77 - seqcnt_check w9, 1b 78 76 stp w4, w5, [x1, #TZ_MINWEST] 79 77 3: 80 78 mov x0, xzr