Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 79847
b: refs/heads/master
c: 69d0627
h: refs/heads/master
i:
  79845: 9b13f5c
  79843: e2e9751
  79839: 56bf077
v: v3
  • Loading branch information
Roland McGrath authored and Ingo Molnar committed Jan 30, 2008
1 parent 185a9c9 commit 2ea0aa2
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 38 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: 16f4bc738d616962a844e80f7b1fcb52c626542a
refs/heads/master: 69d0627a7f6e891189124d784d2fa90cae7c449a
21 changes: 12 additions & 9 deletions trunk/arch/x86/vdso/vdso32/int80.S
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
/*
* Code for the vsyscall page. This version uses the old int $0x80 method.
* Code for the vDSO. This version uses the old int $0x80 method.
*
* NOTE:
* 1) __kernel_vsyscall _must_ be first in this page.
* 2) there are alignment constraints on this stub, see vsyscall-sigreturn.S
* for details.
* First get the common code for the sigreturn entry points.
* This must come first.
*/
#include "sigreturn.S"

.text
.globl __kernel_vsyscall
.type __kernel_vsyscall,@function
ALIGN
__kernel_vsyscall:
.LSTART_vsyscall:
int $0x80
Expand Down Expand Up @@ -47,7 +47,10 @@ __kernel_vsyscall:
.LENDFDEDLSI:
.previous

/*
* Get the common code for the sigreturn entry points.
*/
#include "sigreturn.S"
/*
* Pad out the segment to match the size of the sysenter.S version.
*/
VDSO32_vsyscall_eh_frame_size = 0x44
.section .data,"aw",@progbits
.space VDSO32_vsyscall_eh_frame_size-(.LENDFDEDLSI-.LSTARTFRAMEDLSI), 0
.previous
20 changes: 9 additions & 11 deletions trunk/arch/x86/vdso/vdso32/sigreturn.S
Original file line number Diff line number Diff line change
@@ -1,44 +1,42 @@
/*
* Common code for the sigreturn entry points on the vsyscall page.
* Common code for the sigreturn entry points in vDSO images.
* So far this code is the same for both int80 and sysenter versions.
* This file is #include'd by vsyscall-*.S to define them after the
* vsyscall entry point. The kernel assumes that the addresses of these
* routines are constant for all vsyscall implementations.
* This file is #include'd by int80.S et al to define them first thing.
* The kernel assumes that the addresses of these routines are constant
* for all vDSO implementations.
*/

#include <linux/linkage.h>
#include <asm/unistd_32.h>
#include <asm/asm-offsets.h>

#ifndef SYSCALL_ENTER_KERNEL
#define SYSCALL_ENTER_KERNEL int $0x80
#endif

/* XXX
Should these be named "_sigtramp" or something?
*/

.text
.org __kernel_vsyscall+32,0x90
.globl __kernel_sigreturn
.type __kernel_sigreturn,@function
ALIGN
__kernel_sigreturn:
.LSTART_sigreturn:
popl %eax /* XXX does this mean it needs unwind info? */
movl $__NR_sigreturn, %eax
SYSCALL_ENTER_KERNEL
.LEND_sigreturn:
nop
.size __kernel_sigreturn,.-.LSTART_sigreturn

.balign 32
.globl __kernel_rt_sigreturn
.type __kernel_rt_sigreturn,@function
ALIGN
__kernel_rt_sigreturn:
.LSTART_rt_sigreturn:
movl $__NR_rt_sigreturn, %eax
SYSCALL_ENTER_KERNEL
.LEND_rt_sigreturn:
nop
.size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn
.balign 32
.previous

.section .eh_frame,"a",@progbits
Expand Down
22 changes: 15 additions & 7 deletions trunk/arch/x86/vdso/vdso32/syscall.S
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
/*
* Code for the vsyscall page. This version uses the syscall instruction.
* Code for the vDSO. This version uses the syscall instruction.
*
* First get the common code for the sigreturn entry points.
* This must come first.
*/
#define SYSCALL_ENTER_KERNEL syscall
#include "sigreturn.S"

#include <asm/asm-offsets.h>
#include <asm/segment.h>

.text
.globl __kernel_vsyscall
.type __kernel_vsyscall,@function
ALIGN
__kernel_vsyscall:
.LSTART_vsyscall:
push %ebp
Expand Down Expand Up @@ -61,9 +66,12 @@ __kernel_vsyscall:
.uleb128 4
.align 4
.LENDFDE1:
.previous

/*
* Get the common code for the sigreturn entry points.
*/
#define SYSCALL_ENTER_KERNEL syscall
#include "sigreturn.S"
/*
* Pad out the segment to match the size of the sysenter.S version.
*/
VDSO32_vsyscall_eh_frame_size = 0x44
.section .data,"aw",@progbits
.space VDSO32_vsyscall_eh_frame_size-(.LENDFDE1-.LSTARTFRAME), 0
.previous
21 changes: 11 additions & 10 deletions trunk/arch/x86/vdso/vdso32/sysenter.S
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
/*
* Code for the vsyscall page. This version uses the sysenter instruction.
* Code for the vDSO. This version uses the sysenter instruction.
*
* NOTE:
* 1) __kernel_vsyscall _must_ be first in this page.
* 2) there are alignment constraints on this stub, see vsyscall-sigreturn.S
* for details.
* First get the common code for the sigreturn entry points.
* This must come first.
*/
#include "sigreturn.S"

/*
* The caller puts arg2 in %ecx, which gets pushed. The kernel will use
Expand All @@ -23,11 +22,12 @@
* arg6 from the stack.
*
* You can not use this vsyscall for the clone() syscall because the
* three dwords on the parent stack do not get copied to the child.
* three words on the parent stack do not get copied to the child.
*/
.text
.globl __kernel_vsyscall
.type __kernel_vsyscall,@function
ALIGN
__kernel_vsyscall:
.LSTART_vsyscall:
push %ecx
Expand Down Expand Up @@ -115,7 +115,8 @@ VDSO32_SYSENTER_RETURN: /* Symbol used by sysenter.c via vdso32-syms.h */
.LENDFDEDLSI:
.previous

/*
* Get the common code for the sigreturn entry points.
*/
#include "sigreturn.S"
/*
* Emit a symbol with the size of this .eh_frame data,
* to verify it matches the other versions.
*/
VDSO32_vsyscall_eh_frame_size = (.LENDFDEDLSI-.LSTARTFRAMEDLSI)

0 comments on commit 2ea0aa2

Please sign in to comment.