Message ID | 20230829220228.928506-21-richard.henderson@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux-user: Implement VDSOs | expand |
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
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~
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).
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~
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
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 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