Index: sys/riscv/riscv/cbo.c
===================================================================
--- sys/riscv/riscv/cbo.c
+++ sys/riscv/riscv/cbo.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2025 Ruslan Bukin
+ * Copyright (c) 2025-2026 Ruslan Bukin
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -42,8 +42,8 @@
* an invalidate operation.
*/
- va &= ~(dcache_line_size - 1);
- for (addr = va; addr < va + len; addr += dcache_line_size)
+ for (addr = __align_down(va, dcache_line_size); addr < va + len;
+ addr += dcache_line_size)
__asm __volatile(".option push; .option arch, +zicbom\n"
"cbo.flush (%0); .option pop\n" :: "r"(addr));
}
@@ -60,8 +60,8 @@
* block from the set of coherent caches up to that point.
*/
- va &= ~(dcache_line_size - 1);
- for (addr = va; addr < va + len; addr += dcache_line_size)
+ for (addr = __align_down(va, dcache_line_size); addr < va + len;
+ addr += dcache_line_size)
__asm __volatile(".option push; .option arch, +zicbom\n"
"cbo.inval (%0); .option pop\n" :: "r"(addr));
}
@@ -80,8 +80,8 @@
* previous invalidate, clean, or flush operation on the cache block.
*/
- va &= ~(dcache_line_size - 1);
- for (addr = va; addr < va + len; addr += dcache_line_size)
+ for (addr = __align_down(va, dcache_line_size); addr < va + len;
+ addr += dcache_line_size)
__asm __volatile(".option push; .option arch, +zicbom\n"
"cbo.clean (%0); .option pop\n" :: "r"(addr));
}