From nobody Thu Mar 21 10:13:47 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4V0hBQ5Q9lz5Fkrk; Thu, 21 Mar 2024 10:13:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4V0hBN3YHJz456b; Thu, 21 Mar 2024 10:13:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1711016028; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=MFMkFnpWXmnFW6xdcNrNLCAVuQNcW+vHJcnv/0dgi8s=; b=EYKJ+IsyyJXXt0FRV3SCe9ALOrahfimvBQib5oEfR1LA+AQuknYzS2cFZOKi1ceGN61/dx dXXwGc4thcMa7g5EXSjbbLDYI9mOihDoPtAlnbz68BLnHyLJpAq7vYB8hNNjjIUOBR8CT4 vvjvxsloeBeEd8IMrTtipMG0ClD3uIzS3w+K6ff9nwuvIDU9mnsSByjeBPCK5xSrI4M8m2 UC6KLpuA9cKYO+/F5qJnzg+ZzYOblXqsACEytAfc7mI0QzGEN5Afecf8EsQdfG/T2VT4Hl bP1GoG++QUrILFgLKgJFC5hTGFm9CEi4iYThEHlbJ/HntITVRRqXy6t/8ZeiVQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1711016028; a=rsa-sha256; cv=none; b=LERIZ8NXjYmJyXSBUn4h206Ixqj98/NRw0CWqbPSZBh04StCNg4iDTKW330UvCJx98g44X sE7If/29MDxEzsyttrx1ZSGr+T0pLFzX4BAuvMdRO3giP6pPLYAjSRdZ4iBTYx1dG9uB+u eJg88qJbL8t5OEEKyFA052hQIgTcUs+daj0Ssw/icbKFd7J8mjdk5tJB9c+9xxblIhEUMF D0zGbwynAykBFY+Ls0l0r66ws00ZflY1vxlIJuhTV6txBmy5OUyp9i+gvA5NLTH2ixXaG8 fRAz54GsxFnOzGRVNaims60X4ajFqlYHB2vNmhfOQxhKxUph6LnvLGIM0luAHA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1711016028; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=MFMkFnpWXmnFW6xdcNrNLCAVuQNcW+vHJcnv/0dgi8s=; b=jyMdyhbLUBQdoFqda6cY89yyU0/kE1DHTVYB3K8DyTnWinj1MTDn4V5eyBtmzFavfrJyr/ FqGIL5uUmsxUY2fQo15sIoxJoTMKKuuDlN7vhdmxgt7gENYN/OQ4i7735mAEh/e000gcRh /dYLq25lK8OIuPDk2UQDrIKwL6XNPqxC1xv3IQbX/cvWLWUDTV0Stl08TP4/cLxkUfrs5T EV+pjAEp1Lzu7FGPFoNGWaOJOZKY4dVd1Q+62Jf6VFZDXb03Tkb22N/Nj9c/Ykd28Q4f4j O5JB4C2WyIHdRDM8S5wVtC/RLzHT5vOL9NJnqbei2zKgRetXSgtjgVvnbrIDvQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4V0hBM6f7jzX87; Thu, 21 Mar 2024 10:13:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 42LADl38032403; Thu, 21 Mar 2024 10:13:47 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 42LADloU032400; Thu, 21 Mar 2024 10:13:47 GMT (envelope-from git) Date: Thu, 21 Mar 2024 10:13:47 GMT Message-Id: <202403211013.42LADloU032400@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: ed3c6cd76de8 - main - arm64: Mask non-debug exceptions when single stepping List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ed3c6cd76de8560c46607abe506a03568e9acab2 Auto-Submitted: auto-generated The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=ed3c6cd76de8560c46607abe506a03568e9acab2 commit ed3c6cd76de8560c46607abe506a03568e9acab2 Author: Andrew Turner AuthorDate: 2024-03-14 14:02:56 +0000 Commit: Andrew Turner CommitDate: 2024-03-21 10:13:24 +0000 arm64: Mask non-debug exceptions when single stepping When an exception is pending when single stepping we may execute the handler for that exception rather than the single step handler. This could cause the scheduler to fire to run a new thread. This will mean we single step to a new thread causing unexpected results. Handle this by masking non-debug exceptions. This will cause issues when stepping over instructions that access the DAIF values so future work is needed to handle these cases, but for most code this now works as expected. Reviewed by: jhb Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D44350 --- sys/arm64/arm64/debug_monitor.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sys/arm64/arm64/debug_monitor.c b/sys/arm64/arm64/debug_monitor.c index b8164b70c5c8..480a6da817a2 100644 --- a/sys/arm64/arm64/debug_monitor.c +++ b/sys/arm64/arm64/debug_monitor.c @@ -193,6 +193,15 @@ kdb_cpu_set_singlestep(void) ("%s: debug exceptions are not masked", __func__)); kdb_frame->tf_spsr |= PSR_SS; + + /* + * TODO: Handle single stepping over instructions that access + * the DAIF values. On a read the value will be incorrect. + */ + kernel_monitor.dbg_flags &= ~PSR_DAIF; + kernel_monitor.dbg_flags |= kdb_frame->tf_spsr & PSR_DAIF; + kdb_frame->tf_spsr |= (PSR_A | PSR_I | PSR_F); + WRITE_SPECIALREG(mdscr_el1, READ_SPECIALREG(mdscr_el1) | MDSCR_SS | MDSCR_KDE); @@ -214,6 +223,9 @@ kdb_cpu_clear_singlestep(void) KASSERT((READ_SPECIALREG(daif) & PSR_D) == PSR_D, ("%s: debug exceptions are not masked", __func__)); + kdb_frame->tf_spsr &= ~PSR_DAIF; + kdb_frame->tf_spsr |= kernel_monitor.dbg_flags & PSR_DAIF; + WRITE_SPECIALREG(mdscr_el1, READ_SPECIALREG(mdscr_el1) & ~(MDSCR_SS | MDSCR_KDE));