powerpc/align: Don't use __get_user_instr() on kernel addresses
In the old days, when we didn't have kernel userspace access protection and had set_fs(), it was wise to use __get_user() and friends to read kernel memory. Nowadays, get_user() is granting userspace access and is exclusively for userspace access. In alignment exception handler, use probe_kernel_read_inst() instead of __get_user_instr() for reading instructions in kernel. This will allow to remove the is_kernel_addr() check in __get/put_user() in a following patch. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Reviewed-by: Daniel Axtens <dja@axtens.net> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/d9ecbce00178484e66ca7adec2ff210058037704.1615398265.git.christophe.leroy@csgroup.eu
This commit is contained in:
Родитель
35506a3e2d
Коммит
111631b5e9
|
@ -310,7 +310,12 @@ int fix_alignment(struct pt_regs *regs)
|
|||
*/
|
||||
CHECK_FULL_REGS(regs);
|
||||
|
||||
if (unlikely(__get_user_instr(instr, (void __user *)regs->nip)))
|
||||
if (is_kernel_addr(regs->nip))
|
||||
r = probe_kernel_read_inst(&instr, (void *)regs->nip);
|
||||
else
|
||||
r = __get_user_instr(instr, (void __user *)regs->nip);
|
||||
|
||||
if (unlikely(r))
|
||||
return -EFAULT;
|
||||
if ((regs->msr & MSR_LE) != (MSR_KERNEL & MSR_LE)) {
|
||||
/* We don't handle PPC little-endian any more... */
|
||||
|
|
Загрузка…
Ссылка в новой задаче