Re: [08/24] x86/mm/kaiser: Map the dynamically-allocated LDTs

From: Guenter Roeck
Date: Wed Nov 29 2017 - 17:04:07 EST


On Mon, Nov 27, 2017 at 11:49:07AM +0100, Ingo Molnar wrote:
> From: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
>
> Normally, a process has a NULL mm->context.ldt. But, there is a
> syscall for a process to set a new one. If a process does that,
> the LDT be mapped into the user page tables, just like the
> default copy.
>
> The original KAISER patch missed this case.
>
> Signed-off-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
> Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
> Cc: Andy Lutomirski <luto@xxxxxxxxxx>
> Cc: Borislav Petkov <bp@xxxxxxxxx>
> Cc: Brian Gerst <brgerst@xxxxxxxxx>
> Cc: Denys Vlasenko <dvlasenk@xxxxxxxxxx>
> Cc: H. Peter Anvin <hpa@xxxxxxxxx>
> Cc: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
> Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx>
> Cc: Rik van Riel <riel@xxxxxxxxxx>
> Cc: daniel.gruss@xxxxxxxxxxxxxx
> Cc: hughd@xxxxxxxxxx
> Cc: keescook@xxxxxxxxxx
> Cc: linux-mm@xxxxxxxxx
> Cc: michael.schwarz@xxxxxxxxxxxxxx
> Cc: moritz.lipp@xxxxxxxxxxxxxx
> Cc: richard.fellner@xxxxxxxxxxxxxxxxx
> Link: https://lkml.kernel.org/r/20171123003455.275397F7@xxxxxxxxxxxxxxxxxx
> Signed-off-by: Ingo Molnar <mingo@xxxxxxxxxx>
> ---
> arch/x86/kernel/ldt.c | 25 ++++++++++++++++++++-----
> 1 file changed, 20 insertions(+), 5 deletions(-)
>
...
> +
> /* The caller must call finalize_ldt_struct on the result. LDT starts zeroed. */
> static struct ldt_struct *alloc_ldt_struct(unsigned int num_entries)
> {
> struct ldt_struct *new_ldt;
> unsigned int alloc_size;
> + int ret;
>
> if (num_entries > LDT_ENTRIES)
> return NULL;
> @@ -89,6 +100,12 @@ static struct ldt_struct *alloc_ldt_struct(unsigned int num_entries)
> return NULL;
> }
>
> + ret = kaiser_add_mapping((unsigned long)new_ldt->entries, alloc_size,
> + __PAGE_KERNEL | _PAGE_GLOBAL);

This results in:

arch/x86/kernel/ldt.c: In function âalloc_ldt_structâ:
arch/x86/kernel/ldt.c:104:6: warning: large integer implicitly truncated to
unsigned type [-Woverflow]
__PAGE_KERNEL | _PAGE_GLOBAL);
^

in ARCH=i386 builds with CONFIG_X86_PAE enabled. See
https://groups.google.com/forum/#!topic/cros-kernel-buildreports/8R41aX07daU

Guenter