linux-user/s390x: Add vdso
Acked-by: Thomas Huth <thuth@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
ba02f1ea63
commit
b63c6b97f8
@ -1894,6 +1894,8 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs,
|
|||||||
#define USE_ELF_CORE_DUMP
|
#define USE_ELF_CORE_DUMP
|
||||||
#define ELF_EXEC_PAGESIZE 4096
|
#define ELF_EXEC_PAGESIZE 4096
|
||||||
|
|
||||||
|
#define VDSO_HEADER "vdso.c.inc"
|
||||||
|
|
||||||
#endif /* TARGET_S390X */
|
#endif /* TARGET_S390X */
|
||||||
|
|
||||||
#ifdef TARGET_RISCV
|
#ifdef TARGET_RISCV
|
||||||
|
11
linux-user/s390x/Makefile.vdso
Normal file
11
linux-user/s390x/Makefile.vdso
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
include $(BUILD_DIR)/tests/tcg/s390x-linux-user/config-target.mak
|
||||||
|
|
||||||
|
SUBDIR = $(SRC_PATH)/linux-user/s390x
|
||||||
|
VPATH += $(SUBDIR)
|
||||||
|
|
||||||
|
all: $(SUBDIR)/vdso.so
|
||||||
|
|
||||||
|
$(SUBDIR)/vdso.so: vdso.S vdso.ld vdso-asmoffset.h
|
||||||
|
$(CC) -o $@ -nostdlib -shared -Wl,-h,linux-vdso64.so.1 \
|
||||||
|
-Wl,--build-id=sha1 -Wl,--hash-style=both \
|
||||||
|
-Wl,-T,$(SUBDIR)/vdso.ld $<
|
@ -3,3 +3,9 @@ syscall_nr_generators += {
|
|||||||
arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
|
arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
|
||||||
output: '@BASENAME@_nr.h')
|
output: '@BASENAME@_nr.h')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vdso_inc = gen_vdso.process('vdso.so', extra_args: [
|
||||||
|
'-s', '__kernel_sigreturn',
|
||||||
|
'-r', '__kernel_rt_sigreturn'
|
||||||
|
])
|
||||||
|
linux_user_ss.add(when: 'TARGET_S390X', if_true: vdso_inc)
|
||||||
|
@ -21,14 +21,12 @@
|
|||||||
#include "user-internals.h"
|
#include "user-internals.h"
|
||||||
#include "signal-common.h"
|
#include "signal-common.h"
|
||||||
#include "linux-user/trace.h"
|
#include "linux-user/trace.h"
|
||||||
|
#include "vdso-asmoffset.h"
|
||||||
|
|
||||||
#define __NUM_GPRS 16
|
#define __NUM_GPRS 16
|
||||||
#define __NUM_FPRS 16
|
#define __NUM_FPRS 16
|
||||||
#define __NUM_ACRS 16
|
#define __NUM_ACRS 16
|
||||||
|
|
||||||
/* Minimum stack frame size */
|
|
||||||
#define STACK_FRAME_OVERHEAD 160
|
|
||||||
|
|
||||||
#define _SIGCONTEXT_NSIG 64
|
#define _SIGCONTEXT_NSIG 64
|
||||||
#define _SIGCONTEXT_NSIG_BPW 64 /* FIXME: 31-bit mode -> 32 */
|
#define _SIGCONTEXT_NSIG_BPW 64 /* FIXME: 31-bit mode -> 32 */
|
||||||
#define _SIGCONTEXT_NSIG_WORDS (_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW)
|
#define _SIGCONTEXT_NSIG_WORDS (_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW)
|
||||||
|
2
linux-user/s390x/vdso-asmoffset.h
Normal file
2
linux-user/s390x/vdso-asmoffset.h
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/* Minimum stack frame size */
|
||||||
|
#define STACK_FRAME_OVERHEAD 160
|
61
linux-user/s390x/vdso.S
Normal file
61
linux-user/s390x/vdso.S
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* s390x linux replacement vdso.
|
||||||
|
*
|
||||||
|
* Copyright 2023 Linaro, Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm/unistd.h>
|
||||||
|
#include "vdso-asmoffset.h"
|
||||||
|
|
||||||
|
.macro endf name
|
||||||
|
.globl \name
|
||||||
|
.type \name, @function
|
||||||
|
.size \name, . - \name
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro raw_syscall n
|
||||||
|
.ifne \n < 0x100
|
||||||
|
svc \n
|
||||||
|
.else
|
||||||
|
lghi %r1, \n
|
||||||
|
svc 0
|
||||||
|
.endif
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro vdso_syscall name, nr
|
||||||
|
\name:
|
||||||
|
.cfi_startproc
|
||||||
|
aghi %r15, -(STACK_FRAME_OVERHEAD + 16)
|
||||||
|
.cfi_adjust_cfa_offset STACK_FRAME_OVERHEAD + 16
|
||||||
|
stg %r14, STACK_FRAME_OVERHEAD(%r15)
|
||||||
|
.cfi_rel_offset %r14, STACK_FRAME_OVERHEAD
|
||||||
|
raw_syscall \nr
|
||||||
|
lg %r14, STACK_FRAME_OVERHEAD(%r15)
|
||||||
|
aghi %r15, STACK_FRAME_OVERHEAD + 16
|
||||||
|
.cfi_restore %r14
|
||||||
|
.cfi_adjust_cfa_offset -(STACK_FRAME_OVERHEAD + 16)
|
||||||
|
br %r14
|
||||||
|
.cfi_endproc
|
||||||
|
endf \name
|
||||||
|
.endm
|
||||||
|
|
||||||
|
vdso_syscall __kernel_gettimeofday, __NR_gettimeofday
|
||||||
|
vdso_syscall __kernel_clock_gettime, __NR_clock_gettime
|
||||||
|
vdso_syscall __kernel_clock_getres, __NR_clock_getres
|
||||||
|
vdso_syscall __kernel_getcpu, __NR_getcpu
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO unwind info, though we're ok without it.
|
||||||
|
* The kernel supplies bogus empty unwind info, and it is likely ignored
|
||||||
|
* by all users. Without it we get the fallback signal frame handling.
|
||||||
|
*/
|
||||||
|
|
||||||
|
__kernel_sigreturn:
|
||||||
|
raw_syscall __NR_sigreturn
|
||||||
|
endf __kernel_sigreturn
|
||||||
|
|
||||||
|
__kernel_rt_sigreturn:
|
||||||
|
raw_syscall __NR_rt_sigreturn
|
||||||
|
endf __kernel_rt_sigreturn
|
72
linux-user/s390x/vdso.ld
Normal file
72
linux-user/s390x/vdso.ld
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Linker script for linux s390x replacement vdso.
|
||||||
|
*
|
||||||
|
* Copyright 2023 Linaro, Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
*/
|
||||||
|
|
||||||
|
VERSION {
|
||||||
|
LINUX_2.6.29 {
|
||||||
|
global:
|
||||||
|
__kernel_gettimeofday;
|
||||||
|
__kernel_clock_gettime;
|
||||||
|
__kernel_clock_getres;
|
||||||
|
__kernel_getcpu;
|
||||||
|
__kernel_rt_sigreturn;
|
||||||
|
__kernel_sigreturn;
|
||||||
|
/*
|
||||||
|
* QEMU handles syscall restart internally, so we don't
|
||||||
|
* need the __kernel_restart_syscall entry point.
|
||||||
|
*/
|
||||||
|
local: *;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PHDRS {
|
||||||
|
phdr PT_PHDR FLAGS(4) PHDRS;
|
||||||
|
load PT_LOAD FLAGS(7) FILEHDR PHDRS; /* FLAGS=RWX */
|
||||||
|
dynamic PT_DYNAMIC FLAGS(4);
|
||||||
|
eh_frame_hdr PT_GNU_EH_FRAME;
|
||||||
|
note PT_NOTE FLAGS(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTIONS {
|
||||||
|
. = SIZEOF_HEADERS;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following, including the FILEHDRS and PHDRS, are modified
|
||||||
|
* when we relocate the binary. We want them to be initially
|
||||||
|
* writable for the relocation; we'll force them read-only after.
|
||||||
|
*/
|
||||||
|
.note : { *(.note*) } :load :note
|
||||||
|
.dynamic : { *(.dynamic) } :load :dynamic
|
||||||
|
.dynsym : { *(.dynsym) } :load
|
||||||
|
/*
|
||||||
|
* There ought not be any real read-write data.
|
||||||
|
* But since we manipulated the segment layout,
|
||||||
|
* we have to put these sections somewhere.
|
||||||
|
*/
|
||||||
|
.data : {
|
||||||
|
*(.data*)
|
||||||
|
*(.sdata*)
|
||||||
|
*(.got.plt) *(.got)
|
||||||
|
*(.gnu.linkonce.d.*)
|
||||||
|
*(.bss*)
|
||||||
|
*(.dynbss*)
|
||||||
|
*(.gnu.linkonce.b.*)
|
||||||
|
}
|
||||||
|
|
||||||
|
.rodata : { *(.rodata*) }
|
||||||
|
.hash : { *(.hash) }
|
||||||
|
.gnu.hash : { *(.gnu.hash) }
|
||||||
|
.dynstr : { *(.dynstr) }
|
||||||
|
.gnu.version : { *(.gnu.version) }
|
||||||
|
.gnu.version_d : { *(.gnu.version_d) }
|
||||||
|
.gnu.version_r : { *(.gnu.version_r) }
|
||||||
|
.eh_frame_hdr : { *(.eh_frame_hdr) } :load :eh_frame_hdr
|
||||||
|
.eh_frame : { *(.eh_frame) } :load
|
||||||
|
|
||||||
|
.text : { *(.text*) } :load
|
||||||
|
}
|
BIN
linux-user/s390x/vdso.so
Executable file
BIN
linux-user/s390x/vdso.so
Executable file
Binary file not shown.
Loading…
Reference in New Issue
Block a user