Commit afeb7ed4 authored by Tong Tiangen's avatar Tong Tiangen Committed by Ma Wupeng
Browse files

arm64: copy_form/to_user support machine check safe

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


CVE: NA

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

Add copy_{to, from}_user() to machine check safe.

If copy fail due to hardware memory error, only the relevant processes are
affected, so killing the user process and isolate the user page with
hardware memory errors is a more reasonable choice than kernel panic.

Signed-off-by: default avatarTong Tiangen <tongtiangen@huawei.com>
parent 8a9bc410
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ alternative_else_nop_endif

		_asm_extable	8888b,\l;
		_asm_extable	8889b,\l;

		_asm_mc_extable	8888b,\l;
		_asm_mc_extable	8889b,\l;
	.endm

	.macro user_stp l, reg1, reg2, addr, post_inc
@@ -86,5 +89,7 @@ alternative_else_nop_endif
		add		\addr, \addr, \post_inc;

		_asm_extable	8888b,\l;

		_asm_mc_extable	8888b,\l;
	.endm
#endif
+5 −1
Original line number Diff line number Diff line
@@ -162,8 +162,12 @@ alternative_endif

#define USER(l, x...)				\
9999:	x;					\
	_asm_extable	9999b, l
	_asm_extable	9999b, l;		\
	_asm_mc_extable	9999b, l

#define USER_MC(l, x...)			\
9999:	x;					\
	_asm_mc_extable	9999b, l
/*
 * Register aliases.
 */
+4 −4
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@
	.endm

	.macro strb1 reg, ptr, val
	strb \reg, [\ptr], \val
	USER_MC(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_MC(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_MC(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_MC(9998f, stp \reg1, \reg2, [\ptr], \val)
	.endm

end	.req	x5
+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_MC(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_MC(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_MC(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_MC(9998f, ldp \reg1, \reg2, [\ptr], \val)
	.endm

	.macro stp1 reg1, reg2, ptr, val
@@ -67,7 +67,7 @@ EXPORT_SYMBOL(__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_MC(9998f, ldrb tmp1w, [srcin])
USER(9998f, sttrb tmp1w, [dst])
	add	dst, dst, #1
9998:	sub	x0, end, dst			// bytes not copied