public inbox for linux-arch@vger.kernel.org
 help / color / mirror / Atom feed
From: Christophe Leroy <christophe.leroy@csgroup.eu>
To: Arnd Bergmann <arnd@arndb.de>,
	Vincenzo Frascino <vincenzo.frascino@arm.com>,
	linux-kernel@vger.kernel.org,
	Linux-Arch <linux-arch@vger.kernel.org>,
	linux-mm@kvack.org
Cc: Andy Lutomirski <luto@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	"Jason A . Donenfeld" <Jason@zx2c4.com>,
	Michael Ellerman <mpe@ellerman.id.au>,
	Nicholas Piggin <npiggin@gmail.com>,
	Naveen N Rao <naveen@kernel.org>, Ingo Molnar <mingo@redhat.com>,
	Borislav Petkov <bp@alien8.de>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Theodore Ts'o <tytso@mit.edu>,
	Andrew Morton <akpm@linux-foundation.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Masami Hiramatsu <mhiramat@kernel.org>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Subject: Re: [PATCH 3/9] x86: vdso: Introduce asm/vdso/page.h
Date: Tue, 10 Sep 2024 14:28:52 +0200	[thread overview]
Message-ID: <2234a5e1-5926-4b2d-a8f2-c780bf374a27@csgroup.eu> (raw)
In-Reply-To: <8868ef2c-6bfb-4ab7-ac5e-640e05658ee1@app.fastmail.com>



Le 08/09/2024 à 22:48, Arnd Bergmann a écrit :
> On Fri, Sep 6, 2024, at 18:40, Christophe Leroy wrote:
>> Le 06/09/2024 à 21:19, Arnd Bergmann a écrit :
>>> On Fri, Sep 6, 2024, at 11:20, Vincenzo Frascino wrote:
> 
>>>> Looking at the definition of PAGE_SIZE and PAGE_MASK for each architecture they
>>>> all depend on CONFIG_PAGE_SHIFT but they are slightly different, e.g.:
>>>>
>>>> x86:
>>>> #define PAGE_SIZE        (_AC(1,UL) << PAGE_SHIFT)
>>>>
>>>> powerpc:
>>>> #define PAGE_SIZE        (ASM_CONST(1) << PAGE_SHIFT)
>>>>
>>>> hence I left to the architecture the responsibility of redefining the constants
>>>> for the VSDO.
>>>
>>> ASM_CONST() is a powerpc-specific macro that is defined the
>>> same way as _AC(). We could probably just replace all ASM_CONST()
>>> as a cleanup, but for this purpose, just remove the custom PAGE_SIZE
>>> and PAGE_SHIFT macros. This can be a single patch fro all
>>> architectures.
>>>
>>
>> I'm not worried about _AC versus ASM_CONST, but I am by the 1UL versus 1.
>>
>>
>> This can be a problem on 32 bits platforms with 64 bits phys_addr_t
> 
> But that would already be a bug if anything used this, however
> none of them do. The only instance of an open-coded
> 
> #define PAGE_SIZE       (1 << PAGE_SHIFT)
> 
> is from openrisc, but that is only used inside of __ASSEMBLY__, for
> the same effect as _AC().

Maybe I was not clear enough. The problem is not with PAGE_SHIFT but 
with PAGE_MASK, and that's what I show with my exemple.

If take the definition from ARM64 (which is the same as several other 
artchitectures):

#define PAGE_SIZE		(_AC(1, UL) << PAGE_SHIFT)
#define PAGE_MASK		(~(PAGE_SIZE-1))

PAGE_SHIFT is 12
PAGE_SIZE is then 4096 UL
PAGE_MASK is then 0xfffff000 UL

So if I take the probe() in drivers/uio/uio_pci_generic.c, it has:

	uiomem->addr = r->start & PAGE_MASK;

uiomem->addr is a phys_addr_t
r->start is a ressource_size_t hence a phys_addr_t

And phys_addr_t is defined as:

	#ifdef CONFIG_PHYS_ADDR_T_64BIT
	typedef u64 phys_addr_t;
	#else
	typedef u32 phys_addr_t;
	#endif

On a 32 bits platform, UL is unsigned 32 bits, so the r->start & 
PAGE_MASK will and r->start with 0x00000000fffff000

That is wrong.


That's the reason why powerpc does not define PAGE_MASK like ARM64 but 
defines PAGE_MASK as:

	(~((1 << PAGE_SHIFT) - 1))

When using 1 instead of 1UL, PAGE_MASK is still 0xfffff000 but it is a 
signed constant, so when it is anded with an u64, it gets 
signed-extended to 0xfffffffffffff000 which gives the expected result.

That's what I wanted to illustrate with the exemple in my previous 
message. The function f() was using the signed PAGE_MASK while function 
g() was using the unsigned PAGE_MASK:

00000000 <f>:
    0:    54 84 00 26     clrrwi  r4,r4,12
    4:    4e 80 00 20     blr

00000008 <g>:
    8:    54 84 00 26     clrrwi  r4,r4,12
    c:    38 60 00 00     li      r3,0
   10:    4e 80 00 20     blr

Function f() returns the given u64 value with the 12 lowest bits cleared
Function g() returns the given u64 value with the 12 lowest bits cleared 
and the 32 highest bits cleared as well, which is unexpected.

Christophe

  reply	other threads:[~2024-09-10 12:28 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-03 15:14 [PATCH 0/9] vdso: Use only headers from the vdso/ namespace Vincenzo Frascino
2024-09-03 15:14 ` [PATCH 1/9] x86: vdso: Introduce asm/vdso/mman.h Vincenzo Frascino
2024-09-03 15:16   ` Jason A. Donenfeld
2024-09-03 15:23     ` Vincenzo Frascino
2024-09-04 16:56   ` Christophe Leroy
2024-09-06 10:55     ` Vincenzo Frascino
2024-09-03 15:14 ` [PATCH 2/9] vdso: Introduce vdso/mman.h Vincenzo Frascino
2024-09-03 15:14 ` [PATCH 3/9] x86: vdso: Introduce asm/vdso/page.h Vincenzo Frascino
2024-09-04 14:52   ` Arnd Bergmann
2024-09-04 15:05     ` Christophe Leroy
2024-09-06 11:26       ` Vincenzo Frascino
2024-09-06 11:20     ` Vincenzo Frascino
2024-09-06 19:19       ` Arnd Bergmann
2024-09-06 18:40         ` Christophe Leroy
2024-09-08 20:48           ` Arnd Bergmann
2024-09-10 12:28             ` Christophe Leroy [this message]
2024-09-10 15:05               ` Arnd Bergmann
2024-09-04 17:14   ` Christophe Leroy
2024-09-03 15:14 ` [PATCH 4/9] vdso: Introduce vdso/page.h Vincenzo Frascino
2024-09-04 17:16   ` Christophe Leroy
2024-09-06 11:35     ` Vincenzo Frascino
2024-09-03 15:14 ` [PATCH 5/9] vdso: Split linux/minmax.h Vincenzo Frascino
2024-09-04 17:17   ` Christophe Leroy
2024-09-04 17:23     ` Arnd Bergmann
2024-09-06 11:41       ` Vincenzo Frascino
2024-09-08 19:58         ` David Laight
2024-09-03 15:14 ` [PATCH 6/9] vdso: Split linux/array_size.h Vincenzo Frascino
2024-09-04 17:18   ` Christophe Leroy
2024-09-06 11:42     ` Vincenzo Frascino
2024-09-03 15:14 ` [PATCH 7/9] x86: vdso: Modify asm/vdso/getrandom.h to include datapage Vincenzo Frascino
2024-09-04 17:19   ` Christophe Leroy
2024-09-06 11:48     ` Vincenzo Frascino
2024-09-03 15:14 ` [PATCH 8/9] vdso: Modify vdso/getrandom.h to include the asm header Vincenzo Frascino
2024-09-03 15:14 ` [PATCH 9/9] vdso: Modify getrandom to include the correct namespace Vincenzo Frascino
2024-09-04 17:26   ` Christophe Leroy
2024-09-06 11:52     ` Vincenzo Frascino
2024-09-06 12:04       ` Christophe Leroy
2024-09-06 12:40         ` Vincenzo Frascino
2024-09-06 12:49           ` Christophe Leroy
2024-09-06 12:51             ` Vincenzo Frascino

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=2234a5e1-5926-4b2d-a8f2-c780bf374a27@csgroup.eu \
    --to=christophe.leroy@csgroup.eu \
    --cc=Jason@zx2c4.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=bp@alien8.de \
    --cc=dave.hansen@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=luto@kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mhiramat@kernel.org \
    --cc=mingo@redhat.com \
    --cc=mpe@ellerman.id.au \
    --cc=naveen@kernel.org \
    --cc=npiggin@gmail.com \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=tytso@mit.edu \
    --cc=vincenzo.frascino@arm.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox