summaryrefslogtreecommitdiff
path: root/arch/arm/kernel/traps.c
diff options
context:
space:
mode:
authorZhen Lei <thunder.leizhen@huawei.com>2022-11-28 14:42:42 +0300
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2022-11-28 14:57:36 +0300
commit21d0798acf85e9ff8a6c7d8918df7d98e145d688 (patch)
tree4a7ec856ba0a2a8770c01c3b5d04462be867c945 /arch/arm/kernel/traps.c
parent59e2cf8d21e05391c42628eb9fb5bb40f9d9698f (diff)
downloadlinux-21d0798acf85e9ff8a6c7d8918df7d98e145d688.tar.xz
ARM: 9276/1: Refactor dump_instr()
1. Rename local variable 'val16' to 'tmp'. So that the processing statements of thumb and arm can be aligned. 2. Fix two sparse check warnings: (add __user for type conversion) warning: incorrect type in initializer (different address spaces) expected unsigned short [noderef] __user *register __p got unsigned short [usertype] * 3. Prepare for the next patch to avoid repeated judgment. Before: if (!user_mode(regs)) { if (thumb) else } else { if (thumb) else } After: if (thumb) { if (user_mode(regs)) else } else { if (user_mode(regs)) else } Signed-off-by: Zhen Lei <thunder.leizhen@huawei.com> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r--arch/arm/kernel/traps.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 20b2db6dcd1c..a92e07637395 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -178,19 +178,20 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
for (i = -4; i < 1 + !!thumb; i++) {
unsigned int val, bad;
- if (!user_mode(regs)) {
- if (thumb) {
- u16 val16;
- bad = get_kernel_nofault(val16, &((u16 *)addr)[i]);
- val = val16;
- } else {
- bad = get_kernel_nofault(val, &((u32 *)addr)[i]);
- }
+ if (thumb) {
+ u16 tmp;
+
+ if (user_mode(regs))
+ bad = get_user(tmp, &((u16 __user *)addr)[i]);
+ else
+ bad = get_kernel_nofault(tmp, &((u16 *)addr)[i]);
+
+ val = tmp;
} else {
- if (thumb)
- bad = get_user(val, &((u16 *)addr)[i]);
+ if (user_mode(regs))
+ bad = get_user(val, &((u32 __user *)addr)[i]);
else
- bad = get_user(val, &((u32 *)addr)[i]);
+ bad = get_kernel_nofault(val, &((u32 *)addr)[i]);
}
if (!bad)