* [PATCH v5 00/20] linux-user: Implement VDSOs
@ 2023-08-29 22:02 Richard Henderson
2023-08-29 22:02 ` [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain Richard Henderson
` (20 more replies)
0 siblings, 21 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Changes for v5:
* Integrated cross-compile, via new build-vdso.sh and meson rules.
However, keep the binaries in the tree for hosts which do not
have all of the cross-compile machinery.
* Update our loongarch64 docker image to avoid a binutils bug.
Changes for v4:
* Force all vdso to have a single load segment.
This will prevent problems with varying host/guest page size.
* Tidy some of the assembly with macros.
* Implement loongarch, ppc, s390x.
Just in case the list eats a binary:
https://gitlab.com/rth7680/qemu/-/tree/lu-vdso
r~
Richard Henderson (20):
tests/docker: Update docker-loongarch-cross toolchain
linux-user: Introduce imgsrc_read, imgsrc_read_alloc
linux-user: Tidy loader_exec
linux-user: Do not clobber bprm_buf swapping ehdr
linux-user: Use ImageSource in load_elf_image
linux-user: Use ImageSource in load_symbols
linux-user: Replace bprm->fd with bprm->src.fd
linux-user: Load vdso image if available
linux-user: Add gen-vdso tool
linux-user: Add build-vdso.sh tool
linux-user/i386: Add vdso
linux-user/x86_64: Add vdso
linux-user/aarch64: Add vdso
linux-user/arm: Add vdso
linux-user/hppa: Add vdso
linux-user/riscv: Add vdso
linux-user/loongarch64: Add vdso
linux-user/ppc: Add vdso
linux-user/s390x: Rename __SIGNAL_FRAMESIZE to STACK_FRAME_OVERHEAD
linux-user/s390x: Add vdso
linux-user/hppa/vdso-asmoffset.h | 12 +
linux-user/i386/vdso-asmoffset.h | 6 +
linux-user/loader.h | 60 ++-
linux-user/loongarch64/vdso-asmoffset.h | 8 +
linux-user/ppc/vdso-asmoffset.h | 20 +
linux-user/riscv/vdso-asmoffset.h | 9 +
linux-user/s390x/vdso-asmoffset.h | 2 +
linux-user/arm/signal.c | 28 +-
linux-user/elfload.c | 361 +++++++++++-------
linux-user/flatload.c | 8 +-
linux-user/gen-vdso.c | 223 +++++++++++
linux-user/hppa/signal.c | 24 +-
linux-user/i386/signal.c | 11 +
linux-user/linuxload.c | 137 +++++--
linux-user/loongarch64/signal.c | 17 +-
linux-user/ppc/signal.c | 31 +-
linux-user/riscv/signal.c | 8 +
linux-user/s390x/signal.c | 7 +-
linux-user/gen-vdso-elfn.c.inc | 314 +++++++++++++++
linux-user/aarch64/meson.build | 33 ++
linux-user/aarch64/vdso-be.so | Bin 0 -> 3216 bytes
linux-user/aarch64/vdso-le.so | Bin 0 -> 3216 bytes
linux-user/aarch64/vdso.S | 73 ++++
linux-user/aarch64/vdso.ld | 72 ++++
linux-user/arm/meson.build | 35 ++
linux-user/arm/vdso-be.so | Bin 0 -> 2680 bytes
linux-user/arm/vdso-le.so | Bin 0 -> 2680 bytes
linux-user/arm/vdso.S | 177 +++++++++
linux-user/arm/vdso.ld | 67 ++++
linux-user/build-vdso.sh | 31 ++
linux-user/hppa/meson.build | 23 ++
linux-user/hppa/vdso.S | 165 ++++++++
linux-user/hppa/vdso.ld | 77 ++++
linux-user/hppa/vdso.so | Bin 0 -> 2104 bytes
linux-user/i386/meson.build | 24 ++
linux-user/i386/vdso.S | 143 +++++++
linux-user/i386/vdso.ld | 76 ++++
linux-user/i386/vdso.so | Bin 0 -> 2672 bytes
linux-user/loongarch64/meson.build | 21 +
linux-user/loongarch64/vdso.S | 130 +++++++
linux-user/loongarch64/vdso.ld | 73 ++++
linux-user/loongarch64/vdso.so | Bin 0 -> 3560 bytes
linux-user/meson.build | 10 +-
linux-user/ppc/Makefile.vdso | 18 +
linux-user/ppc/meson.build | 12 +
linux-user/ppc/vdso-32.ld | 70 ++++
linux-user/ppc/vdso-32.so | Bin 0 -> 3020 bytes
linux-user/ppc/vdso-64.ld | 68 ++++
linux-user/ppc/vdso-64.so | Bin 0 -> 3896 bytes
linux-user/ppc/vdso-64le.so | Bin 0 -> 3896 bytes
linux-user/ppc/vdso.S | 239 ++++++++++++
linux-user/riscv/meson.build | 30 ++
linux-user/riscv/vdso-32.so | Bin 0 -> 2888 bytes
linux-user/riscv/vdso-64.so | Bin 0 -> 3840 bytes
linux-user/riscv/vdso.S | 186 +++++++++
linux-user/riscv/vdso.ld | 74 ++++
linux-user/s390x/meson.build | 24 ++
linux-user/s390x/vdso.S | 61 +++
linux-user/s390x/vdso.ld | 69 ++++
linux-user/s390x/vdso.so | Bin 0 -> 3464 bytes
linux-user/x86_64/meson.build | 20 +
linux-user/x86_64/vdso.S | 78 ++++
linux-user/x86_64/vdso.ld | 73 ++++
linux-user/x86_64/vdso.so | Bin 0 -> 2968 bytes
.../dockerfiles/debian-loongarch-cross.docker | 2 +-
65 files changed, 3329 insertions(+), 211 deletions(-)
create mode 100644 linux-user/hppa/vdso-asmoffset.h
create mode 100644 linux-user/i386/vdso-asmoffset.h
create mode 100644 linux-user/loongarch64/vdso-asmoffset.h
create mode 100644 linux-user/ppc/vdso-asmoffset.h
create mode 100644 linux-user/riscv/vdso-asmoffset.h
create mode 100644 linux-user/s390x/vdso-asmoffset.h
create mode 100644 linux-user/gen-vdso.c
create mode 100644 linux-user/gen-vdso-elfn.c.inc
create mode 100644 linux-user/aarch64/meson.build
create mode 100755 linux-user/aarch64/vdso-be.so
create mode 100755 linux-user/aarch64/vdso-le.so
create mode 100644 linux-user/aarch64/vdso.S
create mode 100644 linux-user/aarch64/vdso.ld
create mode 100755 linux-user/arm/vdso-be.so
create mode 100755 linux-user/arm/vdso-le.so
create mode 100644 linux-user/arm/vdso.S
create mode 100644 linux-user/arm/vdso.ld
create mode 100755 linux-user/build-vdso.sh
create mode 100644 linux-user/hppa/vdso.S
create mode 100644 linux-user/hppa/vdso.ld
create mode 100755 linux-user/hppa/vdso.so
create mode 100644 linux-user/i386/vdso.S
create mode 100644 linux-user/i386/vdso.ld
create mode 100755 linux-user/i386/vdso.so
create mode 100644 linux-user/loongarch64/meson.build
create mode 100644 linux-user/loongarch64/vdso.S
create mode 100644 linux-user/loongarch64/vdso.ld
create mode 100755 linux-user/loongarch64/vdso.so
create mode 100644 linux-user/ppc/Makefile.vdso
create mode 100644 linux-user/ppc/vdso-32.ld
create mode 100755 linux-user/ppc/vdso-32.so
create mode 100644 linux-user/ppc/vdso-64.ld
create mode 100755 linux-user/ppc/vdso-64.so
create mode 100755 linux-user/ppc/vdso-64le.so
create mode 100644 linux-user/ppc/vdso.S
create mode 100644 linux-user/riscv/meson.build
create mode 100755 linux-user/riscv/vdso-32.so
create mode 100755 linux-user/riscv/vdso-64.so
create mode 100644 linux-user/riscv/vdso.S
create mode 100644 linux-user/riscv/vdso.ld
create mode 100644 linux-user/s390x/vdso.S
create mode 100644 linux-user/s390x/vdso.ld
create mode 100755 linux-user/s390x/vdso.so
create mode 100644 linux-user/x86_64/vdso.S
create mode 100644 linux-user/x86_64/vdso.ld
create mode 100755 linux-user/x86_64/vdso.so
--
2.34.1
^ permalink raw reply [flat|nested] 43+ messages in thread
* [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-30 9:43 ` gaosong
` (2 more replies)
2023-08-29 22:02 ` [PATCH v5 02/20] linux-user: Introduce imgsrc_read, imgsrc_read_alloc Richard Henderson
` (19 subsequent siblings)
20 siblings, 3 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Update from clfs 5.0 to clfs 8.1, which includes updates
to binutils 2.41, gcc 13.2, and glibc 2.38.
See https://github.com/loongson/build-tools
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
tests/docker/dockerfiles/debian-loongarch-cross.docker | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/docker/dockerfiles/debian-loongarch-cross.docker b/tests/docker/dockerfiles/debian-loongarch-cross.docker
index 9d957547b5..b4bf265717 100644
--- a/tests/docker/dockerfiles/debian-loongarch-cross.docker
+++ b/tests/docker/dockerfiles/debian-loongarch-cross.docker
@@ -20,7 +20,7 @@ RUN apt-get update && \
git \
python3-minimal
-RUN curl -#SL https://github.com/loongson/build-tools/releases/download/2022.05.29/loongarch64-clfs-5.0-cross-tools-gcc-glibc.tar.xz \
+RUN curl -#SL https://github.com/loongson/build-tools/releases/download/2023.08.08/CLFS-loongarch64-8.1-x86_64-cross-tools-gcc-glibc.tar.xz \
| tar -xJC /opt
ENV PATH $PATH:/opt/cross-tools/bin
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 02/20] linux-user: Introduce imgsrc_read, imgsrc_read_alloc
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
2023-08-29 22:02 ` [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-09-04 14:27 ` Alex Bennée
2023-08-29 22:02 ` [PATCH v5 03/20] linux-user: Tidy loader_exec Richard Henderson
` (18 subsequent siblings)
20 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent, Philippe Mathieu-Daudé
Introduced and initialized, but not yet really used.
These will tidy the current tests vs BPRM_BUF_SIZE.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/loader.h | 61 +++++++++++++++++++++++-----
linux-user/linuxload.c | 90 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 142 insertions(+), 9 deletions(-)
diff --git a/linux-user/loader.h b/linux-user/loader.h
index 59cbeacf24..311d20f5d1 100644
--- a/linux-user/loader.h
+++ b/linux-user/loader.h
@@ -18,6 +18,48 @@
#ifndef LINUX_USER_LOADER_H
#define LINUX_USER_LOADER_H
+typedef struct {
+ const void *cache;
+ unsigned int cache_size;
+ int fd;
+} ImageSource;
+
+/**
+ * imgsrc_read: Read from ImageSource
+ * @dst: destination for read
+ * @offset: offset within file for read
+ * @len: size of the read
+ * @img: ImageSource to read from
+ * @errp: Error details.
+ *
+ * Read into @dst, using the cache when possible.
+ */
+bool imgsrc_read(void *dst, off_t offset, size_t len,
+ const ImageSource *img, Error **errp);
+
+/**
+ * imgsrc_read_alloc: Read from ImageSource
+ * @offset: offset within file for read
+ * @size: size of the read
+ * @img: ImageSource to read from
+ * @errp: Error details.
+ *
+ * Read into newly allocated memory, using the cache when possible.
+ */
+void *imgsrc_read_alloc(off_t offset, size_t len,
+ const ImageSource *img, Error **errp);
+
+/**
+ * imgsrc_mmap: Map from ImageSource
+ *
+ * If @src has a file descriptor, pass on to target_mmap. Otherwise,
+ * this is "mapping" from a host buffer, which resolves to memcpy.
+ * Therefore, flags must be MAP_PRIVATE | MAP_FIXED; the argument is
+ * retained for clarity.
+ */
+abi_long imgsrc_mmap(abi_ulong start, abi_ulong len, int prot,
+ int flags, const ImageSource *src, abi_ulong offset);
+
/*
* Read a good amount of data initially, to hopefully get all the
* program headers loaded.
@@ -29,15 +71,16 @@
* used when loading binaries.
*/
struct linux_binprm {
- char buf[BPRM_BUF_SIZE] __attribute__((aligned));
- abi_ulong p;
- int fd;
- int e_uid, e_gid;
- int argc, envc;
- char **argv;
- char **envp;
- char *filename; /* Name of binary */
- int (*core_dump)(int, const CPUArchState *); /* coredump routine */
+ char buf[BPRM_BUF_SIZE] __attribute__((aligned));
+ ImageSource src;
+ abi_ulong p;
+ int fd;
+ int e_uid, e_gid;
+ int argc, envc;
+ char **argv;
+ char **envp;
+ char *filename; /* Name of binary */
+ int (*core_dump)(int, const CPUArchState *); /* coredump routine */
};
void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
diff --git a/linux-user/linuxload.c b/linux-user/linuxload.c
index 745cce70ab..3536dd8104 100644
--- a/linux-user/linuxload.c
+++ b/linux-user/linuxload.c
@@ -3,7 +3,9 @@
#include "qemu/osdep.h"
#include "qemu.h"
#include "user-internals.h"
+#include "user-mmap.h"
#include "loader.h"
+#include "qapi/error.h"
#define NGROUPS 32
@@ -76,6 +78,10 @@ static int prepare_binprm(struct linux_binprm *bprm)
/* Make sure the rest of the loader won't read garbage. */
memset(bprm->buf + retval, 0, BPRM_BUF_SIZE - retval);
}
+
+ bprm->src.cache = bprm->buf;
+ bprm->src.cache_size = retval;
+
return retval;
}
@@ -139,6 +145,7 @@ int loader_exec(int fdexec, const char *filename, char **argv, char **envp,
int retval;
bprm->fd = fdexec;
+ bprm->src.fd = fdexec;
bprm->filename = (char *)filename;
bprm->argc = count(argv);
bprm->argv = argv;
@@ -173,3 +180,86 @@ int loader_exec(int fdexec, const char *filename, char **argv, char **envp,
return retval;
}
+
+bool imgsrc_read(void *dst, off_t offset, size_t len,
+ const ImageSource *img, Error **errp)
+{
+ ssize_t ret;
+
+ if (offset + len <= img->cache_size) {
+ memcpy(dst, img->cache + offset, len);
+ return true;
+ }
+
+ if (img->fd < 0) {
+ error_setg(errp, "read past end of buffer");
+ return false;
+ }
+
+ ret = pread(img->fd, dst, len, offset);
+ if (ret == len) {
+ return true;
+ }
+ if (ret < 0) {
+ error_setg_errno(errp, errno, "Error reading file header");
+ } else {
+ error_setg(errp, "Incomplete read of file header");
+ }
+ return false;
+}
+
+void *imgsrc_read_alloc(off_t offset, size_t len,
+ const ImageSource *img, Error **errp)
+{
+ void *alloc = g_malloc(len);
+ bool ok = imgsrc_read(alloc, offset, len, img, errp);
+
+ if (!ok) {
+ g_free(alloc);
+ alloc = NULL;
+ }
+ return alloc;
+}
+
+abi_long imgsrc_mmap(abi_ulong start, abi_ulong len, int prot,
+ int flags, const ImageSource *src, abi_ulong offset)
+{
+ const int prot_write = PROT_READ | PROT_WRITE;
+ abi_long ret;
+ void *haddr;
+
+ assert(flags == (MAP_PRIVATE | MAP_FIXED));
+
+ if (src->fd >= 0) {
+ return target_mmap(start, len, prot, flags, src->fd, offset);
+ }
+
+ /*
+ * This case is for the vdso; we don't expect bad images.
+ * The mmap may extend beyond the end of the image, especially
+ * to the end of the page. Zero fill.
+ */
+ assert(offset < src->cache_size);
+
+ ret = target_mmap(start, len, prot_write, flags | MAP_ANON, -1, 0);
+ if (ret == -1) {
+ return ret;
+ }
+
+ haddr = lock_user(VERIFY_WRITE, start, len, 0);
+ assert(haddr != NULL);
+ if (offset + len <= src->cache_size) {
+ memcpy(haddr, src->cache + offset, len);
+ } else {
+ size_t rest = src->cache_size - offset;
+ memcpy(haddr, src->cache + offset, rest);
+ memset(haddr + rest, 0, len - rest);
+ }
+ unlock_user(haddr, start, len);
+
+ if (prot != prot_write) {
+ target_mprotect(start, len, prot);
+ }
+
+ return ret;
+}
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 03/20] linux-user: Tidy loader_exec
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
2023-08-29 22:02 ` [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain Richard Henderson
2023-08-29 22:02 ` [PATCH v5 02/20] linux-user: Introduce imgsrc_read, imgsrc_read_alloc Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-09-04 14:54 ` Alex Bennée
2023-08-29 22:02 ` [PATCH v5 04/20] linux-user: Do not clobber bprm_buf swapping ehdr Richard Henderson
` (17 subsequent siblings)
20 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent, Philippe Mathieu-Daudé
Reorg the if cases to reduce indentation.
Test for 4 bytes in the file before checking the signatures.
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/linuxload.c | 42 +++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/linux-user/linuxload.c b/linux-user/linuxload.c
index 3536dd8104..5b7e9ab983 100644
--- a/linux-user/linuxload.c
+++ b/linux-user/linuxload.c
@@ -154,31 +154,31 @@ int loader_exec(int fdexec, const char *filename, char **argv, char **envp,
retval = prepare_binprm(bprm);
- if (retval >= 0) {
- if (bprm->buf[0] == 0x7f
- && bprm->buf[1] == 'E'
- && bprm->buf[2] == 'L'
- && bprm->buf[3] == 'F') {
- retval = load_elf_binary(bprm, infop);
-#if defined(TARGET_HAS_BFLT)
- } else if (bprm->buf[0] == 'b'
- && bprm->buf[1] == 'F'
- && bprm->buf[2] == 'L'
- && bprm->buf[3] == 'T') {
- retval = load_flt_binary(bprm, infop);
-#endif
- } else {
- return -ENOEXEC;
- }
+ if (retval < 4) {
+ return -ENOEXEC;
}
-
- if (retval >= 0) {
- /* success. Initialize important registers */
- do_init_thread(regs, infop);
+ if (bprm->buf[0] == 0x7f
+ && bprm->buf[1] == 'E'
+ && bprm->buf[2] == 'L'
+ && bprm->buf[3] == 'F') {
+ retval = load_elf_binary(bprm, infop);
+#if defined(TARGET_HAS_BFLT)
+ } else if (bprm->buf[0] == 'b'
+ && bprm->buf[1] == 'F'
+ && bprm->buf[2] == 'L'
+ && bprm->buf[3] == 'T') {
+ retval = load_flt_binary(bprm, infop);
+#endif
+ } else {
+ return -ENOEXEC;
+ }
+ if (retval < 0) {
return retval;
}
- return retval;
+ /* Success. Initialize important registers. */
+ do_init_thread(regs, infop);
+ return 0;
}
bool imgsrc_read(void *dst, off_t offset, size_t len,
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 04/20] linux-user: Do not clobber bprm_buf swapping ehdr
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (2 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 03/20] linux-user: Tidy loader_exec Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-09-04 14:58 ` Alex Bennée
2023-08-29 22:02 ` [PATCH v5 05/20] linux-user: Use ImageSource in load_elf_image Richard Henderson
` (16 subsequent siblings)
20 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent, Philippe Mathieu-Daudé
Rearrange the allocation of storage for ehdr between load_elf_image
and load_elf_binary. The same set of copies are done, but we don't
modify bprm_buf, which will be important later.
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/elfload.c | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 92b981c445..4d3b25ed14 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -3020,16 +3020,17 @@ static bool parse_elf_properties(int image_fd,
On return: INFO values will be filled in, as necessary or available. */
static void load_elf_image(const char *image_name, int image_fd,
- struct image_info *info, char **pinterp_name,
+ struct image_info *info, struct elfhdr *ehdr,
+ char **pinterp_name,
char bprm_buf[BPRM_BUF_SIZE])
{
- struct elfhdr *ehdr = (struct elfhdr *)bprm_buf;
struct elf_phdr *phdr;
abi_ulong load_addr, load_bias, loaddr, hiaddr, error;
int i, retval, prot_exec;
Error *err = NULL;
/* First of all, some simple consistency checks */
+ memcpy(ehdr, bprm_buf, sizeof(*ehdr));
if (!elf_check_ident(ehdr)) {
error_setg(&err, "Invalid ELF image for this architecture");
goto exit_errmsg;
@@ -3344,6 +3345,7 @@ static void load_elf_image(const char *image_name, int image_fd,
static void load_elf_interp(const char *filename, struct image_info *info,
char bprm_buf[BPRM_BUF_SIZE])
{
+ struct elfhdr ehdr;
int fd, retval;
Error *err = NULL;
@@ -3365,7 +3367,7 @@ static void load_elf_interp(const char *filename, struct image_info *info,
memset(bprm_buf + retval, 0, BPRM_BUF_SIZE - retval);
}
- load_elf_image(filename, fd, info, NULL, bprm_buf);
+ load_elf_image(filename, fd, info, &ehdr, NULL, bprm_buf);
}
static int symfind(const void *s0, const void *s1)
@@ -3558,8 +3560,14 @@ uint32_t get_elf_eflags(int fd)
int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
{
+ /*
+ * We need a copy of the elf header for passing to create_elf_tables.
+ * We will have overwritten the original when we re-use bprm->buf
+ * while loading the interpreter. Allocate the storage for this now
+ * and let elf_load_image do any swapping that may be required.
+ */
+ struct elfhdr ehdr;
struct image_info interp_info;
- struct elfhdr elf_ex;
char *elf_interpreter = NULL;
char *scratch;
@@ -3571,12 +3579,7 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
info->start_mmap = (abi_ulong)ELF_START_MMAP;
load_elf_image(bprm->filename, bprm->fd, info,
- &elf_interpreter, bprm->buf);
-
- /* ??? We need a copy of the elf header for passing to create_elf_tables.
- If we do nothing, we'll have overwritten this when we re-use bprm->buf
- when we load the interpreter. */
- elf_ex = *(struct elfhdr *)bprm->buf;
+ &ehdr, &elf_interpreter, bprm->buf);
/* Do this so that we can load the interpreter, if need be. We will
change some of these later */
@@ -3663,7 +3666,7 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
target_mprotect(tramp_page, TARGET_PAGE_SIZE, PROT_READ | PROT_EXEC);
}
- bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &elf_ex,
+ bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &ehdr,
info, (elf_interpreter ? &interp_info : NULL));
info->start_stack = bprm->p;
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 05/20] linux-user: Use ImageSource in load_elf_image
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (3 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 04/20] linux-user: Do not clobber bprm_buf swapping ehdr Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 06/20] linux-user: Use ImageSource in load_symbols Richard Henderson
` (15 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Change parse_elf_properties as well, as the bprm_buf argument
ties the two functions closely.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/elfload.c | 128 +++++++++++++++++--------------------------
1 file changed, 49 insertions(+), 79 deletions(-)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 4d3b25ed14..833c22da25 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -2923,10 +2923,9 @@ static bool parse_elf_property(const uint32_t *data, int *off, int datasz,
}
/* Process NT_GNU_PROPERTY_TYPE_0. */
-static bool parse_elf_properties(int image_fd,
+static bool parse_elf_properties(const ImageSource *src,
struct image_info *info,
const struct elf_phdr *phdr,
- char bprm_buf[BPRM_BUF_SIZE],
Error **errp)
{
union {
@@ -2954,14 +2953,8 @@ static bool parse_elf_properties(int image_fd,
return false;
}
- if (phdr->p_offset + n <= BPRM_BUF_SIZE) {
- memcpy(¬e, bprm_buf + phdr->p_offset, n);
- } else {
- ssize_t len = pread(image_fd, ¬e, n, phdr->p_offset);
- if (len != n) {
- error_setg_errno(errp, errno, "Error reading file header");
- return false;
- }
+ if (!imgsrc_read(¬e, phdr->p_offset, n, src, errp)) {
+ return false;
}
/*
@@ -3007,30 +3000,34 @@ static bool parse_elf_properties(int image_fd,
}
}
-/* Load an ELF image into the address space.
+/**
+ * load_elf_image: Load an ELF image into the address space.
+ * @image_name: the filename of the image, to use in error messages.
+ * @src: the ImageSource from which to read.
+ * @info: info collected from the loaded image.
+ * @ehdr: the ELF header, not yet bswapped.
+ * @pinterp_name: record any PT_INTERP string found.
+ *
+ * On return: @info values will be filled in, as necessary or available.
+ */
- IMAGE_NAME is the filename of the image, to use in error messages.
- IMAGE_FD is the open file descriptor for the image.
-
- BPRM_BUF is a copy of the beginning of the file; this of course
- contains the elf file header at offset 0. It is assumed that this
- buffer is sufficiently aligned to present no problems to the host
- in accessing data at aligned offsets within the buffer.
-
- On return: INFO values will be filled in, as necessary or available. */
-
-static void load_elf_image(const char *image_name, int image_fd,
+static void load_elf_image(const char *image_name, const ImageSource *src,
struct image_info *info, struct elfhdr *ehdr,
- char **pinterp_name,
- char bprm_buf[BPRM_BUF_SIZE])
+ char **pinterp_name)
{
- struct elf_phdr *phdr;
+ g_autofree struct elf_phdr *phdr = NULL;
abi_ulong load_addr, load_bias, loaddr, hiaddr, error;
- int i, retval, prot_exec;
+ int i, prot_exec;
Error *err = NULL;
- /* First of all, some simple consistency checks */
- memcpy(ehdr, bprm_buf, sizeof(*ehdr));
+ /*
+ * First of all, some simple consistency checks.
+ * Note that we rely on the bswapped ehdr staying in bprm_buf,
+ * for later use by load_elf_binary and create_elf_tables.
+ */
+ if (!imgsrc_read(ehdr, 0, sizeof(*ehdr), src, &err)) {
+ goto exit_errmsg;
+ }
if (!elf_check_ident(ehdr)) {
error_setg(&err, "Invalid ELF image for this architecture");
goto exit_errmsg;
@@ -3041,15 +3038,11 @@ static void load_elf_image(const char *image_name, int image_fd,
goto exit_errmsg;
}
- i = ehdr->e_phnum * sizeof(struct elf_phdr);
- if (ehdr->e_phoff + i <= BPRM_BUF_SIZE) {
- phdr = (struct elf_phdr *)(bprm_buf + ehdr->e_phoff);
- } else {
- phdr = (struct elf_phdr *) alloca(i);
- retval = pread(image_fd, phdr, i, ehdr->e_phoff);
- if (retval != i) {
- goto exit_read;
- }
+ phdr = imgsrc_read_alloc(ehdr->e_phoff,
+ ehdr->e_phnum * sizeof(struct elf_phdr),
+ src, &err);
+ if (phdr == NULL) {
+ goto exit_errmsg;
}
bswap_phdr(phdr, ehdr->e_phnum);
@@ -3086,17 +3079,10 @@ static void load_elf_image(const char *image_name, int image_fd,
goto exit_errmsg;
}
- interp_name = g_malloc(eppnt->p_filesz);
-
- if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
- memcpy(interp_name, bprm_buf + eppnt->p_offset,
- eppnt->p_filesz);
- } else {
- retval = pread(image_fd, interp_name, eppnt->p_filesz,
- eppnt->p_offset);
- if (retval != eppnt->p_filesz) {
- goto exit_read;
- }
+ interp_name = imgsrc_read_alloc(eppnt->p_offset, eppnt->p_filesz,
+ src, &err);
+ if (interp_name == NULL) {
+ goto exit_errmsg;
}
if (interp_name[eppnt->p_filesz - 1] != 0) {
error_setg(&err, "Invalid PT_INTERP entry");
@@ -3104,7 +3090,7 @@ static void load_elf_image(const char *image_name, int image_fd,
}
*pinterp_name = g_steal_pointer(&interp_name);
} else if (eppnt->p_type == PT_GNU_PROPERTY) {
- if (!parse_elf_properties(image_fd, info, eppnt, bprm_buf, &err)) {
+ if (!parse_elf_properties(src, info, eppnt, &err)) {
goto exit_errmsg;
}
} else if (eppnt->p_type == PT_GNU_STACK) {
@@ -3257,9 +3243,9 @@ static void load_elf_image(const char *image_name, int image_fd,
* but no backing file segment.
*/
if (eppnt->p_filesz != 0) {
- error = target_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po,
+ error = imgsrc_mmap(vaddr_ps, eppnt->p_filesz + vaddr_po,
elf_prot, MAP_PRIVATE | MAP_FIXED,
- image_fd, eppnt->p_offset - vaddr_po);
+ src, eppnt->p_offset - vaddr_po);
if (error == -1) {
goto exit_mmap;
}
@@ -3291,20 +3277,11 @@ static void load_elf_image(const char *image_name, int image_fd,
#ifdef TARGET_MIPS
} else if (eppnt->p_type == PT_MIPS_ABIFLAGS) {
Mips_elf_abiflags_v0 abiflags;
- if (eppnt->p_filesz < sizeof(Mips_elf_abiflags_v0)) {
- error_setg(&err, "Invalid PT_MIPS_ABIFLAGS entry");
+
+ if (!imgsrc_read(&abiflags, eppnt->p_offset, sizeof(abiflags),
+ src, &err)) {
goto exit_errmsg;
}
- if (eppnt->p_offset + eppnt->p_filesz <= BPRM_BUF_SIZE) {
- memcpy(&abiflags, bprm_buf + eppnt->p_offset,
- sizeof(Mips_elf_abiflags_v0));
- } else {
- retval = pread(image_fd, &abiflags, sizeof(Mips_elf_abiflags_v0),
- eppnt->p_offset);
- if (retval != sizeof(Mips_elf_abiflags_v0)) {
- goto exit_read;
- }
- }
bswap_mips_abiflags(&abiflags);
info->fp_abi = abiflags.fp_abi;
#endif
@@ -3317,23 +3294,16 @@ static void load_elf_image(const char *image_name, int image_fd,
}
if (qemu_log_enabled()) {
- load_symbols(ehdr, image_fd, load_bias);
+ load_symbols(ehdr, src->fd, load_bias);
}
- debuginfo_report_elf(image_name, image_fd, load_bias);
+ debuginfo_report_elf(image_name, src->fd, load_bias);
mmap_unlock();
- close(image_fd);
+ close(src->fd);
return;
- exit_read:
- if (retval >= 0) {
- error_setg(&err, "Incomplete read of file header");
- } else {
- error_setg_errno(&err, errno, "Error reading file header");
- }
- goto exit_errmsg;
exit_mmap:
error_setg_errno(&err, errno, "Error mapping file");
goto exit_errmsg;
@@ -3346,6 +3316,7 @@ static void load_elf_interp(const char *filename, struct image_info *info,
char bprm_buf[BPRM_BUF_SIZE])
{
struct elfhdr ehdr;
+ ImageSource src;
int fd, retval;
Error *err = NULL;
@@ -3363,11 +3334,11 @@ static void load_elf_interp(const char *filename, struct image_info *info,
exit(-1);
}
- if (retval < BPRM_BUF_SIZE) {
- memset(bprm_buf + retval, 0, BPRM_BUF_SIZE - retval);
- }
+ src.fd = fd;
+ src.cache = bprm_buf;
+ src.cache_size = retval;
- load_elf_image(filename, fd, info, &ehdr, NULL, bprm_buf);
+ load_elf_image(filename, &src, info, &ehdr, NULL);
}
static int symfind(const void *s0, const void *s1)
@@ -3578,8 +3549,7 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
info->start_mmap = (abi_ulong)ELF_START_MMAP;
- load_elf_image(bprm->filename, bprm->fd, info,
- &ehdr, &elf_interpreter, bprm->buf);
+ load_elf_image(bprm->filename, &bprm->src, info, &ehdr, &elf_interpreter);
/* Do this so that we can load the interpreter, if need be. We will
change some of these later */
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 06/20] linux-user: Use ImageSource in load_symbols
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (4 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 05/20] linux-user: Use ImageSource in load_elf_image Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 07/20] linux-user: Replace bprm->fd with bprm->src.fd Richard Henderson
` (14 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent, Philippe Mathieu-Daudé
Aside from the section headers, we're unlikely to hit the
ImageSource cache on guest executables. But the interface
for imgsrc_read_* is better.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/elfload.c | 87 ++++++++++++++++++++++++--------------------
1 file changed, 48 insertions(+), 39 deletions(-)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 833c22da25..f34fb64c0c 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -2049,7 +2049,8 @@ static inline void bswap_mips_abiflags(Mips_elf_abiflags_v0 *abiflags) { }
#ifdef USE_ELF_CORE_DUMP
static int elf_core_dump(int, const CPUArchState *);
#endif /* USE_ELF_CORE_DUMP */
-static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias);
+static void load_symbols(struct elfhdr *hdr, const ImageSource *src,
+ abi_ulong load_bias);
/* Verify the portions of EHDR within E_IDENT for the target.
This can be performed before bswapping the entire header. */
@@ -3294,7 +3295,7 @@ static void load_elf_image(const char *image_name, const ImageSource *src,
}
if (qemu_log_enabled()) {
- load_symbols(ehdr, src->fd, load_bias);
+ load_symbols(ehdr, src, load_bias);
}
debuginfo_report_elf(image_name, src->fd, load_bias);
@@ -3385,19 +3386,20 @@ static int symcmp(const void *s0, const void *s1)
}
/* Best attempt to load symbols from this ELF object. */
-static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
+static void load_symbols(struct elfhdr *hdr, const ImageSource *src,
+ abi_ulong load_bias)
{
int i, shnum, nsyms, sym_idx = 0, str_idx = 0;
- uint64_t segsz;
- struct elf_shdr *shdr;
+ g_autofree struct elf_shdr *shdr = NULL;
char *strings = NULL;
- struct syminfo *s = NULL;
- struct elf_sym *new_syms, *syms = NULL;
+ struct elf_sym *syms = NULL;
+ struct elf_sym *new_syms;
+ uint64_t segsz;
shnum = hdr->e_shnum;
- i = shnum * sizeof(struct elf_shdr);
- shdr = (struct elf_shdr *)alloca(i);
- if (pread(fd, shdr, i, hdr->e_shoff) != i) {
+ shdr = imgsrc_read_alloc(hdr->e_shoff, shnum * sizeof(struct elf_shdr),
+ src, NULL);
+ if (shdr == NULL) {
return;
}
@@ -3415,31 +3417,33 @@ static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
found:
/* Now know where the strtab and symtab are. Snarf them. */
- s = g_try_new(struct syminfo, 1);
- if (!s) {
- goto give_up;
- }
segsz = shdr[str_idx].sh_size;
- s->disas_strtab = strings = g_try_malloc(segsz);
- if (!strings ||
- pread(fd, strings, segsz, shdr[str_idx].sh_offset) != segsz) {
+ strings = g_try_malloc(segsz);
+ if (!strings) {
+ goto give_up;
+ }
+ if (!imgsrc_read(strings, shdr[str_idx].sh_offset, segsz, src, NULL)) {
goto give_up;
}
segsz = shdr[sym_idx].sh_size;
- syms = g_try_malloc(segsz);
- if (!syms || pread(fd, syms, segsz, shdr[sym_idx].sh_offset) != segsz) {
- goto give_up;
- }
-
if (segsz / sizeof(struct elf_sym) > INT_MAX) {
- /* Implausibly large symbol table: give up rather than ploughing
- * on with the number of symbols calculation overflowing
+ /*
+ * Implausibly large symbol table: give up rather than ploughing
+ * on with the number of symbols calculation overflowing.
*/
goto give_up;
}
nsyms = segsz / sizeof(struct elf_sym);
+ syms = g_try_malloc(segsz);
+ if (!syms) {
+ goto give_up;
+ }
+ if (!imgsrc_read(syms, shdr[sym_idx].sh_offset, segsz, src, NULL)) {
+ goto give_up;
+ }
+
for (i = 0; i < nsyms; ) {
bswap_sym(syms + i);
/* Throw away entries which we do not need. */
@@ -3464,10 +3468,12 @@ static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
goto give_up;
}
- /* Attempt to free the storage associated with the local symbols
- that we threw away. Whether or not this has any effect on the
- memory allocation depends on the malloc implementation and how
- many symbols we managed to discard. */
+ /*
+ * Attempt to free the storage associated with the local symbols
+ * that we threw away. Whether or not this has any effect on the
+ * memory allocation depends on the malloc implementation and how
+ * many symbols we managed to discard.
+ */
new_syms = g_try_renew(struct elf_sym, syms, nsyms);
if (new_syms == NULL) {
goto give_up;
@@ -3476,20 +3482,23 @@ static void load_symbols(struct elfhdr *hdr, int fd, abi_ulong load_bias)
qsort(syms, nsyms, sizeof(*syms), symcmp);
- s->disas_num_syms = nsyms;
-#if ELF_CLASS == ELFCLASS32
- s->disas_symtab.elf32 = syms;
-#else
- s->disas_symtab.elf64 = syms;
-#endif
- s->lookup_symbol = lookup_symbolxx;
- s->next = syminfos;
- syminfos = s;
+ {
+ struct syminfo *s = g_new(struct syminfo, 1);
+ s->disas_strtab = strings;
+ s->disas_num_syms = nsyms;
+#if ELF_CLASS == ELFCLASS32
+ s->disas_symtab.elf32 = syms;
+#else
+ s->disas_symtab.elf64 = syms;
+#endif
+ s->lookup_symbol = lookup_symbolxx;
+ s->next = syminfos;
+ syminfos = s;
+ }
return;
-give_up:
- g_free(s);
+ give_up:
g_free(strings);
g_free(syms);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 07/20] linux-user: Replace bprm->fd with bprm->src.fd
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (5 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 06/20] linux-user: Use ImageSource in load_symbols Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 08/20] linux-user: Load vdso image if available Richard Henderson
` (13 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent, Philippe Mathieu-Daudé
There are only a couple of uses of bprm->fd remaining.
Migrate to the other field.
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/loader.h | 1 -
linux-user/flatload.c | 8 ++++----
linux-user/linuxload.c | 5 ++---
3 files changed, 6 insertions(+), 8 deletions(-)
diff --git a/linux-user/loader.h b/linux-user/loader.h
index 311d20f5d1..5b4cdddd50 100644
--- a/linux-user/loader.h
+++ b/linux-user/loader.h
@@ -74,7 +74,6 @@ struct linux_binprm {
char buf[BPRM_BUF_SIZE] __attribute__((aligned));
ImageSource src;
abi_ulong p;
- int fd;
int e_uid, e_gid;
int argc, envc;
char **argv;
diff --git a/linux-user/flatload.c b/linux-user/flatload.c
index 8f5e9f489b..15e3ec5f6b 100644
--- a/linux-user/flatload.c
+++ b/linux-user/flatload.c
@@ -463,7 +463,7 @@ static int load_flat_file(struct linux_binprm * bprm,
DBG_FLT("BINFMT_FLAT: ROM mapping of file (we hope)\n");
textpos = target_mmap(0, text_len, PROT_READ|PROT_EXEC,
- MAP_PRIVATE, bprm->fd, 0);
+ MAP_PRIVATE, bprm->src.fd, 0);
if (textpos == -1) {
fprintf(stderr, "Unable to mmap process text\n");
return -1;
@@ -490,7 +490,7 @@ static int load_flat_file(struct linux_binprm * bprm,
} else
#endif
{
- result = target_pread(bprm->fd, datapos,
+ result = target_pread(bprm->src.fd, datapos,
data_len + (relocs * sizeof(abi_ulong)),
fpos);
}
@@ -540,10 +540,10 @@ static int load_flat_file(struct linux_binprm * bprm,
else
#endif
{
- result = target_pread(bprm->fd, textpos,
+ result = target_pread(bprm->src.fd, textpos,
text_len, 0);
if (result >= 0) {
- result = target_pread(bprm->fd, datapos,
+ result = target_pread(bprm->src.fd, datapos,
data_len + (relocs * sizeof(abi_ulong)),
ntohl(hdr->data_start));
}
diff --git a/linux-user/linuxload.c b/linux-user/linuxload.c
index 5b7e9ab983..4a794f8cea 100644
--- a/linux-user/linuxload.c
+++ b/linux-user/linuxload.c
@@ -39,7 +39,7 @@ static int prepare_binprm(struct linux_binprm *bprm)
int mode;
int retval;
- if (fstat(bprm->fd, &st) < 0) {
+ if (fstat(bprm->src.fd, &st) < 0) {
return -errno;
}
@@ -69,7 +69,7 @@ static int prepare_binprm(struct linux_binprm *bprm)
bprm->e_gid = st.st_gid;
}
- retval = read(bprm->fd, bprm->buf, BPRM_BUF_SIZE);
+ retval = read(bprm->src.fd, bprm->buf, BPRM_BUF_SIZE);
if (retval < 0) {
perror("prepare_binprm");
exit(-1);
@@ -144,7 +144,6 @@ int loader_exec(int fdexec, const char *filename, char **argv, char **envp,
{
int retval;
- bprm->fd = fdexec;
bprm->src.fd = fdexec;
bprm->filename = (char *)filename;
bprm->argc = count(argv);
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 08/20] linux-user: Load vdso image if available
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (6 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 07/20] linux-user: Replace bprm->fd with bprm->src.fd Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-30 14:22 ` Philippe Mathieu-Daudé
2023-08-29 22:02 ` [PATCH v5 09/20] linux-user: Add gen-vdso tool Richard Henderson
` (12 subsequent siblings)
20 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
The vdso image will be pre-processed into a C data array, with
a simple list of relocations to perform, and identifying the
location of signal trampolines.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/elfload.c | 87 +++++++++++++++++++++++++++++++++++++++-----
1 file changed, 78 insertions(+), 9 deletions(-)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index f34fb64c0c..2a6adebb4a 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -33,6 +33,19 @@
#undef ELF_ARCH
#endif
+#ifndef TARGET_ARCH_HAS_SIGTRAMP_PAGE
+#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
+#endif
+
+typedef struct {
+ const uint8_t *image;
+ const uint32_t *relocs;
+ unsigned image_size;
+ unsigned reloc_count;
+ unsigned sigreturn_ofs;
+ unsigned rt_sigreturn_ofs;
+} VdsoImageInfo;
+
#define ELF_OSABI ELFOSABI_SYSV
/* from personality.h */
@@ -2292,7 +2305,8 @@ static abi_ulong loader_build_fdpic_loadmap(struct image_info *info, abi_ulong s
static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
struct elfhdr *exec,
struct image_info *info,
- struct image_info *interp_info)
+ struct image_info *interp_info,
+ struct image_info *vdso_info)
{
abi_ulong sp;
abi_ulong u_argc, u_argv, u_envp, u_auxv;
@@ -2380,10 +2394,15 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
}
size = (DLINFO_ITEMS + 1) * 2;
- if (k_base_platform)
+ if (k_base_platform) {
size += 2;
- if (k_platform)
+ }
+ if (k_platform) {
size += 2;
+ }
+ if (vdso_info) {
+ size += 2;
+ }
#ifdef DLINFO_ARCH_ITEMS
size += DLINFO_ARCH_ITEMS * 2;
#endif
@@ -2465,6 +2484,9 @@ static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
if (u_platform) {
NEW_AUX_ENT(AT_PLATFORM, u_platform);
}
+ if (vdso_info) {
+ NEW_AUX_ENT(AT_SYSINFO_EHDR, vdso_info->load_addr);
+ }
NEW_AUX_ENT (AT_NULL, 0);
#undef NEW_AUX_ENT
@@ -3342,6 +3364,49 @@ static void load_elf_interp(const char *filename, struct image_info *info,
load_elf_image(filename, &src, info, &ehdr, NULL);
}
+#ifndef vdso_image_info
+#define vdso_image_info() NULL
+#endif
+
+static void load_elf_vdso(struct image_info *info, const VdsoImageInfo *vdso)
+{
+ ImageSource src;
+ struct elfhdr ehdr;
+ abi_ulong load_bias, load_addr;
+
+ src.fd = -1;
+ src.cache = vdso->image;
+ src.cache_size = vdso->image_size;
+
+ load_elf_image("<internal-vdso>", &src, info, &ehdr, NULL);
+ load_addr = info->load_addr;
+ load_bias = info->load_bias;
+
+ /*
+ * We need to relocate the VDSO image. The one built into the kernel
+ * is built for a fixed address. The one built for QEMU is not, since
+ * that requires close control of the guest address space.
+ * We pre-processed the image to locate all of the addresses that need
+ * to be updated.
+ */
+ for (unsigned i = 0, n = vdso->reloc_count; i < n; i++) {
+ abi_ulong *addr = g2h_untagged(load_addr + vdso->relocs[i]);
+ *addr = tswapal(tswapal(*addr) + load_bias);
+ }
+
+ /* Install signal trampolines, if present. */
+ if (vdso->sigreturn_ofs) {
+ default_sigreturn = load_addr + vdso->sigreturn_ofs;
+ }
+ if (vdso->rt_sigreturn_ofs) {
+ default_rt_sigreturn = load_addr + vdso->rt_sigreturn_ofs;
+ }
+
+ /* Remove write from VDSO segment. */
+ target_mprotect(info->start_data, info->end_data - info->start_data,
+ PROT_READ | PROT_EXEC);
+}
+
static int symfind(const void *s0, const void *s1)
{
struct elf_sym *sym = (struct elf_sym *)s1;
@@ -3547,7 +3612,7 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
* and let elf_load_image do any swapping that may be required.
*/
struct elfhdr ehdr;
- struct image_info interp_info;
+ struct image_info interp_info, vdso_info;
char *elf_interpreter = NULL;
char *scratch;
@@ -3630,10 +3695,13 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
}
/*
- * TODO: load a vdso, which would also contain the signal trampolines.
- * Otherwise, allocate a private page to hold them.
+ * Load a vdso if available, which will amongst other things contain the
+ * signal trampolines. Otherwise, allocate a separate page for them.
*/
- if (TARGET_ARCH_HAS_SIGTRAMP_PAGE) {
+ const VdsoImageInfo *vdso = vdso_image_info();
+ if (vdso) {
+ load_elf_vdso(&vdso_info, vdso);
+ } else if (TARGET_ARCH_HAS_SIGTRAMP_PAGE) {
abi_long tramp_page = target_mmap(0, TARGET_PAGE_SIZE,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0);
@@ -3645,8 +3713,9 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
target_mprotect(tramp_page, TARGET_PAGE_SIZE, PROT_READ | PROT_EXEC);
}
- bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &ehdr,
- info, (elf_interpreter ? &interp_info : NULL));
+ bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &ehdr, info,
+ elf_interpreter ? &interp_info : NULL,
+ vdso ? &vdso_info : NULL);
info->start_stack = bprm->p;
/* If we have an interpreter, set that as the program's entry point.
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 09/20] linux-user: Add gen-vdso tool
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (7 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 08/20] linux-user: Load vdso image if available Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 10/20] linux-user: Add build-vdso.sh tool Richard Henderson
` (11 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
This tool will be used for post-processing the linked vdso image,
turning it into something that is easy to include into elfload.c.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/gen-vdso.c | 223 ++++++++++++++++++++++++
linux-user/gen-vdso-elfn.c.inc | 307 +++++++++++++++++++++++++++++++++
linux-user/meson.build | 6 +-
3 files changed, 535 insertions(+), 1 deletion(-)
create mode 100644 linux-user/gen-vdso.c
create mode 100644 linux-user/gen-vdso-elfn.c.inc
diff --git a/linux-user/gen-vdso.c b/linux-user/gen-vdso.c
new file mode 100644
index 0000000000..a6c61d2f6e
--- /dev/null
+++ b/linux-user/gen-vdso.c
@@ -0,0 +1,223 @@
+/*
+ * Post-process a vdso elf image for inclusion into qemu.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <endian.h>
+#include <unistd.h>
+#include "elf.h"
+
+
+#define bswap_(p) _Generic(*(p), \
+ uint16_t: __builtin_bswap16, \
+ uint32_t: __builtin_bswap32, \
+ uint64_t: __builtin_bswap64, \
+ int16_t: __builtin_bswap16, \
+ int32_t: __builtin_bswap32, \
+ int64_t: __builtin_bswap64)
+#define bswaps(p) (*(p) = bswap_(p)(*(p)))
+
+static void output_reloc(FILE *outf, void *buf, void *loc)
+{
+ fprintf(outf, " 0x%08lx,\n", (unsigned long)(loc - buf));
+}
+
+static const char *sigreturn_sym;
+static const char *rt_sigreturn_sym;
+
+static unsigned sigreturn_addr;
+static unsigned rt_sigreturn_addr;
+
+#define N 32
+#define elfN(x) elf32_##x
+#define ElfN(x) Elf32_##x
+#include "gen-vdso-elfn.c.inc"
+#undef N
+#undef elfN
+#undef ElfN
+
+#define N 64
+#define elfN(x) elf64_##x
+#define ElfN(x) Elf64_##x
+#include "gen-vdso-elfn.c.inc"
+#undef N
+#undef elfN
+#undef ElfN
+
+
+int main(int argc, char **argv)
+{
+ FILE *inf, *outf;
+ long total_len;
+ const char *prefix = "vdso";
+ const char *inf_name;
+ const char *outf_name = NULL;
+ unsigned char *buf;
+ bool need_bswap;
+
+ while (1) {
+ int opt = getopt(argc, argv, "o:p:r:s:");
+ if (opt < 0) {
+ break;
+ }
+ switch (opt) {
+ case 'o':
+ outf_name = optarg;
+ break;
+ case 'p':
+ prefix = optarg;
+ break;
+ case 'r':
+ rt_sigreturn_sym = optarg;
+ break;
+ case 's':
+ sigreturn_sym = optarg;
+ break;
+ default:
+ usage:
+ fprintf(stderr, "usage: [-p prefix] [-r rt-sigreturn-name] "
+ "[-s sigreturn-name] -o output-file input-file\n");
+ return EXIT_FAILURE;
+ }
+ }
+
+ if (optind >= argc || outf_name == NULL) {
+ goto usage;
+ }
+ inf_name = argv[optind];
+
+ /*
+ * Open the input and output files.
+ */
+ inf = fopen(inf_name, "rb");
+ if (inf == NULL) {
+ goto perror_inf;
+ }
+ outf = fopen(outf_name, "w");
+ if (outf == NULL) {
+ goto perror_outf;
+ }
+
+ /*
+ * Read the input file into a buffer.
+ * We expect the vdso to be small, on the order of one page,
+ * therefore we do not expect a partial read.
+ */
+ fseek(inf, 0, SEEK_END);
+ total_len = ftell(inf);
+ fseek(inf, 0, SEEK_SET);
+
+ buf = malloc(total_len);
+ if (buf == NULL) {
+ goto perror_inf;
+ }
+
+ errno = 0;
+ if (fread(buf, 1, total_len, inf) != total_len) {
+ if (errno) {
+ goto perror_inf;
+ }
+ fprintf(stderr, "%s: incomplete read\n", inf_name);
+ return EXIT_FAILURE;
+ }
+ fclose(inf);
+
+ /*
+ * Write out the vdso image now, before we make local changes.
+ */
+
+ fprintf(outf,
+ "/* Automatically generated from linux-user/gen-vdso.c. */\n"
+ "\n"
+ "static const uint8_t %s_image[] = {",
+ prefix);
+ for (long i = 0; i < total_len; ++i) {
+ if (i % 12 == 0) {
+ fputs("\n ", outf);
+ }
+ fprintf(outf, " 0x%02x,", buf[i]);
+ }
+ fprintf(outf, "\n};\n\n");
+
+ /*
+ * Identify which elf flavor we're processing.
+ * The first 16 bytes of the file are e_ident.
+ */
+
+ if (buf[EI_MAG0] != ELFMAG0 || buf[EI_MAG1] != ELFMAG1 ||
+ buf[EI_MAG2] != ELFMAG2 || buf[EI_MAG3] != ELFMAG3) {
+ fprintf(stderr, "%s: not an elf file\n", inf_name);
+ return EXIT_FAILURE;
+ }
+ switch (buf[EI_DATA]) {
+ case ELFDATA2LSB:
+ need_bswap = BYTE_ORDER != LITTLE_ENDIAN;
+ break;
+ case ELFDATA2MSB:
+ need_bswap = BYTE_ORDER != BIG_ENDIAN;
+ break;
+ default:
+ fprintf(stderr, "%s: invalid elf EI_DATA (%u)\n",
+ inf_name, buf[EI_DATA]);
+ return EXIT_FAILURE;
+ }
+
+ /*
+ * We need to relocate the VDSO image. The one built into the kernel
+ * is built for a fixed address. The one we built for QEMU is not,
+ * since that requires close control of the guest address space.
+ *
+ * Output relocation addresses as we go.
+ */
+
+ fprintf(outf, "static const unsigned %s_relocs[] = {\n", prefix);
+
+ switch (buf[EI_CLASS]) {
+ case ELFCLASS32:
+ elf32_process(outf, buf, need_bswap);
+ break;
+ case ELFCLASS64:
+ elf64_process(outf, buf, need_bswap);
+ break;
+ default:
+ fprintf(stderr, "%s: invalid elf EI_CLASS (%u)\n",
+ inf_name, buf[EI_CLASS]);
+ return EXIT_FAILURE;
+ }
+
+ fprintf(outf, "};\n\n"); /* end vdso_relocs. */
+
+ fprintf(outf, "static const VdsoImageInfo %s_image_info = {\n", prefix);
+ fprintf(outf, " .image = %s_image,\n", prefix);
+ fprintf(outf, " .relocs = %s_relocs,\n", prefix);
+ fprintf(outf, " .image_size = sizeof(%s_image),\n", prefix);
+ fprintf(outf, " .reloc_count = ARRAY_SIZE(%s_relocs),\n", prefix);
+ fprintf(outf, " .sigreturn_ofs = 0x%x,\n", sigreturn_addr);
+ fprintf(outf, " .rt_sigreturn_ofs = 0x%x,\n", rt_sigreturn_addr);
+ fprintf(outf, "};\n");
+
+ /*
+ * Everything should have gone well.
+ */
+ if (fclose(outf)) {
+ goto perror_outf;
+ }
+ return EXIT_SUCCESS;
+
+ perror_inf:
+ perror(inf_name);
+ return EXIT_FAILURE;
+
+ perror_outf:
+ perror(outf_name);
+ return EXIT_FAILURE;
+}
diff --git a/linux-user/gen-vdso-elfn.c.inc b/linux-user/gen-vdso-elfn.c.inc
new file mode 100644
index 0000000000..7034c36d5e
--- /dev/null
+++ b/linux-user/gen-vdso-elfn.c.inc
@@ -0,0 +1,307 @@
+/*
+ * Post-process a vdso elf image for inclusion into qemu.
+ * Elf size specialization.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+static void elfN(bswap_ehdr)(ElfN(Ehdr) *ehdr)
+{
+ bswaps(&ehdr->e_type); /* Object file type */
+ bswaps(&ehdr->e_machine); /* Architecture */
+ bswaps(&ehdr->e_version); /* Object file version */
+ bswaps(&ehdr->e_entry); /* Entry point virtual address */
+ bswaps(&ehdr->e_phoff); /* Program header table file offset */
+ bswaps(&ehdr->e_shoff); /* Section header table file offset */
+ bswaps(&ehdr->e_flags); /* Processor-specific flags */
+ bswaps(&ehdr->e_ehsize); /* ELF header size in bytes */
+ bswaps(&ehdr->e_phentsize); /* Program header table entry size */
+ bswaps(&ehdr->e_phnum); /* Program header table entry count */
+ bswaps(&ehdr->e_shentsize); /* Section header table entry size */
+ bswaps(&ehdr->e_shnum); /* Section header table entry count */
+ bswaps(&ehdr->e_shstrndx); /* Section header string table index */
+}
+
+static void elfN(bswap_phdr)(ElfN(Phdr) *phdr)
+{
+ bswaps(&phdr->p_type); /* Segment type */
+ bswaps(&phdr->p_flags); /* Segment flags */
+ bswaps(&phdr->p_offset); /* Segment file offset */
+ bswaps(&phdr->p_vaddr); /* Segment virtual address */
+ bswaps(&phdr->p_paddr); /* Segment physical address */
+ bswaps(&phdr->p_filesz); /* Segment size in file */
+ bswaps(&phdr->p_memsz); /* Segment size in memory */
+ bswaps(&phdr->p_align); /* Segment alignment */
+}
+
+static void elfN(bswap_shdr)(ElfN(Shdr) *shdr)
+{
+ bswaps(&shdr->sh_name);
+ bswaps(&shdr->sh_type);
+ bswaps(&shdr->sh_flags);
+ bswaps(&shdr->sh_addr);
+ bswaps(&shdr->sh_offset);
+ bswaps(&shdr->sh_size);
+ bswaps(&shdr->sh_link);
+ bswaps(&shdr->sh_info);
+ bswaps(&shdr->sh_addralign);
+ bswaps(&shdr->sh_entsize);
+}
+
+static void elfN(bswap_sym)(ElfN(Sym) *sym)
+{
+ bswaps(&sym->st_name);
+ bswaps(&sym->st_value);
+ bswaps(&sym->st_size);
+ bswaps(&sym->st_shndx);
+}
+
+static void elfN(bswap_dyn)(ElfN(Dyn) *dyn)
+{
+ bswaps(&dyn->d_tag); /* Dynamic type tag */
+ bswaps(&dyn->d_un.d_ptr); /* Dynamic ptr or val, in union */
+}
+
+static void elfN(search_symtab)(ElfN(Shdr) *shdr, unsigned sym_idx,
+ void *buf, bool need_bswap)
+{
+ unsigned str_idx = shdr[sym_idx].sh_link;
+ ElfN(Sym) *sym = buf + shdr[sym_idx].sh_offset;
+ unsigned sym_n = shdr[sym_idx].sh_size / sizeof(*sym);
+ const char *str = buf + shdr[str_idx].sh_offset;
+
+ for (unsigned i = 0; i < sym_n; ++i) {
+ const char *name;
+
+ if (need_bswap) {
+ elfN(bswap_sym)(sym + i);
+ }
+ name = str + sym[i].st_name;
+
+ if (sigreturn_sym && strcmp(sigreturn_sym, name) == 0) {
+ sigreturn_addr = sym[i].st_value;
+ }
+ if (rt_sigreturn_sym && strcmp(rt_sigreturn_sym, name) == 0) {
+ rt_sigreturn_addr = sym[i].st_value;
+ }
+ }
+}
+
+static void elfN(process)(FILE *outf, void *buf, bool need_bswap)
+{
+ ElfN(Ehdr) *ehdr = buf;
+ ElfN(Phdr) *phdr;
+ ElfN(Shdr) *shdr;
+ unsigned phnum, shnum;
+ unsigned dynamic_ofs = 0;
+ unsigned dynamic_addr = 0;
+ unsigned symtab_idx = 0;
+ unsigned dynsym_idx = 0;
+ unsigned first_segsz = 0;
+ int errors = 0;
+
+ if (need_bswap) {
+ elfN(bswap_ehdr)(ehdr);
+ }
+
+ phnum = ehdr->e_phnum;
+ phdr = buf + ehdr->e_phoff;
+ if (need_bswap) {
+ for (unsigned i = 0; i < phnum; ++i) {
+ elfN(bswap_phdr)(phdr + i);
+ }
+ }
+
+ shnum = ehdr->e_shnum;
+ shdr = buf + ehdr->e_shoff;
+ if (need_bswap) {
+ for (unsigned i = 0; i < shnum; ++i) {
+ elfN(bswap_shdr)(shdr + i);
+ }
+ }
+ for (unsigned i = 0; i < shnum; ++i) {
+ switch (shdr[i].sh_type) {
+ case SHT_SYMTAB:
+ symtab_idx = i;
+ break;
+ case SHT_DYNSYM:
+ dynsym_idx = i;
+ break;
+ }
+ }
+
+ /*
+ * Validate the VDSO is created as we expect: that PT_PHDR,
+ * PT_DYNAMIC, and PT_NOTE located in a writable data segment.
+ * PHDR and DYNAMIC require relocation, and NOTE will get the
+ * linux version number.
+ */
+ for (unsigned i = 0; i < phnum; ++i) {
+ if (phdr[i].p_type != PT_LOAD) {
+ continue;
+ }
+ if (first_segsz != 0) {
+ fprintf(stderr, "Multiple LOAD segments\n");
+ errors++;
+ }
+ if (phdr[i].p_offset != 0) {
+ fprintf(stderr, "LOAD segment does not cover EHDR\n");
+ errors++;
+ }
+ if (phdr[i].p_vaddr != 0) {
+ fprintf(stderr, "LOAD segment not loaded at address 0\n");
+ errors++;
+ }
+ first_segsz = phdr[i].p_filesz;
+ if (first_segsz < ehdr->e_phoff + phnum * sizeof(*phdr)) {
+ fprintf(stderr, "LOAD segment does not cover PHDRs\n");
+ errors++;
+ }
+ if ((phdr[i].p_flags & (PF_R | PF_W)) != (PF_R | PF_W)) {
+ fprintf(stderr, "LOAD segment is not read-write\n");
+ errors++;
+ }
+ }
+ for (unsigned i = 0; i < phnum; ++i) {
+ const char *which;
+
+ switch (phdr[i].p_type) {
+ case PT_PHDR:
+ which = "PT_PHDR";
+ break;
+ case PT_NOTE:
+ which = "PT_NOTE";
+ break;
+ case PT_DYNAMIC:
+ dynamic_ofs = phdr[i].p_offset;
+ dynamic_addr = phdr[i].p_vaddr;
+ which = "PT_DYNAMIC";
+ break;
+ default:
+ continue;
+ }
+ if (first_segsz < phdr[i].p_vaddr + phdr[i].p_filesz) {
+ fprintf(stderr, "LOAD segment does not cover %s\n", which);
+ errors++;
+ }
+ }
+ if (errors) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Relocate the program headers. */
+ for (unsigned i = 0; i < phnum; ++i) {
+ output_reloc(outf, buf, &phdr[i].p_vaddr);
+ output_reloc(outf, buf, &phdr[i].p_paddr);
+ }
+
+ /* Relocate the DYNAMIC entries. */
+ if (dynamic_addr) {
+ ElfN(Dyn) *dyn = buf + dynamic_ofs;
+ __typeof(dyn->d_tag) tag;
+
+ do {
+
+ if (need_bswap) {
+ elfN(bswap_dyn)(dyn);
+ }
+ tag = dyn->d_tag;
+
+ switch (tag) {
+ case DT_HASH:
+ case DT_SYMTAB:
+ case DT_STRTAB:
+ case DT_VERDEF:
+ case DT_VERSYM:
+ case DT_PLTGOT:
+ case DT_ADDRRNGLO ... DT_ADDRRNGHI:
+ /* These entries store an address in the entry. */
+ output_reloc(outf, buf, &dyn->d_un.d_val);
+ break;
+
+ case DT_NULL:
+ case DT_STRSZ:
+ case DT_SONAME:
+ case DT_DEBUG:
+ case DT_FLAGS:
+ case DT_FLAGS_1:
+ case DT_SYMBOLIC:
+ case DT_BIND_NOW:
+ case DT_VERDEFNUM:
+ case DT_VALRNGLO ... DT_VALRNGHI:
+ /* These entries store an integer in the entry. */
+ break;
+
+ case DT_SYMENT:
+ if (dyn->d_un.d_val != sizeof(ElfN(Sym))) {
+ fprintf(stderr, "VDSO has incorrect dynamic symbol size\n");
+ errors++;
+ }
+ break;
+
+ case DT_REL:
+ case DT_RELSZ:
+ case DT_RELA:
+ case DT_RELASZ:
+ /*
+ * These entries indicate that the VDSO was built incorrectly.
+ * It should not have any real relocations.
+ * ??? The RISC-V toolchain will emit these even when there
+ * are no relocations. Validate zeros.
+ */
+ if (dyn->d_un.d_val != 0) {
+ fprintf(stderr, "VDSO has dynamic relocations\n");
+ errors++;
+ }
+ break;
+ case DT_RELENT:
+ case DT_RELAENT:
+ case DT_TEXTREL:
+ /* These entries store an integer in the entry. */
+ /* Should not be required; see above. */
+ break;
+
+ case DT_NEEDED:
+ case DT_VERNEED:
+ case DT_PLTREL:
+ case DT_JMPREL:
+ case DT_RPATH:
+ case DT_RUNPATH:
+ fprintf(stderr, "VDSO has external dependencies\n");
+ errors++;
+ break;
+
+ default:
+ /* This is probably something target specific. */
+ fprintf(stderr, "VDSO has unknown DYNAMIC entry (%lx)\n",
+ (unsigned long)tag);
+ errors++;
+ break;
+ }
+ dyn++;
+ } while (tag != DT_NULL);
+ if (errors) {
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ /* Relocate the dynamic symbol table. */
+ if (dynsym_idx) {
+ ElfN(Sym) *sym = buf + shdr[dynsym_idx].sh_offset;
+ unsigned sym_n = shdr[dynsym_idx].sh_size / sizeof(*sym);
+
+ for (unsigned i = 0; i < sym_n; ++i) {
+ output_reloc(outf, buf, &sym[i].st_value);
+ }
+ }
+
+ /* Search both dynsym and symtab for the signal return symbols. */
+ if (dynsym_idx) {
+ elfN(search_symtab)(shdr, dynsym_idx, buf, need_bswap);
+ }
+ if (symtab_idx) {
+ elfN(search_symtab)(shdr, symtab_idx, buf, need_bswap);
+ }
+}
diff --git a/linux-user/meson.build b/linux-user/meson.build
index 7171dc60be..e4cb70ed2d 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -28,9 +28,13 @@ linux_user_ss.add(when: 'TARGET_HAS_BFLT', if_true: files('flatload.c'))
linux_user_ss.add(when: 'TARGET_I386', if_true: files('vm86.c'))
linux_user_ss.add(when: 'CONFIG_ARM_COMPATIBLE_SEMIHOSTING', if_true: files('semihost.c'))
-
syscall_nr_generators = {}
+gen_vdso_exe = executable('gen-vdso', 'gen-vdso.c',
+ native: true, build_by_default: false)
+gen_vdso = generator(gen_vdso_exe, output: '@BASENAME@.c.inc',
+ arguments: ['-o', '@OUTPUT@', '@EXTRA_ARGS@', '@INPUT@'])
+
subdir('alpha')
subdir('arm')
subdir('hppa')
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 10/20] linux-user: Add build-vdso.sh tool
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (8 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 09/20] linux-user: Add gen-vdso tool Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 11/20] linux-user/i386: Add vdso Richard Henderson
` (10 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
A shell script to build the vdso using the cross-compiler
makefile fragment. If none detected, fall back to copying
the pre-build vdso from the source directory.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/build-vdso.sh | 31 +++++++++++++++++++++++++++++++
linux-user/meson.build | 1 +
2 files changed, 32 insertions(+)
create mode 100755 linux-user/build-vdso.sh
diff --git a/linux-user/build-vdso.sh b/linux-user/build-vdso.sh
new file mode 100755
index 0000000000..489088737f
--- /dev/null
+++ b/linux-user/build-vdso.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+# Build vdso using cross tools
+
+build_dir=error
+source_dir=error
+target_dir=error
+output=error
+
+while test $# -gt 0; do
+ opt="$1"
+ shift
+ case "$opt" in
+ -B) build_dir=$1; shift;;
+ -C) source_dir=$1; shift;;
+ -T) target_dir=$1; shift;;
+ -o) output=$1; shift;;
+ --) break;;
+ esac
+done
+
+frag="${build_dir}/tests/tcg/${target_dir}/config-target.mak"
+if ! test -f "$frag"; then
+ # No cross-compiler available
+ # Copy pre-build image into build tree
+ cp "${source_dir}/$(basename ${output})" "${output}"
+ exit $?
+fi
+
+# Extract cross-compiler from the makefile fragment, and build.
+CC=$(grep CC= "$frag" | sed s/CC=//)
+exec $CC -o "$output" $@
diff --git a/linux-user/meson.build b/linux-user/meson.build
index e4cb70ed2d..099e5c4fe0 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -30,6 +30,7 @@ linux_user_ss.add(when: 'CONFIG_ARM_COMPATIBLE_SEMIHOSTING', if_true: files('sem
syscall_nr_generators = {}
+build_vdso_cmd = find_program('build-vdso.sh')
gen_vdso_exe = executable('gen-vdso', 'gen-vdso.c',
native: true, build_by_default: false)
gen_vdso = generator(gen_vdso_exe, output: '@BASENAME@.c.inc',
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 11/20] linux-user/i386: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (9 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 10/20] linux-user: Add build-vdso.sh tool Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 12/20] linux-user/x86_64: " Richard Henderson
` (9 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1267
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/i386/vdso-asmoffset.h | 6 ++
linux-user/elfload.c | 16 +++-
linux-user/i386/signal.c | 11 +++
linux-user/i386/meson.build | 24 ++++++
linux-user/i386/vdso.S | 143 +++++++++++++++++++++++++++++++
linux-user/i386/vdso.ld | 76 ++++++++++++++++
linux-user/i386/vdso.so | Bin 0 -> 2672 bytes
7 files changed, 274 insertions(+), 2 deletions(-)
create mode 100644 linux-user/i386/vdso-asmoffset.h
create mode 100644 linux-user/i386/vdso.S
create mode 100644 linux-user/i386/vdso.ld
create mode 100755 linux-user/i386/vdso.so
diff --git a/linux-user/i386/vdso-asmoffset.h b/linux-user/i386/vdso-asmoffset.h
new file mode 100644
index 0000000000..4e5ee0dd49
--- /dev/null
+++ b/linux-user/i386/vdso-asmoffset.h
@@ -0,0 +1,6 @@
+/*
+ * offsetof(struct sigframe, sc.eip)
+ * offsetof(struct rt_sigframe, uc.tuc_mcontext.eip)
+ */
+#define SIGFRAME_SIGCONTEXT_eip 64
+#define RT_SIGFRAME_SIGCONTEXT_eip 220
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 2a6adebb4a..fb876ae30a 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -309,12 +309,24 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *en
(*regs)[15] = tswapreg(env->regs[R_ESP]);
(*regs)[16] = tswapreg(env->segs[R_SS].selector & 0xffff);
}
-#endif
+
+/*
+ * i386 is the only target which supplies AT_SYSINFO for the vdso.
+ * All others only supply AT_SYSINFO_EHDR.
+ */
+#define DLINFO_ARCH_ITEMS 1
+#define ARCH_DLINFO NEW_AUX_ENT(AT_SYSINFO, vdso_info->entry);
+
+#include "vdso.c.inc"
+
+#define vdso_image_info() &vdso_image_info
+
+#endif /* TARGET_X86_64 */
#define USE_ELF_CORE_DUMP
#define ELF_EXEC_PAGESIZE 4096
-#endif
+#endif /* TARGET_I386 */
#ifdef TARGET_ARM
diff --git a/linux-user/i386/signal.c b/linux-user/i386/signal.c
index 60fa07d6f9..bc5d45302e 100644
--- a/linux-user/i386/signal.c
+++ b/linux-user/i386/signal.c
@@ -214,6 +214,17 @@ struct rt_sigframe {
};
#define TARGET_RT_SIGFRAME_FXSAVE_OFFSET ( \
offsetof(struct rt_sigframe, fpstate) + TARGET_FPSTATE_FXSAVE_OFFSET)
+
+/*
+ * Verify that vdso-asmoffset.h constants match.
+ */
+#include "i386/vdso-asmoffset.h"
+
+QEMU_BUILD_BUG_ON(offsetof(struct sigframe, sc.eip)
+ != SIGFRAME_SIGCONTEXT_eip);
+QEMU_BUILD_BUG_ON(offsetof(struct rt_sigframe, uc.tuc_mcontext.eip)
+ != RT_SIGFRAME_SIGCONTEXT_eip);
+
#else
struct rt_sigframe {
diff --git a/linux-user/i386/meson.build b/linux-user/i386/meson.build
index ee523019a5..d858bf1d77 100644
--- a/linux-user/i386/meson.build
+++ b/linux-user/i386/meson.build
@@ -3,3 +3,27 @@ syscall_nr_generators += {
arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
output: '@BASENAME@_nr.h')
}
+
+vdso_so = custom_target(output: 'vdso.so',
+ input: files('vdso.S', 'vdso.ld'),
+ depend_files: files('vdso-asmoffset.h'),
+ command: [
+ build_vdso_cmd,
+ '-B', meson.project_build_root(),
+ '-C', meson.current_source_dir(),
+ '-T', 'i386-linux-user',
+ '-o', '@OUTPUT@',
+ '--', '-m32', '-nostdlib', '-shared',
+ '-Wl,-h,linux-gate.so.1',
+ '-Wl,--build-id=sha1',
+ '-Wl,--hash-style=both',
+ '-Wl,-T,@INPUT1@',
+ '@INPUT0@'
+ ])
+
+vdso_inc = gen_vdso.process(vdso_so, extra_args: [
+ '-s', '__kernel_sigreturn',
+ '-r', '__kernel_rt_sigreturn'
+ ])
+
+linux_user_ss.add(when: 'TARGET_I386', if_true: vdso_inc)
diff --git a/linux-user/i386/vdso.S b/linux-user/i386/vdso.S
new file mode 100644
index 0000000000..e7a1f333a1
--- /dev/null
+++ b/linux-user/i386/vdso.S
@@ -0,0 +1,143 @@
+/*
+ * i386 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 vdso_syscall1 name, nr
+\name:
+ .cfi_startproc
+ mov %ebx, %edx
+ .cfi_register %ebx, %edx
+ mov 4(%esp), %ebx
+ mov $\nr, %eax
+ int $0x80
+ mov %edx, %ebx
+ ret
+ .cfi_endproc
+endf \name
+.endm
+
+.macro vdso_syscall2 name, nr
+\name:
+ .cfi_startproc
+ mov %ebx, %edx
+ .cfi_register %ebx, %edx
+ mov 4(%esp), %ebx
+ mov 8(%esp), %ecx
+ mov $\nr, %eax
+ int $0x80
+ mov %edx, %ebx
+ ret
+ .cfi_endproc
+endf \name
+.endm
+
+.macro vdso_syscall3 name, nr
+\name:
+ .cfi_startproc
+ push %ebx
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset %ebx, 0
+ mov 8(%esp), %ebx
+ mov 12(%esp), %ecx
+ mov 16(%esp), %edx
+ mov $\nr, %eax
+ int $0x80
+ pop %ebx
+ .cfi_adjust_cfa_offset -4
+ .cfi_restore %ebx
+ ret
+ .cfi_endproc
+endf \name
+.endm
+
+__kernel_vsyscall:
+ .cfi_startproc
+ int $0x80
+ ret
+ .cfi_endproc
+endf __kernel_vsyscall
+
+vdso_syscall2 __vdso_clock_gettime, __NR_clock_gettime
+vdso_syscall2 __vdso_clock_gettime64, __NR_clock_gettime64
+vdso_syscall2 __vdso_clock_getres, __NR_clock_getres
+vdso_syscall2 __vdso_gettimeofday, __NR_gettimeofday
+vdso_syscall1 __vdso_time, __NR_time
+vdso_syscall3 __vdso_getcpu, __NR_gettimeofday
+
+/*
+ * Signal return handlers.
+ */
+
+ .cfi_startproc simple
+ .cfi_signal_frame
+
+/*
+ * For convenience, put the cfa just above eip in sigcontext, and count
+ * offsets backward from there. Re-compute the cfa in the two contexts
+ * we have for signal unwinding. This is far simpler than the
+ * DW_CFA_expression form that the kernel uses, and is equally correct.
+ */
+
+ .cfi_def_cfa %esp, SIGFRAME_SIGCONTEXT_eip + 4
+
+ .cfi_offset %eip, -4
+ /* err, -8 */
+ /* trapno, -12 */
+ .cfi_offset %eax, -16
+ .cfi_offset %ecx, -20
+ .cfi_offset %edx, -24
+ .cfi_offset %ebx, -28
+ .cfi_offset %esp, -32
+ .cfi_offset %ebp, -36
+ .cfi_offset %esi, -40
+ .cfi_offset %edi, -44
+
+/*
+ * While this frame is marked as a signal frame, that only applies to how
+ * the return address is handled for the outer frame. The return address
+ * that arrived here, from the inner frame, is not marked as a signal frame
+ * and so the unwinder still tries to subtract 1 to examine the presumed
+ * call insn. Thus we must extend the unwind info to a nop before the start.
+ */
+ nop
+
+__kernel_sigreturn:
+ popl %eax /* pop sig */
+ .cfi_adjust_cfa_offset -4
+ movl $__NR_sigreturn, %eax
+ int $0x80
+endf __kernel_sigreturn
+
+ .cfi_def_cfa_offset RT_SIGFRAME_SIGCONTEXT_eip + 4
+ nop
+
+__kernel_rt_sigreturn:
+ movl $__NR_rt_sigreturn, %eax
+ int $0x80
+endf __kernel_rt_sigreturn
+
+ .cfi_endproc
+
+/*
+ * TODO: Add elf notes. E.g.
+ *
+ * #include <linux/elfnote.h>
+ * ELFNOTE_START(Linux, 0, "a")
+ * .long LINUX_VERSION_CODE
+ * ELFNOTE_END
+ *
+ * but what version number would we set for QEMU?
+ */
diff --git a/linux-user/i386/vdso.ld b/linux-user/i386/vdso.ld
new file mode 100644
index 0000000000..326b7a8f98
--- /dev/null
+++ b/linux-user/i386/vdso.ld
@@ -0,0 +1,76 @@
+/*
+ * Linker script for linux i386 replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+ENTRY(__kernel_vsyscall)
+
+VERSION {
+ LINUX_2.6 {
+ global:
+ __vdso_clock_gettime;
+ __vdso_gettimeofday;
+ __vdso_time;
+ __vdso_clock_getres;
+ __vdso_clock_gettime64;
+ __vdso_getcpu;
+ };
+
+ LINUX_2.5 {
+ global:
+ __kernel_vsyscall;
+ __kernel_sigreturn;
+ __kernel_rt_sigreturn;
+ 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
+ .data : {
+ /*
+ * There ought not be any real read-write data.
+ * But since we manipulated the segment layout,
+ * we have to put these sections somewhere.
+ */
+ *(.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 =0x90909090
+}
diff --git a/linux-user/i386/vdso.so b/linux-user/i386/vdso.so
new file mode 100755
index 0000000000000000000000000000000000000000..bdece5dfcf8da036d013262d4e37208350283cfa
GIT binary patch
literal 2672
zcmbtWU1%It6u#5lG_z^4ZB?X_C>9o5sxCF8QBlyONt?nZ)?|y73e)ZGba%;SR(597
zjTXE8QIiHtY6YPbDhO>6s(mPS(FX(Z2Q`g?1xp_^KInr_=|f8&)b;yj=5}w=eGok1
z%XiMX=brmB_ny0ldSlx(O%qZAA|PnR8-(ZpuhYGj4)L&P5F5p65f&@qVw=PV(21ar
zS~fT!zaSUUNMnr<D?qmul%W%{|IXi?lnz58hBiXBldmd>Kqu7p`(Ouv?E|~S#J4vR
z?eBj&+ji~rg~eZ!zf~VSJr_pXM}D8DFrl0ORPzVHn5LKmbB!e|qzOC^tO77~@mIB)
zzl6kpgPDI3e2U8d6uIY2bq_`x0-wZWxDMLSfe$J6M%crOeHivUY<@1rr@`l7bI!EC
z1WQ>fZdBic@iW@_P1t@f_$4LZXEGSfcpH2f?e~Kj&v`Zj+$T!NBlkb|jQhnHeiL+a
z&lJb<kCS@_*v@tHJTOn=lluBDy{$|iW0~jDvC(tlyVi??Q=2p0KUP})m@B{A^3Fp?
z#y5Ta$e&ZC6Ayg2)jAG+!^M53FpOcdV3|2%)E={wiChkz(UhGxlDT|x*hrg>lO18$
z-OkRAyW9oSmOj5{et#-4CVgruv?pIJqQxKI&ZY~dQ!H3DSHUrA-dxrymL5+h95ZU?
zqfdy~j)7gfjrM5g9c>HN9>C7<kIZ}NS==-4@5JK#YMzfafM=QF?WZPg6+aHhHu){t
z#@l_<Z)3bX7g}rJnLgP3J~0HQz%PJH;3Rk&d;okNJPDowp8;P3e*#_ve+BLUI4(td
zZBS?jb*;5I7#xS6XOVMV0Ql`GjNJ_U;OnA06ySNFpY!>?j(;zF-_-GQuCsOgock95
z$CvrnLFHO513c5BE36+~5f2BEAVM30`47nj^o(oe;NgZND~~oF)87oe)%5l%caD!C
zZUR`#4&CABw}%(BE9KdV>yxiUf|Id`UI}64SIQGVslJnSd`)$H14yd$t+Ysc2<dgC
zZ=Q@t)>OQ(J+srhD+k<&>B<F{@o$-65V!Wyt>HxRj<L>q5)uze70i3T0nE36-;4MD
zX|P(C`eCbeVGnF6>~F$Q>&)x0)jBo>TdiYfVXJlMbJ%KKV=Y$enlO4^9_Z@du@yHB
zwchCMGqw$O_4gWmJ%e{HQ)lfOF0TyrZnl4$<)z$G>%HU>FE1lXy;xFj>Xa70cGRgB
zZe?<tMbsV}aT5E$PQl}h)U3Q?ifC%gN{nQau7X$*O<ToiCShkhk5lkGqh`U*=B*`$
zkrGieW9%;^Moc4<LZq}r)G<pAcKN?aE5cZ-d1tTskoO0sTmQ-H0oHh)quV~pVEQOL
zf~-B80KOf}$M=_*fzCLdUB>YqcLID@7{~XU=z-4s6vh$lz%9JdjN|)G?1a8N?pfc*
zIKKY`&zcmDP2m_-KOf(Hg0)2EV}IgBfWHx_^Y;P~hc5SkbEE79n459x?;V(~$T$m@
zjElobxDGGOT`N`AK*n(#-do~0bSZKjGMDr(AZ`H$D-74d^xS8@>$IiJAn|o+fMq_`
OKQ-<Y4#gXF;{FA}h_Ctp
literal 0
HcmV?d00001
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 12/20] linux-user/x86_64: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (10 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 11/20] linux-user/i386: Add vdso Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 13/20] linux-user/aarch64: " Richard Henderson
` (8 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/elfload.c | 4 +-
linux-user/x86_64/meson.build | 20 +++++++++
linux-user/x86_64/vdso.S | 78 ++++++++++++++++++++++++++++++++++
linux-user/x86_64/vdso.ld | 73 +++++++++++++++++++++++++++++++
linux-user/x86_64/vdso.so | Bin 0 -> 2968 bytes
5 files changed, 173 insertions(+), 2 deletions(-)
create mode 100644 linux-user/x86_64/vdso.S
create mode 100644 linux-user/x86_64/vdso.ld
create mode 100755 linux-user/x86_64/vdso.so
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index fb876ae30a..b421f04675 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -317,12 +317,12 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUX86State *en
#define DLINFO_ARCH_ITEMS 1
#define ARCH_DLINFO NEW_AUX_ENT(AT_SYSINFO, vdso_info->entry);
+#endif /* TARGET_X86_64 */
+
#include "vdso.c.inc"
#define vdso_image_info() &vdso_image_info
-#endif /* TARGET_X86_64 */
-
#define USE_ELF_CORE_DUMP
#define ELF_EXEC_PAGESIZE 4096
diff --git a/linux-user/x86_64/meson.build b/linux-user/x86_64/meson.build
index 203af9a60c..6744563a11 100644
--- a/linux-user/x86_64/meson.build
+++ b/linux-user/x86_64/meson.build
@@ -3,3 +3,23 @@ syscall_nr_generators += {
arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
output: '@BASENAME@_nr.h')
}
+
+vdso_so = custom_target(output: 'vdso.so',
+ input: files('vdso.S', 'vdso.ld'),
+ command: [
+ build_vdso_cmd,
+ '-B', meson.project_build_root(),
+ '-C', meson.current_source_dir(),
+ '-T', 'x86_64-linux-user',
+ '-o', '@OUTPUT@',
+ '--', '-nostdlib', '-shared',
+ '-Wl,-h,linux-vdso.so.1',
+ '-Wl,--build-id=sha1',
+ '-Wl,--hash-style=both',
+ '-Wl,-T,@INPUT1@',
+ '@INPUT0@'
+ ])
+
+vdso_inc = gen_vdso.process(vdso_so)
+
+linux_user_ss.add(when: 'TARGET_X86_64', if_true: vdso_inc)
diff --git a/linux-user/x86_64/vdso.S b/linux-user/x86_64/vdso.S
new file mode 100644
index 0000000000..47d16c00ab
--- /dev/null
+++ b/linux-user/x86_64/vdso.S
@@ -0,0 +1,78 @@
+/*
+ * x86-64 linux replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <asm/unistd.h>
+
+.macro endf name
+ .globl \name
+ .type \name, @function
+ .size \name, . - \name
+.endm
+
+.macro weakalias name
+\name = __vdso_\name
+ .weak \name
+.endm
+
+.macro vdso_syscall name, nr
+__vdso_\name:
+ mov $\nr, %eax
+ syscall
+ ret
+endf __vdso_\name
+weakalias \name
+.endm
+
+ .cfi_startproc
+
+vdso_syscall clock_gettime, __NR_clock_gettime
+vdso_syscall clock_getres, __NR_clock_getres
+vdso_syscall gettimeofday, __NR_gettimeofday
+vdso_syscall time, __NR_time
+
+__vdso_getcpu:
+ /*
+ * There is no syscall number for this allocated on x64.
+ * We can handle this several ways:
+ *
+ * (1) Invent a syscall number for use within qemu.
+ * It should be easy enough to pick a number that
+ * is well out of the way of the kernel numbers.
+ *
+ * (2) Force the emulated cpu to support the rdtscp insn,
+ * and initialize the TSC_AUX value the appropriate value.
+ *
+ * (3) Pretend that we're always running on cpu 0.
+ *
+ * This last is the one that's implemented here, with the
+ * tiny bit of extra code to support rdtscp in place.
+ */
+ xor %ecx, %ecx /* rdtscp w/ tsc_aux = 0 */
+
+ /* if (cpu != NULL) *cpu = (ecx & 0xfff); */
+ test %rdi, %rdi
+ jz 1f
+ mov %ecx, %eax
+ and $0xfff, %eax
+ mov %eax, (%rdi)
+
+ /* if (node != NULL) *node = (ecx >> 12); */
+1: test %rsi, %rsi
+ jz 2f
+ shr $12, %ecx
+ mov %ecx, (%rsi)
+
+2: xor %eax, %eax
+ ret
+endf __vdso_getcpu
+
+weakalias getcpu
+
+ .cfi_endproc
+
+/* TODO: Add elf note for LINUX_VERSION_CODE */
diff --git a/linux-user/x86_64/vdso.ld b/linux-user/x86_64/vdso.ld
new file mode 100644
index 0000000000..ca6001cc3c
--- /dev/null
+++ b/linux-user/x86_64/vdso.ld
@@ -0,0 +1,73 @@
+/*
+ * Linker script for linux x86-64 replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+VERSION {
+ LINUX_2.6 {
+ global:
+ clock_gettime;
+ __vdso_clock_gettime;
+ gettimeofday;
+ __vdso_gettimeofday;
+ getcpu;
+ __vdso_getcpu;
+ time;
+ __vdso_time;
+ clock_getres;
+ __vdso_clock_getres;
+
+ 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
+ .data : {
+ /*
+ * There ought not be any real read-write data.
+ * But since we manipulated the segment layout,
+ * we have to put these sections somewhere.
+ */
+ *(.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 =0x90909090
+}
diff --git a/linux-user/x86_64/vdso.so b/linux-user/x86_64/vdso.so
new file mode 100755
index 0000000000000000000000000000000000000000..c873d6ea580b393825506d2ffbddcf9827d89e14
GIT binary patch
literal 2968
zcmcgtO=w(I6uvKUOl$t7l}J=nY6?Lgol-PVEvcEL6HP)om@-1c>vZO|6VjQnGcRQ#
zQlk(xE{v3}x(Eh$E+iYFJ0pdXxDr=E=&lLvMs(4vwBz~aoiCl-j=CuHBzL}hzkANP
z=iPhmJs%H_3^h28p){If=E2CAex2B8q6WA=6OrF`(`KF&`Uz?MI&EW@IwS5;J<v5S
zm3;u8M8ZDNbcEvu0jxKter?<dUgx>q_-2rSodh0=h5M8yR&|8~q9xUzjR(|@2weye
zz8a;S7@IIXlUIKD#o1b1+rN5odUE>L=z;rh$dv40C`m=ye*;62d-p2^;2j+^>^@b*
z{zK-lF(OZeV2X;(id~9-RYHGjYX7&6)!h7{<L?-V+C6T-xxH+fO-w(S=h!R!)55=J
z@z1ONh{Zpn`Zga`ecR75)jw_d8B~3nM_M2rJI<`|o#xMqz%F@5M$pfwf5Z(rDGlFi
z^EmbvX*g$?a37>=_DaLK@yv17h==zIwme4kF^2|U3rG4QL%vz2K73uCxOLI|+`aN!
z$F-%z;-Tzk@6K<ve)YnqSIbKuJ^SrI{>$E*Jv}RD{ao_%it)TlnNq<^Unr!fz4Lw$
zOy&HC$f92&rz(YWnba(~S{s>9e=uV%Oyy_Fufeq||4}nCJT{T^4!f^Qd<}K~WJ1Kz
zzvUl)Z^gZPP8#nNzOg~(w`aa@<o(9^K%DNzqu`(ulXgfNgnG`03FDMIobHyUJzt9w
zo+0?gnY<+pa{adav`21S-&8!KxE^A3Jw9Iv_AacwQfZf+Z;H=v2a%udwk)(oS8s^Q
ze+lApB>FjYY9u^!IW^5APGzK1@7^HK>gD4>;p^R}arI;0o1?04=jpKWw!W)=?0Yt=
zynUbER^IkMss3a7y}So_=McZ`$9S>#$BvH<4@j=b`|AzHy`jYM(LpaBOVlKlW^ujb
z)P%J2ye6gV=6*G&ja!<{1*x-wK{3QEd-+1(8#gnXPvxf4)sE;I_k4cF&8AA(kO_(*
zbIC83rV9C8121D-KkJ<<rgFZQ&4?yP#tr;(AUpEt(k(9Vj<7ELTixSId}la*Nji9E
z@a{mEzeGvus<3|XJhjXlyz_X^xc;1Wh%eUIqf2|%IlLE07230&5^>idjF0yGj>9sy
zEwzyLtiMFu4~T6avc|lrbF^o@CbB+LUq6S#>RVK)S)cWo$nWI(T!)Byg4)h8>pihg
zSHk{7hu^QXIU^m!MEjk0M(-crN9uFmIL=%4U1~>sm5Pe?`en6ee(>HC`S#L{y??u6
vr;^|o8ppUAv<ink<oeuK)I;vAba!M!1G>D!gdKbRPND1BpVH#|fA;?X5$6$T
literal 0
HcmV?d00001
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 13/20] linux-user/aarch64: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (11 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 12/20] linux-user/x86_64: " Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 14/20] linux-user/arm: " Richard Henderson
` (7 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/elfload.c | 7 ++++
linux-user/aarch64/meson.build | 33 +++++++++++++++
linux-user/aarch64/vdso-be.so | Bin 0 -> 3216 bytes
linux-user/aarch64/vdso-le.so | Bin 0 -> 3216 bytes
linux-user/aarch64/vdso.S | 73 +++++++++++++++++++++++++++++++++
linux-user/aarch64/vdso.ld | 72 ++++++++++++++++++++++++++++++++
linux-user/meson.build | 1 +
7 files changed, 186 insertions(+)
create mode 100644 linux-user/aarch64/meson.build
create mode 100755 linux-user/aarch64/vdso-be.so
create mode 100755 linux-user/aarch64/vdso-le.so
create mode 100644 linux-user/aarch64/vdso.S
create mode 100644 linux-user/aarch64/vdso.ld
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index b421f04675..8316868bd2 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -768,6 +768,13 @@ static uint32_t get_elf_hwcap2(void)
#undef GET_FEATURE_ID
+#if TARGET_BIG_ENDIAN
+# include "vdso-be.c.inc"
+#else
+# include "vdso-le.c.inc"
+#endif
+#define vdso_image_info() &vdso_image_info
+
#endif /* not TARGET_AARCH64 */
#endif /* TARGET_ARM */
diff --git a/linux-user/aarch64/meson.build b/linux-user/aarch64/meson.build
new file mode 100644
index 0000000000..b769c87570
--- /dev/null
+++ b/linux-user/aarch64/meson.build
@@ -0,0 +1,33 @@
+# TARGET_BIG_ENDIAN is defined to 'n' for little-endian; which means it
+# is always true as far as source_set.apply() is concerned. Always build
+# both header files and include the right one via #if.
+
+vdso_cmd = [
+ build_vdso_cmd,
+ '-B', meson.project_build_root(),
+ '-C', meson.current_source_dir(),
+ '-T', 'aarch64-linux-user',
+ '-o', '@OUTPUT@',
+ '--',
+ '-nostdlib', '-shared',
+ '-Wl,-h,linux-vdso.so.1',
+ '-Wl,--build-id=sha1',
+ '-Wl,--hash-style=both',
+ '-Wl,-T,@INPUT1@',
+ '@INPUT0@'
+]
+
+vdso_le_so = custom_target(output: 'vdso-le.so',
+ input: files('vdso.S', 'vdso.ld'),
+ command: vdso_cmd + ['-mlittle-endian'])
+
+vdso_be_so = custom_target(output: 'vdso-be.so',
+ input: files('vdso.S', 'vdso.ld'),
+ command: vdso_cmd + ['-mbig-endian'])
+
+gen = [
+ gen_vdso.process(vdso_le_so, extra_args: ['-r', '__kernel_rt_sigreturn']),
+ gen_vdso.process(vdso_be_so, extra_args: ['-r', '__kernel_rt_sigreturn']),
+]
+
+linux_user_ss.add(when: 'TARGET_AARCH64', if_true: gen)
diff --git a/linux-user/aarch64/vdso-be.so b/linux-user/aarch64/vdso-be.so
new file mode 100755
index 0000000000000000000000000000000000000000..b19563b648cc3e33a45b9394695d747f55c11db7
GIT binary patch
literal 3216
zcmc&$O>A355T57v+5{-Ysi=q)1g#XIswz)u5h$n}>|m!!<)$HRMcT{OwO?YViH)9L
zih~5?z=Z>%s3*h$7jXfJb1N?G0i;U3Re&lXl@n4Wq>3KOr9bY>?#y~^Y=p#tN%nm^
z-^}dn+ud2e5A%iTRLTP@K3u}SLugCJ*oV)vHVIoG18H~$^{v<fV@J+N4|=197KCBc
zDaVlE2R(y7jfK(7Duo>9^IFFKH#BtTHHOQ{@AI9wplKX>5uW8hLCPZyyWXO)_afvt
zPLSS@;?mf*9GW`;SFwXaoUePPPkDT@e|7!-C&$uv?_9aC^5d7czWDXKi@WpeN3fmy
zrx<A*6rbJ+>g`AO2vOhEfH@8NmszJhLP@nW06fX~F5^>-dY|g;_5-5_8A8+_8Xaiu
zNtb<@VE+Gra0kFPlQ_7^6QK3ZIs9$rX+Ks*pnaEh7d*#b){Dk@&f%|d0P+7IUJH%1
zzr5bM&wHW6q^_JZtbK^5wzY+&;bq`^*2&Mmc`*9?v*xFNq)(mxVb@Eo+;87xAA(Y6
zqqr8Ws^ut2s%uewsa)LXu%*>{>8#lL&~eo0uyLXq)#W%!*5ewiR%`3cm(P_O^$`E}
zLt%FA#G*P7z81dnI?e_Uk^LjhGk;ItxpEOTI?vBzGv}1vC<We-y8bcS5MYHK-k5(7
zf&9rUgKZx+61~RWdkYXWU+~7Zy(k==P1^4XBGkD5^PZiXH!%38tG@b0>)X5a8Aq>-
z7#qb765KeN3yRdY(U8~Y9{HAGERQA<TUS~`QtDIBRg?HYUg~mQI6~z4yx98HX5@#A
zpRHrz={%zZz2iT@e8!-8;y7IIa^G2=>pnQ&<1ck3^+0AX=wCnN+i%_Ix1rxS#7W+-
zv2SI-_&YqCw`={!FtFcyg&lu?#tx46!hrgJ%c*ns9$9wy+dK}f`}+<r>yt+Qg2P{9
z|1^|Jhik7ER%XLGjF(}&2`YDTE_-D5O)NjW_*H&JO)q4R<kd`W0o0+w(Wz`f9i5&&
zmOrkJXQv8z)m?$M?rnt+E@kWcZ|(>P8yjm$@eE=T8>~pLR!<@b%Nw=gTD7D*=!;lP
ziV!Z>*27A%Q89cH8|GXTH>&kom!irLMisRb7uO<HDWj)o5GGMG;YIt8K<9$%#@6kk
z8PnEvt|tfWtH^Hbxc4`za_%gWujHV<#M3$0i%ot{`QAvikV6p!syB+~y0P)2$Q^Ka
zEL{?Rq8nkC(d|?66TX2>eseg#`A)!b<~d>?B9E;Zi4Rbl#NYS7*iYg&jqWqTB<lU*
z$!*H9Nj%qyy~pIcgZxQk9jJd8^S7yk!trv?3F>>r&Ch<?|LxxI6}%@idNhlA{<QuQ
zC+|;gOW0&SlD|m?9EZ_<CmPz`_gbZ6+#65(jbiWFJw~@rH~$C7N<5##fY(n@&))`P
zhxSc`V&%PrW0ddd)H_JfH|0(?Nd8gO={Lk(TXrEBI?c+ri~=%W(nqijh#%(r8a|Rh
HMjQVaBo8Se
literal 0
HcmV?d00001
diff --git a/linux-user/aarch64/vdso-le.so b/linux-user/aarch64/vdso-le.so
new file mode 100755
index 0000000000000000000000000000000000000000..4bd7bf1587b9dc652784efc34f67be6514f46a10
GIT binary patch
literal 3216
zcmcguL2MgU5FKYzk|v=|3KfxpXptgRRj>+0LWOd$gY72BNkeGV(#x;0H@0bFqxB|r
zDgixk;Y1K8ZU%9ID-u*(=z#+gH&jr?C8tW2K#(5b)Yi=G&a>A)TY-ec*nj8$H#2|!
z{y#JO-^~^B1E~~&9QvAiBciklwuhl1*h$*Q&v80P4>3H*Ev;gkPwHggm`30swMk;T
zGAR={>8b`86H!~|wRv~(Du=(NTR~auS~{=IA7z;kxT=M|q<>!Lvw1eOA_9j$u^H#K
zkK5_R716pbm?J$V>5DHJi~P$^cZTvA|Eu|5{&?}o=EzQE<+n#zL<i)-bRlA)ophIU
zqCf9<8Zy4BWAP_+O~-ORLT%YNrjdxzW#yyFCzaprMDwL(flT*wtmd?<;~AAlTL1sk
zWtWF&jBe^WWUqy?+yuX^IL_lu#wX}bM|9#O$13{Qta%<&{Cf+J+s6BdL)muhx%6=!
zqN^c9h+)A*M{sFk_YI{}G#rJu=!yJe@6^p-KWKgU-Ng&z+4fUM?`1yUA!9Cie%)I$
z6)y;C>t18ET-@rRrL{)s5@ZRm?=^d<ADCvX;(Nh{U#GQNeWUfvX1UpL`Tr~x<`-Aa
zn-lKy?sG5jVtDoV$tb12Prm*AVTtF*xgl2Nod#I`{tspdc_rr{l$vr*2_`yeZclR)
z!a1g{EYo1?iPY5Ckr0#k9OE`4N=#<j`RUl<t3R^+jq8s2IUFD8AJ4_c)rm+JStmao
zUJdd)uHo=ov}K_dIea>8Bt}f;aF))<!CB;RG$3!|B8N{N`P+{Vb@R9%AEu=Ib7(&y
zZ~OH}x^=G~AEj-L?|!_O55VR12NUu~&O}bp-nWAxzIUETf0RB;@S8OMp>Xy)9ee+$
z!uj{Um(+z6uXE1Y|19H4`Tr{8Np+;6xLrryR@|-^A1S`4UX)4;OIHe)Yi@(4%QW30
zlYM<LvoQZMrym!7lbbX7<;+6P%w?C!oGzT1%@oX;eEzlES#vfsTgaLI4D9B8H^U#C
z%3a-mQzOW2ZmkE!H<$;0#H;Al8-Yh|d8=Mrua&|M>oP9}MRF_k4YyisRwF#{BV^O_
zo3%#0Z(z#gdR4RP7uP*gEwd&@<OW_V;641WByl143Zy0C5?taSPWV0mdy+d+hY>!A
zJ8%xJkZ^Z_J?hqRmdZC3{!t&mw<Gg#jWQMN@%=r)nBee_Is$%_WpRQ%_)9F5Zw~yU
z-hiXdVt&{m9Z$0DU;K@SJ?av;$c1eC2ql_T8SHTn0mr=q`nsJM(ktBS#QdYqfk*YD
z=O2E+&#}GSSujRD1jqUjBY1x-V3j+vCfGmdo(O&H8^#jDaeLHP@MBO^Zu@^n?Qw@d
zodL)CF^%m%?i)J7cUAE%eKEOL9_9xBlcL15pBv6L1oUxH1OAIR$bI|#CKyYyA5ll|
H{e%7AHUTDw
literal 0
HcmV?d00001
diff --git a/linux-user/aarch64/vdso.S b/linux-user/aarch64/vdso.S
new file mode 100644
index 0000000000..e436e60fd9
--- /dev/null
+++ b/linux-user/aarch64/vdso.S
@@ -0,0 +1,73 @@
+/*
+ * aarch64 linux replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <asm/unistd.h>
+
+/* ??? These are in include/elf.h, which is not ready for inclusion in asm. */
+#define NT_GNU_PROPERTY_TYPE_0 5
+#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000
+#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI (1U << 0)
+#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC (1U << 1)
+
+#define GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT \
+ (GNU_PROPERTY_AARCH64_FEATURE_1_BTI | GNU_PROPERTY_AARCH64_FEATURE_1_PAC)
+
+ .section .note.gnu.property
+ .align 3
+ .long 2f - 1f
+ .long 6f - 3f
+ .long NT_GNU_PROPERTY_TYPE_0
+1: .string "GNU"
+2: .align 3
+3: .long GNU_PROPERTY_AARCH64_FEATURE_1_AND
+ .long 5f - 4f
+4: .long GNU_PROPERTY_AARCH64_FEATURE_1_DEFAULT
+5: .align 3
+6:
+
+ .text
+
+.macro endf name
+ .globl \name
+ .type \name, @function
+ .size \name, . - \name
+.endm
+
+.macro vdso_syscall name, nr
+\name:
+ bti c
+ mov x8, #\nr
+ svc #0
+ ret
+endf \name
+.endm
+
+ .cfi_startproc
+
+vdso_syscall __kernel_gettimeofday, __NR_gettimeofday
+vdso_syscall __kernel_clock_gettime, __NR_clock_gettime
+vdso_syscall __kernel_clock_getres, __NR_clock_getres
+
+ .cfi_endproc
+
+
+/*
+ * TODO: The kernel makes a big deal of turning off the .cfi directives,
+ * because they cause libgcc to crash, but that's because they're wrong.
+ *
+ * For now, elide the unwind info for __kernel_rt_sigreturn and rely on
+ * the libgcc fallback routine as we have always done. This requires
+ * that the code sequence used be exact.
+ */
+__kernel_rt_sigreturn:
+ /* No BTI C insn here -- we arrive via RET. */
+ mov x8, #__NR_rt_sigreturn
+ svc #0
+endf __kernel_rt_sigreturn
+
+/* TODO: Add elf note for LINUX_VERSION_CODE */
diff --git a/linux-user/aarch64/vdso.ld b/linux-user/aarch64/vdso.ld
new file mode 100644
index 0000000000..4c12f33352
--- /dev/null
+++ b/linux-user/aarch64/vdso.ld
@@ -0,0 +1,72 @@
+/*
+ * Linker script for linux aarch64 replacement vdso.
+ *
+ * Copyright 2021 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+VERSION {
+ LINUX_2.6.39 {
+ global:
+ __kernel_rt_sigreturn;
+ __kernel_gettimeofday;
+ __kernel_clock_gettime;
+ __kernel_clock_getres;
+
+ local: *;
+ };
+}
+
+
+PHDRS {
+ phdr PT_PHDR FLAGS(4) PHDRS;
+ load PT_LOAD FLAGS(7) FILEHDR PHDRS;
+ dynamic PT_DYNAMIC FLAGS(4);
+ eh_frame_hdr PT_GNU_EH_FRAME;
+ note PT_NOTE FLAGS(4);
+}
+
+SECTIONS {
+ /*
+ * We can't prelink to any address without knowing something about
+ * the virtual memory space of the host, since that leaks over into
+ * the available memory space of the guest.
+ */
+ . = 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 =0xd503201f
+}
diff --git a/linux-user/meson.build b/linux-user/meson.build
index 099e5c4fe0..1b265ed365 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -36,6 +36,7 @@ gen_vdso_exe = executable('gen-vdso', 'gen-vdso.c',
gen_vdso = generator(gen_vdso_exe, output: '@BASENAME@.c.inc',
arguments: ['-o', '@OUTPUT@', '@EXTRA_ARGS@', '@INPUT@'])
+subdir('aarch64')
subdir('alpha')
subdir('arm')
subdir('hppa')
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 14/20] linux-user/arm: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (12 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 13/20] linux-user/aarch64: " Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 15/20] linux-user/hppa: " Richard Henderson
` (6 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/arm/signal.c | 28 +++---
linux-user/elfload.c | 3 +-
linux-user/arm/meson.build | 35 ++++++++
linux-user/arm/vdso-be.so | Bin 0 -> 2680 bytes
linux-user/arm/vdso-le.so | Bin 0 -> 2680 bytes
linux-user/arm/vdso.S | 177 +++++++++++++++++++++++++++++++++++++
linux-user/arm/vdso.ld | 67 ++++++++++++++
7 files changed, 293 insertions(+), 17 deletions(-)
create mode 100755 linux-user/arm/vdso-be.so
create mode 100755 linux-user/arm/vdso-le.so
create mode 100644 linux-user/arm/vdso.S
create mode 100644 linux-user/arm/vdso.ld
diff --git a/linux-user/arm/signal.c b/linux-user/arm/signal.c
index cf99fd7b8a..c328d31081 100644
--- a/linux-user/arm/signal.c
+++ b/linux-user/arm/signal.c
@@ -167,9 +167,8 @@ setup_return(CPUARMState *env, struct target_sigaction *ka, int usig,
abi_ulong handler = 0;
abi_ulong handler_fdpic_GOT = 0;
abi_ulong retcode;
- int thumb, retcode_idx;
+ int thumb;
int is_fdpic = info_is_fdpic(((TaskState *)thread_cpu->opaque)->info);
- bool copy_retcode;
if (is_fdpic) {
/* In FDPIC mode, ka->_sa_handler points to a function
@@ -184,9 +183,7 @@ setup_return(CPUARMState *env, struct target_sigaction *ka, int usig,
} else {
handler = ka->_sa_handler;
}
-
thumb = handler & 1;
- retcode_idx = thumb + (ka->sa_flags & TARGET_SA_SIGINFO ? 2 : 0);
uint32_t cpsr = cpsr_read(env);
@@ -202,24 +199,23 @@ setup_return(CPUARMState *env, struct target_sigaction *ka, int usig,
cpsr &= ~CPSR_E;
}
+ /* Our vdso default_sigreturn label is a table of entry points. */
+ int idx = is_fdpic * 2 + ((ka->sa_flags & TARGET_SA_SIGINFO) != 0);
+ retcode = default_sigreturn + idx * 16;
+
+ /*
+ * Put the sigreturn code on the stack no matter which return
+ * mechanism we use in order to remain ABI compliant.
+ */
+ memcpy(frame->retcode, g2h_untagged(retcode & ~1), 16);
+
if (ka->sa_flags & TARGET_SA_RESTORER) {
if (is_fdpic) {
+ /* Place the function descriptor in slot 3. */
__put_user((abi_ulong)ka->sa_restorer, &frame->retcode[3]);
- retcode = (sigreturn_fdpic_tramp +
- retcode_idx * RETCODE_BYTES + thumb);
- copy_retcode = true;
} else {
retcode = ka->sa_restorer;
- copy_retcode = false;
}
- } else {
- retcode = default_sigreturn + retcode_idx * RETCODE_BYTES + thumb;
- copy_retcode = true;
- }
-
- /* Copy the code to the stack slot for ABI compatibility. */
- if (copy_retcode) {
- memcpy(frame->retcode, g2h_untagged(retcode & ~1), RETCODE_BYTES);
}
env->regs[0] = usig;
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 8316868bd2..cd2ab4292c 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -768,6 +768,8 @@ static uint32_t get_elf_hwcap2(void)
#undef GET_FEATURE_ID
+#endif /* not TARGET_AARCH64 */
+
#if TARGET_BIG_ENDIAN
# include "vdso-be.c.inc"
#else
@@ -775,7 +777,6 @@ static uint32_t get_elf_hwcap2(void)
#endif
#define vdso_image_info() &vdso_image_info
-#endif /* not TARGET_AARCH64 */
#endif /* TARGET_ARM */
#ifdef TARGET_SPARC
diff --git a/linux-user/arm/meson.build b/linux-user/arm/meson.build
index 5a93c925cf..6a8ce075c3 100644
--- a/linux-user/arm/meson.build
+++ b/linux-user/arm/meson.build
@@ -5,3 +5,38 @@ syscall_nr_generators += {
arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
output: '@BASENAME@_nr.h')
}
+
+# TARGET_BIG_ENDIAN is defined to 'n' for little-endian; which means it
+# is always true as far as source_set.apply() is concerned. Always build
+# both header files and include the right one via #if.
+
+vdso_cmd = [
+ build_vdso_cmd,
+ '-B', meson.project_build_root(),
+ '-C', meson.current_source_dir(),
+ '-T', 'arm-linux-user',
+ '-o', '@OUTPUT@',
+ '--',
+ '-nostdlib', '-shared',
+ '-Wl,-use-blx',
+ '-Wl,-h,linux-vdso.so.1',
+ '-Wl,--build-id=sha1',
+ '-Wl,--hash-style=both',
+ '-Wl,-T,@INPUT1@',
+ '@INPUT0@'
+]
+
+vdso_le_so = custom_target(output: 'vdso-le.so',
+ input: files('vdso.S', 'vdso.ld'),
+ command: vdso_cmd + ['-mlittle-endian'])
+
+vdso_be_so = custom_target(output: 'vdso-be.so',
+ input: files('vdso.S', 'vdso.ld'),
+ command: vdso_cmd + ['-mbig-endian'])
+
+gen = [
+ gen_vdso.process(vdso_be_so, extra_args: ['-s', 'sigreturn_codes']),
+ gen_vdso.process(vdso_le_so, extra_args: ['-s', 'sigreturn_codes'])
+]
+
+linux_user_ss.add(when: 'TARGET_ARM', if_true: gen)
diff --git a/linux-user/arm/vdso-be.so b/linux-user/arm/vdso-be.so
new file mode 100755
index 0000000000000000000000000000000000000000..591db80fe47540707e5c627443ac566d7f2c7c60
GIT binary patch
literal 2680
zcmbtWO>9(E6h3eMTiWT=5TvP^8XGYPBf<nxiRrY{X)$fV(nbu4uhW^=&ct>GXI^Vd
zPzOb*g0LYZMoBQb)ieeZH^f;P!@{t@#DxYIb)&{;qQ-?de&2of)@kj=c&6Vw_dDm@
zpLg%M=k?|Op|s_*WL5m~0NTco5DDK1R(&D~>5?FP?Gl4O1i-h7D`*n|4bvZ#5~z8Q
zupSu$${!7=qD`p&IrqCmB0l&HBn2O#{950HHt0s1X!LIe_YaJW%cD~hJ$pKCTisvo
z|KV2P=tGz9zVtqPQDEHbW380xfBlB}_-;Yy6g1w^T7Yf_O28%{R;t(kgue!T8{7x|
zGt^bI|F0yme9jZOL!<?IC%6OMtoau3qYWH;9C)gMGge8v)PF&P`)kCH2G5L|!hNFP
zUDb*3Jd7}g=SKvC9RU-=KEdVA>yqDfVYKy=8-2yT_d4$XZ2MWU?fG1#WM^ke+2`zO
z$8`&{&W6UliGP{PPQ}=C&(c&bvnVr#;@rYcjvL3{!!mSWWc-M|JH8jIz=p5>EUXj1
z)}KCo7j~ZcT>#J3yqV?yaPD_7`Y39jtWN*qX!ihN1Rj9~tV!r&&@<3W(DTq&pkIQ<
zIa}`l5nvhE0b2|Z>-ebnPDHKFmR3^EvlZa}H%l@aIpaIey`+5?@cjn%LD;_Dz&-)n
z7eJ(8oCG-MJd8=(IO#++cCzi2=&P-#T3*|9y7^4gQsnjU8=<qobAdPg=Y1DAIfV1?
z2TlX`$UyX4ZSMmA95@GTmRL0S;;+F_DAp9FzAwPEkuKmz-~<r!VnRA5WMbeFseWAF
z7I{Q&Rj;viakbT?TO-@(tEJ8F1#r`*{$L%y_IAtlx6-iz6Z6eFp2VDYW}M7q0a+l@
z8cd8y$k(J_jVoFsH_4FT#?Lb%_ff;Vz$ZBG0L1!=PY``ytQF09Cm^a`(62TLJVh%w
za*E>B1#sky;x#_Oo2cP8^Rvc4{5&7}S!*DHLwtg_P#XbfqM3KV;?#Xdj290d<J-_v
z^+#KehZaP~qpWx}!t(le!gCU~9&85tKWNs6HrMxr*$*8*2AdLHZ=OZ}#`;wT=Up@P
z3wgJueq9Ftr+#I#&+o|{cN6iFbi2}>6Fc?HNOJf<pHvFdWyhT>7wv2*r>X^ty4^o$
zr$>{+{q|sLRP2GFgT2Wi`(QeKxPQzZOZE=++YKc{7pOG_W_{6WC`4-t*#<RB)i;S(
z7H8eeB(z)hbl$XzCD)O7Zn2n|Eo4;#vCtVeBk}3tTs)tt<UPAv_AK*Gxl$+<*AP1=
zaVKw2l{2%BozEfCFp0a)f-CXl=x{vay5+*;oQtjbPlEGSdCJ`9y&$>)BRc2hUKp6)
zNIR7;%-JfSa~$d9<@a`I<{8H0JyLgR0-SNoRmQPi?$#XR@qVd0)|lUnBX}2h&p6(S
z2iXD6bx=&)K74~&-x0_AsP1F}e0^N6wlOZ{L4DU@R$}hclNhfK3*)YOQ1`)%2RnW8
zwD}(ZwB|wf!Or)kpX;Mc0UVp-VeizP$NZ~e;#^pC9P0pKt=|`R;<t!#I1}D?b?1-K
zp@n-)IR&FxGiacO$5z0Id0#!JF$Z`i%V4M<vIXG!I3{aW!+4=3@Q(l^X1sP78sfr_
LfnPL1&?@e4ll^}8
literal 0
HcmV?d00001
diff --git a/linux-user/arm/vdso-le.so b/linux-user/arm/vdso-le.so
new file mode 100755
index 0000000000000000000000000000000000000000..8077fa5608d3d2539ec19e8b097cf812fcc41ef8
GIT binary patch
literal 2680
zcmbtWU1%It6h6C?-DKPBW>Z94B2qP2sqIipsG?Q6`Prl;KQ%uX6*`&hPO^*1PT8Hr
zL~2a6w$ax1r7uzo6+xdWMHGA~?vvCaQlt-kQ1qd`h)M-5c~IByyE8XV(mV*B-EYtD
zJ@?L?d(PcgyLz*cNJKOl@~~*F4aRHr_=!raO}0u5zGg{F947iSE<h&g0_gEj6;<IN
zm`ad6ir?iB79kUQ{J|f+{4#<xI^iR<pZt0Vt&oYZ|1RhT(A_^GO}~8g{D%)Le{eqj
z%~Qq1!o@GI*qtf(MuIUnvEV=cuDNN<8H248oX<E1`v!0q*a)P7KWjC&3jbf=U~&um
z6AJ&6G8pgT0UE$JNu%rpcc62A>UV>`5YoBF&xCXbx~69Nt;YS;#C_oNkdrV>5ucTL
z!pmn2Z3O+Xx-Buv97A2Mwp<!Kv#Zc??X%>T_d7}_w}0`FSk`R5;##>WH}|47>3Cjo
z+F94Qr|k}N*{Nt-Fw&jK+w(G2EX~aAWL^{BN2Pav|H!Dd+uXxNL{~l$tdyVkKL0hz
zcYZIx_e%1gEh4vPJ~HSd>3xc{7*Fnl&NDfRz)|pV@WbF!;7j1M;1|Fbz;A)S3*G=+
z0(JmA52VP;gAzTGinKH)h4X9%xc_{2l1Vk3h@Otnz6<yXSZnWr?b~(iW3YV<@J#4D
zZInTna|n|*aniBH^wFl*Qm-eEHNLU&_=XdSrG_`_--@4%ovM4=I2}EMrK)x91wRhl
z2S|772ims+SAbK1+M{$T_R8<Ecs!k`Cx5Umu3~<M{|KO-S;fSIn7E38OVQ$|wQUWL
z$@hzwDV<%B5`omejlODDe_n#FW%7$_^vmZOufCH_ck7t%*65jgFs<#_<3))iA;#K<
zB_2)i(e9w@fyGcK!+%FK89@cG-hJJ#lp8C$Uoq?xzF$>>uwVE(tIO{jzV3HA-4_i1
z4N7$-KB3~--~4!WB4lq+poZ!;A_s#)HBkRyG9(#1fp4uty)#0`3*wuo>w*vR=^TvT
z1V#6V2=o@{M={?%@F>PVLVvJ6p4g|M>-}K-Fmz4qH;15v`&SuyxPS57h5Ofe=;8h)
zx!mmhfHQQ!bfwjk*1TAq&-G{e_IF67I9YbQnR3a>xp~zs(A2H29xFST>Fct3ItRt-
z?j2~)^jZVi>`>RRHJoYh?Xp5GBWO^o8qC_J6>3DQ8reEMOZ7J~EA!KyJr3@beO}N~
z$@LsD^YbNpx|mY}V!>_C7IU&RV;1a6!MA&5-!kizD@C`oO0n`{It6Q@Y)?B@A&*F{
ziRn3Wo|u`zKGXKRa&dgd!`A$F;`{cm_J8lv*3j_a=*j)C>AQpHg;)gq6Yk#&>`&VP
z-jO^qtRrF!GUHe_%*WobJJ5MFd7g;y>1G_kUd1Y7KGq$v1F}BSI_`1UZU=WU>ycoO
zTpQOO*qD#^JHdNh6VfX>fZtk>kM&D%eL5dhwWepm^?!gWj0D%B_mt}+O#sZzapC_n
zP!;Jo51Ni+A0Qg_qTthU3qc&;3G1CW3|W)v&rps5NU`FoB5tz|0@tbaoZ58*alGHy
mKlq;ms(NqiSb7g2$`TgvF@=D1zGmp*xF@h7XLS&`j{64#seq6G
literal 0
HcmV?d00001
diff --git a/linux-user/arm/vdso.S b/linux-user/arm/vdso.S
new file mode 100644
index 0000000000..ea27cdd9b3
--- /dev/null
+++ b/linux-user/arm/vdso.S
@@ -0,0 +1,177 @@
+/*
+ * arm linux replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <asm/unistd.h>
+
+/*
+ * All supported cpus have T16 instructions: at least arm4t.
+ *
+ * We support user-user with m-profile cpus as an extension, because it
+ * is useful for testing gcc, which requires we avoid A32 instructions.
+ */
+ .thumb
+ .arch armv4t
+ .eabi_attribute Tag_FP_arch, 0
+ .eabi_attribute Tag_ARM_ISA_use, 0
+
+ .text
+
+.macro raw_syscall n
+ .ifne \n < 0x100
+ mov r7, #\n
+ .elseif \n < 0x1ff
+ mov r7, #0xff
+ add r7, #(\n - 0xff)
+ .else
+ .err
+ .endif
+ swi #0
+.endm
+
+.macro fdpic_thunk ofs
+ ldr r3, [sp, #\ofs]
+ ldmia r2, {r2, r3}
+ mov r9, r3
+ bx r2
+.endm
+
+.macro endf name
+ .globl \name
+ .type \name, %function
+ .size \name, . - \name
+.endm
+
+/*
+ * We must save/restore r7 for the EABI syscall number.
+ * While we're doing that, we might as well save LR to get a free return,
+ * and a branch that is interworking back to ARMv5.
+ */
+
+.macro SYSCALL name, nr
+\name:
+ .cfi_startproc
+ push {r7, lr}
+ .cfi_adjust_cfa_offset 8
+ .cfi_offset r7, -8
+ .cfi_offset lr, -4
+ raw_syscall \nr
+ pop {r7, pc}
+ .cfi_endproc
+endf \name
+.endm
+
+SYSCALL __vdso_clock_gettime, __NR_clock_gettime
+SYSCALL __vdso_clock_gettime64, __NR_clock_gettime64
+SYSCALL __vdso_clock_getres, __NR_clock_getres
+SYSCALL __vdso_gettimeofday, __NR_gettimeofday
+
+
+/*
+ * We, like the real kernel, use a table of sigreturn trampolines.
+ * Unlike the real kernel, we do not attempt to pack this into as
+ * few bytes as possible -- simply use 16 bytes per slot.
+ *
+ * Within each slot, use the exact same code sequence as the kernel,
+ * lest we trip up someone doing code inspection.
+ */
+
+/* offsetof(struct sigframe, retcode[3]) */
+#define SIGFRAME_RC3_OFFSET 756
+#define RT_SIGFRAME_RC3_OFFSET 884
+
+.macro slot n
+ .balign 16
+ .org sigreturn_codes + 16 * \n
+.endm
+
+.macro cfi_fdpic_r9 ofs
+ /*
+ * fd = *(r13 + ofs)
+ * r9 = *(fd + 4)
+ *
+ * DW_CFA_expression r9, length (7),
+ * DW_OP_breg13, ofs, DW_OP_deref,
+ * DW_OP_plus_uconst, 4, DW_OP_deref
+ */
+ .cfi_escape 0x10, 9, 7, 0x7d, (\ofs & 0x7f) + 0x80, (\ofs >> 7), 0x06, 0x23, 4, 0x06
+.endm
+
+.macro cfi_fdpic_pc ofs
+ /*
+ * fd = *(r13 + ofs)
+ * pc = *fd
+ *
+ * DW_CFA_expression lr (14), length (5),
+ * DW_OP_breg13, ofs, DW_OP_deref, DW_OP_deref
+ */
+ .cfi_escape 0x10, 14, 5, 0x7d, (\ofs & 0x7f) + 0x80, (\ofs >> 7), 0x06, 0x06
+.endm
+
+/*
+ * Start the unwind info at least one instruction before the signal
+ * trampoline, because the unwinder will assume we are returning
+ * after a call site.
+ */
+ .cfi_startproc simple
+ .cfi_signal_frame
+ .cfi_return_column 15
+
+ .cfi_def_cfa sp, 32 + 64
+ .cfi_offset r0, -16 * 4
+ .cfi_offset r1, -15 * 4
+ .cfi_offset r2, -14 * 4
+ .cfi_offset r3, -13 * 4
+ .cfi_offset r4, -12 * 4
+ .cfi_offset r5, -11 * 4
+ .cfi_offset r6, -10 * 4
+ .cfi_offset r7, -9 * 4
+ .cfi_offset r8, -8 * 4
+ .cfi_offset r9, -7 * 4
+ .cfi_offset r10, -6 * 4
+ .cfi_offset r11, -5 * 4
+ .cfi_offset r12, -4 * 4
+ .cfi_offset r13, -3 * 4
+ .cfi_offset r14, -2 * 4
+ .cfi_offset r15, -1 * 4
+
+ nop
+
+ .balign 16
+sigreturn_codes:
+ /* [EO]ABI sigreturn */
+ slot 0
+ raw_syscall __NR_sigreturn
+
+ .cfi_def_cfa_offset 160 + 64
+
+ /* [EO]ABI rt_sigreturn */
+ slot 1
+ raw_syscall __NR_rt_sigreturn
+
+ .cfi_endproc
+
+ /* FDPIC sigreturn */
+ .cfi_startproc
+ cfi_fdpic_pc SIGFRAME_RC3_OFFSET
+ cfi_fdpic_r9 SIGFRAME_RC3_OFFSET
+
+ slot 2
+ fdpic_thunk SIGFRAME_RC3_OFFSET
+ .cfi_endproc
+
+ /* FDPIC rt_sigreturn */
+ .cfi_startproc
+ cfi_fdpic_pc RT_SIGFRAME_RC3_OFFSET
+ cfi_fdpic_r9 RT_SIGFRAME_RC3_OFFSET
+
+ slot 3
+ fdpic_thunk RT_SIGFRAME_RC3_OFFSET
+ .cfi_endproc
+
+ .balign 16
+endf sigreturn_codes
diff --git a/linux-user/arm/vdso.ld b/linux-user/arm/vdso.ld
new file mode 100644
index 0000000000..3b00adf27a
--- /dev/null
+++ b/linux-user/arm/vdso.ld
@@ -0,0 +1,67 @@
+/*
+ * Linker script for linux arm replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+VERSION {
+ LINUX_2.6 {
+ global:
+ __vdso_clock_gettime;
+ __vdso_gettimeofday;
+ __vdso_clock_getres;
+ __vdso_clock_gettime64;
+
+ 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
+}
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 15/20] linux-user/hppa: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (13 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 14/20] linux-user/arm: " Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 16/20] linux-user/riscv: " Richard Henderson
` (5 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/hppa/vdso-asmoffset.h | 12 +++
linux-user/elfload.c | 4 +
linux-user/hppa/signal.c | 24 +++--
linux-user/hppa/meson.build | 23 +++++
linux-user/hppa/vdso.S | 165 +++++++++++++++++++++++++++++++
linux-user/hppa/vdso.ld | 77 +++++++++++++++
linux-user/hppa/vdso.so | Bin 0 -> 2104 bytes
7 files changed, 295 insertions(+), 10 deletions(-)
create mode 100644 linux-user/hppa/vdso-asmoffset.h
create mode 100644 linux-user/hppa/vdso.S
create mode 100644 linux-user/hppa/vdso.ld
create mode 100755 linux-user/hppa/vdso.so
diff --git a/linux-user/hppa/vdso-asmoffset.h b/linux-user/hppa/vdso-asmoffset.h
new file mode 100644
index 0000000000..c8b40c0332
--- /dev/null
+++ b/linux-user/hppa/vdso-asmoffset.h
@@ -0,0 +1,12 @@
+#define sizeof_rt_sigframe 584
+#define offsetof_sigcontext 160
+#define offsetof_sigcontext_gr 0x4
+#define offsetof_sigcontext_fr 0x88
+#define offsetof_sigcontext_iaoq 0x190
+#define offsetof_sigcontext_sar 0x198
+
+/* arch/parisc/include/asm/rt_sigframe.h */
+#define SIGFRAME 64
+#define FUNCTIONCALLFRAME 48
+#define PARISC_RT_SIGFRAME_SIZE32 \
+ (((sizeof_rt_sigframe) + FUNCTIONCALLFRAME + SIGFRAME) & -SIGFRAME)
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index cd2ab4292c..eb22a17e0e 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1771,6 +1771,10 @@ static inline void init_thread(struct target_pt_regs *regs,
#define STACK_GROWS_DOWN 0
#define STACK_ALIGNMENT 64
+#include "vdso.c.inc"
+
+#define vdso_image_info() &vdso_image_info
+
static inline void init_thread(struct target_pt_regs *regs,
struct image_info *infop)
{
diff --git a/linux-user/hppa/signal.c b/linux-user/hppa/signal.c
index f253a15864..ada22556c1 100644
--- a/linux-user/hppa/signal.c
+++ b/linux-user/hppa/signal.c
@@ -21,6 +21,7 @@
#include "user-internals.h"
#include "signal-common.h"
#include "linux-user/trace.h"
+#include "vdso-asmoffset.h"
struct target_sigcontext {
abi_ulong sc_flags;
@@ -47,6 +48,19 @@ struct target_rt_sigframe {
/* hidden location of upper halves of pa2.0 64-bit gregs */
};
+QEMU_BUILD_BUG_ON(sizeof(struct target_rt_sigframe) != sizeof_rt_sigframe);
+QEMU_BUILD_BUG_ON(offsetof(struct target_rt_sigframe, uc.tuc_mcontext)
+ != offsetof_sigcontext);
+QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, sc_gr)
+ != offsetof_sigcontext_gr);
+QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, sc_fr)
+ != offsetof_sigcontext_fr);
+QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, sc_iaoq)
+ != offsetof_sigcontext_iaoq);
+QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, sc_sar)
+ != offsetof_sigcontext_sar);
+
+
static void setup_sigcontext(struct target_sigcontext *sc, CPUArchState *env)
{
int i;
@@ -91,16 +105,6 @@ static void restore_sigcontext(CPUArchState *env, struct target_sigcontext *sc)
__get_user(env->cr[CR_SAR], &sc->sc_sar);
}
-#if TARGET_ABI_BITS == 32
-#define SIGFRAME 64
-#define FUNCTIONCALLFRAME 48
-#else
-#define SIGFRAME 128
-#define FUNCTIONCALLFRAME 96
-#endif
-#define PARISC_RT_SIGFRAME_SIZE32 \
- ((sizeof(struct target_rt_sigframe) + FUNCTIONCALLFRAME + SIGFRAME) & -SIGFRAME)
-
void setup_rt_frame(int sig, struct target_sigaction *ka,
target_siginfo_t *info,
target_sigset_t *set, CPUArchState *env)
diff --git a/linux-user/hppa/meson.build b/linux-user/hppa/meson.build
index 4709508a09..e13ea4e9ab 100644
--- a/linux-user/hppa/meson.build
+++ b/linux-user/hppa/meson.build
@@ -3,3 +3,26 @@ syscall_nr_generators += {
arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
output: '@BASENAME@_nr.h')
}
+
+vdso_so = custom_target(output: 'vdso.so',
+ input: files('vdso.S', 'vdso.ld'),
+ depend_files: files('vdso-asmoffset.h'),
+ command: [
+ build_vdso_cmd,
+ '-B', meson.project_build_root(),
+ '-C', meson.current_source_dir(),
+ '-T', 'hppa-linux-user',
+ '-o', '@OUTPUT@',
+ '--', '-nostdlib', '-shared',
+ '-Wl,-h,linux-vdso32.so.1',
+ '-Wl,--build-id=sha1',
+ '-Wl,--hash-style=both',
+ '-Wl,-T,@INPUT1@',
+ '@INPUT0@'
+ ])
+
+vdso_inc = gen_vdso.process(vdso_so, extra_args: [
+ '-r', '__kernel_sigtramp_rt'
+ ])
+
+linux_user_ss.add(when: 'TARGET_HPPA', if_true: vdso_inc)
diff --git a/linux-user/hppa/vdso.S b/linux-user/hppa/vdso.S
new file mode 100644
index 0000000000..5be14d2f70
--- /dev/null
+++ b/linux-user/hppa/vdso.S
@@ -0,0 +1,165 @@
+/*
+ * hppa linux kernel vdso replacement.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <asm/unistd.h>
+#include "vdso-asmoffset.h"
+
+ .text
+
+
+/*
+ * arch/parisc/kernel/vdso32/sigtramp.S:
+ * Gdb expects the trampoline is on the stack and the pc is offset from
+ * a 64-byte boundary by 0, 4 or 5 instructions. Since the vdso trampoline
+ * is not on the stack, we need a new variant with different offsets and
+ * data to tell gdb where to find the signal context on the stack.
+ *
+ * Here we put the offset to the context data at the start of the trampoline
+ * region and offset the first trampoline by 2 instructions. Please do
+ * not change the trampoline as the code in gdb depends on the following
+ * instruction sequence exactly.
+ */
+
+/* arch/parisc/kernel/asm-offsets.c */
+#define SIGFRAME_CONTEXT_REGS32 \
+ (offsetof_sigcontext - PARISC_RT_SIGFRAME_SIZE32)
+
+ .align 64
+ .word SIGFRAME_CONTEXT_REGS32
+
+/*
+ * All that said, we can provide a proper unwind record, which means that
+ * GDB should not actually need the offset magic.
+ *
+ * The return address that arrived here, from the inner frame, is
+ * not marked as a signal frame and so the unwinder still tries to
+ * subtract 1 to examine the presumed call insn. Thus we must
+ * extend the unwind info to a nop before the start.
+ */
+
+ .cfi_startproc simple
+ .cfi_signal_frame
+
+ /* Compare pa32_fallback_frame_state from libgcc. */
+
+ /*
+ * Place the CFA at the start of sigcontext for convenience.
+ * The previous CFA will be restored from the saved stack pointer.
+ */
+ .cfi_def_cfa 30, -PARISC_RT_SIGFRAME_SIZE32 + offsetof_sigcontext
+
+ /* Record save offset of general registers. */
+ .cfi_offset 1, offsetof_sigcontext_gr + 1 * 4
+ .cfi_offset 2, offsetof_sigcontext_gr + 2 * 4
+ .cfi_offset 3, offsetof_sigcontext_gr + 3 * 4
+ .cfi_offset 4, offsetof_sigcontext_gr + 4 * 4
+ .cfi_offset 5, offsetof_sigcontext_gr + 5 * 4
+ .cfi_offset 6, offsetof_sigcontext_gr + 6 * 4
+ .cfi_offset 7, offsetof_sigcontext_gr + 7 * 4
+ .cfi_offset 8, offsetof_sigcontext_gr + 8 * 4
+ .cfi_offset 9, offsetof_sigcontext_gr + 9 * 4
+ .cfi_offset 10, offsetof_sigcontext_gr + 10 * 4
+ .cfi_offset 11, offsetof_sigcontext_gr + 11 * 4
+ .cfi_offset 12, offsetof_sigcontext_gr + 12 * 4
+ .cfi_offset 13, offsetof_sigcontext_gr + 13 * 4
+ .cfi_offset 14, offsetof_sigcontext_gr + 14 * 4
+ .cfi_offset 15, offsetof_sigcontext_gr + 15 * 4
+ .cfi_offset 16, offsetof_sigcontext_gr + 16 * 4
+ .cfi_offset 17, offsetof_sigcontext_gr + 17 * 4
+ .cfi_offset 18, offsetof_sigcontext_gr + 18 * 4
+ .cfi_offset 19, offsetof_sigcontext_gr + 19 * 4
+ .cfi_offset 20, offsetof_sigcontext_gr + 20 * 4
+ .cfi_offset 21, offsetof_sigcontext_gr + 21 * 4
+ .cfi_offset 22, offsetof_sigcontext_gr + 22 * 4
+ .cfi_offset 23, offsetof_sigcontext_gr + 23 * 4
+ .cfi_offset 24, offsetof_sigcontext_gr + 24 * 4
+ .cfi_offset 25, offsetof_sigcontext_gr + 25 * 4
+ .cfi_offset 26, offsetof_sigcontext_gr + 26 * 4
+ .cfi_offset 27, offsetof_sigcontext_gr + 27 * 4
+ .cfi_offset 28, offsetof_sigcontext_gr + 28 * 4
+ .cfi_offset 29, offsetof_sigcontext_gr + 29 * 4
+ .cfi_offset 30, offsetof_sigcontext_gr + 30 * 4
+ .cfi_offset 31, offsetof_sigcontext_gr + 31 * 4
+
+ /* Record save offset of fp registers, left and right halves. */
+ .cfi_offset 32, offsetof_sigcontext_fr + 4 * 8
+ .cfi_offset 33, offsetof_sigcontext_fr + 4 * 8 + 4
+ .cfi_offset 34, offsetof_sigcontext_fr + 5 * 8
+ .cfi_offset 35, offsetof_sigcontext_fr + 5 * 8 + 4
+ .cfi_offset 36, offsetof_sigcontext_fr + 6 * 8
+ .cfi_offset 37, offsetof_sigcontext_fr + 6 * 8 + 4
+ .cfi_offset 38, offsetof_sigcontext_fr + 7 * 8
+ .cfi_offset 39, offsetof_sigcontext_fr + 7 * 8 + 4
+ .cfi_offset 40, offsetof_sigcontext_fr + 8 * 8
+ .cfi_offset 41, offsetof_sigcontext_fr + 8 * 8 + 4
+ .cfi_offset 42, offsetof_sigcontext_fr + 9 * 8
+ .cfi_offset 43, offsetof_sigcontext_fr + 9 * 8 + 4
+ .cfi_offset 44, offsetof_sigcontext_fr + 10 * 8
+ .cfi_offset 45, offsetof_sigcontext_fr + 10 * 8 + 4
+ .cfi_offset 46, offsetof_sigcontext_fr + 11 * 8
+ .cfi_offset 47, offsetof_sigcontext_fr + 11 * 8 + 4
+ .cfi_offset 48, offsetof_sigcontext_fr + 12 * 8
+ .cfi_offset 49, offsetof_sigcontext_fr + 12 * 8 + 4
+ .cfi_offset 50, offsetof_sigcontext_fr + 13 * 8
+ .cfi_offset 51, offsetof_sigcontext_fr + 13 * 8 + 4
+ .cfi_offset 52, offsetof_sigcontext_fr + 14 * 8
+ .cfi_offset 53, offsetof_sigcontext_fr + 14 * 8 + 4
+ .cfi_offset 54, offsetof_sigcontext_fr + 15 * 8
+ .cfi_offset 55, offsetof_sigcontext_fr + 15 * 8 + 4
+ .cfi_offset 56, offsetof_sigcontext_fr + 16 * 8
+ .cfi_offset 57, offsetof_sigcontext_fr + 16 * 8 + 4
+ .cfi_offset 58, offsetof_sigcontext_fr + 17 * 8
+ .cfi_offset 59, offsetof_sigcontext_fr + 17 * 8 + 4
+ .cfi_offset 60, offsetof_sigcontext_fr + 18 * 8
+ .cfi_offset 61, offsetof_sigcontext_fr + 18 * 8 + 4
+ .cfi_offset 62, offsetof_sigcontext_fr + 19 * 8
+ .cfi_offset 63, offsetof_sigcontext_fr + 19 * 8 + 4
+ .cfi_offset 64, offsetof_sigcontext_fr + 20 * 8
+ .cfi_offset 65, offsetof_sigcontext_fr + 20 * 8 + 4
+ .cfi_offset 66, offsetof_sigcontext_fr + 21 * 8
+ .cfi_offset 67, offsetof_sigcontext_fr + 21 * 8 + 4
+ .cfi_offset 68, offsetof_sigcontext_fr + 22 * 8
+ .cfi_offset 69, offsetof_sigcontext_fr + 22 * 8 + 4
+ .cfi_offset 70, offsetof_sigcontext_fr + 23 * 8
+ .cfi_offset 71, offsetof_sigcontext_fr + 23 * 8 + 4
+ .cfi_offset 72, offsetof_sigcontext_fr + 24 * 8
+ .cfi_offset 73, offsetof_sigcontext_fr + 24 * 8 + 4
+ .cfi_offset 74, offsetof_sigcontext_fr + 25 * 8
+ .cfi_offset 75, offsetof_sigcontext_fr + 25 * 8 + 4
+ .cfi_offset 76, offsetof_sigcontext_fr + 26 * 8
+ .cfi_offset 77, offsetof_sigcontext_fr + 26 * 8 + 4
+ .cfi_offset 78, offsetof_sigcontext_fr + 27 * 8
+ .cfi_offset 79, offsetof_sigcontext_fr + 27 * 8 + 4
+ .cfi_offset 80, offsetof_sigcontext_fr + 28 * 8
+ .cfi_offset 81, offsetof_sigcontext_fr + 28 * 8 + 4
+ .cfi_offset 82, offsetof_sigcontext_fr + 29 * 8
+ .cfi_offset 83, offsetof_sigcontext_fr + 29 * 8 + 4
+ .cfi_offset 84, offsetof_sigcontext_fr + 30 * 8
+ .cfi_offset 85, offsetof_sigcontext_fr + 30 * 8 + 4
+ .cfi_offset 86, offsetof_sigcontext_fr + 31 * 8
+ .cfi_offset 87, offsetof_sigcontext_fr + 31 * 8 + 4
+
+ /* Record save offset of %sar */
+ .cfi_offset 88, offsetof_sigcontext_sar
+
+ /* Record save offset of return address, iaoq[0]. */
+ .cfi_return_column 89
+ .cfi_offset 89, offsetof_sigcontext_iaoq
+
+ nop
+
+__kernel_sigtramp_rt:
+ ldi 0, %r25
+ ldi __NR_rt_sigreturn, %r20
+ be,l 0x100(%sr2, %r0), %sr0, %r31
+ nop
+
+ .cfi_endproc
+ .size __kernel_sigtramp_rt, . - __kernel_sigtramp_rt
+ .type __kernel_sigtramp_rt, @function
+ .globl __kernel_sigtramp_rt
diff --git a/linux-user/hppa/vdso.ld b/linux-user/hppa/vdso.ld
new file mode 100644
index 0000000000..b17ad974f3
--- /dev/null
+++ b/linux-user/hppa/vdso.ld
@@ -0,0 +1,77 @@
+/*
+ * Linker script for linux hppa vdso.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+VERSION {
+ /*
+ * The kernel's vdso32.lds.S attempts to export
+ * __kernel_sigtramp_rt32
+ * __kernel_restart_syscall32
+ * except that those symbols don't exist. The actual symbols are
+ * __kernel_sigtramp_rt
+ * __kernel_restart_syscall
+ * which means that nothing is exported at all.
+ * QEMU handles syscall restart internally, so we don't
+ * need to implement __kernel_restart_syscall at all.
+ */
+ LINUX_5.18 {
+ local: *;
+ };
+}
+
+
+PHDRS {
+ phdr PT_PHDR FLAGS(4) PHDRS;
+ load PT_LOAD FLAGS(7) FILEHDR PHDRS;
+ dynamic PT_DYNAMIC FLAGS(4);
+ note PT_NOTE FLAGS(4);
+ eh_frame_hdr PT_GNU_EH_FRAME;
+}
+
+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
+ .data : {
+ /* There ought not be any real read-write data.
+ But since we manipulated the segment layout,
+ we have to put these sections somewhere. */
+ *(.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
+}
diff --git a/linux-user/hppa/vdso.so b/linux-user/hppa/vdso.so
new file mode 100755
index 0000000000000000000000000000000000000000..e1ddd70c37e9eb6871c21d538dcce0a1e736a918
GIT binary patch
literal 2104
zcmbtVTXR!Y6kaFkhEgcBP%l`hafWdil!Lv1RY03GNz;<1rD<u4mqRou?Lbo}Ntxn<
z6hy2j;=SIj_j<pgs8u`u1|EIrgN{DxgO1|}@%#2U8(N>7>6(0JUG~~*U)EYXM<Vg4
z<+J=^$S<oPTAtb<qRxu=Dx^UIqGY2~=<y{O$Jj+oK_*H(nE6mi{#h5YR1g5<1OA$a
z3CM(*PkwG5Hb5ryc)IX&Cqgt{f>dFQ(BmGb?r%x-$mIFC+3xTU<+0?(1N%-~JGte|
zwo#0&1h`Mkv8G3g7ybaBfv&)R1jiYzaqu#r23QVo^SCSe7yscgz|X_x1OE;7zacM{
z)|dd5Qv4k<?}@~{^4{j(t<h=2zNONP7f%I_%E6)R=-B2%>HJ82ot+=CYbD;A=;?E|
z+O@bm6U{<ItNi3nuEjfB2e@mvD_Uj0oF4PWz(nuQs`hV(%=>_s6$j@&=K!(p?Mg~X
zNxxOSx@O|YQQtBD{UyiM14~XUeXw+5*+XR~mp{DXk@8b3A6<32;<3udS3j}l$*QL=
zd;0Qcu9&>?*|pDI^?daU>t0;{Qq9X(zY>_*^y+o5UH|&#H|#gJymiCdwbOO))W6&C
z-q!cGeQ@K4jUV0g@y(xX|8&P^J3qhW%&lKEeHlC(`l|Ws@Hdf}=(jE3#lCM<O>HW;
zONHX9xm|@5D$=2%ovLNGigl^hq-yI{yLwc7k81B#i9XfQuR8at-M6W(+g0)o)qSVx
zanzoDsyC(j22_8Vr_*Qt6`W`0eJzTL#S4K_@ijH9MKe`ddw-H+LR}U|=Qy2(>V?rY
z1fBH)(sj*o{IovBFBJ9<$eQLCI%^7~`+_?Ao;v%3I{KO9);;u6S9h0zzRc5gxj|<y
zfqc9>&Sy_i8rNTu72w>n-mm4>KjyI4HF5rW`17r(z$)~w!;~p-Ow|1nqfFBM<AnPY
z!S>c>aU8q_P9)|;yMpZzCl>C4=|Coz%^Y;{L;DN4)bKq{t{_fJydxBhI~~zzGScmI
z2Sf3Qv!HS8{Ndq3>MpVKg`CR=jg%cJWW-J%&ZdTk?$!c)!Bd5l*!#1i_FyVM=-LZ8
z*K#P6%MXoY7bs3z?98AufIVfL!8AOLCUzk+R&dYvKfl%RW1g54)&;QvFy!T2u7QF1
zMOrSt&AewX$GSF{-%SAXhIp(aT}uJz^keQAkM9EVqIJY$eh5<^kS@K|J0P>p7;oBz
z?knzt#CSv_-q=6E={Ms-0?_~K7xHZML!Ihc<@;@jdnC0XUJ;yrc(-*8a~%^8c8*D}
zdE;G`CSg6AJLMeG0KnLAF#k;p-Us8y>={4wf$jxe@351M-+hqjhn)DwT}TsjLrtFG
t#WH69ET#p-{eR>C0pl?r>_u}nn&<FI0)`le#5wc)R6X?L9Pmi{{R?cl2WkKS
literal 0
HcmV?d00001
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 16/20] linux-user/riscv: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (14 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 15/20] linux-user/hppa: " Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-09-19 4:47 ` Alistair Francis
2023-08-29 22:02 ` [PATCH v5 17/20] linux-user/loongarch64: " Richard Henderson
` (4 subsequent siblings)
20 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/riscv/vdso-asmoffset.h | 9 ++
linux-user/elfload.c | 4 +
linux-user/riscv/signal.c | 8 ++
linux-user/meson.build | 1 +
linux-user/riscv/meson.build | 30 +++++
linux-user/riscv/vdso-32.so | Bin 0 -> 2888 bytes
linux-user/riscv/vdso-64.so | Bin 0 -> 3840 bytes
linux-user/riscv/vdso.S | 186 ++++++++++++++++++++++++++++++
linux-user/riscv/vdso.ld | 74 ++++++++++++
9 files changed, 312 insertions(+)
create mode 100644 linux-user/riscv/vdso-asmoffset.h
create mode 100644 linux-user/riscv/meson.build
create mode 100755 linux-user/riscv/vdso-32.so
create mode 100755 linux-user/riscv/vdso-64.so
create mode 100644 linux-user/riscv/vdso.S
create mode 100644 linux-user/riscv/vdso.ld
diff --git a/linux-user/riscv/vdso-asmoffset.h b/linux-user/riscv/vdso-asmoffset.h
new file mode 100644
index 0000000000..123902ef61
--- /dev/null
+++ b/linux-user/riscv/vdso-asmoffset.h
@@ -0,0 +1,9 @@
+#ifdef TARGET_ABI32
+# define sizeof_rt_sigframe 0x2b0
+# define offsetof_uc_mcontext 0x120
+# define offsetof_freg0 0x80
+#else
+# define sizeof_rt_sigframe 0x340
+# define offsetof_uc_mcontext 0x130
+# define offsetof_freg0 0x100
+#endif
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index eb22a17e0e..8f902bb427 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1733,8 +1733,10 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs,
#ifdef TARGET_RISCV32
#define ELF_CLASS ELFCLASS32
+#include "vdso-32.c.inc"
#else
#define ELF_CLASS ELFCLASS64
+#include "vdso-64.c.inc"
#endif
#define ELF_HWCAP get_elf_hwcap()
@@ -1751,6 +1753,8 @@ static uint32_t get_elf_hwcap(void)
#undef MISA_BIT
}
+#define vdso_image_info() &vdso_image_info
+
static inline void init_thread(struct target_pt_regs *regs,
struct image_info *infop)
{
diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c
index eaa168199a..5449c7618a 100644
--- a/linux-user/riscv/signal.c
+++ b/linux-user/riscv/signal.c
@@ -21,6 +21,7 @@
#include "user-internals.h"
#include "signal-common.h"
#include "linux-user/trace.h"
+#include "vdso-asmoffset.h"
/* Signal handler invocation must be transparent for the code being
interrupted. Complete CPU (hart) state is saved on entry and restored
@@ -37,6 +38,8 @@ struct target_sigcontext {
uint32_t fcsr;
}; /* cf. riscv-linux:arch/riscv/include/uapi/asm/ptrace.h */
+QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, fpr) != offsetof_freg0);
+
struct target_ucontext {
unsigned long uc_flags;
struct target_ucontext *uc_link;
@@ -51,6 +54,11 @@ struct target_rt_sigframe {
struct target_ucontext uc;
};
+QEMU_BUILD_BUG_ON(sizeof(struct target_rt_sigframe)
+ != sizeof_rt_sigframe);
+QEMU_BUILD_BUG_ON(offsetof(struct target_rt_sigframe, uc.uc_mcontext)
+ != offsetof_uc_mcontext);
+
static abi_ulong get_sigframe(struct target_sigaction *ka,
CPURISCVState *regs, size_t framesize)
{
diff --git a/linux-user/meson.build b/linux-user/meson.build
index 1b265ed365..3aa967b27c 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -46,6 +46,7 @@ subdir('microblaze')
subdir('mips64')
subdir('mips')
subdir('ppc')
+subdir('riscv')
subdir('s390x')
subdir('sh4')
subdir('sparc')
diff --git a/linux-user/riscv/meson.build b/linux-user/riscv/meson.build
new file mode 100644
index 0000000000..0a00cae9fd
--- /dev/null
+++ b/linux-user/riscv/meson.build
@@ -0,0 +1,30 @@
+vdso_cmd = [
+ build_vdso_cmd,
+ '-B', meson.project_build_root(),
+ '-C', meson.current_source_dir(),
+ '-T', 'riscv64-linux-user',
+ '-o', '@OUTPUT@',
+ '--',
+ '-nostdlib', '-shared', '-fpic',
+ '-Wl,-h,linux-vdso.so.1',
+ '-Wl,--build-id=sha1',
+ '-Wl,--hash-style=both',
+ '-Wl,-T,@INPUT1@',
+ '@INPUT0@'
+]
+
+vdso_32_so = custom_target(output: 'vdso-32.so',
+ input: files('vdso.S', 'vdso.ld'),
+ depend_files: files('vdso-asmoffset.h'),
+ command: vdso_cmd + ['-mabi=ilp32d', '-march=rv32g'])
+
+vdso_64_so = custom_target(output: 'vdso-64.so',
+ input: files('vdso.S', 'vdso.ld'),
+ depend_files: files('vdso-asmoffset.h'),
+ command: vdso_cmd + ['-mabi=lp64d', '-march=rv64g'])
+
+vdso_32_inc = gen_vdso.process(vdso_32_so, extra_args: ['-r', '__vdso_rt_sigreturn'])
+vdso_64_inc = gen_vdso.process(vdso_64_so, extra_args: ['-r', '__vdso_rt_sigreturn'])
+
+linux_user_ss.add(when: 'TARGET_RISCV32', if_true: vdso_32_inc)
+linux_user_ss.add(when: 'TARGET_RISCV64', if_true: vdso_64_inc)
diff --git a/linux-user/riscv/vdso-32.so b/linux-user/riscv/vdso-32.so
new file mode 100755
index 0000000000000000000000000000000000000000..189e2f49e78f158cf49e6092edf7ece8cf7e8a25
GIT binary patch
literal 2888
zcmb_eU2GIp6h5=d;!>e*DVSm#Q)tD8)XjFOgkaNj+iv-BX`4b7lsMh)Zo3=lZnHbv
zKtn88L{tQ{1rbpTD59cPKoLbD(ZobwOnmZP<BKu=pbv`F@0*#sOtlX_c-n8zJwJ2i
z-nr*~Gb7<ho2F@^#4W#yvg+ZS@QTcWu9r%gEj3aiK4{uEa0O$6d4yYJu-1ctEiJZY
zjI~vL+bzr`Zlc2{;({telEM+#gsR{9oe@8Rn<!KxMyNRTRR?B@FF+h6WOaMD)NVO*
z_^kKZ)kEKYIr2xx`Cl$9zC2Qlm;ta>D<<^Y^{LDbXfEp#G@rpF=2!%M0Js^z)U7o@
z<FT1C2fuTHYg1F19^CLRXs+)k=m;n9KS&b`Lfn`wpY3T(dK2_~+<6(a7nA0EXzzwr
zQX)T3^}wih#1}H?up=<b9CjmYpTp)JaT#1EHTRIu#wkcQg>&HZq;Sg2rzUufRx+n9
zBt9Q)=9&HQMfv201A%14_`a!A7Y7zEI@ywLSorzTJ12V+qU%HPTt@Ft7)EL!k?D&^
zw<}+4YbN%viu}u&P2`jh7sm$k%Ie#i&n5L#EE-D|%4ZEdm+H?ZjC?jNTT|)$w!3&+
zKmO|^vbMc@lV0zyyBiaRxTgKF*R8+fmw%kco~r=ZR}}7*3%~i1?~53tsQuB(-S<?&
z<}>mkaV2yTx)XXY^fmecihH<Av>lpOKF=krQwDqmum_~GxH67rW^Mprtx9OhxTSdg
z1{7%0%ICT!J)WlcuHHv`MjzU}<*^6$Y<m2@y&IqCdb0DW_I;73*X>_(pzUDmGtJL7
zjWv!p99ngF<#Q{J)IT3Q8hF8ftoFraFV(!fbfWcm^NFUDjjuGky6V)**H)aae?9m{
z;7$LT+P9XyUGvV;$?A8PoUJ@}`}vCZZhOD%!mS@HxH$hq-$%ul=6+oCiTCnsbFRlQ
zH$DrV9ZGDEN2(@(6CNqmwChzh$EDPx$(T2=D2Mpy5>4DyAsMaOC8Kv}8gg7QpT|||
z>HITR;YO}VY4Og+b6<bzuA1mZoxJq#l*096-X62gn0IFp>oK44QjEvElV18l&G^Zt
za<L)NxF4SE(DGm^I9R6-1P23pl%u}jU{H_qXE+thW$7PI^(E4=1QNLcGssoj=QcaS
z;yt?D=E<;l#<JNBB27FX5T17m`HA8-*-3;vW!ctABwty!d7?z|j@xFb9;+;_=P9;$
z)ygNkf$s`&vYf>))b7IW(4sxhUV&xL0>5zo$VZl_-Lx#mZ^4ipLeXHecLO$I&<?^T
z&s$O?VGPvz8GlfPpvh-_&`!P@hVA6T{ji<<#XfWL-z01&Uw#JL$%hh)t=}A6p6K&u
zq<Wj^t()6J>({o3-r3dB5^nA83hSVRdqb<k`o>UmB&>s3@Q%^LYxK6R(E6~xrnO7-
z)sc?oP(<%&Yugass1hAiViVg;Y%~+uP3N#_d}UWE(4m9*3O<sjh(EV|z=-xj8(B*y
z)hL}Y65@|<Pe%t*F>`=i=%^7De}6jfPeyY|%Wq^Y&rl+pOJ&m23_ULXL{jg|Mh6ml
zGLB4TiQh<UGsJHmE`QW8vZ>y@0h0dDQjSb^H(Q<OiKqsYs1{rd2TuiC%K3d^oeb-}
z!}k>5o9uSh<9nVsh_Si{>-hloC)=0x*q4O57hL9;b_2k+W<8!)f*hh+n>hr1zuVsk
zJjX;6eE-aAwtWbj-y=NZ{0>pVIZ@UDQ+7R`dtyF(svfT=?g!MjNe_Yq=i*#1OyT)r
zZC>O2{(@<WTDt*D<&i&#AM6||mG_99$35XWC3Z8x7L`XIN(?GLzZYAS0j<`n?x{k9
q$h!h3d4}IMtjB#*-zylJ62L;gQ3kZCSAsF_TaY<uj>84(M&92P;-?}2
literal 0
HcmV?d00001
diff --git a/linux-user/riscv/vdso-64.so b/linux-user/riscv/vdso-64.so
new file mode 100755
index 0000000000000000000000000000000000000000..3c3b3a8cc579649e5108402b706bf7f741efd2e4
GIT binary patch
literal 3840
zcmc&%Z){Ul6hCieP{)QF3^Uxa3^Nr8G^Lqjk%hc&>o&BEW`j7R$)jt#wQ*~k_I247
zB2(voWYYm6qJk)jf9oF<{Kq~RB_>8b>UWK3jL{hVV9<Had*_tbyGB3w!L!}>yZ8LL
z_r7!Q{k_}0fnZmerh$kHeuc{|0G$o<6?SC_f)1^)6rVLvjR;`tY`bnlAuhz73A)+t
z0!UNb2z5|GIuxDEiEx=>b2g<vL7bu`W%#7=&TvO6dRZ?h^9+4!Mk%hT-0Ef#Hrr|t
zBwrFjDzn_LisCOwz9fXTSTH}(-Mb4m{&4D#+@;gYKK=e$!~ad=mM<FvU!VzA&;!M^
z!HT2mc?v}N?XQKDRpE|#`k-@L(teQ=gTl)TGj<b}GuAPxIhXvf8Lm+LFD=;PU*z%r
z<TeinKXdy6+ohlX16`QCdCr@RPs_FvDxrlFRmq0+tnXpH<Y5~1HSo&<yA@zJ)~KJT
z;=h{px}p!Ven8Q0WqnA|%RZ**(;5)cTCp3}Y?1Y+`AW)ZEy$mc-j`yu>NPdG242#U
zpSA9v*XR3Zyzzzu`xZ`~9bLQTL`Sl1^=C(}&kx4HFvg<UlrbDL&BSOdH53g`h%Pdc
zirgudMaoPpD>@90q;t|58p&njMj{f9#0%YLOe32Z&cw`ICJ7^nWNv&T4eP=GO%UAH
zyKBH`@oc&gCyY{7^k?fdd_(#>e(t9#I$sS~<m}M9m!U1U_qz(Rk<faQX!Wiw&4`qz
zT6AnfY(fkn>J&%?g=q#{lYOA=(X{%iGD}D2=K>blKjgOo%XutKSV#`rK(YN8tZVg^
zW%EnR^=a+yDeay;_l{4S_oeS2c_98^^r77k-|@)6zMYST_6KKrW;-9#A8(s$J<xK{
zduYQG>kc<R*>t4gsk)=JPgg%v`K<d`=kfOE^b=d3Z+qdUldUgqeyQb@?`7{Ro>w=#
zw*K{XZ(Nsee)F2Qn%-`Fr{VO~@7BF{)tTC}E8nmFV8w@(A60zpK1ch3=6eiFD;9Z&
zIrnTu7Td#90CVo@WmKPYH!)6GwpF;{$iB+5<=y1tZ^uU_k&TRjM*Wp%#x}PkeCbWb
zs4wj`!c-gbrF}+}9+QbkHbeT!#8505iJ_wxgZ@EWxER8-PB#~>uAGx%y$gi@iuH^6
zfb1?PFYs%zKW0h}mBZk|)1#NvyP*{Cx$p!FUpl(MaVrYnonrlR=#hi%Ft{AN<xpck
zRnDeWr|r9>1aH}EeVPB9fu;PfL<bG~QS(gupY&;kkbG8$i{C52{_}L;9CAC>OY!Rv
z>WN=fzMN#e%HR80ukz?o)~h_7XT8ezpRiu#Z-_*~og>+}&y#}YaWFb>>-BHn)&WMS
zZ%0R<b5~!$K)Slc-yJY^`rCs616dEh^G2Y@=<4%t4;Ve2ePDD4ceMM1#*VJ8{=iOg
zbkH1=ZYicLMa0GYTEwN?Q-P`-tX$9$u>*Lr6QgE$5Yf!o7?)ZyWyZi0ok)g96A`O|
zzKCHn44&a+&Jz!3<F?++*qX6eCYwkliyB50Jh8YjlnIZ<jCd41r3D@{Hg1B)A`eg4
zG&708oQWTh|19;`1AXJ@dq*PtAxPZs6!kc-MI&u(*{-tx1-<-zu)d?{C-(*7RT8>S
z&|OQ$7d{gFikwhnjuKDjiiFM)4I$&pxe*k9@+FbBAbrn>LS%foKME30lSuy(CwU<I
z?|7G!_yP~IgHFLHYP_ulXlI+m3ttM#eN_B8ozjGxv9{nCUwBn;C40*FGLGP_Xs5fW
zw1s~K<^9$C%LIsjXigHZ{!aL}{X=&UXT0#a;Eys8qvT)IcX7PXtMHwm%wPOv-K0H@
z70gXq+Jf@?sY4WuYW|&bce>_zLdQ5U^nIW^ugt%Wo#oEzjHP;re^7j_7}W7=&@OB1
QbiILp&>V6qv98Ad4M&HUy8r+H
literal 0
HcmV?d00001
diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S
new file mode 100644
index 0000000000..70a4f710db
--- /dev/null
+++ b/linux-user/riscv/vdso.S
@@ -0,0 +1,186 @@
+/*
+ * RISC-V linux replacement vdso.
+ *
+ * Copyright 2021 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <asm/unistd.h>
+#include <asm/errno.h>
+
+#if __riscv_xlen == 32
+# define TARGET_ABI32
+#endif
+#include "vdso-asmoffset.h"
+
+ .text
+
+.macro endf name
+ .globl \name
+ .type \name, @function
+ .size \name, . - \name
+.endm
+
+.macro raw_syscall nr
+ li a7, \nr
+ ecall
+.endm
+
+.macro vdso_syscall name, nr
+\name:
+ raw_syscall \nr
+endf \name
+.endm
+
+__vdso_gettimeofday:
+ .cfi_startproc
+#ifdef __NR_gettimeofday
+ raw_syscall __NR_gettimeofday
+ ret
+#else
+ /* No gettimeofday, fall back to clock_gettime64. */
+ beq a1, zero, 1f
+ sw zero, 0(a1) /* tz->tz_minuteswest = 0 */
+ sw zero, 4(a1) /* tz->tz_dsttime = 0 */
+1: addi sp, sp, -32
+ .cfi_adjust_cfa_offset 32
+ sw a0, 16(sp) /* save tv */
+ mv a0, sp
+ raw_syscall __NR_clock_gettime64
+ lw t0, 0(sp) /* timespec.tv_sec.low */
+ lw t1, 4(sp) /* timespec.tv_sec.high */
+ lw t2, 8(sp) /* timespec.tv_nsec.low */
+ lw a1, 16(sp) /* restore tv */
+ addi sp, sp, 32
+ .cfi_adjust_cfa_offset -32
+ bne a0, zero, 9f /* syscall error? */
+ li a0, -EOVERFLOW
+ bne t1, zero, 9f /* y2038? */
+ li a0, 0
+ li t3, 1000
+ divu t2, t2, t3 /* nsec -> usec */
+ sw t0, 0(a1) /* tz->tv_sec */
+ sw t2, 4(a1) /* tz->tv_usec */
+9: ret
+#endif
+ .cfi_endproc
+endf __vdso_gettimeofday
+
+ .cfi_startproc
+
+#ifdef __NR_clock_gettime
+vdso_syscall __vdso_clock_gettime, __NR_clock_gettime
+#else
+vdso_syscall __vdso_clock_gettime, __NR_clock_gettime64
+#endif
+
+#ifdef __NR_clock_getres
+vdso_syscall __vdso_clock_getres, __NR_clock_getres
+#else
+vdso_syscall __vdso_clock_getres, __NR_clock_getres_time64
+#endif
+
+vdso_syscall __vdso_getcpu, __NR_getcpu
+
+__vdso_flush_icache:
+ /* qemu does not need to flush the icache */
+ li a0, 0
+ ret
+endf __vdso_flush_icache
+
+ .cfi_endproc
+
+/*
+ * Start the unwind info at least one instruction before the signal
+ * trampoline, because the unwinder will assume we are returning
+ * after a call site.
+ */
+
+ .cfi_startproc simple
+ .cfi_signal_frame
+
+#define sizeof_reg (__riscv_xlen / 4)
+#define sizeof_freg 8
+#define B_GR (offsetof_uc_mcontext - sizeof_rt_sigframe)
+#define B_FR (offsetof_uc_mcontext - sizeof_rt_sigframe + offsetof_freg0)
+
+ .cfi_def_cfa 2, sizeof_rt_sigframe
+
+ /* Return address */
+ .cfi_return_column 64
+ .cfi_offset 64, B_GR + 0 /* pc */
+
+ /* Integer registers */
+ .cfi_offset 1, B_GR + 1 * sizeof_reg /* r1 (ra) */
+ .cfi_offset 2, B_GR + 2 * sizeof_reg /* r2 (sp) */
+ .cfi_offset 3, B_GR + 3 * sizeof_reg
+ .cfi_offset 4, B_GR + 4 * sizeof_reg
+ .cfi_offset 5, B_GR + 5 * sizeof_reg
+ .cfi_offset 6, B_GR + 6 * sizeof_reg
+ .cfi_offset 7, B_GR + 7 * sizeof_reg
+ .cfi_offset 8, B_GR + 8 * sizeof_reg
+ .cfi_offset 9, B_GR + 9 * sizeof_reg
+ .cfi_offset 10, B_GR + 10 * sizeof_reg
+ .cfi_offset 11, B_GR + 11 * sizeof_reg
+ .cfi_offset 12, B_GR + 12 * sizeof_reg
+ .cfi_offset 13, B_GR + 13 * sizeof_reg
+ .cfi_offset 14, B_GR + 14 * sizeof_reg
+ .cfi_offset 15, B_GR + 15 * sizeof_reg
+ .cfi_offset 16, B_GR + 16 * sizeof_reg
+ .cfi_offset 17, B_GR + 17 * sizeof_reg
+ .cfi_offset 18, B_GR + 18 * sizeof_reg
+ .cfi_offset 19, B_GR + 19 * sizeof_reg
+ .cfi_offset 20, B_GR + 20 * sizeof_reg
+ .cfi_offset 21, B_GR + 21 * sizeof_reg
+ .cfi_offset 22, B_GR + 22 * sizeof_reg
+ .cfi_offset 23, B_GR + 23 * sizeof_reg
+ .cfi_offset 24, B_GR + 24 * sizeof_reg
+ .cfi_offset 25, B_GR + 25 * sizeof_reg
+ .cfi_offset 26, B_GR + 26 * sizeof_reg
+ .cfi_offset 27, B_GR + 27 * sizeof_reg
+ .cfi_offset 28, B_GR + 28 * sizeof_reg
+ .cfi_offset 29, B_GR + 29 * sizeof_reg
+ .cfi_offset 30, B_GR + 30 * sizeof_reg
+ .cfi_offset 31, B_GR + 31 * sizeof_reg /* r31 */
+
+ .cfi_offset 32, B_FR + 0 /* f0 */
+ .cfi_offset 33, B_FR + 1 * sizeof_freg /* f1 */
+ .cfi_offset 34, B_FR + 2 * sizeof_freg
+ .cfi_offset 35, B_FR + 3 * sizeof_freg
+ .cfi_offset 36, B_FR + 4 * sizeof_freg
+ .cfi_offset 37, B_FR + 5 * sizeof_freg
+ .cfi_offset 38, B_FR + 6 * sizeof_freg
+ .cfi_offset 39, B_FR + 7 * sizeof_freg
+ .cfi_offset 40, B_FR + 8 * sizeof_freg
+ .cfi_offset 41, B_FR + 9 * sizeof_freg
+ .cfi_offset 42, B_FR + 10 * sizeof_freg
+ .cfi_offset 43, B_FR + 11 * sizeof_freg
+ .cfi_offset 44, B_FR + 12 * sizeof_freg
+ .cfi_offset 45, B_FR + 13 * sizeof_freg
+ .cfi_offset 46, B_FR + 14 * sizeof_freg
+ .cfi_offset 47, B_FR + 15 * sizeof_freg
+ .cfi_offset 48, B_FR + 16 * sizeof_freg
+ .cfi_offset 49, B_FR + 17 * sizeof_freg
+ .cfi_offset 50, B_FR + 18 * sizeof_freg
+ .cfi_offset 51, B_FR + 19 * sizeof_freg
+ .cfi_offset 52, B_FR + 20 * sizeof_freg
+ .cfi_offset 53, B_FR + 21 * sizeof_freg
+ .cfi_offset 54, B_FR + 22 * sizeof_freg
+ .cfi_offset 55, B_FR + 23 * sizeof_freg
+ .cfi_offset 56, B_FR + 24 * sizeof_freg
+ .cfi_offset 57, B_FR + 25 * sizeof_freg
+ .cfi_offset 58, B_FR + 26 * sizeof_freg
+ .cfi_offset 59, B_FR + 27 * sizeof_freg
+ .cfi_offset 60, B_FR + 28 * sizeof_freg
+ .cfi_offset 61, B_FR + 29 * sizeof_freg
+ .cfi_offset 62, B_FR + 30 * sizeof_freg
+ .cfi_offset 63, B_FR + 31 * sizeof_freg /* f31 */
+
+ nop
+
+__vdso_rt_sigreturn:
+ raw_syscall __NR_rt_sigreturn
+endf __vdso_rt_sigreturn
+
+ .cfi_endproc
diff --git a/linux-user/riscv/vdso.ld b/linux-user/riscv/vdso.ld
new file mode 100644
index 0000000000..aabe2b0ab3
--- /dev/null
+++ b/linux-user/riscv/vdso.ld
@@ -0,0 +1,74 @@
+/*
+ * Linker script for linux riscv replacement vdso.
+ *
+ * Copyright 2021 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+VERSION {
+ LINUX_4.15 {
+ global:
+ __vdso_rt_sigreturn;
+ __vdso_gettimeofday;
+ __vdso_clock_gettime;
+ __vdso_clock_getres;
+ __vdso_getcpu;
+ __vdso_flush_icache;
+
+ local: *;
+ };
+}
+
+
+PHDRS {
+ phdr PT_PHDR FLAGS(4) PHDRS;
+ load PT_LOAD FLAGS(7) FILEHDR PHDRS;
+ dynamic PT_DYNAMIC FLAGS(4);
+ eh_frame_hdr PT_GNU_EH_FRAME;
+ note PT_NOTE FLAGS(4);
+}
+
+SECTIONS {
+ /*
+ * We can't prelink to any address without knowing something about
+ * the virtual memory space of the host, since that leaks over into
+ * the available memory space of the guest.
+ */
+ . = 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 =0xd503201f
+}
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 17/20] linux-user/loongarch64: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (15 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 16/20] linux-user/riscv: " Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 18/20] linux-user/ppc: " Richard Henderson
` (3 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent, Song Gao
Requires a relatively recent binutils version in order to avoid
spurious R_LARCH_NONE relocations. The presence of these relocs
are diagnosed by our gen-vdso tool.
Tested-by: Song Gao <gaosong@loongson.cn>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/loongarch64/vdso-asmoffset.h | 8 ++
linux-user/elfload.c | 4 +
linux-user/loongarch64/signal.c | 17 +++-
linux-user/loongarch64/meson.build | 21 ++++
linux-user/loongarch64/vdso.S | 130 ++++++++++++++++++++++++
linux-user/loongarch64/vdso.ld | 73 +++++++++++++
linux-user/loongarch64/vdso.so | Bin 0 -> 3560 bytes
linux-user/meson.build | 1 +
8 files changed, 253 insertions(+), 1 deletion(-)
create mode 100644 linux-user/loongarch64/vdso-asmoffset.h
create mode 100644 linux-user/loongarch64/meson.build
create mode 100644 linux-user/loongarch64/vdso.S
create mode 100644 linux-user/loongarch64/vdso.ld
create mode 100755 linux-user/loongarch64/vdso.so
diff --git a/linux-user/loongarch64/vdso-asmoffset.h b/linux-user/loongarch64/vdso-asmoffset.h
new file mode 100644
index 0000000000..60d113822f
--- /dev/null
+++ b/linux-user/loongarch64/vdso-asmoffset.h
@@ -0,0 +1,8 @@
+#define sizeof_rt_sigframe 0x240
+#define sizeof_sigcontext 0x110
+#define sizeof_sctx_info 0x10
+
+#define offsetof_sigcontext 0x130
+#define offsetof_sigcontext_pc 0
+#define offsetof_sigcontext_gr 8
+#define offsetof_fpucontext_fr 0
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 8f902bb427..877727e9e7 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1027,6 +1027,10 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUPPCState *en
#define elf_check_arch(x) ((x) == EM_LOONGARCH)
+#include "vdso.c.inc"
+
+#define vdso_image_info() &vdso_image_info
+
static inline void init_thread(struct target_pt_regs *regs,
struct image_info *infop)
{
diff --git a/linux-user/loongarch64/signal.c b/linux-user/loongarch64/signal.c
index bb8efb1172..b9d0a4cad7 100644
--- a/linux-user/loongarch64/signal.c
+++ b/linux-user/loongarch64/signal.c
@@ -10,8 +10,8 @@
#include "user-internals.h"
#include "signal-common.h"
#include "linux-user/trace.h"
-
#include "target/loongarch/internals.h"
+#include "vdso-asmoffset.h"
/* FP context was used */
#define SC_USED_FP (1 << 0)
@@ -23,6 +23,11 @@ struct target_sigcontext {
uint64_t sc_extcontext[0] QEMU_ALIGNED(16);
};
+QEMU_BUILD_BUG_ON(sizeof(struct target_sigcontext) != sizeof_sigcontext);
+QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, sc_pc)
+ != offsetof_sigcontext_pc);
+QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, sc_regs)
+ != offsetof_sigcontext_gr);
#define FPU_CTX_MAGIC 0x46505501
#define FPU_CTX_ALIGN 8
@@ -32,6 +37,9 @@ struct target_fpu_context {
uint32_t fcsr;
} QEMU_ALIGNED(FPU_CTX_ALIGN);
+QEMU_BUILD_BUG_ON(offsetof(struct target_fpu_context, regs)
+ != offsetof_fpucontext_fr);
+
#define CONTEXT_INFO_ALIGN 16
struct target_sctx_info {
uint32_t magic;
@@ -39,6 +47,8 @@ struct target_sctx_info {
uint64_t padding;
} QEMU_ALIGNED(CONTEXT_INFO_ALIGN);
+QEMU_BUILD_BUG_ON(sizeof(struct target_sctx_info) != sizeof_sctx_info);
+
struct target_ucontext {
abi_ulong tuc_flags;
abi_ptr tuc_link;
@@ -53,6 +63,11 @@ struct target_rt_sigframe {
struct target_ucontext rs_uc;
};
+QEMU_BUILD_BUG_ON(sizeof(struct target_rt_sigframe)
+ != sizeof_rt_sigframe);
+QEMU_BUILD_BUG_ON(offsetof(struct target_rt_sigframe, rs_uc.tuc_mcontext)
+ != offsetof_sigcontext);
+
/*
* These two structures are not present in guest memory, are private
* to the signal implementation, but are largely copied from the
diff --git a/linux-user/loongarch64/meson.build b/linux-user/loongarch64/meson.build
new file mode 100644
index 0000000000..fea83312f5
--- /dev/null
+++ b/linux-user/loongarch64/meson.build
@@ -0,0 +1,21 @@
+vdso_so = custom_target(output: 'vdso.so',
+ input: files('vdso.S', 'vdso.ld'),
+ depend_files: files('vdso-asmoffset.h'),
+ command: [
+ build_vdso_cmd,
+ '-B', meson.project_build_root(),
+ '-C', meson.current_source_dir(),
+ '-T', 'loongarch64-linux-user',
+ '-o', '@OUTPUT@',
+ '--', '-nostdlib', '-shared', '-fpic',
+ '-Wl,-h,linux-vdso.so.1',
+ '-Wl,--build-id=sha1',
+ '-Wl,--hash-style=both',
+ '-Wl,--no-warn-rwx-segments',
+ '-Wl,-T,@INPUT1@',
+ '@INPUT0@'
+ ])
+
+vdso_inc = gen_vdso.process(vdso_so, extra_args: ['-r', '__vdso_rt_sigreturn'])
+
+linux_user_ss.add(when: 'TARGET_LOONGARCH64', if_true: vdso_inc)
diff --git a/linux-user/loongarch64/vdso.S b/linux-user/loongarch64/vdso.S
new file mode 100644
index 0000000000..780a5fda12
--- /dev/null
+++ b/linux-user/loongarch64/vdso.S
@@ -0,0 +1,130 @@
+/*
+ * Loongarch64 linux replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <asm/unistd.h>
+#include <asm/errno.h>
+#include "vdso-asmoffset.h"
+
+
+ .text
+
+.macro endf name
+ .globl \name
+ .type \name, @function
+ .size \name, . - \name
+.endm
+
+.macro vdso_syscall name, nr
+\name:
+ li.w $a7, \nr
+ syscall 0
+ jr $ra
+endf \name
+.endm
+
+ .cfi_startproc
+
+vdso_syscall __vdso_gettimeofday, __NR_gettimeofday
+vdso_syscall __vdso_clock_gettime, __NR_clock_gettime
+vdso_syscall __vdso_clock_getres, __NR_clock_getres
+vdso_syscall __vdso_getcpu, __NR_getcpu
+
+ .cfi_endproc
+
+/*
+ * Start the unwind info at least one instruction before the signal
+ * trampoline, because the unwinder will assume we are returning
+ * after a call site.
+ */
+
+ .cfi_startproc simple
+ .cfi_signal_frame
+
+#define B_GR offsetof_sigcontext_gr
+#define B_FR sizeof_sigcontext + sizeof_sctx_info + offsetof_fpucontext_fr
+
+ .cfi_def_cfa 2, offsetof_sigcontext
+
+ /* Return address */
+ .cfi_return_column 64
+ .cfi_offset 64, offsetof_sigcontext_pc /* pc */
+
+ /* Integer registers */
+ .cfi_offset 1, B_GR + 1 * 8
+ .cfi_offset 2, B_GR + 2 * 8
+ .cfi_offset 3, B_GR + 3 * 8
+ .cfi_offset 4, B_GR + 4 * 8
+ .cfi_offset 5, B_GR + 5 * 8
+ .cfi_offset 6, B_GR + 6 * 8
+ .cfi_offset 7, B_GR + 7 * 8
+ .cfi_offset 8, B_GR + 8 * 8
+ .cfi_offset 9, B_GR + 9 * 8
+ .cfi_offset 10, B_GR + 10 * 8
+ .cfi_offset 11, B_GR + 11 * 8
+ .cfi_offset 12, B_GR + 12 * 8
+ .cfi_offset 13, B_GR + 13 * 8
+ .cfi_offset 14, B_GR + 14 * 8
+ .cfi_offset 15, B_GR + 15 * 8
+ .cfi_offset 16, B_GR + 16 * 8
+ .cfi_offset 17, B_GR + 17 * 8
+ .cfi_offset 18, B_GR + 18 * 8
+ .cfi_offset 19, B_GR + 19 * 8
+ .cfi_offset 20, B_GR + 20 * 8
+ .cfi_offset 21, B_GR + 21 * 8
+ .cfi_offset 22, B_GR + 22 * 8
+ .cfi_offset 23, B_GR + 23 * 8
+ .cfi_offset 24, B_GR + 24 * 8
+ .cfi_offset 25, B_GR + 25 * 8
+ .cfi_offset 26, B_GR + 26 * 8
+ .cfi_offset 27, B_GR + 27 * 8
+ .cfi_offset 28, B_GR + 28 * 8
+ .cfi_offset 29, B_GR + 29 * 8
+ .cfi_offset 30, B_GR + 30 * 8
+ .cfi_offset 31, B_GR + 31 * 8
+
+ /* Floating point registers */
+ .cfi_offset 32, B_FR + 0
+ .cfi_offset 33, B_FR + 1 * 8
+ .cfi_offset 34, B_FR + 2 * 8
+ .cfi_offset 35, B_FR + 3 * 8
+ .cfi_offset 36, B_FR + 4 * 8
+ .cfi_offset 37, B_FR + 5 * 8
+ .cfi_offset 38, B_FR + 6 * 8
+ .cfi_offset 39, B_FR + 7 * 8
+ .cfi_offset 40, B_FR + 8 * 8
+ .cfi_offset 41, B_FR + 9 * 8
+ .cfi_offset 42, B_FR + 10 * 8
+ .cfi_offset 43, B_FR + 11 * 8
+ .cfi_offset 44, B_FR + 12 * 8
+ .cfi_offset 45, B_FR + 13 * 8
+ .cfi_offset 46, B_FR + 14 * 8
+ .cfi_offset 47, B_FR + 15 * 8
+ .cfi_offset 48, B_FR + 16 * 8
+ .cfi_offset 49, B_FR + 17 * 8
+ .cfi_offset 50, B_FR + 18 * 8
+ .cfi_offset 51, B_FR + 19 * 8
+ .cfi_offset 52, B_FR + 20 * 8
+ .cfi_offset 53, B_FR + 21 * 8
+ .cfi_offset 54, B_FR + 22 * 8
+ .cfi_offset 55, B_FR + 23 * 8
+ .cfi_offset 56, B_FR + 24 * 8
+ .cfi_offset 57, B_FR + 25 * 8
+ .cfi_offset 58, B_FR + 26 * 8
+ .cfi_offset 59, B_FR + 27 * 8
+ .cfi_offset 60, B_FR + 28 * 8
+ .cfi_offset 61, B_FR + 29 * 8
+ .cfi_offset 62, B_FR + 30 * 8
+ .cfi_offset 63, B_FR + 31 * 8
+
+ nop
+
+__vdso_rt_sigreturn:
+ li.w $a7, __NR_rt_sigreturn
+ syscall 0
+ .cfi_endproc
+endf __vdso_rt_sigreturn
diff --git a/linux-user/loongarch64/vdso.ld b/linux-user/loongarch64/vdso.ld
new file mode 100644
index 0000000000..682446ed0c
--- /dev/null
+++ b/linux-user/loongarch64/vdso.ld
@@ -0,0 +1,73 @@
+/*
+ * Linker script for linux loongarch64 replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+VERSION {
+ LINUX_5.10 {
+ global:
+ __vdso_getcpu;
+ __vdso_clock_getres;
+ __vdso_clock_gettime;
+ __vdso_gettimeofday;
+ __vdso_rt_sigreturn;
+
+ local: *;
+ };
+}
+
+
+PHDRS {
+ phdr PT_PHDR FLAGS(4) PHDRS;
+ load PT_LOAD FLAGS(7) FILEHDR PHDRS;
+ dynamic PT_DYNAMIC FLAGS(4);
+ eh_frame_hdr PT_GNU_EH_FRAME;
+ note PT_NOTE FLAGS(4);
+}
+
+SECTIONS {
+ /*
+ * We can't prelink to any address without knowing something about
+ * the virtual memory space of the host, since that leaks over into
+ * the available memory space of the guest.
+ */
+ . = 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 =0xd503201f
+}
diff --git a/linux-user/loongarch64/vdso.so b/linux-user/loongarch64/vdso.so
new file mode 100755
index 0000000000000000000000000000000000000000..bfaa26f2bfe1aaa01d9a349b8b030ef6323e1f8e
GIT binary patch
literal 3560
zcmc&%|4$r66ra5<U&=wttF2NG6%=bN^n^+++FFk<$Cr9ga)46PxE$QUp>Rj;76P?0
z*pkLHYK<{!)EKHwLri1P7+ZfbCjMajKaBm!V50tDu=w8YyuH2cp)oP>9lM{I&%8Hp
zXLj~8gA7MHeVQiNbm6WE5mF5|x7&qwgpg<vMR>0iJ4G?pw^^Ls9<srSt5RJvma2B5
zOH{cKEK$d3jNG9QIm)-B`t@R?;u$$#|Bq&z;@0U_0IO|UFe*1I7nO%qzh10Uag6S`
z-Poq%)zvp7qV*T`vX?&yG++NVu{3(B=kn+08z^)K-Oxs?yFE54u2LY{Z?`tngf~^a
zh$?7xDv_Edu|^YvR%U~ENugh1l|t{F^Zcl0p<c6K|BX#M{|%MzPgPgx#JZ}l@W8pF
z{{eM;TPtdw-05}U7nMA5t_EF{iw>SZ#nWrv<>Jc~e?al4l|S<l#m_6A=W~zZ`#t{0
z6`%C*GsuJZWfLLKczx5b=-tvV=pA|ABT|-8xBLw5S3>brr}2@GURkPzG*L^O6Z1o0
zZQxR4^6J;qwR=BlPwiV9O)S*Bz9|f2E}l&r6A9CtoKB?2<FN(i#-`F^FLKLmWG0bi
z4ui*LX1SIzjqKz^CSlHIQetW{H9LQhQUvj@Nkn@3hK7y9!KOxhIAuPO`w^w7-{o(9
zuAuLXzS|MJ$Y_i{yw6<vsf^mlXnx7GfPR#GY5fkOV>9A1Vu*s!Ds2$jnW)gtYFeN|
zw>bJ9NW=J%e$Dv}pkqi2l>63vMIiy&S@4|!eIB;WL6Hf?87P^7(iCi;g0dIDpM>&p
zsEEUkQP?>GmCpm5hF#CW9mBBu8Q3!jcShl^eyHk$y%D(k1O&RFx)bi{fP35Ez7W*h
zkWl-Tg!{jg@W2-m>eeJY_?d)#*Cagjsf7Kj5+1%P;lLFM^&d-USdnn>BMHF|B|P%J
zgvR$IG`%C?(AyFoeM>^~n-UJcA>pytBpkUYq2*Nxk6)1R#Il5==Oi3klJMlMML52(
z2v7a7XwT0Ej{O*3{0;c8oWtc+FKUE{_`iE4SN`5rUdj33Z0r68yRN3OAn5oGS#RAA
zxJNnqpU>-#4(9V)=|YjCv-$qTj^5_;C64aq^QEGY{^|IovTo-4mpS`TKL77@N<+O^
zQtOucA&szjr7z6aS%us49#Q^Y-RwoakPgNa@6|8bq{!c^gXb0R)y;Pm@72d^$QRN<
zVRW48Ywhi67e;^dWP7+{C>l0UD4uTZ3LAs1ZIQ5n+JZZ+5$-lRqpiJRqq`$2jIPMZ
zw$_Mova@p_JeYIbQqTTIrj!agisuqHha-K=)30E5VcLw1ieT2v*qG!}Ds3i2FustA
zO;3(l1@uLXnK2QZNX-V5v24=j&5X^=B{JE`bSkf6#6>WXG{!Tr>4cGtqbJuy&`ivm
zIHCW61+Wj=b9mq9?~>78U%5oIuehxiE7rcFNM5&$d|u;yjrTCtW7>b|EW`Qvyu-Mz
z`lWcv&GCGWIfNX2Dkx5t@p@-uf7R^7Gf#R)doSnb^BE(xlX3qX$MevFZNKALiR1Y^
z$GBCz)hXWERNoxW=RZb1@3Fr}7Q_i`*mUJ*y<+5jlAoXRFg}a%boS#q>l!1CkBrv{
zkKbm67{>xV6UTec;nnP@kmrqQTE^~pKF={Wdj{;yk6V`&&$7tpK1QB@&gbbaFE{%T
t^8Y9M)xhXH4|s8YUVn6E<GID6W2?&Xy2IE7Z+_~tP`sfI?92ZU{}&)DVfp|7
literal 0
HcmV?d00001
diff --git a/linux-user/meson.build b/linux-user/meson.build
index 3aa967b27c..1292e50c15 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -41,6 +41,7 @@ subdir('alpha')
subdir('arm')
subdir('hppa')
subdir('i386')
+subdir('loongarch64')
subdir('m68k')
subdir('microblaze')
subdir('mips64')
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 18/20] linux-user/ppc: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (16 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 17/20] linux-user/loongarch64: " Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 19/20] linux-user/s390x: Rename __SIGNAL_FRAMESIZE to STACK_FRAME_OVERHEAD Richard Henderson
` (2 subsequent siblings)
20 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/ppc/vdso-asmoffset.h | 20 +++
linux-user/elfload.c | 9 ++
linux-user/ppc/signal.c | 31 +++--
linux-user/gen-vdso-elfn.c.inc | 7 +
linux-user/ppc/Makefile.vdso | 18 +++
linux-user/ppc/meson.build | 12 ++
linux-user/ppc/vdso-32.ld | 70 ++++++++++
linux-user/ppc/vdso-32.so | Bin 0 -> 3020 bytes
linux-user/ppc/vdso-64.ld | 68 +++++++++
linux-user/ppc/vdso-64.so | Bin 0 -> 3896 bytes
linux-user/ppc/vdso-64le.so | Bin 0 -> 3896 bytes
linux-user/ppc/vdso.S | 239 ++++++++++++++++++++++++++++++++
12 files changed, 466 insertions(+), 8 deletions(-)
create mode 100644 linux-user/ppc/vdso-asmoffset.h
create mode 100644 linux-user/ppc/Makefile.vdso
create mode 100644 linux-user/ppc/vdso-32.ld
create mode 100755 linux-user/ppc/vdso-32.so
create mode 100644 linux-user/ppc/vdso-64.ld
create mode 100755 linux-user/ppc/vdso-64.so
create mode 100755 linux-user/ppc/vdso-64le.so
create mode 100644 linux-user/ppc/vdso.S
diff --git a/linux-user/ppc/vdso-asmoffset.h b/linux-user/ppc/vdso-asmoffset.h
new file mode 100644
index 0000000000..6844c8c81c
--- /dev/null
+++ b/linux-user/ppc/vdso-asmoffset.h
@@ -0,0 +1,20 @@
+/*
+ * Size of dummy stack frame allocated when calling signal handler.
+ * See arch/powerpc/include/asm/ptrace.h.
+ */
+#ifdef TARGET_ABI32
+# define SIGNAL_FRAMESIZE 64
+#else
+# define SIGNAL_FRAMESIZE 128
+#endif
+
+#ifdef TARGET_ABI32
+# define offsetof_sigframe_mcontext 0x20
+# define offsetof_rt_sigframe_mcontext 0x140
+# define offsetof_mcontext_fregs 0xc0
+# define offsetof_mcontext_vregs 0x1d0
+#else
+# define offsetof_rt_sigframe_mcontext 0xe8
+# define offsetof_mcontext_fregs 0x180
+# define offsetof_mcontext_vregs_ptr 0x288
+#endif
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 877727e9e7..cdc517952b 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1015,6 +1015,15 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUPPCState *en
#define USE_ELF_CORE_DUMP
#define ELF_EXEC_PAGESIZE 4096
+#ifndef TARGET_PPC64
+# include "vdso-32.c.inc"
+#elif TARGET_BIG_ENDIAN
+# include "vdso-64.c.inc"
+#else
+# include "vdso-64le.c.inc"
+#endif
+#define vdso_image_info() &vdso_image_info
+
#endif
#ifdef TARGET_LOONGARCH64
diff --git a/linux-user/ppc/signal.c b/linux-user/ppc/signal.c
index a616f20efb..7e7302823b 100644
--- a/linux-user/ppc/signal.c
+++ b/linux-user/ppc/signal.c
@@ -21,14 +21,7 @@
#include "user-internals.h"
#include "signal-common.h"
#include "linux-user/trace.h"
-
-/* Size of dummy stack frame allocated when calling signal handler.
- See arch/powerpc/include/asm/ptrace.h. */
-#if defined(TARGET_PPC64)
-#define SIGNAL_FRAMESIZE 128
-#else
-#define SIGNAL_FRAMESIZE 64
-#endif
+#include "vdso-asmoffset.h"
/* See arch/powerpc/include/asm/ucontext.h. Only used for 32-bit PPC;
on 64-bit PPC, sigcontext and mcontext are one and the same. */
@@ -73,6 +66,16 @@ struct target_mcontext {
#endif
};
+QEMU_BUILD_BUG_ON(offsetof(struct target_mcontext, mc_fregs)
+ != offsetof_mcontext_fregs);
+#if defined(TARGET_PPC64)
+QEMU_BUILD_BUG_ON(offsetof(struct target_mcontext, v_regs)
+ != offsetof_mcontext_vregs_ptr);
+#else
+QEMU_BUILD_BUG_ON(offsetof(struct target_mcontext, mc_vregs)
+ != offsetof_mcontext_vregs);
+#endif
+
/* See arch/powerpc/include/asm/sigcontext.h. */
struct target_sigcontext {
target_ulong _unused[4];
@@ -161,6 +164,7 @@ struct target_ucontext {
#endif
};
+#if !defined(TARGET_PPC64)
/* See arch/powerpc/kernel/signal_32.c. */
struct target_sigframe {
struct target_sigcontext sctx;
@@ -168,6 +172,10 @@ struct target_sigframe {
int32_t abigap[56];
};
+QEMU_BUILD_BUG_ON(offsetof(struct target_sigframe, mctx)
+ != offsetof_sigframe_mcontext);
+#endif
+
#if defined(TARGET_PPC64)
#define TARGET_TRAMP_SIZE 6
@@ -184,6 +192,10 @@ struct target_rt_sigframe {
char abigap[288];
} __attribute__((aligned(16)));
+QEMU_BUILD_BUG_ON(offsetof(struct target_rt_sigframe,
+ uc.tuc_sigcontext.mcontext)
+ != offsetof_rt_sigframe_mcontext);
+
#else
struct target_rt_sigframe {
@@ -192,6 +204,9 @@ struct target_rt_sigframe {
int32_t abigap[56];
};
+QEMU_BUILD_BUG_ON(offsetof(struct target_rt_sigframe, uc.tuc_mcontext)
+ != offsetof_rt_sigframe_mcontext);
+
#endif
#if defined(TARGET_PPC64)
diff --git a/linux-user/gen-vdso-elfn.c.inc b/linux-user/gen-vdso-elfn.c.inc
index 7034c36d5e..95856eb839 100644
--- a/linux-user/gen-vdso-elfn.c.inc
+++ b/linux-user/gen-vdso-elfn.c.inc
@@ -273,7 +273,14 @@ static void elfN(process)(FILE *outf, void *buf, bool need_bswap)
errors++;
break;
+ case PT_LOPROC + 3:
+ if (ehdr->e_machine == EM_PPC64) {
+ break; /* DT_PPC64_OPT: integer bitmask */
+ }
+ goto do_default;
+
default:
+ do_default:
/* This is probably something target specific. */
fprintf(stderr, "VDSO has unknown DYNAMIC entry (%lx)\n",
(unsigned long)tag);
diff --git a/linux-user/ppc/Makefile.vdso b/linux-user/ppc/Makefile.vdso
new file mode 100644
index 0000000000..e9d2b16839
--- /dev/null
+++ b/linux-user/ppc/Makefile.vdso
@@ -0,0 +1,18 @@
+CROSS_CC ?= powerpc64-linux-gnu-gcc
+
+all: vdso-32.so vdso-64.so vdso-64le.so
+
+LDFLAGS32 := -nostdlib -shared -Wl,-T,vdso-32.ld \
+ -Wl,-h,linux-vdso32.so.1 -Wl,--hash-style=both -Wl,--build-id=sha1
+LDFLAGS64 := -nostdlib -shared -Wl,-T,vdso-64.ld \
+ -Wl,-h,linux-vdso64.so.1 -Wl,--hash-style=both -Wl,--build-id=sha1
+
+vdso-32.so: vdso.S vdso-32.ld vdso-asmoffset.h Makefile.vdso
+ $(CROSS_CC) $(LDFLAGS32) -m32 vdso.S -o $@
+
+vdso-64.so: vdso.S vdso-64.ld vdso-asmoffset.h Makefile.vdso
+ $(CROSS_CC) $(LDFLAGS64) -mbig-endian vdso.S -o $@
+
+vdso-64le.so: vdso.S vdso-64.ld vdso-asmoffset.h Makefile.vdso
+ $(CROSS_CC) $(LDFLAGS64) -mlittle-endian vdso.S -o $@
+
diff --git a/linux-user/ppc/meson.build b/linux-user/ppc/meson.build
index 19fead7bc8..5a838f182f 100644
--- a/linux-user/ppc/meson.build
+++ b/linux-user/ppc/meson.build
@@ -3,3 +3,15 @@ syscall_nr_generators += {
arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
output: '@BASENAME@_nr.h')
}
+
+gen32 = [
+ gen_vdso.process('vdso-32.so', extra_args: ['-s', '__kernel_sigtramp32',
+ '-r', '__kernel_sigtramp_rt32']),
+]
+linux_user_ss.add(when: 'TARGET_PPC', if_true: gen32)
+
+gen64 = [
+ gen_vdso.process('vdso-64.so', extra_args: ['-r', '__kernel_sigtramp_rt64']),
+ gen_vdso.process('vdso-64le.so', extra_args: ['-r', '__kernel_sigtramp_rt64'])
+]
+linux_user_ss.add(when: 'TARGET_PPC64', if_true: gen64)
diff --git a/linux-user/ppc/vdso-32.ld b/linux-user/ppc/vdso-32.ld
new file mode 100644
index 0000000000..6962696540
--- /dev/null
+++ b/linux-user/ppc/vdso-32.ld
@@ -0,0 +1,70 @@
+/*
+ * Linker script for linux powerpc64 replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+VERSION {
+ LINUX_2.6.15 {
+ global:
+ __kernel_gettimeofday;
+ __kernel_clock_gettime;
+ __kernel_clock_gettime64;
+ __kernel_clock_getres;
+ __kernel_time;
+ __kernel_sync_dicache;
+ __kernel_sigtramp32;
+ __kernel_sigtramp_rt32;
+ __kernel_getcpu;
+ 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
+ .data : {
+ /*
+ * There ought not be any real read-write data.
+ * But since we manipulated the segment layout,
+ * we have to put these sections somewhere.
+ */
+ *(.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
+}
diff --git a/linux-user/ppc/vdso-32.so b/linux-user/ppc/vdso-32.so
new file mode 100755
index 0000000000000000000000000000000000000000..b19baafb0d38e15b4a24def5c44a6d684714be45
GIT binary patch
literal 3020
zcmbtWeQXp}5P#e27f_&s6{-a-h*%I#XbYl%a{b~XN2zU*57F)Q?%F%r-of3qv<2Um
z1QRhNq7Vb7G1Z^}LI}~u5YuQA2$G0I6M`g?$RC*a2Z<OJNd)U}-tD{FYGX7`J3I56
znK%3P?abU-)!rH-!w@NQi2~@_P%gwcukw|PVv!|EM822|oDGIA#RJfpGi}!E0hzMr
zCt2j!nKNL#<KRB%%xZlg@qL{TuA6BV)8S**`B`3e@NDSJPCq|~YgO$AvFGf0kL&f&
zyz@uCzSg_H@|!C=N(SMZ1RhGR$taJG{PC+0842Jl$YDr4qtOjH9{eqM0ysZ9GIAGb
z2O;kPXF%Qp?uY(=$&FiIN0PiLV8}PHg+j<&8#ltwXQus^perIV@)MLQ_;F?_|1qrR
zGtujtf%$y&`dz^Jz?pV_ytAwe4*xXZ%MQ%<*5rc1=fT7}pAi%19|z85U=!B@*9*=S
z?;mFd<~3|*J$r8Bfmwl!+_Sb#<+!>mczErej|%2|`C~)=mL~agwClu?S594u8bd8b
zfqm~5&l#xt?zrckFwM4LED~%tTZ4&2xFZ;C3HW-_R)2fc-==+Im}9|s+KLqZ?VV}N
z`O;`qswL%VN4zKEHv?h6&mVGx$HT3On6G2I8B3IvI)ZI8Z0+GlXZM1xKs;Jj>W)X<
zi-dPg?S@Tese6fg(PEqipU>a__~g{z#Mf5vdoKWUZ*VQ^Q#EqTFWv`YACsyTqsX-k
zI@c7=-M9w15NZkZbI`dKgwb0sGIx87qCC~YY(u<p6w=Fn=)2Xmx4r>^l^odTqROT|
zL54*cl3XuS=5ET`McKWS(?hx4G;Sx2@1hBvl$W51ahepP$vY^2J5iLTMCiT_Drl$s
z+i2=Gnii(Q5IxXJ54KQIkfsM{hMyj4riXpx*-ABAsJM=1*3v95J+hW&uck+9XigP9
zRzW2zY3`>M%^R}l@lPz8f5xH(A6w)ewCITsEn0ZmqD7}HDm`gY*$Iovk6E<%1B;d%
zwdl$BELu8X(NphO^mM;P%igwV`C*Gzyk*fdhb(&bO^ep;x2X12i`MV8sIJeV=k7|X
zzay#P7fFq`ByG4U>G>ZdZM-3A({)LkuSwc+RniNWC2jpm(u)@*y>vm6c}`N(uq5A*
zq~<e{{DYDLrzHhXN@_VKsr9I&(14_Hzoc!4CAA%r)P6ux$9_qXeNvr2zf)r`)UDt`
zQJH5nL0Kw9Z53W-ZJ#KHe%qn{mevh-S{D=3x^YnJyxz`tl5MuWlXcu?EaDl#4Xp|W
z>Kz-~@oI*$AOB2TZwh3x1TN<*oID>uY6dgrnZbCNufRMzSnF5U)QoWr+L-4Kh<`U!
zygidL)hxn#dtRv-$NBOQ#(P%#g~I#An&kSVE@r^2_6tAnw+yVvp1CWrZN8tLsdd2D
z9k>OLF&kLV;9g+PqvH=E{(=J^ho5^+&*aa53mxmPAfETD*WUo<^G{;4YICh;-I_{F
z8~pB>)vL{#de6FQb9Gg{FjslkS9rYU`kI=C>PEBCQ{k;PM-Lq5C>=EiQ<HDhwA2I6
zIo(o`JUX2-a_s5+pC;!&Ok*M3@t%%^uNg8COUjVeBGE)pxC1>AUq{%l6vRUM5<cN>
zjdZ$0zIZ5UPsEazu3#)4jz&fSGa%f-klBKn9yCJ%L~115iC}jEZ{gol5kmEEA-_Ln
zt`kjMBTO^F+y^Mv)b~;!bh{T+O>%wD19N?&hPmHV&z-j8xW+jj*HtN)G4gR;tJ>y1
z(8O`f%fZ}_$jAMudUPc)?}JIlEyefGZD5YW38>!n0{=Cx!nSeTaFW$G70ilwPfTl(
zZv+x?+~=y-rvmGIu(MBW)Zbrl4JMgKVCqbHe@y5<^}L)9eX4qUy7DA1Iu3i+aXc@W
zjo~rkcm(ra@lLpJRqqBIar!w}@;+_i?_Xm8fWJ9af7_C0mVP#<ITvyH9jr;`BN!ZU
Nxt{~?)j^Od?oZyq_3Z!v
literal 0
HcmV?d00001
diff --git a/linux-user/ppc/vdso-64.ld b/linux-user/ppc/vdso-64.ld
new file mode 100644
index 0000000000..a55c65ed54
--- /dev/null
+++ b/linux-user/ppc/vdso-64.ld
@@ -0,0 +1,68 @@
+/*
+ * Linker script for linux powerpc64 replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+VERSION {
+ LINUX_2.6.15 {
+ global:
+ __kernel_gettimeofday;
+ __kernel_clock_gettime;
+ __kernel_clock_getres;
+ __kernel_sync_dicache;
+ __kernel_sigtramp_rt64;
+ __kernel_getcpu;
+ __kernel_time;
+ 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
+ .data : {
+ /*
+ * There ought not be any real read-write data.
+ * But since we manipulated the segment layout,
+ * we have to put these sections somewhere.
+ */
+ *(.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
+}
diff --git a/linux-user/ppc/vdso-64.so b/linux-user/ppc/vdso-64.so
new file mode 100755
index 0000000000000000000000000000000000000000..913c831b3819fc09912b9b31f7fbe9ee311ae12f
GIT binary patch
literal 3896
zcmc&%U2GIp6uvXF?G`9-4}zctEm9FtR=`p#KiZ|+@?%?S0V#-Xx4YZ!(ssA*ZflFk
zEC~;qnApU`81<o$n4mGH3Ml?k-$;l_A9*mbFC-+ASfip3Vm)Why|dG`O-y|7wlm*%
zzH`sLGxzVz+6_&OrfCSbSYjD+kKlOf*uS7wS+$}>)CnmTqg{%ZkNv1|DMDif%Nj))
z+SG@i^||i;3HB)Dr!rAf{TX@o{{yAc6^gQ0?s{t>&Ub_T#VA&??jrT0FQi60`-@Rj
zsW^=~W-02{u9k!1`mJ|PoV_YnU0i;>+kW%g%Rg34j;I)dMT)<!km9je{d7-H|MeRo
z+UFQ?^qpeeR5r~47E`x5pKbAx!UYPQdB8?3Wjm0bp8k_<-xwj<x7ijn)?`ny?R#74
z{|5x55aryl|6TO}WFPS87d-kI5Ys;^+Y2F2eLbGkPNzp7R{=B+hDSfGbgDn((XS}I
z3~{+fAMw;jdWuXM`*}pL(D+ge71GtbI=0g{GMZc3C*-FcKv!v}C<~T^D$gpLe5Kd6
z#ot={-B0`Fk&ctUqz6B!h`oBIa_wkn@2T@cKfE8jEyCfRcqSF^4R^<Lxny5F-4%-r
z7u0BPI@+Usv&flvwxD7Y(f)ygP3;w|>~Ja?jwPd!Xu_)|yK|XHUw=50tEm>f$<)Bm
zhQU}iT~i&%rURQq)1H=t?cvRVn!u(l_(C{3Gyh04_|H7HgXWg@7wuWzH#9P)F#O@G
z?<pUGI72t1!rF#F>mSG5r1i5A@q6@CBgZL2cDzmahJr>#IW^>HSl^5xuOk7=O}b&d
z{aCS{D&8=mz9TQdu)#bD*2~~K0VOX%>2dH6L)j3_dlBXj!h!)P&%wehEXu&*7eMv{
zq+v-4?&yQ1y|AnY?mPy|ldvKIcXh+vT~HB+l`&Wqg?l>T-UtMbLgNvrY=zbP;Jy}E
z(+pKjaQ{=Vb}u}z2iEO|2Y12xMtG<J9uC2VdI;=<M}n}i4mMr3Ve>aOJo>c_)nD1L
z<x3lCzOdo3&uyr^WW(d1*|7Cf8@64vVfzIecAU52iBD{J@?)D`R2cN`zaowzmJ8YJ
zU-L>y>6*NdEzCxQ+{bKG$W~@!LO#uGT*x+N6GHB1HYwx*W>Z2QWR^GNGt5Q|d5GDl
zA={aa8S*f*aYG(qHetwTnN1q<D6=U;KF2I?%IBGlm@>?4)RY~}#!MMuHg3vJW)r52
zGMhAIjM<ba<IM7w>|!=z$!=z&mP{}kvt*LlxFwG<o3LaLvq?+#GMlnwAG5qqrkK6v
z!-1_8q9ue2ttBrik>B$0-wWIb6u4NZImL8v8y}K}bk2f@gtM>_+P#%fS8+OzvKMvy
zr{d-n$3oHP5Md=4mF1paoVT<O>#O|a<}b&Ey2}4<9@Dxy6KCcdtgp^Z&QqTDRld{t
zoIO}y<-HR1ysl2?Hx~bCM(1we;LJ7-)b?!cubLyjtoNM%=T!UD-&T+A&0nn^T|W=i
z@ABy5svUZd6CVAF(rLWj@aQx0phq83^~*&#bhsthyr&+|Z2Ue6H|!2KwgsCT!n;Fl
zGtXgf(wK4LyXm4hFU*o!{!Kn`JDQnF+-@9M1hT_@xkx8sF2k76ES1j1MIbhuiu5I;
z4#B#Jkz7Osx>EyzL?oMFJ(po+FrLXK)2SIoI3@z|M7RqxRXm)CVNGp`KrTL%Q$zTl
zp#odb-@kg@seS40&#IzcX#RCsjYRD$y-)T2brGlD?StafzH)NgdbIU-q3U1nbB*Gf
zidW}`8@~ee&3I`Yw;C0F9%yvyv%AngJ;!#uN|ZzOug?vQbTsOBb8716r*Wvo@6uaE
z@#olf&zTU~>e(ERjwfTM$EW*u@;inobibdSV7%$~C3`RSKdl@pUY}PQ#S-*;`&adx
zbLLR-cQziYW89ub=lyAo=s555ccHGINB4h2#Vd4w$FS_4+m1;KxhP(rlN!yu4pit}
ze<wZhY8~qHRHJArir4*-OkBTLQ8oVr3+6gR`fWtNGpXqJr}am<z&p0&S7qKGid@o)
TLT~?o+8puo)jWvPbH)D+{oljD
literal 0
HcmV?d00001
diff --git a/linux-user/ppc/vdso-64le.so b/linux-user/ppc/vdso-64le.so
new file mode 100755
index 0000000000000000000000000000000000000000..258a03b807c4eca23547d978c16d1ad5ebd08bc5
GIT binary patch
literal 3896
zcmcgvU2GIp6uvXl(gKCvgCJ-@i&R9Eg<`3dAMMg@`LQjvfc%I~x4YZ!(ssA*ZflFk
zEC~;qkl2J5V|XYgCTNVQf{Oq3!NkOv^pOV>`(nZa2_*`eAl7sC-m^P9tkJ~8vza;H
z{q8yU%)K-BoV!kQYl~?Zg2fU`M7||NqwZ*!&lbcrh*G>uQ7PsiU4mDm?)K_sdN9`I
z+K%Wljf<%%-N{<$r!vu);$`%>UM)4xn&Wl+oDP%U6}lDC%M~qHYqM-D!Uy%ZUR|U8
zSiAieW1ofBj`scH*7la@tux=QtI3pvuGN0C{_N=+7s+)Y-B4avDjSdBAUUGk_;WTv
z`n+zJQUm3xZqxdcjM2iN%u`CduQk86Wx9=SgBoVlAG2!w3H{)=bz2W7W_0^ao|xPD
zf5bkFB}IietG|m19ebbVFM9ZM$b+~(tIcvMpzY6l?7KBTsd=6*y>^Ow%40vG`R_E(
z-`P^lk9q9HN$fzO*ETncgrGHMKjQh_Qa8n?*z|sBDC(y+b8l4#O8w=co7&Vzc5g(s
zT;6-_ht($F6k6Th5$EnF2CUtK+N;pFby{&#*7w%r#=#v}c9ZzP?L4MY+>;oxYV
z4fQ8NecV@sPDWCB7KaE84&~c4UcQwYjfd=TEEEhy-E6EkoeT~P+R1c%o#>Cnhep;7
zhf|6AI$tW`s}-%g+V>x{H~Q**wVQB0rsszg&R_kmZ#!zz{-XWLdxzG-#QwLxx67!H
z<eXB%sIs=u9-uWpi?<D^e?(n}PLgeob&8S^zfo0TWI3`AqfMjkznZt(i-t{Pc*TUK
zu8aV~0rLb{uRzIhD18~`9D}k^C?A2jFTuQFm_Gy+X;_egg-NJ<5#%610v5&Lt^ruw
z4@>&s?xV0Y2Fs#wPcPit162`N9)=YmxUU=T4}$*)v>b-&4p_Md9%zSEZBWw+4?Yd6
zcf&)wV9ic=cn7R)fk&F*(EzM#0^fF6?}rVIQ2Vt58^3bku`eB{`@(@upF2?hnFEi1
z>OjLK2cG!Efz2N~u;n8MwqA5#+XV-n{Lq1?K5%I6xHi9{9!H(sZ?dgy)vKj*R%L{2
zS7=PgJqnEr*`d&ckk2SIDP*TYQ$p@lXj;g93e5<)U!ja4pH*ngkOveRH{?NuCJcE<
zp-Dp?R%ptQ&nYx*$Ri5P81i|AGNyb%p)ph13XPkxOQ8u<1{In#Ww%08rVJ@GZOX7h
zGp39vl(A%wLSvTfRcPFjQH3Tf8B=J|l1CMqvSgn^)0XU4XvUHQ3S~-UT%psn&)bD)
zz|SmDEi&ylUHCT__8EDb1umX^aEPw=G>7<a#lpS8^~-H!;jYNwJNAl&nT6|$yU)Vx
z6s4r&5eqXI*DZIKh1rSgS0P`Pt7C<HxhPg|EX<r-rwZ-o<?4DNKVOu%ldA5tT=|^s
zY5GQybx`&6&hb~EeX;to7I~@{-ukjx^WOT^p?Pn8>CwEm9v#=bx9*(Le6c!6&vQpT
zvIB?O{cXFNFlXcW#BSbcw{-g3n(du|&cZzGE*b?HKUXfib)iUU`8V|-7pSn5<iccW
z;Y*DUq=Vh4(@CYHjN*xOMEJs^@!&u#lm%#uI+zX$UvGTK7Y(MOiccpMGaN~#Vu^S`
z!ww5yBx?6yrHa_mFj{g;_|lP)G_Lf2mns~B>N@WGtnj{MU88wclqcM>5*t+Wc^mTn
zWzFYbeGJK+Gq~2#cS>hNj?ep?^=0fMA%EH%d`_X7NU{+x;yFI&1J-O$wj|tUy%jmy
znjD|=2I~fLLgDe*kJo|vZ{pdM{W-s|4rIOW^w+f5uE%D7K2Nje^E2DiT-~x88?&zX
zoUd3f(#HJ!9EbG*?5DFfw>ht|=K1qC!t>{6p!`73#Qxs@HT*w@?Rnj}O<%FwpYtT^
z3=gawy#6P&KYfEFoWEGNDmr)fuAe)0&Ikej-&>>OFGQ{qFP=Yte{_cCwMCed-}T}8
WQjSr;8y}D^=0BklzBu&{{(k}Ee8OG;
literal 0
HcmV?d00001
diff --git a/linux-user/ppc/vdso.S b/linux-user/ppc/vdso.S
new file mode 100644
index 0000000000..d035a020f9
--- /dev/null
+++ b/linux-user/ppc/vdso.S
@@ -0,0 +1,239 @@
+/*
+ * PowerPC linux replacement vdso.
+ *
+ * Copyright 2023 Linaro, Ltd.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include <asm/unistd.h>
+#include <asm/errno.h>
+
+#ifndef _ARCH_PPC64
+# define TARGET_ABI32
+#endif
+#include "vdso-asmoffset.h"
+
+
+ .text
+
+.macro endf name
+ .globl \name
+ .size \name, .-\name
+ /* For PPC64, functions have special linkage; we export pointers. */
+#ifndef _ARCH_PPC64
+ .type \name, @function
+#endif
+.endm
+
+.macro raw_syscall nr
+ addi 0, 0, \nr
+ sc
+.endm
+
+.macro vdso_syscall name, nr
+\name:
+ raw_syscall \nr
+ blr
+endf \name
+.endm
+
+ .cfi_startproc
+
+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
+vdso_syscall __kernel_time, __NR_time
+
+#ifdef __NR_clock_gettime64
+vdso_syscall __kernel_clock_gettime64, __NR_clock_gettime64
+#endif
+
+__kernel_sync_dicache:
+ /* qemu does not need to flush caches */
+ blr
+endf __kernel_sync_dicache
+
+ .cfi_endproc
+
+/*
+ * TODO: __kernel_get_tbfreq
+ * This is probably a constant for QEMU.
+ */
+
+/*
+ * Start the unwind info at least one instruction before the signal
+ * trampoline, because the unwinder will assume we are returning
+ * after a call site.
+ */
+
+ .cfi_startproc simple
+ .cfi_signal_frame
+
+#ifdef _ARCH_PPC64
+# define __kernel_sigtramp_rt __kernel_sigtramp_rt64
+# define sizeof_reg 8
+#else
+# define __kernel_sigtramp_rt __kernel_sigtramp_rt32
+# define sizeof_reg 4
+#endif
+#define sizeof_freg 8
+#define sizeof_vreg 16
+
+ .cfi_def_cfa 1, SIGNAL_FRAMESIZE + offsetof_rt_sigframe_mcontext
+
+ /* Return address */
+ .cfi_return_column 67
+ .cfi_offset 67, 32 * sizeof_reg /* nip */
+
+ /* Integer registers */
+ .cfi_offset 0, 0 * sizeof_reg
+ .cfi_offset 1, 1 * sizeof_reg
+ .cfi_offset 2, 2 * sizeof_reg
+ .cfi_offset 3, 3 * sizeof_reg
+ .cfi_offset 4, 4 * sizeof_reg
+ .cfi_offset 5, 5 * sizeof_reg
+ .cfi_offset 6, 6 * sizeof_reg
+ .cfi_offset 7, 7 * sizeof_reg
+ .cfi_offset 8, 8 * sizeof_reg
+ .cfi_offset 9, 9 * sizeof_reg
+ .cfi_offset 10, 10 * sizeof_reg
+ .cfi_offset 11, 11 * sizeof_reg
+ .cfi_offset 12, 12 * sizeof_reg
+ .cfi_offset 13, 13 * sizeof_reg
+ .cfi_offset 14, 14 * sizeof_reg
+ .cfi_offset 15, 15 * sizeof_reg
+ .cfi_offset 16, 16 * sizeof_reg
+ .cfi_offset 17, 17 * sizeof_reg
+ .cfi_offset 18, 18 * sizeof_reg
+ .cfi_offset 19, 19 * sizeof_reg
+ .cfi_offset 20, 20 * sizeof_reg
+ .cfi_offset 21, 21 * sizeof_reg
+ .cfi_offset 22, 22 * sizeof_reg
+ .cfi_offset 23, 23 * sizeof_reg
+ .cfi_offset 24, 24 * sizeof_reg
+ .cfi_offset 25, 25 * sizeof_reg
+ .cfi_offset 26, 26 * sizeof_reg
+ .cfi_offset 27, 27 * sizeof_reg
+ .cfi_offset 28, 28 * sizeof_reg
+ .cfi_offset 29, 29 * sizeof_reg
+ .cfi_offset 30, 30 * sizeof_reg
+ .cfi_offset 31, 31 * sizeof_reg
+ .cfi_offset 65, 36 * sizeof_reg /* lr */
+ .cfi_offset 70, 38 * sizeof_reg /* ccr */
+
+ /* Floating point registers */
+ .cfi_offset 32, offsetof_mcontext_fregs
+ .cfi_offset 33, offsetof_mcontext_fregs + 1 * sizeof_freg
+ .cfi_offset 34, offsetof_mcontext_fregs + 2 * sizeof_freg
+ .cfi_offset 35, offsetof_mcontext_fregs + 3 * sizeof_freg
+ .cfi_offset 36, offsetof_mcontext_fregs + 4 * sizeof_freg
+ .cfi_offset 37, offsetof_mcontext_fregs + 5 * sizeof_freg
+ .cfi_offset 38, offsetof_mcontext_fregs + 6 * sizeof_freg
+ .cfi_offset 39, offsetof_mcontext_fregs + 7 * sizeof_freg
+ .cfi_offset 40, offsetof_mcontext_fregs + 8 * sizeof_freg
+ .cfi_offset 41, offsetof_mcontext_fregs + 9 * sizeof_freg
+ .cfi_offset 42, offsetof_mcontext_fregs + 10 * sizeof_freg
+ .cfi_offset 43, offsetof_mcontext_fregs + 11 * sizeof_freg
+ .cfi_offset 44, offsetof_mcontext_fregs + 12 * sizeof_freg
+ .cfi_offset 45, offsetof_mcontext_fregs + 13 * sizeof_freg
+ .cfi_offset 46, offsetof_mcontext_fregs + 14 * sizeof_freg
+ .cfi_offset 47, offsetof_mcontext_fregs + 15 * sizeof_freg
+ .cfi_offset 48, offsetof_mcontext_fregs + 16 * sizeof_freg
+ .cfi_offset 49, offsetof_mcontext_fregs + 17 * sizeof_freg
+ .cfi_offset 50, offsetof_mcontext_fregs + 18 * sizeof_freg
+ .cfi_offset 51, offsetof_mcontext_fregs + 19 * sizeof_freg
+ .cfi_offset 52, offsetof_mcontext_fregs + 20 * sizeof_freg
+ .cfi_offset 53, offsetof_mcontext_fregs + 21 * sizeof_freg
+ .cfi_offset 54, offsetof_mcontext_fregs + 22 * sizeof_freg
+ .cfi_offset 55, offsetof_mcontext_fregs + 23 * sizeof_freg
+ .cfi_offset 56, offsetof_mcontext_fregs + 24 * sizeof_freg
+ .cfi_offset 57, offsetof_mcontext_fregs + 25 * sizeof_freg
+ .cfi_offset 58, offsetof_mcontext_fregs + 26 * sizeof_freg
+ .cfi_offset 59, offsetof_mcontext_fregs + 27 * sizeof_freg
+ .cfi_offset 60, offsetof_mcontext_fregs + 28 * sizeof_freg
+ .cfi_offset 61, offsetof_mcontext_fregs + 29 * sizeof_freg
+ .cfi_offset 62, offsetof_mcontext_fregs + 30 * sizeof_freg
+ .cfi_offset 63, offsetof_mcontext_fregs + 31 * sizeof_freg
+
+ /*
+ * Unlike the kernel, unconditionally represent the Altivec/VSX regs.
+ * The space within the stack frame is always available, and most of
+ * our supported processors have them enabled. The only complication
+ * for PPC64 is the misalignment, so that we have to use indirection.
+ */
+.macro save_vreg_ofs reg, ofs
+#ifdef _ARCH_PPC64
+ /*
+ * vreg = *(cfa + offsetof(v_regs)) + ofs
+ *
+ * The CFA is input to the expression on the stack, so:
+ * DW_CFA_expression reg, length (7),
+ * DW_OP_plus_uconst (0x23), vreg_ptr, DW_OP_deref (0x06),
+ * DW_OP_plus_uconst (0x23), ofs
+ */
+ .cfi_escape 0x10, 77 + \reg, 7, 0x23, (offsetof_mcontext_vregs_ptr & 0x7f) + 0x80, offsetof_mcontext_vregs_ptr >> 7, 0x06, 0x23, (\ofs & 0x7f) | 0x80, \ofs >> 7
+#else
+ .cfi_offset 77 + \reg, offsetof_mcontext_vregs + \ofs
+#endif
+.endm
+
+.macro save_vreg reg
+ save_vreg_ofs \reg, (\reg * sizeof_vreg)
+.endm
+
+ save_vreg 0
+ save_vreg 1
+ save_vreg 2
+ save_vreg 3
+ save_vreg 4
+ save_vreg 5
+ save_vreg 6
+ save_vreg 7
+ save_vreg 8
+ save_vreg 9
+ save_vreg 10
+ save_vreg 11
+ save_vreg 12
+ save_vreg 13
+ save_vreg 14
+ save_vreg 15
+ save_vreg 16
+ save_vreg 17
+ save_vreg 18
+ save_vreg 19
+ save_vreg 20
+ save_vreg 21
+ save_vreg 22
+ save_vreg 23
+ save_vreg 24
+ save_vreg 25
+ save_vreg 26
+ save_vreg 27
+ save_vreg 28
+ save_vreg 29
+ save_vreg 30
+ save_vreg 31
+ save_vreg 32
+ save_vreg_ofs 33, (32 * sizeof_vreg + 12)
+
+ nop
+
+__kernel_sigtramp_rt:
+ raw_syscall __NR_rt_sigreturn
+endf __kernel_sigtramp_rt
+
+#ifndef _ARCH_PPC64
+ /*
+ * The non-rt sigreturn has the same layout at a different offset.
+ * Move the CFA and leave all othe other descriptions the same.
+ */
+ .cfi_def_cfa 1, SIGNAL_FRAMESIZE + offsetof_sigframe_mcontext
+ nop
+__kernel_sigtramp32:
+ raw_syscall __NR_sigreturn
+endf __kernel_sigtramp32
+#endif
+
+ .cfi_endproc
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 19/20] linux-user/s390x: Rename __SIGNAL_FRAMESIZE to STACK_FRAME_OVERHEAD
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (17 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 18/20] linux-user/ppc: " Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-08-30 14:14 ` Philippe Mathieu-Daudé
2023-08-29 22:02 ` [PATCH v5 20/20] linux-user/s390x: Add vdso Richard Henderson
2023-08-30 14:52 ` [PATCH v5 00/20] linux-user: Implement VDSOs Helge Deller
20 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/s390x/signal.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/linux-user/s390x/signal.c b/linux-user/s390x/signal.c
index f72165576f..0f8b8e04bf 100644
--- a/linux-user/s390x/signal.c
+++ b/linux-user/s390x/signal.c
@@ -26,7 +26,8 @@
#define __NUM_FPRS 16
#define __NUM_ACRS 16
-#define __SIGNAL_FRAMESIZE 160 /* FIXME: 31-bit mode -> 96 */
+/* Minimum stack frame size */
+#define STACK_FRAME_OVERHEAD 160
#define _SIGCONTEXT_NSIG 64
#define _SIGCONTEXT_NSIG_BPW 64 /* FIXME: 31-bit mode -> 32 */
@@ -63,7 +64,7 @@ typedef struct {
} target_sigcontext;
typedef struct {
- uint8_t callee_used_stack[__SIGNAL_FRAMESIZE];
+ uint8_t callee_used_stack[STACK_FRAME_OVERHEAD];
target_sigcontext sc;
target_sigregs sregs;
int signo;
@@ -83,7 +84,7 @@ struct target_ucontext {
};
typedef struct {
- uint8_t callee_used_stack[__SIGNAL_FRAMESIZE];
+ uint8_t callee_used_stack[STACK_FRAME_OVERHEAD];
/*
* This field is no longer initialized by the kernel, but it's still a part
* of the ABI.
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* [PATCH v5 20/20] linux-user/s390x: Add vdso
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (18 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 19/20] linux-user/s390x: Rename __SIGNAL_FRAMESIZE to STACK_FRAME_OVERHEAD Richard Henderson
@ 2023-08-29 22:02 ` Richard Henderson
2023-09-04 15:00 ` Alex Bennée
2023-08-30 14:52 ` [PATCH v5 00/20] linux-user: Implement VDSOs Helge Deller
20 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-29 22:02 UTC (permalink / raw)
To: qemu-devel; +Cc: alex.bennee, laurent
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/s390x/vdso-asmoffset.h | 2 +
linux-user/elfload.c | 3 ++
linux-user/s390x/signal.c | 4 +-
linux-user/s390x/meson.build | 24 +++++++++++
linux-user/s390x/vdso.S | 61 ++++++++++++++++++++++++++
linux-user/s390x/vdso.ld | 69 ++++++++++++++++++++++++++++++
linux-user/s390x/vdso.so | Bin 0 -> 3464 bytes
7 files changed, 160 insertions(+), 3 deletions(-)
create mode 100644 linux-user/s390x/vdso-asmoffset.h
create mode 100644 linux-user/s390x/vdso.S
create mode 100644 linux-user/s390x/vdso.ld
create mode 100755 linux-user/s390x/vdso.so
diff --git a/linux-user/s390x/vdso-asmoffset.h b/linux-user/s390x/vdso-asmoffset.h
new file mode 100644
index 0000000000..27a062d6c1
--- /dev/null
+++ b/linux-user/s390x/vdso-asmoffset.h
@@ -0,0 +1,2 @@
+/* Minimum stack frame size */
+#define STACK_FRAME_OVERHEAD 160
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index cdc517952b..19503d8469 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1737,6 +1737,9 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs,
#define USE_ELF_CORE_DUMP
#define ELF_EXEC_PAGESIZE 4096
+#include "vdso.c.inc"
+#define vdso_image_info() &vdso_image_info
+
#endif /* TARGET_S390X */
#ifdef TARGET_RISCV
diff --git a/linux-user/s390x/signal.c b/linux-user/s390x/signal.c
index 0f8b8e04bf..b40f738a70 100644
--- a/linux-user/s390x/signal.c
+++ b/linux-user/s390x/signal.c
@@ -21,14 +21,12 @@
#include "user-internals.h"
#include "signal-common.h"
#include "linux-user/trace.h"
+#include "vdso-asmoffset.h"
#define __NUM_GPRS 16
#define __NUM_FPRS 16
#define __NUM_ACRS 16
-/* Minimum stack frame size */
-#define STACK_FRAME_OVERHEAD 160
-
#define _SIGCONTEXT_NSIG 64
#define _SIGCONTEXT_NSIG_BPW 64 /* FIXME: 31-bit mode -> 32 */
#define _SIGCONTEXT_NSIG_WORDS (_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW)
diff --git a/linux-user/s390x/meson.build b/linux-user/s390x/meson.build
index 0781ccea1d..09afd98deb 100644
--- a/linux-user/s390x/meson.build
+++ b/linux-user/s390x/meson.build
@@ -3,3 +3,27 @@ syscall_nr_generators += {
arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
output: '@BASENAME@_nr.h')
}
+
+vdso_so = custom_target(output: 'vdso.so',
+ input: files('vdso.S', 'vdso.ld'),
+ depend_files: files('vdso-asmoffset.h'),
+ command: [
+ build_vdso_cmd,
+ '-B', meson.project_build_root(),
+ '-C', meson.current_source_dir(),
+ '-T', 's390x-linux-user',
+ '-o', '@OUTPUT@',
+ '--', '-nostdlib', '-shared',
+ '-Wl,-h,linux-vdso64.so.1',
+ '-Wl,--build-id=sha1',
+ '-Wl,--hash-style=both',
+ '-Wl,-T,@INPUT1@',
+ '@INPUT0@'
+ ])
+
+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)
diff --git a/linux-user/s390x/vdso.S b/linux-user/s390x/vdso.S
new file mode 100644
index 0000000000..3332492477
--- /dev/null
+++ b/linux-user/s390x/vdso.S
@@ -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
diff --git a/linux-user/s390x/vdso.ld b/linux-user/s390x/vdso.ld
new file mode 100644
index 0000000000..2a30ff382a
--- /dev/null
+++ b/linux-user/s390x/vdso.ld
@@ -0,0 +1,69 @@
+/*
+ * Linker script for linux x86-64 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_restart_syscall;
+ __kernel_rt_sigreturn;
+ __kernel_sigreturn;
+ 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
+ .data : {
+ /*
+ * There ought not be any real read-write data.
+ * But since we manipulated the segment layout,
+ * we have to put these sections somewhere.
+ */
+ *(.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
+}
diff --git a/linux-user/s390x/vdso.so b/linux-user/s390x/vdso.so
new file mode 100755
index 0000000000000000000000000000000000000000..64130f6f335269b03291653d006225b365be9cd9
GIT binary patch
literal 3464
zcmcguUuaup6hAlrn#R#}B6HHJ6^h8v3s#wtDI{HzWs-HJcB~u1U2JZX*fw`0w>2I9
z>4SqkSsXs>VMq|PDvEm&1Rwf1RK!O?(CHKhzDz`4)-9g%edpXip_vbYU-<6tJHK<z
zcW%!8&bjyXe5nwL7~qX4?8S9}P@0U^51wZ!4ROf8FziM-fitG{$m!98#y(98LK0<)
zF`)T=*Tk6C2o94N!O8KAbs})9bp<|Z(f=FCiu>y{lI$0|t_^w-9%V;CvX_ZVV@~UP
z5ysh1P<-w|K6-fSIDGtl`ke<)|Mc0}bJcWb@yj2!fBy7s_8}PJ^{b5Jk0Yw$Io;cT
zvAm@bv#$o5>1TjUWL@)+V!Xt77o&O(PPe<Q<=ACHly9+~a!c|JEyu*4)&DD)cLVIw
z5#zsb<Wa;~pHGlXgYG*Q;1!7%(pLlg1FRr>!{_5F56Dq|HugaG54H=!y#f0xtl;=^
z{(|Oe9c6~jI}MdzM5-AY|8oAd5niPp<$=q-bPi}udYXw&GFgmg;C+@!7ys^{eeuHj
z*T4PgtbX)Xd*k=9hda69Q>Wkk@x$ybu&hP9*|3+as_nY<W!qV(l-GQAe#x0%6x|MV
z({A}JZZUsm#g|+4YSVUCnhl?7x|Yu_)f+4A$5tyX=fIO@%P}8^(vhj-bJm1;z?^s*
zZyoa${1Id5U*x4{=^0Ud(KFC>Lm7yGF<^c5IqMK$gD%EM^dJJ&HRX_=UlHe3oHd-=
zIM1UMJ^v4I(xAP;I6DJId&n5swY$R)f#T6@<J<?ip>HFFH}{sl84Bv3LERZ;$NK58
z{sq)6-9i5f>gc{kWq<MCyxE<;cJ)RF##2)YW1BbO^1yAM-@MO=rJ%1aeh1xCVO{Fw
z)F*fkeFq*cPKoqGZHhdf^Ke}tPv;Sb*Qb<(B%kYOMiG2Lp8K5cgQ7#8>nFM;93k>t
zPf{jYi+obAVwW^}{2=pE|4KxA?w|60@a(yd##JBHtcojrD!7kfczq<42ikk5{qOhf
zLwR_@?>o{q)cHH)^P&ED(&rPwe&_gnsNbFI)9)_$_Mtxep3ldxa1KVn%AK6b9zAjh
zOC8^LR=#KzX0k`~RxvjN*5T5z$!y6wRwz85pS5PQlcl`n_k`ZI;q{zQa|v~hox4`3
zdw3>(zwsz90(Cq9v$eMDmS044n;L7fYB;V9W@W8WUarrp1==E(-7=Wf#)?@hw`!Vq
zo0?g*o2|Oj2nkjNOuJ?+G|S7jRjZ(-NMO2l+m)mAUvLDS<$WUcH>WrB>T|p&K(J6A
zLY*8iECCvFZapMYV$hoF3cmya_T!ZA42~~#E(lv_L;l=1Jb$XEi2%>>r49tu`x(u=
zA@PZzo*QQk$Cth#sCp{ztt`c#Fpb|mfA{!rX*tRW8I*VOC$q_bj^j&u1tHXb&|dOD
z{?B3jE-i3~KihkKi}D<d&vwfGMDKSTwpH#&f{;dk%D?!@|3?ZIaLWBi{OhE^eHgv(
zV@-Q~TZwdtd;FzO3c^KkWDLfCE#RNfdg)Vw>YW<g!b>ds%Kr-5;5sp;iO3^}^sP;K
oq#^O?{L#B0m|N2GNEUhVg)ofre@WbfvycCv+~*tYC*b-21AbI{0ssI2
literal 0
HcmV?d00001
--
2.34.1
^ permalink raw reply related [flat|nested] 43+ messages in thread
* Re: [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain
2023-08-29 22:02 ` [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain Richard Henderson
@ 2023-08-30 9:43 ` gaosong
2023-09-04 14:02 ` Alex Bennée
2023-09-05 9:23 ` Alex Bennée
2 siblings, 0 replies; 43+ messages in thread
From: gaosong @ 2023-08-30 9:43 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent
在 2023/8/30 上午6:02, Richard Henderson 写道:
> Update from clfs 5.0 to clfs 8.1, which includes updates
> to binutils 2.41, gcc 13.2, and glibc 2.38.
>
> See https://github.com/loongson/build-tools
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> tests/docker/dockerfiles/debian-loongarch-cross.docker | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tests/docker/dockerfiles/debian-loongarch-cross.docker b/tests/docker/dockerfiles/debian-loongarch-cross.docker
> index 9d957547b5..b4bf265717 100644
> --- a/tests/docker/dockerfiles/debian-loongarch-cross.docker
> +++ b/tests/docker/dockerfiles/debian-loongarch-cross.docker
> @@ -20,7 +20,7 @@ RUN apt-get update && \
> git \
> python3-minimal
>
> -RUN curl -#SL https://github.com/loongson/build-tools/releases/download/2022.05.29/loongarch64-clfs-5.0-cross-tools-gcc-glibc.tar.xz \
> +RUN curl -#SL https://github.com/loongson/build-tools/releases/download/2023.08.08/CLFS-loongarch64-8.1-x86_64-cross-tools-gcc-glibc.tar.xz \
> | tar -xJC /opt
>
> ENV PATH $PATH:/opt/cross-tools/bin
>
Reviewed-by: Song Gao <gaosong@loongson.cn>
Thanks.
Song Gao
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 19/20] linux-user/s390x: Rename __SIGNAL_FRAMESIZE to STACK_FRAME_OVERHEAD
2023-08-29 22:02 ` [PATCH v5 19/20] linux-user/s390x: Rename __SIGNAL_FRAMESIZE to STACK_FRAME_OVERHEAD Richard Henderson
@ 2023-08-30 14:14 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 43+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-08-30 14:14 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent
On 30/8/23 00:02, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> linux-user/s390x/signal.c | 7 ++++---
> 1 file changed, 4 insertions(+), 3 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 08/20] linux-user: Load vdso image if available
2023-08-29 22:02 ` [PATCH v5 08/20] linux-user: Load vdso image if available Richard Henderson
@ 2023-08-30 14:22 ` Philippe Mathieu-Daudé
2023-08-30 16:17 ` Richard Henderson
0 siblings, 1 reply; 43+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-08-30 14:22 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent
Hi Richard,
On 30/8/23 00:02, Richard Henderson wrote:
> The vdso image will be pre-processed into a C data array, with
> a simple list of relocations to perform, and identifying the
> location of signal trampolines.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> linux-user/elfload.c | 87 +++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 78 insertions(+), 9 deletions(-)
>
> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
> index f34fb64c0c..2a6adebb4a 100644
> --- a/linux-user/elfload.c
> +++ b/linux-user/elfload.c
> @@ -33,6 +33,19 @@
> #undef ELF_ARCH
> #endif
>
> +#ifndef TARGET_ARCH_HAS_SIGTRAMP_PAGE
> +#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
I'd rather #error here so new targets are added with
a clearly defined TARGET_ARCH_HAS_SIGTRAMP_PAGE.
> +#endif
> +
> +typedef struct {
> + const uint8_t *image;
> + const uint32_t *relocs;
> + unsigned image_size;
> + unsigned reloc_count;
> + unsigned sigreturn_ofs;
> + unsigned rt_sigreturn_ofs;
> +} VdsoImageInfo;
> +
> #define ELF_OSABI ELFOSABI_SYSV
> +#ifndef vdso_image_info
> +#define vdso_image_info() NULL
> +#endif
> +
> +static void load_elf_vdso(struct image_info *info, const VdsoImageInfo *vdso)
> +{
> + ImageSource src;
> + struct elfhdr ehdr;
> + abi_ulong load_bias, load_addr;
> +
> + src.fd = -1;
> + src.cache = vdso->image;
> + src.cache_size = vdso->image_size;
> +
> + load_elf_image("<internal-vdso>", &src, info, &ehdr, NULL);
> + load_addr = info->load_addr;
> + load_bias = info->load_bias;
> +
> + /*
> + * We need to relocate the VDSO image. The one built into the kernel
> + * is built for a fixed address. The one built for QEMU is not, since
> + * that requires close control of the guest address space.
> + * We pre-processed the image to locate all of the addresses that need
> + * to be updated.
> + */
> + for (unsigned i = 0, n = vdso->reloc_count; i < n; i++) {
Do we really need 'n'?
> + abi_ulong *addr = g2h_untagged(load_addr + vdso->relocs[i]);
> + *addr = tswapal(tswapal(*addr) + load_bias);
> + }
> +
> + /* Install signal trampolines, if present. */
> + if (vdso->sigreturn_ofs) {
> + default_sigreturn = load_addr + vdso->sigreturn_ofs;
> + }
> + if (vdso->rt_sigreturn_ofs) {
> + default_rt_sigreturn = load_addr + vdso->rt_sigreturn_ofs;
> + }
> +
> + /* Remove write from VDSO segment. */
> + target_mprotect(info->start_data, info->end_data - info->start_data,
> + PROT_READ | PROT_EXEC);
> +}
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 00/20] linux-user: Implement VDSOs
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
` (19 preceding siblings ...)
2023-08-29 22:02 ` [PATCH v5 20/20] linux-user/s390x: Add vdso Richard Henderson
@ 2023-08-30 14:52 ` Helge Deller
2023-08-30 16:20 ` Richard Henderson
20 siblings, 1 reply; 43+ messages in thread
From: Helge Deller @ 2023-08-30 14:52 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent
On 8/30/23 00:02, Richard Henderson wrote:
> Changes for v5:
> * Integrated cross-compile, via new build-vdso.sh and meson rules.
> However, keep the binaries in the tree for hosts which do not
> have all of the cross-compile machinery.
> * Update our loongarch64 docker image to avoid a binutils bug.
>
> Just in case the list eats a binary:
> https://gitlab.com/rth7680/qemu/-/tree/lu-vdso
I pulled that on top of git head, and ran into the build problem below.
Do I miss something?
Helge
[62/1742] Generating linux-user/aarch64/vdso-be.so with a custom command
FAILED: linux-user/aarch64/vdso-be.so
/home/cvs/qemu/qemu/linux-user/build-vdso.sh -B /srv/_build -C /home/cvs/qemu/qemu/linux-user/aarch64 -T aarch64-linux-user -o linux-user/aarch64/vdso-be.so -- -nostdlib -shared -Wl,-h,linux-vdso.so.1 -Wl,--build-id=sha1 -Wl,--hash-style=both -Wl,-T,../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.ld ../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.S -mbig-endian
Error: short-name resolution enforced but cannot prompt without a TTY
Traceback (most recent call last):
File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 683, in <module>
sys.exit(main())
^^^^^^
File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 679, in main
return args.cmdobj.run(args, argv)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 657, in run
return Docker().run(cmd, False, quiet=args.quiet,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 370, in run
ret = self._do_check(["run", "--rm", "--label",
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 247, in _do_check
return subprocess.check_call(self._command + cmd, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.11/subprocess.py", line 413, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['podman', 'run', '--rm', '--label', 'com.qemu.instance.uuid=e746f7e345ed420088a9cc30e884a7e8', '--userns=keep-id', '-u', '1000', '-w', '/srv/_build', '-v', '/srv/_build:/srv/_build:rw', '-v', '/home/cvs/qemu/qemu:/home/cvs/qemu/qemu:ro,z', 'qemu/debian-arm64-cross', 'aarch64-linux-gnu-gcc-10', '-o', 'linux-user/aarch64/vdso-be.so', '-nostdlib', '-shared', '-Wl,-h,linux-vdso.so.1', '-Wl,--build-id=sha1', '-Wl,--hash-style=both', '-Wl,-T,../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.ld', '../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.S', '-mbig-endian']' returned non-zero exit status 125.
filter=--filter=label=com.qemu.instance.uuid=e746f7e345ed420088a9cc30e884a7e8
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 08/20] linux-user: Load vdso image if available
2023-08-30 14:22 ` Philippe Mathieu-Daudé
@ 2023-08-30 16:17 ` Richard Henderson
2023-08-30 20:56 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-30 16:17 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel; +Cc: alex.bennee, laurent
On 8/30/23 07:22, Philippe Mathieu-Daudé wrote:
> Hi Richard,
>
> On 30/8/23 00:02, Richard Henderson wrote:
>> The vdso image will be pre-processed into a C data array, with
>> a simple list of relocations to perform, and identifying the
>> location of signal trampolines.
>>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>> linux-user/elfload.c | 87 +++++++++++++++++++++++++++++++++++++++-----
>> 1 file changed, 78 insertions(+), 9 deletions(-)
>>
>> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
>> index f34fb64c0c..2a6adebb4a 100644
>> --- a/linux-user/elfload.c
>> +++ b/linux-user/elfload.c
>> @@ -33,6 +33,19 @@
>> #undef ELF_ARCH
>> #endif
>> +#ifndef TARGET_ARCH_HAS_SIGTRAMP_PAGE
>> +#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
>
> I'd rather #error here so new targets are added with
> a clearly defined TARGET_ARCH_HAS_SIGTRAMP_PAGE.
The next step after adding vdso's is to remove TARGET_ARCH_HAS_SIGTRAMP_PAGE.
>> + for (unsigned i = 0, n = vdso->reloc_count; i < n; i++) {
>
> Do we really need 'n'?
You should always have an loop invariant condition if possible.
r~
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 00/20] linux-user: Implement VDSOs
2023-08-30 14:52 ` [PATCH v5 00/20] linux-user: Implement VDSOs Helge Deller
@ 2023-08-30 16:20 ` Richard Henderson
2023-08-31 7:57 ` Alex Bennée
0 siblings, 1 reply; 43+ messages in thread
From: Richard Henderson @ 2023-08-30 16:20 UTC (permalink / raw)
To: Helge Deller, qemu-devel; +Cc: alex.bennee, laurent
On 8/30/23 07:52, Helge Deller wrote:
> On 8/30/23 00:02, Richard Henderson wrote:
>> Changes for v5:
>> * Integrated cross-compile, via new build-vdso.sh and meson rules.
>> However, keep the binaries in the tree for hosts which do not
>> have all of the cross-compile machinery.
>> * Update our loongarch64 docker image to avoid a binutils bug.
>>
>> Just in case the list eats a binary:
>> https://gitlab.com/rth7680/qemu/-/tree/lu-vdso
>
> I pulled that on top of git head, and ran into the build problem below.
> Do I miss something?
No idea, since it worked for me. Looks like some sort of docker.py problem. Alex?
In the short term, use --disable-containers so that you only use the cross-compilers that
you have locally installed.
r~
>
> Helge
>
> [62/1742] Generating linux-user/aarch64/vdso-be.so with a custom command
> FAILED: linux-user/aarch64/vdso-be.so
> /home/cvs/qemu/qemu/linux-user/build-vdso.sh -B /srv/_build -C
> /home/cvs/qemu/qemu/linux-user/aarch64 -T aarch64-linux-user -o
> linux-user/aarch64/vdso-be.so -- -nostdlib -shared -Wl,-h,linux-vdso.so.1
> -Wl,--build-id=sha1 -Wl,--hash-style=both
> -Wl,-T,../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.ld
> ../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.S -mbig-endian
> Error: short-name resolution enforced but cannot prompt without a TTY
> Traceback (most recent call last):
> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 683, in <module>
> sys.exit(main())
> ^^^^^^
> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 679, in main
> return args.cmdobj.run(args, argv)
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 657, in run
> return Docker().run(cmd, False, quiet=args.quiet,
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 370, in run
> ret = self._do_check(["run", "--rm", "--label",
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 247, in _do_check
> return subprocess.check_call(self._command + cmd, **kwargs)
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> File "/usr/lib64/python3.11/subprocess.py", line 413, in check_call
> raise CalledProcessError(retcode, cmd)
> subprocess.CalledProcessError: Command '['podman', 'run', '--rm', '--label',
> 'com.qemu.instance.uuid=e746f7e345ed420088a9cc30e884a7e8', '--userns=keep-id', '-u',
> '1000', '-w', '/srv/_build', '-v', '/srv/_build:/srv/_build:rw', '-v',
> '/home/cvs/qemu/qemu:/home/cvs/qemu/qemu:ro,z', 'qemu/debian-arm64-cross',
> 'aarch64-linux-gnu-gcc-10', '-o', 'linux-user/aarch64/vdso-be.so', '-nostdlib', '-shared',
> '-Wl,-h,linux-vdso.so.1', '-Wl,--build-id=sha1', '-Wl,--hash-style=both',
> '-Wl,-T,../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.ld',
> '../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.S', '-mbig-endian']' returned non-zero
> exit status 125.
> filter=--filter=label=com.qemu.instance.uuid=e746f7e345ed420088a9cc30e884a7e8
>
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 08/20] linux-user: Load vdso image if available
2023-08-30 16:17 ` Richard Henderson
@ 2023-08-30 20:56 ` Philippe Mathieu-Daudé
2023-08-30 22:08 ` Richard Henderson
0 siblings, 1 reply; 43+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-08-30 20:56 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: alex.bennee, laurent
On 30/8/23 18:17, Richard Henderson wrote:
> On 8/30/23 07:22, Philippe Mathieu-Daudé wrote:
>> Hi Richard,
>>
>> On 30/8/23 00:02, Richard Henderson wrote:
>>> The vdso image will be pre-processed into a C data array, with
>>> a simple list of relocations to perform, and identifying the
>>> location of signal trampolines.
>>>
>>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>>> ---
>>> linux-user/elfload.c | 87 +++++++++++++++++++++++++++++++++++++++-----
>>> 1 file changed, 78 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
>>> index f34fb64c0c..2a6adebb4a 100644
>>> --- a/linux-user/elfload.c
>>> +++ b/linux-user/elfload.c
>>> @@ -33,6 +33,19 @@
>>> #undef ELF_ARCH
>>> #endif
>>> +#ifndef TARGET_ARCH_HAS_SIGTRAMP_PAGE
>>> +#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
>>
>> I'd rather #error here so new targets are added with
>> a clearly defined TARGET_ARCH_HAS_SIGTRAMP_PAGE.
>
> The next step after adding vdso's is to remove
> TARGET_ARCH_HAS_SIGTRAMP_PAGE.
Ah great.
>>> + for (unsigned i = 0, n = vdso->reloc_count; i < n; i++) {
>>
>> Do we really need 'n'?
>
> You should always have an loop invariant condition if possible.
vdso->reloc_count doesn't seem updated, but I get your point.
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 08/20] linux-user: Load vdso image if available
2023-08-30 20:56 ` Philippe Mathieu-Daudé
@ 2023-08-30 22:08 ` Richard Henderson
0 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-08-30 22:08 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel; +Cc: alex.bennee, laurent
On 8/30/23 13:56, Philippe Mathieu-Daudé wrote:
>>>> + for (unsigned i = 0, n = vdso->reloc_count; i < n; i++) {
>>>
>>> Do we really need 'n'?
>>
>> You should always have an loop invariant condition if possible.
>
> vdso->reloc_count doesn't seem updated, but I get your point.
But the compiler doesn't know that -- it must assume that the store to *addr may overlap
reloc_count.
r~
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 00/20] linux-user: Implement VDSOs
2023-08-30 16:20 ` Richard Henderson
@ 2023-08-31 7:57 ` Alex Bennée
2023-09-01 14:21 ` Helge Deller
0 siblings, 1 reply; 43+ messages in thread
From: Alex Bennée @ 2023-08-31 7:57 UTC (permalink / raw)
To: Richard Henderson; +Cc: Helge Deller, qemu-devel, laurent
Richard Henderson <richard.henderson@linaro.org> writes:
> On 8/30/23 07:52, Helge Deller wrote:
>> On 8/30/23 00:02, Richard Henderson wrote:
>>> Changes for v5:
>>> * Integrated cross-compile, via new build-vdso.sh and meson rules.
>>> However, keep the binaries in the tree for hosts which do not
>>> have all of the cross-compile machinery.
>>> * Update our loongarch64 docker image to avoid a binutils bug.
>>>
>>> Just in case the list eats a binary:
>>> https://gitlab.com/rth7680/qemu/-/tree/lu-vdso
>> I pulled that on top of git head, and ran into the build problem
>> below.
>> Do I miss something?
>
> No idea, since it worked for me. Looks like some sort of docker.py problem. Alex?
>
> In the short term, use --disable-containers so that you only use the
> cross-compilers that you have locally installed.
>
>
> r~
>
>> Helge
>> [62/1742] Generating linux-user/aarch64/vdso-be.so with a custom
>> command
>> FAILED: linux-user/aarch64/vdso-be.so
>> /home/cvs/qemu/qemu/linux-user/build-vdso.sh -B /srv/_build -C
>> /home/cvs/qemu/qemu/linux-user/aarch64 -T aarch64-linux-user -o
>> linux-user/aarch64/vdso-be.so -- -nostdlib -shared
>> -Wl,-h,linux-vdso.so.1 -Wl,--build-id=sha1 -Wl,--hash-style=both
>> -Wl,-T,../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.ld
>> ../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.S -mbig-endian
>> Error: short-name resolution enforced but cannot prompt without a TTY
>> Traceback (most recent call last):
>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 683, in <module>
>> sys.exit(main())
>> ^^^^^^
>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 679, in main
>> return args.cmdobj.run(args, argv)
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 657, in run
>> return Docker().run(cmd, False, quiet=args.quiet,
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 370, in run
>> ret = self._do_check(["run", "--rm", "--label",
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 247, in _do_check
>> return subprocess.check_call(self._command + cmd, **kwargs)
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> File "/usr/lib64/python3.11/subprocess.py", line 413, in check_call
>> raise CalledProcessError(retcode, cmd)
>> subprocess.CalledProcessError: Command '['podman', 'run', '--rm',
>> '--label',
It looks like it detected podman on this setup. Can you invoke the
container from the command line?
>> 'com.qemu.instance.uuid=e746f7e345ed420088a9cc30e884a7e8',
>> '--userns=keep-id', '-u', '1000', '-w', '/srv/_build', '-v',
>> '/srv/_build:/srv/_build:rw', '-v',
>> '/home/cvs/qemu/qemu:/home/cvs/qemu/qemu:ro,z',
>> 'qemu/debian-arm64-cross', 'aarch64-linux-gnu-gcc-10', '-o',
>> 'linux-user/aarch64/vdso-be.so', '-nostdlib', '-shared',
>> '-Wl,-h,linux-vdso.so.1', '-Wl,--build-id=sha1',
>> '-Wl,--hash-style=both',
>> '-Wl,-T,../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.ld',
>> '../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.S',
>> '-mbig-endian']' returned non-zero exit status 125.
>> filter=--filter=label=com.qemu.instance.uuid=e746f7e345ed420088a9cc30e884a7e8
>>
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 00/20] linux-user: Implement VDSOs
2023-08-31 7:57 ` Alex Bennée
@ 2023-09-01 14:21 ` Helge Deller
2023-09-04 12:51 ` Alex Bennée
0 siblings, 1 reply; 43+ messages in thread
From: Helge Deller @ 2023-09-01 14:21 UTC (permalink / raw)
To: Alex Bennée, Richard Henderson; +Cc: qemu-devel, laurent
On 8/31/23 09:57, Alex Bennée wrote:
>
> Richard Henderson <richard.henderson@linaro.org> writes:
>
>> On 8/30/23 07:52, Helge Deller wrote:
>>> On 8/30/23 00:02, Richard Henderson wrote:
>>>> Changes for v5:
>>>> * Integrated cross-compile, via new build-vdso.sh and meson rules.
>>>> However, keep the binaries in the tree for hosts which do not
>>>> have all of the cross-compile machinery.
>>>> * Update our loongarch64 docker image to avoid a binutils bug.
>>>>
>>>> Just in case the list eats a binary:
>>>> https://gitlab.com/rth7680/qemu/-/tree/lu-vdso
>>> I pulled that on top of git head, and ran into the build problem
>>> below.
>>> Do I miss something?
>>
>> No idea, since it worked for me. Looks like some sort of docker.py problem. Alex?
>>
>> In the short term, use --disable-containers so that you only use the
>> cross-compilers that you have locally installed.
>>
>>
>> r~
>>
>>> Helge
>>> [62/1742] Generating linux-user/aarch64/vdso-be.so with a custom
>>> command
>>> FAILED: linux-user/aarch64/vdso-be.so
>>> /home/cvs/qemu/qemu/linux-user/build-vdso.sh -B /srv/_build -C
>>> /home/cvs/qemu/qemu/linux-user/aarch64 -T aarch64-linux-user -o
>>> linux-user/aarch64/vdso-be.so -- -nostdlib -shared
>>> -Wl,-h,linux-vdso.so.1 -Wl,--build-id=sha1 -Wl,--hash-style=both
>>> -Wl,-T,../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.ld
>>> ../../home/cvs/qemu/qemu/linux-user/aarch64/vdso.S -mbig-endian
>>> Error: short-name resolution enforced but cannot prompt without a TTY
>>> Traceback (most recent call last):
>>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 683, in <module>
>>> sys.exit(main())
>>> ^^^^^^
>>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 679, in main
>>> return args.cmdobj.run(args, argv)
>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 657, in run
>>> return Docker().run(cmd, False, quiet=args.quiet,
>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 370, in run
>>> ret = self._do_check(["run", "--rm", "--label",
>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> File "/home/cvs/qemu/qemu/tests/docker/docker.py", line 247, in _do_check
>>> return subprocess.check_call(self._command + cmd, **kwargs)
>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> File "/usr/lib64/python3.11/subprocess.py", line 413, in check_call
>>> raise CalledProcessError(retcode, cmd)
>>> subprocess.CalledProcessError: Command '['podman', 'run', '--rm',
>>> '--label',
>
> It looks like it detected podman on this setup. Can you invoke the
> container from the command line?
Yes, if I run it on the command line:
[deller@p100 _build]$ 'podman' 'run' '--rm' '--label' 'com.qemu.instance.uuid=21e1c0332a2c44b6ae94a71392c57ccf' '--userns=keep-id' '-u' '1000' '-w' '/srv/_build' '-v' '/srv/_build:/srv/_build:rw' '-v' '/home/cvs/qemu/qemu:/home/cvs/qemu/qemu:ro,z' 'qemu/debian-armhf-cross' 'arm-linux-gnueabihf-gcc' '-o' 'linux-user/arm/vdso-le.so' '-nostdlib' '-shared' '-Wl,-use-blx' '-Wl,-h,linux-vdso.so.1' '-Wl,--build-id=sha1' '-Wl,--hash-style=both' '-Wl,-T,../../home/cvs/qemu/qemu/linux-user/arm/vdso.ld' '../../home/cvs/qemu/qemu/linux-user/arm/vdso.S' '-mlittle-endian'
I get this interactive(!!!) output where I can use the cursor keys to swith up/down:
? Please select an image:
▸ registry.fedoraproject.org/qemu/debian-armhf-cross:latest
registry.access.redhat.com/qemu/debian-armhf-cross:latest
docker.io/qemu/debian-armhf-cross:latest
quay.io/qemu/debian-armhf-cross:latest
I assume the problem is, that we don't want interactive input at this stage?
Probably this is why I get the error message: "Error: short-name resolution enforced but cannot prompt without a TTY" ?
Helge
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 00/20] linux-user: Implement VDSOs
2023-09-01 14:21 ` Helge Deller
@ 2023-09-04 12:51 ` Alex Bennée
0 siblings, 0 replies; 43+ messages in thread
From: Alex Bennée @ 2023-09-04 12:51 UTC (permalink / raw)
To: Helge Deller; +Cc: Richard Henderson, qemu-devel, laurent
Helge Deller <deller@gmx.de> writes:
> On 8/31/23 09:57, Alex Bennée wrote:
>>
>> Richard Henderson <richard.henderson@linaro.org> writes:
>>
>>> On 8/30/23 07:52, Helge Deller wrote:
>>>> On 8/30/23 00:02, Richard Henderson wrote:
>>>>> Changes for v5:
>>>>> * Integrated cross-compile, via new build-vdso.sh and meson rules.
>>>>> However, keep the binaries in the tree for hosts which do not
>>>>> have all of the cross-compile machinery.
>>>>> * Update our loongarch64 docker image to avoid a binutils bug.
>>>>>
>>>>> Just in case the list eats a binary:
>>>>> https://gitlab.com/rth7680/qemu/-/tree/lu-vdso
>>>> I pulled that on top of git head, and ran into the build problem
>>>> below.
>>>> Do I miss something?
>>>
>>> No idea, since it worked for me. Looks like some sort of docker.py problem. Alex?
>>>
>>> In the short term, use --disable-containers so that you only use the
>>> cross-compilers that you have locally installed.
<snip>
>>
>> It looks like it detected podman on this setup. Can you invoke the
>> container from the command line?
>
> Yes, if I run it on the command line:
>
> [deller@p100 _build]$ 'podman' 'run' '--rm' '--label' 'com.qemu.instance.uuid=21e1c0332a2c44b6ae94a71392c57ccf' '--userns=keep-id' '-u' '1000' '-w' '/srv/_build' '-v' '/srv/_build:/srv/_build:rw' '-v' '/home/cvs/qemu/qemu:/home/cvs/qemu/qemu:ro,z' 'qemu/debian-armhf-cross' 'arm-linux-gnueabihf-gcc' '-o' 'linux-user/arm/vdso-le.so' '-nostdlib' '-shared' '-Wl,-use-blx' '-Wl,-h,linux-vdso.so.1' '-Wl,--build-id=sha1' '-Wl,--hash-style=both' '-Wl,-T,../../home/cvs/qemu/qemu/linux-user/arm/vdso.ld' '../../home/cvs/qemu/qemu/linux-user/arm/vdso.S' '-mlittle-endian'
>
> I get this interactive(!!!) output where I can use the cursor keys to swith up/down:
>
> ? Please select an image:
> ▸ registry.fedoraproject.org/qemu/debian-armhf-cross:latest
> registry.access.redhat.com/qemu/debian-armhf-cross:latest
> docker.io/qemu/debian-armhf-cross:latest
> quay.io/qemu/debian-armhf-cross:latest
>
> I assume the problem is, that we don't want interactive input at this stage?
> Probably this is why I get the error message: "Error: short-name
> resolution enforced but cannot prompt without a TTY" ?
No I think the problem is we need to add dependencies to the target to
ensure the containers are built and available (if they are needed). It
looks like because qemu/debian-armhf-cross isn't available on your local
setup it fails and offers some guesses.
If you run:
make docker-image-debian-armhf-cross
does the target work afterwards?
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain
2023-08-29 22:02 ` [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain Richard Henderson
2023-08-30 9:43 ` gaosong
@ 2023-09-04 14:02 ` Alex Bennée
2023-09-04 23:08 ` Richard Henderson
2023-09-05 9:23 ` Alex Bennée
2 siblings, 1 reply; 43+ messages in thread
From: Alex Bennée @ 2023-09-04 14:02 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, laurent
Richard Henderson <richard.henderson@linaro.org> writes:
> Update from clfs 5.0 to clfs 8.1, which includes updates
> to binutils 2.41, gcc 13.2, and glibc 2.38.
>
> See https://github.com/loongson/build-tools
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Do you want this queued ahead of a vdso series?
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 02/20] linux-user: Introduce imgsrc_read, imgsrc_read_alloc
2023-08-29 22:02 ` [PATCH v5 02/20] linux-user: Introduce imgsrc_read, imgsrc_read_alloc Richard Henderson
@ 2023-09-04 14:27 ` Alex Bennée
0 siblings, 0 replies; 43+ messages in thread
From: Alex Bennée @ 2023-09-04 14:27 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, laurent, Philippe Mathieu-Daudé
Richard Henderson <richard.henderson@linaro.org> writes:
> Introduced and initialized, but not yet really used.
> These will tidy the current tests vs BPRM_BUF_SIZE.
>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 03/20] linux-user: Tidy loader_exec
2023-08-29 22:02 ` [PATCH v5 03/20] linux-user: Tidy loader_exec Richard Henderson
@ 2023-09-04 14:54 ` Alex Bennée
0 siblings, 0 replies; 43+ messages in thread
From: Alex Bennée @ 2023-09-04 14:54 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, laurent, Philippe Mathieu-Daudé
Richard Henderson <richard.henderson@linaro.org> writes:
> Reorg the if cases to reduce indentation.
> Test for 4 bytes in the file before checking the signatures.
>
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 04/20] linux-user: Do not clobber bprm_buf swapping ehdr
2023-08-29 22:02 ` [PATCH v5 04/20] linux-user: Do not clobber bprm_buf swapping ehdr Richard Henderson
@ 2023-09-04 14:58 ` Alex Bennée
0 siblings, 0 replies; 43+ messages in thread
From: Alex Bennée @ 2023-09-04 14:58 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, laurent, Philippe Mathieu-Daudé
Richard Henderson <richard.henderson@linaro.org> writes:
> Rearrange the allocation of storage for ehdr between load_elf_image
> and load_elf_binary. The same set of copies are done, but we don't
> modify bprm_buf, which will be important later.
>
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 20/20] linux-user/s390x: Add vdso
2023-08-29 22:02 ` [PATCH v5 20/20] linux-user/s390x: Add vdso Richard Henderson
@ 2023-09-04 15:00 ` Alex Bennée
2023-09-06 17:56 ` Richard Henderson
0 siblings, 1 reply; 43+ messages in thread
From: Alex Bennée @ 2023-09-04 15:00 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, laurent
Richard Henderson <richard.henderson@linaro.org> writes:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> linux-user/s390x/vdso-asmoffset.h | 2 +
> linux-user/elfload.c | 3 ++
> linux-user/s390x/signal.c | 4 +-
> linux-user/s390x/meson.build | 24 +++++++++++
> linux-user/s390x/vdso.S | 61 ++++++++++++++++++++++++++
> linux-user/s390x/vdso.ld | 69 ++++++++++++++++++++++++++++++
> linux-user/s390x/vdso.so | Bin 0 -> 3464 bytes
> 7 files changed, 160 insertions(+), 3 deletions(-)
> create mode 100644 linux-user/s390x/vdso-asmoffset.h
> create mode 100644 linux-user/s390x/vdso.S
> create mode 100644 linux-user/s390x/vdso.ld
> create mode 100755 linux-user/s390x/vdso.so
>
<snip>
> diff --git a/linux-user/s390x/meson.build b/linux-user/s390x/meson.build
> index 0781ccea1d..09afd98deb 100644
> --- a/linux-user/s390x/meson.build
> +++ b/linux-user/s390x/meson.build
> @@ -3,3 +3,27 @@ syscall_nr_generators += {
> arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@' ],
> output: '@BASENAME@_nr.h')
> }
> +
> +vdso_so = custom_target(output: 'vdso.so',
> + input: files('vdso.S', 'vdso.ld'),
> + depend_files: files('vdso-asmoffset.h'),
> + command: [
> + build_vdso_cmd,
> + '-B', meson.project_build_root(),
> + '-C', meson.current_source_dir(),
> + '-T', 's390x-linux-user',
> + '-o', '@OUTPUT@',
> + '--', '-nostdlib', '-shared',
> + '-Wl,-h,linux-vdso64.so.1',
> + '-Wl,--build-id=sha1',
> + '-Wl,--hash-style=both',
> + '-Wl,-T,@INPUT1@',
> + '@INPUT0@'
> + ])
> +
> +vdso_inc = gen_vdso.process('vdso.so', extra_args: [
> + '-s', '__kernel_sigreturn',
> + '-r', '__kernel_rt_sigreturn'
> + ])
> +
Due to the b4 dropping the vdso.so in the patch this fails:
Program build-vdso.sh found: YES (/home/alex/lsrc/qemu.git/linux-user/build-vdso.sh)
../../linux-user/s390x/meson.build:24:0: ERROR: File vdso.so does not exist.
A full log can be found at /home/alex/lsrc/qemu.git/builds/all/meson-logs/meson-log.txt
FAILED: build.ninja
/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/meson --internal regenerate /home/alex/lsrc/qemu.git /home/alex/lsrc/qemu.git/builds/all
ninja: error: rebuilding 'build.ninja': subcommand failed
BUILD aarch64-softmmu guest-tests
tests/tcg/aarch64-softmmu: -march=armv8.3-a detected
which makes me think the dependencies are broken anyway because I have a
working s390x compiler:
➜ cat tests/tcg/s390x-linux-user/config-target.mak
# Automatically generated by configure - do not modify
TARGET_NAME=s390x
TARGET=s390x-linux-user
EXTRA_CFLAGS=
CC=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-gcc -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
CCAS=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-gcc -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
AR=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ar -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
AS=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-as -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
LD=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ld -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
NM=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-nm -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
OBJCOPY=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-objcopy -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
RANLIB=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ranlib -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
STRIP=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-strip -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
BUILD_STATIC=y
QEMU=/home/alex/lsrc/qemu.git/builds/all/qemu-s390x
HOST_GDB_SUPPORTS_ARCH=y
We really need to express the dependency on
docker-image-debian-s390x-cross (when using containers) to ensure we can
build the vdso.so and not rely on the copy we have.
> +linux_user_ss.add(when: 'TARGET_S390X', if_true: vdso_inc)
> diff --git a/linux-user/s390x/vdso.S b/linux-user/s390x/vdso.S
> new file mode 100644
> index 0000000000..3332492477
> --- /dev/null
> +++ b/linux-user/s390x/vdso.S
> @@ -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
> diff --git a/linux-user/s390x/vdso.ld b/linux-user/s390x/vdso.ld
> new file mode 100644
> index 0000000000..2a30ff382a
> --- /dev/null
> +++ b/linux-user/s390x/vdso.ld
> @@ -0,0 +1,69 @@
> +/*
> + * Linker script for linux x86-64 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_restart_syscall;
> + __kernel_rt_sigreturn;
> + __kernel_sigreturn;
> + 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
> + .data : {
> + /*
> + * There ought not be any real read-write data.
> + * But since we manipulated the segment layout,
> + * we have to put these sections somewhere.
> + */
> + *(.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
> +}
> diff --git a/linux-user/s390x/vdso.so b/linux-user/s390x/vdso.so
> new file mode 100755
> index 0000000000000000000000000000000000000000..64130f6f335269b03291653d006225b365be9cd9
> GIT binary patch
> literal 3464
> zcmcguUuaup6hAlrn#R#}B6HHJ6^h8v3s#wtDI{HzWs-HJcB~u1U2JZX*fw`0w>2I9
> z>4SqkSsXs>VMq|PDvEm&1Rwf1RK!O?(CHKhzDz`4)-9g%edpXip_vbYU-<6tJHK<z
> zcW%!8&bjyXe5nwL7~qX4?8S9}P@0U^51wZ!4ROf8FziM-fitG{$m!98#y(98LK0<)
> zF`)T=*Tk6C2o94N!O8KAbs})9bp<|Z(f=FCiu>y{lI$0|t_^w-9%V;CvX_ZVV@~UP
> z5ysh1P<-w|K6-fSIDGtl`ke<)|Mc0}bJcWb@yj2!fBy7s_8}PJ^{b5Jk0Yw$Io;cT
> zvAm@bv#$o5>1TjUWL@)+V!Xt77o&O(PPe<Q<=ACHly9+~a!c|JEyu*4)&DD)cLVIw
> z5#zsb<Wa;~pHGlXgYG*Q;1!7%(pLlg1FRr>!{_5F56Dq|HugaG54H=!y#f0xtl;=^
> z{(|Oe9c6~jI}MdzM5-AY|8oAd5niPp<$=q-bPi}udYXw&GFgmg;C+@!7ys^{eeuHj
> z*T4PgtbX)Xd*k=9hda69Q>Wkk@x$ybu&hP9*|3+as_nY<W!qV(l-GQAe#x0%6x|MV
> z({A}JZZUsm#g|+4YSVUCnhl?7x|Yu_)f+4A$5tyX=fIO@%P}8^(vhj-bJm1;z?^s*
> zZyoa${1Id5U*x4{=^0Ud(KFC>Lm7yGF<^c5IqMK$gD%EM^dJJ&HRX_=UlHe3oHd-=
> zIM1UMJ^v4I(xAP;I6DJId&n5swY$R)f#T6@<J<?ip>HFFH}{sl84Bv3LERZ;$NK58
> z{sq)6-9i5f>gc{kWq<MCyxE<;cJ)RF##2)YW1BbO^1yAM-@MO=rJ%1aeh1xCVO{Fw
> z)F*fkeFq*cPKoqGZHhdf^Ke}tPv;Sb*Qb<(B%kYOMiG2Lp8K5cgQ7#8>nFM;93k>t
> zPf{jYi+obAVwW^}{2=pE|4KxA?w|60@a(yd##JBHtcojrD!7kfczq<42ikk5{qOhf
> zLwR_@?>o{q)cHH)^P&ED(&rPwe&_gnsNbFI)9)_$_Mtxep3ldxa1KVn%AK6b9zAjh
> zOC8^LR=#KzX0k`~RxvjN*5T5z$!y6wRwz85pS5PQlcl`n_k`ZI;q{zQa|v~hox4`3
> zdw3>(zwsz90(Cq9v$eMDmS044n;L7fYB;V9W@W8WUarrp1==E(-7=Wf#)?@hw`!Vq
> zo0?g*o2|Oj2nkjNOuJ?+G|S7jRjZ(-NMO2l+m)mAUvLDS<$WUcH>WrB>T|p&K(J6A
> zLY*8iECCvFZapMYV$hoF3cmya_T!ZA42~~#E(lv_L;l=1Jb$XEi2%>>r49tu`x(u=
> zA@PZzo*QQk$Cth#sCp{ztt`c#Fpb|mfA{!rX*tRW8I*VOC$q_bj^j&u1tHXb&|dOD
> z{?B3jE-i3~KihkKi}D<d&vwfGMDKSTwpH#&f{;dk%D?!@|3?ZIaLWBi{OhE^eHgv(
> zV@-Q~TZwdtd;FzO3c^KkWDLfCE#RNfdg)Vw>YW<g!b>ds%Kr-5;5sp;iO3^}^sP;K
> oq#^O?{L#B0m|N2GNEUhVg)ofre@WbfvycCv+~*tYC*b-21AbI{0ssI2
>
> literal 0
> HcmV?d00001
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain
2023-09-04 14:02 ` Alex Bennée
@ 2023-09-04 23:08 ` Richard Henderson
0 siblings, 0 replies; 43+ messages in thread
From: Richard Henderson @ 2023-09-04 23:08 UTC (permalink / raw)
To: Alex Bennée; +Cc: qemu-devel, laurent
On 9/4/23 07:02, Alex Bennée wrote:
>
> Richard Henderson <richard.henderson@linaro.org> writes:
>
>> Update from clfs 5.0 to clfs 8.1, which includes updates
>> to binutils 2.41, gcc 13.2, and glibc 2.38.
>>
>> See https://github.com/loongson/build-tools
>>
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>
> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
>
> Do you want this queued ahead of a vdso series?
Yes, please.
r~
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain
2023-08-29 22:02 ` [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain Richard Henderson
2023-08-30 9:43 ` gaosong
2023-09-04 14:02 ` Alex Bennée
@ 2023-09-05 9:23 ` Alex Bennée
2 siblings, 0 replies; 43+ messages in thread
From: Alex Bennée @ 2023-09-05 9:23 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, laurent
Richard Henderson <richard.henderson@linaro.org> writes:
> Update from clfs 5.0 to clfs 8.1, which includes updates
> to binutils 2.41, gcc 13.2, and glibc 2.38.
>
> See https://github.com/loongson/build-tools
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> tests/docker/dockerfiles/debian-loongarch-cross.docker | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tests/docker/dockerfiles/debian-loongarch-cross.docker b/tests/docker/dockerfiles/debian-loongarch-cross.docker
> index 9d957547b5..b4bf265717 100644
> --- a/tests/docker/dockerfiles/debian-loongarch-cross.docker
> +++ b/tests/docker/dockerfiles/debian-loongarch-cross.docker
> @@ -20,7 +20,7 @@ RUN apt-get update && \
> git \
> python3-minimal
>
> -RUN curl -#SL https://github.com/loongson/build-tools/releases/download/2022.05.29/loongarch64-clfs-5.0-cross-tools-gcc-glibc.tar.xz \
> +RUN curl -#SL https://github.com/loongson/build-tools/releases/download/2023.08.08/CLFS-loongarch64-8.1-x86_64-cross-tools-gcc-glibc.tar.xz \
> | tar -xJC /opt
>
> ENV PATH $PATH:/opt/cross-tools/bin
Queued to testing/next, thanks.
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 20/20] linux-user/s390x: Add vdso
2023-09-04 15:00 ` Alex Bennée
@ 2023-09-06 17:56 ` Richard Henderson
2023-09-07 6:17 ` Philippe Mathieu-Daudé
2023-09-07 9:20 ` Alex Bennée
0 siblings, 2 replies; 43+ messages in thread
From: Richard Henderson @ 2023-09-06 17:56 UTC (permalink / raw)
To: Alex Bennée; +Cc: qemu-devel, laurent
On 9/4/23 08:00, Alex Bennée wrote:
> Due to the b4 dropping the vdso.so in the patch this fails:
>
> Program build-vdso.sh found: YES (/home/alex/lsrc/qemu.git/linux-user/build-vdso.sh)
> ../../linux-user/s390x/meson.build:24:0: ERROR: File vdso.so does not exist.
> A full log can be found at /home/alex/lsrc/qemu.git/builds/all/meson-logs/meson-log.txt
> FAILED: build.ninja
> /home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/meson --internal regenerate /home/alex/lsrc/qemu.git /home/alex/lsrc/qemu.git/builds/all
> ninja: error: rebuilding 'build.ninja': subcommand failed
> BUILD aarch64-softmmu guest-tests
> tests/tcg/aarch64-softmmu: -march=armv8.3-a detected
>
> which makes me think the dependencies are broken anyway because I have a
> working s390x compiler:
>
> ➜ cat tests/tcg/s390x-linux-user/config-target.mak
> # Automatically generated by configure - do not modify
> TARGET_NAME=s390x
> TARGET=s390x-linux-user
> EXTRA_CFLAGS=
> CC=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-gcc -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> CCAS=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-gcc -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> AR=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ar -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> AS=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-as -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> LD=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ld -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> NM=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-nm -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> OBJCOPY=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-objcopy -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> RANLIB=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ranlib -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> STRIP=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-strip -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
> BUILD_STATIC=y
> QEMU=/home/alex/lsrc/qemu.git/builds/all/qemu-s390x
> HOST_GDB_SUPPORTS_ARCH=y
>
> We really need to express the dependency on
> docker-image-debian-s390x-cross (when using containers) to ensure we can
> build the vdso.so and not rely on the copy we have.
I think expressing the dependency is a mistake.
The major problem is network unreliability. I installed a new vm to build test this, and
it took more than a dozen retrys to get all of the docker images built.
What we do right now is determine if docker or podman is present and works, and then
*assume* we can make all of the cross-compilers work later, and so register them as
cross-compilers early.
I think the only moderately reliable thing is to determine what containers are already
present and working and use only those. Developers will need to manually rebuild
containers periodically and then re-run configure to make those visible to the cross-build
machinery. Not completely ideal, of course, but nothing else is either.
r~
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 20/20] linux-user/s390x: Add vdso
2023-09-06 17:56 ` Richard Henderson
@ 2023-09-07 6:17 ` Philippe Mathieu-Daudé
2023-09-07 9:20 ` Alex Bennée
1 sibling, 0 replies; 43+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-09-07 6:17 UTC (permalink / raw)
To: Richard Henderson, Alex Bennée
Cc: qemu-devel, laurent, Daniel P. Berrangé, Thomas Huth,
Michael Tokarev
On 6/9/23 19:56, Richard Henderson wrote:
> On 9/4/23 08:00, Alex Bennée wrote:
>> Due to the b4 dropping the vdso.so in the patch this fails:
>>
>> Program build-vdso.sh found: YES
>> (/home/alex/lsrc/qemu.git/linux-user/build-vdso.sh)
>> ../../linux-user/s390x/meson.build:24:0: ERROR: File vdso.so does
>> not exist.
>> A full log can be found at
>> /home/alex/lsrc/qemu.git/builds/all/meson-logs/meson-log.txt
>> FAILED: build.ninja
>> /home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/meson --internal
>> regenerate /home/alex/lsrc/qemu.git /home/alex/lsrc/qemu.git/builds/all
>> ninja: error: rebuilding 'build.ninja': subcommand failed
>> BUILD aarch64-softmmu guest-tests
>> tests/tcg/aarch64-softmmu: -march=armv8.3-a detected
>>
>> which makes me think the dependencies are broken anyway because I have a
>> working s390x compiler:
>>
>> ➜ cat tests/tcg/s390x-linux-user/config-target.mak
>> # Automatically generated by configure - do not modify
>> TARGET_NAME=s390x
>> TARGET=s390x-linux-user
>> EXTRA_CFLAGS=
>> CC=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-gcc -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> CCAS=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-gcc -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> AR=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-ar -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> AS=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-as -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> LD=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-ld -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> NM=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-nm -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> OBJCOPY=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-objcopy -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> RANLIB=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-ranlib -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> STRIP=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B
>> /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc
>> --cc s390x-linux-gnu-strip -i qemu/debian-s390x-cross -s
>> /home/alex/lsrc/qemu.git --
>> BUILD_STATIC=y
>> QEMU=/home/alex/lsrc/qemu.git/builds/all/qemu-s390x
>> HOST_GDB_SUPPORTS_ARCH=y
>>
>> We really need to express the dependency on
>> docker-image-debian-s390x-cross (when using containers) to ensure we can
>> build the vdso.so and not rely on the copy we have.
>
> I think expressing the dependency is a mistake.
>
> The major problem is network unreliability. I installed a new vm to
> build test this, and it took more than a dozen retrys to get all of the
> docker images built.
>
> What we do right now is determine if docker or podman is present and
> works, and then *assume* we can make all of the cross-compilers work
> later, and so register them as cross-compilers early.
>
> I think the only moderately reliable thing is to determine what
> containers are already present and working and use only those.
> Developers will need to manually rebuild containers periodically and
> then re-run configure to make those visible to the cross-build
> machinery. Not completely ideal, of course, but nothing else is either.
We discussed this 1 or 2 years ago. My suggestion was when we tag
a release, we also tag the gitlab docker images (with all the distro
packages installed from that tag). Then those working with the release
can pull the pre-installed image from the tag; since it won't need
newer package, no need for network access within the image.
During the latest development cycle, we can either use the latest
tagged image if sufficient, or we have to deal with the same issues
you mentioned (network stability, broken package deps from time to
time).
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 20/20] linux-user/s390x: Add vdso
2023-09-06 17:56 ` Richard Henderson
2023-09-07 6:17 ` Philippe Mathieu-Daudé
@ 2023-09-07 9:20 ` Alex Bennée
1 sibling, 0 replies; 43+ messages in thread
From: Alex Bennée @ 2023-09-07 9:20 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, laurent
Richard Henderson <richard.henderson@linaro.org> writes:
> On 9/4/23 08:00, Alex Bennée wrote:
>> Due to the b4 dropping the vdso.so in the patch this fails:
>> Program build-vdso.sh found: YES
>> (/home/alex/lsrc/qemu.git/linux-user/build-vdso.sh)
>> ../../linux-user/s390x/meson.build:24:0: ERROR: File vdso.so does not exist.
>> A full log can be found at /home/alex/lsrc/qemu.git/builds/all/meson-logs/meson-log.txt
>> FAILED: build.ninja
>> /home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/meson --internal regenerate /home/alex/lsrc/qemu.git /home/alex/lsrc/qemu.git/builds/all
>> ninja: error: rebuilding 'build.ninja': subcommand failed
>> BUILD aarch64-softmmu guest-tests
>> tests/tcg/aarch64-softmmu: -march=armv8.3-a detected
>> which makes me think the dependencies are broken anyway because I
>> have a
>> working s390x compiler:
>> ➜ cat tests/tcg/s390x-linux-user/config-target.mak
>> # Automatically generated by configure - do not modify
>> TARGET_NAME=s390x
>> TARGET=s390x-linux-user
>> EXTRA_CFLAGS=
>> CC=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-gcc -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> CCAS=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-gcc -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> AR=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ar -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> AS=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-as -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> LD=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ld -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> NM=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-nm -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> OBJCOPY=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-objcopy -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> RANLIB=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-ranlib -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> STRIP=/home/alex/lsrc/qemu.git/builds/all/pyvenv/bin/python3 -B /home/alex/lsrc/qemu.git/tests/docker/docker.py --engine docker cc --cc s390x-linux-gnu-strip -i qemu/debian-s390x-cross -s /home/alex/lsrc/qemu.git --
>> BUILD_STATIC=y
>> QEMU=/home/alex/lsrc/qemu.git/builds/all/qemu-s390x
>> HOST_GDB_SUPPORTS_ARCH=y
>> We really need to express the dependency on
>> docker-image-debian-s390x-cross (when using containers) to ensure we can
>> build the vdso.so and not rely on the copy we have.
>
> I think expressing the dependency is a mistake.
>
> The major problem is network unreliability. I installed a new vm to
> build test this, and it took more than a dozen retrys to get all of
> the docker images built.
>
> What we do right now is determine if docker or podman is present and
> works, and then *assume* we can make all of the cross-compilers work
> later, and so register them as cross-compilers early.
Fair enough. I'm all for making the normal case easy, but then how do we
express the explicit "please build the binary for me"?
>
> I think the only moderately reliable thing is to determine what
> containers are already present and working and use only those.
> Developers will need to manually rebuild containers periodically and
> then re-run configure to make those visible to the cross-build
> machinery. Not completely ideal, of course, but nothing else is
> either.
>
>
> r~
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 43+ messages in thread
* Re: [PATCH v5 16/20] linux-user/riscv: Add vdso
2023-08-29 22:02 ` [PATCH v5 16/20] linux-user/riscv: " Richard Henderson
@ 2023-09-19 4:47 ` Alistair Francis
0 siblings, 0 replies; 43+ messages in thread
From: Alistair Francis @ 2023-09-19 4:47 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, alex.bennee, laurent
On Wed, Aug 30, 2023 at 9:17 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> linux-user/riscv/vdso-asmoffset.h | 9 ++
> linux-user/elfload.c | 4 +
> linux-user/riscv/signal.c | 8 ++
> linux-user/meson.build | 1 +
> linux-user/riscv/meson.build | 30 +++++
> linux-user/riscv/vdso-32.so | Bin 0 -> 2888 bytes
> linux-user/riscv/vdso-64.so | Bin 0 -> 3840 bytes
> linux-user/riscv/vdso.S | 186 ++++++++++++++++++++++++++++++
> linux-user/riscv/vdso.ld | 74 ++++++++++++
> 9 files changed, 312 insertions(+)
> create mode 100644 linux-user/riscv/vdso-asmoffset.h
> create mode 100644 linux-user/riscv/meson.build
> create mode 100755 linux-user/riscv/vdso-32.so
> create mode 100755 linux-user/riscv/vdso-64.so
> create mode 100644 linux-user/riscv/vdso.S
> create mode 100644 linux-user/riscv/vdso.ld
>
> diff --git a/linux-user/riscv/vdso-asmoffset.h b/linux-user/riscv/vdso-asmoffset.h
> new file mode 100644
> index 0000000000..123902ef61
> --- /dev/null
> +++ b/linux-user/riscv/vdso-asmoffset.h
> @@ -0,0 +1,9 @@
> +#ifdef TARGET_ABI32
> +# define sizeof_rt_sigframe 0x2b0
> +# define offsetof_uc_mcontext 0x120
> +# define offsetof_freg0 0x80
> +#else
> +# define sizeof_rt_sigframe 0x340
> +# define offsetof_uc_mcontext 0x130
> +# define offsetof_freg0 0x100
> +#endif
> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
> index eb22a17e0e..8f902bb427 100644
> --- a/linux-user/elfload.c
> +++ b/linux-user/elfload.c
> @@ -1733,8 +1733,10 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs,
>
> #ifdef TARGET_RISCV32
> #define ELF_CLASS ELFCLASS32
> +#include "vdso-32.c.inc"
> #else
> #define ELF_CLASS ELFCLASS64
> +#include "vdso-64.c.inc"
> #endif
>
> #define ELF_HWCAP get_elf_hwcap()
> @@ -1751,6 +1753,8 @@ static uint32_t get_elf_hwcap(void)
> #undef MISA_BIT
> }
>
> +#define vdso_image_info() &vdso_image_info
> +
> static inline void init_thread(struct target_pt_regs *regs,
> struct image_info *infop)
> {
> diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c
> index eaa168199a..5449c7618a 100644
> --- a/linux-user/riscv/signal.c
> +++ b/linux-user/riscv/signal.c
> @@ -21,6 +21,7 @@
> #include "user-internals.h"
> #include "signal-common.h"
> #include "linux-user/trace.h"
> +#include "vdso-asmoffset.h"
>
> /* Signal handler invocation must be transparent for the code being
> interrupted. Complete CPU (hart) state is saved on entry and restored
> @@ -37,6 +38,8 @@ struct target_sigcontext {
> uint32_t fcsr;
> }; /* cf. riscv-linux:arch/riscv/include/uapi/asm/ptrace.h */
>
> +QEMU_BUILD_BUG_ON(offsetof(struct target_sigcontext, fpr) != offsetof_freg0);
> +
> struct target_ucontext {
> unsigned long uc_flags;
> struct target_ucontext *uc_link;
> @@ -51,6 +54,11 @@ struct target_rt_sigframe {
> struct target_ucontext uc;
> };
>
> +QEMU_BUILD_BUG_ON(sizeof(struct target_rt_sigframe)
> + != sizeof_rt_sigframe);
> +QEMU_BUILD_BUG_ON(offsetof(struct target_rt_sigframe, uc.uc_mcontext)
> + != offsetof_uc_mcontext);
> +
> static abi_ulong get_sigframe(struct target_sigaction *ka,
> CPURISCVState *regs, size_t framesize)
> {
> diff --git a/linux-user/meson.build b/linux-user/meson.build
> index 1b265ed365..3aa967b27c 100644
> --- a/linux-user/meson.build
> +++ b/linux-user/meson.build
> @@ -46,6 +46,7 @@ subdir('microblaze')
> subdir('mips64')
> subdir('mips')
> subdir('ppc')
> +subdir('riscv')
> subdir('s390x')
> subdir('sh4')
> subdir('sparc')
> diff --git a/linux-user/riscv/meson.build b/linux-user/riscv/meson.build
> new file mode 100644
> index 0000000000..0a00cae9fd
> --- /dev/null
> +++ b/linux-user/riscv/meson.build
> @@ -0,0 +1,30 @@
> +vdso_cmd = [
> + build_vdso_cmd,
> + '-B', meson.project_build_root(),
> + '-C', meson.current_source_dir(),
> + '-T', 'riscv64-linux-user',
> + '-o', '@OUTPUT@',
> + '--',
> + '-nostdlib', '-shared', '-fpic',
> + '-Wl,-h,linux-vdso.so.1',
> + '-Wl,--build-id=sha1',
> + '-Wl,--hash-style=both',
> + '-Wl,-T,@INPUT1@',
> + '@INPUT0@'
> +]
> +
> +vdso_32_so = custom_target(output: 'vdso-32.so',
> + input: files('vdso.S', 'vdso.ld'),
> + depend_files: files('vdso-asmoffset.h'),
> + command: vdso_cmd + ['-mabi=ilp32d', '-march=rv32g'])
> +
> +vdso_64_so = custom_target(output: 'vdso-64.so',
> + input: files('vdso.S', 'vdso.ld'),
> + depend_files: files('vdso-asmoffset.h'),
> + command: vdso_cmd + ['-mabi=lp64d', '-march=rv64g'])
> +
> +vdso_32_inc = gen_vdso.process(vdso_32_so, extra_args: ['-r', '__vdso_rt_sigreturn'])
> +vdso_64_inc = gen_vdso.process(vdso_64_so, extra_args: ['-r', '__vdso_rt_sigreturn'])
> +
> +linux_user_ss.add(when: 'TARGET_RISCV32', if_true: vdso_32_inc)
> +linux_user_ss.add(when: 'TARGET_RISCV64', if_true: vdso_64_inc)
> diff --git a/linux-user/riscv/vdso-32.so b/linux-user/riscv/vdso-32.so
> new file mode 100755
> index 0000000000000000000000000000000000000000..189e2f49e78f158cf49e6092edf7ece8cf7e8a25
> GIT binary patch
> literal 2888
> zcmb_eU2GIp6h5=d;!>e*DVSm#Q)tD8)XjFOgkaNj+iv-BX`4b7lsMh)Zo3=lZnHbv
> zKtn88L{tQ{1rbpTD59cPKoLbD(ZobwOnmZP<BKu=pbv`F@0*#sOtlX_c-n8zJwJ2i
> z-nr*~Gb7<ho2F@^#4W#yvg+ZS@QTcWu9r%gEj3aiK4{uEa0O$6d4yYJu-1ctEiJZY
> zjI~vL+bzr`Zlc2{;({telEM+#gsR{9oe@8Rn<!KxMyNRTRR?B@FF+h6WOaMD)NVO*
> z_^kKZ)kEKYIr2xx`Cl$9zC2Qlm;ta>D<<^Y^{LDbXfEp#G@rpF=2!%M0Js^z)U7o@
> z<FT1C2fuTHYg1F19^CLRXs+)k=m;n9KS&b`Lfn`wpY3T(dK2_~+<6(a7nA0EXzzwr
> zQX)T3^}wih#1}H?up=<b9CjmYpTp)JaT#1EHTRIu#wkcQg>&HZq;Sg2rzUufRx+n9
> zBt9Q)=9&HQMfv201A%14_`a!A7Y7zEI@ywLSorzTJ12V+qU%HPTt@Ft7)EL!k?D&^
> zw<}+4YbN%viu}u&P2`jh7sm$k%Ie#i&n5L#EE-D|%4ZEdm+H?ZjC?jNTT|)$w!3&+
> zKmO|^vbMc@lV0zyyBiaRxTgKF*R8+fmw%kco~r=ZR}}7*3%~i1?~53tsQuB(-S<?&
> z<}>mkaV2yTx)XXY^fmecihH<Av>lpOKF=krQwDqmum_~GxH67rW^Mprtx9OhxTSdg
> z1{7%0%ICT!J)WlcuHHv`MjzU}<*^6$Y<m2@y&IqCdb0DW_I;73*X>_(pzUDmGtJL7
> zjWv!p99ngF<#Q{J)IT3Q8hF8ftoFraFV(!fbfWcm^NFUDjjuGky6V)**H)aae?9m{
> z;7$LT+P9XyUGvV;$?A8PoUJ@}`}vCZZhOD%!mS@HxH$hq-$%ul=6+oCiTCnsbFRlQ
> zH$DrV9ZGDEN2(@(6CNqmwChzh$EDPx$(T2=D2Mpy5>4DyAsMaOC8Kv}8gg7QpT|||
> z>HITR;YO}VY4Og+b6<bzuA1mZoxJq#l*096-X62gn0IFp>oK44QjEvElV18l&G^Zt
> za<L)NxF4SE(DGm^I9R6-1P23pl%u}jU{H_qXE+thW$7PI^(E4=1QNLcGssoj=QcaS
> z;yt?D=E<;l#<JNBB27FX5T17m`HA8-*-3;vW!ctABwty!d7?z|j@xFb9;+;_=P9;$
> z)ygNkf$s`&vYf>))b7IW(4sxhUV&xL0>5zo$VZl_-Lx#mZ^4ipLeXHecLO$I&<?^T
> z&s$O?VGPvz8GlfPpvh-_&`!P@hVA6T{ji<<#XfWL-z01&Uw#JL$%hh)t=}A6p6K&u
> zq<Wj^t()6J>({o3-r3dB5^nA83hSVRdqb<k`o>UmB&>s3@Q%^LYxK6R(E6~xrnO7-
> z)sc?oP(<%&Yugass1hAiViVg;Y%~+uP3N#_d}UWE(4m9*3O<sjh(EV|z=-xj8(B*y
> z)hL}Y65@|<Pe%t*F>`=i=%^7De}6jfPeyY|%Wq^Y&rl+pOJ&m23_ULXL{jg|Mh6ml
> zGLB4TiQh<UGsJHmE`QW8vZ>y@0h0dDQjSb^H(Q<OiKqsYs1{rd2TuiC%K3d^oeb-}
> z!}k>5o9uSh<9nVsh_Si{>-hloC)=0x*q4O57hL9;b_2k+W<8!)f*hh+n>hr1zuVsk
> zJjX;6eE-aAwtWbj-y=NZ{0>pVIZ@UDQ+7R`dtyF(svfT=?g!MjNe_Yq=i*#1OyT)r
> zZC>O2{(@<WTDt*D<&i&#AM6||mG_99$35XWC3Z8x7L`XIN(?GLzZYAS0j<`n?x{k9
> q$h!h3d4}IMtjB#*-zylJ62L;gQ3kZCSAsF_TaY<uj>84(M&92P;-?}2
>
> literal 0
> HcmV?d00001
>
> diff --git a/linux-user/riscv/vdso-64.so b/linux-user/riscv/vdso-64.so
> new file mode 100755
> index 0000000000000000000000000000000000000000..3c3b3a8cc579649e5108402b706bf7f741efd2e4
> GIT binary patch
> literal 3840
> zcmc&%Z){Ul6hCieP{)QF3^Uxa3^Nr8G^Lqjk%hc&>o&BEW`j7R$)jt#wQ*~k_I247
> zB2(voWYYm6qJk)jf9oF<{Kq~RB_>8b>UWK3jL{hVV9<Had*_tbyGB3w!L!}>yZ8LL
> z_r7!Q{k_}0fnZmerh$kHeuc{|0G$o<6?SC_f)1^)6rVLvjR;`tY`bnlAuhz73A)+t
> z0!UNb2z5|GIuxDEiEx=>b2g<vL7bu`W%#7=&TvO6dRZ?h^9+4!Mk%hT-0Ef#Hrr|t
> zBwrFjDzn_LisCOwz9fXTSTH}(-Mb4m{&4D#+@;gYKK=e$!~ad=mM<FvU!VzA&;!M^
> z!HT2mc?v}N?XQKDRpE|#`k-@L(teQ=gTl)TGj<b}GuAPxIhXvf8Lm+LFD=;PU*z%r
> z<TeinKXdy6+ohlX16`QCdCr@RPs_FvDxrlFRmq0+tnXpH<Y5~1HSo&<yA@zJ)~KJT
> z;=h{px}p!Ven8Q0WqnA|%RZ**(;5)cTCp3}Y?1Y+`AW)ZEy$mc-j`yu>NPdG242#U
> zpSA9v*XR3Zyzzzu`xZ`~9bLQTL`Sl1^=C(}&kx4HFvg<UlrbDL&BSOdH53g`h%Pdc
> zirgudMaoPpD>@90q;t|58p&njMj{f9#0%YLOe32Z&cw`ICJ7^nWNv&T4eP=GO%UAH
> zyKBH`@oc&gCyY{7^k?fdd_(#>e(t9#I$sS~<m}M9m!U1U_qz(Rk<faQX!Wiw&4`qz
> zT6AnfY(fkn>J&%?g=q#{lYOA=(X{%iGD}D2=K>blKjgOo%XutKSV#`rK(YN8tZVg^
> zW%EnR^=a+yDeay;_l{4S_oeS2c_98^^r77k-|@)6zMYST_6KKrW;-9#A8(s$J<xK{
> zduYQG>kc<R*>t4gsk)=JPgg%v`K<d`=kfOE^b=d3Z+qdUldUgqeyQb@?`7{Ro>w=#
> zw*K{XZ(Nsee)F2Qn%-`Fr{VO~@7BF{)tTC}E8nmFV8w@(A60zpK1ch3=6eiFD;9Z&
> zIrnTu7Td#90CVo@WmKPYH!)6GwpF;{$iB+5<=y1tZ^uU_k&TRjM*Wp%#x}PkeCbWb
> zs4wj`!c-gbrF}+}9+QbkHbeT!#8505iJ_wxgZ@EWxER8-PB#~>uAGx%y$gi@iuH^6
> zfb1?PFYs%zKW0h}mBZk|)1#NvyP*{Cx$p!FUpl(MaVrYnonrlR=#hi%Ft{AN<xpck
> zRnDeWr|r9>1aH}EeVPB9fu;PfL<bG~QS(gupY&;kkbG8$i{C52{_}L;9CAC>OY!Rv
> z>WN=fzMN#e%HR80ukz?o)~h_7XT8ezpRiu#Z-_*~og>+}&y#}YaWFb>>-BHn)&WMS
> zZ%0R<b5~!$K)Slc-yJY^`rCs616dEh^G2Y@=<4%t4;Ve2ePDD4ceMM1#*VJ8{=iOg
> zbkH1=ZYicLMa0GYTEwN?Q-P`-tX$9$u>*Lr6QgE$5Yf!o7?)ZyWyZi0ok)g96A`O|
> zzKCHn44&a+&Jz!3<F?++*qX6eCYwkliyB50Jh8YjlnIZ<jCd41r3D@{Hg1B)A`eg4
> zG&708oQWTh|19;`1AXJ@dq*PtAxPZs6!kc-MI&u(*{-tx1-<-zu)d?{C-(*7RT8>S
> z&|OQ$7d{gFikwhnjuKDjiiFM)4I$&pxe*k9@+FbBAbrn>LS%foKME30lSuy(CwU<I
> z?|7G!_yP~IgHFLHYP_ulXlI+m3ttM#eN_B8ozjGxv9{nCUwBn;C40*FGLGP_Xs5fW
> zw1s~K<^9$C%LIsjXigHZ{!aL}{X=&UXT0#a;Eys8qvT)IcX7PXtMHwm%wPOv-K0H@
> z70gXq+Jf@?sY4WuYW|&bce>_zLdQ5U^nIW^ugt%Wo#oEzjHP;re^7j_7}W7=&@OB1
> QbiILp&>V6qv98Ad4M&HUy8r+H
>
> literal 0
> HcmV?d00001
>
> diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S
> new file mode 100644
> index 0000000000..70a4f710db
> --- /dev/null
> +++ b/linux-user/riscv/vdso.S
> @@ -0,0 +1,186 @@
> +/*
> + * RISC-V linux replacement vdso.
> + *
> + * Copyright 2021 Linaro, Ltd.
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include <asm/unistd.h>
> +#include <asm/errno.h>
> +
> +#if __riscv_xlen == 32
> +# define TARGET_ABI32
> +#endif
> +#include "vdso-asmoffset.h"
> +
> + .text
> +
> +.macro endf name
> + .globl \name
> + .type \name, @function
> + .size \name, . - \name
> +.endm
> +
> +.macro raw_syscall nr
> + li a7, \nr
> + ecall
> +.endm
> +
> +.macro vdso_syscall name, nr
> +\name:
> + raw_syscall \nr
> +endf \name
> +.endm
> +
> +__vdso_gettimeofday:
> + .cfi_startproc
> +#ifdef __NR_gettimeofday
> + raw_syscall __NR_gettimeofday
> + ret
> +#else
> + /* No gettimeofday, fall back to clock_gettime64. */
> + beq a1, zero, 1f
> + sw zero, 0(a1) /* tz->tz_minuteswest = 0 */
> + sw zero, 4(a1) /* tz->tz_dsttime = 0 */
> +1: addi sp, sp, -32
> + .cfi_adjust_cfa_offset 32
> + sw a0, 16(sp) /* save tv */
> + mv a0, sp
> + raw_syscall __NR_clock_gettime64
> + lw t0, 0(sp) /* timespec.tv_sec.low */
> + lw t1, 4(sp) /* timespec.tv_sec.high */
> + lw t2, 8(sp) /* timespec.tv_nsec.low */
> + lw a1, 16(sp) /* restore tv */
> + addi sp, sp, 32
> + .cfi_adjust_cfa_offset -32
> + bne a0, zero, 9f /* syscall error? */
> + li a0, -EOVERFLOW
> + bne t1, zero, 9f /* y2038? */
> + li a0, 0
> + li t3, 1000
> + divu t2, t2, t3 /* nsec -> usec */
> + sw t0, 0(a1) /* tz->tv_sec */
> + sw t2, 4(a1) /* tz->tv_usec */
> +9: ret
> +#endif
> + .cfi_endproc
> +endf __vdso_gettimeofday
> +
> + .cfi_startproc
> +
> +#ifdef __NR_clock_gettime
> +vdso_syscall __vdso_clock_gettime, __NR_clock_gettime
> +#else
> +vdso_syscall __vdso_clock_gettime, __NR_clock_gettime64
> +#endif
> +
> +#ifdef __NR_clock_getres
> +vdso_syscall __vdso_clock_getres, __NR_clock_getres
> +#else
> +vdso_syscall __vdso_clock_getres, __NR_clock_getres_time64
> +#endif
> +
> +vdso_syscall __vdso_getcpu, __NR_getcpu
> +
> +__vdso_flush_icache:
> + /* qemu does not need to flush the icache */
> + li a0, 0
> + ret
> +endf __vdso_flush_icache
> +
> + .cfi_endproc
> +
> +/*
> + * Start the unwind info at least one instruction before the signal
> + * trampoline, because the unwinder will assume we are returning
> + * after a call site.
> + */
> +
> + .cfi_startproc simple
> + .cfi_signal_frame
> +
> +#define sizeof_reg (__riscv_xlen / 4)
> +#define sizeof_freg 8
> +#define B_GR (offsetof_uc_mcontext - sizeof_rt_sigframe)
> +#define B_FR (offsetof_uc_mcontext - sizeof_rt_sigframe + offsetof_freg0)
> +
> + .cfi_def_cfa 2, sizeof_rt_sigframe
> +
> + /* Return address */
> + .cfi_return_column 64
> + .cfi_offset 64, B_GR + 0 /* pc */
> +
> + /* Integer registers */
> + .cfi_offset 1, B_GR + 1 * sizeof_reg /* r1 (ra) */
> + .cfi_offset 2, B_GR + 2 * sizeof_reg /* r2 (sp) */
> + .cfi_offset 3, B_GR + 3 * sizeof_reg
> + .cfi_offset 4, B_GR + 4 * sizeof_reg
> + .cfi_offset 5, B_GR + 5 * sizeof_reg
> + .cfi_offset 6, B_GR + 6 * sizeof_reg
> + .cfi_offset 7, B_GR + 7 * sizeof_reg
> + .cfi_offset 8, B_GR + 8 * sizeof_reg
> + .cfi_offset 9, B_GR + 9 * sizeof_reg
> + .cfi_offset 10, B_GR + 10 * sizeof_reg
> + .cfi_offset 11, B_GR + 11 * sizeof_reg
> + .cfi_offset 12, B_GR + 12 * sizeof_reg
> + .cfi_offset 13, B_GR + 13 * sizeof_reg
> + .cfi_offset 14, B_GR + 14 * sizeof_reg
> + .cfi_offset 15, B_GR + 15 * sizeof_reg
> + .cfi_offset 16, B_GR + 16 * sizeof_reg
> + .cfi_offset 17, B_GR + 17 * sizeof_reg
> + .cfi_offset 18, B_GR + 18 * sizeof_reg
> + .cfi_offset 19, B_GR + 19 * sizeof_reg
> + .cfi_offset 20, B_GR + 20 * sizeof_reg
> + .cfi_offset 21, B_GR + 21 * sizeof_reg
> + .cfi_offset 22, B_GR + 22 * sizeof_reg
> + .cfi_offset 23, B_GR + 23 * sizeof_reg
> + .cfi_offset 24, B_GR + 24 * sizeof_reg
> + .cfi_offset 25, B_GR + 25 * sizeof_reg
> + .cfi_offset 26, B_GR + 26 * sizeof_reg
> + .cfi_offset 27, B_GR + 27 * sizeof_reg
> + .cfi_offset 28, B_GR + 28 * sizeof_reg
> + .cfi_offset 29, B_GR + 29 * sizeof_reg
> + .cfi_offset 30, B_GR + 30 * sizeof_reg
> + .cfi_offset 31, B_GR + 31 * sizeof_reg /* r31 */
> +
> + .cfi_offset 32, B_FR + 0 /* f0 */
> + .cfi_offset 33, B_FR + 1 * sizeof_freg /* f1 */
> + .cfi_offset 34, B_FR + 2 * sizeof_freg
> + .cfi_offset 35, B_FR + 3 * sizeof_freg
> + .cfi_offset 36, B_FR + 4 * sizeof_freg
> + .cfi_offset 37, B_FR + 5 * sizeof_freg
> + .cfi_offset 38, B_FR + 6 * sizeof_freg
> + .cfi_offset 39, B_FR + 7 * sizeof_freg
> + .cfi_offset 40, B_FR + 8 * sizeof_freg
> + .cfi_offset 41, B_FR + 9 * sizeof_freg
> + .cfi_offset 42, B_FR + 10 * sizeof_freg
> + .cfi_offset 43, B_FR + 11 * sizeof_freg
> + .cfi_offset 44, B_FR + 12 * sizeof_freg
> + .cfi_offset 45, B_FR + 13 * sizeof_freg
> + .cfi_offset 46, B_FR + 14 * sizeof_freg
> + .cfi_offset 47, B_FR + 15 * sizeof_freg
> + .cfi_offset 48, B_FR + 16 * sizeof_freg
> + .cfi_offset 49, B_FR + 17 * sizeof_freg
> + .cfi_offset 50, B_FR + 18 * sizeof_freg
> + .cfi_offset 51, B_FR + 19 * sizeof_freg
> + .cfi_offset 52, B_FR + 20 * sizeof_freg
> + .cfi_offset 53, B_FR + 21 * sizeof_freg
> + .cfi_offset 54, B_FR + 22 * sizeof_freg
> + .cfi_offset 55, B_FR + 23 * sizeof_freg
> + .cfi_offset 56, B_FR + 24 * sizeof_freg
> + .cfi_offset 57, B_FR + 25 * sizeof_freg
> + .cfi_offset 58, B_FR + 26 * sizeof_freg
> + .cfi_offset 59, B_FR + 27 * sizeof_freg
> + .cfi_offset 60, B_FR + 28 * sizeof_freg
> + .cfi_offset 61, B_FR + 29 * sizeof_freg
> + .cfi_offset 62, B_FR + 30 * sizeof_freg
> + .cfi_offset 63, B_FR + 31 * sizeof_freg /* f31 */
> +
> + nop
> +
> +__vdso_rt_sigreturn:
> + raw_syscall __NR_rt_sigreturn
> +endf __vdso_rt_sigreturn
> +
> + .cfi_endproc
> diff --git a/linux-user/riscv/vdso.ld b/linux-user/riscv/vdso.ld
> new file mode 100644
> index 0000000000..aabe2b0ab3
> --- /dev/null
> +++ b/linux-user/riscv/vdso.ld
> @@ -0,0 +1,74 @@
> +/*
> + * Linker script for linux riscv replacement vdso.
> + *
> + * Copyright 2021 Linaro, Ltd.
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +VERSION {
> + LINUX_4.15 {
> + global:
> + __vdso_rt_sigreturn;
> + __vdso_gettimeofday;
> + __vdso_clock_gettime;
> + __vdso_clock_getres;
> + __vdso_getcpu;
> + __vdso_flush_icache;
> +
> + local: *;
> + };
> +}
> +
> +
> +PHDRS {
> + phdr PT_PHDR FLAGS(4) PHDRS;
> + load PT_LOAD FLAGS(7) FILEHDR PHDRS;
> + dynamic PT_DYNAMIC FLAGS(4);
> + eh_frame_hdr PT_GNU_EH_FRAME;
> + note PT_NOTE FLAGS(4);
> +}
> +
> +SECTIONS {
> + /*
> + * We can't prelink to any address without knowing something about
> + * the virtual memory space of the host, since that leaks over into
> + * the available memory space of the guest.
> + */
> + . = 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 =0xd503201f
> +}
> --
> 2.34.1
>
>
^ permalink raw reply [flat|nested] 43+ messages in thread
end of thread, other threads:[~2023-09-19 4:48 UTC | newest]
Thread overview: 43+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-29 22:02 [PATCH v5 00/20] linux-user: Implement VDSOs Richard Henderson
2023-08-29 22:02 ` [PATCH v5 01/20] tests/docker: Update docker-loongarch-cross toolchain Richard Henderson
2023-08-30 9:43 ` gaosong
2023-09-04 14:02 ` Alex Bennée
2023-09-04 23:08 ` Richard Henderson
2023-09-05 9:23 ` Alex Bennée
2023-08-29 22:02 ` [PATCH v5 02/20] linux-user: Introduce imgsrc_read, imgsrc_read_alloc Richard Henderson
2023-09-04 14:27 ` Alex Bennée
2023-08-29 22:02 ` [PATCH v5 03/20] linux-user: Tidy loader_exec Richard Henderson
2023-09-04 14:54 ` Alex Bennée
2023-08-29 22:02 ` [PATCH v5 04/20] linux-user: Do not clobber bprm_buf swapping ehdr Richard Henderson
2023-09-04 14:58 ` Alex Bennée
2023-08-29 22:02 ` [PATCH v5 05/20] linux-user: Use ImageSource in load_elf_image Richard Henderson
2023-08-29 22:02 ` [PATCH v5 06/20] linux-user: Use ImageSource in load_symbols Richard Henderson
2023-08-29 22:02 ` [PATCH v5 07/20] linux-user: Replace bprm->fd with bprm->src.fd Richard Henderson
2023-08-29 22:02 ` [PATCH v5 08/20] linux-user: Load vdso image if available Richard Henderson
2023-08-30 14:22 ` Philippe Mathieu-Daudé
2023-08-30 16:17 ` Richard Henderson
2023-08-30 20:56 ` Philippe Mathieu-Daudé
2023-08-30 22:08 ` Richard Henderson
2023-08-29 22:02 ` [PATCH v5 09/20] linux-user: Add gen-vdso tool Richard Henderson
2023-08-29 22:02 ` [PATCH v5 10/20] linux-user: Add build-vdso.sh tool Richard Henderson
2023-08-29 22:02 ` [PATCH v5 11/20] linux-user/i386: Add vdso Richard Henderson
2023-08-29 22:02 ` [PATCH v5 12/20] linux-user/x86_64: " Richard Henderson
2023-08-29 22:02 ` [PATCH v5 13/20] linux-user/aarch64: " Richard Henderson
2023-08-29 22:02 ` [PATCH v5 14/20] linux-user/arm: " Richard Henderson
2023-08-29 22:02 ` [PATCH v5 15/20] linux-user/hppa: " Richard Henderson
2023-08-29 22:02 ` [PATCH v5 16/20] linux-user/riscv: " Richard Henderson
2023-09-19 4:47 ` Alistair Francis
2023-08-29 22:02 ` [PATCH v5 17/20] linux-user/loongarch64: " Richard Henderson
2023-08-29 22:02 ` [PATCH v5 18/20] linux-user/ppc: " Richard Henderson
2023-08-29 22:02 ` [PATCH v5 19/20] linux-user/s390x: Rename __SIGNAL_FRAMESIZE to STACK_FRAME_OVERHEAD Richard Henderson
2023-08-30 14:14 ` Philippe Mathieu-Daudé
2023-08-29 22:02 ` [PATCH v5 20/20] linux-user/s390x: Add vdso Richard Henderson
2023-09-04 15:00 ` Alex Bennée
2023-09-06 17:56 ` Richard Henderson
2023-09-07 6:17 ` Philippe Mathieu-Daudé
2023-09-07 9:20 ` Alex Bennée
2023-08-30 14:52 ` [PATCH v5 00/20] linux-user: Implement VDSOs Helge Deller
2023-08-30 16:20 ` Richard Henderson
2023-08-31 7:57 ` Alex Bennée
2023-09-01 14:21 ` Helge Deller
2023-09-04 12:51 ` Alex Bennée
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).