From nobody Sun Sep 28 15:28:20 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1758679739; cv=none; d=zohomail.com; s=zohoarc; b=hvr6nS6cHVi6+BlecWqQ5pMVd5ldbJa5IDwTciGGAuNZObGJF5UDnscrfEx1y3QJklDeZDPDUmOZopxOAqiKxpe10Y00avaol79+brhlrfU7fYi/9QZJNYcQxGbnVBZ+qguNZt/wXQGx6XsULBTmUbDmlj6EeD2UYE4lYak4+UE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758679739; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=jABygsIZug9i9bIaQapu8hPs02ozJyRszjhHECbv97E=; b=oBm6xJmZHgLBcbYV4q+PwOvVEwI3IWhM1179Y8uhonrAdgjvBWzjjh19XuDYJP7RA9hklSM7cCkpIGVzBUUMsZNaslfWw2FWDj+fJMlOSCo/Gv+daqFWz92t/ri0B3qeI6CaBYDUyFeulGgQ1P+NE0c/htpprdwGZ0IS04QqhzA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1758679739498232.73552692787484; Tue, 23 Sep 2025 19:08:59 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v1Ev6-0002z7-AJ; Tue, 23 Sep 2025 22:07:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v1Ev2-0002xD-Ro for qemu-devel@nongnu.org; Tue, 23 Sep 2025 22:07:44 -0400 Received: from mail-pg1-x532.google.com ([2607:f8b0:4864:20::532]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1v1Euz-0002bs-PF for qemu-devel@nongnu.org; Tue, 23 Sep 2025 22:07:44 -0400 Received: by mail-pg1-x532.google.com with SMTP id 41be03b00d2f7-b54a588ad96so420907a12.1 for ; Tue, 23 Sep 2025 19:07:41 -0700 (PDT) Received: from stoup.. ([71.212.157.132]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3341bcd9afbsm565664a91.0.2025.09.23.19.07.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Sep 2025 19:07:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1758679660; x=1759284460; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jABygsIZug9i9bIaQapu8hPs02ozJyRszjhHECbv97E=; b=Y1/mNrTSGODFRPq5b/eZ6YH6rrBkT7ZZvQ/YAEnhLJaZff2L3y/sn8Rq2GfVHOdESk ANlnBzkWkax63/yixl7qZMtIMzi1y91PzUFhmfL3PhskyVGevLBCglC/Ah2h018xOAkD WRbhqkL5RW2DbJQnjJDkNno45qOEWEdXT7DkKH5XEhNXHfpLUKdaaeuHN9b/uby1z0u8 9DcFJcmpCSjhNKjqjGLhdpdb/1vC05i1OM3q7pLm0DPKqjLeAcMcLniSwoI5boaWEtZP 4hgilNLHYrcjin1KjTGs+6VPT0NeSPgq5C/klPKvB91w2c5rKknRIG2Zp8Sfr7oIENSE bR0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758679660; x=1759284460; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jABygsIZug9i9bIaQapu8hPs02ozJyRszjhHECbv97E=; b=syYCLovtVcvpSvwPGm1/I9H6SF5u8W6kQuN1/UzsdDIcQp/D8UT2yTSlsxx0PMpe54 PCoDDuIJqtz8N4j2zTsSNKaKPew7iDDcuxGUR/7ba9FzenjBrCT43rLjl72UW42F/Ub6 SgmCjFJAfvmE9GTi6ouckEJHgKJcG7eVmDEQ7GhCG/2+HiENsuBPxTb+PobV6rEoLhGA frQjxwu9Pyk7rBfYzfHRuGMTrKTERDc2R2Ic74YeuOz77QO/hphRSHkQjEJdJYnNFpJX vEI+IPgIx5nWUSnHaUXnFJD6f7DwJu/CqDdW4LUuyX/ESrAWqWetZPwvbdxBqlOhnc7J j77g== X-Gm-Message-State: AOJu0YwRvslf4TnPNmX4WSuzg1V4tDy7HfNls7tKr1QEj+GrMNw5Zyh8 zF/LfkCpwZdI3kgUbBUTrzR3x+JZ10XsDYBFRjfulgO6f9gCMrDRdxK9zPzM2TzSE0jK+s+vxLV OJiAg X-Gm-Gg: ASbGncuf+Mdd4wb8wm+K0I7Z6zGpgOo0zgdBHqJVxQZA0pJluakeq+LNCBkux7W0cCb PRscaSDjjuyYFsY0a94NhTgeoSbyQnnYsdRd1a9gb0PRlWQlZxvm2pcKHfOlNWOOSQ8JEkG3U3v 7rU7dvgtcY+JuQHaQeCcUq65HcVdAJbAf80fO7RuvxRVJ+aR6Ka5+Lyn59lL2hMzdinZGNZ8f+2 qWLdvHBsrTdoudKwjVtsi3wrgSMltEI3Vm8HpsyH4P0ZOwPRK1aFX2cD9fzujeea4va74+k+uxt FpoDhDC0JEQi+ANOxxgCAYCT/i4qlzdMeU7qWt8g1cThkxYEzMu+3VF6fcEEoljWPDqWD6En/c9 G22UqWPGM69Kv+I0oGg26ZG6dS/Jj X-Google-Smtp-Source: AGHT+IFarHjhrS56Y7evxaPRuu84KUimJqkH0J1E44x1FSqWSyOMALnA/BEoSmjiZNv+w6TZATnVjA== X-Received: by 2002:a17:902:f645:b0:276:54f3:e6b with SMTP id d9443c01a7336-27ec13af4cbmr6672095ad.27.1758679659440; Tue, 23 Sep 2025 19:07:39 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: jonwilson030981@googlemail.com Subject: [PATCH 1/2] accel/tcg: Add clear_flags argument to page_set_flags Date: Tue, 23 Sep 2025 19:07:33 -0700 Message-ID: <20250924020735.3909216-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250924020735.3909216-1-richard.henderson@linaro.org> References: <20250924020735.3909216-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::532; envelope-from=richard.henderson@linaro.org; helo=mail-pg1-x532.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1758679741371116600 Content-Type: text/plain; charset="utf-8" Expand the interface of page_set_flags to separate the set of flags to be set and the set of flags to be cleared. This allows us to replace PAGE_RESET with the PAGE_VALID bit within clear_flags. Replace PAGE_TARGET_STICKY with TARGET_PAGE_NOTSTICKY; aarch64-linux-user is the only user. Signed-off-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- bsd-user/bsd-mem.h | 7 +- include/exec/page-protection.h | 13 ++-- include/user/page-protection.h | 9 ++- target/arm/cpu.h | 1 - accel/tcg/user-exec.c | 114 +++++++++------------------------ bsd-user/mmap.c | 6 +- linux-user/arm/elfload.c | 2 +- linux-user/hppa/elfload.c | 2 +- linux-user/mmap.c | 32 +++++---- linux-user/x86_64/elfload.c | 2 +- 10 files changed, 71 insertions(+), 117 deletions(-) diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h index 1be906c591..416d0f8c23 100644 --- a/bsd-user/bsd-mem.h +++ b/bsd-user/bsd-mem.h @@ -390,8 +390,9 @@ static inline abi_long do_bsd_shmat(int shmid, abi_ulon= g shmaddr, int shmflg) raddr =3D h2g(host_raddr); =20 page_set_flags(raddr, raddr + shm_info.shm_segsz - 1, - PAGE_VALID | PAGE_RESET | PAGE_READ | - (shmflg & SHM_RDONLY ? 0 : PAGE_WRITE)); + PAGE_VALID | PAGE_READ | + (shmflg & SHM_RDONLY ? 0 : PAGE_WRITE), + PAGE_VALID); =20 for (int i =3D 0; i < N_BSD_SHM_REGIONS; i++) { if (bsd_shm_regions[i].start =3D=3D 0) { @@ -428,7 +429,7 @@ static inline abi_long do_bsd_shmdt(abi_ulong shmaddr) abi_ulong size =3D bsd_shm_regions[i].size; =20 bsd_shm_regions[i].start =3D 0; - page_set_flags(shmaddr, shmaddr + size - 1, 0); + page_set_flags(shmaddr, shmaddr + size - 1, 0, PAGE_VALID); mmap_reserve(shmaddr, size); } } diff --git a/include/exec/page-protection.h b/include/exec/page-protection.h index c43231af8b..5a18f98a3a 100644 --- a/include/exec/page-protection.h +++ b/include/exec/page-protection.h @@ -23,8 +23,11 @@ * Low-Address-Protection. Used with PAGE_WRITE in tlb_set_page_with_attrs= () */ #define PAGE_WRITE_INV 0x0020 -/* For use with page_set_flags: page is being replaced; target_data cleare= d. */ -#define PAGE_RESET 0x0040 +/* + * For linux-user, indicates that the page is mapped with the same semanti= cs + * in both guest and host. + */ +#define PAGE_PASSTHROUGH 0x40 /* For linux-user, indicates that the page is MAP_ANON. */ #define PAGE_ANON 0x0080 =20 @@ -32,10 +35,4 @@ #define PAGE_TARGET_1 0x0200 #define PAGE_TARGET_2 0x0400 =20 -/* - * For linux-user, indicates that the page is mapped with the same semanti= cs - * in both guest and host. - */ -#define PAGE_PASSTHROUGH 0x0800 - #endif diff --git a/include/user/page-protection.h b/include/user/page-protection.h index 4bde664e4a..41b23e72fc 100644 --- a/include/user/page-protection.h +++ b/include/user/page-protection.h @@ -23,14 +23,19 @@ int page_get_flags(vaddr address); * page_set_flags: * @start: first byte of range * @last: last byte of range - * @flags: flags to set + * @set_flags: flags to set + * @clr_flags: flags to clear * Context: holding mmap lock * * Modify the flags of a page and invalidate the code if necessary. * The flag PAGE_WRITE_ORG is positioned automatically depending * on PAGE_WRITE. The mmap_lock should already be held. + * + * For each page, flags =3D (flags & ~clr_flags) | set_flags. + * If clr_flags includes PAGE_VALID, this indicates a new mapping + * and page_reset_target_data will be called as well. */ -void page_set_flags(vaddr start, vaddr last, int flags); +void page_set_flags(vaddr start, vaddr last, int set_flags, int clr_flags); =20 void page_reset_target_data(vaddr start, vaddr last); =20 diff --git a/target/arm/cpu.h b/target/arm/cpu.h index 1c0deb723d..6bd6d879ef 100644 --- a/target/arm/cpu.h +++ b/target/arm/cpu.h @@ -3224,7 +3224,6 @@ extern const uint64_t pred_esz_masks[5]; */ #define PAGE_BTI PAGE_TARGET_1 #define PAGE_MTE PAGE_TARGET_2 -#define PAGE_TARGET_STICKY PAGE_MTE =20 /* We associate one allocation tag per 16 bytes, the minimum. */ #define LOG2_TAG_GRANULE 4 diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c index 916f18754f..1800dffa63 100644 --- a/accel/tcg/user-exec.c +++ b/accel/tcg/user-exec.c @@ -269,48 +269,6 @@ static void pageflags_create(vaddr start, vaddr last, = int flags) interval_tree_insert(&p->itree, &pageflags_root); } =20 -/* A subroutine of page_set_flags: remove everything in [start,last]. */ -static bool pageflags_unset(vaddr start, vaddr last) -{ - bool inval_tb =3D false; - - while (true) { - PageFlagsNode *p =3D pageflags_find(start, last); - vaddr p_last; - - if (!p) { - break; - } - - if (p->flags & PAGE_EXEC) { - inval_tb =3D true; - } - - interval_tree_remove(&p->itree, &pageflags_root); - p_last =3D p->itree.last; - - if (p->itree.start < start) { - /* Truncate the node from the end, or split out the middle. */ - p->itree.last =3D start - 1; - interval_tree_insert(&p->itree, &pageflags_root); - if (last < p_last) { - pageflags_create(last + 1, p_last, p->flags); - break; - } - } else if (p_last <=3D last) { - /* Range completely covers node -- remove it. */ - g_free_rcu(p, rcu); - } else { - /* Truncate the node from the start. */ - p->itree.start =3D last + 1; - interval_tree_insert(&p->itree, &pageflags_root); - break; - } - } - - return inval_tb; -} - /* * A subroutine of page_set_flags: nothing overlaps [start,last], * but check adjacent mappings and maybe merge into a single range. @@ -356,15 +314,6 @@ static void pageflags_create_merge(vaddr start, vaddr = last, int flags) } } =20 -/* - * Allow the target to decide if PAGE_TARGET_[12] may be reset. - * By default, they are not kept. - */ -#ifndef PAGE_TARGET_STICKY -#define PAGE_TARGET_STICKY 0 -#endif -#define PAGE_STICKY (PAGE_ANON | PAGE_PASSTHROUGH | PAGE_TARGET_STICKY) - /* A subroutine of page_set_flags: add flags to [start,last]. */ static bool pageflags_set_clear(vaddr start, vaddr last, int set_flags, int clear_flags) @@ -377,7 +326,7 @@ static bool pageflags_set_clear(vaddr start, vaddr last, restart: p =3D pageflags_find(start, last); if (!p) { - if (set_flags) { + if (set_flags & PAGE_VALID) { pageflags_create_merge(start, last, set_flags); } goto done; @@ -391,11 +340,12 @@ static bool pageflags_set_clear(vaddr start, vaddr la= st, =20 /* * Need to flush if an overlapping executable region - * removes exec, or adds write. + * removes exec, adds write, or is a new mapping. */ if ((p_flags & PAGE_EXEC) && (!(merge_flags & PAGE_EXEC) - || (merge_flags & ~p_flags & PAGE_WRITE))) { + || (merge_flags & ~p_flags & PAGE_WRITE) + || (clear_flags & PAGE_VALID))) { inval_tb =3D true; } =20 @@ -404,7 +354,7 @@ static bool pageflags_set_clear(vaddr start, vaddr last, * attempting to merge with adjacent regions. */ if (start =3D=3D p_start && last =3D=3D p_last) { - if (merge_flags) { + if (merge_flags & PAGE_VALID) { p->flags =3D merge_flags; } else { interval_tree_remove(&p->itree, &pageflags_root); @@ -424,12 +374,12 @@ static bool pageflags_set_clear(vaddr start, vaddr la= st, interval_tree_insert(&p->itree, &pageflags_root); =20 if (last < p_last) { - if (merge_flags) { + if (merge_flags & PAGE_VALID) { pageflags_create(start, last, merge_flags); } pageflags_create(last + 1, p_last, p_flags); } else { - if (merge_flags) { + if (merge_flags & PAGE_VALID) { pageflags_create(start, p_last, merge_flags); } if (p_last < last) { @@ -438,18 +388,18 @@ static bool pageflags_set_clear(vaddr start, vaddr la= st, } } } else { - if (start < p_start && set_flags) { + if (start < p_start && (set_flags & PAGE_VALID)) { pageflags_create(start, p_start - 1, set_flags); } if (last < p_last) { interval_tree_remove(&p->itree, &pageflags_root); p->itree.start =3D last + 1; interval_tree_insert(&p->itree, &pageflags_root); - if (merge_flags) { + if (merge_flags & PAGE_VALID) { pageflags_create(start, last, merge_flags); } } else { - if (merge_flags) { + if (merge_flags & PAGE_VALID) { p->flags =3D merge_flags; } else { interval_tree_remove(&p->itree, &pageflags_root); @@ -497,7 +447,7 @@ static bool pageflags_set_clear(vaddr start, vaddr last, g_free_rcu(p, rcu); goto restart; } - if (set_flags) { + if (set_flags & PAGE_VALID) { pageflags_create(start, last, set_flags); } =20 @@ -505,42 +455,36 @@ static bool pageflags_set_clear(vaddr start, vaddr la= st, return inval_tb; } =20 -void page_set_flags(vaddr start, vaddr last, int flags) +void page_set_flags(vaddr start, vaddr last, int set_flags, int clear_flag= s) { - bool reset =3D false; - bool inval_tb =3D false; - - /* This function should never be called with addresses outside the - guest address space. If this assert fires, it probably indicates - a missing call to h2g_valid. */ + /* + * This function should never be called with addresses outside the + * guest address space. If this assert fires, it probably indicates + * a missing call to h2g_valid. + */ assert(start <=3D last); assert(last <=3D guest_addr_max); - /* Only set PAGE_ANON with new mappings. */ - assert(!(flags & PAGE_ANON) || (flags & PAGE_RESET)); assert_memory_lock(); =20 start &=3D TARGET_PAGE_MASK; last |=3D ~TARGET_PAGE_MASK; =20 - if (!(flags & PAGE_VALID)) { - flags =3D 0; - } else { - reset =3D flags & PAGE_RESET; - flags &=3D ~PAGE_RESET; - if (flags & PAGE_WRITE) { - flags |=3D PAGE_WRITE_ORG; - } + if (set_flags & PAGE_WRITE) { + set_flags |=3D PAGE_WRITE_ORG; + } + if (clear_flags & PAGE_WRITE) { + clear_flags |=3D PAGE_WRITE_ORG; } =20 - if (!flags || reset) { + if (clear_flags & PAGE_VALID) { page_reset_target_data(start, last); - inval_tb |=3D pageflags_unset(start, last); + clear_flags =3D -1; + } else { + /* Only set PAGE_ANON with new mappings. */ + assert(!(set_flags & PAGE_ANON)); } - if (flags) { - inval_tb |=3D pageflags_set_clear(start, last, flags, - ~(reset ? 0 : PAGE_STICKY)); - } - if (inval_tb) { + + if (pageflags_set_clear(start, last, set_flags, clear_flags)) { tb_invalidate_phys_range(NULL, start, last); } } diff --git a/bsd-user/mmap.c b/bsd-user/mmap.c index 47e317517c..24ba1728eb 100644 --- a/bsd-user/mmap.c +++ b/bsd-user/mmap.c @@ -122,7 +122,7 @@ int target_mprotect(abi_ulong start, abi_ulong len, int= prot) if (ret !=3D 0) goto error; } - page_set_flags(start, start + len - 1, prot | PAGE_VALID); + page_set_flags(start, start + len - 1, prot, PAGE_RWX); mmap_unlock(); return 0; error: @@ -652,7 +652,7 @@ abi_long target_mmap(abi_ulong start, abi_ulong len, in= t prot, } } the_end1: - page_set_flags(start, start + len - 1, prot | PAGE_VALID); + page_set_flags(start, start + len - 1, prot | PAGE_VALID, PAGE_VALID); the_end: #ifdef DEBUG_MMAP printf("ret=3D0x" TARGET_ABI_FMT_lx "\n", start); @@ -763,7 +763,7 @@ int target_munmap(abi_ulong start, abi_ulong len) } =20 if (ret =3D=3D 0) { - page_set_flags(start, start + len - 1, 0); + page_set_flags(start, start + len - 1, 0, PAGE_VALID); } mmap_unlock(); return ret; diff --git a/linux-user/arm/elfload.c b/linux-user/arm/elfload.c index b1a4db4466..fef61022a3 100644 --- a/linux-user/arm/elfload.c +++ b/linux-user/arm/elfload.c @@ -243,7 +243,7 @@ bool init_guest_commpage(void) } =20 page_set_flags(commpage, commpage | (host_page_size - 1), - PAGE_READ | PAGE_EXEC | PAGE_VALID); + PAGE_READ | PAGE_EXEC | PAGE_VALID, PAGE_VALID); return true; } =20 diff --git a/linux-user/hppa/elfload.c b/linux-user/hppa/elfload.c index 018034f244..4600708702 100644 --- a/linux-user/hppa/elfload.c +++ b/linux-user/hppa/elfload.c @@ -42,6 +42,6 @@ bool init_guest_commpage(void) * Special case the entry points during translation (see do_page_zero). */ page_set_flags(LO_COMMPAGE, LO_COMMPAGE | ~TARGET_PAGE_MASK, - PAGE_EXEC | PAGE_VALID); + PAGE_EXEC | PAGE_VALID, PAGE_VALID); return true; } diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 002e1e668e..0b69efe54c 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -167,6 +167,13 @@ static int target_to_host_prot(int prot) (prot & PROT_EXEC ? PROT_READ : 0); } =20 +/* Target bits to be cleared by mprotect if not present in target_prot. */ +#ifdef TARGET_AARCH64 +#define TARGET_PAGE_NOTSTICKY PAGE_BTI +#else +#define TARGET_PAGE_NOTSTICKY 0 +#endif + /* NOTE: all the constants are the HOST ones, but addresses are target. */ int target_mprotect(abi_ulong start, abi_ulong len, int target_prot) { @@ -264,7 +271,7 @@ int target_mprotect(abi_ulong start, abi_ulong len, int= target_prot) } } =20 - page_set_flags(start, last, page_flags); + page_set_flags(start, last, page_flags, PAGE_RWX | TARGET_PAGE_NOTSTIC= KY); ret =3D 0; =20 error: @@ -563,17 +570,17 @@ static abi_long mmap_end(abi_ulong start, abi_ulong l= ast, if (flags & MAP_ANONYMOUS) { page_flags |=3D PAGE_ANON; } - page_flags |=3D PAGE_RESET; if (passthrough_start > passthrough_last) { - page_set_flags(start, last, page_flags); + page_set_flags(start, last, page_flags, PAGE_VALID); } else { if (start < passthrough_start) { - page_set_flags(start, passthrough_start - 1, page_flags); + page_set_flags(start, passthrough_start - 1, + page_flags, PAGE_VALID); } page_set_flags(passthrough_start, passthrough_last, - page_flags | PAGE_PASSTHROUGH); + page_flags | PAGE_PASSTHROUGH, PAGE_VALID); if (passthrough_last < last) { - page_set_flags(passthrough_last + 1, last, page_flags); + page_set_flags(passthrough_last + 1, last, page_flags, PAGE_VA= LID); } } shm_region_rm_complete(start, last); @@ -1094,7 +1101,7 @@ int target_munmap(abi_ulong start, abi_ulong len) mmap_lock(); ret =3D mmap_reserve_or_unmap(start, len); if (likely(ret =3D=3D 0)) { - page_set_flags(start, start + len - 1, 0); + page_set_flags(start, start + len - 1, 0, PAGE_VALID); shm_region_rm_complete(start, start + len - 1); } mmap_unlock(); @@ -1185,10 +1192,10 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulon= g old_size, } else { new_addr =3D h2g(host_addr); prot =3D page_get_flags(old_addr); - page_set_flags(old_addr, old_addr + old_size - 1, 0); + page_set_flags(old_addr, old_addr + old_size - 1, 0, PAGE_VALID); shm_region_rm_complete(old_addr, old_addr + old_size - 1); page_set_flags(new_addr, new_addr + new_size - 1, - prot | PAGE_VALID | PAGE_RESET); + prot | PAGE_VALID, PAGE_VALID); shm_region_rm_complete(new_addr, new_addr + new_size - 1); } mmap_unlock(); @@ -1434,9 +1441,10 @@ abi_ulong target_shmat(CPUArchState *cpu_env, int sh= mid, =20 last =3D shmaddr + m_len - 1; page_set_flags(shmaddr, last, - PAGE_VALID | PAGE_RESET | PAGE_READ | + PAGE_VALID | PAGE_READ | (shmflg & SHM_RDONLY ? 0 : PAGE_WRITE) | - (shmflg & SHM_EXEC ? PAGE_EXEC : 0)); + (shmflg & SHM_EXEC ? PAGE_EXEC : 0), + PAGE_VALID); =20 shm_region_rm_complete(shmaddr, last); shm_region_add(shmaddr, last); @@ -1480,7 +1488,7 @@ abi_long target_shmdt(abi_ulong shmaddr) if (rv =3D=3D 0) { abi_ulong size =3D last - shmaddr + 1; =20 - page_set_flags(shmaddr, last, 0); + page_set_flags(shmaddr, last, 0, PAGE_VALID); shm_region_rm_complete(shmaddr, last); mmap_reserve_or_unmap(shmaddr, size); } diff --git a/linux-user/x86_64/elfload.c b/linux-user/x86_64/elfload.c index 1e7000c6bc..5914f76e83 100644 --- a/linux-user/x86_64/elfload.c +++ b/linux-user/x86_64/elfload.c @@ -37,7 +37,7 @@ bool init_guest_commpage(void) } page_set_flags(TARGET_VSYSCALL_PAGE, TARGET_VSYSCALL_PAGE | ~TARGET_PAGE_MASK, - PAGE_EXEC | PAGE_VALID); + PAGE_EXEC | PAGE_VALID, PAGE_VALID); return true; } =20 --=20 2.43.0 From nobody Sun Sep 28 15:28:20 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1758679736; cv=none; d=zohomail.com; s=zohoarc; b=EZFZ15qx1aw/p5tglc6hKbb8DFN2i3zc9daopfmp6kD39OZxHiXbcIKW7diGyPU6z1F7PUjOBuATRh9bcQWyKfiWDmqeku/J4aQXNGZ/g5bhZ9TdCyrAxtI9xAEhugSdMgO5efnnrEK+8CXxolQn9XdMJZRQacBfvcLcD1tHJQ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758679736; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JpDWwmGB3FDcx3IksRaylh4MrMqkVjqSJs30QhIpAxg=; b=lwMeTod4D6DjdqolIv6QeBr2QSCNEsJ76Xajh+YvEh3n6KUWZWfqxtXHQ0L/GW4S6TGA1wmANhD/ZCZSgH1lxPQ2Umv4wT/rG1WEwUUZB431DUSI44IbYSLUFOfWJGhs3C/bvQ4RnZgrxnH8eVPjyFniot9SpAWTg6/KArlegA4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1758679736812910.4172058254519; Tue, 23 Sep 2025 19:08:56 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v1EvA-00030R-NI; Tue, 23 Sep 2025 22:07:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v1Ev9-0002zt-G5 for qemu-devel@nongnu.org; Tue, 23 Sep 2025 22:07:51 -0400 Received: from mail-pj1-x1032.google.com ([2607:f8b0:4864:20::1032]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1v1Ev1-0002c1-QW for qemu-devel@nongnu.org; Tue, 23 Sep 2025 22:07:51 -0400 Received: by mail-pj1-x1032.google.com with SMTP id 98e67ed59e1d1-33082c95fd0so5526671a91.1 for ; Tue, 23 Sep 2025 19:07:43 -0700 (PDT) Received: from stoup.. ([71.212.157.132]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3341bcd9afbsm565664a91.0.2025.09.23.19.07.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Sep 2025 19:07:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1758679662; x=1759284462; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JpDWwmGB3FDcx3IksRaylh4MrMqkVjqSJs30QhIpAxg=; b=VppkE6KNC02/Ir9Je6Q5Yj9xEXHIIj6lK2lxtDjUxLF6ooigO9VdTT1Vq7YhMlkEeE mu1MTOuPYIn+ehz+BUB/74YbDN9eXPn3T4yimdRfveNtXQdhu5BDbU8TwpyF7m+uefPh 7MDS8WbgN2gqHl2COnrh0qk/RosUqbR/qgMzkhRURTAuXQogvfxvomG6pwqvxOVnlIi/ Bu1GNDqfvd+6qOsD9mNxxWyUdDBSuuTRVEiDOzIZ+5dVrI5uI7FhAAgZJ40e7ASNFlFo kM7X0KoXnHFsM7sxGe7totj6wfHs7tkp9332JlRmb+yz6PY6QRAo06lgn/JsB7/hpQgu iseA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758679662; x=1759284462; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JpDWwmGB3FDcx3IksRaylh4MrMqkVjqSJs30QhIpAxg=; b=kSLC10Gtdq+AKSriFd8kOntZS05t3I840aA/X3h7QJoC5Wc3rhDStcgyp9nTC3QRHe mG2TrjK5dKh8jtsXAeclUk3Ho3B9WbcPmkw7Vb0/ew4He3QzA2aSTn0yiMnAQGt2akTM 6ed1nciQszpo2OQDa7wJIESVAORIAg5vpuo4FKbg2vMXIeGZTvkXS1zYWIgllD77Nz0M rZCzduD09rE2r8hjzfRzxwdt8K5OMrNvUWC5AnlYk+06dguCynECCSI6AZgQgmkWUspe 6aTjfsoAN06oQjj5uK8srZjoC7RH8HcsznKoBMJE0+Qd97oEyKWJpTDrwbqX2Lwx0Kep dfhA== X-Gm-Message-State: AOJu0Ywyb2nGg0gZskfV9hILQwDytBmuSslvvbMdZxdqj1FrR91Mr2Fq k6nX5VGGue+t/c+lcjyIBad0WTIa/2qc+yClShMDWD3k+zEx0Yg2dshyKH3VPlvjww/GX8PTb0j Zdkmw X-Gm-Gg: ASbGncuvFXBx7g2wLe7CgKBtd/MKCJUcjg262MA7TWp1p1CPiq44Bci8ygoy+KhcvGy 7ZzqIuSMPLGel7z9+B97d0WOExZPc00BqZ10rXYF3LBzr2V27y+t4xHynkWpXOwwpRzWksgMS5D o794VvAy7u5pk2xjJf4kjPIUAPGaUbmsdchSdXmE64AJ1XwnUxX2Q32qLIL/uYaquV2K52QPFlu /GVR5h4LKQEYNeayc/elP+AkYRfiN354aXFemZwdOwEUqagIaE3ILfoUnql0bIvRD9IVJOsXwk3 uRp91kQ86zgkPcRk2l3qPnWBKnUl7668tXXohsfEhXShCI8iUoirQ1P5JVl40nb8NGviBfxlWEq PM7AfV7FOAZiFNbFy2x8J/zh7avpnqbfxvW9OvC4= X-Google-Smtp-Source: AGHT+IEV9YOSi1IisUEgR8K0mA2ffn94YvICW/k2Jx1BIJdgz//uM5/Le8u4Q8s001D17q1kTOPC4Q== X-Received: by 2002:a17:90b:394a:b0:32f:469:954c with SMTP id 98e67ed59e1d1-332a96fb67fmr4816850a91.34.1758679661859; Tue, 23 Sep 2025 19:07:41 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: jonwilson030981@googlemail.com, Jon Wilson Subject: [PATCH 2/2] linux-user: Support MADV_DONTDUMP, MADV_DODUMP Date: Tue, 23 Sep 2025 19:07:35 -0700 Message-ID: <20250924020735.3909216-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250924020735.3909216-1-richard.henderson@linaro.org> References: <20250924020735.3909216-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::1032; envelope-from=richard.henderson@linaro.org; helo=mail-pj1-x1032.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1758679738772116600 Content-Type: text/plain; charset="utf-8" From: Jon Wilson Set and clear PAGE_DONTDUMP, and honor that in vma_dump_size. Signed-off-by: Jon Wilson [rth: Use new page_set_flags semantics; also handle DODUMP] Signed-off-by: Richard Henderson Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- include/exec/page-protection.h | 6 +++++- linux-user/elfload.c | 4 ++-- linux-user/mmap.c | 6 ++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/include/exec/page-protection.h b/include/exec/page-protection.h index 5a18f98a3a..c50ce57d15 100644 --- a/include/exec/page-protection.h +++ b/include/exec/page-protection.h @@ -30,7 +30,11 @@ #define PAGE_PASSTHROUGH 0x40 /* For linux-user, indicates that the page is MAP_ANON. */ #define PAGE_ANON 0x0080 - +/* + * For linux-user, indicates that the page should not be + * included in a core dump. + */ +#define PAGE_DONTDUMP 0x0100 /* Target-specific bits that will be used via page_get_flags(). */ #define PAGE_TARGET_1 0x0200 #define PAGE_TARGET_2 0x0400 diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 26c090c95d..b213f1a35b 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2120,8 +2120,8 @@ static void bswap_note(struct elf_note *en) */ static size_t vma_dump_size(vaddr start, vaddr end, int flags) { - /* The area must be readable. */ - if (!(flags & PAGE_READ)) { + /* The area must be readable and dumpable. */ + if (!(flags & PAGE_READ) || (flags & PAGE_DONTDUMP)) { return 0; } =20 diff --git a/linux-user/mmap.c b/linux-user/mmap.c index 0b69efe54c..35698c413c 100644 --- a/linux-user/mmap.c +++ b/linux-user/mmap.c @@ -1254,6 +1254,12 @@ abi_long target_madvise(abi_ulong start, abi_ulong l= en_in, int advice) */ mmap_lock(); switch (advice) { + case MADV_DONTDUMP: + page_set_flags(start, start + len - 1, PAGE_DONTDUMP, 0); + break; + case MADV_DODUMP: + page_set_flags(start, start + len - 1, 0, PAGE_DONTDUMP); + break; case MADV_WIPEONFORK: case MADV_KEEPONFORK: ret =3D -EINVAL; --=20 2.43.0 From nobody Sun Sep 28 15:28:20 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1758679753; cv=none; d=zohomail.com; s=zohoarc; b=OdWsMkqAA4weQ6R8hC5/YrALVCACduiu7MsV92D9GR8o98rLtaYYrBvJ98Lf6odyFrtsZRKjSXYkJmpNvpeQmnGvDmMm3+uq1sELIy8j3uVFWJZYRuJLVDsK0nGM+Xkax3j7vZtPaSge79wEMZxZz/r2jJ8sEqNm8NSBOkOl6e8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758679753; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=h7jBToDckL+9WdyOpUrdDydxCn382Hk4iBNUg68buw0=; b=n0WMYvbeemGi8SbyUdsoLEMZ1aMJi9SJqKZz+kpE5ra/ihPGx2h9mO75NkGPXQiWgnjFFeD10bX7B6DYSB2JAsVruWTIhjWc32jlRq60gWnvLsKGwJE1zP0BkVvups5RJsvGH05m8fnEX3Z/b3h+amDUIYlls7Jn4dT1/jLvaYo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 175867975389939.79807875492463; Tue, 23 Sep 2025 19:09:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v1Ev7-0002zg-Rx; Tue, 23 Sep 2025 22:07:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v1Ev5-0002z3-S0 for qemu-devel@nongnu.org; Tue, 23 Sep 2025 22:07:48 -0400 Received: from mail-pj1-x102b.google.com ([2607:f8b0:4864:20::102b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1v1Ev1-0002bu-1D for qemu-devel@nongnu.org; Tue, 23 Sep 2025 22:07:47 -0400 Received: by mail-pj1-x102b.google.com with SMTP id 98e67ed59e1d1-32326e2f0b3so5388128a91.2 for ; Tue, 23 Sep 2025 19:07:42 -0700 (PDT) Received: from stoup.. ([71.212.157.132]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3341bcd9afbsm565664a91.0.2025.09.23.19.07.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Sep 2025 19:07:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1758679661; x=1759284461; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=h7jBToDckL+9WdyOpUrdDydxCn382Hk4iBNUg68buw0=; b=qjYW/6aRdIx6y3ggZqh7mfvUk4MlFNsKY/fKnh3KXKucVsaLGWgzt8X82OXI3NKKEM PKMUVn1PUSD616t4Qpx6O8p/GjXkdcgjWR0J4NoCWxoPeRzddCr8isFwm/fu1Rerc1TP pLsUahaBBy0tm5rmJxnSWGLw/AaortCh4nBiZ7fbw3UER0gK1Nz7FljRyptrJlo6uIFO gyGLmZuBkJBDTTQiDkcQNOIbzlq9O845dkUbr/kLWgAua8mEi03hPLOv0ViBmiZAfBYv d9Lvqm04dlP3JIBmrH6YO3jyfHRJHsXc7wDBxLKOrvhL36DhhLPovjNS12SHRfdA/h9L 6L6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758679661; x=1759284461; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=h7jBToDckL+9WdyOpUrdDydxCn382Hk4iBNUg68buw0=; b=K7ieVGHCLYcDZ1GMqW1nLJ3mX5ryga3ddjr82Dw65Qmlb+Yd+F+5niqBNIWrc5QUFW kAbP/4u/ic1OlcJaMI569O6Nl7KQHS+C4pSMZbhJMvqQ5c6pTqMHKOprM+TwW4ZaEtBV P9aox57htLpb12dP3M1stBKhq7RyiqU2fbRMTQEhIUklTrW+1Oj0Abc+2apOKJzx895x rKsYLua/YWqrBuagamgvkBc2sRleUn3hfRdRmYv75MoMpUykUtUrxJeOKO5Kh2JMYJIn JShtu8KVjX7yobkOt2SvEWf1WNzEKn88BMrvd63VAy7HuaLX+LJsvsDXcQo1rkaWXq09 WTfQ== X-Gm-Message-State: AOJu0Ywz85tvHruo1pq4MPzEXW7CrpNPL/mZV1syFBY9mEQYRNUkue7x SASSDEkOb59EI1X8dyU7tOHbWafjs6HfRiyOSD5v73b8u4RNTlywW+6mbnGX0RGgMFcieaxKVuT mNp5C X-Gm-Gg: ASbGncsfstknzS7wWWHEQH5e5mM3jlTZ1w82B6wLd87P0Mxz+vqWH7f6qWwGWn31DIh 4+ZeN+sDnY49m+Kf/c9GTwRA5KMa+irFaaW6twYiy4iotUokOdaDBruIIzv9bfGqeQklguJcCG4 Ol3VbDkxF87DLamFwkNjlm1jWW/gG6eHexxafYRRhM5QOqSUbCNbJcGt7twi7UIhnjm7C7XIvZk l1YUS8+dOSH5wYwN/YWmKVpBoeZxAaY04Y6JMMYGbLPPcK0c+8CxtWxVi067+yA3flNGdKBNIYh ONyRGIAeXynZ/Jfl0qbR4FFBCOAdKpnkW0g+QB2aaH4TaLJ1Olan0jm7s7y99PeEEniaudeIM0a pE7FRZpc27QGKnqACxYjhgqGr/+7h X-Google-Smtp-Source: AGHT+IHZ3FQuinlKS2Fe6eVclEaZuS++WO6bhj8ERA9KXKXcpkvZBCc8qVR90RtQUTD8rCxNyVxe+g== X-Received: by 2002:a17:90a:f944:b0:32e:87fa:d96a with SMTP id 98e67ed59e1d1-332a95e2926mr5451175a91.26.1758679660692; Tue, 23 Sep 2025 19:07:40 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Cc: jonwilson030981@googlemail.com, =?UTF-8?q?=E6=9D=8E=E5=A8=81=E5=A8=81?= Subject: [PATCH] accel/tcg: Properly unlink a TB linked to itself Date: Tue, 23 Sep 2025 19:07:34 -0700 Message-ID: <20250924020735.3909216-3-richard.henderson@linaro.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250924020735.3909216-1-richard.henderson@linaro.org> References: <20250924020735.3909216-1-richard.henderson@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::102b; envelope-from=richard.henderson@linaro.org; helo=mail-pj1-x102b.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @linaro.org) X-ZM-MESSAGEID: 1758679755273116600 When we remove dest from orig's links, we lose the link that we rely on later to reset links. This can lead to failure to release from spinlock with self-modifying code. Reported-by: =E6=9D=8E=E5=A8=81=E5=A8=81 Signed-off-by: Richard Henderson --- accel/tcg/tb-maint.c | 8 +++++ tests/tcg/riscv64/tb-link.c | 60 +++++++++++++++++++++++++++++++ tests/tcg/riscv64/Makefile.target | 1 + 3 files changed, 69 insertions(+) create mode 100644 tests/tcg/riscv64/tb-link.c diff --git a/accel/tcg/tb-maint.c b/accel/tcg/tb-maint.c index 0048316f99..e6d45c9c12 100644 --- a/accel/tcg/tb-maint.c +++ b/accel/tcg/tb-maint.c @@ -836,6 +836,14 @@ static inline void tb_remove_from_jmp_list(Translation= Block *orig, int n_orig) * We first acquired the lock, and since the destination pointer match= es, * we know for sure that @orig is in the jmp list. */ + if (dest =3D=3D orig) { + /* + * In the case of a TB that links to itself, removing the entry + * from the list means that it won't be present later during + * tb_jmp_unlink -- unlink now. + */ + tb_reset_jump(orig, n_orig); + } pprev =3D &dest->jmp_list_head; TB_FOR_EACH_JMP(dest, tb, n) { if (tb =3D=3D orig && n =3D=3D n_orig) { diff --git a/tests/tcg/riscv64/tb-link.c b/tests/tcg/riscv64/tb-link.c new file mode 100644 index 0000000000..b6fcca8668 --- /dev/null +++ b/tests/tcg/riscv64/tb-link.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include + + +int main() +{ + /* + * ## 1. RISC-V machine code. + * Assembly: + * L: j L ; Jump to self (spin). + * li a0, 42 ; Place 42 into the return value register a0. + * ret ; Return to caller. + */ + static const uint32_t machine_code[] =3D { + 0x0000006f, /* jal zero, #0 */ + 0x02a00513, /* addi a0, zero, 42 */ + 0x00008067 /* jalr zero, ra, 0 */ + }; + size_t code_size =3D sizeof(machine_code); + int tmp; + pthread_t thread_id; + void *thread_return_value; + uint32_t *buffer; + + /* ## 2. Allocate executable memory. */ + buffer =3D mmap( + NULL, + code_size, + PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS, + -1, 0 + ); + assert(buffer !=3D MAP_FAILED); + + /* ## 3. Copy machine code into buffer. */ + memcpy(buffer, machine_code, code_size); + + /* ## 4. Execute the code in a separate thread. */ + tmp =3D pthread_create(&thread_id, NULL, (void *(*)(void *))buffer, NU= LL); + assert(tmp =3D=3D 0); + + /* + * Wait a second and then try to patch the generated code to get the + * runner thread to get unstuck by patching the spin jump. + */ + sleep(1); + buffer[0] =3D 0x00000013; /* nop */ + __builtin___clear_cache((char *)buffer, (char *)(buffer + 1)); + + tmp =3D pthread_join(thread_id, &thread_return_value); + assert(tmp =3D=3D 0); + + tmp =3D (intptr_t)thread_return_value; + assert(tmp =3D=3D 42); + return 0; +} diff --git a/tests/tcg/riscv64/Makefile.target b/tests/tcg/riscv64/Makefile= .target index 4da5b9a3b3..ba684616fd 100644 --- a/tests/tcg/riscv64/Makefile.target +++ b/tests/tcg/riscv64/Makefile.target @@ -4,6 +4,7 @@ VPATH +=3D $(SRC_PATH)/tests/tcg/riscv64 TESTS +=3D test-div TESTS +=3D noexec +TESTS +=3D tb-link =20 # Disable compressed instructions for test-noc TESTS +=3D test-noc --=20 2.43.0