Commit 1a1eddb9 authored by Tong Tiangen's avatar Tong Tiangen
Browse files

arm64: add uaccess to machine check safe

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8M74H


CVE: NA

-------------------------------

If user process access memory fails due to hardware memory error, only the
relevant processes are affected, so it is more reasonable to kill the user
process and isolate the corrupt page than to panic the kernel.

Signed-off-by: default avatarTong Tiangen <tongtiangen@huawei.com>
parent 975e216e
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@
	.endm

	.macro strb1 reg, ptr, val
	strb \reg, [\ptr], \val
	USER(9998f, strb \reg, [\ptr], \val)
	.endm

	.macro ldrh1 reg, ptr, val
@@ -33,7 +33,7 @@
	.endm

	.macro strh1 reg, ptr, val
	strh \reg, [\ptr], \val
	USER(9998f, strh \reg, [\ptr], \val)
	.endm

	.macro ldr1 reg, ptr, val
@@ -41,7 +41,7 @@
	.endm

	.macro str1 reg, ptr, val
	str \reg, [\ptr], \val
	USER(9998f, str \reg, [\ptr], \val)
	.endm

	.macro ldp1 reg1, reg2, ptr, val
@@ -49,7 +49,7 @@
	.endm

	.macro stp1 reg1, reg2, ptr, val
	stp \reg1, \reg2, [\ptr], \val
	USER(9998f, stp \reg1, \reg2, [\ptr], \val)
	.endm

end	.req	x5
@@ -66,7 +66,7 @@ SYM_FUNC_START(__arch_copy_from_user)
	b.ne	9998f
	// Before being absolutely sure we couldn't copy anything, try harder
USER(9998f, ldtrb tmp1w, [srcin])
	strb	tmp1w, [dst], #1
USER(9998f, strb	tmp1w, [dst], #1)
9998:	sub	x0, end, dst			// bytes not copied
	ret
SYM_FUNC_END(__arch_copy_from_user)
+5 −5
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@
 *	x0 - bytes not copied
 */
	.macro ldrb1 reg, ptr, val
	ldrb  \reg, [\ptr], \val
	USER(9998f, ldrb  \reg, [\ptr], \val)
	.endm

	.macro strb1 reg, ptr, val
@@ -28,7 +28,7 @@
	.endm

	.macro ldrh1 reg, ptr, val
	ldrh  \reg, [\ptr], \val
	USER(9998f, ldrh  \reg, [\ptr], \val)
	.endm

	.macro strh1 reg, ptr, val
@@ -36,7 +36,7 @@
	.endm

	.macro ldr1 reg, ptr, val
	ldr \reg, [\ptr], \val
	USER(9998f, ldr \reg, [\ptr], \val)
	.endm

	.macro str1 reg, ptr, val
@@ -44,7 +44,7 @@
	.endm

	.macro ldp1 reg1, reg2, ptr, val
	ldp \reg1, \reg2, [\ptr], \val
	USER(9998f, ldp \reg1, \reg2, [\ptr], \val)
	.endm

	.macro stp1 reg1, reg2, ptr, val
@@ -64,7 +64,7 @@ SYM_FUNC_START(__arch_copy_to_user)
9997:	cmp	dst, dstin
	b.ne	9998f
	// Before being absolutely sure we couldn't copy anything, try harder
	ldrb	tmp1w, [srcin]
USER(9998f, ldrb	tmp1w, [srcin])
USER(9998f, sttrb tmp1w, [dst])
	add	dst, dst, #1
9998:	sub	x0, end, dst			// bytes not copied
+4 −4
Original line number Diff line number Diff line
@@ -85,10 +85,10 @@ bool fixup_exception_mc(struct pt_regs *regs)
	if (!ex)
		return false;

	/*
	 * This is not complete, More Machine check safe extable type can
	 * be processed here.
	 */
	switch (ex->type) {
	case EX_TYPE_UACCESS_ERR_ZERO:
		return ex_handler_uaccess_err_zero(ex, regs);
	}

	return false;
}