* [PATCH] x86/head_32: Fix overflow warning with 32-bit binutils @ 2015-06-19 7:51 Borislav Petkov 2015-06-19 8:10 ` Ingo Molnar 0 siblings, 1 reply; 5+ messages in thread From: Borislav Petkov @ 2015-06-19 7:51 UTC (permalink / raw) To: Ingo Molnar; +Cc: LKML From: Borislav Petkov <bp@suse.de> When building the kernel with 32-bit binutils built with support only for the i386 target, we get the following warning: arch/x86/kernel/head_32.S:66: Warning: shift count out of range (32 is not between 0 and 31) The problem is that in that case, binutils' internal type representation is 32-bit wide and the shift range overflows. In order to fix this, manipulate the shift expression which creates the 4GiB constant to not overflow the shift count. Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com> Suggested-by: Michael Matz <matz@suse.de> Signed-off-by: Borislav Petkov <bp@suse.de> --- arch/x86/kernel/head_32.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 53eeb226657c..c601d1de5ae5 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S @@ -63,8 +63,8 @@ #endif /* Number of possible pages in the lowmem region */ -LOWMEM_PAGES = (((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT) - +LOWMEM_PAGES = (((2<<31) - __PAGE_OFFSET) >> PAGE_SHIFT) + /* Enough space to fit pagetables for the low memory linear map */ MAPPING_BEYOND_END = PAGE_TABLE_SIZE(LOWMEM_PAGES) << PAGE_SHIFT -- 2.3.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] x86/head_32: Fix overflow warning with 32-bit binutils 2015-06-19 7:51 [PATCH] x86/head_32: Fix overflow warning with 32-bit binutils Borislav Petkov @ 2015-06-19 8:10 ` Ingo Molnar 2015-06-19 8:59 ` Borislav Petkov 0 siblings, 1 reply; 5+ messages in thread From: Ingo Molnar @ 2015-06-19 8:10 UTC (permalink / raw) To: Borislav Petkov; +Cc: LKML, Thomas Gleixner, H. Peter Anvin, Linus Torvalds * Borislav Petkov <bp@alien8.de> wrote: > From: Borislav Petkov <bp@suse.de> > > When building the kernel with 32-bit binutils built with support only > for the i386 target, we get the following warning: > > arch/x86/kernel/head_32.S:66: Warning: shift count out of range (32 is not between 0 and 31) > > The problem is that in that case, binutils' internal type representation > is 32-bit wide and the shift range overflows. > > In order to fix this, manipulate the shift expression which creates the > 4GiB constant to not overflow the shift count. > > Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com> > Suggested-by: Michael Matz <matz@suse.de> > Signed-off-by: Borislav Petkov <bp@suse.de> > --- > arch/x86/kernel/head_32.S | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S > index 53eeb226657c..c601d1de5ae5 100644 > --- a/arch/x86/kernel/head_32.S > +++ b/arch/x86/kernel/head_32.S > @@ -63,8 +63,8 @@ > #endif > > /* Number of possible pages in the lowmem region */ > -LOWMEM_PAGES = (((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT) > - > +LOWMEM_PAGES = (((2<<31) - __PAGE_OFFSET) >> PAGE_SHIFT) > + Hm, so if internally GAS uses 64-bit types, couldn't we 'make sure' it's a 64-bit type, by using something like 31LL? Assuming GAS understands that? Or if the internal representation is 32 bits, then 2<<31 is just a fancy way of saying '0', right? So this could be written as: LOWMEM_PAGES = (-__PAGE_OFFSET >> PAGE_SHIFT) or: LOWMEM_PAGES = ((0 - __PAGE_OFFSET) >> PAGE_SHIFT) right? Or did it get it all wrong? Thanks, Ingo ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] x86/head_32: Fix overflow warning with 32-bit binutils 2015-06-19 8:10 ` Ingo Molnar @ 2015-06-19 8:59 ` Borislav Petkov 2015-06-19 10:46 ` Ingo Molnar 0 siblings, 1 reply; 5+ messages in thread From: Borislav Petkov @ 2015-06-19 8:59 UTC (permalink / raw) To: Ingo Molnar; +Cc: LKML, Thomas Gleixner, H. Peter Anvin, Linus Torvalds On Fri, Jun 19, 2015 at 10:10:44AM +0200, Ingo Molnar wrote: > > * Borislav Petkov <bp@alien8.de> wrote: > > > From: Borislav Petkov <bp@suse.de> > > > > When building the kernel with 32-bit binutils built with support only > > for the i386 target, we get the following warning: > > > > arch/x86/kernel/head_32.S:66: Warning: shift count out of range (32 is not between 0 and 31) > > > > The problem is that in that case, binutils' internal type representation > > is 32-bit wide and the shift range overflows. > > > > In order to fix this, manipulate the shift expression which creates the > > 4GiB constant to not overflow the shift count. > > > > Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com> > > Suggested-by: Michael Matz <matz@suse.de> > > Signed-off-by: Borislav Petkov <bp@suse.de> > > --- > > arch/x86/kernel/head_32.S | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S > > index 53eeb226657c..c601d1de5ae5 100644 > > --- a/arch/x86/kernel/head_32.S > > +++ b/arch/x86/kernel/head_32.S > > @@ -63,8 +63,8 @@ > > #endif > > > > /* Number of possible pages in the lowmem region */ > > -LOWMEM_PAGES = (((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT) > > - > > +LOWMEM_PAGES = (((2<<31) - __PAGE_OFFSET) >> PAGE_SHIFT) > > + > > Hm, so if internally GAS uses 64-bit types, couldn't we 'make sure' it's a 64-bit > type, by using something like 31LL? Assuming GAS understands that? I don't think it does. This fix is only when gas is compiled with the i386 target which uses solely 32-bit sized types for internal representation. The warning won't fire on gas built with multiple targets support even if you build with -m32. > Or if the internal representation is 32 bits, then 2<<31 is just a fancy way of > saying '0', right? > > So this could be written as: > > LOWMEM_PAGES = (-__PAGE_OFFSET >> PAGE_SHIFT) > > or: > > LOWMEM_PAGES = ((0 - __PAGE_OFFSET) >> PAGE_SHIFT) > > right? Yes, you can do that only when the internal representation is a 32-bit type. If it is not and you still do an -m32 build, you then want the 4Gib value there and not a 0: arch/x86/kernel/head_32.S: Assembler messages: arch/x86/kernel/head_32.S:227: Error: value of 18014395285110787 too large for field of 4 bytes at 146 make[2]: *** [arch/x86/kernel/head_32.o] Error 1 make[2]: *** Waiting for unfinished jobs.... make[1]: *** [arch/x86/kernel] Error 2 make: *** [arch/x86] Error 2 make: *** Waiting for unfinished jobs.... -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. -- ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] x86/head_32: Fix overflow warning with 32-bit binutils 2015-06-19 8:59 ` Borislav Petkov @ 2015-06-19 10:46 ` Ingo Molnar 2015-06-19 11:49 ` Borislav Petkov 0 siblings, 1 reply; 5+ messages in thread From: Ingo Molnar @ 2015-06-19 10:46 UTC (permalink / raw) To: Borislav Petkov; +Cc: LKML, Thomas Gleixner, H. Peter Anvin, Linus Torvalds * Borislav Petkov <bp@alien8.de> wrote: > On Fri, Jun 19, 2015 at 10:10:44AM +0200, Ingo Molnar wrote: > > > > * Borislav Petkov <bp@alien8.de> wrote: > > > > > From: Borislav Petkov <bp@suse.de> > > > > > > When building the kernel with 32-bit binutils built with support only > > > for the i386 target, we get the following warning: > > > > > > arch/x86/kernel/head_32.S:66: Warning: shift count out of range (32 is not between 0 and 31) > > > > > > The problem is that in that case, binutils' internal type representation > > > is 32-bit wide and the shift range overflows. > > > > > > In order to fix this, manipulate the shift expression which creates the > > > 4GiB constant to not overflow the shift count. > > > > > > Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com> > > > Suggested-by: Michael Matz <matz@suse.de> > > > Signed-off-by: Borislav Petkov <bp@suse.de> > > > --- > > > arch/x86/kernel/head_32.S | 4 ++-- > > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > > > diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S > > > index 53eeb226657c..c601d1de5ae5 100644 > > > --- a/arch/x86/kernel/head_32.S > > > +++ b/arch/x86/kernel/head_32.S > > > @@ -63,8 +63,8 @@ > > > #endif > > > > > > /* Number of possible pages in the lowmem region */ > > > -LOWMEM_PAGES = (((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT) > > > - > > > +LOWMEM_PAGES = (((2<<31) - __PAGE_OFFSET) >> PAGE_SHIFT) > > > + > > > > Hm, so if internally GAS uses 64-bit types, couldn't we 'make sure' it's a 64-bit > > type, by using something like 31LL? Assuming GAS understands that? > > I don't think it does. > > This fix is only when gas is compiled with the i386 target which uses solely > 32-bit sized types for internal representation. The warning won't fire on gas > built with multiple targets support even if you build with -m32. Ugh, nasty. > > Or if the internal representation is 32 bits, then 2<<31 is just a fancy way of > > saying '0', right? > > > > So this could be written as: > > > > LOWMEM_PAGES = (-__PAGE_OFFSET >> PAGE_SHIFT) > > > > or: > > > > LOWMEM_PAGES = ((0 - __PAGE_OFFSET) >> PAGE_SHIFT) > > > > right? > > Yes, you can do that only when the internal representation is a 32-bit > type. If it is not and you still do an -m32 build, you then want the > 4Gib value there and not a 0: > > arch/x86/kernel/head_32.S: Assembler messages: > arch/x86/kernel/head_32.S:227: Error: value of 18014395285110787 too large for field of 4 bytes at 146 Grumble. I guess the workaround is OK then because I cannot think of any cleaner solution - but I'd suggest to put a comment there at minimum, to explain what it's about. ... and chances are that GAS might start warning about 2<<31 in the future as well. Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] x86/head_32: Fix overflow warning with 32-bit binutils 2015-06-19 10:46 ` Ingo Molnar @ 2015-06-19 11:49 ` Borislav Petkov 0 siblings, 0 replies; 5+ messages in thread From: Borislav Petkov @ 2015-06-19 11:49 UTC (permalink / raw) To: Ingo Molnar; +Cc: LKML, Thomas Gleixner, H. Peter Anvin, Linus Torvalds On Fri, Jun 19, 2015 at 12:46:28PM +0200, Ingo Molnar wrote: > Grumble. I guess the workaround is OK then because I cannot think > of any cleaner solution - but I'd suggest to put a comment there at > minimum, to explain what it's about. > > ... and chances are that GAS might start warning about 2<<31 in the > future as well. Reportedly it won't because it'll wrap around to 0 and that is fine... Anyway, here's v2: --- From: Borislav Petkov <bp@suse.de> Subject: [PATCH -v2] x86/head_32: Fix overflow warning with 32-bit binutils When building the kernel with 32-bit binutils built with support only for the i386 target, we get the following warning: arch/x86/kernel/head_32.S:66: Warning: shift count out of range (32 is not between 0 and 31) The problem is that in that case, binutils' internal type representation is 32-bit wide and the shift range overflows. In order to fix this, manipulate the shift expression which creates the 4GiB constant to not overflow the shift count. Reported-and-tested-by: Enrico Mioso <mrkiko.rs@gmail.com> Suggested-by: Michael Matz <matz@suse.de> Signed-off-by: Borislav Petkov <bp@suse.de> --- arch/x86/kernel/head_32.S | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 53eeb226657c..7e429c99c728 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S @@ -62,9 +62,16 @@ #define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PGD) #endif -/* Number of possible pages in the lowmem region */ -LOWMEM_PAGES = (((1<<32) - __PAGE_OFFSET) >> PAGE_SHIFT) - +/* + * Number of possible pages in the lowmem region. + * + * We shift 2 by 31 instead of 1 by 32 to the left in order to avoid a + * gas warning about overflowing shift count when gas has been compiled + * with only a host target support using a 32-bit type for internal + * representation. + */ +LOWMEM_PAGES = (((2<<31) - __PAGE_OFFSET) >> PAGE_SHIFT) + /* Enough space to fit pagetables for the low memory linear map */ MAPPING_BEYOND_END = PAGE_TABLE_SIZE(LOWMEM_PAGES) << PAGE_SHIFT -- 2.3.5 -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-06-19 11:49 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-06-19 7:51 [PATCH] x86/head_32: Fix overflow warning with 32-bit binutils Borislav Petkov 2015-06-19 8:10 ` Ingo Molnar 2015-06-19 8:59 ` Borislav Petkov 2015-06-19 10:46 ` Ingo Molnar 2015-06-19 11:49 ` Borislav Petkov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox