Re: [PATCH -next v5 2/8] arm64: extable: make uaaccess helper use extable type EX_TYPE_UACCESS_ERR_ZERO
From: Tong Tiangen <hidden>
Date: 2022-06-20 02:59:23
Also in:
linux-arm-kernel, linux-mm, lkml
在 2022/6/18 20:40, Mark Rutland 写道:
On Sat, Jun 18, 2022 at 04:42:06PM +0800, Tong Tiangen wrote:quoted
quoted
quoted
quoted
diff --git a/arch/arm64/include/asm/asm-extable.hb/arch/arm64/include/asm/asm-extable.h index 56ebe183e78b..9c94ac1f082c 100644--- a/arch/arm64/include/asm/asm-extable.h +++ b/arch/arm64/include/asm/asm-extable.h@@ -28,6 +28,14 @@ __ASM_EXTABLE_RAW(\insn, \fixup, EX_TYPE_FIXUP, 0) .endm +/* + * Create an exception table entry for uaccess `insn`, whichwill branch to `fixup` + * when an unhandled fault is taken. + * ex->data = ~0 means both reg_err and reg_zero is set to wzr(x31). + */ + .macro _asm_extable_uaccess, insn, fixup + __ASM_EXTABLE_RAW(\insn, \fixup, EX_TYPE_UACCESS_ERR_ZERO, ~0) + .endmI'm not too keen on using `~0` here, since that also sets other bits in the data field, and its somewhat opaque. How painful is it to generate the data fields as with the C version of this macro, so that we can pass in wzr explciitly for the two sub-fields? Other than that, this looks good to me. Thanks, Mark.ok, will fix next version. Thanks, Tong.I tried to using data filelds as with C version, but here assembly code we can not using operator such as << and |, if we use lsl and orr instructions, the gpr will be occupied. So how about using 0x3ff directly here? it means err register and zero register both set to x31.I had a go at implementing this, and it seems simple enough. Please see: https://git.kernel.org/pub/scm/linux/kernel/git/mark/linux.git/log/?h=arm64/extable/asm-uaccess
I made the following modifications, and the other parts are based on your implementation: arch/arm64/include/asm/asm-extable.h [...] .macro _asm_extable_uaccess, insn, fixup _ASM_EXTABLE_UACCESS(\insn, \fixup) .endm [...] The following errors are reported during compilation: [...] arch/arm64/lib/clear_user.S:45: Error: invalid operands (*ABS* and *UND* sections) for `<<' [...] "<<" is invalid operands in assembly, is there something wrong with me? Thanks, Tong.
Mark. .