From: kernel test robot <lkp@intel.com>
To: Himanshu Chauhan <himanshu.chauhan@oss.qualcomm.com>
Cc: oe-kbuild-all@lists.linux.dev, Anup Patel <anup@brainfault.org>
Subject: [avpatel:riscv_trace_support_v5 90/108] arch/riscv/kernel/hw_breakpoint.c:398:42: sparse: sparse: cast to restricted __le32
Date: Sun, 16 Aug 2026 00:53:04 +0800 [thread overview]
Message-ID: <202608160053.yOczD4n6-lkp@intel.com> (raw)
tree: https://github.com/avpatel/linux.git riscv_trace_support_v5
head: d5f1be8d8fd44129a93976f98cc0153408015030
commit: 163404a41b42360829d8ed4d2573e14633fa2633 [90/108] riscv: Introduce support for hardware break/watchpoints
config: riscv-randconfig-r132-20260815 (https://download.01.org/0day-ci/archive/20260816/202608160053.yOczD4n6-lkp@intel.com/config)
compiler: clang version 24.0.0git (https://github.com/llvm/llvm-project 844a18e753e822736c9805ab779144b647a2c186)
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260816/202608160053.yOczD4n6-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202608160053.yOczD4n6-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
WARNING: invalid argument to '-march': '_zacas_zabha'
>> arch/riscv/kernel/hw_breakpoint.c:398:42: sparse: sparse: cast to restricted __le32
>> arch/riscv/kernel/hw_breakpoint.c:457:22: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned long tdata1 @@ got restricted __le32 [usertype] @@
arch/riscv/kernel/hw_breakpoint.c:457:22: sparse: expected unsigned long tdata1
arch/riscv/kernel/hw_breakpoint.c:457:22: sparse: got restricted __le32 [usertype]
>> arch/riscv/kernel/hw_breakpoint.c:458:22: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned long tdata2 @@ got restricted __le32 [usertype] @@
arch/riscv/kernel/hw_breakpoint.c:458:22: sparse: expected unsigned long tdata2
arch/riscv/kernel/hw_breakpoint.c:458:22: sparse: got restricted __le32 [usertype]
>> arch/riscv/kernel/hw_breakpoint.c:459:22: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned long tdata3 @@ got restricted __le32 [usertype] @@
arch/riscv/kernel/hw_breakpoint.c:459:22: sparse: expected unsigned long tdata3
arch/riscv/kernel/hw_breakpoint.c:459:22: sparse: got restricted __le32 [usertype]
arch/riscv/kernel/hw_breakpoint.c:470:15: sparse: sparse: cast to restricted __le32
arch/riscv/kernel/hw_breakpoint.c:589:22: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned long tdata1 @@ got restricted __le32 [usertype] @@
arch/riscv/kernel/hw_breakpoint.c:589:22: sparse: expected unsigned long tdata1
arch/riscv/kernel/hw_breakpoint.c:589:22: sparse: got restricted __le32 [usertype]
arch/riscv/kernel/hw_breakpoint.c:590:22: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned long tdata2 @@ got restricted __le32 [usertype] @@
arch/riscv/kernel/hw_breakpoint.c:590:22: sparse: expected unsigned long tdata2
arch/riscv/kernel/hw_breakpoint.c:590:22: sparse: got restricted __le32 [usertype]
arch/riscv/kernel/hw_breakpoint.c:591:22: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned long tdata3 @@ got restricted __le32 [usertype] @@
arch/riscv/kernel/hw_breakpoint.c:591:22: sparse: expected unsigned long tdata3
arch/riscv/kernel/hw_breakpoint.c:591:22: sparse: got restricted __le32 [usertype]
vim +398 arch/riscv/kernel/hw_breakpoint.c
341
342 /*
343 * HW Breakpoint/watchpoint handler
344 */
345 static int hw_breakpoint_handler(struct die_args *args)
346 {
347 int ret = NOTIFY_DONE;
348 struct arch_hw_breakpoint *bp;
349 struct perf_event *event;
350 int i;
351
352 for (i = 0; i < dbtr_total_num; i++) {
353 event = this_cpu_read(pcpu_hw_bp_events[i]);
354 if (!event)
355 continue;
356
357 bp = counter_arch_bp(event);
358 switch (bp->type) {
359 /* Breakpoint */
360 case RISCV_DBTR_EXEC:
361 if (bp->address == args->regs->epc) {
362 perf_bp_event(event, args->regs);
363 ret = NOTIFY_STOP;
364 }
365 break;
366
367 /* Watchpoint */
368 case RISCV_DBTR_LOAD:
369 case RISCV_DBTR_STORE:
370 case RISCV_DBTR_LDST:
371 {
372 unsigned long stval = args->regs->badaddr;
373 unsigned long bp_start = bp->address;
374 unsigned long bp_len = bp->len ?: 1;
375 unsigned long bp_end = bp_start + bp_len - 1;
376 unsigned long stval_end = stval + sizeof(long) - 1;
377 unsigned long tdata1;
378 bool hit = false;
379 struct sbiret sret;
380 union sbi_dbtr_shmem_entry *shmem;
381
382 if (bp_end < bp_start)
383 bp_end = ~0UL;
384 if (stval_end < stval)
385 stval_end = ~0UL;
386
387 /*
388 * Prefer tdata1.hit from SBI trigger readout whenever
389 * possible. Fall back to address-based matching if HIT
390 * isn't observed/supported.
391 */
392 raw_spin_lock_irqsave(this_cpu_ptr(&ecall_lock),
393 *this_cpu_ptr(&ecall_lock_flags));
394 shmem = this_cpu_ptr(sbi_dbtr_shmem);
395 sret = sbi_ecall(SBI_EXT_DBTR, SBI_EXT_DBTR_TRIG_READ,
396 i, 1, 0, 0, 0, 0);
397 if (!sret.error) {
> 398 tdata1 = le_to_cpu(shmem->data.tdata1);
399
400 if (dbtr_type == RISCV_DBTR_TRIG_MCONTROL)
401 hit = !!(tdata1 & RISCV_DBTR_MC_HIT_BIT_MASK);
402 else if (dbtr_type == RISCV_DBTR_TRIG_MCONTROL6)
403 hit = !!(tdata1 & RISCV_DBTR_MC6_HIT_BIT_MASK);
404 }
405 raw_spin_unlock_irqrestore(this_cpu_ptr(&ecall_lock),
406 *this_cpu_ptr(&ecall_lock_flags));
407
408 /*
409 * Sdtrig may report STVAL as the lowest accessed
410 * address while the watchpoint can match a higher byte
411 * in the same access.
412 */
413 if (hit ||
414 (stval >= bp_start && stval <= bp_end) ||
415 (bp_start >= stval && bp_start <= stval_end)) {
416 perf_bp_event(event, args->regs);
417 ret = NOTIFY_STOP;
418 }
419 break;
420 }
421
422 default:
423 pr_warn("Unknown type: %u\n", bp->type);
424 break;
425 }
426 }
427
428 return ret;
429 }
430
431 int hw_breakpoint_exceptions_notify(struct notifier_block *unused,
432 unsigned long val, void *data)
433 {
434 if (val != DIE_DEBUG)
435 return NOTIFY_DONE;
436
437 return hw_breakpoint_handler(data);
438 }
439
440 /* atomic: counter->ctx->lock is held */
441 int arch_install_hw_breakpoint(struct perf_event *event)
442 {
443 struct arch_hw_breakpoint *bp = counter_arch_bp(event);
444 union sbi_dbtr_shmem_entry *shmem = this_cpu_ptr(sbi_dbtr_shmem);
445 struct sbi_dbtr_data_msg *xmit;
446 struct sbi_dbtr_id_msg *recv;
447 struct perf_event **slot;
448 unsigned long idx;
449 struct sbiret ret;
450 int err = 0;
451
452 raw_spin_lock_irqsave(this_cpu_ptr(&ecall_lock),
453 *this_cpu_ptr(&ecall_lock_flags));
454
455 xmit = &shmem->data;
456 recv = &shmem->id;
> 457 xmit->tdata1 = cpu_to_le(bp->tdata1);
> 458 xmit->tdata2 = cpu_to_le(bp->tdata2);
> 459 xmit->tdata3 = cpu_to_le(bp->tdata3);
460
461 ret = sbi_ecall(SBI_EXT_DBTR, SBI_EXT_DBTR_TRIG_INSTALL,
462 1, 0, 0, 0, 0, 0);
463
464 if (ret.error) {
465 pr_warn("Failed to install trigger\n");
466 err = sbi_err_map_linux_errno(ret.error);
467 goto done;
468 }
469
470 idx = le_to_cpu(recv->idx);
471 if (idx >= dbtr_total_num) {
472 pr_warn("Invalid trigger index %lu\n", idx);
473 err = -EINVAL;
474 goto done;
475 }
476
477 slot = this_cpu_ptr(&pcpu_hw_bp_events[idx]);
478 if (*slot) {
479 pr_warn("Slot %lu is in use\n", idx);
480 err = -EBUSY;
481 goto done;
482 }
483
484 /* Save the event - to be looked up in handler */
485 *slot = event;
486
487 done:
488 raw_spin_unlock_irqrestore(this_cpu_ptr(&ecall_lock),
489 *this_cpu_ptr(&ecall_lock_flags));
490 return err;
491 }
492
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
reply other threads:[~2026-08-15 16:53 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202608160053.yOczD4n6-lkp@intel.com \
--to=lkp@intel.com \
--cc=anup@brainfault.org \
--cc=himanshu.chauhan@oss.qualcomm.com \
--cc=oe-kbuild-all@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.