Re: [PATCH] x86_64: Work around old gas bug

From: Jan Beulich
Date: Wed Sep 26 2012 - 06:18:05 EST


>>> On 26.09.12 at 10:28, Tao Guo <glorioustao@xxxxxxxxx> wrote:
> gas in binutils(2.16.91) could not parse parentheses within macro
> parameters unless fully parenthesized, and this is a workaround to
> make old gas work without generating below errors:
> arch/x86/kernel/entry_64.S: Assembler messages:
> arch/x86/kernel/entry_64.S:387: Error: too many positional arguments
> arch/x86/kernel/entry_64.S:389: Error: too many positional arguments
> arch/x86/kernel/entry_64.S:390: Error: too many positional arguments
> arch/x86/kernel/entry_64.S:391: Error: too many positional arguments
> arch/x86/kernel/entry_64.S:392: Error: too many positional arguments
> arch/x86/kernel/entry_64.S:393: Error: too many positional arguments
> arch/x86/kernel/entry_64.S:394: Error: too many positional arguments
>
> Signed-off-by: Tao Guo <glorioustao@xxxxxxxxx>

This looks okay now to me, but I'm somewhat reluctant to formally
ack it given that we know how broken those particular gas
versions are.

Jan

> ---
> arch/x86/include/asm/calling.h | 48 +++++++++++++++++++--------------------
> arch/x86/kernel/entry_64.S | 20 ++++++++--------
> 2 files changed, 33 insertions(+), 35 deletions(-)
>
> diff --git a/arch/x86/include/asm/calling.h b/arch/x86/include/asm/calling.h
> index a9e3a74..7f8422a 100644
> --- a/arch/x86/include/asm/calling.h
> +++ b/arch/x86/include/asm/calling.h
> @@ -49,38 +49,36 @@ For 32-bit we have the following conventions - kernel is
> built with
> #include "dwarf2.h"
>
> /*
> - * 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):
> + * 64-bit system call stack frame layout defines and helpers,
> + * for assembly code:
> */
>
> -#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
> diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
> index 69babd8..bf77e70 100644
> --- a/arch/x86/kernel/entry_64.S
> +++ b/arch/x86/kernel/entry_64.S
> @@ -342,15 +342,15 @@ ENDPROC(native_usergs_sysret64)
> .macro SAVE_ARGS_IRQ
> cld
> /* start from rbp in pt_regs and jump over */
> - movq_cfi rdi, RDI-RBP
> - movq_cfi rsi, RSI-RBP
> - movq_cfi rdx, RDX-RBP
> - movq_cfi rcx, RCX-RBP
> - movq_cfi rax, RAX-RBP
> - movq_cfi r8, R8-RBP
> - movq_cfi r9, R9-RBP
> - movq_cfi r10, R10-RBP
> - movq_cfi r11, R11-RBP
> + movq_cfi rdi, (RDI-RBP)
> + movq_cfi rsi, (RSI-RBP)
> + movq_cfi rdx, (RDX-RBP)
> + movq_cfi rcx, (RCX-RBP)
> + movq_cfi rax, (RAX-RBP)
> + movq_cfi r8, (R8-RBP)
> + movq_cfi r9, (R9-RBP)
> + movq_cfi r10, (R10-RBP)
> + movq_cfi r11, (R11-RBP)
>
> /* Save rbp so that we can unwind from get_irq_regs() */
> movq_cfi rbp, 0
> @@ -384,7 +384,7 @@ ENDPROC(native_usergs_sysret64)
> .endm
>
> ENTRY(save_rest)
> - PARTIAL_FRAME 1 REST_SKIP+8
> + PARTIAL_FRAME 1 (REST_SKIP+8)
> movq 5*8+16(%rsp), %r11 /* save return address */
> movq_cfi rbx, RBX+16
> movq_cfi rbp, RBP+16
> --
> 1.7.7.6


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/