From nobody Tue Sep 29 02:04:18 2026 Received: from azure-sdnproxy.icoremail.net (azure-sdnproxy.icoremail.net [207.46.229.174]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 84E803630AD; Thu, 13 Aug 2026 12:01:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=207.46.229.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786622482; cv=none; b=cF4BrhP7/YoPL85m8Km+mna+MuuZ4S7JDvSoIiGo4mGGkGcdUr+blJBl+TrtzWiI2StbwJMX0NLqBCpXiAIOXiIzmgyGU0XpPlFrX07wkyS/vtCxHohj5uvE4ndEkqDlhqDsc26Zq3PqgzPmTnVUZAz7Edos224HYxB0ywNWldY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786622482; c=relaxed/simple; bh=SadDlS2PnkPWF4BBgT4udo6zw/CIXbGksAEbMwF7c3s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=q4pZBu+9Dd7SiyaMIUY5oEutbzY9m3wuTcueUe5DJF1sMSEtKKvCLtswOgagu7hiwU+CakuX/VfA6Fu0zrIzyEiNsvsSmawYi2gdhc4ehEsUcsqrwx8iUQp2NzE+Q1ui+X/NxnTmpAIxiwnr/j0stt2S79/bbYVupsU34HlBOtY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mails.tsinghua.edu.cn; spf=pass smtp.mailfrom=mails.tsinghua.edu.cn; dkim=pass (1024-bit key) header.d=mails.tsinghua.edu.cn header.i=@mails.tsinghua.edu.cn header.b=CHWFW1fN; arc=none smtp.client-ip=207.46.229.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mails.tsinghua.edu.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mails.tsinghua.edu.cn Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=mails.tsinghua.edu.cn header.i=@mails.tsinghua.edu.cn header.b="CHWFW1fN" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mails.tsinghua.edu.cn; s=dkim; h=Received:From:Date:Subject: MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id: References:In-Reply-To:To:Cc; bh=mhmg0jz4epF+mQMXviAL//brfEBQt1P V3NeoVdN0B7k=; b=CHWFW1fNEUFTrFagg+Z9vSzAmnbZFDqNU8yIAPcmhl/heMg h3yFV2Q4MD69Dy+dkIBJclymrMDYcmc6xgIR2fH85CX+KQlCQJstO9OL4aPbZYI8 K20d6Ep3zctvDvboXCI0e37JDim4Q3hzHxqL0h2pnFNJzOZ8+3eYV7HAmKHA= Received: from [172.17.0.4] (unknown [101.6.30.195]) by web3 (Coremail) with SMTP id ygQGZQAn+BbosX1q_MyTAA--.65327S3; Thu, 13 Aug 2026 20:00:46 +0800 (CST) From: Yiyang Chen Date: Thu, 13 Aug 2026 12:00:40 +0000 Subject: [PATCH bpf-next 1/2] bpf, x86: Normalize narrow kfunc returns on IA32 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260813-bpf-next-039-ia32-kfunc-return-v1-v1-1-37495ec632b5@mails.tsinghua.edu.cn> References: <20260813-bpf-next-039-ia32-kfunc-return-v1-v1-0-37495ec632b5@mails.tsinghua.edu.cn> In-Reply-To: <20260813-bpf-next-039-ia32-kfunc-return-v1-v1-0-37495ec632b5@mails.tsinghua.edu.cn> To: Wang YanQing , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Eduard Zingerman , Kumar Kartikeya Dwivedi , Martin KaFai Lau , Song Liu , Yonghong Song , Jiri Olsa , Emil Tsalapatis , Ihor Solodrai , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Shuah Khan Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Yiyang Chen X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1786622447; l=2921; i=chenyy23@mails.tsinghua.edu.cn; s=kernel; h=from:subject:message-id; bh=SadDlS2PnkPWF4BBgT4udo6zw/CIXbGksAEbMwF7c3s=; b=HqmqozPAkMGLtZ43esDle7cF+qJ+mSkEOaGdrPWJekfXMchm2kdzN8equ1g6CfyL2N4/Lc6sN mkf7QuXui0iBrdSJNZMmb1FMQi5KtrHLFb0Es4WtOvzd7bRCVTpXkN1 X-Developer-Key: i=chenyy23@mails.tsinghua.edu.cn; a=ed25519; pk=+Q11PEDVzoU+87KHlIeNWKwv/GiutzE5094ej7opM+s= X-CM-TRANSID: ygQGZQAn+BbosX1q_MyTAA--.65327S3 X-Coremail-Antispam: 1UD129KBjvJXoWxGr4rCFyDAFW8uFy3GrWruFg_yoW5WrWxpF WakFWfCF1qg343Xr1aqr1kZw4rJa40qFsFkrZI9347W3Zrt340gr4aka45Xas0krnYkr15 GFWY9r1S9anrZw7anT9S1TB71UUUUUJqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBS1xkIjI8I6I8E6xAIw20EY4v20xvaj40_Wr0E3s1l8cAvFVAK 0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28EF7xvwVC0I7IYx2IY67AKxVW5JVW7JwA2z4 x0Y4vE2Ix0cI8IcVCY1x0267AKxVWxJVW8Jr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2 z4x0Y4vEx4A2jsIEc7CjxVAFwI0_GcCE3s1ln4kS14v26r1Y6r17M2vYz4IE04k24VAvwV AKI4IrM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj 6x8ErcxFaVAv8VW8Ww4UJr1UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrw ACjI8F5VA0II8E6IAqYI8I648v4I1lFIxGxcIEc7CjxVA2Y2ka0xkIwI1lc7CjxVAaw2AF wI0_GFv_Wrylc2xSY4AK67AK6ryUMxAIw28IcxkI7VAKI48JMxAIw28IcVCjz48v1sIEY2 0_GrWkJr1UJwCFx2IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I 3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_GFv_WrylIxkGc2Ij64vIr41lIx AIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF 0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVW8JVWxJwCI42IY6I8E87 Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfUOq2NDUUUU X-CM-SenderInfo: xfkh05r1stqzpdlo2hxwvl0wxkxdhvlgxou0/ IA32 stores each BPF register in two 32-bit scratch words. A kfunc returning four bytes or less currently updates only R0.low32, leaving R0.high32 with its previous scratch value even though later BPF instructions may read the full register. Use the BTF function model to sign- or zero-extend one-, two-, and four-byte returns into EDX:EAX, then store both words of R0. Keep the existing EDX:EAX handling for eight-byte returns. Fixes: 797b84f727bc ("bpf: Support kernel function call in x86-32") Signed-off-by: Yiyang Chen --- arch/x86/net/bpf_jit_comp32.c | 53 +++++++++++++++++++++++++++++++++++----= ---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/arch/x86/net/bpf_jit_comp32.c b/arch/x86/net/bpf_jit_comp32.c index 852baf2e4db4d..017cc9e7e4e2b 100644 --- a/arch/x86/net/bpf_jit_comp32.c +++ b/arch/x86/net/bpf_jit_comp32.c @@ -1620,13 +1620,25 @@ static int emit_kfunc_call(const struct bpf_prog *b= pf_prog, u8 *end_addr, /* add esp,"bytes_in_stack" */ end_addr -=3D 3; =20 - /* mov dword ptr [ebp+off],edx */ - if (fm->ret_size > sizeof(u32)) - end_addr -=3D 3; - - /* mov dword ptr [ebp+off],eax */ - if (fm->ret_size) + switch (fm->ret_size) { + case 0: + break; + case sizeof(u8): + case sizeof(u16): + /* mov[s|z]x eax,[a]x */ end_addr -=3D 3; + fallthrough; + case sizeof(u32): + /* cdq or xor edx,edx */ + end_addr -=3D fm->ret_flags & BTF_FMODEL_SIGNED_ARG ? 1 : 2; + fallthrough; + case sizeof(u64): + /* Store EDX:EAX in R0. */ + end_addr -=3D 6; + break; + default: + return -EINVAL; + } =20 jmp_offset =3D (u8 *)__bpf_call_base + insn->imm - end_addr; if (!is_simm32(jmp_offset)) { @@ -1637,15 +1649,38 @@ static int emit_kfunc_call(const struct bpf_prog *b= pf_prog, u8 *end_addr, =20 EMIT1_off32(0xE8, jmp_offset); =20 - if (fm->ret_size) + switch (fm->ret_size) { + case sizeof(u8): + /* mov[s|z]x eax,al */ + EMIT3(0x0F, fm->ret_flags & BTF_FMODEL_SIGNED_ARG ? 0xBE : 0xB6, + add_2reg(0xC0, IA32_EAX, IA32_EAX)); + break; + case sizeof(u16): + /* mov[s|z]x eax,ax */ + EMIT3(0x0F, fm->ret_flags & BTF_FMODEL_SIGNED_ARG ? 0xBF : 0xB7, + add_2reg(0xC0, IA32_EAX, IA32_EAX)); + break; + default: + break; + } + + if (fm->ret_size && fm->ret_size <=3D sizeof(u32)) { + if (fm->ret_flags & BTF_FMODEL_SIGNED_ARG) + /* cdq */ + EMIT1(0x99); + else + /* xor edx,edx */ + EMIT2(0x31, add_2reg(0xC0, IA32_EDX, IA32_EDX)); + } + + if (fm->ret_size) { /* mov dword ptr [ebp+off],eax */ EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EAX), STACK_VAR(bpf2ia32[BPF_REG_0][0])); - - if (fm->ret_size > sizeof(u32)) /* mov dword ptr [ebp+off],edx */ EMIT3(0x89, add_2reg(0x40, IA32_EBP, IA32_EDX), STACK_VAR(bpf2ia32[BPF_REG_0][1])); + } =20 if (bytes_in_stack) /* add esp,"bytes_in_stack" */ --=20 2.43.0 From nobody Tue Sep 29 02:04:18 2026 Received: from azure-sdnproxy.icoremail.net (azure-sdnproxy.icoremail.net [40.65.178.148]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BD2413C2775; Thu, 13 Aug 2026 12:01:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=40.65.178.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786622483; cv=none; b=J0mB1k5t1Rsg97xZ2tBDrkxzAkxO9piaDzyBzZYvd8RNJ9gzg+wfAZRt3atTzfNufWyO98yghn9rBE53HHbr8yoJDTY8i3z7T7f6Lu2KLprozXbNyCv7RKe7MxWl1Tx6XqZh+V+ym4vDRDBayQZNcsuQOS8fTHoHedM2XDifE74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786622483; c=relaxed/simple; bh=6NboFQuHCKK8vq6XXSVXro/UcsBd2lnP0eeO1DCHFck=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZIjlHd/oOCij1L7ma2f4L/9AOrKdzsK6UuFHXk0It8JrQZECrHTRfsjUcsSxGFrFvU4B77ryP0DotfB1lowS+gzPjHcPRWgzLwr2GyTAYX50WV1uLW1ovre6PLyDYHJu6d11z53vqLXhyyNXKa3jYrvh1MWIiyVm2M+ywJsLPPg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mails.tsinghua.edu.cn; spf=pass smtp.mailfrom=mails.tsinghua.edu.cn; dkim=pass (1024-bit key) header.d=mails.tsinghua.edu.cn header.i=@mails.tsinghua.edu.cn header.b=Mk7Gt1d5; arc=none smtp.client-ip=40.65.178.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mails.tsinghua.edu.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mails.tsinghua.edu.cn Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=mails.tsinghua.edu.cn header.i=@mails.tsinghua.edu.cn header.b="Mk7Gt1d5" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mails.tsinghua.edu.cn; s=dkim; h=Received:From:Date:Subject: MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id: References:In-Reply-To:To:Cc; bh=+KzligLo6ZhjIxe52XRB5qyxdak6CJv SAA7e7j0F6zU=; b=Mk7Gt1d5MMNTa+BsDjXxJJVAvp5hqJH2lEmTuigGahXV0BE eqxFtmMElW79Cc1BiH14Xxl2FhAn7idh3HGRaqLkFN4UPW3U8a5fGLzdvDx+/pZ9 NV8RC9rmk2nFyzHJq5DYHT84WTZ9XBmhIk9IqsInbVd1GB2mMXJmaVnZgSVE= Received: from [172.17.0.4] (unknown [101.6.30.195]) by web3 (Coremail) with SMTP id ygQGZQAn+BbosX1q_MyTAA--.65327S4; Thu, 13 Aug 2026 20:00:47 +0800 (CST) From: Yiyang Chen Date: Thu, 13 Aug 2026 12:00:41 +0000 Subject: [PATCH bpf-next 2/2] selftests/bpf: Cover IA32 narrow kfunc returns Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260813-bpf-next-039-ia32-kfunc-return-v1-v1-2-37495ec632b5@mails.tsinghua.edu.cn> References: <20260813-bpf-next-039-ia32-kfunc-return-v1-v1-0-37495ec632b5@mails.tsinghua.edu.cn> In-Reply-To: <20260813-bpf-next-039-ia32-kfunc-return-v1-v1-0-37495ec632b5@mails.tsinghua.edu.cn> To: Wang YanQing , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Eduard Zingerman , Kumar Kartikeya Dwivedi , Martin KaFai Lau , Song Liu , Yonghong Song , Jiri Olsa , Emil Tsalapatis , Ihor Solodrai , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Shuah Khan Cc: bpf@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Yiyang Chen X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1786622447; l=5739; i=chenyy23@mails.tsinghua.edu.cn; s=kernel; h=from:subject:message-id; bh=6NboFQuHCKK8vq6XXSVXro/UcsBd2lnP0eeO1DCHFck=; b=03TIQLagEWJbuhokKoGGhwh6AdPVLu4U48CeCNtRP+fthMfKKCLFrP/38T2mNZVpDRWRuX+Yt Xb6DfhdI+f0CesbT+savx1cXO4/WdMzVCWrbnoXr3XFLRNWWXWdYmdo X-Developer-Key: i=chenyy23@mails.tsinghua.edu.cn; a=ed25519; pk=+Q11PEDVzoU+87KHlIeNWKwv/GiutzE5094ej7opM+s= X-CM-TRANSID: ygQGZQAn+BbosX1q_MyTAA--.65327S4 X-Coremail-Antispam: 1UD129KBjvJXoW3AF13AF43ArW5Cr17KFyUJrb_yoW7ZF1rpa 4kC34qkrn7G3W3WF1xGF4UuFWfKFs7Z3yUJr40gr97ZF1UX34DXr4xKFW5tr95K3yF93yY ya4Sga13ZF1xAaUanT9S1TB71UUUUUJqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUBq1xkIjI8I6I8E6xAIw20EY4v20xvaj40_Wr0E3s1l8cAvFVAK 0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28EF7xvwVC0I7IYx2IY67AKxVW5JVW7JwA2z4 x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l 84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s0DM2kKe7AKxVWUXVWUAwAac4AC62xK8xCEY4 vEwIxC4wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv 7VCjz48v1sIEY20_GrWkJr1UJwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr4 1lF7I21c0EjII2zVCS5cI20VAGYxC7M4IIrI8v6xkF7I0E8cxan2IY04v7MxkF7I0En4kS 14v26r4a6rW5MxkIecxEwVAFwVW5JwCF04k20xvY0x0EwIxGrwCF04k20xvE74AGY7Cv6c x26r4rKr1UJr1l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC2 0s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r4a6rW5MIIYrxkI7VAKI48JMI IF0xvE2Ix0cI8IcVAFwI0_JFI_Gr1lIxAIcVC0I7IYx2IY6xkF7I0E14v26F4j6r4UJwCI 42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z2 80aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbPxhPUUUUU== X-CM-SenderInfo: xfkh05r1stqzpdlo2hxwvl0wxkxdhvlgxou0/ Teach test_loader to select IA32-specific cases and add unsigned bool and signed int kfunc-return tests. Each case consumes the high half of R0 after the call and checks the required zero or sign extension. Signed-off-by: Yiyang Chen --- tools/testing/selftests/bpf/prog_tests/verifier.c | 2 + tools/testing/selftests/bpf/progs/bpf_misc.h | 1 + .../selftests/bpf/progs/verifier_kfunc_return.c | 84 ++++++++++++++++++= ++++ tools/testing/selftests/bpf/test_loader.c | 13 ++-- 4 files changed, 96 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/verifier.c b/tools/test= ing/selftests/bpf/prog_tests/verifier.c index 8113fea7ba86c..4638e0a45db6e 100644 --- a/tools/testing/selftests/bpf/prog_tests/verifier.c +++ b/tools/testing/selftests/bpf/prog_tests/verifier.c @@ -127,6 +127,7 @@ #include "verifier_set_retval.skel.h" #include "verifier_lsm.skel.h" #include "verifier_jit_inline.skel.h" +#include "verifier_kfunc_return.skel.h" #include "irq.skel.h" #include "verifier_ctx_ptr_param.skel.h" #include "verifier_zext.skel.h" @@ -289,6 +290,7 @@ void test_verifier_lsm(void) { RUN(ver= ifier_lsm); } void test_irq(void) { RUN(irq); } void test_verifier_mtu(void) { RUN(verifier_mtu); } void test_verifier_jit_inline(void) { RUN(verifier_jit_inlin= e); } +void test_verifier_kfunc_return(void) { RUN(verifier_kfunc_ret= urn); } void test_verifier_ctx_ptr_param(void) { RUN(verifier_ctx_ptr_param)= ; } void test_verifier_zext(void) { RUN_TESTS(verifier_zext); } =20 diff --git a/tools/testing/selftests/bpf/progs/bpf_misc.h b/tools/testing/s= elftests/bpf/progs/bpf_misc.h index 5eacf1b432521..1498da04597af 100644 --- a/tools/testing/selftests/bpf/progs/bpf_misc.h +++ b/tools/testing/selftests/bpf/progs/bpf_misc.h @@ -155,6 +155,7 @@ #define __btf_func_path(path) __test_tag("test_btf_func_path=3D" path) #define __arch(arch) __test_tag("test_arch=3D" arch) #define __arch_x86_64 __arch("X86_64") +#define __arch_x86_32 __arch("X86_32") #define __arch_arm64 __arch("ARM64") #define __arch_riscv64 __arch("RISCV64") #define __arch_s390x __arch("s390x") diff --git a/tools/testing/selftests/bpf/progs/verifier_kfunc_return.c b/to= ols/testing/selftests/bpf/progs/verifier_kfunc_return.c new file mode 100644 index 0000000000000..52a94daf03922 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/verifier_kfunc_return.c @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define BPF_NO_KFUNC_PROTOTYPES +#include +#include +#include "bpf_misc.h" + +extern int bpf_strcmp(const char *s1__ign, const char *s2__ign) __ksym; +extern bool bpf_dynptr_is_null(const struct bpf_dynptr *p) __ksym; + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, __u32); + __type(value, __u64); +} kfunc_return_map SEC(".maps"); + +static const char string_a[] =3D "a"; +static const char string_b[] =3D "b"; + +void __kfunc_btf_root(void) +{ + struct bpf_dynptr ptr =3D {}; + + bpf_strcmp(string_a, string_b); + bpf_dynptr_is_null(&ptr); +} + +SEC("syscall") +__flag(BPF_F_SLEEPABLE) +__success __retval(0) +__arch_x86_32 +__naked void kfunc_bool_return_zero_extended(void) +{ + asm volatile (" \ + r0 =3D 0; \ + *(u32 *)(r10 - 4) =3D r0; \ + r2 =3D r10; \ + r2 +=3D -4; \ + r1 =3D %[kfunc_return_map] ll; \ + call %[bpf_map_lookup_elem]; \ + if r0 =3D=3D 0 goto 1f; \ + r1 =3D r0; \ + r2 =3D 8; \ + r3 =3D 0; \ + r4 =3D r10; \ + r4 +=3D -24; \ + call %[bpf_dynptr_from_mem]; \ + if r0 !=3D 0 goto 1f; \ + r0 =3D 0x100000000 ll; \ + r1 =3D r10; \ + r1 +=3D -24; \ + call bpf_dynptr_is_null; \ + r0 >>=3D 32; \ + exit; \ +1: r0 =3D 2; \ + exit; \ +" : + : __imm_addr(kfunc_return_map), + __imm(bpf_map_lookup_elem), + __imm(bpf_dynptr_from_mem) + : __clobber_all); +} + +SEC("syscall") +__flag(BPF_F_SLEEPABLE) +__success __retval(-1) +__arch_x86_32 +__naked void kfunc_int_return_sign_extended(void) +{ + asm volatile (" \ + r0 =3D 0; \ + r1 =3D %[string_a] ll; \ + r2 =3D %[string_b] ll; \ + call bpf_strcmp; \ + r0 >>=3D 32; \ + exit; \ +" : + : __imm_addr(string_a), + __imm_addr(string_b) + : __clobber_all); +} + +char _license[] SEC("license") =3D "GPL"; diff --git a/tools/testing/selftests/bpf/test_loader.c b/tools/testing/self= tests/bpf/test_loader.c index 07807757b518d..8a9f4a31a1bb1 100644 --- a/tools/testing/selftests/bpf/test_loader.c +++ b/tools/testing/selftests/bpf/test_loader.c @@ -374,16 +374,19 @@ static const char **collect_decl_tags(struct btf *btf= , int id, int *cnt) enum arch { ARCH_UNKNOWN =3D 0x1, ARCH_X86_64 =3D 0x2, - ARCH_ARM64 =3D 0x4, - ARCH_RISCV64 =3D 0x8, - ARCH_S390X =3D 0x10, - ARCH_LOONGARCH =3D 0x20, + ARCH_X86_32 =3D 0x4, + ARCH_ARM64 =3D 0x8, + ARCH_RISCV64 =3D 0x10, + ARCH_S390X =3D 0x20, + ARCH_LOONGARCH =3D 0x40, }; =20 static int get_current_arch(void) { #if defined(__x86_64__) return ARCH_X86_64; +#elif defined(__i386__) + return ARCH_X86_32; #elif defined(__aarch64__) return ARCH_ARM64; #elif defined(__riscv) && __riscv_xlen =3D=3D 64 @@ -577,6 +580,8 @@ static int parse_test_spec(struct test_loader *tester, } else if ((val =3D str_has_pfx(s, "test_arch=3D"))) { if (strcmp(val, "X86_64") =3D=3D 0) { arch =3D ARCH_X86_64; + } else if (strcmp(val, "X86_32") =3D=3D 0) { + arch =3D ARCH_X86_32; } else if (strcmp(val, "ARM64") =3D=3D 0) { arch =3D ARCH_ARM64; } else if (strcmp(val, "RISCV64") =3D=3D 0) { --=20 2.43.0