Commit 6846ee5c authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Linus Torvalds

zlib: Fix build of powerpc boot wrapper

Commit ac4c2a3b broke the build
of all powerpc boot wrappers.

It attempts to add an include of autoconf.h but used the wrong
path for it. It also adds -D__KERNEL__ to our boot wrapper, both
things that we pretty much didn't do on purpose so far.

We want our boot wrapper to remain independent enough of the kernel
for various reasons, one of them being that you can "wrap" an existing
kernel at distro install time which allows to ship one kernel image
and a set of boot wrappers for different platforms, the wrappers
don't have to be built out of the same kernel build tree.

It's also incorrect to do what the patch does in our boot environment
since we may not have a proper alignment exception handler which means
we may not be able to fixup the few cases where an unaligned access will
need SW emulation (depends on the core variant, could be when crossing
page or segment boundaries for example).

This patch fixes it by putting the old code back in and using the
new "fancy" variant only when CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
is set, which happens not to be set on powerpc since we don't include
autoconf.h. It also reverts the changes to our boot wrapper Makefile.

This means that x86 should, afaik, keep the optimisations since its
boot wrapper does include autoconf.h and define __KERNEL__ (though I
doubt they make that much different outside of slow embedded processors).
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8866f9df
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
all: $(obj)/zImage all: $(obj)/zImage
BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-fno-strict-aliasing -Os -msoft-float -pipe -D__KERNEL__\ -fno-strict-aliasing -Os -msoft-float -pipe \
-fomit-frame-pointer -fno-builtin -fPIC -nostdinc \ -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \
-isystem $(shell $(CROSS32CC) -print-file-name=include) -isystem $(shell $(CROSS32CC) -print-file-name=include)
BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc BOOTAFLAGS := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
...@@ -34,8 +34,6 @@ BOOTCFLAGS += -fno-stack-protector ...@@ -34,8 +34,6 @@ BOOTCFLAGS += -fno-stack-protector
endif endif
BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj)
BOOTCFLAGS += -include include/linux/autoconf.h -Iarch/powerpc/include
BOOTCFLAGS += -Iinclude
DTS_FLAGS ?= -p 1024 DTS_FLAGS ?= -p 1024
......
...@@ -4,12 +4,25 @@ ...@@ -4,12 +4,25 @@
*/ */
#include <linux/zutil.h> #include <linux/zutil.h>
#include <asm/unaligned.h>
#include <asm/byteorder.h>
#include "inftrees.h" #include "inftrees.h"
#include "inflate.h" #include "inflate.h"
#include "inffast.h" #include "inffast.h"
/* Only do the unaligned "Faster" variant when
* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is set
*
* On powerpc, it won't be as we don't include autoconf.h
* automatically for the boot wrapper, which is intended as
* we run in an environment where we may not be able to deal
* with (even rare) alignment faults. In addition, we do not
* define __KERNEL__ for arch/powerpc/boot unlike x86
*/
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
#include <asm/unaligned.h>
#include <asm/byteorder.h>
#endif
#ifndef ASMINF #ifndef ASMINF
/* Allow machine dependent optimization for post-increment or pre-increment. /* Allow machine dependent optimization for post-increment or pre-increment.
...@@ -243,6 +256,7 @@ void inflate_fast(z_streamp strm, unsigned start) ...@@ -243,6 +256,7 @@ void inflate_fast(z_streamp strm, unsigned start)
} }
} }
else { else {
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
unsigned short *sout; unsigned short *sout;
unsigned long loops; unsigned long loops;
...@@ -284,6 +298,20 @@ void inflate_fast(z_streamp strm, unsigned start) ...@@ -284,6 +298,20 @@ void inflate_fast(z_streamp strm, unsigned start)
} }
if (len & 1) if (len & 1)
PUP(out) = PUP(from); PUP(out) = PUP(from);
#else /* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */
from = out - dist; /* copy direct from output */
do { /* minimum length is three */
PUP(out) = PUP(from);
PUP(out) = PUP(from);
PUP(out) = PUP(from);
len -= 3;
} while (len > 2);
if (len) {
PUP(out) = PUP(from);
if (len > 1)
PUP(out) = PUP(from);
}
#endif /* !CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */
} }
} }
else if ((op & 64) == 0) { /* 2nd level distance code */ else if ((op & 64) == 0) { /* 2nd level distance code */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment