lkml.org 
[lkml]   [2010]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH] x86: fix CFI macro invocations to deal with shortcomings in gas
    Date
    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 \
    >
    >


    \
     
     \ /
      Last update: 2010-10-19 23:05    [W:0.054 / U:61.440 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site