Re: [patch V163 51/51] x86/ldt: Make the LDT mapping RO

From: Peter Zijlstra
Date: Mon Dec 18 2017 - 08:48:44 EST


On Mon, Dec 18, 2017 at 12:43:06PM +0100, Thomas Gleixner wrote:

> arch/x86/include/asm/desc.h | 2 ++
> arch/x86/kernel/ldt.c | 7 ++++++-
> tools/testing/selftests/x86/ldt_gdt.c | 3 +--
> 3 files changed, 9 insertions(+), 3 deletions(-)
>
> --- a/arch/x86/include/asm/desc.h
> +++ b/arch/x86/include/asm/desc.h
> @@ -20,6 +20,8 @@ static inline void fill_ldt(struct desc_
>
> desc->type = (info->read_exec_only ^ 1) << 1;
> desc->type |= info->contents << 2;
> + /* Set the ACCESS bit so it can be mapped RO */
> + desc->type |= 1;
>
> desc->s = 1;
> desc->dpl = 0x3;


--- a/arch/x86/kernel/tls.c
+++ b/arch/x86/kernel/tls.c
@@ -93,17 +93,10 @@ static void set_tls_desc(struct task_str
cpu = get_cpu();

while (n-- > 0) {
- if (LDT_empty(info) || LDT_zero(info)) {
+ if (LDT_empty(info) || LDT_zero(info))
memset(desc, 0, sizeof(*desc));
- } else {
+ else
fill_ldt(desc, info);
-
- /*
- * Always set the accessed bit so that the CPU
- * doesn't try to write to the (read-only) GDT.
- */
- desc->type |= 1;
- }
++info;
++desc;
}