diff options
| author | Jan Beulich <JBeulich@novell.com> | 2010-10-19 09:52:26 -0400 |
|---|---|---|
| committer | H. Peter Anvin <hpa@linux.intel.com> | 2010-10-19 17:28:02 -0400 |
| commit | 3234282f33b29d349bcada40204fc7c8fda7fe72 (patch) | |
| tree | d1855c5d9d8e6db25b72b17461da1459cd51fa71 | |
| parent | d0ed0c32662e756e7daf85e70a5a27a9c1111331 (diff) | |
x86, asm: Fix CFI macro invocations to deal with shortcomings in gas
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>
LKML-Reference: <4CBDBEBA020000780001E05A@vpn.id2.novell.com>
Cc: Alexander van Heukelum <heukelum@fastmail.fm>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
| -rw-r--r-- | Kbuild | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/calling.h | 52 | ||||
| -rw-r--r-- | arch/x86/include/asm/entry_arch.h | 19 | ||||
| -rw-r--r-- | arch/x86/include/asm/segment.h | 32 | ||||
| -rw-r--r-- | arch/x86/kernel/asm-offsets_32.c | 4 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_32.S | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/entry_64.S | 20 |
7 files changed, 56 insertions, 79 deletions
| @@ -53,7 +53,7 @@ targets += arch/$(SRCARCH)/kernel/asm-offsets.s | |||
| 53 | # Default sed regexp - multiline due to syntax constraints | 53 | # Default sed regexp - multiline due to syntax constraints |
| 54 | define sed-y | 54 | define sed-y |
| 55 | "/^->/{s:->#\(.*\):/* \1 */:; \ | 55 | "/^->/{s:->#\(.*\):/* \1 */:; \ |
| 56 | s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \ | 56 | s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 (\2) /* \3 */:; \ |
| 57 | s:->::; p;}" | 57 | s:->::; p;}" |
| 58 | endef | 58 | endef |
| 59 | 59 | ||
diff --git a/arch/x86/include/asm/calling.h b/arch/x86/include/asm/calling.h index 0e63c9a2a8d0..30af5a832163 100644 --- a/arch/x86/include/asm/calling.h +++ b/arch/x86/include/asm/calling.h | |||
| @@ -48,36 +48,38 @@ For 32-bit we have the following conventions - kernel is built with | |||
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | /* | 50 | /* |
| 51 | * 64-bit system call stack frame layout defines and helpers, | 51 | * 64-bit system call stack frame layout defines and helpers, for |
| 52 | * for assembly code: | 52 | * assembly code (note that the seemingly unnecessary parentheses |
| 53 | * are to prevent cpp from inserting spaces in expressions that get | ||
| 54 | * passed to macros): | ||
| 53 | */ | 55 | */ |
| 54 | 56 | ||
| 55 | #define R15 0 | 57 | #define R15 (0) |
| 56 | #define R14 8 | 58 | #define R14 (8) |
| 57 | #define R13 16 | 59 | #define R13 (16) |
| 58 | #define R12 24 | 60 | #define R12 (24) |
| 59 | #define RBP 32 | 61 | #define RBP (32) |
| 60 | #define RBX 40 | 62 | #define RBX (40) |
| 61 | 63 | ||
| 62 | /* arguments: interrupts/non tracing syscalls only save up to here: */ | 64 | /* arguments: interrupts/non tracing syscalls only save up to here: */ |
| 63 | #define R11 48 | 65 | #define R11 (48) |
| 64 | #define R10 56 | 66 | #define R10 (56) |
| 65 | #define R9 64 | 67 | #define R9 (64) |
| 66 | #define R8 72 | 68 | #define R8 (72) |
| 67 | #define RAX 80 | 69 | #define RAX (80) |
| 68 | #define RCX 88 | 70 | #define RCX (88) |
| 69 | #define RDX 96 | 71 | #define RDX (96) |
| 70 | #define RSI 104 | 72 | #define RSI (104) |
| 71 | #define RDI 112 | 73 | #define RDI (112) |
| 72 | #define ORIG_RAX 120 /* + error_code */ | 74 | #define ORIG_RAX (120) /* + error_code */ |
| 73 | /* end of arguments */ | 75 | /* end of arguments */ |
| 74 | 76 | ||
| 75 | /* cpu exception frame or undefined in case of fast syscall: */ | 77 | /* cpu exception frame or undefined in case of fast syscall: */ |
| 76 | #define RIP 128 | 78 | #define RIP (128) |
| 77 | #define CS 136 | 79 | #define CS (136) |
| 78 | #define EFLAGS 144 | 80 | #define EFLAGS (144) |
| 79 | #define RSP 152 | 81 | #define RSP (152) |
| 80 | #define SS 160 | 82 | #define SS (160) |
| 81 | 83 | ||
| 82 | #define ARGOFFSET R11 | 84 | #define ARGOFFSET R11 |
| 83 | #define SWFRAME ORIG_RAX | 85 | #define SWFRAME ORIG_RAX |
| @@ -111,7 +113,7 @@ For 32-bit we have the following conventions - kernel is built with | |||
| 111 | .endif | 113 | .endif |
| 112 | .endm | 114 | .endm |
| 113 | 115 | ||
| 114 | #define ARG_SKIP 9*8 | 116 | #define ARG_SKIP (9*8) |
| 115 | 117 | ||
| 116 | .macro RESTORE_ARGS skiprax=0, addskip=0, skiprcx=0, skipr11=0, \ | 118 | .macro RESTORE_ARGS skiprax=0, addskip=0, skiprcx=0, skipr11=0, \ |
| 117 | skipr8910=0, skiprdx=0 | 119 | skipr8910=0, skiprdx=0 |
| @@ -169,7 +171,7 @@ For 32-bit we have the following conventions - kernel is built with | |||
| 169 | .endif | 171 | .endif |
| 170 | .endm | 172 | .endm |
| 171 | 173 | ||
| 172 | #define REST_SKIP 6*8 | 174 | #define REST_SKIP (6*8) |
| 173 | 175 | ||
| 174 | .macro SAVE_REST | 176 | .macro SAVE_REST |
| 175 | subq $REST_SKIP, %rsp | 177 | subq $REST_SKIP, %rsp |
diff --git a/arch/x86/include/asm/entry_arch.h b/arch/x86/include/asm/entry_arch.h index 8e8ec663a98f..4d2966e7e858 100644 --- a/arch/x86/include/asm/entry_arch.h +++ b/arch/x86/include/asm/entry_arch.h | |||
| @@ -16,22 +16,11 @@ BUILD_INTERRUPT(call_function_single_interrupt,CALL_FUNCTION_SINGLE_VECTOR) | |||
| 16 | BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR) | 16 | BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR) |
| 17 | BUILD_INTERRUPT(reboot_interrupt,REBOOT_VECTOR) | 17 | BUILD_INTERRUPT(reboot_interrupt,REBOOT_VECTOR) |
| 18 | 18 | ||
| 19 | BUILD_INTERRUPT3(invalidate_interrupt0,INVALIDATE_TLB_VECTOR_START+0, | 19 | .irpc idx, "01234567" |
| 20 | smp_invalidate_interrupt) | 20 | BUILD_INTERRUPT3(invalidate_interrupt\idx, |
| 21 | BUILD_INTERRUPT3(invalidate_interrupt1,INVALIDATE_TLB_VECTOR_START+1, | 21 | (INVALIDATE_TLB_VECTOR_START)+\idx, |
| 22 | smp_invalidate_interrupt) | ||
| 23 | BUILD_INTERRUPT3(invalidate_interrupt2,INVALIDATE_TLB_VECTOR_START+2, | ||
| 24 | smp_invalidate_interrupt) | ||
| 25 | BUILD_INTERRUPT3(invalidate_interrupt3,INVALIDATE_TLB_VECTOR_START+3, | ||
| 26 | smp_invalidate_interrupt) | ||
| 27 | BUILD_INTERRUPT3(invalidate_interrupt4,INVALIDATE_TLB_VECTOR_START+4, | ||
| 28 | smp_invalidate_interrupt) | ||
| 29 | BUILD_INTERRUPT3(invalidate_interrupt5,INVALIDATE_TLB_VECTOR_START+5, | ||
| 30 | smp_invalidate_interrupt) | ||
| 31 | BUILD_INTERRUPT3(invalidate_interrupt6,INVALIDATE_TLB_VECTOR_START+6, | ||
| 32 | smp_invalidate_interrupt) | ||
| 33 | BUILD_INTERRUPT3(invalidate_interrupt7,INVALIDATE_TLB_VECTOR_START+7, | ||
| 34 | smp_invalidate_interrupt) | 22 | smp_invalidate_interrupt) |
| 23 | .endr | ||
| 35 | #endif | 24 | #endif |
| 36 | 25 | ||
| 37 | BUILD_INTERRUPT(x86_platform_ipi, X86_PLATFORM_IPI_VECTOR) | 26 | BUILD_INTERRUPT(x86_platform_ipi, X86_PLATFORM_IPI_VECTOR) |
diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 14e0ed86a6f9..231f1c1d6607 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h | |||
| @@ -73,31 +73,31 @@ | |||
| 73 | 73 | ||
| 74 | #define GDT_ENTRY_DEFAULT_USER_DS 15 | 74 | #define GDT_ENTRY_DEFAULT_USER_DS 15 |
| 75 | 75 | ||
| 76 | #define GDT_ENTRY_KERNEL_BASE 12 | 76 | #define GDT_ENTRY_KERNEL_BASE (12) |
| 77 | 77 | ||
| 78 | #define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE + 0) | 78 | #define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE+0) |
| 79 | 79 | ||
| 80 | #define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1) | 80 | #define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE+1) |
| 81 | 81 | ||
| 82 | #define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE + 4) | 82 | #define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE+4) |
| 83 | #define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE + 5) | 83 | #define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE+5) |
| 84 | 84 | ||
| 85 | #define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 6) | 85 | #define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE+6) |
| 86 | #define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 11) | 86 | #define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE+11) |
| 87 | 87 | ||
| 88 | #define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE + 14) | 88 | #define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE+14) |
| 89 | #define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8) | 89 | #define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS*8) |
| 90 | 90 | ||
| 91 | #define GDT_ENTRY_PERCPU (GDT_ENTRY_KERNEL_BASE + 15) | 91 | #define GDT_ENTRY_PERCPU (GDT_ENTRY_KERNEL_BASE+15) |
| 92 | #ifdef CONFIG_SMP | 92 | #ifdef CONFIG_SMP |
| 93 | #define __KERNEL_PERCPU (GDT_ENTRY_PERCPU * 8) | 93 | #define __KERNEL_PERCPU (GDT_ENTRY_PERCPU * 8) |
| 94 | #else | 94 | #else |
| 95 | #define __KERNEL_PERCPU 0 | 95 | #define __KERNEL_PERCPU 0 |
| 96 | #endif | 96 | #endif |
| 97 | 97 | ||
| 98 | #define GDT_ENTRY_STACK_CANARY (GDT_ENTRY_KERNEL_BASE + 16) | 98 | #define GDT_ENTRY_STACK_CANARY (GDT_ENTRY_KERNEL_BASE+16) |
| 99 | #ifdef CONFIG_CC_STACKPROTECTOR | 99 | #ifdef CONFIG_CC_STACKPROTECTOR |
| 100 | #define __KERNEL_STACK_CANARY (GDT_ENTRY_STACK_CANARY * 8) | 100 | #define __KERNEL_STACK_CANARY (GDT_ENTRY_STACK_CANARY*8) |
| 101 | #else | 101 | #else |
| 102 | #define __KERNEL_STACK_CANARY 0 | 102 | #define __KERNEL_STACK_CANARY 0 |
| 103 | #endif | 103 | #endif |
| @@ -182,10 +182,10 @@ | |||
| 182 | 182 | ||
| 183 | #endif | 183 | #endif |
| 184 | 184 | ||
| 185 | #define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8) | 185 | #define __KERNEL_CS (GDT_ENTRY_KERNEL_CS*8) |
| 186 | #define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8) | 186 | #define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8) |
| 187 | #define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3) | 187 | #define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8+3) |
| 188 | #define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3) | 188 | #define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8+3) |
| 189 | #ifndef CONFIG_PARAVIRT | 189 | #ifndef CONFIG_PARAVIRT |
| 190 | #define get_kernel_rpl() 0 | 190 | #define get_kernel_rpl() 0 |
| 191 | #endif | 191 | #endif |
diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c index dfdbf6403895..1a4088dda37a 100644 --- a/arch/x86/kernel/asm-offsets_32.c +++ b/arch/x86/kernel/asm-offsets_32.c | |||
| @@ -99,9 +99,7 @@ void foo(void) | |||
| 99 | 99 | ||
| 100 | DEFINE(PAGE_SIZE_asm, PAGE_SIZE); | 100 | DEFINE(PAGE_SIZE_asm, PAGE_SIZE); |
| 101 | DEFINE(PAGE_SHIFT_asm, PAGE_SHIFT); | 101 | DEFINE(PAGE_SHIFT_asm, PAGE_SHIFT); |
| 102 | DEFINE(PTRS_PER_PTE, PTRS_PER_PTE); | 102 | DEFINE(THREAD_SIZE_asm, THREAD_SIZE); |
| 103 | DEFINE(PTRS_PER_PMD, PTRS_PER_PMD); | ||
| 104 | DEFINE(PTRS_PER_PGD, PTRS_PER_PGD); | ||
| 105 | 103 | ||
| 106 | OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx); | 104 | OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx); |
| 107 | 105 | ||
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 9fb188d7bc76..f73a4b881aa9 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -382,20 +382,20 @@ sysenter_past_esp: | |||
| 382 | * enough kernel state to call TRACE_IRQS_OFF can be called - but | 382 | * enough kernel state to call TRACE_IRQS_OFF can be called - but |
| 383 | * we immediately enable interrupts at that point anyway. | 383 | * we immediately enable interrupts at that point anyway. |
| 384 | */ | 384 | */ |
| 385 | pushl_cfi $(__USER_DS) | 385 | pushl_cfi $__USER_DS |
| 386 | /*CFI_REL_OFFSET ss, 0*/ | 386 | /*CFI_REL_OFFSET ss, 0*/ |
| 387 | pushl_cfi %ebp | 387 | pushl_cfi %ebp |
| 388 | CFI_REL_OFFSET esp, 0 | 388 | CFI_REL_OFFSET esp, 0 |
| 389 | pushfl_cfi | 389 | pushfl_cfi |
| 390 | orl $X86_EFLAGS_IF, (%esp) | 390 | orl $X86_EFLAGS_IF, (%esp) |
| 391 | pushl_cfi $(__USER_CS) | 391 | pushl_cfi $__USER_CS |
| 392 | /*CFI_REL_OFFSET cs, 0*/ | 392 | /*CFI_REL_OFFSET cs, 0*/ |
| 393 | /* | 393 | /* |
| 394 | * Push current_thread_info()->sysenter_return to the stack. | 394 | * Push current_thread_info()->sysenter_return to the stack. |
| 395 | * A tiny bit of offset fixup is necessary - 4*4 means the 4 words | 395 | * A tiny bit of offset fixup is necessary - 4*4 means the 4 words |
| 396 | * pushed above; +8 corresponds to copy_thread's esp0 setting. | 396 | * pushed above; +8 corresponds to copy_thread's esp0 setting. |
| 397 | */ | 397 | */ |
| 398 | pushl_cfi (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp) | 398 | pushl_cfi TI_sysenter_return-THREAD_SIZE_asm+8+4*4(%esp) |
| 399 | CFI_REL_OFFSET eip, 0 | 399 | CFI_REL_OFFSET eip, 0 |
| 400 | 400 | ||
| 401 | pushl_cfi %eax | 401 | pushl_cfi %eax |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 8851a2bb8c0b..9cc9a71f8fb7 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -963,22 +963,10 @@ apicinterrupt X86_PLATFORM_IPI_VECTOR \ | |||
| 963 | x86_platform_ipi smp_x86_platform_ipi | 963 | x86_platform_ipi smp_x86_platform_ipi |
| 964 | 964 | ||
| 965 | #ifdef CONFIG_SMP | 965 | #ifdef CONFIG_SMP |
| 966 | apicinterrupt INVALIDATE_TLB_VECTOR_START+0 \ | 966 | .irpc idx, "01234567" |
| 967 | invalidate_interrupt0 smp_invalidate_interrupt | 967 | apicinterrupt (INVALIDATE_TLB_VECTOR_START)+\idx \ |
| 968 | apicinterrupt INVALIDATE_TLB_VECTOR_START+1 \ | 968 | invalidate_interrupt\idx smp_invalidate_interrupt |
| 969 | invalidate_interrupt1 smp_invalidate_interrupt | 969 | .endr |
| 970 | apicinterrupt INVALIDATE_TLB_VECTOR_START+2 \ | ||
| 971 | invalidate_interrupt2 smp_invalidate_interrupt | ||
| 972 | apicinterrupt INVALIDATE_TLB_VECTOR_START+3 \ | ||
| 973 | invalidate_interrupt3 smp_invalidate_interrupt | ||
| 974 | apicinterrupt INVALIDATE_TLB_VECTOR_START+4 \ | ||
| 975 | invalidate_interrupt4 smp_invalidate_interrupt | ||
| 976 | apicinterrupt INVALIDATE_TLB_VECTOR_START+5 \ | ||
| 977 | invalidate_interrupt5 smp_invalidate_interrupt | ||
| 978 | apicinterrupt INVALIDATE_TLB_VECTOR_START+6 \ | ||
| 979 | invalidate_interrupt6 smp_invalidate_interrupt | ||
| 980 | apicinterrupt INVALIDATE_TLB_VECTOR_START+7 \ | ||
| 981 | invalidate_interrupt7 smp_invalidate_interrupt | ||
| 982 | #endif | 970 | #endif |
| 983 | 971 | ||
| 984 | apicinterrupt THRESHOLD_APIC_VECTOR \ | 972 | apicinterrupt THRESHOLD_APIC_VECTOR \ |
