From: Borislav Petkov <bp@alien8.de>
To: Chao Fan <fanc.fnst@cn.fujitsu.com>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org, tglx@linutronix.de,
mingo@redhat.com, hpa@zytor.com, keescook@chromium.org,
bhe@redhat.com, msys.mizuma@gmail.com,
indou.takao@jp.fujitsu.com, caoj.fnst@cn.fujitsu.com
Subject: Re: [PATCH v15 6/6] x86/boot/KASLR: Limit KASLR to extracting kernel in immovable memory
Date: Wed, 16 Jan 2019 12:15:07 +0100 [thread overview]
Message-ID: <20190116111507.GD15409@zn.tnic> (raw)
In-Reply-To: <20190107032243.25324-7-fanc.fnst@cn.fujitsu.com>
On Mon, Jan 07, 2019 at 11:22:43AM +0800, Chao Fan wrote:
> KASLR may randomly choose some positions which are located in movable
> memory regions. It will break memory hotplug feature and make the
> movable memory chosen by KASLR can't be removed.
>
> The solution is to limit KASLR to choose memory regions in immovable
> node according to SRAT tables.
> When CONFIG_EARLY_SRAT_PARSE is enabled, walk through SRAT to get the
> information of immovable memory so that KASLR knows where should be
> chosen for randomization.
>
> Rename process_mem_region() as __process_mem_region() and name new
> function as process_mem_region().
The commit message doesn't need to contain *what* you're doing in the
patch.
>
> Signed-off-by: Chao Fan <fanc.fnst@cn.fujitsu.com>
> ---
> arch/x86/boot/compressed/kaslr.c | 79 +++++++++++++++++++++++++++-----
> 1 file changed, 68 insertions(+), 11 deletions(-)
>
> diff --git a/arch/x86/boot/compressed/kaslr.c b/arch/x86/boot/compressed/kaslr.c
> index b251572e77af..7dbec6910203 100644
> --- a/arch/x86/boot/compressed/kaslr.c
> +++ b/arch/x86/boot/compressed/kaslr.c
> @@ -97,6 +97,15 @@ static bool memmap_too_large;
> /* Store memory limit specified by "mem=nn[KMG]" or "memmap=nn[KMG]" */
> static unsigned long long mem_limit = ULLONG_MAX;
>
> +#ifdef CONFIG_EARLY_SRAT_PARSE
> +/*
> + * Information of immovable memory regions.
> + * Max amount of memory regions is MAX_NUMNODES*2, so need such array
> + * to place immovable memory regions if all of the memory is immovable.
> + */
Why is that comment repeated here?
> +extern struct mem_vector immovable_mem[MAX_NUMNODES*2];
> +#endif
> +
>
> enum mem_avoid_index {
> MEM_AVOID_ZO_RANGE = 0,
> @@ -413,6 +422,9 @@ static void mem_avoid_init(unsigned long input, unsigned long input_size,
> /* Mark the memmap regions we need to avoid */
> handle_mem_options();
>
> + /* Mark the immovable regions we need to choose */
> + get_immovable_mem();
get != mark.
Which should tell you that the function name needs changing.
Also, this function is void and it could very well return
num_immovable_mem and num_immovable_mem can be a static variable in
kaslr.c instead of sloppily adding yet another global one.
> +
> #ifdef CONFIG_X86_VERBOSE_BOOTUP
> /* Make sure video RAM can be used. */
> add_identity_map(0, PMD_SIZE);
> @@ -568,9 +580,9 @@ static unsigned long slots_fetch_random(void)
> return 0;
> }
>
> -static void process_mem_region(struct mem_vector *entry,
> - unsigned long minimum,
> - unsigned long image_size)
> +static void __process_mem_region(struct mem_vector *entry,
> + unsigned long minimum,
> + unsigned long image_size)
> {
> struct mem_vector region, overlap;
> unsigned long start_orig, end;
> @@ -646,6 +658,57 @@ static void process_mem_region(struct mem_vector *entry,
> }
> }
>
> +static bool process_mem_region(struct mem_vector *region,
> + unsigned long long minimum,
> + unsigned long long image_size)
> +{
> + int i;
> + /*
> + * If no immovable memory found, or MEMORY_HOTREMOVE disabled,
> + * walk all the regions, so use region directly.
> + */
> + if (!num_immovable_mem) {
> + __process_mem_region(region, minimum, image_size);
> +
> + if (slot_area_index == MAX_SLOT_AREA) {
> + debug_putstr("Aborted e820/efi memmap scan (slot_areas full)!\n");
> + return 1;
> + }
> + return 0;
> + }
> +
> +#ifdef CONFIG_EARLY_SRAT_PARSE
> + /*
> + * If immovable memory found, filter the intersection between
> + * immovable memory and region to __process_mem_region().
> + * Otherwise, go on old code.
> + */
> + for (i = 0; i < num_immovable_mem; i++) {
> + unsigned long long start, end, entry_end, region_end;
> + struct mem_vector entry;
> +
> + if (!mem_overlaps(region, &immovable_mem[i]))
> + continue;
> +
> + start = immovable_mem[i].start;
> + end = start + immovable_mem[i].size;
> + region_end = region->start + region->size;
> +
> + entry.start = clamp(region->start, start, end);
> + entry_end = clamp(region_end, start, end);
> + entry.size = entry_end - entry.start;
> +
> + __process_mem_region(&entry, minimum, image_size);
> +
> + if (slot_area_index == MAX_SLOT_AREA) {
> + debug_putstr("Aborted e820/efi memmap scan (slot_areas full)!\n");
Change this error message a bit to differ from the above for easier debugging.
--
Regards/Gruss,
Boris.
Good mailing practices for 400: avoid top-posting and trim the reply.
next prev parent reply other threads:[~2019-01-16 11:15 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-07 3:22 [PATCH v15 0/6] x86/boot/KASLR: Parse ACPI table and limit KASLR to choosing immovable memory Chao Fan
2019-01-07 3:22 ` [PATCH v15 1/6] x86/boot: Copy kstrtoull() to boot/string.c instead of using simple_strtoull() Chao Fan
2019-01-09 12:48 ` Borislav Petkov
2019-01-10 1:15 ` Chao Fan
2019-01-07 3:22 ` [PATCH v15 2/6] x86/boot: Introduce get_acpi_rsdp() to parse RSDP in cmdline from KEXEC Chao Fan
2019-01-10 17:01 ` Borislav Petkov
2019-01-11 1:17 ` Chao Fan
2019-01-07 3:22 ` [PATCH v15 3/6] x86/boot: Introduce efi_get_rsdp_addr() to find RSDP from EFI table Chao Fan
2019-01-10 21:15 ` Borislav Petkov
2019-01-11 1:23 ` Chao Fan
2019-01-11 10:32 ` Borislav Petkov
2019-01-13 9:47 ` Chao Fan
2019-01-13 11:05 ` Borislav Petkov
2019-01-14 1:26 ` Chao Fan
2019-01-14 9:07 ` Borislav Petkov
2019-01-15 7:21 ` Chao Fan
2019-01-15 9:55 ` Borislav Petkov
2019-01-16 3:26 ` Chao Fan
2019-01-07 3:22 ` [PATCH v15 4/6] x86/boot: Introduce bios_get_rsdp_addr() to search RSDP in memory Chao Fan
2019-01-10 21:27 ` Borislav Petkov
2019-01-11 1:27 ` Chao Fan
2019-01-07 3:22 ` [PATCH v15 5/6] x86/boot: Parse SRAT address from RSDP and store immovable memory Chao Fan
2019-01-16 7:28 ` Kairui Song
2019-01-17 1:42 ` Chao Fan
[not found] ` <20190117062451.GA588@localhost.localdomain>
2019-01-17 7:57 ` Chao Fan
2019-01-17 8:22 ` Kairui Song
2019-01-17 9:06 ` Juergen Gross
2019-01-16 11:01 ` Borislav Petkov
2019-01-17 1:16 ` Chao Fan
2019-01-17 3:20 ` Chao Fan
2019-01-17 15:27 ` Borislav Petkov
2019-01-18 1:14 ` Chao Fan
2019-01-21 9:33 ` Chao Fan
2019-01-21 9:42 ` Chao Fan
2019-01-21 9:45 ` Borislav Petkov
2019-01-21 9:51 ` Chao Fan
2019-01-07 3:22 ` [PATCH v15 6/6] x86/boot/KASLR: Limit KASLR to extracting kernel in " Chao Fan
2019-01-16 11:15 ` Borislav Petkov [this message]
2019-01-17 1:25 ` Chao Fan
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=20190116111507.GD15409@zn.tnic \
--to=bp@alien8.de \
--cc=bhe@redhat.com \
--cc=caoj.fnst@cn.fujitsu.com \
--cc=fanc.fnst@cn.fujitsu.com \
--cc=hpa@zytor.com \
--cc=indou.takao@jp.fujitsu.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=msys.mizuma@gmail.com \
--cc=tglx@linutronix.de \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.