Skip to content

Commit 8dcbc61

Browse files
committed
csky: kprobe: Fixup code in simulate without 'long'
The type of 'val' is 'unsigned long' in simulate_blz32, so 'val < 0' can't be true. Cast 'val' to 'long' here to determine branch token or not, Fixup instructions: bnezad32, bhsz32, bhz32, blsz32, blz32 Link: https://lore.kernel.org/linux-csky/CAJF2gTQjKXR9gpo06WAWG1aquiT87mATiMGorXs6ChxOxoe90Q@mail.gmail.com/T/#t Signed-off-by: Guo Ren <guoren@linux.alibaba.com> Co-developed-by: Menglong Dong <dong.menglong@zte.com.cn> Signed-off-by: Menglong Dong <dong.menglong@zte.com.cn>
1 parent af94002 commit 8dcbc61

1 file changed

Lines changed: 7 additions & 15 deletions

File tree

arch/csky/kernel/probes/simulate-insn.c

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -274,9 +274,9 @@ void __kprobes
274274
simulate_bnezad32(u32 opcode, long addr, struct pt_regs *regs)
275275
{
276276
unsigned long tmp = opcode & 0x1f;
277-
unsigned long val;
277+
long val;
278278

279-
csky_insn_reg_get_val(regs, tmp, &val);
279+
csky_insn_reg_get_val(regs, tmp, (unsigned long *)&val);
280280

281281
val -= 1;
282282

@@ -286,7 +286,7 @@ simulate_bnezad32(u32 opcode, long addr, struct pt_regs *regs)
286286
} else
287287
instruction_pointer_set(regs, addr + 4);
288288

289-
csky_insn_reg_set_val(regs, tmp, val);
289+
csky_insn_reg_set_val(regs, tmp, (unsigned long)val);
290290
}
291291

292292
void __kprobes
@@ -297,13 +297,11 @@ simulate_bhsz32(u32 opcode, long addr, struct pt_regs *regs)
297297

298298
csky_insn_reg_get_val(regs, tmp, &val);
299299

300-
if (val >= 0) {
300+
if ((long) val >= 0) {
301301
instruction_pointer_set(regs,
302302
addr + sign_extend32((opcode & 0xffff0000) >> 15, 15));
303303
} else
304304
instruction_pointer_set(regs, addr + 4);
305-
306-
csky_insn_reg_set_val(regs, tmp, val);
307305
}
308306

309307
void __kprobes
@@ -314,13 +312,11 @@ simulate_bhz32(u32 opcode, long addr, struct pt_regs *regs)
314312

315313
csky_insn_reg_get_val(regs, tmp, &val);
316314

317-
if (val > 0) {
315+
if ((long) val > 0) {
318316
instruction_pointer_set(regs,
319317
addr + sign_extend32((opcode & 0xffff0000) >> 15, 15));
320318
} else
321319
instruction_pointer_set(regs, addr + 4);
322-
323-
csky_insn_reg_set_val(regs, tmp, val);
324320
}
325321

326322
void __kprobes
@@ -331,13 +327,11 @@ simulate_blsz32(u32 opcode, long addr, struct pt_regs *regs)
331327

332328
csky_insn_reg_get_val(regs, tmp, &val);
333329

334-
if (val <= 0) {
330+
if ((long) val <= 0) {
335331
instruction_pointer_set(regs,
336332
addr + sign_extend32((opcode & 0xffff0000) >> 15, 15));
337333
} else
338334
instruction_pointer_set(regs, addr + 4);
339-
340-
csky_insn_reg_set_val(regs, tmp, val);
341335
}
342336

343337
void __kprobes
@@ -348,13 +342,11 @@ simulate_blz32(u32 opcode, long addr, struct pt_regs *regs)
348342

349343
csky_insn_reg_get_val(regs, tmp, &val);
350344

351-
if (val < 0) {
345+
if ((long) val < 0) {
352346
instruction_pointer_set(regs,
353347
addr + sign_extend32((opcode & 0xffff0000) >> 15, 15));
354348
} else
355349
instruction_pointer_set(regs, addr + 4);
356-
357-
csky_insn_reg_set_val(regs, tmp, val);
358350
}
359351

360352
void __kprobes

0 commit comments

Comments
 (0)