* [PATCH] x86: fix CFI macro invocations to deal with shortcomings in gas
@ 2010-10-19 13:52 Jan Beulich
2010-10-19 21:03 ` Alexander van Heukelum
2010-10-19 21:14 ` H. Peter Anvin
0 siblings, 2 replies; 3+ messages in thread
From: Jan Beulich @ 2010-10-19 13:52 UTC (permalink / raw)
To: mingo, tglx, akpm, hpa; +Cc: heukelum, linux-kbuild, linux-kernel
gas prior to (perhaps) 2.16.90 has problems with passing non-
parenthesized expressions containing spaces to macros. Spaces, however,
get inserted by cpp between any macro expanding to a number and a
subsequent + or -. For the +, current x86 gas then removes the space
again (future gas may not do so), but for the - the space gets retained
and is then considered a separator between macro arguments.
Fix the respective definitions for both the - and + cases, so that they
neither contain spaces nor make cpp insert any (the latter by adding
seemingly redundant parentheses).
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Cc: Alexander van Heukelum <heukelum@fastmail.fm>
---
Kbuild | 2 -
arch/x86/include/asm/calling.h | 52 +++++++++++++++++++-------------------
arch/x86/include/asm/entry_arch.h | 19 ++-----------
arch/x86/include/asm/segment.h | 32 +++++++++++------------
arch/x86/kernel/asm-offsets_32.c | 4 --
arch/x86/kernel/entry_32.S | 6 ++--
arch/x86/kernel/entry_64.S | 20 ++------------
7 files changed, 56 insertions(+), 79 deletions(-)
--- 2.6.36-rc8-x86-cfi.orig/Kbuild
+++ 2.6.36-rc8-x86-cfi/Kbuild
@@ -53,7 +53,7 @@ targets += arch/$(SRCARCH)/kernel/asm-of
# Default sed regexp - multiline due to syntax constraints
define sed-y
"/^->/{s:->#\(.*\):/* \1 */:; \
- s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
+ s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 (\2) /* \3 */:; \
s:->::; p;}"
endef
--- 2.6.36-rc8-x86-cfi.orig/arch/x86/include/asm/calling.h
+++ 2.6.36-rc8-x86-cfi/arch/x86/include/asm/calling.h
@@ -48,36 +48,38 @@ For 32-bit we have the following convent
/*
- * 64-bit system call stack frame layout defines and helpers,
- * for assembly code:
+ * 64-bit system call stack frame layout defines and helpers, for
+ * assembly code (note that the seemingly unnecessary parentheses
+ * are to prevent cpp from inserting spaces in expressions that get
+ * passed to macros):
*/
-#define R15 0
-#define R14 8
-#define R13 16
-#define R12 24
-#define RBP 32
-#define RBX 40
+#define R15 (0)
+#define R14 (8)
+#define R13 (16)
+#define R12 (24)
+#define RBP (32)
+#define RBX (40)
/* arguments: interrupts/non tracing syscalls only save up to here: */
-#define R11 48
-#define R10 56
-#define R9 64
-#define R8 72
-#define RAX 80
-#define RCX 88
-#define RDX 96
-#define RSI 104
-#define RDI 112
-#define ORIG_RAX 120 /* + error_code */
+#define R11 (48)
+#define R10 (56)
+#define R9 (64)
+#define R8 (72)
+#define RAX (80)
+#define RCX (88)
+#define RDX (96)
+#define RSI (104)
+#define RDI (112)
+#define ORIG_RAX (120) /* + error_code */
/* end of arguments */
/* cpu exception frame or undefined in case of fast syscall: */
-#define RIP 128
-#define CS 136
-#define EFLAGS 144
-#define RSP 152
-#define SS 160
+#define RIP (128)
+#define CS (136)
+#define EFLAGS (144)
+#define RSP (152)
+#define SS (160)
#define ARGOFFSET R11
#define SWFRAME ORIG_RAX
@@ -111,7 +113,7 @@ For 32-bit we have the following convent
.endif
.endm
-#define ARG_SKIP 9*8
+#define ARG_SKIP (9*8)
.macro RESTORE_ARGS skiprax=0, addskip=0, skiprcx=0, skipr11=0, \
skipr8910=0, skiprdx=0
@@ -169,7 +171,7 @@ For 32-bit we have the following convent
.endif
.endm
-#define REST_SKIP 6*8
+#define REST_SKIP (6*8)
.macro SAVE_REST
subq $REST_SKIP, %rsp
--- 2.6.36-rc8-x86-cfi.orig/arch/x86/include/asm/entry_arch.h
+++ 2.6.36-rc8-x86-cfi/arch/x86/include/asm/entry_arch.h
@@ -16,22 +16,11 @@ BUILD_INTERRUPT(call_function_single_int
BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR)
BUILD_INTERRUPT(reboot_interrupt,REBOOT_VECTOR)
-BUILD_INTERRUPT3(invalidate_interrupt0,INVALIDATE_TLB_VECTOR_START+0,
- smp_invalidate_interrupt)
-BUILD_INTERRUPT3(invalidate_interrupt1,INVALIDATE_TLB_VECTOR_START+1,
- smp_invalidate_interrupt)
-BUILD_INTERRUPT3(invalidate_interrupt2,INVALIDATE_TLB_VECTOR_START+2,
- smp_invalidate_interrupt)
-BUILD_INTERRUPT3(invalidate_interrupt3,INVALIDATE_TLB_VECTOR_START+3,
- smp_invalidate_interrupt)
-BUILD_INTERRUPT3(invalidate_interrupt4,INVALIDATE_TLB_VECTOR_START+4,
- smp_invalidate_interrupt)
-BUILD_INTERRUPT3(invalidate_interrupt5,INVALIDATE_TLB_VECTOR_START+5,
- smp_invalidate_interrupt)
-BUILD_INTERRUPT3(invalidate_interrupt6,INVALIDATE_TLB_VECTOR_START+6,
- smp_invalidate_interrupt)
-BUILD_INTERRUPT3(invalidate_interrupt7,INVALIDATE_TLB_VECTOR_START+7,
+.irpc idx, "01234567"
+BUILD_INTERRUPT3(invalidate_interrupt\idx,
+ (INVALIDATE_TLB_VECTOR_START)+\idx,
smp_invalidate_interrupt)
+.endr
#endif
BUILD_INTERRUPT(x86_platform_ipi, X86_PLATFORM_IPI_VECTOR)
--- 2.6.36-rc8-x86-cfi.orig/arch/x86/include/asm/segment.h
+++ 2.6.36-rc8-x86-cfi/arch/x86/include/asm/segment.h
@@ -73,31 +73,31 @@
#define GDT_ENTRY_DEFAULT_USER_DS 15
-#define GDT_ENTRY_KERNEL_BASE 12
+#define GDT_ENTRY_KERNEL_BASE (12)
-#define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE + 0)
+#define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE+0)
-#define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1)
+#define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE+1)
-#define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE + 4)
-#define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE + 5)
+#define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE+4)
+#define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE+5)
-#define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 6)
-#define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 11)
+#define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE+6)
+#define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE+11)
-#define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE + 14)
-#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8)
+#define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE+14)
+#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS*8)
-#define GDT_ENTRY_PERCPU (GDT_ENTRY_KERNEL_BASE + 15)
+#define GDT_ENTRY_PERCPU (GDT_ENTRY_KERNEL_BASE+15)
#ifdef CONFIG_SMP
#define __KERNEL_PERCPU (GDT_ENTRY_PERCPU * 8)
#else
#define __KERNEL_PERCPU 0
#endif
-#define GDT_ENTRY_STACK_CANARY (GDT_ENTRY_KERNEL_BASE + 16)
+#define GDT_ENTRY_STACK_CANARY (GDT_ENTRY_KERNEL_BASE+16)
#ifdef CONFIG_CC_STACKPROTECTOR
-#define __KERNEL_STACK_CANARY (GDT_ENTRY_STACK_CANARY * 8)
+#define __KERNEL_STACK_CANARY (GDT_ENTRY_STACK_CANARY*8)
#else
#define __KERNEL_STACK_CANARY 0
#endif
@@ -182,10 +182,10 @@
#endif
-#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8)
-#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8)
-#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3)
-#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3)
+#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8)
+#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8)
+#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8+3)
+#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8+3)
#ifndef CONFIG_PARAVIRT
#define get_kernel_rpl() 0
#endif
--- 2.6.36-rc8-x86-cfi.orig/arch/x86/kernel/asm-offsets_32.c
+++ 2.6.36-rc8-x86-cfi/arch/x86/kernel/asm-offsets_32.c
@@ -99,9 +99,7 @@ void foo(void)
DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
DEFINE(PAGE_SHIFT_asm, PAGE_SHIFT);
- DEFINE(PTRS_PER_PTE, PTRS_PER_PTE);
- DEFINE(PTRS_PER_PMD, PTRS_PER_PMD);
- DEFINE(PTRS_PER_PGD, PTRS_PER_PGD);
+ DEFINE(THREAD_SIZE_asm, THREAD_SIZE);
OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx);
--- 2.6.36-rc8-x86-cfi.orig/arch/x86/kernel/entry_32.S
+++ 2.6.36-rc8-x86-cfi/arch/x86/kernel/entry_32.S
@@ -382,20 +382,20 @@ sysenter_past_esp:
* enough kernel state to call TRACE_IRQS_OFF can be called - but
* we immediately enable interrupts at that point anyway.
*/
- pushl_cfi $(__USER_DS)
+ pushl_cfi $__USER_DS
/*CFI_REL_OFFSET ss, 0*/
pushl_cfi %ebp
CFI_REL_OFFSET esp, 0
pushfl_cfi
orl $X86_EFLAGS_IF, (%esp)
- pushl_cfi $(__USER_CS)
+ pushl_cfi $__USER_CS
/*CFI_REL_OFFSET cs, 0*/
/*
* Push current_thread_info()->sysenter_return to the stack.
* A tiny bit of offset fixup is necessary - 4*4 means the 4 words
* pushed above; +8 corresponds to copy_thread's esp0 setting.
*/
- pushl_cfi (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
+ pushl_cfi TI_sysenter_return-THREAD_SIZE_asm+8+4*4(%esp)
CFI_REL_OFFSET eip, 0
pushl_cfi %eax
--- 2.6.36-rc8-x86-cfi.orig/arch/x86/kernel/entry_64.S
+++ 2.6.36-rc8-x86-cfi/arch/x86/kernel/entry_64.S
@@ -964,22 +964,10 @@ apicinterrupt X86_PLATFORM_IPI_VECTOR \
x86_platform_ipi smp_x86_platform_ipi
#ifdef CONFIG_SMP
-apicinterrupt INVALIDATE_TLB_VECTOR_START+0 \
- invalidate_interrupt0 smp_invalidate_interrupt
-apicinterrupt INVALIDATE_TLB_VECTOR_START+1 \
- invalidate_interrupt1 smp_invalidate_interrupt
-apicinterrupt INVALIDATE_TLB_VECTOR_START+2 \
- invalidate_interrupt2 smp_invalidate_interrupt
-apicinterrupt INVALIDATE_TLB_VECTOR_START+3 \
- invalidate_interrupt3 smp_invalidate_interrupt
-apicinterrupt INVALIDATE_TLB_VECTOR_START+4 \
- invalidate_interrupt4 smp_invalidate_interrupt
-apicinterrupt INVALIDATE_TLB_VECTOR_START+5 \
- invalidate_interrupt5 smp_invalidate_interrupt
-apicinterrupt INVALIDATE_TLB_VECTOR_START+6 \
- invalidate_interrupt6 smp_invalidate_interrupt
-apicinterrupt INVALIDATE_TLB_VECTOR_START+7 \
- invalidate_interrupt7 smp_invalidate_interrupt
+.irpc idx, "01234567"
+apicinterrupt (INVALIDATE_TLB_VECTOR_START)+\idx \
+ invalidate_interrupt\idx smp_invalidate_interrupt
+.endr
#endif
apicinterrupt THRESHOLD_APIC_VECTOR \
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] x86: fix CFI macro invocations to deal with shortcomings in gas
2010-10-19 13:52 [PATCH] x86: fix CFI macro invocations to deal with shortcomings in gas Jan Beulich
@ 2010-10-19 21:03 ` Alexander van Heukelum
2010-10-19 21:14 ` H. Peter Anvin
1 sibling, 0 replies; 3+ messages in thread
From: Alexander van Heukelum @ 2010-10-19 21:03 UTC (permalink / raw)
To: Jan Beulich, Ingo Molnar, Thomas Gleixner, Andrew Morton,
H. Peter Anvin
Cc: linux-kbuild, linux-kernel
Hallo Jan Beulich,
I checked the patch on i386 using an old Ubuntu image.
On Tue, 19 Oct 2010 14:52 +0100, "Jan Beulich" <JBeulich@novell.com> wrote:
> gas prior to (perhaps) 2.16.90 has problems with passing non-
> parenthesized expressions containing spaces to macros. Spaces, however,
> get inserted by cpp between any macro expanding to a number and a
> subsequent + or -. For the +, current x86 gas then removes the space
> again (future gas may not do so), but for the - the space gets retained
> and is then considered a separator between macro arguments.
>
> Fix the respective definitions for both the - and + cases, so that they
> neither contain spaces nor make cpp insert any (the latter by adding
> seemingly redundant parentheses).
>
> Signed-off-by: Jan Beulich <jbeulich@novell.com>
> Cc: Alexander van Heukelum <heukelum@fastmail.fm>
>
> ---
> Kbuild | 2 -
> arch/x86/include/asm/calling.h | 52
> +++++++++++++++++++-------------------
> arch/x86/include/asm/entry_arch.h | 19 ++-----------
> arch/x86/include/asm/segment.h | 32 +++++++++++------------
> arch/x86/kernel/asm-offsets_32.c | 4 --
> arch/x86/kernel/entry_32.S | 6 ++--
> arch/x86/kernel/entry_64.S | 20 ++------------
> 7 files changed, 56 insertions(+), 79 deletions(-)
>
> --- 2.6.36-rc8-x86-cfi.orig/Kbuild
> +++ 2.6.36-rc8-x86-cfi/Kbuild
> @@ -53,7 +53,7 @@ targets += arch/$(SRCARCH)/kernel/asm-of
> # Default sed regexp - multiline due to syntax constraints
> define sed-y
> "/^->/{s:->#\(.*\):/* \1 */:; \
> - s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
> + s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 (\2) /* \3 */:;
> \
> s:->::; p;}"
> endef
>
> --- 2.6.36-rc8-x86-cfi.orig/arch/x86/include/asm/calling.h
> +++ 2.6.36-rc8-x86-cfi/arch/x86/include/asm/calling.h
> @@ -48,36 +48,38 @@ For 32-bit we have the following convent
>
>
> /*
> - * 64-bit system call stack frame layout defines and helpers,
> - * for assembly code:
> + * 64-bit system call stack frame layout defines and helpers, for
> + * assembly code (note that the seemingly unnecessary parentheses
> + * are to prevent cpp from inserting spaces in expressions that get
> + * passed to macros):
> */
>
> -#define R15 0
> -#define R14 8
> -#define R13 16
> -#define R12 24
> -#define RBP 32
> -#define RBX 40
> +#define R15 (0)
> +#define R14 (8)
> +#define R13 (16)
> +#define R12 (24)
> +#define RBP (32)
> +#define RBX (40)
>
> /* arguments: interrupts/non tracing syscalls only save up to here: */
> -#define R11 48
> -#define R10 56
> -#define R9 64
> -#define R8 72
> -#define RAX 80
> -#define RCX 88
> -#define RDX 96
> -#define RSI 104
> -#define RDI 112
> -#define ORIG_RAX 120 /* + error_code */
> +#define R11 (48)
> +#define R10 (56)
> +#define R9 (64)
> +#define R8 (72)
> +#define RAX (80)
> +#define RCX (88)
> +#define RDX (96)
> +#define RSI (104)
> +#define RDI (112)
> +#define ORIG_RAX (120) /* + error_code */
> /* end of arguments */
>
> /* cpu exception frame or undefined in case of fast syscall: */
> -#define RIP 128
> -#define CS 136
> -#define EFLAGS 144
> -#define RSP 152
> -#define SS 160
> +#define RIP (128)
> +#define CS (136)
> +#define EFLAGS (144)
> +#define RSP (152)
> +#define SS (160)
>
> #define ARGOFFSET R11
> #define SWFRAME ORIG_RAX
> @@ -111,7 +113,7 @@ For 32-bit we have the following convent
> .endif
> .endm
>
> -#define ARG_SKIP 9*8
> +#define ARG_SKIP (9*8)
>
> .macro RESTORE_ARGS skiprax=0, addskip=0, skiprcx=0, skipr11=0, \
> skipr8910=0, skiprdx=0
> @@ -169,7 +171,7 @@ For 32-bit we have the following convent
> .endif
> .endm
>
> -#define REST_SKIP 6*8
> +#define REST_SKIP (6*8)
>
> .macro SAVE_REST
> subq $REST_SKIP, %rsp
> --- 2.6.36-rc8-x86-cfi.orig/arch/x86/include/asm/entry_arch.h
> +++ 2.6.36-rc8-x86-cfi/arch/x86/include/asm/entry_arch.h
> @@ -16,22 +16,11 @@ BUILD_INTERRUPT(call_function_single_int
> BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR)
> BUILD_INTERRUPT(reboot_interrupt,REBOOT_VECTOR)
>
> -BUILD_INTERRUPT3(invalidate_interrupt0,INVALIDATE_TLB_VECTOR_START+0,
> - smp_invalidate_interrupt)
> -BUILD_INTERRUPT3(invalidate_interrupt1,INVALIDATE_TLB_VECTOR_START+1,
> - smp_invalidate_interrupt)
> -BUILD_INTERRUPT3(invalidate_interrupt2,INVALIDATE_TLB_VECTOR_START+2,
> - smp_invalidate_interrupt)
> -BUILD_INTERRUPT3(invalidate_interrupt3,INVALIDATE_TLB_VECTOR_START+3,
> - smp_invalidate_interrupt)
> -BUILD_INTERRUPT3(invalidate_interrupt4,INVALIDATE_TLB_VECTOR_START+4,
> - smp_invalidate_interrupt)
> -BUILD_INTERRUPT3(invalidate_interrupt5,INVALIDATE_TLB_VECTOR_START+5,
> - smp_invalidate_interrupt)
> -BUILD_INTERRUPT3(invalidate_interrupt6,INVALIDATE_TLB_VECTOR_START+6,
> - smp_invalidate_interrupt)
> -BUILD_INTERRUPT3(invalidate_interrupt7,INVALIDATE_TLB_VECTOR_START+7,
> +.irpc idx, "01234567"
> +BUILD_INTERRUPT3(invalidate_interrupt\idx,
> + (INVALIDATE_TLB_VECTOR_START)+\idx,
> smp_invalidate_interrupt)
> +.endr
> #endif
>
> BUILD_INTERRUPT(x86_platform_ipi, X86_PLATFORM_IPI_VECTOR)
> --- 2.6.36-rc8-x86-cfi.orig/arch/x86/include/asm/segment.h
> +++ 2.6.36-rc8-x86-cfi/arch/x86/include/asm/segment.h
> @@ -73,31 +73,31 @@
>
> #define GDT_ENTRY_DEFAULT_USER_DS 15
>
> -#define GDT_ENTRY_KERNEL_BASE 12
> +#define GDT_ENTRY_KERNEL_BASE (12)
>
> -#define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE + 0)
> +#define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE+0)
>
> -#define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1)
> +#define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE+1)
>
> -#define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE + 4)
> -#define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE + 5)
> +#define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE+4)
> +#define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE+5)
>
> -#define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 6)
> -#define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 11)
> +#define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE+6)
> +#define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE+11)
>
> -#define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE + 14)
> -#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8)
> +#define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE+14)
> +#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS*8)
>
> -#define GDT_ENTRY_PERCPU (GDT_ENTRY_KERNEL_BASE +
> 15)
> +#define GDT_ENTRY_PERCPU (GDT_ENTRY_KERNEL_BASE+15)
> #ifdef CONFIG_SMP
> #define __KERNEL_PERCPU (GDT_ENTRY_PERCPU * 8)
> #else
> #define __KERNEL_PERCPU 0
> #endif
>
> -#define GDT_ENTRY_STACK_CANARY (GDT_ENTRY_KERNEL_BASE + 16)
> +#define GDT_ENTRY_STACK_CANARY (GDT_ENTRY_KERNEL_BASE+16)
> #ifdef CONFIG_CC_STACKPROTECTOR
> -#define __KERNEL_STACK_CANARY (GDT_ENTRY_STACK_CANARY * 8)
> +#define __KERNEL_STACK_CANARY (GDT_ENTRY_STACK_CANARY*8)
> #else
> #define __KERNEL_STACK_CANARY 0
> #endif
> @@ -182,10 +182,10 @@
>
> #endif
>
> -#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8)
> -#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8)
> -#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3)
> -#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3)
> +#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8)
> +#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8)
> +#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8+3)
> +#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8+3)
> #ifndef CONFIG_PARAVIRT
> #define get_kernel_rpl() 0
> #endif
> --- 2.6.36-rc8-x86-cfi.orig/arch/x86/kernel/asm-offsets_32.c
> +++ 2.6.36-rc8-x86-cfi/arch/x86/kernel/asm-offsets_32.c
> @@ -99,9 +99,7 @@ void foo(void)
>
> DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
> DEFINE(PAGE_SHIFT_asm, PAGE_SHIFT);
> - DEFINE(PTRS_PER_PTE, PTRS_PER_PTE);
> - DEFINE(PTRS_PER_PMD, PTRS_PER_PMD);
> - DEFINE(PTRS_PER_PGD, PTRS_PER_PGD);
> + DEFINE(THREAD_SIZE_asm, THREAD_SIZE);
>
> OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx);
>
> --- 2.6.36-rc8-x86-cfi.orig/arch/x86/kernel/entry_32.S
> +++ 2.6.36-rc8-x86-cfi/arch/x86/kernel/entry_32.S
> @@ -382,20 +382,20 @@ sysenter_past_esp:
> * enough kernel state to call TRACE_IRQS_OFF can be called - but
> * we immediately enable interrupts at that point anyway.
> */
> - pushl_cfi $(__USER_DS)
> + pushl_cfi $__USER_DS
> /*CFI_REL_OFFSET ss, 0*/
> pushl_cfi %ebp
> CFI_REL_OFFSET esp, 0
> pushfl_cfi
> orl $X86_EFLAGS_IF, (%esp)
> - pushl_cfi $(__USER_CS)
> + pushl_cfi $__USER_CS
> /*CFI_REL_OFFSET cs, 0*/
> /*
> * Push current_thread_info()->sysenter_return to the stack.
> * A tiny bit of offset fixup is necessary - 4*4 means the 4 words
> * pushed above; +8 corresponds to copy_thread's esp0 setting.
> */
> - pushl_cfi (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
> + pushl_cfi TI_sysenter_return-THREAD_SIZE_asm+8+4*4(%esp)
This expands to:
pushl_cfi (60)-(8192)+8+4*4(%esp)
I'm sorry to say that Ubuntu 6.06's gas (2.16.91 20060118) still chokes
with "too many positional arguments" on this line.
The other ones have disappeared.
Greetings,
Alexander van Heukelum
> CFI_REL_OFFSET eip, 0
>
> pushl_cfi %eax
> --- 2.6.36-rc8-x86-cfi.orig/arch/x86/kernel/entry_64.S
> +++ 2.6.36-rc8-x86-cfi/arch/x86/kernel/entry_64.S
> @@ -964,22 +964,10 @@ apicinterrupt X86_PLATFORM_IPI_VECTOR \
> x86_platform_ipi smp_x86_platform_ipi
>
> #ifdef CONFIG_SMP
> -apicinterrupt INVALIDATE_TLB_VECTOR_START+0 \
> - invalidate_interrupt0 smp_invalidate_interrupt
> -apicinterrupt INVALIDATE_TLB_VECTOR_START+1 \
> - invalidate_interrupt1 smp_invalidate_interrupt
> -apicinterrupt INVALIDATE_TLB_VECTOR_START+2 \
> - invalidate_interrupt2 smp_invalidate_interrupt
> -apicinterrupt INVALIDATE_TLB_VECTOR_START+3 \
> - invalidate_interrupt3 smp_invalidate_interrupt
> -apicinterrupt INVALIDATE_TLB_VECTOR_START+4 \
> - invalidate_interrupt4 smp_invalidate_interrupt
> -apicinterrupt INVALIDATE_TLB_VECTOR_START+5 \
> - invalidate_interrupt5 smp_invalidate_interrupt
> -apicinterrupt INVALIDATE_TLB_VECTOR_START+6 \
> - invalidate_interrupt6 smp_invalidate_interrupt
> -apicinterrupt INVALIDATE_TLB_VECTOR_START+7 \
> - invalidate_interrupt7 smp_invalidate_interrupt
> +.irpc idx, "01234567"
> +apicinterrupt (INVALIDATE_TLB_VECTOR_START)+\idx \
> + invalidate_interrupt\idx smp_invalidate_interrupt
> +.endr
> #endif
>
> apicinterrupt THRESHOLD_APIC_VECTOR \
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] x86: fix CFI macro invocations to deal with shortcomings in gas
2010-10-19 13:52 [PATCH] x86: fix CFI macro invocations to deal with shortcomings in gas Jan Beulich
2010-10-19 21:03 ` Alexander van Heukelum
@ 2010-10-19 21:14 ` H. Peter Anvin
1 sibling, 0 replies; 3+ messages in thread
From: H. Peter Anvin @ 2010-10-19 21:14 UTC (permalink / raw)
To: Jan Beulich; +Cc: mingo, tglx, akpm, heukelum, linux-kbuild, linux-kernel
On 10/19/2010 06:52 AM, Jan Beulich wrote:
> gas prior to (perhaps) 2.16.90 has problems with passing non-
> parenthesized expressions containing spaces to macros. Spaces, however,
> get inserted by cpp between any macro expanding to a number and a
> subsequent + or -. For the +, current x86 gas then removes the space
> again (future gas may not do so), but for the - the space gets retained
> and is then considered a separator between macro arguments.
>
> Fix the respective definitions for both the - and + cases, so that they
> neither contain spaces nor make cpp insert any (the latter by adding
> seemingly redundant parentheses).
>
> Signed-off-by: Jan Beulich <jbeulich@novell.com>
> Cc: Alexander van Heukelum <heukelum@fastmail.fm>
>
It's ugly -- very ugly -- and will almost certainly bitrot and break
again, but it's a lot less ugly than any other alternative I can think
of. Unfortunately these versions of gas are not old enough that we can
just kill them off, I don't think.
-hpa
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-10-19 21:15 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-19 13:52 [PATCH] x86: fix CFI macro invocations to deal with shortcomings in gas Jan Beulich
2010-10-19 21:03 ` Alexander van Heukelum
2010-10-19 21:14 ` H. Peter Anvin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox