Fixup patches
This commit is contained in:
parent
2855840b26
commit
af258da073
@ -1,37 +0,0 @@
|
||||
In the ac.c, lack check return value of power_supply_register().
|
||||
This may casue that acpi driver's add() ops was called successful
|
||||
while the device may be failed to be initalized. For example, some
|
||||
ugly bios may describe two ACADs in the same dsdt. They use the same
|
||||
name which will cause the second ACAD device can no be registered.
|
||||
And then power_supply_register() failed. But acpi driver's add() ops
|
||||
is called sucessfully. The acpi device also will receive acpi notification
|
||||
and cause oops.
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=772730
|
||||
|
||||
Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
|
||||
---
|
||||
drivers/acpi/ac.c | 4 +++-
|
||||
1 files changed, 3 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c
|
||||
index 6512b20..d1fcbc0 100644
|
||||
--- a/drivers/acpi/ac.c
|
||||
+++ b/drivers/acpi/ac.c
|
||||
@@ -292,7 +292,9 @@ static int acpi_ac_add(struct acpi_device *device)
|
||||
ac->charger.properties = ac_props;
|
||||
ac->charger.num_properties = ARRAY_SIZE(ac_props);
|
||||
ac->charger.get_property = get_ac_property;
|
||||
- power_supply_register(&ac->device->dev, &ac->charger);
|
||||
+ result = power_supply_register(&ac->device->dev, &ac->charger);
|
||||
+ if (result)
|
||||
+ goto end;
|
||||
|
||||
printk(KERN_INFO PREFIX "%s [%s] (%s)\n",
|
||||
acpi_device_name(device), acpi_device_bid(device),
|
||||
--
|
||||
1.7.6.rc2.8.g28eb
|
||||
|
||||
--
|
||||
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
|
||||
the body of a message to majordomo@vger.kernel.org
|
||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
@ -1,45 +0,0 @@
|
||||
From bf084d8f6eb4ded3f90a6ab79bb682db00ebfbd4 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Broz <mbroz@redhat.com>
|
||||
Date: Thu, 28 Jun 2012 17:26:02 +0200
|
||||
Subject: [PATCH] crypto: aesni-intel - fix wrong kfree pointer
|
||||
|
||||
kfree(new_key_mem) in rfc4106_set_key() should be called on malloced pointer,
|
||||
not on aligned one, otherwise it can cause invalid pointer on free.
|
||||
|
||||
(Seen at least once when running tcrypt tests with debug kernel.)
|
||||
|
||||
Signed-off-by: Milan Broz <mbroz@redhat.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
arch/x86/crypto/aesni-intel_glue.c | 8 ++++----
|
||||
1 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c
|
||||
index d662615..34fdcff 100644
|
||||
--- a/arch/x86/crypto/aesni-intel_glue.c
|
||||
+++ b/arch/x86/crypto/aesni-intel_glue.c
|
||||
@@ -529,7 +529,7 @@ static int rfc4106_set_key(struct crypto_aead *parent, const u8 *key,
|
||||
struct crypto_aead *cryptd_child = cryptd_aead_child(ctx->cryptd_tfm);
|
||||
struct aesni_rfc4106_gcm_ctx *child_ctx =
|
||||
aesni_rfc4106_gcm_ctx_get(cryptd_child);
|
||||
- u8 *new_key_mem = NULL;
|
||||
+ u8 *new_key_align, *new_key_mem = NULL;
|
||||
|
||||
if (key_len < 4) {
|
||||
crypto_tfm_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
|
||||
@@ -553,9 +553,9 @@ static int rfc4106_set_key(struct crypto_aead *parent, const u8 *key,
|
||||
if (!new_key_mem)
|
||||
return -ENOMEM;
|
||||
|
||||
- new_key_mem = PTR_ALIGN(new_key_mem, AESNI_ALIGN);
|
||||
- memcpy(new_key_mem, key, key_len);
|
||||
- key = new_key_mem;
|
||||
+ new_key_align = PTR_ALIGN(new_key_mem, AESNI_ALIGN);
|
||||
+ memcpy(new_key_align, key, key_len);
|
||||
+ key = new_key_align;
|
||||
}
|
||||
|
||||
if (!irq_fpu_usable())
|
||||
--
|
||||
1.7.6.5
|
||||
|
@ -1,122 +0,0 @@
|
||||
From 6c79294f44fd7d1122cbaabff3b9815b074c0dd0 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Broz <mbroz@redhat.com>
|
||||
Date: Fri, 29 Jun 2012 22:08:09 +0200
|
||||
Subject: [PATCH] crypto: testmgr - allow aesni-intel and ghash_clmulni-intel
|
||||
in fips mode
|
||||
|
||||
Patch 863b557a88f8c033f7419fabafef4712a5055f85 added NULL entries
|
||||
for intel accelerated drivers but did not marked these fips allowed.
|
||||
This cause panic if running tests with fips=1.
|
||||
|
||||
For ghash, fips_allowed flag was added in patch
|
||||
18c0ebd2d8194cce4b3f67e2903fa01bea892cbc.
|
||||
|
||||
Without patch, "modprobe tcrypt" fails with
|
||||
alg: skcipher: Failed to load transform for cbc-aes-aesni: -2
|
||||
cbc-aes-aesni: cbc(aes) alg self test failed in fips mode!
|
||||
(panic)
|
||||
|
||||
Also add missing cryptd(__driver-cbc-aes-aesni) and
|
||||
cryptd(__driver-gcm-aes-aesni) test to complement
|
||||
null tests above, otherwise system complains with
|
||||
alg: No test for __cbc-aes-aesni (cryptd(__driver-cbc-aes-aesni))
|
||||
alg: No test for __gcm-aes-aesni (cryptd(__driver-gcm-aes-aesni))
|
||||
|
||||
Signed-off-by: Milan Broz <mbroz@redhat.com>
|
||||
Signed-off-by: Paul Wouters <pwouters@redhat.com>
|
||||
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
---
|
||||
crypto/testmgr.c | 38 ++++++++++++++++++++++++++++++++++++++
|
||||
1 files changed, 38 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
|
||||
index 36748a5..4308a11 100644
|
||||
--- a/crypto/testmgr.c
|
||||
+++ b/crypto/testmgr.c
|
||||
@@ -1581,6 +1581,7 @@ static const struct alg_test_desc alg_test_descs[] = {
|
||||
}, {
|
||||
.alg = "__driver-cbc-aes-aesni",
|
||||
.test = alg_test_null,
|
||||
+ .fips_allowed = 1,
|
||||
.suite = {
|
||||
.cipher = {
|
||||
.enc = {
|
||||
@@ -1641,6 +1642,7 @@ static const struct alg_test_desc alg_test_descs[] = {
|
||||
}, {
|
||||
.alg = "__driver-ecb-aes-aesni",
|
||||
.test = alg_test_null,
|
||||
+ .fips_allowed = 1,
|
||||
.suite = {
|
||||
.cipher = {
|
||||
.enc = {
|
||||
@@ -1701,6 +1703,7 @@ static const struct alg_test_desc alg_test_descs[] = {
|
||||
}, {
|
||||
.alg = "__ghash-pclmulqdqni",
|
||||
.test = alg_test_null,
|
||||
+ .fips_allowed = 1,
|
||||
.suite = {
|
||||
.hash = {
|
||||
.vecs = NULL,
|
||||
@@ -1866,8 +1869,25 @@ static const struct alg_test_desc alg_test_descs[] = {
|
||||
}
|
||||
}
|
||||
}, {
|
||||
+ .alg = "cryptd(__driver-cbc-aes-aesni)",
|
||||
+ .test = alg_test_null,
|
||||
+ .fips_allowed = 1,
|
||||
+ .suite = {
|
||||
+ .cipher = {
|
||||
+ .enc = {
|
||||
+ .vecs = NULL,
|
||||
+ .count = 0
|
||||
+ },
|
||||
+ .dec = {
|
||||
+ .vecs = NULL,
|
||||
+ .count = 0
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }, {
|
||||
.alg = "cryptd(__driver-ecb-aes-aesni)",
|
||||
.test = alg_test_null,
|
||||
+ .fips_allowed = 1,
|
||||
.suite = {
|
||||
.cipher = {
|
||||
.enc = {
|
||||
@@ -1926,8 +1946,25 @@ static const struct alg_test_desc alg_test_descs[] = {
|
||||
}
|
||||
}
|
||||
}, {
|
||||
+ .alg = "cryptd(__driver-gcm-aes-aesni)",
|
||||
+ .test = alg_test_null,
|
||||
+ .fips_allowed = 1,
|
||||
+ .suite = {
|
||||
+ .cipher = {
|
||||
+ .enc = {
|
||||
+ .vecs = NULL,
|
||||
+ .count = 0
|
||||
+ },
|
||||
+ .dec = {
|
||||
+ .vecs = NULL,
|
||||
+ .count = 0
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }, {
|
||||
.alg = "cryptd(__ghash-pclmulqdqni)",
|
||||
.test = alg_test_null,
|
||||
+ .fips_allowed = 1,
|
||||
.suite = {
|
||||
.hash = {
|
||||
.vecs = NULL,
|
||||
@@ -2043,6 +2080,7 @@ static const struct alg_test_desc alg_test_descs[] = {
|
||||
}, {
|
||||
.alg = "ecb(__aes-aesni)",
|
||||
.test = alg_test_null,
|
||||
+ .fips_allowed = 1,
|
||||
.suite = {
|
||||
.cipher = {
|
||||
.enc = {
|
||||
--
|
||||
1.7.6.5
|
||||
|
19
kernel.spec
19
kernel.spec
@ -62,7 +62,7 @@ Summary: The Linux kernel
|
||||
# For non-released -rc kernels, this will be appended after the rcX and
|
||||
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
||||
#
|
||||
%global baserelease 1
|
||||
%global baserelease 2
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
@ -738,13 +738,6 @@ Patch22000: weird-root-dentry-name-debug.patch
|
||||
#selinux ptrace child permissions
|
||||
Patch22001: selinux-apply-different-permission-to-ptrace-child.patch
|
||||
|
||||
#Fix FIPS for aesni hardare
|
||||
Patch22050: crypto-testmgr-allow-aesni-intel-and-ghash_clmulni-intel.patch
|
||||
Patch22051: crypto-aesni-intel-fix-wrong-kfree-pointer.patch
|
||||
|
||||
#rhbz 772730
|
||||
Patch22058: ACPI-AC-check-the-return-value-of-power_supply_register.patch
|
||||
|
||||
#rhbz 836742
|
||||
Patch22059: uvcvideo-Reset-bytesused-field-when-recycling-erroneous-buffer.patch
|
||||
|
||||
@ -1431,13 +1424,6 @@ ApplyPatch weird-root-dentry-name-debug.patch
|
||||
#selinux ptrace child permissions
|
||||
ApplyPatch selinux-apply-different-permission-to-ptrace-child.patch
|
||||
|
||||
#Fix FIPS for aesni hardare
|
||||
ApplyPatch crypto-testmgr-allow-aesni-intel-and-ghash_clmulni-intel.patch
|
||||
ApplyPatch crypto-aesni-intel-fix-wrong-kfree-pointer.patch
|
||||
|
||||
#rhbz 772730
|
||||
ApplyPatch ACPI-AC-check-the-return-value-of-power_supply_register.patch
|
||||
|
||||
#rhbz 836742
|
||||
ApplyPatch uvcvideo-Reset-bytesused-field-when-recycling-erroneous-buffer.patch
|
||||
|
||||
@ -2298,6 +2284,9 @@ fi
|
||||
# ||----w |
|
||||
# || ||
|
||||
%changelog
|
||||
* Mon Jul 30 2012 Josh Boyer <jwboyer@redhat.com>
|
||||
- Fixup patches
|
||||
|
||||
* Fri Jul 27 2012 Justin M. Forbes <jforbes@redhat.com> - 3.6.0-0.rc0.git3.1
|
||||
- Linux v3.5-6982-gb387e41
|
||||
|
||||
|
@ -1,13 +1,14 @@
|
||||
diff --git a/tools/power/x86/turbostat/Makefile b/tools/power/x86/turbostat/Makefile
|
||||
index fd8e1f1..7af5e8c 100644
|
||||
index f856495..984cc00 100644
|
||||
--- a/tools/power/x86/turbostat/Makefile
|
||||
+++ b/tools/power/x86/turbostat/Makefile
|
||||
@@ -1,8 +1,10 @@
|
||||
@@ -1,3 +1,5 @@
|
||||
+DESTDIR ?=
|
||||
+
|
||||
turbostat : turbostat.c
|
||||
CFLAGS += -Wall
|
||||
|
||||
clean :
|
||||
@@ -5,5 +7,5 @@ clean :
|
||||
rm -f turbostat
|
||||
|
||||
install :
|
||||
|
@ -1,472 +1,3 @@
|
||||
From 56ce13afe1b17cd2817c596b3a9e25e51937a328 Mon Sep 17 00:00:00 2001
|
||||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Thu, 19 Jul 2012 10:23:48 +0100
|
||||
Subject: [PATCH 01/14] x86, efi: Handover Protocol
|
||||
|
||||
As things currently stand, traditional EFI boot loaders and the EFI
|
||||
boot stub are carrying essentially the same initialisation code
|
||||
required to setup an EFI machine for booting a kernel. There's really
|
||||
no need to have this code in two places and the hope is that, with
|
||||
this new protocol, initialisation and booting of the kernel can be
|
||||
left solely to the kernel's EFI boot stub. The responsibilities of the
|
||||
boot loader then become,
|
||||
|
||||
o Loading the kernel image from boot media
|
||||
|
||||
File system code still needs to be carried by boot loaders for the
|
||||
scenario where the kernel and initrd files reside on a file system
|
||||
that the EFI firmware doesn't natively understand, such as ext4, etc.
|
||||
|
||||
o Providing a user interface
|
||||
|
||||
Boot loaders still need to display any menus/interfaces, for example
|
||||
to allow the user to select from a list of kernels.
|
||||
|
||||
Bump the boot protocol number because we added the 'handover_offset'
|
||||
field to indicate the location of the handover protocol entry point.
|
||||
|
||||
Cc: H. Peter Anvin <hpa@zytor.com>
|
||||
Cc: Matthew Garrett <mjg@redhat.com>
|
||||
Cc: Peter Jones <pjones@redhat.com>
|
||||
Cc: Ingo Molnar <mingo@kernel.org>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
---
|
||||
Documentation/x86/boot.txt | 41 ++++++++
|
||||
arch/x86/boot/compressed/eboot.c | 198 ++++++++++++++++++++++---------------
|
||||
arch/x86/boot/compressed/head_32.S | 10 ++
|
||||
arch/x86/boot/compressed/head_64.S | 10 ++
|
||||
arch/x86/boot/header.S | 4 +-
|
||||
arch/x86/include/asm/bootparam.h | 1 +
|
||||
6 files changed, 185 insertions(+), 79 deletions(-)
|
||||
|
||||
diff --git a/Documentation/x86/boot.txt b/Documentation/x86/boot.txt
|
||||
index 7c3a880..c6539a4 100644
|
||||
--- a/Documentation/x86/boot.txt
|
||||
+++ b/Documentation/x86/boot.txt
|
||||
@@ -54,6 +54,9 @@ Protocol 2.10: (Kernel 2.6.31) Added a protocol for relaxed alignment
|
||||
beyond the kernel_alignment added, new init_size and
|
||||
pref_address fields. Added extended boot loader IDs.
|
||||
|
||||
+Protocol 2.11: (Kernel 3.6) Added a field for offset of EFI handover
|
||||
+ protocol entry point.
|
||||
+
|
||||
**** MEMORY LAYOUT
|
||||
|
||||
The traditional memory map for the kernel loader, used for Image or
|
||||
@@ -189,6 +192,7 @@ Offset Proto Name Meaning
|
||||
of struct setup_data
|
||||
0258/8 2.10+ pref_address Preferred loading address
|
||||
0260/4 2.10+ init_size Linear memory required during initialization
|
||||
+0264/4 2.11+ handover_offset Offset of handover entry point
|
||||
|
||||
(1) For backwards compatibility, if the setup_sects field contains 0, the
|
||||
real value is 4.
|
||||
@@ -690,6 +694,16 @@ Offset/size: 0x260/4
|
||||
else
|
||||
runtime_start = pref_address
|
||||
|
||||
+Field name: handover_offset
|
||||
+Type: read
|
||||
+Offset/size: 0x264/4
|
||||
+
|
||||
+ This field is the offset from the beginning of the kernel image to
|
||||
+ the EFI handover protocol entry point. Boot loaders using the EFI
|
||||
+ handover protocol to boot the kernel should jump to this offset.
|
||||
+
|
||||
+ See EFI HANDOVER PROTOCOL below for more details.
|
||||
+
|
||||
|
||||
**** THE IMAGE CHECKSUM
|
||||
|
||||
@@ -1010,3 +1024,30 @@ segment; __BOOS_CS must have execute/read permission, and __BOOT_DS
|
||||
must have read/write permission; CS must be __BOOT_CS and DS, ES, SS
|
||||
must be __BOOT_DS; interrupt must be disabled; %esi must hold the base
|
||||
address of the struct boot_params; %ebp, %edi and %ebx must be zero.
|
||||
+
|
||||
+**** EFI HANDOVER PROTOCOL
|
||||
+
|
||||
+This protocol allows boot loaders to defer initialisation to the EFI
|
||||
+boot stub. The boot loader is required to load the kernel/initrd(s)
|
||||
+from the boot media and jump to the EFI handover protocol entry point
|
||||
+which is hdr->handover_offset bytes from the beginning of
|
||||
+startup_{32,64}.
|
||||
+
|
||||
+The function prototype for the handover entry point looks like this,
|
||||
+
|
||||
+ efi_main(void *handle, efi_system_table_t *table, struct boot_params *bp)
|
||||
+
|
||||
+'handle' is the EFI image handle passed to the boot loader by the EFI
|
||||
+firmware, 'table' is the EFI system table - these are the first two
|
||||
+arguments of the "handoff state" as described in section 2.3 of the
|
||||
+UEFI specification. 'bp' is the boot loader-allocated boot params.
|
||||
+
|
||||
+The boot loader *must* fill out the following fields in bp,
|
||||
+
|
||||
+ o hdr.code32_start
|
||||
+ o hdr.cmd_line_ptr
|
||||
+ o hdr.cmdline_size
|
||||
+ o hdr.ramdisk_image (if applicable)
|
||||
+ o hdr.ramdisk_size (if applicable)
|
||||
+
|
||||
+All other fields should be zero.
|
||||
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
|
||||
index 4e85f5f..b3e0227 100644
|
||||
--- a/arch/x86/boot/compressed/eboot.c
|
||||
+++ b/arch/x86/boot/compressed/eboot.c
|
||||
@@ -729,32 +729,68 @@ fail:
|
||||
* need to create one ourselves (usually the bootloader would create
|
||||
* one for us).
|
||||
*/
|
||||
-static efi_status_t make_boot_params(struct boot_params *boot_params,
|
||||
- efi_loaded_image_t *image,
|
||||
- void *handle)
|
||||
+struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table)
|
||||
{
|
||||
- struct efi_info *efi = &boot_params->efi_info;
|
||||
- struct apm_bios_info *bi = &boot_params->apm_bios_info;
|
||||
- struct sys_desc_table *sdt = &boot_params->sys_desc_table;
|
||||
- struct e820entry *e820_map = &boot_params->e820_map[0];
|
||||
- struct e820entry *prev = NULL;
|
||||
- struct setup_header *hdr = &boot_params->hdr;
|
||||
- unsigned long size, key, desc_size, _size;
|
||||
- efi_memory_desc_t *mem_map;
|
||||
- void *options = image->load_options;
|
||||
- u32 load_options_size = image->load_options_size / 2; /* ASCII */
|
||||
+ struct boot_params *boot_params;
|
||||
+ struct sys_desc_table *sdt;
|
||||
+ struct apm_bios_info *bi;
|
||||
+ struct setup_header *hdr;
|
||||
+ struct efi_info *efi;
|
||||
+ efi_loaded_image_t *image;
|
||||
+ void *options;
|
||||
+ u32 load_options_size;
|
||||
+ efi_guid_t proto = LOADED_IMAGE_PROTOCOL_GUID;
|
||||
int options_size = 0;
|
||||
efi_status_t status;
|
||||
- __u32 desc_version;
|
||||
unsigned long cmdline;
|
||||
- u8 nr_entries;
|
||||
u16 *s2;
|
||||
u8 *s1;
|
||||
int i;
|
||||
|
||||
+ sys_table = _table;
|
||||
+
|
||||
+ /* Check if we were booted by the EFI firmware */
|
||||
+ if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
|
||||
+ return NULL;
|
||||
+
|
||||
+ status = efi_call_phys3(sys_table->boottime->handle_protocol,
|
||||
+ handle, &proto, (void *)&image);
|
||||
+ if (status != EFI_SUCCESS) {
|
||||
+ efi_printk("Failed to get handle for LOADED_IMAGE_PROTOCOL\n");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ status = low_alloc(0x4000, 1, (unsigned long *)&boot_params);
|
||||
+ if (status != EFI_SUCCESS) {
|
||||
+ efi_printk("Failed to alloc lowmem for boot params\n");
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ memset(boot_params, 0x0, 0x4000);
|
||||
+
|
||||
+ hdr = &boot_params->hdr;
|
||||
+ efi = &boot_params->efi_info;
|
||||
+ bi = &boot_params->apm_bios_info;
|
||||
+ sdt = &boot_params->sys_desc_table;
|
||||
+
|
||||
+ /* Copy the second sector to boot_params */
|
||||
+ memcpy(&hdr->jump, image->image_base + 512, 512);
|
||||
+
|
||||
+ /*
|
||||
+ * Fill out some of the header fields ourselves because the
|
||||
+ * EFI firmware loader doesn't load the first sector.
|
||||
+ */
|
||||
+ hdr->root_flags = 1;
|
||||
+ hdr->vid_mode = 0xffff;
|
||||
+ hdr->boot_flag = 0xAA55;
|
||||
+
|
||||
+ hdr->code32_start = (__u64)(unsigned long)image->image_base;
|
||||
+
|
||||
hdr->type_of_loader = 0x21;
|
||||
|
||||
/* Convert unicode cmdline to ascii */
|
||||
+ options = image->load_options;
|
||||
+ load_options_size = image->load_options_size / 2; /* ASCII */
|
||||
cmdline = 0;
|
||||
s2 = (u16 *)options;
|
||||
|
||||
@@ -791,18 +827,36 @@ static efi_status_t make_boot_params(struct boot_params *boot_params,
|
||||
hdr->ramdisk_image = 0;
|
||||
hdr->ramdisk_size = 0;
|
||||
|
||||
- status = handle_ramdisks(image, hdr);
|
||||
- if (status != EFI_SUCCESS)
|
||||
- goto free_cmdline;
|
||||
-
|
||||
- setup_graphics(boot_params);
|
||||
-
|
||||
/* Clear APM BIOS info */
|
||||
memset(bi, 0, sizeof(*bi));
|
||||
|
||||
memset(sdt, 0, sizeof(*sdt));
|
||||
|
||||
- memcpy(&efi->efi_loader_signature, EFI_LOADER_SIGNATURE, sizeof(__u32));
|
||||
+ status = handle_ramdisks(image, hdr);
|
||||
+ if (status != EFI_SUCCESS)
|
||||
+ goto fail2;
|
||||
+
|
||||
+ return boot_params;
|
||||
+fail2:
|
||||
+ if (options_size)
|
||||
+ low_free(options_size, hdr->cmd_line_ptr);
|
||||
+fail:
|
||||
+ low_free(0x4000, (unsigned long)boot_params);
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static efi_status_t exit_boot(struct boot_params *boot_params,
|
||||
+ void *handle)
|
||||
+{
|
||||
+ struct efi_info *efi = &boot_params->efi_info;
|
||||
+ struct e820entry *e820_map = &boot_params->e820_map[0];
|
||||
+ struct e820entry *prev = NULL;
|
||||
+ unsigned long size, key, desc_size, _size;
|
||||
+ efi_memory_desc_t *mem_map;
|
||||
+ efi_status_t status;
|
||||
+ __u32 desc_version;
|
||||
+ u8 nr_entries;
|
||||
+ int i;
|
||||
|
||||
size = sizeof(*mem_map) * 32;
|
||||
|
||||
@@ -811,7 +865,7 @@ again:
|
||||
_size = size;
|
||||
status = low_alloc(size, 1, (unsigned long *)&mem_map);
|
||||
if (status != EFI_SUCCESS)
|
||||
- goto free_cmdline;
|
||||
+ return status;
|
||||
|
||||
status = efi_call_phys5(sys_table->boottime->get_memory_map, &size,
|
||||
mem_map, &key, &desc_size, &desc_version);
|
||||
@@ -823,6 +877,7 @@ again:
|
||||
if (status != EFI_SUCCESS)
|
||||
goto free_mem_map;
|
||||
|
||||
+ memcpy(&efi->efi_loader_signature, EFI_LOADER_SIGNATURE, sizeof(__u32));
|
||||
efi->efi_systab = (unsigned long)sys_table;
|
||||
efi->efi_memdesc_size = desc_size;
|
||||
efi->efi_memdesc_version = desc_version;
|
||||
@@ -906,61 +961,13 @@ again:
|
||||
|
||||
free_mem_map:
|
||||
low_free(_size, (unsigned long)mem_map);
|
||||
-free_cmdline:
|
||||
- if (options_size)
|
||||
- low_free(options_size, hdr->cmd_line_ptr);
|
||||
-fail:
|
||||
return status;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * On success we return a pointer to a boot_params structure, and NULL
|
||||
- * on failure.
|
||||
- */
|
||||
-struct boot_params *efi_main(void *handle, efi_system_table_t *_table)
|
||||
+static efi_status_t relocate_kernel(struct setup_header *hdr)
|
||||
{
|
||||
- struct boot_params *boot_params;
|
||||
unsigned long start, nr_pages;
|
||||
- struct desc_ptr *gdt, *idt;
|
||||
- efi_loaded_image_t *image;
|
||||
- struct setup_header *hdr;
|
||||
efi_status_t status;
|
||||
- efi_guid_t proto = LOADED_IMAGE_PROTOCOL_GUID;
|
||||
- struct desc_struct *desc;
|
||||
-
|
||||
- sys_table = _table;
|
||||
-
|
||||
- /* Check if we were booted by the EFI firmware */
|
||||
- if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
|
||||
- goto fail;
|
||||
-
|
||||
- status = efi_call_phys3(sys_table->boottime->handle_protocol,
|
||||
- handle, &proto, (void *)&image);
|
||||
- if (status != EFI_SUCCESS) {
|
||||
- efi_printk("Failed to get handle for LOADED_IMAGE_PROTOCOL\n");
|
||||
- goto fail;
|
||||
- }
|
||||
-
|
||||
- status = low_alloc(0x4000, 1, (unsigned long *)&boot_params);
|
||||
- if (status != EFI_SUCCESS) {
|
||||
- efi_printk("Failed to alloc lowmem for boot params\n");
|
||||
- goto fail;
|
||||
- }
|
||||
-
|
||||
- memset(boot_params, 0x0, 0x4000);
|
||||
-
|
||||
- hdr = &boot_params->hdr;
|
||||
-
|
||||
- /* Copy the second sector to boot_params */
|
||||
- memcpy(&hdr->jump, image->image_base + 512, 512);
|
||||
-
|
||||
- /*
|
||||
- * Fill out some of the header fields ourselves because the
|
||||
- * EFI firmware loader doesn't load the first sector.
|
||||
- */
|
||||
- hdr->root_flags = 1;
|
||||
- hdr->vid_mode = 0xffff;
|
||||
- hdr->boot_flag = 0xAA55;
|
||||
|
||||
/*
|
||||
* The EFI firmware loader could have placed the kernel image
|
||||
@@ -978,16 +985,40 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table)
|
||||
if (status != EFI_SUCCESS) {
|
||||
status = low_alloc(hdr->init_size, hdr->kernel_alignment,
|
||||
&start);
|
||||
- if (status != EFI_SUCCESS) {
|
||||
+ if (status != EFI_SUCCESS)
|
||||
efi_printk("Failed to alloc mem for kernel\n");
|
||||
- goto fail;
|
||||
- }
|
||||
}
|
||||
|
||||
+ if (status == EFI_SUCCESS)
|
||||
+ memcpy((void *)start, (void *)(unsigned long)hdr->code32_start,
|
||||
+ hdr->init_size);
|
||||
+
|
||||
+ hdr->pref_address = hdr->code32_start;
|
||||
hdr->code32_start = (__u32)start;
|
||||
- hdr->pref_address = (__u64)(unsigned long)image->image_base;
|
||||
|
||||
- memcpy((void *)start, image->image_base, image->image_size);
|
||||
+ return status;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * On success we return a pointer to a boot_params structure, and NULL
|
||||
+ * on failure.
|
||||
+ */
|
||||
+struct boot_params *efi_main(void *handle, efi_system_table_t *_table,
|
||||
+ struct boot_params *boot_params)
|
||||
+{
|
||||
+ struct desc_ptr *gdt, *idt;
|
||||
+ efi_loaded_image_t *image;
|
||||
+ struct setup_header *hdr = &boot_params->hdr;
|
||||
+ efi_status_t status;
|
||||
+ struct desc_struct *desc;
|
||||
+
|
||||
+ sys_table = _table;
|
||||
+
|
||||
+ /* Check if we were booted by the EFI firmware */
|
||||
+ if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
|
||||
+ goto fail;
|
||||
+
|
||||
+ setup_graphics(boot_params);
|
||||
|
||||
status = efi_call_phys3(sys_table->boottime->allocate_pool,
|
||||
EFI_LOADER_DATA, sizeof(*gdt),
|
||||
@@ -1015,7 +1046,18 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table)
|
||||
idt->size = 0;
|
||||
idt->address = 0;
|
||||
|
||||
- status = make_boot_params(boot_params, image, handle);
|
||||
+ /*
|
||||
+ * If the kernel isn't already loaded at the preferred load
|
||||
+ * address, relocate it.
|
||||
+ */
|
||||
+ if (hdr->pref_address != hdr->code32_start) {
|
||||
+ status = relocate_kernel(hdr);
|
||||
+
|
||||
+ if (status != EFI_SUCCESS)
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ status = exit_boot(boot_params, handle);
|
||||
if (status != EFI_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
|
||||
index c85e3ac..aa4aaf1 100644
|
||||
--- a/arch/x86/boot/compressed/head_32.S
|
||||
+++ b/arch/x86/boot/compressed/head_32.S
|
||||
@@ -42,6 +42,16 @@ ENTRY(startup_32)
|
||||
*/
|
||||
add $0x4, %esp
|
||||
|
||||
+ call make_boot_params
|
||||
+ cmpl $0, %eax
|
||||
+ je 1f
|
||||
+ movl 0x4(%esp), %esi
|
||||
+ movl (%esp), %ecx
|
||||
+ pushl %eax
|
||||
+ pushl %esi
|
||||
+ pushl %ecx
|
||||
+
|
||||
+ .org 0x30,0x90
|
||||
call efi_main
|
||||
cmpl $0, %eax
|
||||
movl %eax, %esi
|
||||
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
|
||||
index 87e03a1..2c4b171 100644
|
||||
--- a/arch/x86/boot/compressed/head_64.S
|
||||
+++ b/arch/x86/boot/compressed/head_64.S
|
||||
@@ -209,6 +209,16 @@ ENTRY(startup_64)
|
||||
.org 0x210
|
||||
mov %rcx, %rdi
|
||||
mov %rdx, %rsi
|
||||
+ pushq %rdi
|
||||
+ pushq %rsi
|
||||
+ call make_boot_params
|
||||
+ cmpq $0,%rax
|
||||
+ je 1f
|
||||
+ mov %rax, %rdx
|
||||
+ popq %rsi
|
||||
+ popq %rdi
|
||||
+
|
||||
+ .org 0x230,0x90
|
||||
call efi_main
|
||||
movq %rax,%rsi
|
||||
cmpq $0,%rax
|
||||
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
|
||||
index efe5acf..cd921fe 100644
|
||||
--- a/arch/x86/boot/header.S
|
||||
+++ b/arch/x86/boot/header.S
|
||||
@@ -283,7 +283,7 @@ _start:
|
||||
# Part 2 of the header, from the old setup.S
|
||||
|
||||
.ascii "HdrS" # header signature
|
||||
- .word 0x020a # header version number (>= 0x0105)
|
||||
+ .word 0x020b # header version number (>= 0x0105)
|
||||
# or else old loadlin-1.5 will fail)
|
||||
.globl realmode_swtch
|
||||
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
|
||||
@@ -401,6 +401,8 @@ pref_address: .quad LOAD_PHYSICAL_ADDR # preferred load addr
|
||||
#define INIT_SIZE VO_INIT_SIZE
|
||||
#endif
|
||||
init_size: .long INIT_SIZE # kernel initialization size
|
||||
+handover_offset: .long 0x30 # offset to the handover
|
||||
+ # protocol entry point
|
||||
|
||||
# End of setup header #####################################################
|
||||
|
||||
diff --git a/arch/x86/include/asm/bootparam.h b/arch/x86/include/asm/bootparam.h
|
||||
index eb45aa6..2ad874c 100644
|
||||
--- a/arch/x86/include/asm/bootparam.h
|
||||
+++ b/arch/x86/include/asm/bootparam.h
|
||||
@@ -66,6 +66,7 @@ struct setup_header {
|
||||
__u64 setup_data;
|
||||
__u64 pref_address;
|
||||
__u32 init_size;
|
||||
+ __u32 handover_offset;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct sys_desc_table {
|
||||
--
|
||||
1.7.11.2
|
||||
|
||||
|
||||
From 948fbe310f85f3a51a101ea23f38c59c70792832 Mon Sep 17 00:00:00 2001
|
||||
From: Matthew Garrett <mjg@redhat.com>
|
||||
Date: Thu, 8 Mar 2012 09:56:33 -0500
|
||||
|
Loading…
Reference in New Issue
Block a user