36 lines
1.4 KiB
Diff
36 lines
1.4 KiB
Diff
|
# Commit 7cfb0053629c4dd1a6f01dc43cca7c0c25b8b7bf
|
||
|
# Date 2013-10-04 12:24:34 +0200
|
||
|
# Author Andrew Cooper <andrew.cooper3@citrix.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
x86/percpu: Force INVALID_PERCPU_AREA into the non-canonical address region
|
||
|
|
||
|
This causes accidental uses of per_cpu() on a pcpu with an INVALID_PERCPU_AREA
|
||
|
to result in a #GF for attempting to access the middle of the non-canonical
|
||
|
virtual address region.
|
||
|
|
||
|
This is preferable to the current behaviour, where incorrect use of per_cpu()
|
||
|
will result in an effective NULL structure dereference which has security
|
||
|
implication in the context of PV guests.
|
||
|
|
||
|
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||
|
|
||
|
--- a/xen/arch/x86/percpu.c
|
||
|
+++ b/xen/arch/x86/percpu.c
|
||
|
@@ -6,7 +6,14 @@
|
||
|
#include <xen/rcupdate.h>
|
||
|
|
||
|
unsigned long __per_cpu_offset[NR_CPUS];
|
||
|
-#define INVALID_PERCPU_AREA (-(long)__per_cpu_start)
|
||
|
+
|
||
|
+/*
|
||
|
+ * Force uses of per_cpu() with an invalid area to attempt to access the
|
||
|
+ * middle of the non-canonical address space resulting in a #GP, rather than a
|
||
|
+ * possible #PF at (NULL + a little) which has security implications in the
|
||
|
+ * context of PV guests.
|
||
|
+ */
|
||
|
+#define INVALID_PERCPU_AREA (0x8000000000000000L - (long)__per_cpu_start)
|
||
|
#define PERCPU_ORDER (get_order_from_bytes(__per_cpu_data_end-__per_cpu_start))
|
||
|
|
||
|
void __init percpu_init_areas(void)
|