qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/4] linux-user: Add syscall dispatch support
@ 2025-09-04 10:23 Richard Henderson
  2025-09-04 10:23 ` [PATCH v4 1/4] linux-user: Create vdso_sigreturn_region_{start,end} Richard Henderson
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Richard Henderson @ 2025-09-04 10:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: floss

Hiya,

I have adjusted the signal return trampoline detection from

  https://lore.kernel.org/qemu-devel/20250711225226.14652-1-floss@arusekk.pl/

and tidied up a few other bits.  Would you please re-test this
versus your plan9 emulator?  Thanks,


r~


Arusekk (1):
  linux-user: Add syscall dispatch support

Richard Henderson (3):
  linux-user: Create vdso_sigreturn_region_{start,end}
  linux-user: Populate sigreturn_region_{start,end} in all vdso.S
  linux-user: Populate vdso_sigreturn_region_{start,end} from sigtramp
    page

 linux-user/loader.h            |   2 +
 linux-user/qemu.h              |   5 +++
 linux-user/signal-common.h     |   7 +++
 linux-user/syscall_defs.h      |   6 +++
 linux-user/elfload.c           |   7 +++
 linux-user/gen-vdso.c          |   6 +++
 linux-user/main.c              |   2 +
 linux-user/signal.c            |   2 +
 linux-user/syscall.c           |  76 ++++++++++++++++++++++++++++++++-
 linux-user/aarch64/vdso-be.so  | Bin 3224 -> 3320 bytes
 linux-user/aarch64/vdso-le.so  | Bin 3224 -> 3320 bytes
 linux-user/aarch64/vdso.S      |   2 +
 linux-user/arm/vdso-be32.so    | Bin 2648 -> 2724 bytes
 linux-user/arm/vdso-be8.so     | Bin 2648 -> 2724 bytes
 linux-user/arm/vdso-le.so      | Bin 2648 -> 2724 bytes
 linux-user/arm/vdso.S          |   2 +
 linux-user/gen-vdso-elfn.c.inc |   7 ++-
 linux-user/hppa/vdso.S         |   2 +
 linux-user/hppa/vdso.so        | Bin 2104 -> 2224 bytes
 linux-user/i386/vdso.S         |   2 +
 linux-user/i386/vdso.so        | Bin 2672 -> 2792 bytes
 linux-user/loongarch64/vdso.S  |   2 +
 linux-user/loongarch64/vdso.so | Bin 3560 -> 3712 bytes
 linux-user/ppc/vdso-32.so      | Bin 3020 -> 3140 bytes
 linux-user/ppc/vdso-64.so      | Bin 3896 -> 4048 bytes
 linux-user/ppc/vdso-64le.so    | Bin 3896 -> 4048 bytes
 linux-user/ppc/vdso.S          |   2 +
 linux-user/riscv/vdso-32.so    | Bin 2980 -> 3124 bytes
 linux-user/riscv/vdso-64.so    | Bin 3944 -> 4104 bytes
 linux-user/riscv/vdso.S        |   2 +
 linux-user/s390x/vdso.S        |   2 +
 linux-user/s390x/vdso.so       | Bin 3464 -> 3616 bytes
 32 files changed, 133 insertions(+), 3 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v4 1/4] linux-user: Create vdso_sigreturn_region_{start,end}
  2025-09-04 10:23 [PATCH v4 0/4] linux-user: Add syscall dispatch support Richard Henderson
@ 2025-09-04 10:23 ` Richard Henderson
  2025-09-04 10:23 ` [PATCH v4 2/4] linux-user: Populate sigreturn_region_{start, end} in all vdso.S Richard Henderson
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Richard Henderson @ 2025-09-04 10:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: floss

These variables will be populated from the vdso, and used
for detecting whether we are executing the sigreturn.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/loader.h            | 2 ++
 linux-user/signal-common.h     | 2 ++
 linux-user/elfload.c           | 5 +++++
 linux-user/gen-vdso.c          | 6 ++++++
 linux-user/signal.c            | 2 ++
 linux-user/gen-vdso-elfn.c.inc | 7 +++++--
 6 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/linux-user/loader.h b/linux-user/loader.h
index e42b8fa1e3..da9ad28db5 100644
--- a/linux-user/loader.h
+++ b/linux-user/loader.h
@@ -117,6 +117,8 @@ typedef struct {
     unsigned reloc_count;
     unsigned sigreturn_ofs;
     unsigned rt_sigreturn_ofs;
+    unsigned sigreturn_region_start_ofs;
+    unsigned sigreturn_region_end_ofs;
 } VdsoImageInfo;
 
 /* Note that both Elf32_Word and Elf64_Word are uint32_t. */
diff --git a/linux-user/signal-common.h b/linux-user/signal-common.h
index 196d2406f8..0b04868727 100644
--- a/linux-user/signal-common.h
+++ b/linux-user/signal-common.h
@@ -25,6 +25,8 @@
 /* Fallback addresses into sigtramp page. */
 extern abi_ulong default_sigreturn;
 extern abi_ulong default_rt_sigreturn;
+extern abi_ulong vdso_sigreturn_region_start;
+extern abi_ulong vdso_sigreturn_region_end;
 
 void setup_sigtramp(abi_ulong tramp_page);
 
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 26c090c95d..28f0909d1a 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1659,6 +1659,11 @@ static void load_elf_vdso(struct image_info *info, const VdsoImageInfo *vdso)
     if (vdso->rt_sigreturn_ofs) {
         default_rt_sigreturn = load_addr + vdso->rt_sigreturn_ofs;
     }
+    if (vdso->sigreturn_region_start_ofs) {
+        vdso_sigreturn_region_start =
+            load_addr + vdso->sigreturn_region_start_ofs;
+        vdso_sigreturn_region_end = load_addr + vdso->sigreturn_region_end_ofs;
+    }
 
     /* Remove write from VDSO segment. */
     target_mprotect(info->start_data, info->end_data - info->start_data,
diff --git a/linux-user/gen-vdso.c b/linux-user/gen-vdso.c
index aeaa927db8..d6a2cdaa83 100644
--- a/linux-user/gen-vdso.c
+++ b/linux-user/gen-vdso.c
@@ -36,6 +36,8 @@ static const char *rt_sigreturn_sym;
 
 static unsigned sigreturn_addr;
 static unsigned rt_sigreturn_addr;
+static unsigned sigreturn_region_start_addr;
+static unsigned sigreturn_region_end_addr;
 
 #define N 32
 #define elfN(x)  elf32_##x
@@ -215,6 +217,10 @@ int main(int argc, char **argv)
     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, "    .sigreturn_region_start_ofs = 0x%x,\n",
+            sigreturn_region_start_addr);
+    fprintf(outf, "    .sigreturn_region_end_ofs = 0x%x,\n",
+            sigreturn_region_end_addr);
     fprintf(outf, "};\n");
 
     ret = EXIT_SUCCESS;
diff --git a/linux-user/signal.c b/linux-user/signal.c
index cd0e7398aa..804096bd44 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -50,6 +50,8 @@ static void host_signal_handler(int host_signum, siginfo_t *info,
 /* Fallback addresses into sigtramp page. */
 abi_ulong default_sigreturn;
 abi_ulong default_rt_sigreturn;
+abi_ulong vdso_sigreturn_region_start;
+abi_ulong vdso_sigreturn_region_end;
 
 /*
  * System includes define _NSIG as SIGRTMAX + 1, but qemu (like the kernel)
diff --git a/linux-user/gen-vdso-elfn.c.inc b/linux-user/gen-vdso-elfn.c.inc
index b47019e136..c2677a146c 100644
--- a/linux-user/gen-vdso-elfn.c.inc
+++ b/linux-user/gen-vdso-elfn.c.inc
@@ -84,9 +84,12 @@ static void elfN(search_symtab)(ElfN(Shdr) *shdr, unsigned sym_idx,
 
         if (sigreturn_sym && strcmp(sigreturn_sym, name) == 0) {
             sigreturn_addr = sym.st_value;
-        }
-        if (rt_sigreturn_sym && strcmp(rt_sigreturn_sym, name) == 0) {
+        } else if (rt_sigreturn_sym && strcmp(rt_sigreturn_sym, name) == 0) {
             rt_sigreturn_addr = sym.st_value;
+        } else if (strcmp("sigreturn_region_start", name) == 0) {
+            sigreturn_region_start_addr = sym.st_value;
+        } else if (strcmp("sigreturn_region_end", name) == 0) {
+            sigreturn_region_end_addr = sym.st_value;
         }
     }
 }
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 2/4] linux-user: Populate sigreturn_region_{start, end} in all vdso.S
  2025-09-04 10:23 [PATCH v4 0/4] linux-user: Add syscall dispatch support Richard Henderson
  2025-09-04 10:23 ` [PATCH v4 1/4] linux-user: Create vdso_sigreturn_region_{start,end} Richard Henderson
@ 2025-09-04 10:23 ` Richard Henderson
  2025-09-04 10:23 ` [PATCH v4 3/4] linux-user: Populate vdso_sigreturn_region_{start, end} from sigtramp page Richard Henderson
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Richard Henderson @ 2025-09-04 10:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: floss

Mark the regions which contain sigreturn syscalls within
each vdso.  Rebuild the shared objects.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/aarch64/vdso-be.so  | Bin 3224 -> 3320 bytes
 linux-user/aarch64/vdso-le.so  | Bin 3224 -> 3320 bytes
 linux-user/aarch64/vdso.S      |   2 ++
 linux-user/arm/vdso-be32.so    | Bin 2648 -> 2724 bytes
 linux-user/arm/vdso-be8.so     | Bin 2648 -> 2724 bytes
 linux-user/arm/vdso-le.so      | Bin 2648 -> 2724 bytes
 linux-user/arm/vdso.S          |   2 ++
 linux-user/hppa/vdso.S         |   2 ++
 linux-user/hppa/vdso.so        | Bin 2104 -> 2224 bytes
 linux-user/i386/vdso.S         |   2 ++
 linux-user/i386/vdso.so        | Bin 2672 -> 2792 bytes
 linux-user/loongarch64/vdso.S  |   2 ++
 linux-user/loongarch64/vdso.so | Bin 3560 -> 3712 bytes
 linux-user/ppc/vdso-32.so      | Bin 3020 -> 3140 bytes
 linux-user/ppc/vdso-64.so      | Bin 3896 -> 4048 bytes
 linux-user/ppc/vdso-64le.so    | Bin 3896 -> 4048 bytes
 linux-user/ppc/vdso.S          |   2 ++
 linux-user/riscv/vdso-32.so    | Bin 2980 -> 3124 bytes
 linux-user/riscv/vdso-64.so    | Bin 3944 -> 4104 bytes
 linux-user/riscv/vdso.S        |   2 ++
 linux-user/s390x/vdso.S        |   2 ++
 linux-user/s390x/vdso.so       | Bin 3464 -> 3616 bytes
 22 files changed, 16 insertions(+)

diff --git a/linux-user/aarch64/vdso-be.so b/linux-user/aarch64/vdso-be.so
index d43c3b19cdf6588757f2039f2308a8bce21aed9c..4089838b30535738e89252a146a039af54ed8be1 100755
GIT binary patch
delta 372
zcmbOs`9pGoKI4y#1`&)RyJD|o>HWC-e5%<G*&9N6e2+fgx7<93@ji>H5Ca1P4-f+Z
z%LfPzCN+U1O#I8_0yb-3J4S~8A0a9j7eHt*=?)~hAbgezB=IPOdS(wK@d81hITIU&
z>uZ5_!>qUgRUiPQCnJf!fr@hg>6J+0JCM}xM-o2)7f(($@JUXqDAdbmP)T7>sbDD1
zOfO0;DJ{y2FG@|%%+HgKFD^+eD!~wsPt8l&T*;oqIB^2Y=Gz=9%$y5=hVlWi_+$<q
Yea;zBE3Qp;;4$aSgYsG?H*iS+0NrRve*gdg

delta 303
zcmew%IYV-SKI4py1`&)RPZQU!U8Q??61%0t;jr&#CkKX#p4vQz@jlDs)ocd7LW~Um
zKQe#;;{pf`CZ&NS7lhAJfh4YnP|xgvB<>;zG-qO?aDAW<0|O6K;|-_+0U(`@B>n~}
z&H<!rk;Hc(sh^A_egZC@oLuf=;8hT&m(QS*!k|*Y5bqM{=jiL{%n%>%?iU*Gy7?J<
qAme6hP8DX(0-!EFAQqjR!K2Ta0X1XQ<OMwDoIu0Dpk?v{E(rh&zBJna

diff --git a/linux-user/aarch64/vdso-le.so b/linux-user/aarch64/vdso-le.so
index aaedc9d85e568d5dadc9c394e9c4459f1f0c8c88..240802821c32943170f7de64f8a0b3ab2a21cd13 100755
GIT binary patch
delta 284
zcmbOs`9pGo2IG&7n(>SxE{t}Xmv61yy2m1;okeN+zms!1<2TP?yu+d>!~g<33?Ep)
z3^<_)X7Mn5nViXHFKGwlF*1Dozkm_00L*Zoe2`6CG72i|!Hg<fF!>{!IA<+TPzY$l
zjmeJe;*)PM2{5jl%*ZUxxPNjWyOdRaibY7VlU_c9N(zHY1w(OWdQoagX;EH$QEGZ-
zeqMZWNn%k6rf_Or%H~S;c*cnnST^6_P+;a=zyz_I4@ikmX64c5oWTwexi<MDlknsM
QW|qkTJPM3?lM8v&0bT`1PXGV_

delta 217
zcmew%IYV-S2IGv4n(>SxrfSl257}AgzHD2Uk@GeFM#i?fJDcY)-eH-%g3Uluh=GBD
zk>TV21&lxj5|Ez!kxg7u4=4hX^<YMl0y14DE3%7A1_D_^3_J`sSRk?jP(|sJFEWWU
z)=p+*7M~oz&M~=zU6{`?vZyG`MK7O0C51tyV)Iq@c*e~ZoC?gm1xyfKd_YQcaw?BD
dX9hb&WYy%4Ou~~3m{}%o;89={ntYK*9RMCZFsuLo

diff --git a/linux-user/aarch64/vdso.S b/linux-user/aarch64/vdso.S
index a0ac1487b0..59dd94dc8f 100644
--- a/linux-user/aarch64/vdso.S
+++ b/linux-user/aarch64/vdso.S
@@ -71,5 +71,7 @@ vdso_syscall __kernel_clock_getres, __NR_clock_getres
 __kernel_rt_sigreturn:
 	/* No BTI C insn here -- we arrive via RET. */
 	mov	x8, #__NR_rt_sigreturn
+sigreturn_region_start:
 	svc	#0
+sigreturn_region_end:
 endf	__kernel_rt_sigreturn
diff --git a/linux-user/arm/vdso-be32.so b/linux-user/arm/vdso-be32.so
index b896d3d545ebf91942038831a9535b023137a86b..6d71cd9c36d185e48810140d6b1b12a1c8f95900 100755
GIT binary patch
delta 322
zcmca1vP5)(GUK0#DhEXNi816dstG5g=$qZlvG_W5!PJ@GH~u)rBFECe00BHeN{xYm
zWdRc3dh#At`FcB`$PbVxBg6lXK*}Acsu4&lFflNIbcHi8FoETPY%U<q0;;?Lq+#kC
zKx_~Ygy`=A>dyyqIfNkk=K=YtKt30gzX`~XM({ltP67o2;R4CYRh3x*p%!}i3@RlI
z#hK|vsU@XFdGST5>6!U?@x>*HMOcJW^HMgKu{APtUH}@z55y9axTIM-fQ);S6}Xf|
O(}1igKnw$nAO-;P2tZ~4

delta 232
zcmZ1?dP8J_GUJAcDhEV9iF@2Qn5bfLZGwFE!TAAV%KxoCZv1hKW%4~%*?J)c28JI%
z%)rR-|09r+W?*1x1kwsj3=BL#TAP7^2`mp}a{;j(P~{CE4O1TiVuOGnM1LGme?E}Q
z0W=t-zX-@r1=3tlejAV<jo`~L%moSr!Ud9(10wR1Epzqq8B|I(A7X1{=G*|3<OgE0
Y$v#}ttQkPorpY;6%8XKzCvb@X036{g_W%F@

diff --git a/linux-user/arm/vdso-be8.so b/linux-user/arm/vdso-be8.so
index 784b7bdb2a9308671bbc4c1e38ab4eac568ea6f7..6446a96fcf63747f1c171a1bc99210d2268d971a 100755
GIT binary patch
delta 322
zcmca1vP5)(GUK0#DhEX5v@5rDpV-zdaE;R<z_ZbM!hvTqH~u)rBFECe00BHeN{xYm
zWdRc3dh#At`FcB`$PbVxBg6lXK*}Acsu4&lFflNIbcHi8FoETPY%U<q0;;?Lq+#kC
zKx_~Ygy`=A>dyyqIfNkk=K=YtKt30gzX`~XM({ltP67o2;R4CYsV*V8W`=tC3@RlI
z#hK|vsU@XFdGST5>6!U?@x>*HMOcJW^HMgKu{APtUH}@z55y9axTIM-fQ);S6}Xf|
O(}1igKnw$nAO-;BYCz-w

delta 232
zcmZ1?dP8J_GUJAcDhEW2jvP6cAn`ta_SEXT7Yg+lW8zuPZ2WPIW%4~%*?J)c28JI%
z%)rR-|09r+W?*1x1kwsj3=BL#TAP7^2`mp}a{;j(P~{CE4O1TiVuOGnM1LGme?E}Q
z0W=t-zX-@r1=3tlejAV<jo`~L%moSr!Ud9(&2t<BJc9J{8B|I(A7X1{=G*|3<OgE0
Y$v#}ttQkPorpY;6%8XKzCvb@X05^>+%m4rY

diff --git a/linux-user/arm/vdso-le.so b/linux-user/arm/vdso-le.so
index 38d3d51047372391b3125c3f9f6ea5401f04bba1..d34e577b69e6cb22a90982570d5e66a1fa22e195 100755
GIT binary patch
delta 309
zcmca1vP5)(0^^^Fiibto-btLS^tfAl`qJz2U8lY?Z_Q&mz46Bp7TE?C1}NZRPy@0S
zAn~my?_`y)w*!j)fU03+`1s!)$ZiCxQUKCS3_J|sK>7z0kN^WNhAbd`gAu|5sc(QV
z!K5IN-vwml1NCzNX(6Egc|bZ9$mfFcHv#Er1mBzCBv2p_A;7?poNQne6;a`(m(QS5
z!cd%<UX)r=T9g-Gl$xHIpBG<Tl30XAI5jV2a~WG5Gv@`M<M@GQN=*LCDb3o!#=vlI
OvMiS}W7=d#E^z=!FhsKe

delta 239
zcmZ1?dP8J_0^^2>iibs{A2M=DJTKY)!fEEqs*sO2HQxVB+W6xL%j7$(GW9|X3=BVj
z7z7v@KK_>m(v2((3<^M+iGhbf8%Y0P0uo@r#b5`dZ!ki5AoU>-CYTfi^5cN4e4u^~
zAT0#cUj(F6fqX6~zYR!7Blz+RbAbYZ2muC$<m61R;M}xKy?h3hlFf(M>X<n<04?MP
fsuP>+$tBI2!N$O_Y4Sua;mI{z0*q3Vd%45`Chsqh

diff --git a/linux-user/arm/vdso.S b/linux-user/arm/vdso.S
index b3bb6491dc..d84d964730 100644
--- a/linux-user/arm/vdso.S
+++ b/linux-user/arm/vdso.S
@@ -140,6 +140,7 @@ SYSCALL __vdso_gettimeofday, __NR_gettimeofday
 
 	.balign	16
 sigreturn_codes:
+sigreturn_region_start:
 	/* [EO]ABI sigreturn */
 	slot	0
 	raw_syscall __NR_sigreturn
@@ -172,3 +173,4 @@ sigreturn_codes:
 
 	.balign	16
 endf sigreturn_codes
+sigreturn_region_end:
diff --git a/linux-user/hppa/vdso.S b/linux-user/hppa/vdso.S
index 5be14d2f70..a6f8da2981 100644
--- a/linux-user/hppa/vdso.S
+++ b/linux-user/hppa/vdso.S
@@ -156,8 +156,10 @@
 __kernel_sigtramp_rt:
 	ldi	0, %r25
 	ldi	__NR_rt_sigreturn, %r20
+sigreturn_region_start:
 	be,l	0x100(%sr2, %r0), %sr0, %r31
 	nop
+sigreturn_region_end:
 
 	.cfi_endproc
 	.size	__kernel_sigtramp_rt, . - __kernel_sigtramp_rt
diff --git a/linux-user/hppa/vdso.so b/linux-user/hppa/vdso.so
index e1ddd70c37e9eb6871c21d538dcce0a1e736a918..68baf80fd3943cc2d847744f13637810788fafc1 100755
GIT binary patch
delta 287
zcmdlXut9Kw5)+%jM3n;~wM-GFSH2~uzvW>xy0IuFLc1|}=f)rNnd=!qfQ8}zM<B(+
zz`#5KEC6ORC<FO3koZt0T)hQQ;0H*M5u)Fbfq@Am1_E3_90Jte0i*?(Am(KPRW1PX
zVd{aF1GRvFAjp8^WN&ASB<~cxe1_u8^rF;~(xSZhqSW-v{Ji+$lEk7COyShLl+6!V
rm>D-eV*Sd<nE*724~Ru4KVX+)V^sh$yC!ici>?APT7Vb^7(omG-<v%*

delta 189
zcmdlWxI<uq5)<o=i7E#~rvH6#AjIVmuSc*(c0!xlbp5Snr5k_DXZHNT00fK-|33mL
zE(QiB3lJX&fNTa?1_tI1AT7Yez`z5fjesf_0BM+d4-gv!1cCZDhqE#>ZjNUA!l<bL
q6ygI5Gcd3KX#pVS1Y%|&h60ucKt}N73JzsaV<4*qDh#3+K?DH%5g+>i

diff --git a/linux-user/i386/vdso.S b/linux-user/i386/vdso.S
index e7a1f333a1..8df77b5a94 100644
--- a/linux-user/i386/vdso.S
+++ b/linux-user/i386/vdso.S
@@ -114,6 +114,7 @@ vdso_syscall3 __vdso_getcpu, __NR_gettimeofday
  */
 	nop
 
+sigreturn_region_start:
 __kernel_sigreturn:
 	popl	%eax	/* pop sig */
 	.cfi_adjust_cfa_offset -4
@@ -128,6 +129,7 @@ __kernel_rt_sigreturn:
 	movl	$__NR_rt_sigreturn, %eax
 	int	$0x80
 endf	__kernel_rt_sigreturn
+sigreturn_region_end:
 
 	.cfi_endproc
 
diff --git a/linux-user/i386/vdso.so b/linux-user/i386/vdso.so
index bdece5dfcf8da036d013262d4e37208350283cfa..e01c3818d0d2e4871cf39b2ddd21043d0695d07e 100755
GIT binary patch
delta 444
zcmew$@<Mci0^@{<iibs3xp}^6>=kzJ5{@jp{@LTJl;I7NjX(ad)H6T<3&Y3%JV5q2
zR+tDkgEEkL4~Y+x0ns4!7C`z3RFIK@iNO)b=3s#eFmN)2z?eW<5U4&5NQVH;V+PVf
z4BQL_3=H)QlYs&vP=OX8y&cFGgYqW<X&3+*FbBxF4wPpH(jWsi0qJ@q{l|d(Y$X0&
zAU_<5{|U$kd5{B0gY>g9x-u{<2MP#41sIZ(!&1}2ybbm88HzL0i&9HUi}K=&Qqwc@
z^Wuw35{pVOg;VoVHXmSXVBBoaah6d_fsuiM7ib#DiJ+hWnal~qAV0$aP*RX_vKg0>
Rgdor<b#QS82B2;*008EUMTY<Y

delta 302
zcmaDM`axuZ0;9x4#ls?<CqE_{P2YA{=Ej`0AMPhV{I5Od%*G#oSn7W;Kma2H69X5J
z$-x2@VBlnsg)xD&Aj8N1>OeY#m4Sg7NDDD=Ggt!Y$w0mcl<y0qw*&cNP<}L!h5?ZN
zR3PU%P@Ww~gY;K3F!(amBN@;Sl*mTnF9Y(!k@&lT{BuA)2h@ObKzcclF979lHfL{O
t+`NP13?t_Qpb#$*Gf(d2l4d)=#=vlkVe&dIC5c%;+v|W5Fu(|9003zeFOUEL

diff --git a/linux-user/loongarch64/vdso.S b/linux-user/loongarch64/vdso.S
index 780a5fda12..2409d95476 100644
--- a/linux-user/loongarch64/vdso.S
+++ b/linux-user/loongarch64/vdso.S
@@ -125,6 +125,8 @@ vdso_syscall __vdso_getcpu, __NR_getcpu
 
 __vdso_rt_sigreturn:
 	li.w	$a7, __NR_rt_sigreturn
+sigreturn_region_start:
 	syscall	0
+sigreturn_region_end:
 	.cfi_endproc
 endf __vdso_rt_sigreturn
diff --git a/linux-user/loongarch64/vdso.so b/linux-user/loongarch64/vdso.so
index 7c2de6c50e706164225e82f652d4becc04c71ff0..3704834f0d5d4439a5f1020e06d9a52c0a740555 100755
GIT binary patch
delta 358
zcmaDM-5@(bgQ<aQqm~_`i0-YcC$ne2ny5DIdBUo>Yp!s=SQWathS7noo`vD#e+D$b
z1LpHE)UcsSC_}{?(8NK)*vzp2iZcSuZ(sy#gcFW1aW;m@x7m3mqroy<3?EqFO2CY~
z$&4K0j4hJ|nZ+4rOfCeH%O*Pl$z78ZIm9K;0o4dG@Gt~GT?2771H<FV6FDTzl9Nr!
zl3X+W^zs>sGt-MwOG=CK;)_z#GxPJ}i%SxVN-%{}^HMgi;Amjntj?v#%-g{PaSR`j
a5}h2%tIf&52@!cWxs%tN@!RBsyy^hfi%Eb0

delta 205
zcmZpWeIY$TgXsn5MlCx=5mA9%)#h=o$th|*U-GxV_f~Om__Vo((Sc2rk>TV221W)H
zz%|*BLtIh?EXKv~fdxg9!F+Nehd86}WI<+e#>B~mKr(-_Bam#Kd=RK>I#96?0}n$0
z8$=fmRP&n2A2}p8J8;%BZa%=Jz|5<`1d-qaQi7A;@@jLg;DCs1pRCAd&Kb`M;k8Uo
H<dFveCI=^o

diff --git a/linux-user/ppc/vdso-32.so b/linux-user/ppc/vdso-32.so
index 0dc55e0dddff618b954dbb939335e99956daf64a..03476052fbeb13b7d54651ff9d2447a07ceca251 100755
GIT binary patch
delta 438
zcmX>jenet|GUJhnDhEWA#S8BnzBO%iakv;8rJgEnt>YiE@dr0sJp%}^F#P`rq<9z@
z*d)LLU^as?kgtQphce;nEr0?)K!S`63`{`Ek%58v4Tui}TtFNG6xIN7fbuLrDhtF0
z0YQj;<qQn<tRM|MLJ$kv85md}Ao1q{9iRf_b3o-c0{I|=VCqi+)t^A(KLE-L0QoFX
z_1}PekcXi98F_)~K@NuMXOw1eVqm=j7f4PvNz3(5E7Z$pD9%hTN-ZfZ%8M^bP0!5F
zi!UxoEGoeiPR&c%e1?5B<K{BXuZ)@xfJX5Fu?P@@+zE0EClE6OF%)nB1DVli@)T|*
SF-|+6SPM)7NCSh3fdK%|KS6c?

delta 281
zcmX>iaYlTCGNaE#l>;J~u3G}Hz1nkb!uCykg)t8^X6|Be-uQ!?t^NlC5HK<@Faaqp
z1_tIgAU+TP*$lEkVGR%mD9-|<j6rM=5M=oO5lA^OFtCEu^9TVkkPZOyA0YA57#P@8
zfP4<9d=-!nG6$x9G6RDb>j@-*l|TgoKt2mp!+s!N0?B}DKnp+)h8ge#$iD*PZ+7Nb
o&A9nJ=NCrK1wb)AAQqVXhFgk_{S1)#domA?5);Sq$p$<k0B1NXbN~PV

diff --git a/linux-user/ppc/vdso-64.so b/linux-user/ppc/vdso-64.so
index ac1ab2582e4675979ffca3ce90dce17df579ab2a..b89f2a0e018a7bb6923db267a746006d341f6bb1 100755
GIT binary patch
delta 436
zcmdlXcR_xFKI4Ur1{RDWTs14(R3|H4uzIPrn<4t+7Q5Ac<(q35C$O`yF#P{Gu~FER
zhk=0sgn@wl1cU~Y%0Ln(egR3G0jAM{k%55;BEi^zq`(o#=7R89ULc8w2tsVEPZU6y
zyaK8KWK$uM_#7nhb|mo@B=NaO;s>DOEI@iQk~qvq96<3?5b;=$QuZw%5(q#R-$2qZ
z0W1m<PfpG*H7QI@*UM)p&P*>#Eh#O^i!Vw|&&<z@FD^+eD!~*^%}d$*gR_}&a}~EL
lGiL|TC_W$-p1gujkBch;YV!NZ5BSWuxZR=LmdOgd5&*x7NI(Dp

delta 307
zcmca0ze8?<KBL7(0}Dox#cn4o*9x#KHrQ%*NT0FR@ARH07dO{1PGC1-WME)o00YJb
z2n{B=fFuY50m};r4JKs;8UBBq*eG1DCBVSI1Cd}~0aXCvTOo<hK@tx@5^q5gPeT$v
z02OBe(ltopC!pdSKzcGnTn!||z6B})vUnkqh6yn7&HY@>jGKjdRG2w6fMR?=%s<(I
YUyqCP2UN+9$rb!&Ok5i#Z{Sw|0MvRWxBvhE

diff --git a/linux-user/ppc/vdso-64le.so b/linux-user/ppc/vdso-64le.so
index 424abb4290b7d3100e9dede2f3059483608ba703..22499d2701530ee2aa003ae5fecce695441a5f77 100755
GIT binary patch
delta 383
zcmdlXcR_xF2IGZ|n)Zw$d#8TmX85vf$%g!(v+1T^wTi0NT-{v5IDx&Mh2i6W1~k9}
z=JPO|U`LfuhKgT669)-nGsglb&d9*T(7*`R2qzrDEG~u@EDV#iIe8^RfP6tL?ns>c
zkx5*#5GX6az{4;HYAeKb3=Hj)6`92)=R#!<KxJ9LW-~Bsp1hG$oblA;gG}O#Hzo%%
zOPD1m8~At`n&j%`GZbg07p0bz7UjhkrKV@*=fxM7Bo>um3a93!Z2rO7z__`bTalT!
kg9&0bACMBByp&IyGlB~u@_zD7K66fYZV0bsvLvrO0GX9Yi2wiq

delta 220
zcmca0ze8?<2BXDBO?yU>es=TCa!<lv%$)wF@KG}h)9a^|6F1i|PGA>hWME=wU}Qi6
zT$39)#U*8dVuB1G|D#9&Ia-rHGKouC0a*eJJPdQ#A@V#>WdV~FnZ+g3pt1*`vMf;9
zn#qD(;*66gA7qlA9KtNRc>-5G<7NRK1!i6iCWsO~AjLn~mS3Cm2PZ^i$K*nObIuK1
L5MImVjlA*zt)(a1

diff --git a/linux-user/ppc/vdso.S b/linux-user/ppc/vdso.S
index 2e79ea9808..e9256a2dea 100644
--- a/linux-user/ppc/vdso.S
+++ b/linux-user/ppc/vdso.S
@@ -220,6 +220,7 @@ endf	__kernel_sync_dicache
 
 	nop
 
+sigreturn_region_start:
 __kernel_sigtramp_rt:
 	raw_syscall __NR_rt_sigreturn
 endf	__kernel_sigtramp_rt
@@ -235,5 +236,6 @@ __kernel_sigtramp32:
 	raw_syscall __NR_sigreturn
 endf	__kernel_sigtramp32
 #endif
+sigreturn_region_end:
 
 	.cfi_endproc
diff --git a/linux-user/riscv/vdso-32.so b/linux-user/riscv/vdso-32.so
index c2ce2a4757900a16b891bb98f7a027ac30c47a5f..4818a994f0394d83ca5e8213f6e2d2d3ee2f504c 100755
GIT binary patch
delta 447
zcmZ1?zC~h!0#gs?L?tIipNXmSMas5*X}YtK&*i=K5rz{7_FXjfZHe71!C1(`<ITXp
zP?TAmT*koYIC(0oDQA3DZf<FgVS&NqMn=)e4_M#Sdjgd-umTA%;9*Dr(j7>Ah&Y5~
zVfgsJ6v&idgzy=G{5l|W0#rSSKLg00!3>dSVBlg{4P-hnLHHo~gD@!|Ey(b({{I;u
zqXcLG2apzG;9+<Gq<^q5FhoH4Ux0K5P@V_MX98LdaxhH27?2->B(DYJ2O#kol9OHh
zi$k)E^zs>0DvHXCjWUf24C8Z+3Jl^CjV7;TRWyZ%3PW*bdQoagX;EH$QEGZ-eqMZW
zNn%k6rf_Or%H~<@U5uNRIKMG6`b?h4Ej(F=TY&cp(BcO`2k-+OD?ZtiTbgYPI|G9~
P<K!%ECC1N_d%48{U%FzB

delta 322
zcmdlYu|#}=0@ELkiAqk4&J$DTi!jW8dws_KY9IfGb=Q{hIhCuqgj#KuU@T<eabjR#
zD9S8OE@NP{m^_u$bn<0Z(aFzQ-%kF*CQ#20l$2lu5<tMn@bSL{ke<K_=7RY~K;{f)
z2%mw0i@_DhbYMcrN5iCmv>;G_8jvml>gNE`LJT|%RY3X&3j;$0l-~!WGl23u5WYRb
z93Z0sNy7#pKL(+I;Rui)fW&7=PEO1*3&{4=%V$uj*sQ_P#khG3=NCps=gEpZ!jt!K
m3-F!+Dn9`96Uc9(lW%fMv-YqvFx&*o^Y92TrcRdS5eESNR6iB~

diff --git a/linux-user/riscv/vdso-64.so b/linux-user/riscv/vdso-64.so
index ae49f5b043b5941b9d304a056c2b50c185f413b0..cc6f7e974be67bd08ed412eccb9af22138385e56 100755
GIT binary patch
delta 453
zcmaDM*P$>$gYm>f&3s0mjWgL9MZUOZ%%7)STEdup@5PH(j}Av>WiW2u!l=l~<ITXp
zP?TAmT*koYIQb!)DQA3DZf<FgVS&NqiA=JaP1sWy<voFF7#MgM&ai<Qa3TTB;+a@4
zI(ZI<2xIBwjU3{VbwEKzhL8Urpedd)`5{ntHB|NhGgvR2I5=65Q=IY4<cZAUj1ML|
za*Ee~0m=yhE!_e&hX<;bi4h_Wa|{PmTns9{0!_UZRD2GaI74!Bl1Xx+VT4{jgGxnF
znVCtZQGsE6u2F$Oe4<go<Zo;Wrtq*}D9%hTN-ZfZ%8M^bP0!5Fi!UxoEGoeiPR&c%
ze2jAu<K{GOC1ysS$(?-Wq6+K~CthHJ(ELD3eDYO3ZLSZT5D|OE$z1$qoci1l?zG9A
Gyz&4^o?@H;

delta 329
zcmeBBcp*1IgHdCmW<I0y<U|hPiEF-ytaVNHbN5=kU~#zA*KgM@2P~MlaogrCjEby0
zP7DkTMVZCPWekiKlOM8~PM*jlx7mh0g>mu)4hczqpe!T9$NxJRfea)dF`1E5T+#?E
z!o{G#iX;VOx=uC(%0>fOf<V2fatsV<lP5BZOI87eg&24kCa^)|d7#SrCQsxPXPh%R
zky)H^!(>BdakV2*m2=QkG9)Kwn!34I1nK27s8noD;abGFnS)1x8RF~7HvB5066_FD
m7cfC+kat8Um-1_K?%;%o+ysTt<URZ<oD;bqBGVuuygUE^OF*#z

diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S
index c37275233a..1d780db771 100644
--- a/linux-user/riscv/vdso.S
+++ b/linux-user/riscv/vdso.S
@@ -181,7 +181,9 @@ endf __vdso_flush_icache
 	nop
 
 __vdso_rt_sigreturn:
+sigreturn_region_start:
 	raw_syscall __NR_rt_sigreturn
+sigreturn_region_end:
 endf __vdso_rt_sigreturn
 
 	.cfi_endproc
diff --git a/linux-user/s390x/vdso.S b/linux-user/s390x/vdso.S
index 3332492477..c60e9ed086 100644
--- a/linux-user/s390x/vdso.S
+++ b/linux-user/s390x/vdso.S
@@ -52,6 +52,7 @@ vdso_syscall __kernel_getcpu, __NR_getcpu
  * by all users.  Without it we get the fallback signal frame handling.
  */
 
+sigreturn_region_start:
 __kernel_sigreturn:
 	raw_syscall __NR_sigreturn
 endf	__kernel_sigreturn
@@ -59,3 +60,4 @@ endf	__kernel_sigreturn
 __kernel_rt_sigreturn:
 	raw_syscall __NR_rt_sigreturn
 endf	__kernel_rt_sigreturn
+sigreturn_region_end:
diff --git a/linux-user/s390x/vdso.so b/linux-user/s390x/vdso.so
index 64130f6f335269b03291653d006225b365be9cd9..a669a6b7dda7b60bb8aa125bd70c8ed3384da841 100755
GIT binary patch
delta 435
zcmeB>ULZ3;kBLiRqk#pZh})fO-I~!HOHa>f*qfa!daD0cMEm9%#s{n{EDZlYPHYr5
z<zZl80AV0tlY!7+QW;3X#1)Xl8K4^LEf|3&KqMF&kQ6uq*<27l%L^p&5QKVW2PE+<
zA%sORVUR<r5aO&)pb{YQ2@r8TkPw?3RDuaeFGJF>0V*y5r1uCyyqa<np#bhxkj6U*
zan=)1jWP_$$ze`ufq|xa`3%LG=|!m}rA2x1MXBkT`FZihC5c5Pn8K-fDVsewni)5r
m;#6hk>;M|Y2gD+ifAHvYu7Dc+d9neoIp=IBuVr!pw*&xqqDfc)

delta 305
zcmZ1=(;+=UkBPHmqk#pZ$eP<0^W+mAZmVidw^)#U>fWD6>!)n4VSK<^&&crqBLf&P
zHb7`F$ps`q7zkKiKxi;2i%`$(fFy1##K6D<;j_VnWq=H4ggEOHs02tn5-P3>WV6XZ
zC76J8K9YtFP;m($-6{xl=)^{0-AM=qY#@_B0Hkp#LY(ykSd@W5X7hcHX2#9QTq?|*
d8bC2VAQqTBfmff?1FB-r<P*H+j4YG*6acdvD)ayV

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 3/4] linux-user: Populate vdso_sigreturn_region_{start, end} from sigtramp page
  2025-09-04 10:23 [PATCH v4 0/4] linux-user: Add syscall dispatch support Richard Henderson
  2025-09-04 10:23 ` [PATCH v4 1/4] linux-user: Create vdso_sigreturn_region_{start,end} Richard Henderson
  2025-09-04 10:23 ` [PATCH v4 2/4] linux-user: Populate sigreturn_region_{start, end} in all vdso.S Richard Henderson
@ 2025-09-04 10:23 ` Richard Henderson
  2025-09-04 10:23 ` [PATCH v4 4/4] linux-user: Add syscall dispatch support Richard Henderson
  2025-09-19  7:54 ` [PATCH v4 0/4] " Arusekk
  4 siblings, 0 replies; 7+ messages in thread
From: Richard Henderson @ 2025-09-04 10:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: floss

When a target does not support a vdso, we generate a sigtramp page.
The only thing on this page is a (set of) signal return syscalls.
We do not need to narrowly restrict the vdso_sigreturn_region;
simply record the entire page for all such targets.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/elfload.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 28f0909d1a..1370ec59be 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1974,6 +1974,8 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
 
         setup_sigtramp(tramp_page);
         target_mprotect(tramp_page, TARGET_PAGE_SIZE, PROT_READ | PROT_EXEC);
+        vdso_sigreturn_region_start = tramp_page;
+        vdso_sigreturn_region_end = tramp_page + TARGET_PAGE_SIZE;
     }
 
     bprm->p = create_elf_tables(bprm->p, bprm->argc, bprm->envc, &ehdr, info,
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 4/4] linux-user: Add syscall dispatch support
  2025-09-04 10:23 [PATCH v4 0/4] linux-user: Add syscall dispatch support Richard Henderson
                   ` (2 preceding siblings ...)
  2025-09-04 10:23 ` [PATCH v4 3/4] linux-user: Populate vdso_sigreturn_region_{start, end} from sigtramp page Richard Henderson
@ 2025-09-04 10:23 ` Richard Henderson
  2025-09-19  7:54 ` [PATCH v4 0/4] " Arusekk
  4 siblings, 0 replies; 7+ messages in thread
From: Richard Henderson @ 2025-09-04 10:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: floss

From: Arusekk <floss@arusekk.pl>

This commit adds support for the `prctl(PR_SET_SYSCALL_USER_DISPATCH)`
function in the Linux userspace emulator.

It is implemented as a fully host-independent function, by forcing
a SIGSYS early during syscall handling, if the PC is outside the
allowed range.

Since disabled SUD is indistinguishable from enabled SUD with
always-allowed region length == ~0, this encoding is used
instead of introducing a new flag.

Tested on [uglendix][1], will probably also apply to software like
tiny-wine, rpcsx, limbo, lazypoline, vicar, sysfail and endokernel,
to name a few.

[1]: https://sr.ht/~arusekk/uglendix

Signed-off-by: Arusekk <floss@arusekk.pl>
Message-ID: <20250711225226.14652-1-floss@arusekk.pl>
[rth: Split out is_vdso_sigreturn region matching and other minor tweaks.]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/qemu.h          |  5 +++
 linux-user/signal-common.h |  5 +++
 linux-user/syscall_defs.h  |  6 +++
 linux-user/main.c          |  2 +
 linux-user/syscall.c       | 76 +++++++++++++++++++++++++++++++++++++-
 5 files changed, 93 insertions(+), 1 deletion(-)

diff --git a/linux-user/qemu.h b/linux-user/qemu.h
index e4dca0c20f..cabb7bd6a8 100644
--- a/linux-user/qemu.h
+++ b/linux-user/qemu.h
@@ -155,6 +155,11 @@ struct TaskState {
     /* This thread's sigaltstack, if it has one */
     struct target_sigaltstack sigaltstack_used;
 
+    /* This thread's SYSCALL_USER_DISPATCH state, len=~0 means disabled */
+    vaddr sys_dispatch;
+    vaddr sys_dispatch_selector;
+    abi_ulong sys_dispatch_len;
+
     /* Start time of task after system boot in clock ticks */
     uint64_t start_boottime;
 };
diff --git a/linux-user/signal-common.h b/linux-user/signal-common.h
index 0b04868727..8a44714251 100644
--- a/linux-user/signal-common.h
+++ b/linux-user/signal-common.h
@@ -28,6 +28,11 @@ extern abi_ulong default_rt_sigreturn;
 extern abi_ulong vdso_sigreturn_region_start;
 extern abi_ulong vdso_sigreturn_region_end;
 
+static inline bool is_vdso_sigreturn(abi_ulong pc)
+{
+    return pc >= vdso_sigreturn_region_start && pc < vdso_sigreturn_region_end;
+}
+
 void setup_sigtramp(abi_ulong tramp_page);
 
 int on_sig_stack(unsigned long sp);
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index df26a2d28f..cd9ff709b8 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -689,6 +689,12 @@ typedef struct target_siginfo {
 #define TARGET_TRAP_HWBKPT      (4)     /* hardware breakpoint/watchpoint */
 #define TARGET_TRAP_UNK         (5)     /* undiagnosed trap */
 
+/*
+ * SIGSYS si_codes
+ */
+#define TARGET_SYS_SECCOMP       (1)  /* seccomp triggered */
+#define TARGET_SYS_USER_DISPATCH (2)  /* syscall user dispatch triggered */
+
 /*
  * SIGEMT si_codes
  */
diff --git a/linux-user/main.c b/linux-user/main.c
index 7b0ccb6fd6..d8b7df4a79 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -233,6 +233,8 @@ void init_task_state(TaskState *ts)
         ts->start_boottime += bt.tv_nsec * (uint64_t) ticks_per_sec /
                               NANOSECONDS_PER_SECOND;
     }
+
+    ts->sys_dispatch_len = -1;
 }
 
 CPUArchState *cpu_copy(CPUArchState *env)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 91360a072c..9098cdb9fa 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6344,6 +6344,10 @@ abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
 #endif
 #ifndef PR_SET_SYSCALL_USER_DISPATCH
 # define PR_SET_SYSCALL_USER_DISPATCH 59
+# define PR_SYS_DISPATCH_OFF 0
+# define PR_SYS_DISPATCH_ON 1
+# define SYSCALL_DISPATCH_FILTER_ALLOW 0
+# define SYSCALL_DISPATCH_FILTER_BLOCK 1
 #endif
 #ifndef PR_SME_SET_VL
 # define PR_SME_SET_VL  63
@@ -6398,6 +6402,36 @@ static abi_long do_prctl_inval1(CPUArchState *env, abi_long arg2)
 #define do_prctl_sme_set_vl do_prctl_inval1
 #endif
 
+static abi_long do_prctl_syscall_user_dispatch(CPUArchState *env,
+                                               abi_ulong arg2, abi_ulong arg3,
+                                               abi_ulong arg4, abi_ulong arg5)
+{
+    CPUState *cpu = env_cpu(env);
+    TaskState *ts = get_task_state(cpu);
+
+    switch (arg2) {
+    case PR_SYS_DISPATCH_OFF:
+        if (arg3 || arg4 || arg5) {
+            return -TARGET_EINVAL;
+        }
+        ts->sys_dispatch_len = -1;
+        return 0;
+    case PR_SYS_DISPATCH_ON:
+        if (arg3 && arg3 + arg4 <= arg3) {
+            return -TARGET_EINVAL;
+        }
+        if (arg5 && !access_ok(cpu, VERIFY_READ, arg5, 1)) {
+            return -TARGET_EFAULT;
+        }
+        ts->sys_dispatch = arg3;
+        ts->sys_dispatch_len = arg4;
+        ts->sys_dispatch_selector = arg5;
+        return 0;
+    default:
+        return -TARGET_EINVAL;
+    }
+}
+
 static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
                          abi_long arg3, abi_long arg4, abi_long arg5)
 {
@@ -6473,6 +6507,9 @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
     case PR_SET_UNALIGN:
         return do_prctl_set_unalign(env, arg2);
 
+    case PR_SET_SYSCALL_USER_DISPATCH:
+        return do_prctl_syscall_user_dispatch(env, arg2, arg3, arg4, arg5);
+
     case PR_CAP_AMBIENT:
     case PR_CAPBSET_READ:
     case PR_CAPBSET_DROP:
@@ -6527,7 +6564,6 @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
     case PR_SET_MM:
     case PR_GET_SECCOMP:
     case PR_SET_SECCOMP:
-    case PR_SET_SYSCALL_USER_DISPATCH:
     case PR_GET_THP_DISABLE:
     case PR_SET_THP_DISABLE:
     case PR_GET_TSC:
@@ -13897,12 +13933,46 @@ static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
     return ret;
 }
 
+static bool sys_dispatch(CPUState *cpu, TaskState *ts)
+{
+    abi_ptr pc;
+
+    if (likely(ts->sys_dispatch_len == -1)) {
+        return false;
+    }
+
+    pc = cpu->cc->get_pc(cpu);
+    if (likely(pc - ts->sys_dispatch < ts->sys_dispatch_len)) {
+        return false;
+    }
+    if (unlikely(is_vdso_sigreturn(pc))) {
+        return false;
+    }
+    if (likely(ts->sys_dispatch_selector)) {
+        uint8_t sb;
+        if (get_user_u8(sb, ts->sys_dispatch_selector)) {
+            force_sig(TARGET_SIGSEGV);
+            return true;
+        }
+        if (likely(sb == SYSCALL_DISPATCH_FILTER_ALLOW)) {
+            return false;
+        }
+        if (unlikely(sb != SYSCALL_DISPATCH_FILTER_BLOCK)) {
+            force_sig(TARGET_SIGSYS);
+            return true;
+        }
+    }
+    force_sig_fault(TARGET_SIGSYS, TARGET_SYS_USER_DISPATCH, pc);
+    return true;
+}
+
 abi_long do_syscall(CPUArchState *cpu_env, int num, abi_long arg1,
                     abi_long arg2, abi_long arg3, abi_long arg4,
                     abi_long arg5, abi_long arg6, abi_long arg7,
                     abi_long arg8)
 {
     CPUState *cpu = env_cpu(cpu_env);
+    TaskState *ts = get_task_state(cpu);
     abi_long ret;
 
 #ifdef DEBUG_ERESTARTSYS
@@ -13919,6 +13989,10 @@ abi_long do_syscall(CPUArchState *cpu_env, int num, abi_long arg1,
     }
 #endif
 
+    if (sys_dispatch(cpu, ts)) {
+        return -QEMU_ESIGRETURN;
+    }
+
     record_syscall_start(cpu, num, arg1,
                          arg2, arg3, arg4, arg5, arg6, arg7, arg8);
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 0/4] linux-user: Add syscall dispatch support
  2025-09-04 10:23 [PATCH v4 0/4] linux-user: Add syscall dispatch support Richard Henderson
                   ` (3 preceding siblings ...)
  2025-09-04 10:23 ` [PATCH v4 4/4] linux-user: Add syscall dispatch support Richard Henderson
@ 2025-09-19  7:54 ` Arusekk
  2025-09-19 12:58   ` Richard Henderson
  4 siblings, 1 reply; 7+ messages in thread
From: Arusekk @ 2025-09-19  7:54 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: floss

Hi!

W dniu 4.09.2025 o 12:23, Richard Henderson pisze:
> I have adjusted the signal return trampoline detection from
>
>    https://lore.kernel.org/qemu-devel/20250711225226.14652-1-floss@arusekk.pl/
>
> and tidied up a few other bits.
Thanks! I was also thinking about it, but I apparently sacrificed 
clarity for non-intrusiveness.
> Would you please re-test this
> versus your plan9 emulator?

Compiled and tested. My use case works great.

By the way, I wonder - why are the VDSO blobs included? Is it for 
reproducibility/stability?

Thanks,
Arusekk



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 0/4] linux-user: Add syscall dispatch support
  2025-09-19  7:54 ` [PATCH v4 0/4] " Arusekk
@ 2025-09-19 12:58   ` Richard Henderson
  0 siblings, 0 replies; 7+ messages in thread
From: Richard Henderson @ 2025-09-19 12:58 UTC (permalink / raw)
  To: Arusekk, qemu-devel

On 9/19/25 00:54, Arusekk wrote:
> By the way, I wonder - why are the VDSO blobs included? Is it for reproducibility/stability?

Not all hosts have cross-compilers available.  We have them for x86_64, with docker 
enabled, but not other hosts.


r~


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-09-19 13:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-04 10:23 [PATCH v4 0/4] linux-user: Add syscall dispatch support Richard Henderson
2025-09-04 10:23 ` [PATCH v4 1/4] linux-user: Create vdso_sigreturn_region_{start,end} Richard Henderson
2025-09-04 10:23 ` [PATCH v4 2/4] linux-user: Populate sigreturn_region_{start, end} in all vdso.S Richard Henderson
2025-09-04 10:23 ` [PATCH v4 3/4] linux-user: Populate vdso_sigreturn_region_{start, end} from sigtramp page Richard Henderson
2025-09-04 10:23 ` [PATCH v4 4/4] linux-user: Add syscall dispatch support Richard Henderson
2025-09-19  7:54 ` [PATCH v4 0/4] " Arusekk
2025-09-19 12:58   ` Richard Henderson

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).