qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: Richard Henderson <richard.henderson@linaro.org>, qemu-devel@nongnu.org
Cc: alex.bennee@linaro.org, laurent@vivier.eu,
	"Cédric Le Goater" <clg@kaod.org>,
	"Daniel Henrique Barboza" <danielhb413@gmail.com>,
	"Nicholas Piggin" <npiggin@gmail.com>
Subject: Re: [PATCH v6 16/19] linux-user/ppc: Add vdso
Date: Thu, 5 Oct 2023 18:35:42 +0200	[thread overview]
Message-ID: <bada7d9e-a369-7fd0-9e43-b46be863f0aa@linaro.org> (raw)
In-Reply-To: <20230930021529.987950-17-richard.henderson@linaro.org>

On 30/9/23 04:15, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>   linux-user/ppc/vdso-asmoffset.h |  20 +++
>   linux-user/elfload.c            |   8 ++
>   linux-user/ppc/signal.c         |  31 +++--
>   linux-user/gen-vdso-elfn.c.inc  |   7 +
>   linux-user/ppc/Makefile.vdso    |  20 +++
>   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, 467 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

Scratching my head for the CFA/CFI lines, so Cc'ing Nicholas, Daniel
and Cédric.

Do you mind adding a quick comment for the DT_PPC64_OPT change in
the description?

LGTM. To the best of my PPC knowledge,
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>

> 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 f41a57ebd5..4a2d21a1f9 100644
> --- a/linux-user/elfload.c
> +++ b/linux-user/elfload.c
> @@ -1187,6 +1187,14 @@ 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
> +# define VDSO_HEADER  "vdso-32.c.inc"
> +#elif TARGET_BIG_ENDIAN
> +# define VDSO_HEADER  "vdso-64.c.inc"
> +#else
> +# define VDSO_HEADER  "vdso-64le.c.inc"
> +#endif
> +
>   #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..3ca3c6b83e
> --- /dev/null
> +++ b/linux-user/ppc/Makefile.vdso
> @@ -0,0 +1,20 @@
> +include $(BUILD_DIR)/tests/tcg/ppc64-linux-user/config-target.mak
> +
> +SUBDIR = $(SRC_PATH)/linux-user/ppc
> +VPATH += $(SUBDIR)
> +
> +all: $(SUBDIR)/vdso-32.so $(SUBDIR)/vdso-64.so $(SUBDIR)/vdso-64le.so
> +
> +LDFLAGS32 = -nostdlib -shared -Wl,-T,$(SUBDIR)/vdso-32.ld \
> +            -Wl,-h,linux-vdso32.so.1 -Wl,--hash-style=both -Wl,--build-id=sha1
> +LDFLAGS64 = -nostdlib -shared -Wl,-T,$(SUBDIR)/vdso-64.ld \
> +            -Wl,-h,linux-vdso64.so.1 -Wl,--hash-style=both -Wl,--build-id=sha1
> +
> +$(SUBDIR)/vdso-32.so: vdso.S vdso-32.ld vdso-asmoffset.h
> +	$(CC) -o $@ $(LDFLAGS32) -m32 $<
> +
> +$(SUBDIR)/vdso-64.so: vdso.S vdso-64.ld vdso-asmoffset.h
> +	$(CC) -o $@ $(LDFLAGS64) -mbig-endian $<
> +
> +$(SUBDIR)/vdso-64le.so: vdso.S vdso-64.ld vdso-asmoffset.h
> +	$(CC) -o $@ $(LDFLAGS64) -mlittle-endian $<
> diff --git a/linux-user/ppc/meson.build b/linux-user/ppc/meson.build
> index 19fead7bc8..80cacae396 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')
>   }
> +
> +vdso_32_inc = gen_vdso.process('vdso-32.so', extra_args: [
> +                                   '-s', '__kernel_sigtramp32',
> +                                   '-r', '__kernel_sigtramp_rt32'
> +                               ])
> +linux_user_ss.add(when: 'TARGET_PPC', if_true: vdso_32_inc)
> +
> +vdso_64_inc = gen_vdso.process('vdso-64.so',
> +                               extra_args: ['-r', '__kernel_sigtramp_rt64'])
> +vdso_64le_inc = gen_vdso.process('vdso-64le.so',
> +                                 extra_args: ['-r', '__kernel_sigtramp_rt64'])
> +linux_user_ss.add(when: 'TARGET_PPC64', if_true: [vdso_64_inc, vdso_64le_inc])
> 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
> 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
> 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(&#4$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..689010db13
> --- /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



  reply	other threads:[~2023-10-05 16:36 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-30  2:15 [PATCH v6 00/19] linux-user: Implement VDSOs Richard Henderson
2023-09-30  2:15 ` [PATCH v6 01/19] linux-user: Introduce imgsrc_read, imgsrc_read_alloc Richard Henderson
2023-09-30  2:15 ` [PATCH v6 02/19] linux-user: Tidy loader_exec Richard Henderson
2023-09-30  2:15 ` [PATCH v6 03/19] linux-user: Do not clobber bprm_buf swapping ehdr Richard Henderson
2023-09-30  2:15 ` [PATCH v6 04/19] linux-user: Use ImageSource in load_elf_image Richard Henderson
2023-10-02 13:22   ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 05/19] linux-user: Use ImageSource in load_symbols Richard Henderson
2023-09-30  2:15 ` [PATCH v6 06/19] linux-user: Replace bprm->fd with bprm->src.fd Richard Henderson
2023-09-30  2:15 ` [PATCH v6 07/19] linux-user: Load vdso image if available Richard Henderson
2023-10-03 12:47   ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 08/19] linux-user: Add gen-vdso tool Richard Henderson
2023-10-03 13:00   ` Philippe Mathieu-Daudé
2023-10-03 23:05     ` Richard Henderson
2023-10-05 16:25       ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 09/19] linux-user/i386: Add vdso Richard Henderson
2023-10-05 16:42   ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 10/19] linux-user/x86_64: " Richard Henderson
2023-10-05 16:44   ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 11/19] linux-user/aarch64: " Richard Henderson
2023-10-05 16:47   ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 12/19] linux-user/arm: " Richard Henderson
2023-09-30  2:15 ` [PATCH v6 13/19] linux-user/hppa: " Richard Henderson
2023-10-05 16:16   ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 14/19] linux-user/riscv: " Richard Henderson
2023-10-05 16:24   ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 15/19] linux-user/loongarch64: " Richard Henderson
2023-10-05 16:18   ` Philippe Mathieu-Daudé
2023-09-30  2:15 ` [PATCH v6 16/19] linux-user/ppc: " Richard Henderson
2023-10-05 16:35   ` Philippe Mathieu-Daudé [this message]
2023-09-30  2:15 ` [PATCH v6 17/19] linux-user/s390x: Rename __SIGNAL_FRAMESIZE to STACK_FRAME_OVERHEAD Richard Henderson
2023-09-30  2:15 ` [PATCH v6 18/19] linux-user/s390x: Add vdso Richard Henderson
2023-10-03 13:07   ` Philippe Mathieu-Daudé
2023-10-03 23:01     ` Richard Henderson
2023-10-05 16:14       ` Philippe Mathieu-Daudé
2023-10-06  7:30         ` Thomas Huth
2023-09-30  2:15 ` [PATCH v6 19/19] build: Add update-linux-vdso makefile rule Richard Henderson
2023-10-03 13:02   ` Philippe Mathieu-Daudé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bada7d9e-a369-7fd0-9e43-b46be863f0aa@linaro.org \
    --to=philmd@linaro.org \
    --cc=alex.bennee@linaro.org \
    --cc=clg@kaod.org \
    --cc=danielhb413@gmail.com \
    --cc=laurent@vivier.eu \
    --cc=npiggin@gmail.com \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).