Update to 3.3.6
svn path=/dists/trunk/linux-2.6/; revision=19008
This commit is contained in:
parent
8b86031159
commit
59868c12b9
|
@ -1,3 +1,34 @@
|
|||
linux-2.6 (3.3.6-1~experimental.1) experimental; urgency=low
|
||||
|
||||
* New upstream stable update:
|
||||
http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.3.5
|
||||
http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.3.6
|
||||
- USB: cdc-wdm: fix race leading leading to memory corruption
|
||||
- autofs: make the autofsv5 packet file descriptor use a packetized pipe
|
||||
(Closes: #633423)
|
||||
- PM / Hibernate: fix the number of pages used for hibernate/thaw buffering
|
||||
(Closes: #659363)
|
||||
- efi: Validate UEFI boot variables
|
||||
- efivars: Improve variable validation
|
||||
- fs/cifs: fix parsing of dfs referrals
|
||||
- hfsplus: Fix potential buffer overflows (CVE-2012-2319)
|
||||
- exit_signal: fix the "parent has changed security domain" logic
|
||||
- net: l2tp: unlock socket lock before returning from l2tp_ip_sendmsg
|
||||
- sky2: fix receive length error in mixed non-VLAN/VLAN traffic
|
||||
(Closes: #492853)
|
||||
- [s390] KVM: do store status after handling STOP_ON_STOP bit
|
||||
- [s390] KVM: Sanitize fpc registers for KVM_SET_FPU
|
||||
- KVM: Fix write protection race during dirty logging
|
||||
- KVM: mmu_notifier: Flush TLBs before releasing mmu_lock
|
||||
- KVM: Ensure all vcpus are consistent with in-kernel irqchip settings
|
||||
(CVE-2012-1601)
|
||||
- KVM: nVMX: Fix erroneous exception bitmap check
|
||||
- KVM: VMX: Fix kvm_set_shared_msr() called in preemptible context
|
||||
- KVM: lock slots_lock around device assignment
|
||||
- hugepages: fix use after free bug in "quota" handling
|
||||
|
||||
-- Ben Hutchings <ben@decadent.org.uk> Fri, 18 May 2012 03:53:16 +0100
|
||||
|
||||
linux-2.6 (3.3.4-1~experimental.1) experimental; urgency=low
|
||||
|
||||
* New upstream stable update:
|
||||
|
|
|
@ -1,52 +0,0 @@
|
|||
From: Trond Myklebust <Trond.Myklebust@netapp.com>
|
||||
Date: Wed, 18 Apr 2012 12:20:10 -0400
|
||||
Subject: [PATCH 1/2] NFSv4: Ensure that the LOCK code sets exception->inode
|
||||
|
||||
commit 05ffe24f5290dc095f98fbaf84afe51ef404ccc5 upstream.
|
||||
|
||||
All callers of nfs4_handle_exception() that need to handle
|
||||
NFS4ERR_OPENMODE correctly should set exception->inode
|
||||
|
||||
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
fs/nfs/nfs4proc.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
|
||||
index f82bde0..3c787d0 100644
|
||||
--- a/fs/nfs/nfs4proc.c
|
||||
+++ b/fs/nfs/nfs4proc.c
|
||||
@@ -4558,7 +4558,9 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f
|
||||
static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
|
||||
{
|
||||
struct nfs_server *server = NFS_SERVER(state->inode);
|
||||
- struct nfs4_exception exception = { };
|
||||
+ struct nfs4_exception exception = {
|
||||
+ .inode = state->inode,
|
||||
+ };
|
||||
int err;
|
||||
|
||||
do {
|
||||
@@ -4576,7 +4578,9 @@ static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request
|
||||
static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request)
|
||||
{
|
||||
struct nfs_server *server = NFS_SERVER(state->inode);
|
||||
- struct nfs4_exception exception = { };
|
||||
+ struct nfs4_exception exception = {
|
||||
+ .inode = state->inode,
|
||||
+ };
|
||||
int err;
|
||||
|
||||
err = nfs4_set_lock_state(state, request);
|
||||
@@ -4676,6 +4680,7 @@ static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *
|
||||
{
|
||||
struct nfs4_exception exception = {
|
||||
.state = state,
|
||||
+ .inode = state->inode,
|
||||
};
|
||||
int err;
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
From: Trond Myklebust <Trond.Myklebust@netapp.com>
|
||||
Date: Wed, 18 Apr 2012 12:48:35 -0400
|
||||
Subject: [PATCH 2/2] NFSv4: Ensure that we check lock exclusive/shared type
|
||||
against open modes
|
||||
|
||||
commit 55725513b5ef9d462aa3e18527658a0362aaae83 upstream.
|
||||
|
||||
Since we may be simulating flock() locks using NFS byte range locks,
|
||||
we can't rely on the VFS having checked the file open mode for us.
|
||||
|
||||
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
fs/nfs/nfs4proc.c | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
|
||||
index 3c787d0..ba837d9 100644
|
||||
--- a/fs/nfs/nfs4proc.c
|
||||
+++ b/fs/nfs/nfs4proc.c
|
||||
@@ -4726,6 +4726,20 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
|
||||
|
||||
if (state == NULL)
|
||||
return -ENOLCK;
|
||||
+ /*
|
||||
+ * Don't rely on the VFS having checked the file open mode,
|
||||
+ * since it won't do this for flock() locks.
|
||||
+ */
|
||||
+ switch (request->fl_type & (F_RDLCK|F_WRLCK|F_UNLCK)) {
|
||||
+ case F_RDLCK:
|
||||
+ if (!(filp->f_mode & FMODE_READ))
|
||||
+ return -EBADF;
|
||||
+ break;
|
||||
+ case F_WRLCK:
|
||||
+ if (!(filp->f_mode & FMODE_WRITE))
|
||||
+ return -EBADF;
|
||||
+ }
|
||||
+
|
||||
do {
|
||||
status = nfs4_proc_setlk(state, cmd, request);
|
||||
if ((status != -EAGAIN) || IS_SETLK(cmd))
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,133 +0,0 @@
|
|||
From: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Date: Sat, 28 Apr 2012 08:29:56 -0700
|
||||
Subject: [PATCH] Revert "autofs: work around unhappy compat problem on
|
||||
x86-64"
|
||||
|
||||
commit fcbf94b9dedd2ce08e798a99aafc94fec8668161 upstream.
|
||||
|
||||
This reverts commit a32744d4abae24572eff7269bc17895c41bd0085.
|
||||
|
||||
While that commit was technically the right thing to do, and made the
|
||||
x86-64 compat mode work identically to native 32-bit mode (and thus
|
||||
fixing the problem with a 32-bit systemd install on a 64-bit kernel), it
|
||||
turns out that the automount binaries had workarounds for this compat
|
||||
problem.
|
||||
|
||||
Now, the workarounds are disgusting: doing an "uname()" to find out the
|
||||
architecture of the kernel, and then comparing it for the 64-bit cases
|
||||
and fixing up the size of the read() in automount for those. And they
|
||||
were confused: it's not actually a generic 64-bit issue at all, it's
|
||||
very much tied to just x86-64, which has different alignment for an
|
||||
'u64' in 64-bit mode than in 32-bit mode.
|
||||
|
||||
But the end result is that fixing the compat layer actually breaks the
|
||||
case of a 32-bit automount on a x86-64 kernel.
|
||||
|
||||
There are various approaches to fix this (including just doing a
|
||||
"strcmp()" on current->comm and comparing it to "automount"), but I
|
||||
think that I will do the one that teaches pipes about a special "packet
|
||||
mode", which will allow user space to not have to care too deeply about
|
||||
the padding at the end of the autofs packet.
|
||||
|
||||
That change will make the compat workaround unnecessary, so let's revert
|
||||
it first, and get automount working again in compat mode. The
|
||||
packetized pipes will then fix autofs for systemd.
|
||||
|
||||
Reported-and-requested-by: Michael Tokarev <mjt@tls.msk.ru>
|
||||
Cc: Ian Kent <raven@themaw.net>
|
||||
Cc: stable@kernel.org # for 3.3
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
fs/autofs4/autofs_i.h | 1 -
|
||||
fs/autofs4/dev-ioctl.c | 1 -
|
||||
fs/autofs4/inode.c | 2 --
|
||||
fs/autofs4/waitq.c | 22 +++-------------------
|
||||
4 files changed, 3 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h
|
||||
index eb1cc92..d8d8e7b 100644
|
||||
--- a/fs/autofs4/autofs_i.h
|
||||
+++ b/fs/autofs4/autofs_i.h
|
||||
@@ -110,7 +110,6 @@ struct autofs_sb_info {
|
||||
int sub_version;
|
||||
int min_proto;
|
||||
int max_proto;
|
||||
- int compat_daemon;
|
||||
unsigned long exp_timeout;
|
||||
unsigned int type;
|
||||
int reghost_enabled;
|
||||
diff --git a/fs/autofs4/dev-ioctl.c b/fs/autofs4/dev-ioctl.c
|
||||
index 9dacb85..3dfd615 100644
|
||||
--- a/fs/autofs4/dev-ioctl.c
|
||||
+++ b/fs/autofs4/dev-ioctl.c
|
||||
@@ -385,7 +385,6 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp,
|
||||
sbi->pipefd = pipefd;
|
||||
sbi->pipe = pipe;
|
||||
sbi->catatonic = 0;
|
||||
- sbi->compat_daemon = is_compat_task();
|
||||
}
|
||||
out:
|
||||
mutex_unlock(&sbi->wq_mutex);
|
||||
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c
|
||||
index d8dc002..14c7bc0 100644
|
||||
--- a/fs/autofs4/inode.c
|
||||
+++ b/fs/autofs4/inode.c
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <linux/parser.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/magic.h>
|
||||
-#include <linux/compat.h>
|
||||
#include "autofs_i.h"
|
||||
#include <linux/module.h>
|
||||
|
||||
@@ -225,7 +224,6 @@ int autofs4_fill_super(struct super_block *s, void *data, int silent)
|
||||
set_autofs_type_indirect(&sbi->type);
|
||||
sbi->min_proto = 0;
|
||||
sbi->max_proto = 0;
|
||||
- sbi->compat_daemon = is_compat_task();
|
||||
mutex_init(&sbi->wq_mutex);
|
||||
mutex_init(&sbi->pipe_mutex);
|
||||
spin_lock_init(&sbi->fs_lock);
|
||||
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c
|
||||
index 9c098db..da8876d 100644
|
||||
--- a/fs/autofs4/waitq.c
|
||||
+++ b/fs/autofs4/waitq.c
|
||||
@@ -91,24 +91,7 @@ static int autofs4_write(struct autofs_sb_info *sbi,
|
||||
|
||||
return (bytes > 0);
|
||||
}
|
||||
-
|
||||
-/*
|
||||
- * The autofs_v5 packet was misdesigned.
|
||||
- *
|
||||
- * The packets are identical on x86-32 and x86-64, but have different
|
||||
- * alignment. Which means that 'sizeof()' will give different results.
|
||||
- * Fix it up for the case of running 32-bit user mode on a 64-bit kernel.
|
||||
- */
|
||||
-static noinline size_t autofs_v5_packet_size(struct autofs_sb_info *sbi)
|
||||
-{
|
||||
- size_t pktsz = sizeof(struct autofs_v5_packet);
|
||||
-#if defined(CONFIG_X86_64) && defined(CONFIG_COMPAT)
|
||||
- if (sbi->compat_daemon > 0)
|
||||
- pktsz -= 4;
|
||||
-#endif
|
||||
- return pktsz;
|
||||
-}
|
||||
-
|
||||
+
|
||||
static void autofs4_notify_daemon(struct autofs_sb_info *sbi,
|
||||
struct autofs_wait_queue *wq,
|
||||
int type)
|
||||
@@ -172,7 +155,8 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi,
|
||||
{
|
||||
struct autofs_v5_packet *packet = &pkt.v5_pkt.v5_packet;
|
||||
|
||||
- pktsz = autofs_v5_packet_size(sbi);
|
||||
+ pktsz = sizeof(*packet);
|
||||
+
|
||||
packet->wait_queue_token = wq->wait_queue_token;
|
||||
packet->len = wq->name.len;
|
||||
memcpy(packet->name, wq->name.name, wq->name.len);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Sat, 7 Apr 2012 04:57:36 +0100
|
||||
Subject: [PATCH] ARM: orion5x: Fix GPIO enable bits for MPP9
|
||||
|
||||
Commit 554cdaefd1cf7bb54b209c4e68c7cec87ce442a9 seems to have
|
||||
accidentally inverted the GPIO valid bits for MPP9 (only). For the
|
||||
mv2120 platform which uses MPP9 as a GPIO LED device, this results in
|
||||
the error:
|
||||
|
||||
[ 12.711476] leds-gpio: probe of leds-gpio failed with error -22
|
||||
|
||||
Reported-by: Henry von Tresckow <hvontres@gmail.com>
|
||||
References: http://bugs.debian.org/667446
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
---
|
||||
arch/arm/mach-orion5x/mpp.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/mach-orion5x/mpp.h b/arch/arm/mach-orion5x/mpp.h
|
||||
index eac6897..db70e79 100644
|
||||
--- a/arch/arm/mach-orion5x/mpp.h
|
||||
+++ b/arch/arm/mach-orion5x/mpp.h
|
||||
@@ -65,8 +65,8 @@
|
||||
#define MPP8_GIGE MPP(8, 0x1, 0, 0, 1, 1, 1)
|
||||
|
||||
#define MPP9_UNUSED MPP(9, 0x0, 0, 0, 1, 1, 1)
|
||||
-#define MPP9_GPIO MPP(9, 0x0, 0, 0, 1, 1, 1)
|
||||
-#define MPP9_GIGE MPP(9, 0x1, 1, 1, 1, 1, 1)
|
||||
+#define MPP9_GPIO MPP(9, 0x0, 1, 1, 1, 1, 1)
|
||||
+#define MPP9_GIGE MPP(9, 0x1, 0, 0, 1, 1, 1)
|
||||
|
||||
#define MPP10_UNUSED MPP(10, 0x0, 0, 0, 1, 1, 1)
|
||||
#define MPP10_GPIO MPP(10, 0x0, 1, 1, 1, 1, 1)
|
||||
--
|
||||
1.7.9.5
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
From d62d421b071b08249361044d8e56c8b5c3ed6aa7 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Nyhus <martin.nyhus@gmx.com>
|
||||
Date: Thu, 15 Mar 2012 18:25:48 +0100
|
||||
Subject: dell-laptop: Terminate quirks list properly
|
||||
|
||||
From: Martin Nyhus <martin.nyhus@gmx.com>
|
||||
|
||||
commit d62d421b071b08249361044d8e56c8b5c3ed6aa7 upstream.
|
||||
|
||||
Add missing DMI_NONE entry to end of the quirks list so
|
||||
dmi_check_system() won't read past the end of the list.
|
||||
|
||||
Signed-off-by: Martin Nyhus <martin.nyhus@gmx.com>
|
||||
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
||||
Cc: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
Tested-by: Jens Gustedt <Jens.Gustedt@loria.fr>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
|
||||
---
|
||||
drivers/platform/x86/dell-laptop.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/platform/x86/dell-laptop.c
|
||||
+++ b/drivers/platform/x86/dell-laptop.c
|
||||
@@ -211,6 +211,7 @@ static struct dmi_system_id __devinitdat
|
||||
},
|
||||
.driver_data = &quirk_dell_vostro_v130,
|
||||
},
|
||||
+ { }
|
||||
};
|
||||
|
||||
static struct calling_interface_buffer *buffer;
|
|
@ -1,38 +0,0 @@
|
|||
From: Xi Wang <xi.wang@gmail.com>
|
||||
Date: Mon, 23 Apr 2012 04:06:42 -0400
|
||||
Message-Id: <1335168402-25174-2-git-send-email-xi.wang@gmail.com>
|
||||
Subject: [PATCH v2 2/2] drm/i915: fix integer overflow in
|
||||
i915_gem_do_execbuffer()
|
||||
|
||||
On 32-bit systems, a large args->num_cliprects from userspace via ioctl
|
||||
may overflow the allocation size, leading to out-of-bounds access.
|
||||
|
||||
This vulnerability was introduced in commit 432e58ed ("drm/i915: Avoid
|
||||
allocation for execbuffer object list").
|
||||
|
||||
Signed-off-by: Xi Wang <xi.wang@gmail.com>
|
||||
Cc: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_gem_execbuffer.c | 5 +++++
|
||||
1 files changed, 5 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
|
||||
index 7c50e58..de43194 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
|
||||
@@ -1133,6 +1133,11 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
+ if (args->num_cliprects > UINT_MAX / sizeof(*cliprects)) {
|
||||
+ DRM_DEBUG("execbuf with %u cliprects\n",
|
||||
+ args->num_cliprects);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
cliprects = kmalloc(args->num_cliprects * sizeof(*cliprects),
|
||||
GFP_KERNEL);
|
||||
if (cliprects == NULL) {
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
From: Xi Wang <xi.wang@gmail.com>
|
||||
Date: Mon, 23 Apr 2012 04:06:41 -0400
|
||||
Message-Id: <1335168402-25174-1-git-send-email-xi.wang@gmail.com>
|
||||
Subject: [PATCH v2 1/2] drm/i915: fix integer overflow in
|
||||
i915_gem_execbuffer2()
|
||||
|
||||
On 32-bit systems, a large args->buffer_count from userspace via ioctl
|
||||
may overflow the allocation size, leading to out-of-bounds access.
|
||||
|
||||
This vulnerability was introduced in commit 8408c282 ("drm/i915:
|
||||
First try a normal large kmalloc for the temporary exec buffers").
|
||||
|
||||
Signed-off-by: Xi Wang <xi.wang@gmail.com>
|
||||
Cc: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Cc: stable@vger.kernel.org
|
||||
[bwh: Backported to 3.2: adjust context]
|
||||
---
|
||||
drivers/gpu/drm/i915/i915_gem_execbuffer.c | 3 ++-
|
||||
1 files changed, 2 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
|
||||
index f51a696..7c50e58 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
|
||||
@@ -1404,7 +1404,8 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
|
||||
struct drm_i915_gem_exec_object2 *exec2_list = NULL;
|
||||
int ret;
|
||||
|
||||
- if (args->buffer_count < 1) {
|
||||
+ if (args->buffer_count < 1 ||
|
||||
+ args->buffer_count > UINT_MAX / sizeof(*exec2_list)) {
|
||||
DRM_ERROR("execbuf2 with %d buffers\n", args->buffer_count);
|
||||
return -EINVAL;
|
||||
}
|
||||
--
|
||||
1.7.5.4
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Sat, 27 Aug 2011 09:35:45 +0100
|
||||
Subject: [PATCH 01/11] x86: Add missing bzImage fields to struct setup_header
|
||||
|
||||
commit 8af21e7e71d1ac56d9b66fb787a14fd66af7f5f7 upstream.
|
||||
|
||||
commit 37ba7ab5e33c ("x86, boot: make kernel_alignment adjustable; new
|
||||
bzImage fields") introduced some new fields into the bzImage header
|
||||
but struct setup_header was not updated accordingly. Add the missing
|
||||
'pref_address' and 'init_size' fields.
|
||||
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1318848017-12301-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
arch/x86/include/asm/bootparam.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/arch/x86/include/asm/bootparam.h b/arch/x86/include/asm/bootparam.h
|
||||
index e020d88..2f90c51 100644
|
||||
--- a/arch/x86/include/asm/bootparam.h
|
||||
+++ b/arch/x86/include/asm/bootparam.h
|
||||
@@ -64,6 +64,8 @@ struct setup_header {
|
||||
__u32 payload_offset;
|
||||
__u32 payload_length;
|
||||
__u64 setup_data;
|
||||
+ __u64 pref_address;
|
||||
+ __u32 init_size;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct sys_desc_table {
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 15 Nov 2011 12:56:14 +0000
|
||||
Subject: [PATCH 02/11] x86: Don't use magic strings for EFI loader signature
|
||||
|
||||
commit f7d7d01be53cb47e0ae212c4e968aa28b82d2138 upstream.
|
||||
|
||||
Introduce a symbol, EFI_LOADER_SIGNATURE instead of using the magic
|
||||
strings, which also helps to reduce the amount of ifdeffery.
|
||||
|
||||
Cc: Matthew Garrett <mjg@redhat.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1318848017-12301-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
arch/x86/include/asm/efi.h | 4 ++++
|
||||
arch/x86/kernel/setup.c | 7 +------
|
||||
2 files changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h
|
||||
index b8d8bfc..26d8c18 100644
|
||||
--- a/arch/x86/include/asm/efi.h
|
||||
+++ b/arch/x86/include/asm/efi.h
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
||||
+#define EFI_LOADER_SIGNATURE "EL32"
|
||||
+
|
||||
extern unsigned long asmlinkage efi_call_phys(void *, ...);
|
||||
|
||||
#define efi_call_phys0(f) efi_call_phys(f)
|
||||
@@ -35,6 +37,8 @@ extern unsigned long asmlinkage efi_call_phys(void *, ...);
|
||||
|
||||
#else /* !CONFIG_X86_32 */
|
||||
|
||||
+#define EFI_LOADER_SIGNATURE "EL64"
|
||||
+
|
||||
extern u64 efi_call0(void *fp);
|
||||
extern u64 efi_call1(void *fp, u64 arg1);
|
||||
extern u64 efi_call2(void *fp, u64 arg1, u64 arg2);
|
||||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
|
||||
index 9a9e40f..4d5243c 100644
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -752,12 +752,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
#endif
|
||||
#ifdef CONFIG_EFI
|
||||
if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
|
||||
-#ifdef CONFIG_X86_32
|
||||
- "EL32",
|
||||
-#else
|
||||
- "EL64",
|
||||
-#endif
|
||||
- 4)) {
|
||||
+ EFI_LOADER_SIGNATURE, 4)) {
|
||||
efi_enabled = 1;
|
||||
efi_memblock_x86_reserve_range();
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 15 Nov 2011 12:56:32 +0000
|
||||
Subject: [PATCH 03/11] efi.h: Add struct definition for boot time services
|
||||
|
||||
commit f30ca6ba0bb2b7d050f24682bb8639c939c79859 upstream.
|
||||
|
||||
With the forthcoming efi stub code we're gonna need to access boot
|
||||
time services so let's define a struct so we can access the functions.
|
||||
|
||||
Cc: Matthew Garrett <mjg@redhat.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1318848017-12301-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
include/linux/efi.h | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 52 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index 2362a0b..9547597 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -139,6 +139,57 @@ typedef struct {
|
||||
} efi_time_cap_t;
|
||||
|
||||
/*
|
||||
+ * EFI Boot Services table
|
||||
+ */
|
||||
+typedef struct {
|
||||
+ efi_table_hdr_t hdr;
|
||||
+ void *raise_tpl;
|
||||
+ void *restore_tpl;
|
||||
+ void *allocate_pages;
|
||||
+ void *free_pages;
|
||||
+ void *get_memory_map;
|
||||
+ void *allocate_pool;
|
||||
+ void *free_pool;
|
||||
+ void *create_event;
|
||||
+ void *set_timer;
|
||||
+ void *wait_for_event;
|
||||
+ void *signal_event;
|
||||
+ void *close_event;
|
||||
+ void *check_event;
|
||||
+ void *install_protocol_interface;
|
||||
+ void *reinstall_protocol_interface;
|
||||
+ void *uninstall_protocol_interface;
|
||||
+ void *handle_protocol;
|
||||
+ void *__reserved;
|
||||
+ void *register_protocol_notify;
|
||||
+ void *locate_handle;
|
||||
+ void *locate_device_path;
|
||||
+ void *install_configuration_table;
|
||||
+ void *load_image;
|
||||
+ void *start_image;
|
||||
+ void *exit;
|
||||
+ void *unload_image;
|
||||
+ void *exit_boot_services;
|
||||
+ void *get_next_monotonic_count;
|
||||
+ void *stall;
|
||||
+ void *set_watchdog_timer;
|
||||
+ void *connect_controller;
|
||||
+ void *disconnect_controller;
|
||||
+ void *open_protocol;
|
||||
+ void *close_protocol;
|
||||
+ void *open_protocol_information;
|
||||
+ void *protocols_per_handle;
|
||||
+ void *locate_handle_buffer;
|
||||
+ void *locate_protocol;
|
||||
+ void *install_multiple_protocol_interfaces;
|
||||
+ void *uninstall_multiple_protocol_interfaces;
|
||||
+ void *calculate_crc32;
|
||||
+ void *copy_mem;
|
||||
+ void *set_mem;
|
||||
+ void *create_event_ex;
|
||||
+} efi_boot_services_t;
|
||||
+
|
||||
+/*
|
||||
* Types and defines for EFI ResetSystem
|
||||
*/
|
||||
#define EFI_RESET_COLD 0
|
||||
@@ -261,7 +312,7 @@ typedef struct {
|
||||
unsigned long stderr_handle;
|
||||
unsigned long stderr;
|
||||
efi_runtime_services_t *runtime;
|
||||
- unsigned long boottime;
|
||||
+ efi_boot_services_t *boottime;
|
||||
unsigned long nr_tables;
|
||||
unsigned long tables;
|
||||
} efi_system_table_t;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 15 Nov 2011 12:56:50 +0000
|
||||
Subject: [PATCH 04/11] efi.h: Add efi_image_loaded_t
|
||||
|
||||
commit 8e84f345e2f2189a37492c77c566c7494b7b6b23 upstream.
|
||||
|
||||
Add the EFI loaded image structure and protocol guid which are
|
||||
required by the x86 EFI boot stub. The EFI boot stub uses the
|
||||
structure to figure out where it was loaded in memory and to pass
|
||||
command line arguments to the kernel.
|
||||
|
||||
Cc: Matthew Garrett <mjg@redhat.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1318848017-12301-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
include/linux/efi.h | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index 9547597..e35005f 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -287,6 +287,9 @@ typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
|
||||
#define LINUX_EFI_CRASH_GUID \
|
||||
EFI_GUID( 0xcfc8fc79, 0xbe2e, 0x4ddc, 0x97, 0xf0, 0x9f, 0x98, 0xbf, 0xe2, 0x98, 0xa0 )
|
||||
|
||||
+#define LOADED_IMAGE_PROTOCOL_GUID \
|
||||
+ EFI_GUID( 0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
|
||||
+
|
||||
typedef struct {
|
||||
efi_guid_t guid;
|
||||
unsigned long table;
|
||||
@@ -326,6 +329,22 @@ struct efi_memory_map {
|
||||
unsigned long desc_size;
|
||||
};
|
||||
|
||||
+typedef struct {
|
||||
+ u32 revision;
|
||||
+ void *parent_handle;
|
||||
+ efi_system_table_t *system_table;
|
||||
+ void *device_handle;
|
||||
+ void *file_path;
|
||||
+ void *reserved;
|
||||
+ u32 load_options_size;
|
||||
+ void *load_options;
|
||||
+ void *image_base;
|
||||
+ __aligned_u64 image_size;
|
||||
+ unsigned int image_code_type;
|
||||
+ unsigned int image_data_type;
|
||||
+ unsigned long unload;
|
||||
+} efi_loaded_image_t;
|
||||
+
|
||||
#define EFI_INVALID_TABLE_ADDR (~0UL)
|
||||
|
||||
/*
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 15 Nov 2011 12:57:03 +0000
|
||||
Subject: [PATCH 05/11] efi.h: Add allocation types for
|
||||
boottime->allocate_pages()
|
||||
|
||||
commit bb05e4ba452ada7966fbced4e829aa029f546445 upstream.
|
||||
|
||||
Add the allocation types detailed in section 6.2 - "AllocatePages()"
|
||||
of the UEFI 2.3 specification. These definitions will be used by the
|
||||
x86 EFI boot stub which needs to allocate memory during boot.
|
||||
|
||||
Cc: Matthew Garrett <mjg@redhat.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1318848017-12301-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
include/linux/efi.h | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index e35005f..378f2cd 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -109,6 +109,14 @@ typedef struct {
|
||||
u32 imagesize;
|
||||
} efi_capsule_header_t;
|
||||
|
||||
+/*
|
||||
+ * Allocation types for calls to boottime->allocate_pages.
|
||||
+ */
|
||||
+#define EFI_ALLOCATE_ANY_PAGES 0
|
||||
+#define EFI_ALLOCATE_MAX_ADDRESS 1
|
||||
+#define EFI_ALLOCATE_ADDRESS 2
|
||||
+#define EFI_MAX_ALLOCATE_TYPE 3
|
||||
+
|
||||
typedef int (*efi_freemem_callback_t) (u64 start, u64 end, void *arg);
|
||||
|
||||
/*
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 15 Nov 2011 12:57:16 +0000
|
||||
Subject: [PATCH 06/11] efi.h: Add graphics protocol guids
|
||||
|
||||
commit 0f7c5d477f2ce552997831d80e2c872cca1b9054 upstream.
|
||||
|
||||
The x86 EFI boot stub uses the Graphics Output Protocol and Universal
|
||||
Graphics Adapter (UGA) protocol guids when initialising graphics
|
||||
during boot.
|
||||
|
||||
Cc: Matthew Garrett <mjg@redhat.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1318848017-12301-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
include/linux/efi.h | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index 378f2cd..e46d771 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -298,6 +298,15 @@ typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
|
||||
#define LOADED_IMAGE_PROTOCOL_GUID \
|
||||
EFI_GUID( 0x5b1b31a1, 0x9562, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
|
||||
|
||||
+#define EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID \
|
||||
+ EFI_GUID( 0x9042a9de, 0x23dc, 0x4a38, 0x96, 0xfb, 0x7a, 0xde, 0xd0, 0x80, 0x51, 0x6a )
|
||||
+
|
||||
+#define EFI_UGA_PROTOCOL_GUID \
|
||||
+ EFI_GUID( 0x982c298b, 0xf4fa, 0x41cb, 0xb8, 0x38, 0x77, 0xaa, 0x68, 0x8f, 0xb8, 0x39 )
|
||||
+
|
||||
+#define EFI_PCI_IO_PROTOCOL_GUID \
|
||||
+ EFI_GUID( 0x4cf5b200, 0x68b8, 0x4ca5, 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a )
|
||||
+
|
||||
typedef struct {
|
||||
efi_guid_t guid;
|
||||
unsigned long table;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 15 Nov 2011 12:57:26 +0000
|
||||
Subject: [PATCH 07/11] efi.h: Add boottime->locate_handle search types
|
||||
|
||||
commit e2527a7cbec073b69a251193f200a88efbced7ad upstream.
|
||||
|
||||
The x86 EFI boot stub needs to locate handles for various protocols.
|
||||
|
||||
Cc: Matthew Garrett <mjg@redhat.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1318848017-12301-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
include/linux/efi.h | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index e46d771..d407c88 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -472,6 +472,13 @@ extern int __init efi_setup_pcdp_console(char *);
|
||||
#define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004
|
||||
|
||||
/*
|
||||
+ * The type of search to perform when calling boottime->locate_handle
|
||||
+ */
|
||||
+#define EFI_LOCATE_ALL_HANDLES 0
|
||||
+#define EFI_LOCATE_BY_REGISTER_NOTIFY 1
|
||||
+#define EFI_LOCATE_BY_PROTOCOL 2
|
||||
+
|
||||
+/*
|
||||
* EFI Device Path information
|
||||
*/
|
||||
#define EFI_DEV_HW 0x01
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Thu, 11 Aug 2011 10:28:06 +0100
|
||||
Subject: [PATCH 08/11] efi: Add EFI file I/O data types
|
||||
|
||||
commit 55839d515495e766605d7aaabd9c2758370a8d27 upstream.
|
||||
|
||||
The x86 EFI stub needs to access files, for example when loading
|
||||
initrd's. Add the required data types.
|
||||
|
||||
Cc: Matthew Garrett <mjg@redhat.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1318848017-12301-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
include/linux/efi.h | 40 ++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 40 insertions(+)
|
||||
|
||||
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||
index d407c88..37c3007 100644
|
||||
--- a/include/linux/efi.h
|
||||
+++ b/include/linux/efi.h
|
||||
@@ -307,6 +307,12 @@ typedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **capsules,
|
||||
#define EFI_PCI_IO_PROTOCOL_GUID \
|
||||
EFI_GUID( 0x4cf5b200, 0x68b8, 0x4ca5, 0x9e, 0xec, 0xb2, 0x3e, 0x3f, 0x50, 0x2, 0x9a )
|
||||
|
||||
+#define EFI_FILE_INFO_ID \
|
||||
+ EFI_GUID( 0x9576e92, 0x6d3f, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
|
||||
+
|
||||
+#define EFI_FILE_SYSTEM_GUID \
|
||||
+ EFI_GUID( 0x964e5b22, 0x6459, 0x11d2, 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b )
|
||||
+
|
||||
typedef struct {
|
||||
efi_guid_t guid;
|
||||
unsigned long table;
|
||||
@@ -362,6 +368,40 @@ typedef struct {
|
||||
unsigned long unload;
|
||||
} efi_loaded_image_t;
|
||||
|
||||
+typedef struct {
|
||||
+ u64 revision;
|
||||
+ void *open_volume;
|
||||
+} efi_file_io_interface_t;
|
||||
+
|
||||
+typedef struct {
|
||||
+ u64 size;
|
||||
+ u64 file_size;
|
||||
+ u64 phys_size;
|
||||
+ efi_time_t create_time;
|
||||
+ efi_time_t last_access_time;
|
||||
+ efi_time_t modification_time;
|
||||
+ __aligned_u64 attribute;
|
||||
+ efi_char16_t filename[1];
|
||||
+} efi_file_info_t;
|
||||
+
|
||||
+typedef struct {
|
||||
+ u64 revision;
|
||||
+ void *open;
|
||||
+ void *close;
|
||||
+ void *delete;
|
||||
+ void *read;
|
||||
+ void *write;
|
||||
+ void *get_position;
|
||||
+ void *set_position;
|
||||
+ void *get_info;
|
||||
+ void *set_info;
|
||||
+ void *flush;
|
||||
+} efi_file_handle_t;
|
||||
+
|
||||
+#define EFI_FILE_MODE_READ 0x0000000000000001
|
||||
+#define EFI_FILE_MODE_WRITE 0x0000000000000002
|
||||
+#define EFI_FILE_MODE_CREATE 0x8000000000000000
|
||||
+
|
||||
#define EFI_INVALID_TABLE_ADDR (~0UL)
|
||||
|
||||
/*
|
||||
--
|
||||
1.7.10
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -1,72 +0,0 @@
|
|||
From: Maarten Lankhorst <m.b.lankhorst@gmail.com>
|
||||
Date: Fri, 16 Dec 2011 13:30:58 +0100
|
||||
Subject: [PATCH 10/11] x86, efi: Break up large initrd reads
|
||||
|
||||
commit 2d2da60fb40a80cc59383121ccf763e0e0e8a42a upstream.
|
||||
|
||||
The efi boot stub tries to read the entire initrd in 1 go, however
|
||||
some efi implementations hang if too much if asked to read too much
|
||||
data at the same time. After some experimentation I found out that my
|
||||
asrock p67 board will hang if asked to read chunks of 4MiB, so use a
|
||||
safe value.
|
||||
|
||||
elilo reads in chunks of 16KiB, but since that requires many read
|
||||
calls I use a value of 1 MiB. hpa suggested adding individual
|
||||
blacklists for when systems are found where this value causes a crash.
|
||||
|
||||
Signed-off-by: Maarten Lankhorst <m.b.lankhorst@gmail.com>
|
||||
Link: http://lkml.kernel.org/r/4EEB3A02.3090201@gmail.com
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
arch/x86/boot/compressed/eboot.c | 20 ++++++++++++++------
|
||||
arch/x86/boot/compressed/eboot.h | 1 +
|
||||
2 files changed, 15 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
|
||||
index 4055e63..fec216f 100644
|
||||
--- a/arch/x86/boot/compressed/eboot.c
|
||||
+++ b/arch/x86/boot/compressed/eboot.c
|
||||
@@ -643,14 +643,22 @@ grow:
|
||||
u64 size;
|
||||
|
||||
size = initrds[j].size;
|
||||
- status = efi_call_phys3(fh->read, initrds[j].handle,
|
||||
- &size, addr);
|
||||
- if (status != EFI_SUCCESS)
|
||||
- goto free_initrd_total;
|
||||
+ while (size) {
|
||||
+ u64 chunksize;
|
||||
+ if (size > EFI_READ_CHUNK_SIZE)
|
||||
+ chunksize = EFI_READ_CHUNK_SIZE;
|
||||
+ else
|
||||
+ chunksize = size;
|
||||
+ status = efi_call_phys3(fh->read,
|
||||
+ initrds[j].handle,
|
||||
+ &chunksize, addr);
|
||||
+ if (status != EFI_SUCCESS)
|
||||
+ goto free_initrd_total;
|
||||
+ addr += chunksize;
|
||||
+ size -= chunksize;
|
||||
+ }
|
||||
|
||||
efi_call_phys1(fh->close, initrds[j].handle);
|
||||
-
|
||||
- addr += size;
|
||||
}
|
||||
|
||||
}
|
||||
diff --git a/arch/x86/boot/compressed/eboot.h b/arch/x86/boot/compressed/eboot.h
|
||||
index f66d023..3925166 100644
|
||||
--- a/arch/x86/boot/compressed/eboot.h
|
||||
+++ b/arch/x86/boot/compressed/eboot.h
|
||||
@@ -12,6 +12,7 @@
|
||||
#define DESC_TYPE_CODE_DATA (1 << 0)
|
||||
|
||||
#define EFI_PAGE_SIZE (1UL << EFI_PAGE_SHIFT)
|
||||
+#define EFI_READ_CHUNK_SIZE (1024 * 1024)
|
||||
|
||||
#define PIXEL_RGB_RESERVED_8BIT_PER_COLOR 0
|
||||
#define PIXEL_BGR_RESERVED_8BIT_PER_COLOR 1
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Mon, 5 Mar 2012 21:06:14 +0300
|
||||
Subject: [PATCH 11/11] x86, efi: Fix pointer math issue in handle_ramdisks()
|
||||
|
||||
commit c7b738351ba92f48b943ac59aff6b5b0f17f37c9 upstream.
|
||||
|
||||
"filename" is a efi_char16_t string so this check for reaching the end
|
||||
of the array doesn't work. We need to cast the pointer to (u8 *) before
|
||||
doing the math.
|
||||
|
||||
This patch changes the "filename" to "filename_16" to avoid confusion in
|
||||
the future.
|
||||
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Link: http://lkml.kernel.org/r/20120305180614.GA26880@elgon.mountain
|
||||
Acked-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
arch/x86/boot/compressed/eboot.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
|
||||
index fec216f..0cdfc0d 100644
|
||||
--- a/arch/x86/boot/compressed/eboot.c
|
||||
+++ b/arch/x86/boot/compressed/eboot.c
|
||||
@@ -539,7 +539,7 @@ static efi_status_t handle_ramdisks(efi_loaded_image_t *image,
|
||||
struct initrd *initrd;
|
||||
efi_file_handle_t *h;
|
||||
efi_file_info_t *info;
|
||||
- efi_char16_t filename[256];
|
||||
+ efi_char16_t filename_16[256];
|
||||
unsigned long info_sz;
|
||||
efi_guid_t info_guid = EFI_FILE_INFO_ID;
|
||||
efi_char16_t *p;
|
||||
@@ -552,14 +552,14 @@ static efi_status_t handle_ramdisks(efi_loaded_image_t *image,
|
||||
str += 7;
|
||||
|
||||
initrd = &initrds[i];
|
||||
- p = filename;
|
||||
+ p = filename_16;
|
||||
|
||||
/* Skip any leading slashes */
|
||||
while (*str == '/' || *str == '\\')
|
||||
str++;
|
||||
|
||||
while (*str && *str != ' ' && *str != '\n') {
|
||||
- if (p >= filename + sizeof(filename))
|
||||
+ if ((u8 *)p >= (u8 *)filename_16 + sizeof(filename_16))
|
||||
break;
|
||||
|
||||
*p++ = *str++;
|
||||
@@ -583,7 +583,7 @@ static efi_status_t handle_ramdisks(efi_loaded_image_t *image,
|
||||
goto free_initrds;
|
||||
}
|
||||
|
||||
- status = efi_call_phys5(fh->open, fh, &h, filename,
|
||||
+ status = efi_call_phys5(fh->open, fh, &h, filename_16,
|
||||
EFI_FILE_MODE_READ, (u64)0);
|
||||
if (status != EFI_SUCCESS)
|
||||
goto close_handles;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,179 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 28 Feb 2012 13:37:20 +0000
|
||||
Subject: [PATCH 12/17] tools/include: Add byteshift headers for endian access
|
||||
|
||||
commit a07f7672d7cf0ff0d6e548a9feb6e0bd016d9c6c upstream.
|
||||
|
||||
There are various hostprogs in the kernel that are rolling their own
|
||||
implementations of {get,put}_unaligned_le*(). Copy the byteshift
|
||||
headers from include/linux/unaligned so that they can all use a single
|
||||
implementation.
|
||||
|
||||
This requires changing some of the data types to the userspace
|
||||
exported ones (u32 -> __u32, etc).
|
||||
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1330436245-24875-2-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
|
||||
---
|
||||
tools/include/tools/be_byteshift.h | 70 ++++++++++++++++++++++++++++++++++++
|
||||
tools/include/tools/le_byteshift.h | 70 ++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 140 insertions(+)
|
||||
create mode 100644 tools/include/tools/be_byteshift.h
|
||||
create mode 100644 tools/include/tools/le_byteshift.h
|
||||
|
||||
diff --git a/tools/include/tools/be_byteshift.h b/tools/include/tools/be_byteshift.h
|
||||
new file mode 100644
|
||||
index 0000000..f4912e2
|
||||
--- /dev/null
|
||||
+++ b/tools/include/tools/be_byteshift.h
|
||||
@@ -0,0 +1,70 @@
|
||||
+#ifndef _TOOLS_BE_BYTESHIFT_H
|
||||
+#define _TOOLS_BE_BYTESHIFT_H
|
||||
+
|
||||
+#include <linux/types.h>
|
||||
+
|
||||
+static inline __u16 __get_unaligned_be16(const __u8 *p)
|
||||
+{
|
||||
+ return p[0] << 8 | p[1];
|
||||
+}
|
||||
+
|
||||
+static inline __u32 __get_unaligned_be32(const __u8 *p)
|
||||
+{
|
||||
+ return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
|
||||
+}
|
||||
+
|
||||
+static inline __u64 __get_unaligned_be64(const __u8 *p)
|
||||
+{
|
||||
+ return (__u64)__get_unaligned_be32(p) << 32 |
|
||||
+ __get_unaligned_be32(p + 4);
|
||||
+}
|
||||
+
|
||||
+static inline void __put_unaligned_be16(__u16 val, __u8 *p)
|
||||
+{
|
||||
+ *p++ = val >> 8;
|
||||
+ *p++ = val;
|
||||
+}
|
||||
+
|
||||
+static inline void __put_unaligned_be32(__u32 val, __u8 *p)
|
||||
+{
|
||||
+ __put_unaligned_be16(val >> 16, p);
|
||||
+ __put_unaligned_be16(val, p + 2);
|
||||
+}
|
||||
+
|
||||
+static inline void __put_unaligned_be64(__u64 val, __u8 *p)
|
||||
+{
|
||||
+ __put_unaligned_be32(val >> 32, p);
|
||||
+ __put_unaligned_be32(val, p + 4);
|
||||
+}
|
||||
+
|
||||
+static inline __u16 get_unaligned_be16(const void *p)
|
||||
+{
|
||||
+ return __get_unaligned_be16((const __u8 *)p);
|
||||
+}
|
||||
+
|
||||
+static inline __u32 get_unaligned_be32(const void *p)
|
||||
+{
|
||||
+ return __get_unaligned_be32((const __u8 *)p);
|
||||
+}
|
||||
+
|
||||
+static inline __u64 get_unaligned_be64(const void *p)
|
||||
+{
|
||||
+ return __get_unaligned_be64((const __u8 *)p);
|
||||
+}
|
||||
+
|
||||
+static inline void put_unaligned_be16(__u16 val, void *p)
|
||||
+{
|
||||
+ __put_unaligned_be16(val, p);
|
||||
+}
|
||||
+
|
||||
+static inline void put_unaligned_be32(__u32 val, void *p)
|
||||
+{
|
||||
+ __put_unaligned_be32(val, p);
|
||||
+}
|
||||
+
|
||||
+static inline void put_unaligned_be64(__u64 val, void *p)
|
||||
+{
|
||||
+ __put_unaligned_be64(val, p);
|
||||
+}
|
||||
+
|
||||
+#endif /* _TOOLS_BE_BYTESHIFT_H */
|
||||
diff --git a/tools/include/tools/le_byteshift.h b/tools/include/tools/le_byteshift.h
|
||||
new file mode 100644
|
||||
index 0000000..c99d45a
|
||||
--- /dev/null
|
||||
+++ b/tools/include/tools/le_byteshift.h
|
||||
@@ -0,0 +1,70 @@
|
||||
+#ifndef _TOOLS_LE_BYTESHIFT_H
|
||||
+#define _TOOLS_LE_BYTESHIFT_H
|
||||
+
|
||||
+#include <linux/types.h>
|
||||
+
|
||||
+static inline __u16 __get_unaligned_le16(const __u8 *p)
|
||||
+{
|
||||
+ return p[0] | p[1] << 8;
|
||||
+}
|
||||
+
|
||||
+static inline __u32 __get_unaligned_le32(const __u8 *p)
|
||||
+{
|
||||
+ return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
|
||||
+}
|
||||
+
|
||||
+static inline __u64 __get_unaligned_le64(const __u8 *p)
|
||||
+{
|
||||
+ return (__u64)__get_unaligned_le32(p + 4) << 32 |
|
||||
+ __get_unaligned_le32(p);
|
||||
+}
|
||||
+
|
||||
+static inline void __put_unaligned_le16(__u16 val, __u8 *p)
|
||||
+{
|
||||
+ *p++ = val;
|
||||
+ *p++ = val >> 8;
|
||||
+}
|
||||
+
|
||||
+static inline void __put_unaligned_le32(__u32 val, __u8 *p)
|
||||
+{
|
||||
+ __put_unaligned_le16(val >> 16, p + 2);
|
||||
+ __put_unaligned_le16(val, p);
|
||||
+}
|
||||
+
|
||||
+static inline void __put_unaligned_le64(__u64 val, __u8 *p)
|
||||
+{
|
||||
+ __put_unaligned_le32(val >> 32, p + 4);
|
||||
+ __put_unaligned_le32(val, p);
|
||||
+}
|
||||
+
|
||||
+static inline __u16 get_unaligned_le16(const void *p)
|
||||
+{
|
||||
+ return __get_unaligned_le16((const __u8 *)p);
|
||||
+}
|
||||
+
|
||||
+static inline __u32 get_unaligned_le32(const void *p)
|
||||
+{
|
||||
+ return __get_unaligned_le32((const __u8 *)p);
|
||||
+}
|
||||
+
|
||||
+static inline __u64 get_unaligned_le64(const void *p)
|
||||
+{
|
||||
+ return __get_unaligned_le64((const __u8 *)p);
|
||||
+}
|
||||
+
|
||||
+static inline void put_unaligned_le16(__u16 val, void *p)
|
||||
+{
|
||||
+ __put_unaligned_le16(val, p);
|
||||
+}
|
||||
+
|
||||
+static inline void put_unaligned_le32(__u32 val, void *p)
|
||||
+{
|
||||
+ __put_unaligned_le32(val, p);
|
||||
+}
|
||||
+
|
||||
+static inline void put_unaligned_le64(__u64 val, void *p)
|
||||
+{
|
||||
+ __put_unaligned_le64(val, p);
|
||||
+}
|
||||
+
|
||||
+#endif /* _TOOLS_LE_BYTESHIFT_H */
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 28 Feb 2012 13:37:22 +0000
|
||||
Subject: [PATCH 13/17] x86, mkpiggy: Don't open code put_unaligned_le32()
|
||||
|
||||
commit 12871c568305a0b20f116315479a18cd46882e9b upstream.
|
||||
|
||||
Use the new headers in tools/include instead of rolling our own
|
||||
put_unaligned_le32() implementation.
|
||||
|
||||
Cc: H. Peter Anvin <hpa@zytor.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1330436245-24875-4-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
|
||||
---
|
||||
arch/x86/boot/compressed/Makefile | 1 +
|
||||
arch/x86/boot/compressed/mkpiggy.c | 11 ++---------
|
||||
2 files changed, 3 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
|
||||
index b123b9a..fd55a2f 100644
|
||||
--- a/arch/x86/boot/compressed/Makefile
|
||||
+++ b/arch/x86/boot/compressed/Makefile
|
||||
@@ -22,6 +22,7 @@ LDFLAGS := -m elf_$(UTS_MACHINE)
|
||||
LDFLAGS_vmlinux := -T
|
||||
|
||||
hostprogs-y := mkpiggy
|
||||
+HOST_EXTRACFLAGS += -I$(srctree)/tools/include
|
||||
|
||||
VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
|
||||
$(obj)/string.o $(obj)/cmdline.o $(obj)/early_serial_console.o \
|
||||
diff --git a/arch/x86/boot/compressed/mkpiggy.c b/arch/x86/boot/compressed/mkpiggy.c
|
||||
index 46a8238..958a641 100644
|
||||
--- a/arch/x86/boot/compressed/mkpiggy.c
|
||||
+++ b/arch/x86/boot/compressed/mkpiggy.c
|
||||
@@ -29,14 +29,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
-
|
||||
-static uint32_t getle32(const void *p)
|
||||
-{
|
||||
- const uint8_t *cp = p;
|
||||
-
|
||||
- return (uint32_t)cp[0] + ((uint32_t)cp[1] << 8) +
|
||||
- ((uint32_t)cp[2] << 16) + ((uint32_t)cp[3] << 24);
|
||||
-}
|
||||
+#include <tools/le_byteshift.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
@@ -69,7 +62,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
ilen = ftell(f);
|
||||
- olen = getle32(&olen);
|
||||
+ olen = get_unaligned_le32(&olen);
|
||||
fclose(f);
|
||||
|
||||
/*
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 28 Feb 2012 13:37:23 +0000
|
||||
Subject: [PATCH 14/17] x86, boot: Restrict CFLAGS for hostprogs
|
||||
|
||||
commit d40f833630a1299fd377408dc8d8fac370d621b0 upstream.
|
||||
|
||||
Currently tools/build has access to all the kernel headers in
|
||||
$(srctree). This is unnecessary and could potentially allow
|
||||
tools/build to erroneously include kernel headers when it should only
|
||||
be including userspace-exported headers.
|
||||
|
||||
Unfortunately, mkcpustr still needs access to some of the asm kernel
|
||||
headers, so explicitly special case that hostprog.
|
||||
|
||||
Cc: H. Peter Anvin <hpa@zytor.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1330436245-24875-5-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
|
||||
---
|
||||
arch/x86/boot/Makefile | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
|
||||
index 95365a8..3e02148 100644
|
||||
--- a/arch/x86/boot/Makefile
|
||||
+++ b/arch/x86/boot/Makefile
|
||||
@@ -37,8 +37,9 @@ setup-y += video-bios.o
|
||||
targets += $(setup-y)
|
||||
hostprogs-y := mkcpustr tools/build
|
||||
|
||||
-HOST_EXTRACFLAGS += $(LINUXINCLUDE)
|
||||
-
|
||||
+HOSTCFLAGS_mkcpustr.o := -I$(srctree)/arch/$(SRCARCH)/include
|
||||
+HOST_EXTRACFLAGS += -I$(objtree)/include -I$(srctree)/tools/include \
|
||||
+ -include $(srctree)/include/linux/kconfig.h
|
||||
$(obj)/cpu.o: $(obj)/cpustr.h
|
||||
|
||||
quiet_cmd_cpustr = CPUSTR $@
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Tue, 28 Feb 2012 13:37:24 +0000
|
||||
Subject: [PATCH 15/17] x86, efi: Fix endian issues and unaligned accesses
|
||||
|
||||
commit 92f42c50f227ad228f815a8f4eec872524dae3a5 upstream.
|
||||
|
||||
We may need to convert the endianness of the data we read from/write
|
||||
to 'buf', so let's use {get,put}_unaligned_le32() to do that. Failure
|
||||
to do so can result in accessing invalid memory, leading to a
|
||||
segfault. Stephen Rothwell noticed this bug while cross-building an
|
||||
x86_64 allmodconfig kernel on PowerPC.
|
||||
|
||||
We need to read from and write to 'buf' a byte at a time otherwise
|
||||
it's possible we'll perform an unaligned access, which can lead to bus
|
||||
errors when cross-building an x86 kernel on risc architectures.
|
||||
|
||||
Cc: H. Peter Anvin <hpa@zytor.com>
|
||||
Cc: Nick Bowler <nbowler@elliptictech.com>
|
||||
Tested-by: Stephen Rothwell <sfr@canb.auug.org.au>
|
||||
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1330436245-24875-6-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
|
||||
---
|
||||
arch/x86/boot/tools/build.c | 31 +++++++++++++++----------------
|
||||
1 file changed, 15 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c
|
||||
index 4e9bd6b..f2ac95e 100644
|
||||
--- a/arch/x86/boot/tools/build.c
|
||||
+++ b/arch/x86/boot/tools/build.c
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <asm/boot.h>
|
||||
+#include <tools/le_byteshift.h>
|
||||
|
||||
typedef unsigned char u8;
|
||||
typedef unsigned short u16;
|
||||
@@ -41,6 +42,7 @@ typedef unsigned long u32;
|
||||
|
||||
#define DEFAULT_MAJOR_ROOT 0
|
||||
#define DEFAULT_MINOR_ROOT 0
|
||||
+#define DEFAULT_ROOT_DEV (DEFAULT_MAJOR_ROOT << 8 | DEFAULT_MINOR_ROOT)
|
||||
|
||||
/* Minimal number of setup sectors */
|
||||
#define SETUP_SECT_MIN 5
|
||||
@@ -159,7 +161,7 @@ int main(int argc, char ** argv)
|
||||
die("read-error on `setup'");
|
||||
if (c < 1024)
|
||||
die("The setup must be at least 1024 bytes");
|
||||
- if (buf[510] != 0x55 || buf[511] != 0xaa)
|
||||
+ if (get_unaligned_le16(&buf[510]) != 0xAA55)
|
||||
die("Boot block hasn't got boot flag (0xAA55)");
|
||||
fclose(file);
|
||||
|
||||
@@ -171,8 +173,7 @@ int main(int argc, char ** argv)
|
||||
memset(buf+c, 0, i-c);
|
||||
|
||||
/* Set the default root device */
|
||||
- buf[508] = DEFAULT_MINOR_ROOT;
|
||||
- buf[509] = DEFAULT_MAJOR_ROOT;
|
||||
+ put_unaligned_le16(DEFAULT_ROOT_DEV, &buf[508]);
|
||||
|
||||
fprintf(stderr, "Setup is %d bytes (padded to %d bytes).\n", c, i);
|
||||
|
||||
@@ -192,44 +193,42 @@ int main(int argc, char ** argv)
|
||||
|
||||
/* Patch the setup code with the appropriate size parameters */
|
||||
buf[0x1f1] = setup_sectors-1;
|
||||
- buf[0x1f4] = sys_size;
|
||||
- buf[0x1f5] = sys_size >> 8;
|
||||
- buf[0x1f6] = sys_size >> 16;
|
||||
- buf[0x1f7] = sys_size >> 24;
|
||||
+ put_unaligned_le32(sys_size, &buf[0x1f4]);
|
||||
|
||||
#ifdef CONFIG_EFI_STUB
|
||||
file_sz = sz + i + ((sys_size * 16) - sz);
|
||||
|
||||
- pe_header = *(unsigned int *)&buf[0x3c];
|
||||
+ pe_header = get_unaligned_le32(&buf[0x3c]);
|
||||
|
||||
/* Size of code */
|
||||
- *(unsigned int *)&buf[pe_header + 0x1c] = file_sz;
|
||||
+ put_unaligned_le32(file_sz, &buf[pe_header + 0x1c]);
|
||||
|
||||
/* Size of image */
|
||||
- *(unsigned int *)&buf[pe_header + 0x50] = file_sz;
|
||||
+ put_unaligned_le32(file_sz, &buf[pe_header + 0x50]);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/* Address of entry point */
|
||||
- *(unsigned int *)&buf[pe_header + 0x28] = i;
|
||||
+ put_unaligned_le32(i, &buf[pe_header + 0x28]);
|
||||
|
||||
/* .text size */
|
||||
- *(unsigned int *)&buf[pe_header + 0xb0] = file_sz;
|
||||
+ put_unaligned_le32(file_sz, &buf[pe_header + 0xb0]);
|
||||
|
||||
/* .text size of initialised data */
|
||||
- *(unsigned int *)&buf[pe_header + 0xb8] = file_sz;
|
||||
+ put_unaligned_le32(file_sz, &buf[pe_header + 0xb8]);
|
||||
#else
|
||||
/*
|
||||
* Address of entry point. startup_32 is at the beginning and
|
||||
* the 64-bit entry point (startup_64) is always 512 bytes
|
||||
* after.
|
||||
*/
|
||||
- *(unsigned int *)&buf[pe_header + 0x28] = i + 512;
|
||||
+ put_unaligned_le32(i + 512, &buf[pe_header + 0x28]);
|
||||
|
||||
/* .text size */
|
||||
- *(unsigned int *)&buf[pe_header + 0xc0] = file_sz;
|
||||
+ put_unaligned_le32(file_sz, &buf[pe_header + 0xc0]);
|
||||
|
||||
/* .text size of initialised data */
|
||||
- *(unsigned int *)&buf[pe_header + 0xc8] = file_sz;
|
||||
+ put_unaligned_le32(file_sz, &buf[pe_header + 0xc8]);
|
||||
+
|
||||
#endif /* CONFIG_X86_32 */
|
||||
#endif /* CONFIG_EFI_STUB */
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
From: "H. Peter Anvin" <hpa@zytor.com>
|
||||
Date: Thu, 22 Mar 2012 11:08:18 -0700
|
||||
Subject: [PATCH 16/17] x86, boot: Correct CFLAGS for hostprogs
|
||||
|
||||
commit 446e1c86d51d0823e003a43a2b85c430efce2733 upstream.
|
||||
|
||||
This is a partial revert of commit:
|
||||
d40f833 "Restrict CFLAGS for hostprogs"
|
||||
|
||||
The endian-manipulation macros in tools/include need <linux/types.h>,
|
||||
but the hostprogs in arch/x86/boot need several headers from the
|
||||
kernel build tree, which means we have to add the kernel headers to
|
||||
the include path. This picks up <linux/types.h> from the kernel tree,
|
||||
which gives a warning.
|
||||
|
||||
Since this use of <linux/types.h> is intentional, add
|
||||
-D__EXPORTED_HEADERS__ to the command line to silence the warning.
|
||||
|
||||
A better way to fix this would be to always install the exported
|
||||
kernel headers into $(objtree)/usr/include as a standard part of the
|
||||
kernel build, but that is a lot more involved.
|
||||
|
||||
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Acked-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1330436245-24875-5-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
|
||||
---
|
||||
arch/x86/boot/Makefile | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile
|
||||
index 3e02148..5a747dd 100644
|
||||
--- a/arch/x86/boot/Makefile
|
||||
+++ b/arch/x86/boot/Makefile
|
||||
@@ -37,9 +37,9 @@ setup-y += video-bios.o
|
||||
targets += $(setup-y)
|
||||
hostprogs-y := mkcpustr tools/build
|
||||
|
||||
-HOSTCFLAGS_mkcpustr.o := -I$(srctree)/arch/$(SRCARCH)/include
|
||||
-HOST_EXTRACFLAGS += -I$(objtree)/include -I$(srctree)/tools/include \
|
||||
- -include $(srctree)/include/linux/kconfig.h
|
||||
+HOST_EXTRACFLAGS += -I$(srctree)/tools/include $(LINUXINCLUDE) \
|
||||
+ -D__EXPORTED_HEADERS__
|
||||
+
|
||||
$(obj)/cpu.o: $(obj)/cpustr.h
|
||||
|
||||
quiet_cmd_cpustr = CPUSTR $@
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,143 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Sun, 15 Apr 2012 16:06:04 +0100
|
||||
Subject: [PATCH 17/17] x86, efi: Add dedicated EFI stub entry point
|
||||
|
||||
commit b1994304fc399f5d3a5368c81111d713490c4799 upstream.
|
||||
|
||||
The method used to work out whether we were booted by EFI firmware or
|
||||
via a boot loader is broken. Because efi_main() is always executed
|
||||
when booting from a boot loader we will dereference invalid pointers
|
||||
either on the stack (CONFIG_X86_32) or contained in %rdx
|
||||
(CONFIG_X86_64) when searching for an EFI System Table signature.
|
||||
|
||||
Instead of dereferencing these invalid system table pointers, add a
|
||||
new entry point that is only used when booting from EFI firmware, when
|
||||
we know the pointer arguments will be valid. With this change legacy
|
||||
boot loaders will no longer execute efi_main(), but will instead skip
|
||||
EFI stub initialisation completely.
|
||||
|
||||
[ hpa: Marking this for urgent/stable since it is a regression when
|
||||
the option is enabled; without the option the patch has no effect ]
|
||||
|
||||
Signed-off-by: Matt Fleming <matt.hfleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1334584744.26997.14.camel@mfleming-mobl1.ger.corp.intel.com
|
||||
Reported-by: Jordan Justen <jordan.l.justen@intel.com>
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
Cc: <stable@vger.kernel.org> v3.3
|
||||
---
|
||||
arch/x86/boot/compressed/head_32.S | 14 +++++++++++---
|
||||
arch/x86/boot/compressed/head_64.S | 22 ++++++++++++++++------
|
||||
arch/x86/boot/tools/build.c | 15 +++++++++++----
|
||||
3 files changed, 38 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
|
||||
index a055993..c85e3ac 100644
|
||||
--- a/arch/x86/boot/compressed/head_32.S
|
||||
+++ b/arch/x86/boot/compressed/head_32.S
|
||||
@@ -33,6 +33,9 @@
|
||||
__HEAD
|
||||
ENTRY(startup_32)
|
||||
#ifdef CONFIG_EFI_STUB
|
||||
+ jmp preferred_addr
|
||||
+
|
||||
+ .balign 0x10
|
||||
/*
|
||||
* We don't need the return address, so set up the stack so
|
||||
* efi_main() can find its arugments.
|
||||
@@ -41,12 +44,17 @@ ENTRY(startup_32)
|
||||
|
||||
call efi_main
|
||||
cmpl $0, %eax
|
||||
- je preferred_addr
|
||||
movl %eax, %esi
|
||||
- call 1f
|
||||
+ jne 2f
|
||||
1:
|
||||
+ /* EFI init failed, so hang. */
|
||||
+ hlt
|
||||
+ jmp 1b
|
||||
+2:
|
||||
+ call 3f
|
||||
+3:
|
||||
popl %eax
|
||||
- subl $1b, %eax
|
||||
+ subl $3b, %eax
|
||||
subl BP_pref_address(%esi), %eax
|
||||
add BP_code32_start(%esi), %eax
|
||||
leal preferred_addr(%eax), %eax
|
||||
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
|
||||
index 558d76c..87e03a1 100644
|
||||
--- a/arch/x86/boot/compressed/head_64.S
|
||||
+++ b/arch/x86/boot/compressed/head_64.S
|
||||
@@ -200,18 +200,28 @@ ENTRY(startup_64)
|
||||
* entire text+data+bss and hopefully all of memory.
|
||||
*/
|
||||
#ifdef CONFIG_EFI_STUB
|
||||
- pushq %rsi
|
||||
+ /*
|
||||
+ * The entry point for the PE/COFF executable is 0x210, so only
|
||||
+ * legacy boot loaders will execute this jmp.
|
||||
+ */
|
||||
+ jmp preferred_addr
|
||||
+
|
||||
+ .org 0x210
|
||||
mov %rcx, %rdi
|
||||
mov %rdx, %rsi
|
||||
call efi_main
|
||||
- popq %rsi
|
||||
- cmpq $0,%rax
|
||||
- je preferred_addr
|
||||
movq %rax,%rsi
|
||||
- call 1f
|
||||
+ cmpq $0,%rax
|
||||
+ jne 2f
|
||||
1:
|
||||
+ /* EFI init failed, so hang. */
|
||||
+ hlt
|
||||
+ jmp 1b
|
||||
+2:
|
||||
+ call 3f
|
||||
+3:
|
||||
popq %rax
|
||||
- subq $1b, %rax
|
||||
+ subq $3b, %rax
|
||||
subq BP_pref_address(%rsi), %rax
|
||||
add BP_code32_start(%esi), %eax
|
||||
leaq preferred_addr(%rax), %rax
|
||||
diff --git a/arch/x86/boot/tools/build.c b/arch/x86/boot/tools/build.c
|
||||
index ed54976..24443a3 100644
|
||||
--- a/arch/x86/boot/tools/build.c
|
||||
+++ b/arch/x86/boot/tools/build.c
|
||||
@@ -205,8 +205,13 @@ int main(int argc, char ** argv)
|
||||
put_unaligned_le32(file_sz, &buf[pe_header + 0x50]);
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
- /* Address of entry point */
|
||||
- put_unaligned_le32(i, &buf[pe_header + 0x28]);
|
||||
+ /*
|
||||
+ * Address of entry point.
|
||||
+ *
|
||||
+ * The EFI stub entry point is +16 bytes from the start of
|
||||
+ * the .text section.
|
||||
+ */
|
||||
+ put_unaligned_le32(i + 16, &buf[pe_header + 0x28]);
|
||||
|
||||
/* .text size */
|
||||
put_unaligned_le32(file_sz, &buf[pe_header + 0xb0]);
|
||||
@@ -217,9 +222,11 @@ int main(int argc, char ** argv)
|
||||
/*
|
||||
* Address of entry point. startup_32 is at the beginning and
|
||||
* the 64-bit entry point (startup_64) is always 512 bytes
|
||||
- * after.
|
||||
+ * after. The EFI stub entry point is 16 bytes after that, as
|
||||
+ * the first instruction allows legacy loaders to jump over
|
||||
+ * the EFI stub initialisation
|
||||
*/
|
||||
- put_unaligned_le32(i + 512, &buf[pe_header + 0x28]);
|
||||
+ put_unaligned_le32(i + 528, &buf[pe_header + 0x28]);
|
||||
|
||||
/* .text size */
|
||||
put_unaligned_le32(file_sz, &buf[pe_header + 0xc0]);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -58,8 +58,6 @@
|
|||
+ bugfix/arm/ARM-Fix-missing-linux-types.h-inclusion-in-asm-hardw.patch
|
||||
+ bugfix/arm/ARM-Fix-missing-include-for-call-to-soft_restart-in-.patch
|
||||
|
||||
+ bugfix/arm/ARM-orion5x-Fix-GPIO-enable-bits-for-MPP9.patch
|
||||
|
||||
# Update all Hyper-V drivers to 3.4-rc1 (no longer staging)
|
||||
+ features/x86/hyperv/0043-drivers-hv-kvp-Add-cleanup-connector-defines.patch
|
||||
+ features/x86/hyperv/0044-drivers-hv-kvp-Move-the-contents-of-hv_kvp.h-to-hype.patch
|
||||
|
@ -95,19 +93,5 @@
|
|||
+ features/x86/hyperv/0076-net-hyperv-Fix-the-code-handling-tx-busy.patch
|
||||
+ features/x86/hyperv/0077-hv-remove-the-second-argument-of-k-un-map_atomic.patch
|
||||
|
||||
+ features/x86/efi-stub/0011-x86-efi-Fix-pointer-math-issue-in-handle_ramdisks.patch
|
||||
+ features/x86/efi-stub/0012-tools-include-Add-byteshift-headers-for-endian-acces.patch
|
||||
+ features/x86/efi-stub/0013-x86-mkpiggy-Don-t-open-code-put_unaligned_le32.patch
|
||||
+ features/x86/efi-stub/0014-x86-boot-Restrict-CFLAGS-for-hostprogs.patch
|
||||
+ features/x86/efi-stub/0015-x86-efi-Fix-endian-issues-and-unaligned-accesses.patch
|
||||
+ features/x86/efi-stub/0016-x86-boot-Correct-CFLAGS-for-hostprogs.patch
|
||||
+ features/x86/efi-stub/0017-x86-efi-Add-dedicated-EFI-stub-entry-point.patch
|
||||
|
||||
+ bugfix/all/brcmsmac-INTERMEDIATE-but-not-AMPDU-only-when-tracin.patch
|
||||
+ bugfix/all/NFSv4-Rate-limit-the-state-manager-for-lock-reclaim-.patch
|
||||
+ bugfix/all/NFSv4-Ensure-that-the-LOCK-code-sets-exception-inode.patch
|
||||
+ bugfix/all/NFSv4-Ensure-that-we-check-lock-exclusive-shared-typ.patch
|
||||
+ bugfix/x86/drm-i915-fix-integer-overflow-in-i915_gem_execbuffer2.patch
|
||||
+ bugfix/x86/drm-i915-fix-integer-overflow-in-i915_gem_do_execbuffer.patch
|
||||
+ bugfix/all/revert-autofs-work-around-unhappy-compat-problem-on-.patch
|
||||
+ bugfix/x86/dell-laptop-terminate-quirks-list-properly.patch
|
||||
|
|
Loading…
Reference in New Issue