Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a65c9259 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull arm64 fixes from Catalin Marinas:

 - Fix huge_ptep_set_access_flags() to return "changed" when any of the
   ptes in the contiguous range is changed, not just the last one

 - Fix the adr_l assembly macro to work in modules under KASLR

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
  arm64: assembler: make adr_l work in modules under KASLR
  arm64: hugetlb: fix the wrong return value for huge_ptep_set_access_flags
parents c79d47f1 41c066f2
Loading
Loading
Loading
Loading
+27 −9
Original line number Original line Diff line number Diff line
@@ -164,22 +164,25 @@ lr .req x30 // link register


/*
/*
 * Pseudo-ops for PC-relative adr/ldr/str <reg>, <symbol> where
 * Pseudo-ops for PC-relative adr/ldr/str <reg>, <symbol> where
 * <symbol> is within the range +/- 4 GB of the PC.
 * <symbol> is within the range +/- 4 GB of the PC when running
 * in core kernel context. In module context, a movz/movk sequence
 * is used, since modules may be loaded far away from the kernel
 * when KASLR is in effect.
 */
 */
	/*
	/*
	 * @dst: destination register (64 bit wide)
	 * @dst: destination register (64 bit wide)
	 * @sym: name of the symbol
	 * @sym: name of the symbol
	 * @tmp: optional scratch register to be used if <dst> == sp, which
	 *       is not allowed in an adrp instruction
	 */
	 */
	.macro	adr_l, dst, sym, tmp=
	.macro	adr_l, dst, sym
	.ifb	\tmp
#ifndef MODULE
	adrp	\dst, \sym
	adrp	\dst, \sym
	add	\dst, \dst, :lo12:\sym
	add	\dst, \dst, :lo12:\sym
	.else
#else
	adrp	\tmp, \sym
	movz	\dst, #:abs_g3:\sym
	add	\dst, \tmp, :lo12:\sym
	movk	\dst, #:abs_g2_nc:\sym
	.endif
	movk	\dst, #:abs_g1_nc:\sym
	movk	\dst, #:abs_g0_nc:\sym
#endif
	.endm
	.endm


	/*
	/*
@@ -190,6 +193,7 @@ lr .req x30 // link register
	 *       the address
	 *       the address
	 */
	 */
	.macro	ldr_l, dst, sym, tmp=
	.macro	ldr_l, dst, sym, tmp=
#ifndef MODULE
	.ifb	\tmp
	.ifb	\tmp
	adrp	\dst, \sym
	adrp	\dst, \sym
	ldr	\dst, [\dst, :lo12:\sym]
	ldr	\dst, [\dst, :lo12:\sym]
@@ -197,6 +201,15 @@ lr .req x30 // link register
	adrp	\tmp, \sym
	adrp	\tmp, \sym
	ldr	\dst, [\tmp, :lo12:\sym]
	ldr	\dst, [\tmp, :lo12:\sym]
	.endif
	.endif
#else
	.ifb	\tmp
	adr_l	\dst, \sym
	ldr	\dst, [\dst]
	.else
	adr_l	\tmp, \sym
	ldr	\dst, [\tmp]
	.endif
#endif
	.endm
	.endm


	/*
	/*
@@ -206,8 +219,13 @@ lr .req x30 // link register
	 *       while <src> needs to be preserved.
	 *       while <src> needs to be preserved.
	 */
	 */
	.macro	str_l, src, sym, tmp
	.macro	str_l, src, sym, tmp
#ifndef MODULE
	adrp	\tmp, \sym
	adrp	\tmp, \sym
	str	\src, [\tmp, :lo12:\sym]
	str	\src, [\tmp, :lo12:\sym]
#else
	adr_l	\tmp, \sym
	str	\src, [\tmp]
#endif
	.endm
	.endm


	/*
	/*
+1 −1
Original line number Original line Diff line number Diff line
@@ -239,7 +239,7 @@ int huge_ptep_set_access_flags(struct vm_area_struct *vma,
		ncontig = find_num_contig(vma->vm_mm, addr, cpte,
		ncontig = find_num_contig(vma->vm_mm, addr, cpte,
					  *cpte, &pgsize);
					  *cpte, &pgsize);
		for (i = 0; i < ncontig; ++i, ++cpte, addr += pgsize) {
		for (i = 0; i < ncontig; ++i, ++cpte, addr += pgsize) {
			changed = ptep_set_access_flags(vma, addr, cpte,
			changed |= ptep_set_access_flags(vma, addr, cpte,
							pfn_pte(pfn,
							pfn_pte(pfn,
								hugeprot),
								hugeprot),
							dirty);
							dirty);