All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Stancek <jstancek@redhat.com>
To: "Thomas Weißschuh" <thomas.weissschuh@linutronix.de>
Cc: Andy Lutomirski <luto@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>,
	Anna-Maria Behnsen <anna-maria@linutronix.de>,
	Frederic Weisbecker <frederic@kernel.org>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
	Madhavan Srinivasan <maddy@linux.ibm.com>,
	Michael Ellerman <mpe@ellerman.id.au>,
	Nicholas Piggin <npiggin@gmail.com>,
	Christophe Leroy <christophe.leroy@csgroup.eu>,
	Naveen N Rao <naveen@kernel.org>,
	Heiko Carstens <hca@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Arnd Bergmann <arnd@arndb.de>,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linuxppc-dev@lists.ozlabs.org, linux-s390@vger.kernel.org,
	linux-arch@vger.kernel.org, Nam Cao <namcao@linutronix.de>
Subject: Re: [PATCH 08/19] vdso/gettimeofday: Prepare do_hres_timens() for introduction of struct vdso_clock
Date: Fri, 25 Apr 2025 16:37:47 +0200	[thread overview]
Message-ID: <aAueO89ng7GX2iyl@t14ultra> (raw)
In-Reply-To: <20250425152733-0ff10421-b716-4a55-9b60-cb0a71769e56@linutronix.de>

On Fri, Apr 25, 2025 at 03:40:55PM +0200, Thomas Weißschuh wrote:

<snip>

>
>Some more information:
>
>The crash comes from the address arithmetic in "vc = &vc[CS_RAW]" going wrong.

That appears to be because it's not doing any arithmetic, but using value
from some linker-generated symbol (I'll refer to it as "7a8").

The below is presumably the check that compares clk != CLOCK_MONOTONIC_RAW,
CLOCK_MONOTONIC_RAW is 4. And it should choose between first and second vdso_clock
in 2nd vvar page:

# readelf -a /root/kernel-ark/arch/arm64/kernel/vdso/vdso.so.dbg | grep 7a8
     25: 00000000000007a8     0 NOTYPE  LOCAL  DEFAULT    7 $d

objdump -d -S:
  658:   17ffffef        b       614 <__cvdso_clock_gettime_data.constprop.0+0x104>
                 vc = &vc[CS_HRES_COARSE];
  65c:   58000a62        ldr     x2, 7a8 <__cvdso_clock_gettime_data.constprop.0+0x298>
  660:   7100101f        cmp     w0, #0x4
  664:   10e7cce3        adr     x3, fffffffffffd0000 <vdso_u_data+0x10000>
  668:   9a821063        csel    x3, x3, x2, ne  // ne = any
         while (unlikely((seq = READ_ONCE(vc->seq)) & 1))
  66c:   b9400065        ldr     w5, [x3]
...
  7a8:   fffd00e0        .word   0xfffd00e0
  7ac:   ffffffff        .word   0xffffffff


(gdb) r
Thread 2.1 "a.out" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xfffff7ff2dc0 (LWP 44638)]
0x0000fffff7fa066c in ?? ()

(gdb) disassemble 0x0000fffff7fa0658,0x0000fffff7fa067c
--Type <RET> for more, q to quit, c to continue without paging--
    0x0000fffff7fa0658:  b       0xfffff7fa0614
    0x0000fffff7fa065c:  ldr     x2, 0xfffff7fa07a8
    0x0000fffff7fa0660:  cmp     w0, #0x4
    0x0000fffff7fa0664:  adr     x3, 0xfffff7f70000
    0x0000fffff7fa0668:  csel    x3, x3, x2, ne  // ne = any
=> 0x0000fffff7fa066c:  ldr     w5, [x3]

$x3 here is using correct vvar runtime address, but $x2 uses
a bogus one from "7a8". And when it tries to load from it, it crashes:

(gdb) info proc map
process 44638
Mapped address spaces:

Start Addr         End Addr           Size               Offset             Perms File
0x0000000000400000 0x0000000000410000 0x10000            0x0                r-xp  /root/ltp/testcases/kernel/syscalls/clock_gettime/a.out
0x0000000000410000 0x0000000000420000 0x10000            0x0                r--p  /root/ltp/testcases/kernel/syscalls/clock_gettime/a.out
0x0000000000420000 0x0000000000430000 0x10000            0x10000            rw-p  /root/ltp/testcases/kernel/syscalls/clock_gettime/a.out
0x0000fffff7d80000 0x0000fffff7f30000 0x1b0000           0x0                r-xp  /usr/lib64/libc.so.6
0x0000fffff7f30000 0x0000fffff7f40000 0x10000            0x1a0000           r--p  /usr/lib64/libc.so.6
0x0000fffff7f40000 0x0000fffff7f50000 0x10000            0x1b0000           rw-p  /usr/lib64/libc.so.6
0x0000fffff7f60000 0x0000fffff7fa0000 0x40000            0x0                r--p  [vvar]
0x0000fffff7fa0000 0x0000fffff7fb0000 0x10000            0x0                r-xp  [vdso]
0x0000fffff7fb0000 0x0000fffff7fe0000 0x30000            0x0                r-xp  /usr/lib/ld-linux-aarch64.so.1
0x0000fffff7fe0000 0x0000fffff7ff0000 0x10000            0x20000            r--p  /usr/lib/ld-linux-aarch64.so.1
0x0000fffff7ff0000 0x0000fffff8000000 0x10000            0x30000            rw-p  /usr/lib/ld-linux-aarch64.so.1
0x0000fffffffd0000 0x0001000000000000 0x30000            0x0                rw-p  [stack]

$x3 was the beginning of 2nd vvar page (1st vdso_clock), and $x2 looks
like it should have been 2nd vdso_clock, but the value that is used is not
the address of vvar during runtime. 

vdso_clock has size 224 == 0xe0 (according to pahole)

(gdb) x/2x 0xfffff7fa07a8
0xfffff7fa07a8: 0xfffd00e0      0xffffffff
(gdb) p/x $x2
$1 = 0xfffffffffffd00e0
(gdb) x/1x $x2
0xfffffffffffd00e0:     Cannot access memory at address 0xfffffffffffd00e0

But it does match the symbol value from vdso.so:

# readelf -a /root/kernel-ark/arch/arm64/kernel/vdso/vdso.so.dbg | grep vdso_u
     37: fffffffffffc0000     0 NOTYPE  LOCAL  DEFAULT    1 vdso_u_data
     39: fffffffffffc0000     0 NOTYPE  LOCAL  DEFAULT  ABS vdso_u_time_data
     40: fffffffffffe0000     0 NOTYPE  LOCAL  DEFAULT  ABS vdso_u_rng_data

>>> print(hex(0xfffffffffffc0000+65536+224))
0xfffffffffffd00e0 -> and this is address where it crashes

Regards,
Jan

>This should just do "vc = vc + 1", advancing the pointer by sizeof(*vc).
>But I get these example values of "vc" before and after the arithmetic:
>0x00ffffbc060000 -> 0xfffffffffffd00e8
>Which is obviously wrong.
>
>The arithmetic can be fixed with any one of the following changes:
>* OPTIMIZER_HIDE_VAR() as above
>* Replacement of -mcmodel=tiny with -mcmode=small in arch/arm64/kernel/vdso/Makefile
>  -mcmodel=tiny is supposed to cover 1MiB programs, the vDSO only needs 300KiB here
>* Removal of the (clk != CLOCK_MONOTONIC_RAW) case
>
>Shuffling code around, even without any impact on semantics, sometimes fixes
>the issue. Compiling the vDSO with UBSAN didn't show anything.
>
>
>Thomas
>
>> > > > > [1] https://github.com/linux-test-project/ltp/blob/master/testcases/kernel/syscalls/clock_gettime/clock_gettime03.c
>> > > > > [2] https://koji.fedoraproject.org/koji/buildinfo?buildID=2704401
>> > > >
>> >
>>
>


  reply	other threads:[~2025-04-25 14:37 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-03 11:11 [PATCH 00/19] vdso: Rework struct vdso_time_data and introduce struct vdso_clock Thomas Weißschuh
2025-03-03 11:11 ` Thomas Weißschuh
2025-03-03 11:11 ` [PATCH 01/19] vdso: Introduce vdso/cache.h Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Thomas Weißschuh
2025-03-03 11:11 ` [PATCH 02/19] arm64: Make asm/cache.h compatible with vDSO Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Thomas Weißschuh
2025-03-03 11:11 ` [PATCH 03/19] vdso: Make vdso_time_data cacheline aligned Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 04/19] vdso/datapage: Define for vdso_data to make rework of vdso possible Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] vdso/datapage: Define vdso_clock to prepare for multiple PTP clocks tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 05/19] vdso/helpers: Prepare introduction of struct vdso_clock Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 06/19] vdso/gettimeofday: " Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 07/19] vdso/gettimeofday: Prepare do_hres() for " Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 08/19] vdso/gettimeofday: Prepare do_hres_timens() " Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-04-24 14:10   ` [PATCH 08/19] " Jan Stancek
2025-04-24 15:43     ` Thomas Weißschuh
2025-04-24 21:57       ` Jan Stancek
2025-04-25  8:58         ` Thomas Weißschuh
2025-04-25 10:03           ` Jan Stancek
2025-04-25 13:40             ` Thomas Weißschuh
2025-04-25 14:37               ` Jan Stancek [this message]
2025-04-25 15:34                 ` Thomas Weißschuh
2025-03-03 11:11 ` [PATCH 09/19] vdso/gettimeofday: Prepare do_coarse() " Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 10/19] vdso/gettimeofday: Prepare do_coarse_timens() " Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 11/19] vdso/gettimeofday: Prepare helper functions " Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 12/19] vdso/vsyscall: Prepare " Thomas Weißschuh
2025-03-08 13:45   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 13/19] vdso/namespace: Rename timens_setup_vdso_data() to reflect new vdso_clock struct Thomas Weißschuh
2025-03-08 13:44   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 14/19] time/namespace: Prepare introduction of struct vdso_clock Thomas Weißschuh
2025-03-08 13:44   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 15/19] x86/vdso: " Thomas Weißschuh
2025-03-03 11:11   ` Thomas Weißschuh
2025-03-08 13:44   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 16/19] arm64/vdso: " Thomas Weißschuh
2025-03-03 11:11   ` Thomas Weißschuh
2025-03-08 13:44   ` [tip: timers/vdso] " tip-bot2 for Nam Cao
2025-03-03 11:11 ` [PATCH 17/19] powerpc/vdso: " Thomas Weißschuh
2025-03-03 11:11   ` Thomas Weißschuh
2025-03-08 13:44   ` [tip: timers/vdso] " tip-bot2 for Nam Cao
2025-03-03 11:11 ` [PATCH 18/19] vdso: Move arch related data before basetime Thomas Weißschuh
2025-03-08 13:44   ` [tip: timers/vdso] vdso: Move architecture related data before basetime data tip-bot2 for Anna-Maria Behnsen
2025-03-03 11:11 ` [PATCH 19/19] vdso: Rework struct vdso_time_data and introduce struct vdso_clock Thomas Weißschuh
2025-03-08 13:44   ` [tip: timers/vdso] " tip-bot2 for Anna-Maria Behnsen

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=aAueO89ng7GX2iyl@t14ultra \
    --to=jstancek@redhat.com \
    --cc=agordeev@linux.ibm.com \
    --cc=anna-maria@linutronix.de \
    --cc=arnd@arndb.de \
    --cc=borntraeger@linux.ibm.com \
    --cc=bp@alien8.de \
    --cc=catalin.marinas@arm.com \
    --cc=christophe.leroy@csgroup.eu \
    --cc=dave.hansen@linux.intel.com \
    --cc=frederic@kernel.org \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=hpa@zytor.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=luto@kernel.org \
    --cc=maddy@linux.ibm.com \
    --cc=mingo@redhat.com \
    --cc=mpe@ellerman.id.au \
    --cc=namcao@linutronix.de \
    --cc=naveen@kernel.org \
    --cc=npiggin@gmail.com \
    --cc=svens@linux.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=thomas.weissschuh@linutronix.de \
    --cc=vincenzo.frascino@arm.com \
    --cc=will@kernel.org \
    --cc=x86@kernel.org \
    /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.