From: Yinghai Lu <yinghai@kernel.org>
To: "Yu, Fenghua" <fenghua.yu@intel.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
Thomas Gleixner <tglx@linutronix.de>,
"Mallick, Asit K" <asit.k.mallick@intel.com>,
Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
Andreas Herrmann <andreas.herrmann3@amd.com>,
Borislav Petkov <borislav.petkov@amd.com>,
linux-kernel <linux-kernel@vger.kernel.org>, x86 <x86@kernel.org>
Subject: Re: [PATCH v3 08/10] x86/head64.c: Early update ucode in 64-bit
Date: Sun, 16 Dec 2012 18:02:20 -0800 [thread overview]
Message-ID: <CAE9FiQXqXh9OQvu2a-atm3Ydhi+LOLw1pLJ-tCavmSnAohXmkQ@mail.gmail.com> (raw)
In-Reply-To: <CAE9FiQUqJVJ6JSeGzFH+OtRA4syrbXZh-RJLSghvB8fdBt97oQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 2311 bytes --]
On Sun, Dec 16, 2012 at 4:42 PM, Yinghai Lu <yinghai@kernel.org> wrote:
> On Sun, Dec 16, 2012 at 3:59 PM, Yu, Fenghua <fenghua.yu@intel.com> wrote:
>>
>>> it has to be rebased after #PF handler version. otherwise it can not
>>> handle for framdisk
>>> that is loaded after 1G.
>>>
>>> Fenghua,
>>>
>>> can you post your boot log with 64bit with your patch?
>>>
>>> Yinghai
>>
>> Attached is dmesg with the patches.
>>
>
> yes, your laptop only have 1G ram, and
>
> [ 0.000000] e820: BIOS-provided physical RAM map:
> [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009d7ff] usable
> [ 0.000000] BIOS-e820: [mem 0x000000000009d800-0x000000000009ffff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000000d2000-0x00000000000d3fff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
> [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000003e6affff] usable
> [ 0.000000] BIOS-e820: [mem 0x000000003e6b0000-0x000000003e6ccfff] ACPI data
> [ 0.000000] BIOS-e820: [mem 0x000000003e6cd000-0x000000003e6fffff] ACPI NVS
> [ 0.000000] BIOS-e820: [mem 0x000000003e700000-0x000000003effffff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000f0000000-0x00000000f3ffffff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec0ffff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000fed00000-0x00000000fed003ff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000fed14000-0x00000000fed19fff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed8ffff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
> [ 0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
>
> ramdisk is at
> RAMDISK: [mem 0x27608000-0x2fafbfff]
>
> and current kernel default set 1G to kernel mapping. so it happens to
> work with your patchset.
>
> please find one sytem with 4G or more to test it.
>
> and you may need to rebase your patches on top of my for-x86-boot
> branch with working
> #PF handler set page table patch.
>
> git://git.kernel.org/pub/scm/linux/kernel/git/yinghai/linux-yinghai.git
> for-x86-boot
also you did not consider initrd relocating....
please check attached fix, and see if you can fold in into you next posting.
Thanks
Yinghai
[-- Attachment #2: fix_microcode_v4.patch --]
[-- Type: application/octet-stream, Size: 6633 bytes --]
---
arch/x86/kernel/microcode_intel_early.c | 101 ++++++++++++++++----------------
arch/x86/kernel/setup.c | 11 +++
2 files changed, 64 insertions(+), 48 deletions(-)
Index: linux-2.6/arch/x86/kernel/microcode_intel_early.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/microcode_intel_early.c
+++ linux-2.6/arch/x86/kernel/microcode_intel_early.c
@@ -20,9 +20,11 @@
#include <linux/vmalloc.h>
#include <linux/mm.h>
#include <linux/earlycpio.h>
+
#include <asm/msr.h>
#include <asm/microcode_intel.h>
#include <asm/processor.h>
+#include <asm/setup.h>
struct microcode_intel __initdata *mc_saved_in_initrd[MAX_UCODE_COUNT];
struct mc_saved_data mc_saved_data;
@@ -290,12 +292,44 @@ static int __cpuinit collect_cpu_info_ea
return 0;
}
+#ifdef CONFIG_X86_64
+void __init update_mc_saved_data(unsigned long pa_offset)
+{
+ int i;
+ unsigned long addr;
+
+ if (!pa_offset || !mc_saved_data.mc_saved)
+ return;
+
+ for (i = 0; i< mc_saved_data.mc_saved_count; i++)
+ mc_saved_data.mc_saved[i] += pa_offset;
+}
+#else
+void __init update_mc_saved_data(unsigned long pa_offset)
+{
+ int i;
+
+ if (mc_saved_data.mc_saved) {
+ mc_saved_data.mc_saved = __va(mc_saved_data.mc_saved);
+ for (i = 0; i < mc_saved_data.mc_saved_count; i++)
+ mc_saved_data.mc_saved[i] =
+ __va(mc_saved_data.mc_saved[i] + pa_offset);
+
+ }
+
+ mc_saved_data.ucode_cpu_info = __va(mc_saved_data.ucode_cpu_info);
+ if (mc_saved_data.ucode_cpu_info->mc)
+ mc_saved_data.ucode_cpu_info->mc =
+ __va(mc_saved_data.ucode_cpu_info->mc);
+}
+
+#endif
+
static __init enum ucode_state
-scan_microcode(unsigned long start, unsigned long end,
+scan_microcode(unsigned long start, unsigned long size,
struct mc_saved_data *mc_saved_data,
struct microcode_intel **mc_saved_in_initrd)
{
- unsigned int size = end - start + 1;
struct cpio_data cd = { 0, 0 };
char ucode_name[] = "kernel/x86/microcode/GenuineIntel.bin";
long offset = 0;
@@ -308,7 +342,7 @@ scan_microcode(unsigned long start, unsi
mc_saved_in_initrd, SYSTEM_BOOTING);
}
-static int __init
+static int __cpuinit
apply_microcode_early(struct mc_saved_data *mc_saved_data, int cpu)
{
struct ucode_cpu_info *uci = mc_saved_data->ucode_cpu_info + cpu;
@@ -339,32 +373,6 @@ apply_microcode_early(struct mc_saved_da
return 0;
}
-#ifdef CONFIG_X86_32
-static void __init map_mc_saved(struct mc_saved_data *mc_saved_data,
- struct microcode_intel **mc_saved_in_initrd)
-{
- int i;
-
- if (mc_saved_data->mc_saved) {
- for (i = 0; i < mc_saved_data->mc_saved_count; i++)
- mc_saved_data->mc_saved[i] =
- __va(mc_saved_data->mc_saved[i]);
-
- mc_saved_data->mc_saved = __va(mc_saved_data->mc_saved);
- }
-
- if (mc_saved_data->ucode_cpu_info->mc)
- mc_saved_data->ucode_cpu_info->mc =
- __va(mc_saved_data->ucode_cpu_info->mc);
- mc_saved_data->ucode_cpu_info = __va(mc_saved_data->ucode_cpu_info);
-}
-#else
-static inline void __init map_mc_saved(struct mc_saved_data *mc_saved_data,
- struct microcode_intel **mc_saved_in_initrd)
-{
-}
-#endif
-
void __init save_microcode_in_initrd(struct mc_saved_data *mc_saved_data,
struct microcode_intel **mc_saved_in_initrd)
{
@@ -376,7 +384,7 @@ void __init save_microcode_in_initrd(str
static void __init
_load_ucode_intel_bsp(struct mc_saved_data *mc_saved_data,
struct microcode_intel **mc_saved_in_initrd,
- unsigned long initrd_start, unsigned long initrd_end)
+ unsigned long initrd_start, unsigned long initrd_size)
{
int cpu = 0;
@@ -387,37 +395,34 @@ _load_ucode_intel_bsp(struct mc_saved_da
(struct ucode_cpu_info *)__pa(ucode_cpu_info_early);
#endif
collect_cpu_info_early(mc_saved_data->ucode_cpu_info + cpu);
- scan_microcode(initrd_start, initrd_end, mc_saved_data,
+ scan_microcode(initrd_start, initrd_size, mc_saved_data,
mc_saved_in_initrd);
load_microcode(mc_saved_data, cpu);
apply_microcode_early(mc_saved_data, cpu);
- map_mc_saved(mc_saved_data, mc_saved_in_initrd);
}
void __init
load_ucode_intel_bsp(char *real_mode_data)
{
- u64 ramdisk_image, ramdisk_size, ramdisk_end;
- unsigned long initrd_start, initrd_end;
- struct boot_params *boot_params;
-
- boot_params = (struct boot_params *)real_mode_data;
- ramdisk_image = boot_params->hdr.ramdisk_image;
- ramdisk_size = boot_params->hdr.ramdisk_size;
+ u64 ramdisk_image, ramdisk_size;
#ifdef CONFIG_X86_64
- ramdisk_end = PAGE_ALIGN(ramdisk_image + ramdisk_size);
- initrd_start = ramdisk_image + PAGE_OFFSET;
- initrd_end = initrd_start + ramdisk_size;
+ ramdisk_image = boot_params.hdr.ramdisk_image;
+ ramdisk_size = boot_params.hdr.ramdisk_size;
+ if (!ramdisk_image || !ramdisk_size)
+ return;
_load_ucode_intel_bsp(&mc_saved_data, mc_saved_in_initrd,
- initrd_start, initrd_end);
+ ramdisk_image, ramdisk_size);
#else
- ramdisk_end = ramdisk_image + ramdisk_size;
- initrd_start = ramdisk_image;
- initrd_end = initrd_start + ramdisk_size;
+ struct boot_params *boot_params = (struct boot_params *)real_mode_data;
+
+ ramdisk_image = boot_params->hdr.ramdisk_image;
+ ramdisk_size = boot_params->hdr.ramdisk_size;
+ if (!ramdisk_image || !ramdisk_size)
+ return;
_load_ucode_intel_bsp((struct mc_saved_data *)__pa(&mc_saved_data),
- (struct microcode_intel **)__pa(mc_saved_in_initrd),
- initrd_start, initrd_end);
+ (struct microcode_intel **)__pa(mc_saved_in_initrd),
+ ramdisk_image, ramdisk_size);
#endif
}
Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup.c
+++ linux-2.6/arch/x86/kernel/setup.c
@@ -309,6 +309,14 @@ static u64 __init get_mem_size(unsigned
#ifdef CONFIG_BLK_DEV_INITRD
+#ifdef CONFIG_MICROCODE_INTEL_EARLY
+void update_mc_saved_data(unsigned long pa_offset);
+#else
+static inline void update_mc_saved_data(unsigned long pa_offset)
+{
+}
+#endif
+
static u64 __init get_ramdisk_image(void)
{
u64 ramdisk_image = boot_params.hdr.ramdisk_image;
@@ -376,6 +384,8 @@ static void __init relocate_initrd(void)
" [mem %#010llx-%#010llx]\n",
ramdisk_image, ramdisk_image + ramdisk_size - 1,
ramdisk_here, ramdisk_here + ramdisk_size - 1);
+
+ update_mc_saved_data(ramdisk_here - ramdisk_image);
}
static void __init early_reserve_initrd(void)
@@ -419,6 +429,7 @@ static void __init reserve_initrd(void)
/* All are mapped, easy case */
initrd_start = ramdisk_image + PAGE_OFFSET;
initrd_end = initrd_start + ramdisk_size;
+ update_mc_saved_data(0);
return;
}
next prev parent reply other threads:[~2012-12-17 2:02 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-16 10:43 [PATCH v3 00/10] x86/microcode: Early load microcode Fenghua Yu
2012-12-16 10:43 ` [PATCH v3 01/10] Documentation/x86: " Fenghua Yu
2012-12-16 10:43 ` [PATCH v3 02/10] x86/microcode_intel.h: Define functions and macros for early loading ucode Fenghua Yu
2012-12-16 10:43 ` [PATCH v3 03/10] x86/common.c: Make have_cpuid_p() a global function Fenghua Yu
2012-12-16 10:43 ` [PATCH v3 04/10] x86/microcode_core_early.c: Define interfaces for early loading ucode Fenghua Yu
2012-12-16 17:57 ` Borislav Petkov
2012-12-16 18:09 ` Yu, Fenghua
2012-12-16 18:17 ` Borislav Petkov
2012-12-16 10:43 ` [PATCH v3 05/10] x86/microcode_intel_lib.c: Early update ucode on Intel's CPU Fenghua Yu
2012-12-16 10:43 ` [PATCH v3 06/10] x86/microcode_intel_early.c: " Fenghua Yu
2012-12-16 10:43 ` [PATCH v3 07/10] x86/head_32.S: Early update ucode in 32-bit Fenghua Yu
2012-12-16 10:43 ` [PATCH v3 08/10] x86/head64.c: Early update ucode in 64-bit Fenghua Yu
2012-12-16 17:59 ` Yinghai Lu
2012-12-16 18:38 ` Yu, Fenghua
2012-12-16 21:43 ` H. Peter Anvin
2012-12-16 23:35 ` Yinghai Lu
2012-12-16 23:59 ` Yu, Fenghua
2012-12-17 0:42 ` Yinghai Lu
2012-12-17 2:02 ` Yinghai Lu [this message]
2012-12-17 7:14 ` Yu, Fenghua
2012-12-17 23:30 ` Yu, Fenghua
2012-12-17 23:34 ` Yinghai Lu
2012-12-18 0:32 ` Yu, Fenghua
2012-12-18 0:36 ` Yinghai Lu
2012-12-18 22:55 ` Yu, Fenghua
2012-12-18 22:57 ` Yinghai Lu
2012-12-16 10:43 ` [PATCH v3 09/10] x86/mm/init.c: Copy ucode from initrd image to memory Fenghua Yu
2012-12-16 10:43 ` [PATCH v3 10/10] x86/Kconfig: Configurations to enable/disable the feature Fenghua Yu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAE9FiQXqXh9OQvu2a-atm3Ydhi+LOLw1pLJ-tCavmSnAohXmkQ@mail.gmail.com \
--to=yinghai@kernel.org \
--cc=andreas.herrmann3@amd.com \
--cc=asit.k.mallick@intel.com \
--cc=borislav.petkov@amd.com \
--cc=fenghua.yu@intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
--cc=tigran@aivazian.fsnet.co.uk \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).