On Thu, Jul 29, 2021 at 3:47 PM Sven Schnelle <svens@xxxxxxxxxxxxx> wrote: > > Alexander Potapenko <glider@xxxxxxxxxx> writes: > > > On Wed, Jul 28, 2021 at 9:03 PM Heiko Carstens <hca@xxxxxxxxxxxxx> wrote: > >> > >> From: Sven Schnelle <svens@xxxxxxxxxxxxx> > >> > >> s390 only reports the page address during a translation fault. > >> To make the kfence unit tests pass, add a function that might > >> be implemented by architectures to mask out address bits. > >> > >> Signed-off-by: Sven Schnelle <svens@xxxxxxxxxxxxx> > >> Signed-off-by: Heiko Carstens <hca@xxxxxxxxxxxxx> > >> --- > >> mm/kfence/kfence_test.c | 13 ++++++++++++- > >> 1 file changed, 12 insertions(+), 1 deletion(-) > >> > >> diff --git a/mm/kfence/kfence_test.c b/mm/kfence/kfence_test.c > >> index 942cbc16ad26..eb6307c199ea 100644 > >> --- a/mm/kfence/kfence_test.c > >> +++ b/mm/kfence/kfence_test.c > >> @@ -23,8 +23,15 @@ > >> #include <linux/tracepoint.h> > >> #include <trace/events/printk.h> > >> > >> +#include <asm/kfence.h> > >> + > >> #include "kfence.h" > >> > >> +/* May be overridden by <asm/kfence.h>. */ > >> +#ifndef arch_kfence_test_address > >> +#define arch_kfence_test_address(addr) (addr) > >> +#endif > >> + > >> /* Report as observed from console. */ > >> static struct { > >> spinlock_t lock; > >> @@ -82,6 +89,7 @@ static const char *get_access_type(const struct expect_report *r) > >> /* Check observed report matches information in @r. */ > >> static bool report_matches(const struct expect_report *r) > >> { > >> + unsigned long addr = (unsigned long)r->addr; > >> bool ret = false; > >> unsigned long flags; > >> typeof(observed.lines) expect; > >> @@ -131,22 +139,25 @@ static bool report_matches(const struct expect_report *r) > >> switch (r->type) { > >> case KFENCE_ERROR_OOB: > >> cur += scnprintf(cur, end - cur, "Out-of-bounds %s at", get_access_type(r)); > >> + addr = arch_kfence_test_address(addr); > > > > Can we normalize addr once before (or after) this switch? > > > > I don't think so. When reporing corrupted memory or an invalid free the > address is not generated by hardware but kfence itself, and therefore we > would strip valid bits. Ah, sorry, I missed that.