Re: [PULL 15/21] linux-user/riscv: Add vdso
On 1/13/24 11:22, Vineet Gupta wrote: Now we just need to debug what in the vdso call frame information is wrong and any pointers to debug that would be appreciated, even if you are able to fix it right away ;-) The only way is to step through uw_frame_state_for() in libgcc and figure out what's wrong with the unwind information. Probably with a simultaneous debugging of setup_rt_frame() in qemu in order to compare addresses. I thought I had enough _Static_asserts added so that any mistakes would be caught at compile time, but obviously not. I'll have a look. r~
Re: [PULL 15/21] linux-user/riscv: Add vdso
On 1/12/24 16:05, Richard Henderson wrote: So by default qemu ships the vdso binary. How can one rebuild it ? From skimming the build files it seems following ought to do it make update-linux-vdso with a prior configure cmd like below with PATH pointing to the cross compiler. ../configure --target-list=riscv64-linux-user --cross-cc-riscv64=riscv64-unknown-linux-gnu-gcc >>> Yes, that should do it. >>> But it doesn't, I'm sure we are missing something basis here. >>> Do you get an error message? >>> Did $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak get created >>> properly? >> It was indeed, but invoking make wasn't doing anything. > Odd. It Just Works here... > > What do you have in the "Cross compilers" section of the configure output? > > I would expect '--cross-prefix-riscv64=...' to be a better option that just > gcc. And if > you have it installed as "riscv64-linux-gnu-", I would not expect you to need > to provide > any configure option at all -- it should be auto-detected. This is really embarrassing but indeed build is working now. I swear Edwin and I spent over several hours fighting the build and getting nowhere. I also see how the vdso binary is subsumed into elfload.c so all of that is good. Sorry for the noise But not everything was a snafu. The gcc testsuite cleanup* failure issue remains. I applied the reg_size fix and that doesn't cure the cleanup failures. Reverting the riscv vdso change, does fix them. 2021-07-06 468c1bb5cac9 linux-user/riscv: Add vdso Now we just need to debug what in the vdso call frame information is wrong and any pointers to debug that would be appreciated, even if you are able to fix it right away ;-) Thx, -Vineet
Re: [PULL 15/21] linux-user/riscv: Add vdso
On 1/13/24 10:37, Vineet Gupta wrote: On 1/12/24 13:35, Richard Henderson wrote: On 1/12/24 08:49, Vineet Gupta wrote: Hi Richard, Alistair On 10/30/23 14:17, Richard Henderson wrote: diff --git a/linux-user/riscv/Makefile.vdso b/linux-user/riscv/Makefile.vdso new file mode 100644 index 00..2c257dbfda --- /dev/null +++ b/linux-user/riscv/Makefile.vdso @@ -0,0 +1,15 @@ +include $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak + +SUBDIR = $(SRC_PATH)/linux-user/riscv +VPATH += $(SUBDIR) + +all: $(SUBDIR)/vdso-32.so $(SUBDIR)/vdso-64.so + +LDFLAGS = -nostdlib -shared -fpic -Wl,-h,linux-vdso.so.1 -Wl,--build-id=sha1 \ + -Wl,--hash-style=both -Wl,-T,$(SUBDIR)/vdso.ld + +$(SUBDIR)/vdso-32.so: vdso.S vdso.ld vdso-asmoffset.h + $(CC) -o $@ $(LDFLAGS) -mabi=ilp32d -march=rv32g $< + +$(SUBDIR)/vdso-64.so: vdso.S vdso.ld vdso-asmoffset.h + $(CC) -o $@ $(LDFLAGS) -mabi=lp64d -march=rv64g $< So by default qemu ships the vdso binary. How can one rebuild it ? From skimming the build files it seems following ought to do it make update-linux-vdso with a prior configure cmd like below with PATH pointing to the cross compiler. ../configure --target-list=riscv64-linux-user --cross-cc-riscv64=riscv64-unknown-linux-gnu-gcc Yes, that should do it. But it doesn't, I'm sure we are missing something basis here. Do you get an error message? Did $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak get created properly? It was indeed, but invoking make wasn't doing anything. Odd. It Just Works here... What do you have in the "Cross compilers" section of the configure output? I would expect '--cross-prefix-riscv64=...' to be a better option that just gcc. And if you have it installed as "riscv64-linux-gnu-", I would not expect you to need to provide any configure option at all -- it should be auto-detected.
Re: [PULL 15/21] linux-user/riscv: Add vdso
On 1/12/24 15:37, Vineet Gupta wrote: > Now if only I could rebuild vdso/qemu with the revert of following and > the reg size change. > 2021-07-06 468c1bb5cac9 linux-user/riscv: Add vdso And is there way to debug qemu internals in this regard, like a developer toggle on steroids or something. -d in_asm,cpu,exec -dfilter etc show that app is taking different code path, but not why.
Re: [PULL 15/21] linux-user/riscv: Add vdso
On 1/12/24 13:35, Richard Henderson wrote: > On 1/12/24 08:49, Vineet Gupta wrote: >> Hi Richard, Alistair >> >> On 10/30/23 14:17, Richard Henderson wrote: >>> diff --git a/linux-user/riscv/Makefile.vdso b/linux-user/riscv/Makefile.vdso >>> new file mode 100644 >>> index 00..2c257dbfda >>> --- /dev/null >>> +++ b/linux-user/riscv/Makefile.vdso >>> @@ -0,0 +1,15 @@ >>> +include $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak >>> + >>> +SUBDIR = $(SRC_PATH)/linux-user/riscv >>> +VPATH += $(SUBDIR) >>> + >>> +all: $(SUBDIR)/vdso-32.so $(SUBDIR)/vdso-64.so >>> + >>> +LDFLAGS = -nostdlib -shared -fpic -Wl,-h,linux-vdso.so.1 >>> -Wl,--build-id=sha1 \ >>> + -Wl,--hash-style=both -Wl,-T,$(SUBDIR)/vdso.ld >>> + >>> +$(SUBDIR)/vdso-32.so: vdso.S vdso.ld vdso-asmoffset.h >>> + $(CC) -o $@ $(LDFLAGS) -mabi=ilp32d -march=rv32g $< >>> + >>> +$(SUBDIR)/vdso-64.so: vdso.S vdso.ld vdso-asmoffset.h >>> + $(CC) -o $@ $(LDFLAGS) -mabi=lp64d -march=rv64g $< >> So by default qemu ships the vdso binary. How can one rebuild it ? >> >> From skimming the build files it seems following ought to do it >> make update-linux-vdso >> >> with a prior configure cmd like below with PATH pointing to the cross >> compiler. >> ../configure --target-list=riscv64-linux-user >> --cross-cc-riscv64=riscv64-unknown-linux-gnu-gcc > Yes, that should do it. > >> But it doesn't, I'm sure we are missing something basis here. > Do you get an error message? > Did $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak get created > properly? It was indeed, but invoking make wasn't doing anything. Weirdly enought, after (yet another) clean rebuild the vdso does seem to build. So the vdso is subsumed into the qemu binary ? I mean do we need to rebuild qemu after the vdso rebuild. Something in the build dependency is off for sure. Sorry but do u have a cmdline for dummies to rebuild vdso and then qemu. Thing is something is definitely off with 8.2. With 2 setups of riscv-gnu-toolchain and everything being same except for qemu (v8.2 and v8.1.2) we see 4 additional failures in gcc testsuite. These all pertain to unwinding off signal stack = Summary of gcc testsuite = | # of unexpected case/ # of unique unexpected case | gcc | g++ | gfortran | rv64imafdc_zba_zbb_zbs_zicond/ lp64d/ medlow | 40 /19 | 23 / 8 | 72 /12 | # v8.2 rv64imafdc_zba_zbb_zbs_zicond/ lp64d/ medlow | 36 /15 |7 / 4 | - | # v8.1.2 FAIL: gcc.dg/cleanup-10.c execution test FAIL: gcc.dg/cleanup-11.c execution test FAIL: gcc.dg/cleanup-8.c execution test FAIL: gcc.dg/cleanup-9.c execution test Now if only I could rebuild vdso/qemu with the revert of following and the reg size change. 2021-07-06 468c1bb5cac9 linux-user/riscv: Add vdso > >> For starters we saw something that seems like a thinko in >> >> diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S >> -#define sizeof_reg (__riscv_xlen / 4) >> +#define sizeof_reg (__riscv_xlen / 8) > Oops. Thx for taking care of that. >> As as aside, we also see that rt_sigreturn in kernel vdso elides the >> explicit the call frame information. Again we naively don't know if that >> is required in qemu. >> >> .text >> ENTRY(__vdso_rt_sigreturn) >> .cfi_startproc >> .cfi_signal_frame >> li a7, __NR_rt_sigreturn >> ecall >> .cfi_endproc >> ENDPROC(__vdso_rt_sigreturn) > Perhaps it's not required, no. But I'd consider the lack of info from the > kernel to be a > bug. Lack of it means places like gcc have to have special cases.
Re: [PULL 15/21] linux-user/riscv: Add vdso
On Fri, 12 Jan 2024 13:35:39 PST (-0800), Richard Henderson wrote: > On 1/12/24 08:49, Vineet Gupta wrote: >> Hi Richard, Alistair >> >> On 10/30/23 14:17, Richard Henderson wrote: >>> diff --git a/linux-user/riscv/Makefile.vdso b/linux-user/riscv/Makefile.vdso >>> new file mode 100644 >>> index 00..2c257dbfda >>> --- /dev/null >>> +++ b/linux-user/riscv/Makefile.vdso >>> @@ -0,0 +1,15 @@ >>> +include $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak >>> + >>> +SUBDIR = $(SRC_PATH)/linux-user/riscv >>> +VPATH += $(SUBDIR) >>> + >>> +all: $(SUBDIR)/vdso-32.so $(SUBDIR)/vdso-64.so >>> + >>> +LDFLAGS = -nostdlib -shared -fpic -Wl,-h,linux-vdso.so.1 >>> -Wl,--build-id=sha1 \ >>> + -Wl,--hash-style=both -Wl,-T,$(SUBDIR)/vdso.ld >>> + >>> +$(SUBDIR)/vdso-32.so: vdso.S vdso.ld vdso-asmoffset.h >>> + $(CC) -o $@ $(LDFLAGS) -mabi=ilp32d -march=rv32g $< >>> + >>> +$(SUBDIR)/vdso-64.so: vdso.S vdso.ld vdso-asmoffset.h >>> + $(CC) -o $@ $(LDFLAGS) -mabi=lp64d -march=rv64g $< >> >> So by default qemu ships the vdso binary. How can one rebuild it ? >> >> From skimming the build files it seems following ought to do it >>    make update-linux-vdso >> >> with a prior configure cmd like below with PATH pointing to the cross >> compiler. >> ../configure --target-list=riscv64-linux-user >> --cross-cc-riscv64=riscv64-unknown-linux-gnu-gcc > > Yes, that should do it. > >> But it doesn't, I'm sure we are missing something basis here. > > Do you get an error message? > Did $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak get created > properly? > >> For starters we saw something that seems like a thinko in >> >> diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S >> -#define sizeof_reg    (__riscv_xlen / 4) >> +#define sizeof_reg    (__riscv_xlen / 8) > > Oops. > >> As as aside, we also see that rt_sigreturn in kernel vdso elides the >> explicit the call frame information. Again we naively don't know if that >> is required in qemu. >> >>    .text >> ENTRY(__vdso_rt_sigreturn) >>    .cfi_startproc >>    .cfi_signal_frame >>    li a7, __NR_rt_sigreturn >>    ecall >>    .cfi_endproc >> ENDPROC(__vdso_rt_sigreturn) > > Perhaps it's not required, no. But I'd consider the lack of info from the > kernel to be a > bug. Lack of it means places like gcc have to have special cases. Ya, I agree. We've tried to avoid too many RISC-V-specific hacks for this, but it's bitten me a few times in embedded codebases and it's always a headache. Reviewed-by: Palmer Dabbelt Thanks! Looks like we've got essentially the same thing in Linux already, so I think we're safe over there. > > > > r~ > > -- > You received this message because you are subscribed to the Google Groups > "gnu-toolchain" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to gnu-toolchain+unsubscr...@rivosinc.com. > To view this discussion on the web visit > https://groups.google.com/a/rivosinc.com/d/msgid/gnu-toolchain/119848b9-0cd7-4d33-bc43-385c86069388%40linaro.org. > For more options, visit https://groups.google.com/a/rivosinc.com/d/optout.
Re: [PULL 15/21] linux-user/riscv: Add vdso
On 1/12/24 08:49, Vineet Gupta wrote: Hi Richard, Alistair On 10/30/23 14:17, Richard Henderson wrote: diff --git a/linux-user/riscv/Makefile.vdso b/linux-user/riscv/Makefile.vdso new file mode 100644 index 00..2c257dbfda --- /dev/null +++ b/linux-user/riscv/Makefile.vdso @@ -0,0 +1,15 @@ +include $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak + +SUBDIR = $(SRC_PATH)/linux-user/riscv +VPATH += $(SUBDIR) + +all: $(SUBDIR)/vdso-32.so $(SUBDIR)/vdso-64.so + +LDFLAGS = -nostdlib -shared -fpic -Wl,-h,linux-vdso.so.1 -Wl,--build-id=sha1 \ + -Wl,--hash-style=both -Wl,-T,$(SUBDIR)/vdso.ld + +$(SUBDIR)/vdso-32.so: vdso.S vdso.ld vdso-asmoffset.h + $(CC) -o $@ $(LDFLAGS) -mabi=ilp32d -march=rv32g $< + +$(SUBDIR)/vdso-64.so: vdso.S vdso.ld vdso-asmoffset.h + $(CC) -o $@ $(LDFLAGS) -mabi=lp64d -march=rv64g $< So by default qemu ships the vdso binary. How can one rebuild it ? From skimming the build files it seems following ought to do it make update-linux-vdso with a prior configure cmd like below with PATH pointing to the cross compiler. ../configure --target-list=riscv64-linux-user --cross-cc-riscv64=riscv64-unknown-linux-gnu-gcc Yes, that should do it. But it doesn't, I'm sure we are missing something basis here. Do you get an error message? Did $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak get created properly? For starters we saw something that seems like a thinko in diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S -#define sizeof_reg (__riscv_xlen / 4) +#define sizeof_reg (__riscv_xlen / 8) Oops. As as aside, we also see that rt_sigreturn in kernel vdso elides the explicit the call frame information. Again we naively don't know if that is required in qemu. .text ENTRY(__vdso_rt_sigreturn) .cfi_startproc .cfi_signal_frame li a7, __NR_rt_sigreturn ecall .cfi_endproc ENDPROC(__vdso_rt_sigreturn) Perhaps it's not required, no. But I'd consider the lack of info from the kernel to be a bug. Lack of it means places like gcc have to have special cases. r~
Re: [PULL 15/21] linux-user/riscv: Add vdso
Hi Richard, Alistair On 10/30/23 14:17, Richard Henderson wrote: > diff --git a/linux-user/riscv/Makefile.vdso b/linux-user/riscv/Makefile.vdso > new file mode 100644 > index 00..2c257dbfda > --- /dev/null > +++ b/linux-user/riscv/Makefile.vdso > @@ -0,0 +1,15 @@ > +include $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak > + > +SUBDIR = $(SRC_PATH)/linux-user/riscv > +VPATH += $(SUBDIR) > + > +all: $(SUBDIR)/vdso-32.so $(SUBDIR)/vdso-64.so > + > +LDFLAGS = -nostdlib -shared -fpic -Wl,-h,linux-vdso.so.1 -Wl,--build-id=sha1 > \ > + -Wl,--hash-style=both -Wl,-T,$(SUBDIR)/vdso.ld > + > +$(SUBDIR)/vdso-32.so: vdso.S vdso.ld vdso-asmoffset.h > + $(CC) -o $@ $(LDFLAGS) -mabi=ilp32d -march=rv32g $< > + > +$(SUBDIR)/vdso-64.so: vdso.S vdso.ld vdso-asmoffset.h > + $(CC) -o $@ $(LDFLAGS) -mabi=lp64d -march=rv64g $< So by default qemu ships the vdso binary. How can one rebuild it ? >From skimming the build files it seems following ought to do it make update-linux-vdso with a prior configure cmd like below with PATH pointing to the cross compiler. ../configure --target-list=riscv64-linux-user --cross-cc-riscv64=riscv64-unknown-linux-gnu-gcc But it doesn't, I'm sure we are missing something basis here. The reason for trying to rebuild is, Edwin ran into an issue running gcc testsuite for RISC-V. TEst such as gcc/testsuite/gcc.dg/cleanup-10.c segv with new QEMU (with exact same test binary) With QEMU 8.1.2 it runs fine (exit code 0) but with 8.2 it segv (exit code 134). This is because it can't unwind out of signal stack and force_unwind abort()s. Edwin bisected this to following QEMU commit, 2021-07-06 468c1bb5cac9 linux-user/riscv: Add vdso which kind of makes sense since this changes the rt_sigreturn trampoline and associated unwinding stuff. For starters we saw something that seems like a thinko in diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S -#define sizeof_reg (__riscv_xlen / 4) +#define sizeof_reg (__riscv_xlen / 8) And wanted to see if that fixes it but can't really coax the build system to rebuild the vdso as described above. As as aside, we also see that rt_sigreturn in kernel vdso elides the explicit the call frame information. Again we naively don't know if that is required in qemu. .text ENTRY(__vdso_rt_sigreturn) .cfi_startproc .cfi_signal_frame li a7, __NR_rt_sigreturn ecall .cfi_endproc ENDPROC(__vdso_rt_sigreturn) Would appreicate any answers and pointers. Thx, > diff --git a/linux-user/riscv/meson.build b/linux-user/riscv/meson.build > new file mode 100644 > index 00..beb989a7ca > --- /dev/null > +++ b/linux-user/riscv/meson.build > @@ -0,0 +1,7 @@ > +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 > ..1ad1e5c8b1fe36b0fe4bcb6c06fab8219ecd > GIT binary patch > literal 2900 > zcmb_eTWl0n7(TPZVyUHWDVSm#Q)tBoakE`3X|QQ_x7~7aX*Y!`UgC5+yX~&9yUp%w > zLmR@yBHoaTR0Kq&poogPiZ>L6L=zLABtH4zgAYa%jnRm{h}7?!nX^o_4?g&}-~Q*n > z%s=PM`Oi1AEgb1m6h%l;#cx7dEpVPL6Ji#0i>Mc~MU$u!9%$NEaRFn3d4wv&aH|^w > zTRLpb7;DS=wp%clxP}go5H6@1BuN~CP00Gu?~M2%+(e=gF+#?vFF7z%d_LkRAy#(x > ziH@zeoN%Z87eg1Tzxkm)cKE@*AHS_c%m7%c6BGLV%2aj>G?#S_n$Mt!IhI531+E1! > zb!!dKcx z_D*OiRpQsFei%N)IbX&XFzCpSz-)BH+hNx@;@l%HgX^T`9`e~Z1?i^n9( z1g}x5<}?R|$3vTWW zq|%A(U_3S|efp-XzEMX0<;*4W(ua%n;exaVHx=?pEv3iwWT|}4(DJFFT*4^iGGbFI > zQ`mefZ|lW>vxuzj?%SZXc$;s>gdwhJf9!SZZ}R-lbJ=rs0Q-uj8Vu zlv?$Udf0qM9wfFxC!wRz6VR9G2Po=TuTZuqO6^>iV4WJ^OMpEfqLuY=G&6I30BbFy > zA2MMnUcU|n0!nR#tLSzI;yVT&>K}h#=lu`gyKBQEcRjlPvEIj{Pjv5&Jh^7is=ZzN > zI`@a33LI#kXnT6a!PaM%A8I-5KjM4Vdvw`zOP_CgVac)1$ zT3+$L>U+(5dfDqs-)MSsNwM**#c$W2x$&L4cW-#F=KbqGn16QOhn|lr&sBU}{z=*S > z+2&l2Vs85Y_AN!< zm+o=9s@>5)^*R-~LR437Z$I z`hy|- zWcyUJJ1h>QOEpi4#W|L(nwbF}76{Kig zuIGuiIM&K1(}DX+aWbC8HPmWpr)bfhYp=kvXMt zJZSr2lk+Vp7hw$K`We4ZhM>u9gV0Xy8iVcR#yzl|T*jVra$ym+lRH0y?c_$G>(TsZ > zB(~9;6^)yP)_G5NaP8_2p+$RpI>McOy zt2%pywldNa3P!Y^uC8_A^)k^xD>li^#7r|0-*i5k#$9%$5;Zzlu;e3=3gOL zw2`xPQjRiNBO$!;(M&9z(#-*Kp<_l&c!x3tZ!(roT7DyEc}5bsd@7rnW@vHYO(eC! > zTr8c?l5u28OL&dMW ztdn8AgZR$kJCxnddVJ>-uHggF2 > z{; zrr`NvZC>O27K3SuT)P2F=8->$pX?kenYY!> vc~2SIg1ifGl4tmx!+P8|`R#(CDQ#Hj*V2HN^{Oz&eM_ > literal 0 > HcmV?d1 > > diff --git a/linux-user/riscv/vdso-64.so b/linux-user/riscv/vdso-64.so > new file mode 100755 > index > ..83992bebe6d0182f24edfffc531015fd2f4e1cfb > GIT binary patch > literal 3856 > zcmc&%>u*#=6hC(_g{2g1p%}2$6tfXRaI z(h#Xy-@LSlh@eFjU#RsBzS<8a68*wQ{R51AFh(W%#Ya77?>Woe=_Y*egQvasH*+2{ > zbI;8D
[PULL 15/21] linux-user/riscv: Add vdso
Acked-by: Alistair Francis Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Richard Henderson --- linux-user/riscv/vdso-asmoffset.h | 9 ++ linux-user/elfload.c | 2 + linux-user/riscv/signal.c | 8 ++ linux-user/meson.build| 1 + linux-user/riscv/Makefile.vdso| 15 +++ linux-user/riscv/meson.build | 7 ++ linux-user/riscv/vdso-32.so | Bin 0 -> 2900 bytes linux-user/riscv/vdso-64.so | Bin 0 -> 3856 bytes linux-user/riscv/vdso.S | 187 ++ linux-user/riscv/vdso.ld | 74 10 files changed, 303 insertions(+) create mode 100644 linux-user/riscv/vdso-asmoffset.h create mode 100644 linux-user/riscv/Makefile.vdso 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 00..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 3306651be5..e2d90b84a9 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -1892,8 +1892,10 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, #ifdef TARGET_RISCV32 #define ELF_CLASS ELFCLASS32 +#define VDSO_HEADER "vdso-32.c.inc" #else #define ELF_CLASS ELFCLASS64 +#define VDSO_HEADER "vdso-64.c.inc" #endif #define ELF_HWCAP get_elf_hwcap() diff --git a/linux-user/riscv/signal.c b/linux-user/riscv/signal.c index f989f7f51f..941eadce87 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 { abi_ulong uc_flags; abi_ptr 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 dd24389052..3ff3bc5bbc 100644 --- a/linux-user/meson.build +++ b/linux-user/meson.build @@ -45,6 +45,7 @@ subdir('microblaze') subdir('mips64') subdir('mips') subdir('ppc') +subdir('riscv') subdir('s390x') subdir('sh4') subdir('sparc') diff --git a/linux-user/riscv/Makefile.vdso b/linux-user/riscv/Makefile.vdso new file mode 100644 index 00..2c257dbfda --- /dev/null +++ b/linux-user/riscv/Makefile.vdso @@ -0,0 +1,15 @@ +include $(BUILD_DIR)/tests/tcg/riscv64-linux-user/config-target.mak + +SUBDIR = $(SRC_PATH)/linux-user/riscv +VPATH += $(SUBDIR) + +all: $(SUBDIR)/vdso-32.so $(SUBDIR)/vdso-64.so + +LDFLAGS = -nostdlib -shared -fpic -Wl,-h,linux-vdso.so.1 -Wl,--build-id=sha1 \ + -Wl,--hash-style=both -Wl,-T,$(SUBDIR)/vdso.ld + +$(SUBDIR)/vdso-32.so: vdso.S vdso.ld vdso-asmoffset.h + $(CC) -o $@ $(LDFLAGS) -mabi=ilp32d -march=rv32g $< + +$(SUBDIR)/vdso-64.so: vdso.S vdso.ld vdso-asmoffset.h + $(CC) -o $@ $(LDFLAGS) -mabi=lp64d -march=rv64g $< diff --git a/linux-user/riscv/meson.build b/linux-user/riscv/meson.build new file mode 100644 index 00..beb989a7ca --- /dev/null +++ b/linux-user/riscv/meson.build @@ -0,0 +1,7 @@ +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 ..1ad1e5c8b1fe36b0fe4bcb6c06fab8219ecd GIT binary patch literal 2900 zcmb_eTWl0n7(TPZVyUHWDVSm#Q)tBoakE`3X|QQ_x7~7aX*Y!`UgC5+yX~&9yUp%w zLmR@yBHoaTR0Kq&poogPiZ>L6L=zLABtH4zgAYa%j