]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
xen/PVH: Set up GS segment for stack canary
authorBoris Ostrovsky <boris.ostrovsky@oracle.com>
Tue, 8 May 2018 23:56:22 +0000 (19:56 -0400)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 1 Mar 2019 13:20:19 +0000 (14:20 +0100)
BugLink: http://bugs.launchpad.net/bugs/1814813
commit 98014068328c5574de9a4a30b604111fd9d8f901 upstream.

We are making calls to C code (e.g. xen_prepare_pvh()) which may use
stack canary (stored in GS segment).

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Cc: Jason Andryuk <jandryuk@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
arch/x86/xen/xen-pvh.S

index ce642e12521da2c933f53322ab9cf4f782a15c53..1ed71047cc49eaf6e10994fd6de3aa4d04fc21e7 100644 (file)
@@ -55,6 +55,9 @@
  * charge of setting up it's own stack, GDT and IDT.
  */
 
+#define PVH_GDT_ENTRY_CANARY   4
+#define PVH_CANARY_SEL         (PVH_GDT_ENTRY_CANARY * 8)
+
 ENTRY(pvh_start_xen)
        cld
 
@@ -99,6 +102,12 @@ ENTRY(pvh_start_xen)
        /* 64-bit entry point. */
        .code64
 1:
+       /* Set base address in stack canary descriptor. */
+       mov $MSR_GS_BASE,%ecx
+       mov $_pa(canary), %eax
+       xor %edx, %edx
+       wrmsr
+
        call xen_prepare_pvh
 
        /* startup_64 expects boot_params in %rsi. */
@@ -109,6 +118,17 @@ ENTRY(pvh_start_xen)
 
 #else /* CONFIG_X86_64 */
 
+       /* Set base address in stack canary descriptor. */
+       movl $_pa(gdt_start),%eax
+       movl $_pa(canary),%ecx
+       movw %cx, (PVH_GDT_ENTRY_CANARY * 8) + 2(%eax)
+       shrl $16, %ecx
+       movb %cl, (PVH_GDT_ENTRY_CANARY * 8) + 4(%eax)
+       movb %ch, (PVH_GDT_ENTRY_CANARY * 8) + 7(%eax)
+
+       mov $PVH_CANARY_SEL,%eax
+       mov %eax,%gs
+
        call mk_early_pgtbl_32
 
        mov $_pa(initial_page_table), %eax
@@ -152,9 +172,13 @@ gdt_start:
        .quad GDT_ENTRY(0xc09a, 0, 0xfffff) /* __KERNEL_CS */
 #endif
        .quad GDT_ENTRY(0xc092, 0, 0xfffff) /* __KERNEL_DS */
+       .quad GDT_ENTRY(0x4090, 0, 0x18)    /* PVH_CANARY_SEL */
 gdt_end:
 
-       .balign 4
+       .balign 16
+canary:
+       .fill 48, 1, 0
+
 early_stack:
        .fill 256, 1, 0
 early_stack_end: