From ddb4ded4622ceef3d11253e567b8850f813a5363 Mon Sep 17 00:00:00 2001 From: Jeff Dike Date: Mon, 4 Feb 2008 22:30:44 -0800 Subject: [PATCH] --- yaml --- r: 83172 b: refs/heads/master c: 4bdf8bc4a15d4540d71db9fa01955db5edcf89ec h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/um/include/as-layout.h | 34 +++++++++++++++++++------------ trunk/arch/um/sys-i386/stub.S | 8 ++++---- trunk/arch/um/sys-x86_64/stub.S | 8 ++++---- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/[refs] b/[refs] index 0278e6e1e5e2..ff51ae90714f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ee56314b79039b669396ee04aac3e342cd2e5a1f +refs/heads/master: 4bdf8bc4a15d4540d71db9fa01955db5edcf89ec diff --git a/trunk/arch/um/include/as-layout.h b/trunk/arch/um/include/as-layout.h index a5cdf953e04a..2b859e020ac6 100644 --- a/trunk/arch/um/include/as-layout.h +++ b/trunk/arch/um/include/as-layout.h @@ -10,23 +10,31 @@ #include "kern_constants.h" /* - * Assembly doesn't want any casting, but C does, so define these - * without casts here, and define new symbols with casts inside the C - * section. + * Stolen from linux/const.h, which can't be directly included since + * this is used in userspace code, which has no access to the kernel + * headers. Changed to be suitable for adding casts to the start, + * rather than "UL" to the end. */ -#define ASM_STUB_CODE (UML_CONFIG_TOP_ADDR - 2 * UM_KERN_PAGE_SIZE) -#define ASM_STUB_DATA (UML_CONFIG_TOP_ADDR - UM_KERN_PAGE_SIZE) -#define ASM_STUB_START ASM_STUB_CODE -/* - * This file is included by the assembly stubs, which just want the - * definitions above. +/* Some constant macros are used in both assembler and + * C code. Therefore we cannot annotate them always with + * 'UL' and other type specifiers unilaterally. We + * use the following macros to deal with this. */ -#ifndef __ASSEMBLY__ -#define STUB_CODE ((unsigned long) ASM_STUB_CODE) -#define STUB_DATA ((unsigned long) ASM_STUB_DATA) -#define STUB_START ((unsigned long) ASM_STUB_START) +#ifdef __ASSEMBLY__ +#define _AC(X, Y) (Y) +#else +#define __AC(X, Y) (X (Y)) +#define _AC(X, Y) __AC(X, Y) +#endif + +#define STUB_CODE _AC((unsigned long), \ + UML_CONFIG_TOP_ADDR - 2 * UM_KERN_PAGE_SIZE) +#define STUB_DATA _AC((unsigned long), UML_CONFIG_TOP_ADDR - UM_KERN_PAGE_SIZE) +#define STUB_START _AC(, STUB_CODE) + +#ifndef __ASSEMBLY__ #include "sysdep/ptrace.h" diff --git a/trunk/arch/um/sys-i386/stub.S b/trunk/arch/um/sys-i386/stub.S index e730772c401b..7699e89f660f 100644 --- a/trunk/arch/um/sys-i386/stub.S +++ b/trunk/arch/um/sys-i386/stub.S @@ -7,7 +7,7 @@ .globl batch_syscall_stub batch_syscall_stub: /* load pointer to first operation */ - mov $(ASM_STUB_DATA+8), %esp + mov $(STUB_DATA+8), %esp again: /* load length of additional data */ @@ -15,12 +15,12 @@ again: /* if(length == 0) : end of list */ /* write possible 0 to header */ - mov %eax, ASM_STUB_DATA+4 + mov %eax, STUB_DATA+4 cmpl $0, %eax jz done /* save current pointer */ - mov %esp, ASM_STUB_DATA+4 + mov %esp, STUB_DATA+4 /* skip additional data */ add %eax, %esp @@ -46,7 +46,7 @@ again: done: /* save return value */ - mov %eax, ASM_STUB_DATA + mov %eax, STUB_DATA /* stop */ int3 diff --git a/trunk/arch/um/sys-x86_64/stub.S b/trunk/arch/um/sys-x86_64/stub.S index 4afe204a6af7..568768763155 100644 --- a/trunk/arch/um/sys-x86_64/stub.S +++ b/trunk/arch/um/sys-x86_64/stub.S @@ -8,18 +8,18 @@ syscall_stub: /* We don't have 64-bit constants, so this constructs the address * we need. */ - movq $(ASM_STUB_DATA >> 32), %rbx + movq $(STUB_DATA >> 32), %rbx salq $32, %rbx - movq $(ASM_STUB_DATA & 0xffffffff), %rcx + movq $(STUB_DATA & 0xffffffff), %rcx or %rcx, %rbx movq %rax, (%rbx) int3 .globl batch_syscall_stub batch_syscall_stub: - mov $(ASM_STUB_DATA >> 32), %rbx + mov $(STUB_DATA >> 32), %rbx sal $32, %rbx - mov $(ASM_STUB_DATA & 0xffffffff), %rax + mov $(STUB_DATA & 0xffffffff), %rax or %rax, %rbx /* load pointer to first operation */ mov %rbx, %rsp