Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 61980
b: refs/heads/master
c: d2eea68
h: refs/heads/master
v: v3
  • Loading branch information
Roland McGrath authored and Linus Torvalds committed Jul 20, 2007
1 parent 90e50f3 commit 4ca7ee5
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5ac12c6fe1b5fbda0d0caedb8214cde545a5737c
refs/heads/master: d2eea68e7db759ce67807b42b7407236cccfde71
1 change: 1 addition & 0 deletions trunk/arch/i386/boot/compressed/relocs.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ static const char* safe_abs_relocs[] = {
"__kernel_rt_sigreturn",
"__kernel_sigreturn",
"SYSENTER_RETURN",
"VDSO_NOTE_MASK",
"xen_irq_disable_direct_reloc",
"xen_save_fl_direct_reloc",
};
Expand Down
15 changes: 9 additions & 6 deletions trunk/arch/i386/kernel/vsyscall-note.S
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ ELFNOTE_START(Linux, 0, "a")
ELFNOTE_END

#ifdef CONFIG_XEN

/*
* Add a special note telling glibc's dynamic linker a fake hardware
* flavor that it will use to choose the search path for libraries in the
Expand All @@ -28,15 +27,19 @@ ELFNOTE_END
* It should contain:
* hwcap 1 nosegneg
* to match the mapping of bit to name that we give here.
*
* At runtime, the fake hardware feature will be considered to be present
* if its bit is set in the mask word. So, we start with the mask 0, and
* at boot time we set VDSO_NOTE_NONEGSEG_BIT if running under Xen.
*/

/* Bit used for the pseudo-hwcap for non-negative segments. We use
bit 1 to avoid bugs in some versions of glibc when bit 0 is
used; the choice is otherwise arbitrary. */
#define VDSO_NOTE_NONEGSEG_BIT 1
#include "../xen/vdso.h" /* Defines VDSO_NOTE_NONEGSEG_BIT. */

.globl VDSO_NOTE_MASK
ELFNOTE_START(GNU, 2, "a")
.long 1, 1<<VDSO_NOTE_NONEGSEG_BIT /* ncaps, mask */
.long 1 /* ncaps */
VDSO_NOTE_MASK:
.long 0 /* mask */
.byte VDSO_NOTE_NONEGSEG_BIT; .asciz "nosegneg" /* bit, name */
ELFNOTE_END
#endif
15 changes: 15 additions & 0 deletions trunk/arch/i386/xen/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <xen/features.h>

#include "xen-ops.h"
#include "vdso.h"

/* These are code, but not functions. Defined in entry.S */
extern const char xen_hypervisor_callback[];
Expand Down Expand Up @@ -55,6 +56,18 @@ static void xen_idle(void)
}
}

/*
* Set the bit indicating "nosegneg" library variants should be used.
*/
static void fiddle_vdso(void)
{
extern u32 VDSO_NOTE_MASK; /* See ../kernel/vsyscall-note.S. */
extern char vsyscall_int80_start;
u32 *mask = (u32 *) ((unsigned long) &VDSO_NOTE_MASK - VDSO_PRELINK +
&vsyscall_int80_start);
*mask |= 1 << VDSO_NOTE_NONEGSEG_BIT;
}

void __init xen_arch_setup(void)
{
struct physdev_set_iopl set_iopl;
Expand Down Expand Up @@ -93,4 +106,6 @@ void __init xen_arch_setup(void)
#endif

paravirt_disable_iospace();

fiddle_vdso();
}
4 changes: 4 additions & 0 deletions trunk/arch/i386/xen/vdso.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/* Bit used for the pseudo-hwcap for non-negative segments. We use
bit 1 to avoid bugs in some versions of glibc when bit 0 is
used; the choice is otherwise arbitrary. */
#define VDSO_NOTE_NONEGSEG_BIT 1

0 comments on commit 4ca7ee5

Please sign in to comment.